From ce04d3ce417a0387efd365859d27219edf91e647 Mon Sep 17 00:00:00 2001 From: James Towle Date: Tue, 21 Jan 2020 18:54:10 -0800 Subject: [PATCH] Fix regression in DevUtils (#2449) * fix bug in OrderTransferSimulationUtils causing failures for 721 assets * Patched the regression and added tests * Added regression test for fillable order * Created a test for in and out of process ganache * Split up DevUtils into two contracts * Updated migration * Remove the in and out of process ganache test * Fixed contract addresses * Appease linter * Addressed review comments and updated artifacts, wrappers, and snapshots * Fixed regression after refactor * Update DevUtils and libTransactionDecoder contracts on mainnet and testnets * Addressed @mzhu's review feedback * Addressed @hysz's review feedback * Updated devUtils address on testnets and mainnet after deployment Co-authored-by: mzhu25 Co-authored-by: Fabio B --- contracts/dev-utils/compiler.json | 2 +- .../dev-utils/contracts/src/DevUtils.sol | 2 - .../src/OrderTransferSimulationUtils.sol | 14 +- .../contracts/src/OrderValidationUtils.sol | 71 ++++ .../test/dev-utils/order_validation_utils.ts | 41 ++ .../test/framework/deployment_manager.ts | 1 - packages/contract-addresses/addresses.json | 13 +- packages/contract-addresses/src/index.ts | 1 + .../artifacts/DevUtils.json | 45 +-- .../artifacts/LibTransactionDecoder.json | 84 ++++ packages/contract-artifacts/src/index.ts | 2 + packages/contract-artifacts/tsconfig.json | 1 + packages/contract-wrappers/package.json | 2 +- .../src/contract_wrappers.ts | 12 +- .../src/generated-wrappers/dev_utils.ts | 186 +-------- .../lib_transaction_decoder.ts | 367 ++++++++++++++++++ packages/contract-wrappers/src/index.ts | 1 + packages/migrations/src/migration.ts | 11 +- packages/migrations/src/testnet_migrations.ts | 13 +- 19 files changed, 625 insertions(+), 244 deletions(-) create mode 100644 packages/contract-artifacts/artifacts/LibTransactionDecoder.json create mode 100644 packages/contract-wrappers/src/generated-wrappers/lib_transaction_decoder.ts diff --git a/contracts/dev-utils/compiler.json b/contracts/dev-utils/compiler.json index d473413e33..da041cd66e 100644 --- a/contracts/dev-utils/compiler.json +++ b/contracts/dev-utils/compiler.json @@ -7,7 +7,7 @@ "evmVersion": "istanbul", "optimizer": { "enabled": true, - "runs": 200, + "runs": 5000, "details": { "yul": true, "deduplicate": true, "cse": true, "constantOptimizer": true } }, "outputSelection": { diff --git a/contracts/dev-utils/contracts/src/DevUtils.sol b/contracts/dev-utils/contracts/src/DevUtils.sol index c4c3f9ccf7..f0913ab848 100644 --- a/contracts/dev-utils/contracts/src/DevUtils.sol +++ b/contracts/dev-utils/contracts/src/DevUtils.sol @@ -26,14 +26,12 @@ import "@0x/contracts-utils/contracts/src/LibEIP712.sol"; import "@0x/contracts-utils/contracts/src/LibBytes.sol"; import "./OrderValidationUtils.sol"; import "./OrderTransferSimulationUtils.sol"; -import "./LibTransactionDecoder.sol"; import "./EthBalanceChecker.sol"; // solhint-disable no-empty-blocks contract DevUtils is OrderValidationUtils, - LibTransactionDecoder, LibEIP712ExchangeDomain, EthBalanceChecker { diff --git a/contracts/dev-utils/contracts/src/OrderTransferSimulationUtils.sol b/contracts/dev-utils/contracts/src/OrderTransferSimulationUtils.sol index 9012eab99a..18acc1b208 100644 --- a/contracts/dev-utils/contracts/src/OrderTransferSimulationUtils.sol +++ b/contracts/dev-utils/contracts/src/OrderTransferSimulationUtils.sol @@ -41,6 +41,10 @@ contract OrderTransferSimulationUtils is TransfersSuccessful // All transfers in the order were successful } + // NOTE(jalextowle): This is a random address that we use to avoid issues that addresses like `address(1)` + // may cause later. + address constant internal UNUSED_ADDRESS = address(0x377f698C4c287018D09b516F415317aEC5919332); + // keccak256(abi.encodeWithSignature("Error(string)", "TRANSFERS_SUCCESSFUL")); bytes32 constant internal _TRANSFERS_SUCCESSFUL_RESULT_HASH = 0xf43f26ea5a94b478394a975e856464913dc1a8a1ca70939d974aa7c238aa0ce0; @@ -82,13 +86,13 @@ contract OrderTransferSimulationUtils is // Transfer `makerAsset` from maker to taker assetData[0] = order.makerAssetData; fromAddresses[0] = order.makerAddress; - toAddresses[0] = takerAddress; + toAddresses[0] = takerAddress == address(0) ? UNUSED_ADDRESS : takerAddress; amounts[0] = fillResults.makerAssetFilledAmount; // Transfer `makerFeeAsset` from maker to feeRecipient assetData[1] = order.makerFeeAssetData; fromAddresses[1] = order.makerAddress; - toAddresses[1] = order.feeRecipientAddress; + toAddresses[1] = order.feeRecipientAddress == address(0) ? UNUSED_ADDRESS : order.feeRecipientAddress; amounts[1] = fillResults.makerFeePaid; return _simulateTransferFromCalls( @@ -134,19 +138,19 @@ contract OrderTransferSimulationUtils is // Transfer `makerAsset` from maker to taker assetData[1] = order.makerAssetData; fromAddresses[1] = order.makerAddress; - toAddresses[1] = takerAddress; + toAddresses[1] = takerAddress == address(0) ? UNUSED_ADDRESS : takerAddress; amounts[1] = fillResults.makerAssetFilledAmount; // Transfer `takerFeeAsset` from taker to feeRecipient assetData[2] = order.takerFeeAssetData; fromAddresses[2] = takerAddress; - toAddresses[2] = order.feeRecipientAddress; + toAddresses[2] = order.feeRecipientAddress == address(0) ? UNUSED_ADDRESS : order.feeRecipientAddress; amounts[2] = fillResults.takerFeePaid; // Transfer `makerFeeAsset` from maker to feeRecipient assetData[3] = order.makerFeeAssetData; fromAddresses[3] = order.makerAddress; - toAddresses[3] = order.feeRecipientAddress; + toAddresses[3] = order.feeRecipientAddress == address(0) ? UNUSED_ADDRESS : order.feeRecipientAddress; amounts[3] = fillResults.makerFeePaid; return _simulateTransferFromCalls( diff --git a/contracts/dev-utils/contracts/src/OrderValidationUtils.sol b/contracts/dev-utils/contracts/src/OrderValidationUtils.sol index 53a722a430..0ed383f779 100644 --- a/contracts/dev-utils/contracts/src/OrderValidationUtils.sol +++ b/contracts/dev-utils/contracts/src/OrderValidationUtils.sol @@ -133,6 +133,18 @@ contract OrderValidationUtils is fillableTakerAssetAmount ) == OrderTransferResults.TransfersSuccessful ? fillableTakerAssetAmount : 0; + if (!_isAssetDataValid(order.takerAssetData)) { + fillableTakerAssetAmount = 0; + } + + if (order.takerFee != 0 && !_isAssetDataValid(order.takerFeeAssetData)) { + fillableTakerAssetAmount = 0; + } + + if (orderInfo.orderStatus != LibOrder.OrderStatus.FILLABLE) { + fillableTakerAssetAmount = 0; + } + return (orderInfo, fillableTakerAssetAmount, isValidSignature); } @@ -185,4 +197,63 @@ contract OrderValidationUtils is transferableAssetAmount = LibSafeMath.min256(balance, allowance); return transferableAssetAmount; } + + /// @dev This function handles the edge cases around taker validation. This function + /// currently attempts to find duplicate ERC721 token's in the taker + /// multiAssetData. + /// @param assetData The asset data that should be validated. + /// @return Whether or not the order should be considered valid. + function _isAssetDataValid(bytes memory assetData) + internal + pure + returns (bool) + { + // Asset data must be composed of an asset proxy Id and a bytes segment with + // a length divisible by 32. + if (assetData.length % 32 != 4) { + return false; + } + + // Only process the taker asset data if it is multiAssetData. + bytes4 assetProxyId = assetData.readBytes4(0); + if (assetProxyId != IAssetData(address(0)).MultiAsset.selector) { + return true; + } + + // Get array of values and array of assetDatas + (, uint256[] memory assetAmounts, bytes[] memory nestedAssetData) = decodeMultiAssetData(assetData); + + uint256 length = nestedAssetData.length; + for (uint256 i = 0; i != length; i++) { + // TODO(jalextowle): Implement similar validation for non-fungible ERC1155 asset data. + bytes4 nestedAssetProxyId = nestedAssetData[i].readBytes4(0); + if (nestedAssetProxyId == IAssetData(address(0)).ERC721Token.selector) { + if (_isAssetDataDuplicated(nestedAssetData, i)) { + return false; + } + } + } + + return true; + } + + /// Determines whether or not asset data is duplicated later in the nested asset data. + /// @param nestedAssetData The asset data to scan for duplication. + /// @param startIdx The index where the scan should begin. + /// @return A boolean reflecting whether or not the starting asset data was duplicated. + function _isAssetDataDuplicated( + bytes[] memory nestedAssetData, + uint256 startIdx + ) + internal + pure + returns (bool) + { + uint256 length = nestedAssetData.length; + for (uint256 i = startIdx + 1; i < length; i++) { + if (nestedAssetData[startIdx].equals(nestedAssetData[i])) { + return true; + } + } + } } diff --git a/contracts/integrations/test/dev-utils/order_validation_utils.ts b/contracts/integrations/test/dev-utils/order_validation_utils.ts index bb740317ba..c84fbfc0ce 100644 --- a/contracts/integrations/test/dev-utils/order_validation_utils.ts +++ b/contracts/integrations/test/dev-utils/order_validation_utils.ts @@ -155,6 +155,19 @@ blockchainTests.resets('OrderValidationUtils/OrderTransferSimulatorUtils', env = .callAsync(); expect(fillableTakerAssetAmount).to.bignumber.equal(constants.ZERO_AMOUNT); }); + it('should correctly validate fillable order', async () => { + signedOrder = await maker.signOrderAsync({ + makerAssetData: erc721AssetData, + makerAssetAmount: new BigNumber(1), + makerFee: constants.ZERO_AMOUNT, + takerFee: constants.ZERO_AMOUNT, + }); + await taker.configureERC20TokenAsync(erc20Token2); + const [, fillableTakerAssetAmount] = await devUtils + .getOrderRelevantState(signedOrder, signedOrder.signature) + .callAsync(); + expect(fillableTakerAssetAmount).to.bignumber.greaterThan(constants.ZERO_AMOUNT); + }); it('should return a fillableTakerAssetAmount of 0 when balances/allowances of one asset within a multiAssetData are insufficient (ERC20)', async () => { const multiAssetData = await devUtils .encodeMultiAssetData([new BigNumber(1), new BigNumber(1)], [erc20AssetData, erc20AssetData2]) @@ -222,6 +235,34 @@ blockchainTests.resets('OrderValidationUtils/OrderTransferSimulatorUtils', env = .callAsync(); expect(fillableTakerAssetAmount).to.bignumber.equal(constants.ZERO_AMOUNT); }); + it('should return a fillableTakerAssetAmount of 0 when an erc721 asset is duplicated in the maker fee side of a multi-asset proxy order', async () => { + const multiAssetData = await devUtils + .encodeMultiAssetData([new BigNumber(1), new BigNumber(1)], [erc721AssetData, erc721AssetData]) + .callAsync(); + signedOrder = await maker.signOrderAsync({ + makerFeeAssetData: multiAssetData, + makerFee: new BigNumber(1), + takerFee: constants.ZERO_AMOUNT, + }); + const [, fillableTakerAssetAmount] = await devUtils + .getOrderRelevantState(signedOrder, signedOrder.signature) + .callAsync(); + expect(fillableTakerAssetAmount).to.bignumber.equal(constants.ZERO_AMOUNT); + }); + it('should return a fillableTakerAssetAmount of 0 when an erc721 asset is duplicated in the taker fee side of a multi-asset proxy order', async () => { + const multiAssetData = await devUtils + .encodeMultiAssetData([new BigNumber(1), new BigNumber(1)], [erc721AssetData, erc721AssetData]) + .callAsync(); + signedOrder = await maker.signOrderAsync({ + makerFee: constants.ZERO_AMOUNT, + takerFeeAssetData: multiAssetData, + takerFee: new BigNumber(1), + }); + const [, fillableTakerAssetAmount] = await devUtils + .getOrderRelevantState(signedOrder, signedOrder.signature) + .callAsync(); + expect(fillableTakerAssetAmount).to.bignumber.equal(constants.ZERO_AMOUNT); + }); it('should return the correct fillableTakerAssetAmount when fee balances/allowances are partially sufficient', async () => { await erc20Token.setBalance(maker.address, signedOrder.makerAssetAmount).awaitTransactionSuccessAsync(); await erc20Token.approve(erc20Proxy.address, signedOrder.makerAssetAmount).awaitTransactionSuccessAsync({ diff --git a/contracts/integrations/test/framework/deployment_manager.ts b/contracts/integrations/test/framework/deployment_manager.ts index ecb3dab9ef..7778a52587 100644 --- a/contracts/integrations/test/framework/deployment_manager.ts +++ b/contracts/integrations/test/framework/deployment_manager.ts @@ -196,7 +196,6 @@ export class DeploymentManager { exchange, staking.stakingProxy, ]); - const devUtils = await DevUtilsContract.deployFrom0xArtifactAsync( devUtilsArtifacts.DevUtils, environment.provider, diff --git a/packages/contract-addresses/addresses.json b/packages/contract-addresses/addresses.json index bec35cd444..8bae17ac5b 100644 --- a/packages/contract-addresses/addresses.json +++ b/packages/contract-addresses/addresses.json @@ -13,13 +13,14 @@ "dutchAuction": "0x0000000000000000000000000000000000000000", "coordinatorRegistry": "0x45797531b873fd5e519477a070a955764c1a5b07", "coordinator": "0x38a795580d0f687e399913a00ddef6a17612c722", + "libTransactionDecoder": "0x5f20e82643ce007d87692eb1b3d3fc059588b224", "multiAssetProxy": "0xef701d5389ae74503d633396c4d654eabedc9d78", "staticCallProxy": "0x3517b88c19508c08650616019062b898ab65ed29", "erc1155Proxy": "0x7eefbd48fd63d441ec7435d024ec7c5131019add", "zrxVault": "0xba7f8b5fb1b19c1211c5d49550fcd149177a5eaf", "staking": "0x2a17c35ff147b32f13f19f2e311446eeb02503f3", "stakingProxy": "0xa26e80e7dea86279c6d778d702cc413e6cffa777", - "devUtils": "0x5f53f2aa72cb3a9371bf3c58e8fb3a313478b2f4", + "devUtils": "0x161793cdca4ff9e766a706c2c49c36ac1340bbcd", "erc20BridgeProxy": "0x8ed95d1746bf1e4dab58d8ed4724f1ef95b20db0", "uniswapBridge": "0x533344cfdf2a3e911e2cf4c6f5ed08e791f5355f", "erc20BridgeSampler": "0x25840bf3582cb9e5acabbf45148b3092ac3f6b56", @@ -42,10 +43,11 @@ "dutchAuction": "0x0000000000000000000000000000000000000000", "coordinatorRegistry": "0x403cc23e88c17c4652fb904784d1af640a6722d9", "coordinator": "0x6ff734d96104965c9c1b0108f83abc46e6e501df", + "libTransactionDecoder": "0xb20f3b07afb0e38b6151b9be4f53218bdd7dc231", "multiAssetProxy": "0xab8fbd189c569ccdee3a4d929bb7f557be4028f6", "staticCallProxy": "0xe1b97e47aa3796276033a5341e884d2ba46b6ac1", "erc1155Proxy": "0x19bb6caa3bc34d39e5a23cedfa3e6c7e7f3c931d", - "devUtils": "0x09a379ef7218bcfd8913faa8b281ebc5a2e0bc04", + "devUtils": "0x161793cdca4ff9e766a706c2c49c36ac1340bbcd", "zrxVault": "0xffd161026865ad8b4ab28a76840474935eec4dfa", "staking": "0x986b588e472b712385579d172494fe2685669504", "stakingProxy": "0xfaabcee42ab6b9c649794ac6c133711071897ee9", @@ -67,6 +69,7 @@ "assetProxyOwner": "0x0000000000000000000000000000000000000000", "zeroExGovernor": "0x3f46b98061a3e1e1f41dff296ec19402c298f8a9", "forwarder": "0xd67f2f346f6e85db70632d9f18f50e04192ab54d", + "libTransactionDecoder": "0x34b37611db8190469b735fb2a007d8236c29eb88", "orderValidator": "0x0000000000000000000000000000000000000000", "dutchAuction": "0x0000000000000000000000000000000000000000", "coordinatorRegistry": "0x1084b6a398e47907bae43fec3ff4b677db6e4fee", @@ -74,7 +77,7 @@ "multiAssetProxy": "0xb34cde0ad3a83d04abebc0b66e75196f22216621", "staticCallProxy": "0xe1b97e47aa3796276033a5341e884d2ba46b6ac1", "erc1155Proxy": "0x19bb6caa3bc34d39e5a23cedfa3e6c7e7f3c931d", - "devUtils": "0x09a379ef7218bcfd8913faa8b281ebc5a2e0bc04", + "devUtils": "0x161793cdca4ff9e766a706c2c49c36ac1340bbcd", "zrxVault": "0xa5bf6ac73bc40790fc6ffc9dbbbce76c9176e224", "staking": "0x7cbe3c09cba24f26db24d9100ee915fa9fa21f5b", "stakingProxy": "0xc6ad5277ea225ac05e271eb14a7ebb480cd9dd9f", @@ -97,13 +100,14 @@ "zeroExGovernor": "0x6ff734d96104965c9c1b0108f83abc46e6e501df", "forwarder": "0x2759a4c639fa4882d6d64973630ef81faf901d27", "orderValidator": "0x0000000000000000000000000000000000000000", + "libTransactionDecoder": "0x067b5997c9058eade0bb03d8fb5e6db7feda80a3", "dutchAuction": "0x0000000000000000000000000000000000000000", "coordinatorRegistry": "0x09fb99968c016a3ff537bf58fb3d9fe55a7975d5", "coordinator": "0xd29e59e51e8ab5f94121efaeebd935ca4214e257", "multiAssetProxy": "0xf6313a772c222f51c28f2304c0703b8cf5428fd8", "staticCallProxy": "0x48e94bdb9033640d45ea7c721e25f380f8bffa43", "erc1155Proxy": "0x64517fa2b480ba3678a2a3c0cf08ef7fd4fad36f", - "devUtils": "0xeb27220f95f364e1d9531992c48613f231839f53", + "devUtils": "0x161793cdca4ff9e766a706c2c49c36ac1340bbcd", "zrxVault": "0xf36eabdfe986b35b62c8fd5a98a7f2aebb79b291", "staking": "0x32b06d5611a03737a5f1834a24ccd641033fd89c", "stakingProxy": "0xbab9145f1d57cd4bb0c9aa2d1ece0a5b6e734d34", @@ -125,6 +129,7 @@ "assetProxyOwner": "0x0000000000000000000000000000000000000000", "erc20BridgeProxy": "0x8ea76477cfaca8f7ea06477fd3c09a740ac6012a", "zeroExGovernor": "0x0000000000000000000000000000000000000000", + "libTransactionDecoder": "0xb48e1b16829c7f5bd62b76cb878a6bb1c4625d7a", "forwarder": "0x5d3ad3561a1235273cbcb4e82fce63a0073d19be", "orderValidator": "0x0000000000000000000000000000000000000000", "dutchAuction": "0x0000000000000000000000000000000000000000", diff --git a/packages/contract-addresses/src/index.ts b/packages/contract-addresses/src/index.ts index 56d231d8b0..4a38643e5d 100644 --- a/packages/contract-addresses/src/index.ts +++ b/packages/contract-addresses/src/index.ts @@ -14,6 +14,7 @@ export interface ContractAddresses { forwarder: string; coordinatorRegistry: string; coordinator: string; + libTransactionDecoder: string; multiAssetProxy: string; staticCallProxy: string; erc1155Proxy: string; diff --git a/packages/contract-artifacts/artifacts/DevUtils.json b/packages/contract-artifacts/artifacts/DevUtils.json index d73f224bde..70d3c69d1c 100644 --- a/packages/contract-artifacts/artifacts/DevUtils.json +++ b/packages/contract-artifacts/artifacts/DevUtils.json @@ -326,40 +326,6 @@ "stateMutability": "pure", "type": "function" }, - { - "constant": true, - "inputs": [{ "internalType": "bytes", "name": "transactionData", "type": "bytes" }], - "name": "decodeZeroExTransactionData", - "outputs": [ - { "internalType": "string", "name": "functionName", "type": "string" }, - { - "components": [ - { "internalType": "address", "name": "makerAddress", "type": "address" }, - { "internalType": "address", "name": "takerAddress", "type": "address" }, - { "internalType": "address", "name": "feeRecipientAddress", "type": "address" }, - { "internalType": "address", "name": "senderAddress", "type": "address" }, - { "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" }, - { "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" }, - { "internalType": "uint256", "name": "makerFee", "type": "uint256" }, - { "internalType": "uint256", "name": "takerFee", "type": "uint256" }, - { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" }, - { "internalType": "uint256", "name": "salt", "type": "uint256" }, - { "internalType": "bytes", "name": "makerAssetData", "type": "bytes" }, - { "internalType": "bytes", "name": "takerAssetData", "type": "bytes" }, - { "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" }, - { "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" } - ], - "internalType": "struct LibOrder.Order[]", - "name": "orders", - "type": "tuple[]" - }, - { "internalType": "uint256[]", "name": "takerAssetFillAmounts", "type": "uint256[]" }, - { "internalType": "bytes[]", "name": "signatures", "type": "bytes[]" } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, { "constant": true, "inputs": [ @@ -907,11 +873,6 @@ "params": { "encoded": "ABI-encoded revert error." }, "return": "transactionHash Hash of the transaction.errorData Error thrown by exeucteTransaction()." }, - "decodeZeroExTransactionData(bytes)": { - "details": "Decodes the call data for an Exchange contract method call.", - "params": { "transactionData": "ABI-encoded calldata for an Exchange contract method call." }, - "return": "The name of the function called, and the parameters it was given. For single-order fills and cancels, the arrays will have just one element." - }, "encodeERC1155AssetData(address,uint256[],uint256[],bytes)": { "details": "Encode ERC-1155 asset data into the format described in the AssetProxy contract specification.", "params": { @@ -1064,10 +1025,10 @@ }, "evm": { "bytecode": { - "object": "0x60806040523480156200001157600080fd5b50604051620063ad380380620063ad833981016040819052620000349162000409565b600080546001600160a01b0319166001600160a01b0384811691909117808355604051630c0e082160e31b81528392869286928492839285929116906360704108906200008d90630f47261b60e41b9060040162000447565b60206040518083038186803b158015620000a657600080fd5b505afa158015620000bb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620000e19190810190620003d9565b600180546001600160a01b0319166001600160a01b03928316179055600054604051630c0e082160e31b81529116906360704108906200012d9063012b8bc960e11b9060040162000447565b60206040518083038186803b1580156200014657600080fd5b505afa1580156200015b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620001819190810190620003d9565b600280546001600160a01b0319166001600160a01b03928316179055600054604051630c0e082160e31b8152911690636070410890620001cd9063a7cb5fb760e01b9060040162000447565b60206040518083038186803b158015620001e657600080fd5b505afa158015620001fb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620002219190810190620003d9565b600380546001600160a01b0319166001600160a01b03928316179055600054604051630c0e082160e31b81529116906360704108906200026d9063619ce88560e11b9060040162000447565b60206040518083038186803b1580156200028657600080fd5b505afa1580156200029b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620002c19190810190620003d9565b600480546001600160a01b03199081166001600160a01b039384161790915560058054821693831693909317909255600680549092169381169390931790555060009250831615905062000316578162000318565b305b9050620003736040518060400160405280600b81526020016a0c1e08141c9bdd1bd8dbdb60aa1b815250604051806040016040528060058152602001640332e302e360dc1b81525085846200038260201b620038f71760201c565b60075550620004759350505050565b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a0902090565b600060208284031215620003eb578081fd5b81516001600160a01b038116811462000402578182fd5b9392505050565b600080604083850312156200041c578081fd5b825162000429816200045c565b60208401519092506200043c816200045c565b809150509250929050565b6001600160e01b031991909116815260200190565b6001600160a01b03811681146200047257600080fd5b50565b615f2880620004856000396000f3fe608060405234801561001057600080fd5b506004361061027f5760003560e01c80638f4ce4791161015c578063c26cfecd116100ce578063d3d862d111610087578063d3d862d1146106d7578063d4695028146106ea578063e25cabf71461070a578063e4e6e7da1461072c578063e77286eb1461074d578063ee4f5a941461076f5761027f565b8063c26cfecd14610652578063ca49f47c1461065a578063cafd3a071461067d578063d001c5dc1461069e578063d186037f146106b1578063d3637905146106c45761027f565b8063a5cd62ba11610120578063a5cd62ba146105a6578063a6627e9f146105c6578063acaedc74146105d9578063b43cffe1146105fc578063bbb2dcf61461060f578063bc03f964146106315761027f565b80638f4ce479146105265780639a7e7526146105395780639eadc8351461055c578063a070cac814610580578063a0901e51146105935761027f565b80634dfdac20116101f5578063750bdb30116101b9578063750bdb301461047b5780637914b2ec1461049e5780637982653e146104bf57806379c9c426146104df5780637b66ad34146104f25780637d727512146105135761027f565b80634dfdac20146103e3578063590aa8751461040357806363eb39921461042357806365129042146104365780636f83188e146104585761027f565b8063314853ff11610247578063314853ff14610333578063327d30541461035557806332aae3ad146103685780633db6dc611461038a578063459be5e2146103ad57806346eb65cb146103ce5761027f565b806302d0aec31461028457806304a5618a146102ae5780630d7b7d76146102d0578063165979e1146102f15780632322cf7614610313575b600080fd5b610297610292366004614f2f565b610791565b6040516102a5929190615948565b60405180910390f35b6102c16102bc366004614f2f565b6107ed565b6040516102a593929190615a76565b6102e36102de366004614a77565b610868565b6040516102a59291906158f6565b6103046102ff366004614f2f565b61088a565b6040516102a593929190615bb1565b610326610321366004614a77565b6108e7565b6040516102a591906158b1565b610346610341366004614f2f565b61090f565b6040516102a59392919061591d565b6102e3610363366004614f2f565b610956565b61037b610376366004614f2f565b610998565b6040516102a593929190615b26565b61039d610398366004614f2f565b6109eb565b6040516102a594939291906158ba565b6103c06103bb366004614f2f565b610a35565b6040516102a5929190615b9a565b6103e16103dc366004614f2f565b610a8b565b005b6103f66103f13660046149a0565b610ba9565b6040516102a5919061584b565b6104166104113660046147ba565b610c2c565b6040516102a59190615ad5565b610416610431366004614aba565b610c82565b610449610444366004614f2f565b610cdf565b6040516102a593929190615612565b61046b610466366004614f2f565b610d19565b6040516102a59493929190615c26565b61048e610489366004614f2f565b611526565b6040516102a5949392919061599d565b6104b16104ac366004614f2f565b6115a4565b6040516102a592919061597a565b6104d26104cd366004614ff7565b6115dc565b6040516102a59190615bcc565b6103266104ed3660046151a6565b611863565b610505610500366004614f2f565b6118c2565b6040516102a59291906155f8565b610326610521366004614a77565b6118fa565b6104b1610534366004614f2f565b611ea2565b61054c610547366004614f2f565b611eff565b6040516102a59493929190615bdf565b61056f61056a366004614f2f565b611f60565b6040516102a59594939291906159d9565b61032661058e3660046150a4565b611fd8565b6103f66105a1366004614b3b565b61202f565b6105b96105b4366004614b9f565b6120a8565b6040516102a59190615764565b6104166105d4366004614b10565b61216b565b6105ec6105e7366004614f2f565b6121c4565b6040516102a594939291906156be565b61041661060a3660046149ed565b612200565b61062261061d366004614f2f565b61225f565b6040516102a593929190615aa1565b61064461063f366004614f2f565b6122d9565b6040516102a5929190615904565b610326612312565b61066d610668366004614f2f565b612318565b6040516102a59493929190615a31565b61069061068b366004614f2f565b612389565b6040516102a5929190615c18565b6103f66106ac3660046149a0565b6123d7565b6103266106bf366004614a77565b612445565b6104d26106d2366004614ff7565b612b56565b6104166106e5366004614d39565b612eb6565b6106fd6106f8366004614f2f565b612ed5565b6040516102a59190615965565b61071d610718366004614c18565b612f8a565b6040516102a5939291906157b0565b61073f61073a3660046149a0565b6130c2565b6040516102a592919061588c565b61076061075b36600461504e565b6130db565b6040516102a593929190615d8c565b61078261077d366004614f2f565b613313565b6040516102a593929190615b70565b6000806107a5836107a0613350565b61335b565b60006107be600485518661339b9092919063ffffffff16565b8060200190516107d19190810190614ee2565b909350905060ff811660068111156107e557fe5b915050915091565b60008080610801848263ffffffff6133de16565b92506001600160e01b0319831663012b8bc960e11b1461083c5760405162461bcd60e51b815260040161083390615d64565b60405180910390fd5b61084d84601063ffffffff61341216565b915061086084602463ffffffff61344516565b929491935050565b60008061087584846118fa565b91506108818484612445565b90509250929050565b600080600061089b846107a0613451565b60006108b4600486518761339b9092919063ffffffff16565b8060200190516108c79190810190615375565b9094509250905060ff811660028111156108dd57fe5b9350509193909250565b60008060006108f68585610868565b91509150610904828261345c565b925050505b92915050565b6000606080610920846107a0613472565b835161093690859060049063ffffffff61339b16565b8060200190516109499190810190614e83565b9196909550909350915050565b600080610965836107a061347d565b825161097b90849060049063ffffffff61339b16565b80602001905161098e9190810190614e26565b9094909350915050565b60008060606109a9846107a0613488565b60006109c2600486518761339b9092919063ffffffff16565b8060200190516109d59190810190615336565b9094509250905060ff811660018111156108dd57fe5b6000806060806109fd856107a0613493565b8451610a1390869060049063ffffffff61339b16565b806020019051610a269190810190614de3565b92989197509550909350915050565b600080610a44836107a061349e565b6000610a5d600485518661339b9092919063ffffffff16565b806020019051610a709190810190615275565b9250905060ff81166003811115610a8357fe5b925050915091565b6000610a9d828263ffffffff6133de16565b90506001600160e01b03198116630f47261b60e41b1415610ac857610ac182611ea2565b5050610ba5565b6001600160e01b0319811663012b8bc960e11b1415610af257610aea826107ed565b505050610ba5565b6001600160e01b0319811663a7cb5fb760e01b1415610b1e57610b1482611f60565b5050505050610ba5565b6001600160e01b031981166394cfcdd760e01b1415610b4057610aea8261225f565b6001600160e01b0319811663619ce88560e11b1415610b6b57610b6282612318565b50505050610ba5565b6001600160e01b0319811663dc1600f360e01b1415610b8d57610b6282611526565b60405162461bcd60e51b815260040161083390615d64565b5050565b606060008251905080604051908082528060200260200182016040528015610bdb578160200160208202803883390190505b50915060005b818114610c2457610c0585858381518110610bf857fe5b6020026020010151612445565b838281518110610c1157fe5b6020908102919091010152600101610be1565b505092915050565b604051606090630f47261b60e41b90610c499084906024016155e4565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091529050919050565b60405160609063619ce88560e11b90610ca39086908690869060240161568a565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915290505b9392505050565b6000806000610cf0846107a06134a9565b8351610d0690859060049063ffffffff61339b16565b8060200190516109499190810190614870565b60608080806000610d30868263ffffffff6133de16565b90506001600160e01b0319811663dedfc1f160e01b1415610d7c5760405180604001604052806011815260200170626174636843616e63656c4f726465727360781b8152509450611128565b6001600160e01b03198116634b4a520160e11b1415610dc4576040518060400160405280600f81526020016e626174636846696c6c4f726465727360881b8152509450611128565b6001600160e01b031981166323aa37f960e21b1415610e135760405180604001604052806016815260200175626174636846696c6c4f72646572734e6f5468726f7760501b8152509450611128565b6001600160e01b03198116632fbb8b8560e21b1415610e615760405180604001604052806015815260200174626174636846696c6c4f724b696c6c4f726465727360581b8152509450611128565b6001600160e01b03198116632da6298760e01b1415610ea5576040518060400160405280600b81526020016a31b0b731b2b627b93232b960a91b8152509450611128565b6001600160e01b03198116634da26aab60e11b1415610ee757604051806040016040528060098152602001683334b63627b93232b960b91b8152509450611128565b6001600160e01b03198116633852d63160e21b1415610f2f576040518060400160405280600f81526020016e3334b63627b925b4b63627b93232b960891b8152509450611128565b6001600160e01b031981166378d29ac160e01b1415610f7e57604051806040016040528060168152602001756d61726b65744275794f72646572734e6f5468726f7760501b8152509450611128565b6001600160e01b0319811663369da09960e01b1415610fd4576040518060400160405280601781526020017f6d61726b657453656c6c4f72646572734e6f5468726f770000000000000000008152509450611128565b6001600160e01b03198116638bc8efb360e01b141561102a576040518060400160405280601981526020017f6d61726b65744275794f726465727346696c6c4f724b696c6c000000000000008152509450611128565b6001600160e01b0319811663a6c3bf3360e01b1415611080576040518060400160405280601a81526020017f6d61726b657453656c6c4f726465727346696c6c4f724b696c6c0000000000008152509450611128565b6001600160e01b031981166388ec79fb60e01b14156110c4576040518060400160405280600b81526020016a6d617463684f726465727360a81b8152509450611128565b6001600160e01b03198116634f9559b160e01b14806110f357506001600160e01b031981166302280c9160e41b145b156111105760405162461bcd60e51b815260040161083390615d17565b60405162461bcd60e51b815260040161083390615ce0565b6001600160e01b0319811663dedfc1f160e01b14156111b457855161115790879060049063ffffffff6134b416565b80602001905161116a9190810190614b6d565b604080516000808252602082019092529195505b50604080516000808252602082019092529194506111ac565b60608152602001906001900390816111975790505b50915061151e565b6001600160e01b03198116632fbb8b8560e21b14806111e357506001600160e01b03198116634b4a520160e11b145b806111fe57506001600160e01b031981166323aa37f960e21b145b156112185761120c86613534565b9195509350915061151e565b6001600160e01b03198116632da6298760e01b14156112e75760408051600180825281830190925290816020015b61124e6140ed565b815260200190600190039081611246575050865190945061127990879060049063ffffffff6134b416565b80602001905161128c9190810190614fc5565b8460008151811061129957fe5b6020026020010181905250600060405190808252806020026020018201604052801561117e5781602001602082028038833901905050604080516000808252602082019092529194506111ac565b6001600160e01b03198116633852d63160e21b148061131657506001600160e01b03198116634da26aab60e11b145b156113245761120c86613563565b6001600160e01b031981166378d29ac160e01b148061135357506001600160e01b0319811663369da09960e01b145b8061136e57506001600160e01b03198116638bc8efb360e01b145b8061138957506001600160e01b0319811663a6c3bf3360e01b145b156113975761120c8661365d565b6001600160e01b031981166388ec79fb60e01b141561151e576113b86140ed565b6113c06140ed565b6060806113da60048b518c6134b49092919063ffffffff16565b8060200190516113ed91908101906150fc565b604080516002808252606082019092529498509296509094509250816020015b6114156140ed565b81526020019060019003908161140d579050509750838860008151811061143857fe5b6020026020010181905250828860018151811061145157fe5b602090810291909101015260408051600280825260608201909252908160200160208202803883390190505096508360a001518760008151811061149157fe5b6020026020010181815250508260a00151876001815181106114af57fe5b60209081029190910101526040805160028082526060820190925290816020015b60608152602001906001900390816114d057905050955081866000815181106114f557fe5b6020026020010181905250808660018151811061150e57fe5b6020026020010181905250505050505b509193509193565b60008080606061153c858363ffffffff6133de16565b93506001600160e01b0319841663dc1600f360e01b1461156e5760405162461bcd60e51b815260040161083390615d64565b845161158490869060049063ffffffff6134b416565b806020019051611597919081019061480f565b9597919650949350915050565b6000806115b3836107a06136d1565b82516115c990849060049063ffffffff61339b16565b80602001905161098e9190810190614f06565b60006115e6614180565b6116778584600660009054906101000a90046001600160a01b03166001600160a01b0316631ce4c78b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561163957600080fd5b505afa15801561164d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611671919081019061525d565b3a6136db565b60408051600280825260608281019093529293509091816020015b606081526020019060019003908161169257505060408051600280825260608083018452939450909160208301908038833950506040805160028082526060808301845294955090925090602083019080388339505060408051600280825260608083018452949550909250906020830190803883390190505090508861014001518460008151811061172157fe5b602002602001018190525088600001518360008151811061173e57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050878260008151811061176c57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505084600001518160008151811061179e57fe5b602002602001018181525050886101800151846001815181106117bd57fe5b60200260200101819052508860000151836001815181106117da57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505088604001518260018151811061180c57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505084604001518160018151811061183e57fe5b60200260200101818152505061185684848484613752565b9998505050505050505050565b60006118ba846118b56040518060400160405280600b81526020016a0c1e08141c9bdd1bd8dbdb60aa1b815250604051806040016040528060058152602001640332e302e360dc1b81525087876138f7565b61394e565b949350505050565b6000806118d1836107a0613962565b82516118e790849060049063ffffffff61339b16565b80602001905161098e91908101906147d6565b60008061190d838263ffffffff6133de16565b90506001600160e01b03198116630f47261b60e41b141561194f57600061193b84601063ffffffff61341216565b9050611947818661396d565b925050611e9b565b6001600160e01b0319811663012b8bc960e11b1415611a8e57600080611974856107ed565b6040519194509250606091506331a9108f60e11b906119979084906024016158b1565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060846001600160a01b0316836040516119e891906155c8565b600060405180830381855afa9150503d8060008114611a23576040519150601f19603f3d011682016040523d82523d6000602084013e611a28565b606091505b50915091506000828015611a3d575081516020145b611a48576000611a59565b611a5982600c63ffffffff61341216565b9050896001600160a01b0316816001600160a01b031614611a7b576000611a7e565b60015b60ff169750505050505050611e9b565b6001600160e01b0319811663a7cb5fb760e01b1415611c4c576000606080611ab586611f60565b5081519296509094509250905060005b818114611c4257828181518110611ad857fe5b602002602001015160001415611aed57611c3a565b8351606090627eeac760e11b908b90879085908110611b0857fe5b6020026020010151604051602401611b219291906156f4565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060876001600160a01b031683604051611b7291906155c8565b600060405180830381855afa9150503d8060008114611bad576040519150601f19603f3d011682016040523d82523d6000602084013e611bb2565b606091505b50915091506000828015611bc7575081516020145b611bd2576000611be3565b611be382600063ffffffff61344516565b90506000878681518110611bf357fe5b60200260200101518281611c0357fe5b04905080611c1f5760009b505050505050505050505050610909565b8b811080611c2b57508b155b15611c3457809b505b50505050505b600101611ac5565b5050505050611e9b565b6001600160e01b0319811663619ce88560e11b1415611d3857604051606090632a17967960e21b90611c8990869060009081908190602401615ae8565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925260045491519092506000916001600160a01b031690611cdb9084906155c8565b600060405180830381855afa9150503d8060008114611d16576040519150601f19603f3d011682016040523d82523d6000602084013e611d1b565b606091505b5050905080611d2b576000611d2f565b6000195b93505050611e9b565b6001600160e01b0319811663dc1600f360e01b1415611dc657600080611d5d85611526565b509250925050611d6b613a57565b6001600160a01b0316826001600160a01b0316148015611d9857506005546001600160a01b038281169116145b15611dbf576000611db0611daa613a6f565b8861396d565b9050611dbb81613a87565b9450505b5050611e9b565b6001600160e01b031981166394cfcdd760e01b1415611e9b57606080611deb8561225f565b80519194509250905060005b818114611e9657838181518110611e0a57fe5b602002602001015160001415611e1f57611e8e565b6000611e3e89858481518110611e3157fe5b60200260200101516118fa565b90506000858381518110611e4e57fe5b60200260200101518281611e5e57fe5b04905080611e76576000975050505050505050610909565b87811080611e82575087155b15611e8b578097505b50505b600101611df7565b505050505b5092915050565b600080611eb5838263ffffffff6133de16565b91506001600160e01b03198216630f47261b60e41b14611ee75760405162461bcd60e51b815260040161083390615d64565b611ef883601063ffffffff61341216565b9050915091565b60008060006060611f12856107a0613c85565b6000611f2b600487518861339b9092919063ffffffff16565b806020019051611f3e91908101906152d9565b91965094509250905060ff81166006811115611f5657fe5b9450509193509193565b60008060608080611f77868563ffffffff6133de16565b94506001600160e01b0319851663a7cb5fb760e01b14611fa95760405162461bcd60e51b815260040161083390615d64565b505050506024828101516044840151606485015160848601519496929591820184019490820184019391010190565b60006118ba8461202a6040518060400160405280600b81526020016a0c1e08141c9bdd1bd8dbdb60aa1b815250604051806040016040528060058152602001640332e302e360dc1b81525087876138f7565b613c90565b606080825160405190808252806020026020018201604052801561205d578160200160208202803883390190505b50905060005b83518114611e9b5783818151811061207757fe5b60200260200101516001600160a01b03163182828151811061209557fe5b6020908102919091010152600101612063565b6060600084519050806040519080825280602002602001820160405280156120da578160200160208202803883390190505b50915060005b8181146121625761212b8682815181106120f657fe5b602002602001015186838151811061210a57fe5b602002602001015186848151811061211e57fe5b6020026020010151612b56565b83828151811061213757fe5b6020026020010190600481111561214a57fe5b9081600481111561215757fe5b9052506001016120e0565b50509392505050565b60405160609063012b8bc960e11b9061218a90859085906024016156f4565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152905092915050565b600060608060606121d7856107a0613c9f565b84516121ed90869060049063ffffffff61339b16565b806020019051610a269190810190614909565b60405160609063a7cb5fb760e01b90612223908790879087908790602401615636565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091529050949350505050565b6000606080612274848463ffffffff6133de16565b92506001600160e01b031983166394cfcdd760e01b146122a65760405162461bcd60e51b815260040161083390615d64565b83516122bc90859060049063ffffffff6134b416565b8060200190516122cf9190810190614d6d565b9395909450915050565b600060606122e9836107a0613caa565b82516122ff90849060049063ffffffff61339b16565b80602001905161098e9190810190614e49565b60075481565b60008060608161232e858263ffffffff6133de16565b93506001600160e01b0319841663619ce88560e11b146123605760405162461bcd60e51b815260040161083390615d64565b845161237690869060049063ffffffff6134b416565b80602001905161159791908101906148b2565b600080612398836107a0613cb5565b60006123b1600485518661339b9092919063ffffffff16565b8060200190516123c49190810190615275565b9250905060ff81166001811115610a8357fe5b606060008251905080604051908082528060200260200182016040528015612409578160200160208202803883390190505b50915060005b818114610c245761242685858381518110611e3157fe5b83828151811061243257fe5b602090810291909101015260010161240f565b600080612458838263ffffffff6133de16565b90506001600160e01b031981166394cfcdd760e01b14156125285760608061247f8561225f565b80519194509250905060005b81811461251d5783818151811061249e57fe5b6020026020010151600014156124b357612515565b60006124c589858481518110610bf857fe5b905060008583815181106124d557fe5b602002602001015182816124e557fe5b049050806124fd576000975050505050505050610909565b87811080612509575087155b15612512578097505b50505b60010161248b565b506109099350505050565b6001600160e01b03198116630f47261b60e41b141561264c57600061255484601063ffffffff61341216565b600154604051919250606091636eb1769f60e11b916125819189916001600160a01b0316906024016155f8565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060836001600160a01b0316836040516125d291906155c8565b600060405180830381855afa9150503d806000811461260d576040519150601f19603f3d011682016040523d82523d6000602084013e612612565b606091505b5091509150818015612625575080516020145b612630576000612641565b61264181600063ffffffff61344516565b955050505050611e9b565b6001600160e01b0319811663012b8bc960e11b141561287f57600080612671856107ed565b6002546040519295509093506060925063e985e9c560e01b916126a4918a916001600160a01b03909116906024016155f8565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060846001600160a01b0316836040516126f591906155c8565b600060405180830381855afa9150503d8060008114612730576040519150601f19603f3d011682016040523d82523d6000602084013e612735565b606091505b509150915081158061274957508051602014155b80612765575061276081600063ffffffff61344516565b600114155b156128705760405160609063020604bf60e21b906127879087906024016158b1565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050509050856001600160a01b0316816040516127d491906155c8565b600060405180830381855afa9150503d806000811461280f576040519150601f19603f3d011682016040523d82523d6000602084013e612814565b606091505b509093509150828015612828575081516020145b801561285757506002546001600160a01b031661284c83600c63ffffffff61341216565b6001600160a01b0316145b612862576000612865565b60015b60ff16975050611c42565b60001996505050505050611e9b565b6001600160e01b0319811663a7cb5fb760e01b14156129ad5760006128a384611f60565b50506003546040519294506060935063e985e9c560e01b926128d4925089916001600160a01b0316906024016155f8565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060836001600160a01b03168360405161292591906155c8565b600060405180830381855afa9150503d8060008114612960576040519150601f19603f3d011682016040523d82523d6000602084013e612965565b606091505b5091509150818015612978575080516020145b8015612994575061299081600063ffffffff61344516565b6001145b61299f576000612641565b600019955050505050611e9b565b6001600160e01b0319811663619ce88560e11b14156129d0576000199150611e9b565b6001600160e01b0319811663dc1600f360e01b1415611e9b576000806129f585611526565b509250925050612a03613a57565b6001600160a01b0316826001600160a01b0316148015612a3057506005546001600160a01b038281169116145b15612b4d57600554604051606091636eb1769f60e11b91612a61918a916001600160a01b03909116906024016155f8565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152905060006060612aa1613a6f565b6001600160a01b031683604051612ab891906155c8565b600060405180830381855afa9150503d8060008114612af3576040519150601f19603f3d011682016040523d82523d6000602084013e612af8565b606091505b50915091506000828015612b0d575081516020145b612b18576000612b29565b612b2982600063ffffffff61344516565b90506000198114612b4257612b3d81613a87565b612b46565b6000195b9750505050505b50505092915050565b6000612b60614180565b612bb38584600660009054906101000a90046001600160a01b03166001600160a01b0316631ce4c78b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561163957600080fd5b60408051600480825260a0820190925291925060609190816020015b6060815260200190600190039081612bcf57505060408051600480825260a082019092529192506060919060208201608080388339505060408051600480825260a08201909252929350606092915060208201608080388339505060408051600480825260a0820190925292935060609291506020820160808038833901905050905088610160015184600081518110612c6557fe5b60200260200101819052508783600081518110612c7e57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050886000015182600081518110612cb057fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508681600081518110612cde57fe5b60200260200101818152505088610140015184600181518110612cfd57fe5b6020026020010181905250886000015183600181518110612d1a57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508782600181518110612d4857fe5b60200260200101906001600160a01b031690816001600160a01b031681525050846000015181600181518110612d7a57fe5b602002602001018181525050886101a0015184600281518110612d9957fe5b60200260200101819052508783600281518110612db257fe5b60200260200101906001600160a01b031690816001600160a01b031681525050886040015182600281518110612de457fe5b60200260200101906001600160a01b031690816001600160a01b031681525050846060015181600281518110612e1657fe5b60200260200101818152505088610180015184600381518110612e3557fe5b6020026020010181905250886000015183600381518110612e5257fe5b60200260200101906001600160a01b031690816001600160a01b031681525050886040015182600381518110612e8457fe5b60200260200101906001600160a01b031690816001600160a01b03168152505084604001518160038151811061183e57fe5b6040516060906394cfcdd760e01b9061218a908590859060240161585e565b6000612ee7828263ffffffff6133de16565b90506001600160e01b03198116630f47261b60e41b1480612f1857506001600160e01b0319811663012b8bc960e11b145b80612f3357506001600160e01b0319811663a7cb5fb760e01b145b80612f4e57506001600160e01b031981166394cfcdd760e01b145b80612f6957506001600160e01b0319811663619ce88560e11b145b612f855760405162461bcd60e51b815260040161083390615d64565b919050565b606080606060008551905080604051908082528060200260200182016040528015612fcf57816020015b612fbc6141af565b815260200190600190039081612fb45790505b50935080604051908082528060200260200182016040528015612ffc578160200160208202803883390190505b50925080604051908082528060200260200182016040528015613029578160200160208202803883390190505b50915060005b8181146130b95761306687828151811061304557fe5b602002602001015187838151811061305957fe5b60200260200101516130db565b875188908590811061307457fe5b6020026020010187858151811061308757fe5b6020026020010187868151811061309a57fe5b931515602094850291909101909301929092529190525260010161302f565b50509250925092565b6060806130cf84846123d7565b91506108818484610ba9565b6130e36141af565b600654604051639d3fa4b960e01b815260009182916001600160a01b0390911690639d3fa4b990613118908890600401615db0565b60606040518083038186803b15801561313057600080fd5b505afa158015613144573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131689190810190614f7d565b855160065460405163a12dcc6f60e01b815292955090916001600160a01b039091169063a12dcc6f906131a19089908990600401615dc3565b60206040518083038186803b1580156131b957600080fd5b505afa1580156131cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131f19190810190614dc3565b91506000613204828861014001516108e7565b60a088015160c08901516101808a01516101408b0151939450919290916000916132339163ffffffff613cc016565b156132605761325984613253848d60800151613ce590919063ffffffff16565b85613d01565b90506132b9565b8161327457613259848b6080015185613d01565b6000613285868c61018001516108e7565b90506000613298868d6080015187613d01565b905060006132a7838688613d01565b90506132b3828261345c565b93505050505b6132d96132d3896040015185613d2390919063ffffffff16565b8261345c565b965060046132ec8b8c602001518a6115dc565b60048111156132f757fe5b14613303576000613305565b865b965050505050509250925092565b6000806000613324846107a0613d42565b600061333d600486518761339b9092919063ffffffff16565b8060200190516108c791908101906152a2565b63fdb6ca8d60e01b90565b60006133688360006133de565b90506001600160e01b0319808216908316146133965760405162461bcd60e51b815260040161083390615d3e565b505050565b6060818311156133b9576133b96133b460008585613d4d565b613d6c565b83518211156133d2576133d26133b46001848751613d4d565b50819003910190815290565b600081600401835110156133ff576133ff6133b46003855185600401613d4d565b5001602001516001600160e01b03191690565b60008160140183511015613433576134336133b46004855185601401613d4d565b5001601401516001600160a01b031690565b6000610cd88383613d74565b6318e4b14160e01b90565b600081831061346b5781610cd8565b5090919050565b634678472b60e01b90565b63b6555d6f60e01b90565b6324410cd360e11b90565b631b8388f760e01b90565b630e94a7ed60e41b90565b634ad3127560e01b90565b6060818311156134cd576134cd6133b460008585613d4d565b83518211156134e6576134e66133b46001848751613d4d565b8282036040519080825280601f01601f191660200182016040528015613513576020820181803883390190505b509050610cd861352282613d9e565b8461352c87613d9e565b018351613da4565b606080606061355060048551866134b49092919063ffffffff16565b8060200190516109499190810190614c6e565b60408051600180825281830190925260609182918291816020015b6135866140ed565b81526020019060019003908161357e5750506040805160018082528183019092529194506020808301908038833901905050604080516001808252818301909252919350816020015b60608152602001906001900390816135cf57505084519091506135fc90859060049063ffffffff6134b416565b80602001905161360f9190810190615154565b8560008151811061361c57fe5b602002602001018560008151811061363057fe5b602002602001018560008151811061364457fe5b6020908102919091010192909252919052529193909250565b6040805160018082528183019092526060918291829160208083019080388339505085519193506136999186915060049063ffffffff6134b416565b8060200190516136ac9190810190614ce7565b845185906000906136b957fe5b60209081029190910101919091529095929450925050565b628e3db960e51b90565b6136e3614180565b6020810184905260a085015160808601516136ff918691613e49565b815260a085015160c0860151613716918691613e49565b604082015260a085015160e0860151613730918691613e49565b6060820152613745828463ffffffff613e7d16565b6080820152949350505050565b60405160009060609063b04fbddd60e01b9061377890889088908890889060240161570d565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925260065491519092506060916001600160a01b0316906137ca9084906155c8565b6000604051808303816000865af19150503d8060008114613807576040519150601f19603f3d011682016040523d82523d6000602084013e61380c565b606091505b50915060009050613823828263ffffffff6133de16565b905061382d613488565b6001600160e01b03198281169116141561386a57600061384c83610998565b5091505060ff8116600481111561385f57fe5b9450505050506118ba565b613872613472565b6001600160e01b0319828116911614156138a55760006138918361090f565b509091505060ff8116600481111561385f57fe5b815160208301207ff43f26ea5a94b478394a975e856464913dc1a8a1ca70939d974aa7c238aa0ce014156138df57600493505050506118ba565b60405162461bcd60e51b815260040161083390615cb3565b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a0902090565b6000610cd88261395d85613eae565b613f29565b6350ae068360e11b90565b6040516000906060906370a0823160e01b9061398d9085906024016155e4565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060856001600160a01b0316836040516139de91906155c8565b600060405180830381855afa9150503d8060008114613a19576040519150601f19603f3d011682016040523d82523d6000602084013e613a1e565b606091505b5091509150818015613a31575080516020145b613a3c576000613a4d565b613a4d81600063ffffffff61344516565b9695505050505050565b736b175474e89094c44da98b954eedeac495271d0f90565b7306af07097c9eeb7fd685c692751d5c66db49c21590565b600080613a92613a6f565b6001600160a01b0316634ba2363a6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015613acc57600080fd5b505af1158015613ae0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613b049190810190614f61565b90506000816001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015613b4357600080fd5b505af1158015613b57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613b7b919081019061525d565b4211613bf957816001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381600087803b158015613bbc57600080fd5b505af1158015613bd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613bf4919081019061525d565b613c6c565b816001600160a01b0316639f678cca6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015613c3457600080fd5b505af1158015613c48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613c6c919081019061525d565b90506118ba816b033b2e3c9fd0803ce800000086613d01565b630fcb446360e31b90565b6000610cd88261395d85613f48565b635bd0428d60e01b90565b6320d11f6160e01b90565b633d66146160e21b90565b600081518351148015610cd85750508051602091820120825192909101919091201490565b600082820183811015610cd857610cd86133b460008686614001565b60006118ba83613d17868563ffffffff613e7d16565b9063ffffffff61402016565b600082821115613d3c57613d3c6133b460028585614001565b50900390565b631ca78ed960e31b90565b6060632800659560e01b848484604051602401610ca393929190615bbe565b805160208201fd5b60008160200183511015613d9557613d956133b46005855185602001613d4d565b50016020015190565b60200190565b6020811015613dce576001816020036101000a038019835116818551168082178652505050613396565b82821415613ddb57613396565b82821115613e155760208103905080820181840181515b82851015613e0d578451865260209586019590940193613df2565b905250613396565b60208103905080820181840183515b81861215613e405782518252601f199283019290910190613e24565b85525050505050565b6000613e5684848461404a565b15613e6957613e696133b48585856140b0565b6118ba83613d17868563ffffffff613e7d16565b600082613e8c57506000610909565b82820282848281613e9957fe5b0414610cd857610cd86133b460018686614001565b608081810151825160208085015160408087015160609788015186519685019690962082517fec69816980a3a3ca4554410e60253953e9ff375ba4536a98adfa15cc7154150881529485019590955290830191909152948101949094526001600160a01b039091169183019190915260a082015260c0902090565b60405161190160f01b8152600281019290925260228201526042902090565b6101408101516101608201516101808301516101a08401516000937ff80322eb8376aafb64eadf8f0d7623f22130fd9491a221e902b713cb984a753493909290916020871015613f9457fe5b601f1987018051610140890180516101608b0180516101808d0180516101a08f0180519d89528c5160209d8e012087528b519b8d019b909b2084528951998c01999099208152875197909a019690962088526101e085209390945290529190529252919091529050919050565b606063e946c1bb60e01b848484604051602401610ca393929190615b4f565b600081614036576140366133b460038585614001565b600082848161404157fe5b04949350505050565b60008261405c5761405c6133b46140cf565b811580614067575083155b1561407457506000610cd8565b6000838061407e57fe5b8584099050614093858463ffffffff613e7d16565b6140a5826103e863ffffffff613e7d16565b101595945050505050565b606063339f3de260e01b848484604051602401610ca393929190615de8565b60408051808201909152600481526329e460df60e21b602082015290565b604051806101c0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b03168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001606081526020016060815260200160608152602001606081525090565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6040805160608101909152806000815260006020820181905260409091015290565b803561090981615ec1565b805161090981615ec1565b600082601f8301126141f7578081fd5b813561420a61420582615e24565b615dfe565b81815291506020808301908481018184028601820187101561422b57600080fd5b60005b84811015611e9657813561424181615ec1565b8452928201929082019060010161422e565b600082601f830112614263578081fd5b815161427161420582615e24565b8181529150602080830190840160005b838110156142ae5761429987602084518901016144d3565b83526020928301929190910190600101614281565b5050505092915050565b600082601f8301126142c8578081fd5b81356142d661420582615e24565b8181529150602080830190840160005b838110156142ae576142fe8760208435890101614485565b835260209283019291909101906001016142e6565b600082601f830112614323578081fd5b815161433161420582615e24565b8181529150602080830190840160005b838110156142ae576143598760208451890101614667565b83526020928301929190910190600101614341565b600082601f83011261437e578081fd5b813561438c61420582615e24565b8181529150602080830190840160005b838110156142ae576143b48760208435890101614519565b8352602092830192919091019060010161439c565b600082601f8301126143d9578081fd5b81516143e761420582615e24565b81815291506020808301908481018184028601820187101561440857600080fd5b60005b84811015611e965781518452928201929082019060010161440b565b600082601f830112614437578081fd5b813561444561420582615e24565b81815291506020808301908481018184028601820187101561446657600080fd5b60005b84811015611e9657813584529282019290820190600101614469565b600082601f830112614495578081fd5b81356144a361420582615e43565b91508082528360208285010111156144ba57600080fd5b8060208401602084013760009082016020015292915050565b600082601f8301126144e3578081fd5b81516144f161420582615e43565b915080825283602082850101111561450857600080fd5b611e9b816020840160208601615e66565b60006101c080838503121561452c578182fd5b61453581615dfe565b91505061454283836141d1565b815261455183602084016141d1565b602082015261456383604084016141d1565b604082015261457583606084016141d1565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e0820152610100808301358183015250610120808301358183015250610140808301356001600160401b03808211156145d657600080fd5b6145e286838701614485565b838501526101609250828501359150808211156145fe57600080fd5b61460a86838701614485565b8385015261018092508285013591508082111561462657600080fd5b61463286838701614485565b838501526101a092508285013591508082111561464e57600080fd5b5061465b85828601614485565b82840152505092915050565b60006101c080838503121561467a578182fd5b61468381615dfe565b91505061469083836141dc565b815261469f83602084016141dc565b60208201526146b183604084016141dc565b60408201526146c383606084016141dc565b60608201526080820151608082015260a082015160a082015260c082015160c082015260e082015160e0820152610100808301518183015250610120808301518183015250610140808301516001600160401b038082111561472457600080fd5b614730868387016144d3565b8385015261016092508285015191508082111561474c57600080fd5b614758868387016144d3565b8385015261018092508285015191508082111561477457600080fd5b614780868387016144d3565b838501526101a092508285015191508082111561479c57600080fd5b5061465b858286016144d3565b805160ff8116811461090957600080fd5b6000602082840312156147cb578081fd5b8135610cd881615ec1565b600080604083850312156147e8578081fd5b82516147f381615ec1565b602084015190925061480481615ec1565b809150509250929050565b600080600060608486031215614823578081fd5b835161482e81615ec1565b602085015190935061483f81615ec1565b60408501519092506001600160401b0381111561485a578182fd5b614866868287016144d3565b9150509250925092565b600080600060608486031215614884578081fd5b835161488f81615ec1565b60208501519093506148a081615ec1565b80925050604084015190509250925092565b6000806000606084860312156148c6578081fd5b83516148d181615ec1565b60208501519093506001600160401b038111156148ec578182fd5b6148f8868287016144d3565b925050604084015190509250925092565b6000806000806080858703121561491e578182fd5b845161492981615ec1565b60208601519094506001600160401b0380821115614945578384fd5b614951888389016144d3565b94506040870151915080821115614966578384fd5b614972888389016144d3565b93506060870151915080821115614987578283fd5b50614994878288016144d3565b91505092959194509250565b600080604083850312156149b2578182fd5b82356149bd81615ec1565b915060208301356001600160401b038111156149d7578182fd5b6149e3858286016142b8565b9150509250929050565b60008060008060808587031215614a02578182fd5b8435614a0d81615ec1565b935060208501356001600160401b0380821115614a28578384fd5b614a3488838901614427565b94506040870135915080821115614a49578384fd5b614a5588838901614427565b93506060870135915080821115614a6a578283fd5b5061499487828801614485565b60008060408385031215614a89578182fd5b8235614a9481615ec1565b915060208301356001600160401b03811115614aae578182fd5b6149e385828601614485565b600080600060608486031215614ace578081fd5b8335614ad981615ec1565b925060208401356001600160401b03811115614af3578182fd5b614aff86828701614485565b925050604084013590509250925092565b60008060408385031215614b22578182fd5b8235614b2d81615ec1565b946020939093013593505050565b600060208284031215614b4c578081fd5b81356001600160401b03811115614b61578182fd5b6118ba848285016141e7565b600060208284031215614b7e578081fd5b81516001600160401b03811115614b93578182fd5b6118ba84828501614313565b600080600060608486031215614bb3578081fd5b83356001600160401b0380821115614bc9578283fd5b614bd58783880161436e565b94506020860135915080821115614bea578283fd5b614bf6878388016141e7565b93506040860135915080821115614c0b578283fd5b5061486686828701614427565b60008060408385031215614c2a578182fd5b82356001600160401b0380821115614c40578384fd5b614c4c8683870161436e565b93506020850135915080821115614c61578283fd5b506149e3858286016142b8565b600080600060608486031215614c82578081fd5b83516001600160401b0380821115614c98578283fd5b614ca487838801614313565b94506020860151915080821115614cb9578283fd5b614cc5878388016143c9565b93506040860151915080821115614cda578283fd5b5061486686828701614253565b600080600060608486031215614cfb578081fd5b83516001600160401b0380821115614d11578283fd5b614d1d87838801614313565b9450602086015193506040860151915080821115614cda578283fd5b60008060408385031215614d4b578182fd5b82356001600160401b0380821115614d61578384fd5b614c4c86838701614427565b60008060408385031215614d7f578182fd5b82516001600160401b0380821115614d95578384fd5b614da1868387016143c9565b93506020850151915080821115614db6578283fd5b506149e385828601614253565b600060208284031215614dd4578081fd5b81518015158114610cd8578182fd5b60008060008060808587031215614df8578182fd5b845193506020850151614e0a81615ec1565b60408601519093506001600160401b0380821115614966578384fd5b60008060408385031215614e38578182fd5b505080516020909101519092909150565b60008060408385031215614e5b578182fd5b8251915060208301516001600160401b03811115614e77578182fd5b6149e3858286016144d3565b600080600060608486031215614e97578081fd5b8351925060208401516001600160401b0380821115614eb4578283fd5b614ec0878388016144d3565b93506040860151915080821115614ed5578283fd5b50614866868287016144d3565b60008060408385031215614ef4578182fd5b82519150602083015161480481615ed6565b60008060408385031215614f18578182fd5b82516001600160e01b0319811681146147f3578283fd5b600060208284031215614f40578081fd5b81356001600160401b03811115614f55578182fd5b6118ba84828501614485565b600060208284031215614f72578081fd5b8151610cd881615ec1565b600060608284031215614f8e578081fd5b614f986060615dfe565b825160078110614fa6578283fd5b8152602083810151908201526040928301519281019290925250919050565b600060208284031215614fd6578081fd5b81516001600160401b03811115614feb578182fd5b6118ba84828501614667565b60008060006060848603121561500b578081fd5b83356001600160401b03811115615020578182fd5b61502c86828701614519565b935050602084013561503d81615ec1565b929592945050506040919091013590565b60008060408385031215615060578182fd5b82356001600160401b0380821115615076578384fd5b61508286838701614519565b93506020850135915080821115615097578283fd5b506149e385828601614485565b6000806000606084860312156150b8578081fd5b83356001600160401b038111156150cd578182fd5b6150d986828701614519565b9350506020840135915060408401356150f181615ec1565b809150509250925092565b60008060008060808587031215615111578182fd5b84516001600160401b0380821115615127578384fd5b61513388838901614667565b95506020870151915080821115615148578384fd5b61495188838901614667565b600080600060608486031215615168578081fd5b83516001600160401b038082111561517e578283fd5b61518a87838801614667565b9450602086015193506040860151915080821115614ed5578283fd5b6000806000606084860312156151ba578081fd5b83356001600160401b03808211156151d0578283fd5b81860160a081890312156151e2578384fd5b6151ec60a0615dfe565b925080358352602081013560208401526040810135604084015261521388606083016141d1565b6060840152608081013582811115615229578485fd5b61523589828401614485565b60808501525091945050506020840135915061525485604086016141d1565b90509250925092565b60006020828403121561526e578081fd5b5051919050565b60008060408385031215615287578182fd5b825161529281615ed6565b6020939093015192949293505050565b6000806000606084860312156152b6578081fd5b83516152c181615ed6565b6020850151604086015191945092506150f181615ec1565b600080600080608085870312156152ee578182fd5b6152f886866147a9565b935060208501519250604085015161530f81615ec1565b60608601519092506001600160401b0381111561532a578182fd5b614994878288016144d3565b60008060006060848603121561534a578081fd5b61535485856147a9565b92506020840151915060408401516001600160401b0381111561485a578182fd5b600080600060608486031215615389578081fd5b61539385856147a9565b925060208401519150604084015190509250925092565b6001600160a01b03169052565b6000815180845260208401935060208301825b828110156153f15781516001600160a01b03168652602095860195909101906001016153ca565b5093949350505050565b600081518084526020840180819550602083028101915060208501845b84811015615446578284038852615430848351615483565b6020988901989094509190910190600101615418565b50919695505050505050565b6000815180845260208401935060208301825b828110156153f1578151865260209586019590910190600101615465565b6000815180845261549b816020860160208601615e66565b601f01601f19169290920160200192915050565b80516154ba81615ead565b825260208181015190830152604090810151910152565b60006101c06154e18484516153aa565b60208301516154f360208601826153aa565b50604083015161550660408601826153aa565b50606083015161551960608601826153aa565b506080830151608085015260a083015160a085015260c083015160c085015260e083015160e085015261010080840151818601525061012080840151818601525061014080840151828287015261557283870182615483565b9150506101609150818401518582038387015261558f8282615483565b9250505061018080840151858303828701526155ab8382615483565b9150506101a091508184015185820383870152613a4d8282615483565b600082516155da818460208701615e66565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b038516815260806020820181905260009061565a90830186615452565b828103604084015261566c8186615452565b838103606085015261567e8186615483565b98975050505050505050565b6001600160a01b03841681526060602082018190526000906156ae90830185615483565b9050826040830152949350505050565b6001600160a01b03851681526080602082018190526000906156e290830186615483565b828103604084015261566c8186615483565b6001600160a01b03929092168252602082015260400190565b60006080825261572060808301876153fb565b828103602084015261573281876153b7565b838103604085015261574481876153b7565b91505082810360608401526157598185615452565b979650505050505050565b602080825282518282018190526000918401906040840190835b818110156157a557835161579181615eb7565b83526020938401939092019160010161577e565b509095945050505050565b606080825284519082018190526000906020906080840190828801845b828110156157f3576157e08483516154af565b60609390930192908401906001016157cd565b505050838103828501526158078187615452565b84810360408601528551808252908301915082860190845b8181101561583d57825115158452928401929184019160010161581f565b509198975050505050505050565b600060208252610cd86020830184615452565b6000604082526158716040830185615452565b828103602084015261588381856153fb565b95945050505050565b60006040825261589f6040830185615452565b82810360208401526158838185615452565b90815260200190565b8481526001600160a01b03841660208201526080604082018190526000906158e490830185615483565b82810360608401526157598185615483565b918252602082015260400190565b6000838252604060208301526118ba6040830184615483565b6000848252606060208301526159366060830185615483565b8281036040840152613a4d8185615483565b8281526040810161595883615ead565b8260208301529392505050565b6001600160e01b031991909116815260200190565b6001600160e01b03199290921682526001600160a01b0316602082015260400190565b6001600160e01b0319851681526001600160a01b03848116602083015283166040820152608060608201819052600090613a4d90830184615483565b6001600160e01b0319861681526001600160a01b038516602082015260a060408201819052600090615a0d90830186615452565b8281036060840152615a1f8186615452565b83810360808501526118568186615483565b6001600160e01b0319851681526001600160a01b0384166020820152608060408201819052600090615a6590830185615483565b905082606083015295945050505050565b6001600160e01b03199390931683526001600160a01b03919091166020830152604082015260600190565b600063ffffffff60e01b8516825260606020830152615ac36060830185615452565b8281036040840152613a4d81856153fb565b600060208252610cd86020830184615483565b600060808252615afb6080830187615483565b6001600160a01b03958616602084015293909416604082015260ff9190911660609091015292915050565b600060028510615b3257fe5b848252836020830152606060408301526158836060830184615483565b60608101615b5c85615e96565b938152602081019290925260409091015290565b60608101615b7d85615ea3565b93815260208101929092526001600160a01b031660409091015290565b60408101615ba784615e96565b9281526020015290565b60608101615b5c85615ea3565b6060810160088510615b5c57fe5b60208101615bd983615eb7565b91905290565b6000615bea86615ead565b858252602082018590526001600160a01b0384166040830152608060608301819052613a4d90830184615483565b6040810160028410615ba757fe5b600060808252615c396080830187615483565b602083820381850152818751808452828401915082838202850101838a01865b83811015615c8757601f19878403018552615c758383516154d1565b94860194925090850190600101615c59565b50508681036040880152615c9b818a615452565b945050505050828103606084015261575981856153fb565b602080825260139082015272554e4b4e4f574e5f52455455524e5f4441544160681b604082015260600190565b60208082526019908201527f554e4b4e4f574e5f46554e4354494f4e5f53454c4543544f5200000000000000604082015260600190565b6020808252600d908201526c15539253541311535153951151609a1b604082015260600190565b6020808252600c908201526b2120a22fa9a2a622a1aa27a960a11b604082015260600190565b6020808252600e908201526d15d493d391d7d41493d61657d25160921b604082015260600190565b60a08101615d9a82866154af565b8360608301528215156080830152949350505050565b600060208252610cd860208301846154d1565b600060408252615dd660408301856154d1565b82810360208401526158838185615483565b9283526020830191909152604082015260600190565b6040518181016001600160401b0381118282101715615e1c57600080fd5b604052919050565b60006001600160401b03821115615e39578081fd5b5060209081020190565b60006001600160401b03821115615e58578081fd5b50601f01601f191660200190565b60005b83811015615e81578181015183820152602001615e69565b83811115615e90576000848401525b50505050565b60048110615ea057fe5b50565b60038110615ea057fe5b60078110615ea057fe5b60058110615ea057fe5b6001600160a01b0381168114615ea057600080fd5b60ff81168114615ea057600080fdfea365627a7a72315820a1f72e0fecf83c3e25dfac45671531008e6d10bf428de8acfd449b715d8f4ad16c6578706572696d656e74616cf564736f6c63430005100040" + "object": "0x60806040523480156200001157600080fd5b5060405162005cff38038062005cff833981016040819052620000349162000409565b600080546001600160a01b0319166001600160a01b0384811691909117808355604051630c0e082160e31b81528392869286928492839285929116906360704108906200008d90630f47261b60e41b9060040162000447565b60206040518083038186803b158015620000a657600080fd5b505afa158015620000bb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620000e19190810190620003d9565b600180546001600160a01b0319166001600160a01b03928316179055600054604051630c0e082160e31b81529116906360704108906200012d9063012b8bc960e11b9060040162000447565b60206040518083038186803b1580156200014657600080fd5b505afa1580156200015b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620001819190810190620003d9565b600280546001600160a01b0319166001600160a01b03928316179055600054604051630c0e082160e31b8152911690636070410890620001cd9063a7cb5fb760e01b9060040162000447565b60206040518083038186803b158015620001e657600080fd5b505afa158015620001fb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620002219190810190620003d9565b600380546001600160a01b0319166001600160a01b03928316179055600054604051630c0e082160e31b81529116906360704108906200026d9063619ce88560e11b9060040162000447565b60206040518083038186803b1580156200028657600080fd5b505afa1580156200029b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620002c19190810190620003d9565b600480546001600160a01b03199081166001600160a01b039384161790915560058054821693831693909317909255600680549092169381169390931790555060009250831615905062000316578162000318565b305b9050620003736040518060400160405280600b81526020016a0c1e08141c9bdd1bd8dbdb60aa1b815250604051806040016040528060058152602001640332e302e360dc1b81525085846200038260201b620034e61760201c565b60075550620004759350505050565b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a0902090565b600060208284031215620003eb578081fd5b81516001600160a01b038116811462000402578182fd5b9392505050565b600080604083850312156200041c578081fd5b825162000429816200045c565b60208401519092506200043c816200045c565b809150509250929050565b6001600160e01b031991909116815260200190565b6001600160a01b03811681146200047257600080fd5b50565b61587a80620004856000396000f3fe608060405234801561001057600080fd5b50600436106102f45760003560e01c80639a7e752611610191578063ca49f47c116100e3578063d3d862d111610097578063e4e6e7da11610071578063e4e6e7da1461077e578063e77286eb1461079f578063ee4f5a94146107c1576102f4565b8063d3d862d114610729578063d46950281461073c578063e25cabf71461075c576102f4565b8063d001c5dc116100c8578063d001c5dc146106f0578063d186037f14610703578063d363790514610716576102f4565b8063ca49f47c146106ac578063cafd3a07146106cf576102f4565b8063a6627e9f11610145578063bbb2dcf61161011f578063bbb2dcf614610661578063bc03f96414610683578063c26cfecd146106a4576102f4565b8063a6627e9f14610618578063acaedc741461062b578063b43cffe11461064e576102f4565b8063a070cac811610176578063a070cac8146105d2578063a0901e51146105e5578063a5cd62ba146105f8576102f4565b80639a7e75261461058b5780639eadc835146105ae576102f4565b80634dfdac201161024a5780637914b2ec116101fe5780637b66ad34116101d85780637b66ad34146105445780637d727512146105655780638f4ce47914610578576102f4565b80637914b2ec146104f05780637982653e1461051157806379c9c42614610531576102f4565b806363eb39921161022f57806363eb39921461049857806365129042146104ab578063750bdb30146104cd576102f4565b80634dfdac2014610458578063590aa87514610478576102f4565b8063314853ff116102ac5780633db6dc61116102865780633db6dc61146103ff578063459be5e21461042257806346eb65cb14610443576102f4565b8063314853ff146103a8578063327d3054146103ca57806332aae3ad146103dd576102f4565b80630d7b7d76116102dd5780630d7b7d7614610345578063165979e1146103665780632322cf7614610388576102f4565b806302d0aec3146102f957806304a5618a14610323575b600080fd5b61030c610307366004614a21565b6107e3565b60405161031a92919061535e565b60405180910390f35b610336610331366004614a21565b61083f565b60405161031a93929190615488565b610358610353366004614603565b6108ba565b60405161031a92919061530c565b610379610374366004614a21565b6108dc565b60405161031a939291906155c3565b61039b610396366004614603565b610939565b60405161031a91906152c9565b6103bb6103b6366004614a21565b610961565b60405161031a93929190615333565b6103586103d8366004614a21565b6109a8565b6103f06103eb366004614a21565b6109ea565b60405161031a93929190615539565b61041261040d366004614a21565b610a3d565b60405161031a94939291906152d2565b610435610430366004614a21565b610a87565b60405161031a9291906155ac565b610456610451366004614a21565b610add565b005b61046b61046636600461452a565b610c5f565b60405161031a9190615263565b61048b610486366004614341565b610ce2565b60405161031a91906154e8565b61048b6104a6366004614647565b610d52565b6104be6104b9366004614a21565b610dc8565b60405161031a9392919061502f565b6104e06104db366004614a21565b610e02565b60405161031a94939291906153b3565b6105036104fe366004614a21565b610e99565b60405161031a929190615390565b61052461051f366004614ab8565b610ed1565b60405161031a91906155de565b61039b61053f366004614bc0565b61118c565b610557610552366004614a21565b611215565b60405161031a929190615015565b61039b610573366004614603565b61124d565b610503610586366004614a21565b6118a4565b61059e610599366004614a21565b61191a565b60405161031a94939291906155f2565b6105c16105bc366004614a21565b61197b565b60405161031a9594939291906153ef565b61039b6105e0366004614b67565b611a0c565b61046b6105f33660046146c9565b611a8d565b61060b6106063660046146fc565b611b06565b60405161031a919061517b565b61048b61062636600461469e565b611bc9565b61063e610639366004614a21565b611c22565b60405161031a94939291906150d7565b61048b61065c366004614578565b611c5e565b61067461066f366004614a21565b611cd6565b60405161031a939291906154b3565b610696610691366004614a21565b611d50565b60405161031a92919061531a565b61039b611d89565b6106bf6106ba366004614a21565b611d8f565b60405161031a9493929190615445565b6106e26106dd366004614a21565b611e19565b60405161031a929190615629565b61046b6106fe36600461452a565b611e67565b61039b610711366004614603565b611ed5565b610524610724366004614ab8565b6126c7565b61048b6107373660046147cd565b612a77565b61074f61074a366004614a21565b612a96565b60405161031a919061537b565b61076f61076a366004614776565b612b91565b60405161031a939291906151c8565b61079161078c36600461452a565b612cc9565b60405161031a9291906152a4565b6107b26107ad366004614b10565b612ce2565b60405161031a939291906156db565b6107d46107cf366004614a21565b612fa4565b60405161031a93929190615582565b6000806107f7836107f2612fe1565b613005565b600061081060048551866130459092919063ffffffff16565b80602001905161082391908101906149d4565b909350905060ff8116600681111561083757fe5b915050915091565b60008080610853848263ffffffff61308816565b92506001600160e01b0319831663012b8bc960e11b1461088e5760405162461bcd60e51b8152600401610885906156a4565b60405180910390fd5b61089f84601063ffffffff6130bc16565b91506108b284602463ffffffff6130ef16565b929491935050565b6000806108c7848461124d565b91506108d38484611ed5565b90509250929050565b60008060006108ed846107f26130fb565b600061090660048651876130459092919063ffffffff16565b8060200190516109199190810190614d92565b9094509250905060ff8116600281111561092f57fe5b9350509193909250565b600080600061094885856108ba565b91509150610956828261311f565b925050505b92915050565b6000606080610972846107f2613135565b835161098890859060049063ffffffff61304516565b80602001905161099b9190810190614974565b9196909550909350915050565b6000806109b7836107f2613159565b82516109cd90849060049063ffffffff61304516565b8060200190516109e09190810190614916565b9094909350915050565b60008060606109fb846107f261317d565b6000610a1460048651876130459092919063ffffffff16565b806020019051610a279190810190614d52565b9094509250905060ff8116600181111561092f57fe5b600080606080610a4f856107f26131a1565b8451610a6590869060049063ffffffff61304516565b806020019051610a7891908101906148d2565b92989197509550909350915050565b600080610a96836107f26131c5565b6000610aaf60048551866130459092919063ffffffff16565b806020019051610ac29190810190614c90565b9250905060ff81166003811115610ad557fe5b925050915091565b6000610aef828263ffffffff61308816565b90506001600160e01b031981167ff47261b0000000000000000000000000000000000000000000000000000000001415610b3357610b2c826118a4565b5050610c5b565b6001600160e01b0319811663012b8bc960e11b1415610b5d57610b558261083f565b505050610c5b565b6001600160e01b031981167fa7cb5fb7000000000000000000000000000000000000000000000000000000001415610ba257610b988261197b565b5050505050610c5b565b6001600160e01b031981166394cfcdd760e01b1415610bc457610b5582611cd6565b6001600160e01b031981167fc339d10a000000000000000000000000000000000000000000000000000000001415610c0857610bff82611d8f565b50505050610c5b565b6001600160e01b031981167fdc1600f3000000000000000000000000000000000000000000000000000000001415610c4357610bff82610e02565b60405162461bcd60e51b8152600401610885906156a4565b5050565b606060008251905080604051908082528060200260200182016040528015610c91578160200160208202803883390190505b50915060005b818114610cda57610cbb85858381518110610cae57fe5b6020026020010151611ed5565b838281518110610cc757fe5b6020908102919091010152600101610c97565b505092915050565b6040516060907ff47261b00000000000000000000000000000000000000000000000000000000090610d18908490602401615001565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915290505b919050565b6040516060907fc339d10a0000000000000000000000000000000000000000000000000000000090610d8c908690869086906024016150a5565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915290505b9392505050565b6000806000610dd9846107f26131e9565b8351610def90859060049063ffffffff61304516565b80602001905161099b91908101906143f8565b600080806060610e18858363ffffffff61308816565b93506001600160e01b031984167fdc1600f30000000000000000000000000000000000000000000000000000000014610e635760405162461bcd60e51b8152600401610885906156a4565b8451610e7990869060049063ffffffff61320d16565b806020019051610e8c9190810190614396565b9597919650949350915050565b600080610ea8836107f261328d565b8251610ebe90849060049063ffffffff61304516565b8060200190516109e091908101906149f8565b6000610edb613f0c565b610f6c8584600660009054906101000a90046001600160a01b03166001600160a01b0316631ce4c78b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f2e57600080fd5b505afa158015610f42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f669190810190614c78565b3a6132b1565b60408051600280825260608281019093529293509091816020015b6060815260200190600190039081610f8757505060408051600280825260608083018452939450909160208301908038833950506040805160028082526060808301845294955090925090602083019080388339505060408051600280825260608083018452949550909250906020830190803883390190505090508861014001518460008151811061101657fe5b602002602001018190525088600001518360008151811061103357fe5b6001600160a01b039283166020918202929092010152881615611056578761106c565b73377f698c4c287018d09b516f415317aec59193325b8260008151811061107957fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508460000151816000815181106110ab57fe5b602002602001018181525050886101800151846001815181106110ca57fe5b60200260200101819052508860000151836001815181106110e757fe5b6001600160a01b03928316602091820292909201015260408a01511615611112578860400151611128565b73377f698c4c287018d09b516f415317aec59193325b8260018151811061113557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505084604001518160018151811061116757fe5b60200260200101818152505061117f84848484613328565b9998505050505050505050565b600061120d846112086040518060400160405280600b81526020017f30782050726f746f636f6c0000000000000000000000000000000000000000008152506040518060400160405280600581526020017f332e302e3000000000000000000000000000000000000000000000000000000081525087876134e6565b61353d565b949350505050565b600080611224836107f2613551565b825161123a90849060049063ffffffff61304516565b8060200190516109e0919081019061435d565b600080611260838263ffffffff61308816565b90506001600160e01b031981167ff47261b00000000000000000000000000000000000000000000000000000000014156112bb5760006112a784601063ffffffff6130bc16565b90506112b38186613575565b92505061189d565b6001600160e01b0319811663012b8bc960e11b1415611413576000806112e08561083f565b6040519194509250606091507f6352211e000000000000000000000000000000000000000000000000000000009061131c9084906024016152c9565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060846001600160a01b03168360405161136d9190614fe5565b600060405180830381855afa9150503d80600081146113a8576040519150601f19603f3d011682016040523d82523d6000602084013e6113ad565b606091505b509150915060008280156113c2575081516020145b6113cd5760006113de565b6113de82600c63ffffffff6130bc16565b9050896001600160a01b0316816001600160a01b031614611400576000611403565b60015b60ff16975050505050505061189d565b6001600160e01b031981167fa7cb5fb70000000000000000000000000000000000000000000000000000000014156116035760006060806114538661197b565b5081519296509094509250905060005b8181146115f95782818151811061147657fe5b60200260200101516000141561148b576115f1565b83516060907efdd58e00000000000000000000000000000000000000000000000000000000908b908790859081106114bf57fe5b60200260200101516040516024016114d892919061510b565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060876001600160a01b0316836040516115299190614fe5565b600060405180830381855afa9150503d8060008114611564576040519150601f19603f3d011682016040523d82523d6000602084013e611569565b606091505b5091509150600082801561157e575081516020145b61158957600061159a565b61159a82600063ffffffff6130ef16565b905060008786815181106115aa57fe5b602002602001015182816115ba57fe5b049050806115d65760009b50505050505050505050505061095b565b8b8110806115e257508b155b156115eb57809b505b50505050505b600101611463565b505050505061189d565b6001600160e01b031981167fc339d10a000000000000000000000000000000000000000000000000000000001415611721576040516060907fa85e59e40000000000000000000000000000000000000000000000000000000090611672908690600090819081906024016154fb565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925260045491519092506000916001600160a01b0316906116c4908490614fe5565b600060405180830381855afa9150503d80600081146116ff576040519150601f19603f3d011682016040523d82523d6000602084013e611704565b606091505b5050905080611714576000611718565b6000195b9350505061189d565b6001600160e01b031981167fdc1600f30000000000000000000000000000000000000000000000000000000014156117c85760008061175f85610e02565b50925092505061176d613678565b6001600160a01b0316826001600160a01b031614801561179a57506005546001600160a01b038281169116145b156117c15760006117b26117ac613690565b88613575565b90506117bd816136a8565b9450505b505061189d565b6001600160e01b031981166394cfcdd760e01b141561189d576060806117ed85611cd6565b80519194509250905060005b8181146118985783818151811061180c57fe5b60200260200101516000141561182157611890565b60006118408985848151811061183357fe5b602002602001015161124d565b9050600085838151811061185057fe5b6020026020010151828161186057fe5b0490508061187857600097505050505050505061095b565b87811080611884575087155b1561188d578097505b50505b6001016117f9565b505050505b5092915050565b6000806118b7838263ffffffff61308816565b91506001600160e01b031982167ff47261b000000000000000000000000000000000000000000000000000000000146119025760405162461bcd60e51b8152600401610885906156a4565b61191383601063ffffffff6130bc16565b9050915091565b6000806000606061192d856107f26138a6565b600061194660048751886130459092919063ffffffff16565b8060200190516119599190810190614cf4565b91965094509250905060ff8116600681111561197157fe5b9450509193509193565b60008060608080611992868563ffffffff61308816565b94506001600160e01b031985167fa7cb5fb700000000000000000000000000000000000000000000000000000000146119dd5760405162461bcd60e51b8152600401610885906156a4565b505050506024828101516044840151606485015160848601519496929591820184019490820184019391010190565b600061120d84611a886040518060400160405280600b81526020017f30782050726f746f636f6c0000000000000000000000000000000000000000008152506040518060400160405280600581526020017f332e302e3000000000000000000000000000000000000000000000000000000081525087876134e6565b6138ca565b6060808251604051908082528060200260200182016040528015611abb578160200160208202803883390190505b50905060005b8351811461189d57838181518110611ad557fe5b60200260200101516001600160a01b031631828281518110611af357fe5b6020908102919091010152600101611ac1565b606060008451905080604051908082528060200260200182016040528015611b38578160200160208202803883390190505b50915060005b818114611bc057611b89868281518110611b5457fe5b6020026020010151868381518110611b6857fe5b6020026020010151868481518110611b7c57fe5b60200260200101516126c7565b838281518110611b9557fe5b60200260200101906004811115611ba857fe5b90816004811115611bb557fe5b905250600101611b3e565b50509392505050565b60405160609063012b8bc960e11b90611be8908590859060240161510b565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152905092915050565b60006060806060611c35856107f26138d9565b8451611c4b90869060049063ffffffff61304516565b806020019051610a789190810190614492565b6040516060907fa7cb5fb70000000000000000000000000000000000000000000000000000000090611c9a908790879087908790602401615053565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091529050949350505050565b6000606080611ceb848463ffffffff61308816565b92506001600160e01b031983166394cfcdd760e01b14611d1d5760405162461bcd60e51b8152600401610885906156a4565b8351611d3390859060049063ffffffff61320d16565b806020019051611d469190810190614802565b9395909450915050565b60006060611d60836107f26138fd565b8251611d7690849060049063ffffffff61304516565b8060200190516109e09190810190614939565b60075481565b600080606081611da5858263ffffffff61308816565b93506001600160e01b031984167fc339d10a0000000000000000000000000000000000000000000000000000000014611df05760405162461bcd60e51b8152600401610885906156a4565b8451611e0690869060049063ffffffff61320d16565b806020019051610e8c919081019061443a565b600080611e28836107f2613921565b6000611e4160048551866130459092919063ffffffff16565b806020019051611e549190810190614c90565b9250905060ff81166001811115610ad557fe5b606060008251905080604051908082528060200260200182016040528015611e99578160200160208202803883390190505b50915060005b818114610cda57611eb68585838151811061183357fe5b838281518110611ec257fe5b6020908102919091010152600101611e9f565b600080611ee8838263ffffffff61308816565b90506001600160e01b031981166394cfcdd760e01b1415611fb857606080611f0f85611cd6565b80519194509250905060005b818114611fad57838181518110611f2e57fe5b602002602001015160001415611f4357611fa5565b6000611f5589858481518110610cae57fe5b90506000858381518110611f6557fe5b60200260200101518281611f7557fe5b04905080611f8d57600097505050505050505061095b565b87811080611f99575087155b15611fa2578097505b50505b600101611f1b565b5061095b9350505050565b6001600160e01b031981167ff47261b000000000000000000000000000000000000000000000000000000000141561210e576000611ffd84601063ffffffff6130bc16565b6001546040519192506060917fdd62ed3e00000000000000000000000000000000000000000000000000000000916120439189916001600160a01b031690602401615015565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060836001600160a01b0316836040516120949190614fe5565b600060405180830381855afa9150503d80600081146120cf576040519150601f19603f3d011682016040523d82523d6000602084013e6120d4565b606091505b50915091508180156120e7575080516020145b6120f2576000612103565b61210381600063ffffffff6130ef16565b95505050505061189d565b6001600160e01b0319811663012b8bc960e11b1415612373576000806121338561083f565b600254604051929550909350606092507fe985e9c5000000000000000000000000000000000000000000000000000000009161217f918a916001600160a01b0390911690602401615015565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060846001600160a01b0316836040516121d09190614fe5565b600060405180830381855afa9150503d806000811461220b576040519150601f19603f3d011682016040523d82523d6000602084013e612210565b606091505b509150915081158061222457508051602014155b80612240575061223b81600063ffffffff6130ef16565b600114155b15612364576040516060907f081812fc000000000000000000000000000000000000000000000000000000009061227b9087906024016152c9565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050509050856001600160a01b0316816040516122c89190614fe5565b600060405180830381855afa9150503d8060008114612303576040519150601f19603f3d011682016040523d82523d6000602084013e612308565b606091505b50909350915082801561231c575081516020145b801561234b57506002546001600160a01b031661234083600c63ffffffff6130bc16565b6001600160a01b0316145b612356576000612359565b60015b60ff169750506115f9565b6000199650505050505061189d565b6001600160e01b031981167fa7cb5fb70000000000000000000000000000000000000000000000000000000014156124d35760006123b08461197b565b5050600354604051929450606093507fe985e9c500000000000000000000000000000000000000000000000000000000926123fa925089916001600160a01b031690602401615015565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060836001600160a01b03168360405161244b9190614fe5565b600060405180830381855afa9150503d8060008114612486576040519150601f19603f3d011682016040523d82523d6000602084013e61248b565b606091505b509150915081801561249e575080516020145b80156124ba57506124b681600063ffffffff6130ef16565b6001145b6124c5576000612103565b60001995505050505061189d565b6001600160e01b031981167fc339d10a00000000000000000000000000000000000000000000000000000000141561250f57600019915061189d565b6001600160e01b031981167fdc1600f300000000000000000000000000000000000000000000000000000000141561189d5760008061254d85610e02565b50925092505061255b613678565b6001600160a01b0316826001600160a01b031614801561258857506005546001600160a01b038281169116145b156126be576005546040516060917fdd62ed3e00000000000000000000000000000000000000000000000000000000916125d2918a916001600160a01b0390911690602401615015565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152905060006060612612613690565b6001600160a01b0316836040516126299190614fe5565b600060405180830381855afa9150503d8060008114612664576040519150601f19603f3d011682016040523d82523d6000602084013e612669565b606091505b5091509150600082801561267e575081516020145b61268957600061269a565b61269a82600063ffffffff6130ef16565b905060001981146126b3576126ae816136a8565b6126b7565b6000195b9750505050505b50505092915050565b60006126d1613f0c565b6127248584600660009054906101000a90046001600160a01b03166001600160a01b0316631ce4c78b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f2e57600080fd5b60408051600480825260a0820190925291925060609190816020015b606081526020019060019003908161274057505060408051600480825260a082019092529192506060919060208201608080388339505060408051600480825260a08201909252929350606092915060208201608080388339505060408051600480825260a08201909252929350606092915060208201608080388339019050509050886101600151846000815181106127d657fe5b602002602001018190525087836000815181106127ef57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505088600001518260008151811061282157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050868160008151811061284f57fe5b6020026020010181815250508861014001518460018151811061286e57fe5b602002602001018190525088600001518360018151811061288b57fe5b6001600160a01b0392831660209182029290920101528816156128ae57876128c4565b73377f698c4c287018d09b516f415317aec59193325b826001815181106128d157fe5b60200260200101906001600160a01b031690816001600160a01b03168152505084600001518160018151811061290357fe5b602002602001018181525050886101a001518460028151811061292257fe5b6020026020010181905250878360028151811061293b57fe5b6001600160a01b03928316602091820292909201015260408a0151161561296657886040015161297c565b73377f698c4c287018d09b516f415317aec59193325b8260028151811061298957fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508460600151816002815181106129bb57fe5b602002602001018181525050886101800151846003815181106129da57fe5b60200260200101819052508860000151836003815181106129f757fe5b6001600160a01b03928316602091820292909201015260408a01511615612a22578860400151612a38565b73377f698c4c287018d09b516f415317aec59193325b82600381518110612a4557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505084604001518160038151811061116757fe5b6040516060906394cfcdd760e01b90611be89085908590602401615276565b6000612aa8828263ffffffff61308816565b90506001600160e01b031981167ff47261b0000000000000000000000000000000000000000000000000000000001480612af257506001600160e01b0319811663012b8bc960e11b145b80612b2657506001600160e01b031981167fa7cb5fb700000000000000000000000000000000000000000000000000000000145b80612b4157506001600160e01b031981166394cfcdd760e01b145b80612b7557506001600160e01b031981167fc339d10a00000000000000000000000000000000000000000000000000000000145b610d4d5760405162461bcd60e51b8152600401610885906156a4565b606080606060008551905080604051908082528060200260200182016040528015612bd657816020015b612bc3613f3b565b815260200190600190039081612bbb5790505b50935080604051908082528060200260200182016040528015612c03578160200160208202803883390190505b50925080604051908082528060200260200182016040528015612c30578160200160208202803883390190505b50915060005b818114612cc057612c6d878281518110612c4c57fe5b6020026020010151878381518110612c6057fe5b6020026020010151612ce2565b8751889085908110612c7b57fe5b60200260200101878581518110612c8e57fe5b60200260200101878681518110612ca157fe5b9315156020948502919091019093019290925291905252600101612c36565b50509250925092565b606080612cd68484611e67565b91506108d38484610c5f565b612cea613f3b565b6006546040517f9d3fa4b900000000000000000000000000000000000000000000000000000000815260009182916001600160a01b0390911690639d3fa4b990612d389088906004016156ff565b60606040518083038186803b158015612d5057600080fd5b505afa158015612d64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612d889190810190614a70565b85516006546040517fa12dcc6f00000000000000000000000000000000000000000000000000000000815292955090916001600160a01b039091169063a12dcc6f90612dda9089908990600401615712565b60206040518083038186803b158015612df257600080fd5b505afa158015612e06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612e2a91908101906148b2565b91506000612e3d82886101400151610939565b60a088015160c08901516101808a01516101408b015193945091929091600091612e6c9163ffffffff61394516565b15612e9957612e9284612e8c848d6080015161396a90919063ffffffff16565b85613986565b9050612ef2565b81612ead57612e92848b6080015185613986565b6000612ebe868c6101800151610939565b90506000612ed1868d6080015187613986565b90506000612ee0838688613986565b9050612eec828261311f565b93505050505b612f12612f0c8960400151856139a890919063ffffffff16565b8261311f565b96506004612f258b8c602001518a610ed1565b6004811115612f3057fe5b14612f3c576000612f3e565b865b9650612f4e8a61016001516139c7565b612f5757600096505b60e08a015115801590612f755750612f738a6101a001516139c7565b155b15612f7f57600096505b600388516006811115612f8e57fe5b14612f9857600096505b50505050509250925092565b6000806000612fb5846107f2613ab1565b6000612fce60048651876130459092919063ffffffff16565b8060200190516109199190810190614cbd565b7ffdb6ca8d0000000000000000000000000000000000000000000000000000000090565b6000613012836000613088565b90506001600160e01b0319808216908316146130405760405162461bcd60e51b81526004016108859061566d565b505050565b6060818311156130635761306361305e60008585613ad5565b613af4565b835182111561307c5761307c61305e6001848751613ad5565b50819003910190815290565b600081600401835110156130a9576130a961305e6003855185600401613ad5565b5001602001516001600160e01b03191690565b600081601401835110156130dd576130dd61305e6004855185601401613ad5565b5001601401516001600160a01b031690565b6000610dc18383613afc565b7f18e4b1410000000000000000000000000000000000000000000000000000000090565b600081831061312e5781610dc1565b5090919050565b7f4678472b0000000000000000000000000000000000000000000000000000000090565b7fb6555d6f0000000000000000000000000000000000000000000000000000000090565b7f488219a60000000000000000000000000000000000000000000000000000000090565b7f1b8388f70000000000000000000000000000000000000000000000000000000090565b7fe94a7ed00000000000000000000000000000000000000000000000000000000090565b7f4ad312750000000000000000000000000000000000000000000000000000000090565b6060818311156132265761322661305e60008585613ad5565b835182111561323f5761323f61305e6001848751613ad5565b8282036040519080825280601f01601f19166020018201604052801561326c576020820181803883390190505b509050610dc161327b82613b26565b8461328587613b26565b018351613b2c565b7f11c7b7200000000000000000000000000000000000000000000000000000000090565b6132b9613f0c565b6020810184905260a085015160808601516132d5918691613bd1565b815260a085015160c08601516132ec918691613bd1565b604082015260a085015160e0860151613306918691613bd1565b606082015261331b828463ffffffff613c0516565b6080820152949350505050565b6040516000906060907fb04fbddd0000000000000000000000000000000000000000000000000000000090613367908890889088908890602401615124565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925260065491519092506060916001600160a01b0316906133b9908490614fe5565b6000604051808303816000865af19150503d80600081146133f6576040519150601f19603f3d011682016040523d82523d6000602084013e6133fb565b606091505b50915060009050613412828263ffffffff61308816565b905061341c61317d565b6001600160e01b03198281169116141561345957600061343b836109ea565b5091505060ff8116600481111561344e57fe5b94505050505061120d565b613461613135565b6001600160e01b03198281169116141561349457600061348083610961565b509091505060ff8116600481111561344e57fe5b815160208301207ff43f26ea5a94b478394a975e856464913dc1a8a1ca70939d974aa7c238aa0ce014156134ce576004935050505061120d565b60405162461bcd60e51b815260040161088590615636565b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a0902090565b6000610dc18261354c85613c36565b613cb1565b7fa15c0d060000000000000000000000000000000000000000000000000000000090565b6040516000906060907f70a0823100000000000000000000000000000000000000000000000000000000906135ae908590602401615001565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060856001600160a01b0316836040516135ff9190614fe5565b600060405180830381855afa9150503d806000811461363a576040519150601f19603f3d011682016040523d82523d6000602084013e61363f565b606091505b5091509150818015613652575080516020145b61365d57600061366e565b61366e81600063ffffffff6130ef16565b9695505050505050565b736b175474e89094c44da98b954eedeac495271d0f90565b7306af07097c9eeb7fd685c692751d5c66db49c21590565b6000806136b3613690565b6001600160a01b0316634ba2363a6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156136ed57600080fd5b505af1158015613701573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506137259190810190614a54565b90506000816001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561376457600080fd5b505af1158015613778573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061379c9190810190614c78565b421161381a57816001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156137dd57600080fd5b505af11580156137f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506138159190810190614c78565b61388d565b816001600160a01b0316639f678cca6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561385557600080fd5b505af1158015613869573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061388d9190810190614c78565b905061120d816b033b2e3c9fd0803ce800000086613986565b7f7e5a23180000000000000000000000000000000000000000000000000000000090565b6000610dc18261354c85613ceb565b7f5bd0428d0000000000000000000000000000000000000000000000000000000090565b7f20d11f610000000000000000000000000000000000000000000000000000000090565b7ff59851840000000000000000000000000000000000000000000000000000000090565b600081518351148015610dc15750508051602091820120825192909101919091201490565b600082820183811015610dc157610dc161305e60008686613da4565b600061120d8361399c868563ffffffff613c0516565b9063ffffffff613dc316565b6000828211156139c1576139c161305e60028585613da4565b50900390565b600060208251816139d457fe5b066004146139e457506000610d4d565b60006139f6838263ffffffff61308816565b90506001600160e01b031981166394cfcdd760e01b14613a1a576001915050610d4d565b606080613a2685611cd6565b80519194509250905060005b818114613aa4576000613a626000858481518110613a4c57fe5b602002602001015161308890919063ffffffff16565b90506001600160e01b0319811663012b8bc960e11b1415613a9b57613a878483613ded565b15613a9b5760009650505050505050610d4d565b50600101613a32565b5060019695505050505050565b7fe53c76c80000000000000000000000000000000000000000000000000000000090565b6060632800659560e01b848484604051602401610d8c939291906155d0565b805160208201fd5b60008160200183511015613b1d57613b1d61305e6005855185602001613ad5565b50016020015190565b60200190565b6020811015613b56576001816020036101000a038019835116818551168082178652505050613040565b82821415613b6357613040565b82821115613b9d5760208103905080820181840181515b82851015613b95578451865260209586019590940193613b7a565b905250613040565b60208103905080820181840183515b81861215613bc85782518252601f199283019290910190613bac565b85525050505050565b6000613bde848484613e50565b15613bf157613bf161305e858585613eb6565b61120d8361399c868563ffffffff613c0516565b600082613c145750600061095b565b82820282848281613c2157fe5b0414610dc157610dc161305e60018686613da4565b608081810151825160208085015160408087015160609788015186519685019690962082517fec69816980a3a3ca4554410e60253953e9ff375ba4536a98adfa15cc7154150881529485019590955290830191909152948101949094526001600160a01b039091169183019190915260a082015260c0902090565b6040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b6101408101516101608201516101808301516101a08401516000937ff80322eb8376aafb64eadf8f0d7623f22130fd9491a221e902b713cb984a753493909290916020871015613d3757fe5b601f1987018051610140890180516101608b0180516101808d0180516101a08f0180519d89528c5160209d8e012087528b519b8d019b909b2084528951998c01999099208152875197909a019690962088526101e085209390945290529190529252919091529050919050565b606063e946c1bb60e01b848484604051602401610d8c93929190615561565b600081613dd957613dd961305e60038585613da4565b6000828481613de457fe5b04949350505050565b8151600090600183015b81811015610cda57613e38858281518110613e0e57fe5b6020026020010151868681518110613e2257fe5b602002602001015161394590919063ffffffff16565b15613e485760019250505061095b565b600101613df7565b600082613e6257613e6261305e613ed5565b811580613e6d575083155b15613e7a57506000610dc1565b60008380613e8457fe5b8584099050613e99858463ffffffff613c0516565b613eab826103e863ffffffff613c0516565b101595945050505050565b606063339f3de260e01b848484604051602401610d8c93929190615737565b60408051808201909152600481527fa791837c00000000000000000000000000000000000000000000000000000000602082015290565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6040805160608101909152806000815260006020820181905260409091015290565b803561095b81615813565b600082601f830112613f78578081fd5b8135613f8b613f8682615774565b61574d565b818152915060208083019084810181840286018201871015613fac57600080fd5b60005b84811015611898578135613fc281615813565b84529282019290820190600101613faf565b600082601f830112613fe4578081fd5b8151613ff2613f8682615774565b8181529150602080830190840160005b8381101561402f5761401a876020845189010161419b565b83526020928301929190910190600101614002565b5050505092915050565b600082601f830112614049578081fd5b8135614057613f8682615774565b8181529150602080830190840160005b8381101561402f5761407f876020843589010161414d565b83526020928301929190910190600101614067565b600082601f8301126140a4578081fd5b81356140b2613f8682615774565b8181529150602080830190840160005b8381101561402f576140da87602084358901016141e1565b835260209283019291909101906001016140c2565b600082601f8301126140ff578081fd5b813561410d613f8682615774565b81815291506020808301908481018184028601820187101561412e57600080fd5b60005b8481101561189857813584529282019290820190600101614131565b600082601f83011261415d578081fd5b813561416b613f8682615794565b915080825283602082850101111561418257600080fd5b8060208401602084013760009082016020015292915050565b600082601f8301126141ab578081fd5b81516141b9613f8682615794565b91508082528360208285010111156141d057600080fd5b61189d8160208401602086016157b8565b60006101c08083850312156141f4578182fd5b6141fd8161574d565b91505061420a8383613f5d565b81526142198360208401613f5d565b602082015261422b8360408401613f5d565b604082015261423d8360608401613f5d565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013567ffffffffffffffff8082111561429f57600080fd5b6142ab8683870161414d565b838501526101609250828501359150808211156142c757600080fd5b6142d38683870161414d565b838501526101809250828501359150808211156142ef57600080fd5b6142fb8683870161414d565b838501526101a092508285013591508082111561431757600080fd5b506143248582860161414d565b82840152505092915050565b805160ff8116811461095b57600080fd5b600060208284031215614352578081fd5b8135610dc181615813565b6000806040838503121561436f578081fd5b825161437a81615813565b602084015190925061438b81615813565b809150509250929050565b6000806000606084860312156143aa578081fd5b83516143b581615813565b60208501519093506143c681615813565b604085015190925067ffffffffffffffff8111156143e2578182fd5b6143ee8682870161419b565b9150509250925092565b60008060006060848603121561440c578081fd5b835161441781615813565b602085015190935061442881615813565b80925050604084015190509250925092565b60008060006060848603121561444e578081fd5b835161445981615813565b602085015190935067ffffffffffffffff811115614475578182fd5b6144818682870161419b565b925050604084015190509250925092565b600080600080608085870312156144a7578182fd5b84516144b281615813565b602086015190945067ffffffffffffffff808211156144cf578384fd5b6144db8883890161419b565b945060408701519150808211156144f0578384fd5b6144fc8883890161419b565b93506060870151915080821115614511578283fd5b5061451e8782880161419b565b91505092959194509250565b6000806040838503121561453c578182fd5b823561454781615813565b9150602083013567ffffffffffffffff811115614562578182fd5b61456e85828601614039565b9150509250929050565b6000806000806080858703121561458d578182fd5b843561459881615813565b9350602085013567ffffffffffffffff808211156145b4578384fd5b6145c0888389016140ef565b945060408701359150808211156145d5578384fd5b6145e1888389016140ef565b935060608701359150808211156145f6578283fd5b5061451e8782880161414d565b60008060408385031215614615578182fd5b823561462081615813565b9150602083013567ffffffffffffffff81111561463b578182fd5b61456e8582860161414d565b60008060006060848603121561465b578081fd5b833561466681615813565b9250602084013567ffffffffffffffff811115614681578182fd5b61468d8682870161414d565b925050604084013590509250925092565b600080604083850312156146b0578182fd5b82356146bb81615813565b946020939093013593505050565b6000602082840312156146da578081fd5b813567ffffffffffffffff8111156146f0578182fd5b61120d84828501613f68565b600080600060608486031215614710578081fd5b833567ffffffffffffffff80821115614727578283fd5b61473387838801614094565b94506020860135915080821115614748578283fd5b61475487838801613f68565b93506040860135915080821115614769578283fd5b506143ee868287016140ef565b60008060408385031215614788578182fd5b823567ffffffffffffffff8082111561479f578384fd5b6147ab86838701614094565b935060208501359150808211156147c0578283fd5b5061456e85828601614039565b600080604083850312156147df578182fd5b823567ffffffffffffffff808211156147f6578384fd5b6147ab868387016140ef565b60008060408385031215614814578182fd5b825167ffffffffffffffff8082111561482b578384fd5b81850186601f82011261483c578485fd5b8051925061484c613f8684615774565b80848252602080830192508084018a82838902870101111561486c578889fd5b8894505b8685101561488e578051845260019490940193928101928101614870565b5088015190965093505050808211156148a5578283fd5b5061456e85828601613fd4565b6000602082840312156148c3578081fd5b81518015158114610dc1578182fd5b600080600080608085870312156148e7578182fd5b8451935060208501516148f981615813565b604086015190935067ffffffffffffffff808211156144f0578384fd5b60008060408385031215614928578182fd5b505080516020909101519092909150565b6000806040838503121561494b578182fd5b82519150602083015167ffffffffffffffff811115614968578182fd5b61456e8582860161419b565b600080600060608486031215614988578081fd5b83519250602084015167ffffffffffffffff808211156149a6578283fd5b6149b28783880161419b565b935060408601519150808211156149c7578283fd5b506143ee8682870161419b565b600080604083850312156149e6578182fd5b82519150602083015161438b81615828565b60008060408385031215614a0a578182fd5b82516001600160e01b03198116811461437a578283fd5b600060208284031215614a32578081fd5b813567ffffffffffffffff811115614a48578182fd5b61120d8482850161414d565b600060208284031215614a65578081fd5b8151610dc181615813565b600060608284031215614a81578081fd5b614a8b606061574d565b825160078110614a99578283fd5b8152602083810151908201526040928301519281019290925250919050565b600080600060608486031215614acc578081fd5b833567ffffffffffffffff811115614ae2578182fd5b614aee868287016141e1565b9350506020840135614aff81615813565b929592945050506040919091013590565b60008060408385031215614b22578182fd5b823567ffffffffffffffff80821115614b39578384fd5b614b45868387016141e1565b93506020850135915080821115614b5a578283fd5b5061456e8582860161414d565b600080600060608486031215614b7b578081fd5b833567ffffffffffffffff811115614b91578182fd5b614b9d868287016141e1565b935050602084013591506040840135614bb581615813565b809150509250925092565b600080600060608486031215614bd4578081fd5b833567ffffffffffffffff80821115614beb578283fd5b81860160a08189031215614bfd578384fd5b614c0760a061574d565b9250803583526020810135602084015260408101356040840152614c2e8860608301613f5d565b6060840152608081013582811115614c44578485fd5b614c508982840161414d565b608085015250919450505060208401359150614c6f8560408601613f5d565b90509250925092565b600060208284031215614c89578081fd5b5051919050565b60008060408385031215614ca2578182fd5b8251614cad81615828565b6020939093015192949293505050565b600080600060608486031215614cd1578081fd5b8351614cdc81615828565b602085015160408601519194509250614bb581615813565b60008060008060808587031215614d09578182fd5b614d138686614330565b9350602085015192506040850151614d2a81615813565b606086015190925067ffffffffffffffff811115614d46578182fd5b61451e8782880161419b565b600080600060608486031215614d66578081fd5b614d708585614330565b925060208401519150604084015167ffffffffffffffff8111156143e2578182fd5b600080600060608486031215614da6578081fd5b614db08585614330565b925060208401519150604084015190509250925092565b6001600160a01b03169052565b6000815180845260208401935060208301825b82811015614e0e5781516001600160a01b0316865260209586019590910190600101614de7565b5093949350505050565b600081518084526020840180819550602083028101915060208501845b84811015614e63578284038852614e4d848351614ea0565b6020988901989094509190910190600101614e35565b50919695505050505050565b6000815180845260208401935060208301825b82811015614e0e578151865260209586019590910190600101614e82565b60008151808452614eb88160208601602086016157b8565b601f01601f19169290920160200192915050565b8051614ed781615809565b825260208181015190830152604090810151910152565b60006101c0614efe848451614dc7565b6020830151614f106020860182614dc7565b506040830151614f236040860182614dc7565b506060830151614f366060860182614dc7565b506080830151608085015260a083015160a085015260c083015160c085015260e083015160e0850152610100808401518186015250610120808401518186015250610140808401518282870152614f8f83870182614ea0565b91505061016091508184015185820383870152614fac8282614ea0565b925050506101808084015185830382870152614fc88382614ea0565b9150506101a09150818401518582038387015261366e8282614ea0565b60008251614ff78184602087016157b8565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60006001600160a01b0386168252608060208301526150756080830186614e6f565b82810360408401526150878186614e6f565b83810360608501526150998186614ea0565b98975050505050505050565b60006001600160a01b0385168252606060208301526150c76060830185614ea0565b9050826040830152949350505050565b60006001600160a01b0386168252608060208301526150f96080830186614ea0565b82810360408401526150878186614ea0565b6001600160a01b03929092168252602082015260400190565b6000608082526151376080830187614e18565b82810360208401526151498187614dd4565b838103604085015261515b8187614dd4565b91505082810360608401526151708185614e6f565b979650505050505050565b602080825282518282018190526000918401906040840190835b818110156151bd578351600581106151a957fe5b835260209384019390920191600101615195565b509095945050505050565b606080825284519082018190526000906020906080840190828801845b8281101561520b576151f8848351614ecc565b60609390930192908401906001016151e5565b5050508381038285015261521f8187614e6f565b84810360408601528551808252908301915082860190845b81811015615255578251151584529284019291840191600101615237565b509198975050505050505050565b600060208252610dc16020830184614e6f565b6000604082526152896040830185614e6f565b828103602084015261529b8185614e18565b95945050505050565b6000604082526152b76040830185614e6f565b828103602084015261529b8185614e6f565b90815260200190565b60008582526001600160a01b0385166020830152608060408301526152fa6080830185614ea0565b82810360608401526151708185614ea0565b918252602082015260400190565b60008382526040602083015261120d6040830184614ea0565b60008482526060602083015261534c6060830185614ea0565b828103604084015261366e8185614ea0565b8281526040810161536e83615809565b8260208301529392505050565b6001600160e01b031991909116815260200190565b6001600160e01b03199290921682526001600160a01b0316602082015260400190565b60006001600160e01b0319861682526001600160a01b0380861660208401528085166040840152506080606083015261366e6080830184614ea0565b60006001600160e01b0319871682526001600160a01b038616602083015260a0604083015261542160a0830186614e6f565b82810360608401526154338186614e6f565b838103608085015261117f8186614ea0565b60006001600160e01b0319861682526001600160a01b0385166020830152608060408301526154776080830185614ea0565b905082606083015295945050505050565b6001600160e01b03199390931683526001600160a01b03919091166020830152604082015260600190565b60006001600160e01b031985168252606060208301526154d66060830185614e6f565b828103604084015261366e8185614e18565b600060208252610dc16020830184614ea0565b60006080825261550e6080830187614ea0565b6001600160a01b03958616602084015293909416604082015260ff9190911660609091015292915050565b6000615544856157e8565b8482528360208301526060604083015261529b6060830184614ea0565b6060810161556e856157f5565b938152602081019290925260409091015290565b6060810161558f856157ff565b93815260208101929092526001600160a01b031660409091015290565b604081016155b9846157f5565b9281526020015290565b6060810161556e856157ff565b606081016008851061556e57fe5b60208101600583106155ec57fe5b91905290565b60006155fd86615809565b8582528460208301526001600160a01b03841660408301526080606083015261366e6080830184614ea0565b604081016155b9846157e8565b60208082526013908201527f554e4b4e4f574e5f52455455524e5f4441544100000000000000000000000000604082015260600190565b6020808252600c908201527f4241445f53454c4543544f520000000000000000000000000000000000000000604082015260600190565b6020808252600e908201527f57524f4e475f50524f58595f4944000000000000000000000000000000000000604082015260600190565b60a081016156e98286614ecc565b8360608301528215156080830152949350505050565b600060208252610dc16020830184614eee565b6000604082526157256040830185614eee565b828103602084015261529b8185614ea0565b9283526020830191909152604082015260600190565b60405181810167ffffffffffffffff8111828210171561576c57600080fd5b604052919050565b600067ffffffffffffffff82111561578a578081fd5b5060209081020190565b600067ffffffffffffffff8211156157aa578081fd5b50601f01601f191660200190565b60005b838110156157d35781810151838201526020016157bb565b838111156157e2576000848401525b50505050565b600281106157f257fe5b50565b600481106157f257fe5b600381106157f257fe5b600781106157f257fe5b6001600160a01b03811681146157f257600080fd5b60ff811681146157f257600080fdfea365627a7a72315820b8f5e1baee716487ac576e78a6a19b92db1db8535a5a9d8ed8a3c9e3e2968a386c6578706572696d656e74616cf564736f6c63430005100040" }, "deployedBytecode": { - "object": "0x608060405234801561001057600080fd5b506004361061027f5760003560e01c80638f4ce4791161015c578063c26cfecd116100ce578063d3d862d111610087578063d3d862d1146106d7578063d4695028146106ea578063e25cabf71461070a578063e4e6e7da1461072c578063e77286eb1461074d578063ee4f5a941461076f5761027f565b8063c26cfecd14610652578063ca49f47c1461065a578063cafd3a071461067d578063d001c5dc1461069e578063d186037f146106b1578063d3637905146106c45761027f565b8063a5cd62ba11610120578063a5cd62ba146105a6578063a6627e9f146105c6578063acaedc74146105d9578063b43cffe1146105fc578063bbb2dcf61461060f578063bc03f964146106315761027f565b80638f4ce479146105265780639a7e7526146105395780639eadc8351461055c578063a070cac814610580578063a0901e51146105935761027f565b80634dfdac20116101f5578063750bdb30116101b9578063750bdb301461047b5780637914b2ec1461049e5780637982653e146104bf57806379c9c426146104df5780637b66ad34146104f25780637d727512146105135761027f565b80634dfdac20146103e3578063590aa8751461040357806363eb39921461042357806365129042146104365780636f83188e146104585761027f565b8063314853ff11610247578063314853ff14610333578063327d30541461035557806332aae3ad146103685780633db6dc611461038a578063459be5e2146103ad57806346eb65cb146103ce5761027f565b806302d0aec31461028457806304a5618a146102ae5780630d7b7d76146102d0578063165979e1146102f15780632322cf7614610313575b600080fd5b610297610292366004614f2f565b610791565b6040516102a5929190615948565b60405180910390f35b6102c16102bc366004614f2f565b6107ed565b6040516102a593929190615a76565b6102e36102de366004614a77565b610868565b6040516102a59291906158f6565b6103046102ff366004614f2f565b61088a565b6040516102a593929190615bb1565b610326610321366004614a77565b6108e7565b6040516102a591906158b1565b610346610341366004614f2f565b61090f565b6040516102a59392919061591d565b6102e3610363366004614f2f565b610956565b61037b610376366004614f2f565b610998565b6040516102a593929190615b26565b61039d610398366004614f2f565b6109eb565b6040516102a594939291906158ba565b6103c06103bb366004614f2f565b610a35565b6040516102a5929190615b9a565b6103e16103dc366004614f2f565b610a8b565b005b6103f66103f13660046149a0565b610ba9565b6040516102a5919061584b565b6104166104113660046147ba565b610c2c565b6040516102a59190615ad5565b610416610431366004614aba565b610c82565b610449610444366004614f2f565b610cdf565b6040516102a593929190615612565b61046b610466366004614f2f565b610d19565b6040516102a59493929190615c26565b61048e610489366004614f2f565b611526565b6040516102a5949392919061599d565b6104b16104ac366004614f2f565b6115a4565b6040516102a592919061597a565b6104d26104cd366004614ff7565b6115dc565b6040516102a59190615bcc565b6103266104ed3660046151a6565b611863565b610505610500366004614f2f565b6118c2565b6040516102a59291906155f8565b610326610521366004614a77565b6118fa565b6104b1610534366004614f2f565b611ea2565b61054c610547366004614f2f565b611eff565b6040516102a59493929190615bdf565b61056f61056a366004614f2f565b611f60565b6040516102a59594939291906159d9565b61032661058e3660046150a4565b611fd8565b6103f66105a1366004614b3b565b61202f565b6105b96105b4366004614b9f565b6120a8565b6040516102a59190615764565b6104166105d4366004614b10565b61216b565b6105ec6105e7366004614f2f565b6121c4565b6040516102a594939291906156be565b61041661060a3660046149ed565b612200565b61062261061d366004614f2f565b61225f565b6040516102a593929190615aa1565b61064461063f366004614f2f565b6122d9565b6040516102a5929190615904565b610326612312565b61066d610668366004614f2f565b612318565b6040516102a59493929190615a31565b61069061068b366004614f2f565b612389565b6040516102a5929190615c18565b6103f66106ac3660046149a0565b6123d7565b6103266106bf366004614a77565b612445565b6104d26106d2366004614ff7565b612b56565b6104166106e5366004614d39565b612eb6565b6106fd6106f8366004614f2f565b612ed5565b6040516102a59190615965565b61071d610718366004614c18565b612f8a565b6040516102a5939291906157b0565b61073f61073a3660046149a0565b6130c2565b6040516102a592919061588c565b61076061075b36600461504e565b6130db565b6040516102a593929190615d8c565b61078261077d366004614f2f565b613313565b6040516102a593929190615b70565b6000806107a5836107a0613350565b61335b565b60006107be600485518661339b9092919063ffffffff16565b8060200190516107d19190810190614ee2565b909350905060ff811660068111156107e557fe5b915050915091565b60008080610801848263ffffffff6133de16565b92506001600160e01b0319831663012b8bc960e11b1461083c5760405162461bcd60e51b815260040161083390615d64565b60405180910390fd5b61084d84601063ffffffff61341216565b915061086084602463ffffffff61344516565b929491935050565b60008061087584846118fa565b91506108818484612445565b90509250929050565b600080600061089b846107a0613451565b60006108b4600486518761339b9092919063ffffffff16565b8060200190516108c79190810190615375565b9094509250905060ff811660028111156108dd57fe5b9350509193909250565b60008060006108f68585610868565b91509150610904828261345c565b925050505b92915050565b6000606080610920846107a0613472565b835161093690859060049063ffffffff61339b16565b8060200190516109499190810190614e83565b9196909550909350915050565b600080610965836107a061347d565b825161097b90849060049063ffffffff61339b16565b80602001905161098e9190810190614e26565b9094909350915050565b60008060606109a9846107a0613488565b60006109c2600486518761339b9092919063ffffffff16565b8060200190516109d59190810190615336565b9094509250905060ff811660018111156108dd57fe5b6000806060806109fd856107a0613493565b8451610a1390869060049063ffffffff61339b16565b806020019051610a269190810190614de3565b92989197509550909350915050565b600080610a44836107a061349e565b6000610a5d600485518661339b9092919063ffffffff16565b806020019051610a709190810190615275565b9250905060ff81166003811115610a8357fe5b925050915091565b6000610a9d828263ffffffff6133de16565b90506001600160e01b03198116630f47261b60e41b1415610ac857610ac182611ea2565b5050610ba5565b6001600160e01b0319811663012b8bc960e11b1415610af257610aea826107ed565b505050610ba5565b6001600160e01b0319811663a7cb5fb760e01b1415610b1e57610b1482611f60565b5050505050610ba5565b6001600160e01b031981166394cfcdd760e01b1415610b4057610aea8261225f565b6001600160e01b0319811663619ce88560e11b1415610b6b57610b6282612318565b50505050610ba5565b6001600160e01b0319811663dc1600f360e01b1415610b8d57610b6282611526565b60405162461bcd60e51b815260040161083390615d64565b5050565b606060008251905080604051908082528060200260200182016040528015610bdb578160200160208202803883390190505b50915060005b818114610c2457610c0585858381518110610bf857fe5b6020026020010151612445565b838281518110610c1157fe5b6020908102919091010152600101610be1565b505092915050565b604051606090630f47261b60e41b90610c499084906024016155e4565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091529050919050565b60405160609063619ce88560e11b90610ca39086908690869060240161568a565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915290505b9392505050565b6000806000610cf0846107a06134a9565b8351610d0690859060049063ffffffff61339b16565b8060200190516109499190810190614870565b60608080806000610d30868263ffffffff6133de16565b90506001600160e01b0319811663dedfc1f160e01b1415610d7c5760405180604001604052806011815260200170626174636843616e63656c4f726465727360781b8152509450611128565b6001600160e01b03198116634b4a520160e11b1415610dc4576040518060400160405280600f81526020016e626174636846696c6c4f726465727360881b8152509450611128565b6001600160e01b031981166323aa37f960e21b1415610e135760405180604001604052806016815260200175626174636846696c6c4f72646572734e6f5468726f7760501b8152509450611128565b6001600160e01b03198116632fbb8b8560e21b1415610e615760405180604001604052806015815260200174626174636846696c6c4f724b696c6c4f726465727360581b8152509450611128565b6001600160e01b03198116632da6298760e01b1415610ea5576040518060400160405280600b81526020016a31b0b731b2b627b93232b960a91b8152509450611128565b6001600160e01b03198116634da26aab60e11b1415610ee757604051806040016040528060098152602001683334b63627b93232b960b91b8152509450611128565b6001600160e01b03198116633852d63160e21b1415610f2f576040518060400160405280600f81526020016e3334b63627b925b4b63627b93232b960891b8152509450611128565b6001600160e01b031981166378d29ac160e01b1415610f7e57604051806040016040528060168152602001756d61726b65744275794f72646572734e6f5468726f7760501b8152509450611128565b6001600160e01b0319811663369da09960e01b1415610fd4576040518060400160405280601781526020017f6d61726b657453656c6c4f72646572734e6f5468726f770000000000000000008152509450611128565b6001600160e01b03198116638bc8efb360e01b141561102a576040518060400160405280601981526020017f6d61726b65744275794f726465727346696c6c4f724b696c6c000000000000008152509450611128565b6001600160e01b0319811663a6c3bf3360e01b1415611080576040518060400160405280601a81526020017f6d61726b657453656c6c4f726465727346696c6c4f724b696c6c0000000000008152509450611128565b6001600160e01b031981166388ec79fb60e01b14156110c4576040518060400160405280600b81526020016a6d617463684f726465727360a81b8152509450611128565b6001600160e01b03198116634f9559b160e01b14806110f357506001600160e01b031981166302280c9160e41b145b156111105760405162461bcd60e51b815260040161083390615d17565b60405162461bcd60e51b815260040161083390615ce0565b6001600160e01b0319811663dedfc1f160e01b14156111b457855161115790879060049063ffffffff6134b416565b80602001905161116a9190810190614b6d565b604080516000808252602082019092529195505b50604080516000808252602082019092529194506111ac565b60608152602001906001900390816111975790505b50915061151e565b6001600160e01b03198116632fbb8b8560e21b14806111e357506001600160e01b03198116634b4a520160e11b145b806111fe57506001600160e01b031981166323aa37f960e21b145b156112185761120c86613534565b9195509350915061151e565b6001600160e01b03198116632da6298760e01b14156112e75760408051600180825281830190925290816020015b61124e6140ed565b815260200190600190039081611246575050865190945061127990879060049063ffffffff6134b416565b80602001905161128c9190810190614fc5565b8460008151811061129957fe5b6020026020010181905250600060405190808252806020026020018201604052801561117e5781602001602082028038833901905050604080516000808252602082019092529194506111ac565b6001600160e01b03198116633852d63160e21b148061131657506001600160e01b03198116634da26aab60e11b145b156113245761120c86613563565b6001600160e01b031981166378d29ac160e01b148061135357506001600160e01b0319811663369da09960e01b145b8061136e57506001600160e01b03198116638bc8efb360e01b145b8061138957506001600160e01b0319811663a6c3bf3360e01b145b156113975761120c8661365d565b6001600160e01b031981166388ec79fb60e01b141561151e576113b86140ed565b6113c06140ed565b6060806113da60048b518c6134b49092919063ffffffff16565b8060200190516113ed91908101906150fc565b604080516002808252606082019092529498509296509094509250816020015b6114156140ed565b81526020019060019003908161140d579050509750838860008151811061143857fe5b6020026020010181905250828860018151811061145157fe5b602090810291909101015260408051600280825260608201909252908160200160208202803883390190505096508360a001518760008151811061149157fe5b6020026020010181815250508260a00151876001815181106114af57fe5b60209081029190910101526040805160028082526060820190925290816020015b60608152602001906001900390816114d057905050955081866000815181106114f557fe5b6020026020010181905250808660018151811061150e57fe5b6020026020010181905250505050505b509193509193565b60008080606061153c858363ffffffff6133de16565b93506001600160e01b0319841663dc1600f360e01b1461156e5760405162461bcd60e51b815260040161083390615d64565b845161158490869060049063ffffffff6134b416565b806020019051611597919081019061480f565b9597919650949350915050565b6000806115b3836107a06136d1565b82516115c990849060049063ffffffff61339b16565b80602001905161098e9190810190614f06565b60006115e6614180565b6116778584600660009054906101000a90046001600160a01b03166001600160a01b0316631ce4c78b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561163957600080fd5b505afa15801561164d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611671919081019061525d565b3a6136db565b60408051600280825260608281019093529293509091816020015b606081526020019060019003908161169257505060408051600280825260608083018452939450909160208301908038833950506040805160028082526060808301845294955090925090602083019080388339505060408051600280825260608083018452949550909250906020830190803883390190505090508861014001518460008151811061172157fe5b602002602001018190525088600001518360008151811061173e57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050878260008151811061176c57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505084600001518160008151811061179e57fe5b602002602001018181525050886101800151846001815181106117bd57fe5b60200260200101819052508860000151836001815181106117da57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505088604001518260018151811061180c57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505084604001518160018151811061183e57fe5b60200260200101818152505061185684848484613752565b9998505050505050505050565b60006118ba846118b56040518060400160405280600b81526020016a0c1e08141c9bdd1bd8dbdb60aa1b815250604051806040016040528060058152602001640332e302e360dc1b81525087876138f7565b61394e565b949350505050565b6000806118d1836107a0613962565b82516118e790849060049063ffffffff61339b16565b80602001905161098e91908101906147d6565b60008061190d838263ffffffff6133de16565b90506001600160e01b03198116630f47261b60e41b141561194f57600061193b84601063ffffffff61341216565b9050611947818661396d565b925050611e9b565b6001600160e01b0319811663012b8bc960e11b1415611a8e57600080611974856107ed565b6040519194509250606091506331a9108f60e11b906119979084906024016158b1565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060846001600160a01b0316836040516119e891906155c8565b600060405180830381855afa9150503d8060008114611a23576040519150601f19603f3d011682016040523d82523d6000602084013e611a28565b606091505b50915091506000828015611a3d575081516020145b611a48576000611a59565b611a5982600c63ffffffff61341216565b9050896001600160a01b0316816001600160a01b031614611a7b576000611a7e565b60015b60ff169750505050505050611e9b565b6001600160e01b0319811663a7cb5fb760e01b1415611c4c576000606080611ab586611f60565b5081519296509094509250905060005b818114611c4257828181518110611ad857fe5b602002602001015160001415611aed57611c3a565b8351606090627eeac760e11b908b90879085908110611b0857fe5b6020026020010151604051602401611b219291906156f4565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060876001600160a01b031683604051611b7291906155c8565b600060405180830381855afa9150503d8060008114611bad576040519150601f19603f3d011682016040523d82523d6000602084013e611bb2565b606091505b50915091506000828015611bc7575081516020145b611bd2576000611be3565b611be382600063ffffffff61344516565b90506000878681518110611bf357fe5b60200260200101518281611c0357fe5b04905080611c1f5760009b505050505050505050505050610909565b8b811080611c2b57508b155b15611c3457809b505b50505050505b600101611ac5565b5050505050611e9b565b6001600160e01b0319811663619ce88560e11b1415611d3857604051606090632a17967960e21b90611c8990869060009081908190602401615ae8565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925260045491519092506000916001600160a01b031690611cdb9084906155c8565b600060405180830381855afa9150503d8060008114611d16576040519150601f19603f3d011682016040523d82523d6000602084013e611d1b565b606091505b5050905080611d2b576000611d2f565b6000195b93505050611e9b565b6001600160e01b0319811663dc1600f360e01b1415611dc657600080611d5d85611526565b509250925050611d6b613a57565b6001600160a01b0316826001600160a01b0316148015611d9857506005546001600160a01b038281169116145b15611dbf576000611db0611daa613a6f565b8861396d565b9050611dbb81613a87565b9450505b5050611e9b565b6001600160e01b031981166394cfcdd760e01b1415611e9b57606080611deb8561225f565b80519194509250905060005b818114611e9657838181518110611e0a57fe5b602002602001015160001415611e1f57611e8e565b6000611e3e89858481518110611e3157fe5b60200260200101516118fa565b90506000858381518110611e4e57fe5b60200260200101518281611e5e57fe5b04905080611e76576000975050505050505050610909565b87811080611e82575087155b15611e8b578097505b50505b600101611df7565b505050505b5092915050565b600080611eb5838263ffffffff6133de16565b91506001600160e01b03198216630f47261b60e41b14611ee75760405162461bcd60e51b815260040161083390615d64565b611ef883601063ffffffff61341216565b9050915091565b60008060006060611f12856107a0613c85565b6000611f2b600487518861339b9092919063ffffffff16565b806020019051611f3e91908101906152d9565b91965094509250905060ff81166006811115611f5657fe5b9450509193509193565b60008060608080611f77868563ffffffff6133de16565b94506001600160e01b0319851663a7cb5fb760e01b14611fa95760405162461bcd60e51b815260040161083390615d64565b505050506024828101516044840151606485015160848601519496929591820184019490820184019391010190565b60006118ba8461202a6040518060400160405280600b81526020016a0c1e08141c9bdd1bd8dbdb60aa1b815250604051806040016040528060058152602001640332e302e360dc1b81525087876138f7565b613c90565b606080825160405190808252806020026020018201604052801561205d578160200160208202803883390190505b50905060005b83518114611e9b5783818151811061207757fe5b60200260200101516001600160a01b03163182828151811061209557fe5b6020908102919091010152600101612063565b6060600084519050806040519080825280602002602001820160405280156120da578160200160208202803883390190505b50915060005b8181146121625761212b8682815181106120f657fe5b602002602001015186838151811061210a57fe5b602002602001015186848151811061211e57fe5b6020026020010151612b56565b83828151811061213757fe5b6020026020010190600481111561214a57fe5b9081600481111561215757fe5b9052506001016120e0565b50509392505050565b60405160609063012b8bc960e11b9061218a90859085906024016156f4565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152905092915050565b600060608060606121d7856107a0613c9f565b84516121ed90869060049063ffffffff61339b16565b806020019051610a269190810190614909565b60405160609063a7cb5fb760e01b90612223908790879087908790602401615636565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091529050949350505050565b6000606080612274848463ffffffff6133de16565b92506001600160e01b031983166394cfcdd760e01b146122a65760405162461bcd60e51b815260040161083390615d64565b83516122bc90859060049063ffffffff6134b416565b8060200190516122cf9190810190614d6d565b9395909450915050565b600060606122e9836107a0613caa565b82516122ff90849060049063ffffffff61339b16565b80602001905161098e9190810190614e49565b60075481565b60008060608161232e858263ffffffff6133de16565b93506001600160e01b0319841663619ce88560e11b146123605760405162461bcd60e51b815260040161083390615d64565b845161237690869060049063ffffffff6134b416565b80602001905161159791908101906148b2565b600080612398836107a0613cb5565b60006123b1600485518661339b9092919063ffffffff16565b8060200190516123c49190810190615275565b9250905060ff81166001811115610a8357fe5b606060008251905080604051908082528060200260200182016040528015612409578160200160208202803883390190505b50915060005b818114610c245761242685858381518110611e3157fe5b83828151811061243257fe5b602090810291909101015260010161240f565b600080612458838263ffffffff6133de16565b90506001600160e01b031981166394cfcdd760e01b14156125285760608061247f8561225f565b80519194509250905060005b81811461251d5783818151811061249e57fe5b6020026020010151600014156124b357612515565b60006124c589858481518110610bf857fe5b905060008583815181106124d557fe5b602002602001015182816124e557fe5b049050806124fd576000975050505050505050610909565b87811080612509575087155b15612512578097505b50505b60010161248b565b506109099350505050565b6001600160e01b03198116630f47261b60e41b141561264c57600061255484601063ffffffff61341216565b600154604051919250606091636eb1769f60e11b916125819189916001600160a01b0316906024016155f8565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060836001600160a01b0316836040516125d291906155c8565b600060405180830381855afa9150503d806000811461260d576040519150601f19603f3d011682016040523d82523d6000602084013e612612565b606091505b5091509150818015612625575080516020145b612630576000612641565b61264181600063ffffffff61344516565b955050505050611e9b565b6001600160e01b0319811663012b8bc960e11b141561287f57600080612671856107ed565b6002546040519295509093506060925063e985e9c560e01b916126a4918a916001600160a01b03909116906024016155f8565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060846001600160a01b0316836040516126f591906155c8565b600060405180830381855afa9150503d8060008114612730576040519150601f19603f3d011682016040523d82523d6000602084013e612735565b606091505b509150915081158061274957508051602014155b80612765575061276081600063ffffffff61344516565b600114155b156128705760405160609063020604bf60e21b906127879087906024016158b1565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050509050856001600160a01b0316816040516127d491906155c8565b600060405180830381855afa9150503d806000811461280f576040519150601f19603f3d011682016040523d82523d6000602084013e612814565b606091505b509093509150828015612828575081516020145b801561285757506002546001600160a01b031661284c83600c63ffffffff61341216565b6001600160a01b0316145b612862576000612865565b60015b60ff16975050611c42565b60001996505050505050611e9b565b6001600160e01b0319811663a7cb5fb760e01b14156129ad5760006128a384611f60565b50506003546040519294506060935063e985e9c560e01b926128d4925089916001600160a01b0316906024016155f8565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060836001600160a01b03168360405161292591906155c8565b600060405180830381855afa9150503d8060008114612960576040519150601f19603f3d011682016040523d82523d6000602084013e612965565b606091505b5091509150818015612978575080516020145b8015612994575061299081600063ffffffff61344516565b6001145b61299f576000612641565b600019955050505050611e9b565b6001600160e01b0319811663619ce88560e11b14156129d0576000199150611e9b565b6001600160e01b0319811663dc1600f360e01b1415611e9b576000806129f585611526565b509250925050612a03613a57565b6001600160a01b0316826001600160a01b0316148015612a3057506005546001600160a01b038281169116145b15612b4d57600554604051606091636eb1769f60e11b91612a61918a916001600160a01b03909116906024016155f8565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152905060006060612aa1613a6f565b6001600160a01b031683604051612ab891906155c8565b600060405180830381855afa9150503d8060008114612af3576040519150601f19603f3d011682016040523d82523d6000602084013e612af8565b606091505b50915091506000828015612b0d575081516020145b612b18576000612b29565b612b2982600063ffffffff61344516565b90506000198114612b4257612b3d81613a87565b612b46565b6000195b9750505050505b50505092915050565b6000612b60614180565b612bb38584600660009054906101000a90046001600160a01b03166001600160a01b0316631ce4c78b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561163957600080fd5b60408051600480825260a0820190925291925060609190816020015b6060815260200190600190039081612bcf57505060408051600480825260a082019092529192506060919060208201608080388339505060408051600480825260a08201909252929350606092915060208201608080388339505060408051600480825260a0820190925292935060609291506020820160808038833901905050905088610160015184600081518110612c6557fe5b60200260200101819052508783600081518110612c7e57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050886000015182600081518110612cb057fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508681600081518110612cde57fe5b60200260200101818152505088610140015184600181518110612cfd57fe5b6020026020010181905250886000015183600181518110612d1a57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508782600181518110612d4857fe5b60200260200101906001600160a01b031690816001600160a01b031681525050846000015181600181518110612d7a57fe5b602002602001018181525050886101a0015184600281518110612d9957fe5b60200260200101819052508783600281518110612db257fe5b60200260200101906001600160a01b031690816001600160a01b031681525050886040015182600281518110612de457fe5b60200260200101906001600160a01b031690816001600160a01b031681525050846060015181600281518110612e1657fe5b60200260200101818152505088610180015184600381518110612e3557fe5b6020026020010181905250886000015183600381518110612e5257fe5b60200260200101906001600160a01b031690816001600160a01b031681525050886040015182600381518110612e8457fe5b60200260200101906001600160a01b031690816001600160a01b03168152505084604001518160038151811061183e57fe5b6040516060906394cfcdd760e01b9061218a908590859060240161585e565b6000612ee7828263ffffffff6133de16565b90506001600160e01b03198116630f47261b60e41b1480612f1857506001600160e01b0319811663012b8bc960e11b145b80612f3357506001600160e01b0319811663a7cb5fb760e01b145b80612f4e57506001600160e01b031981166394cfcdd760e01b145b80612f6957506001600160e01b0319811663619ce88560e11b145b612f855760405162461bcd60e51b815260040161083390615d64565b919050565b606080606060008551905080604051908082528060200260200182016040528015612fcf57816020015b612fbc6141af565b815260200190600190039081612fb45790505b50935080604051908082528060200260200182016040528015612ffc578160200160208202803883390190505b50925080604051908082528060200260200182016040528015613029578160200160208202803883390190505b50915060005b8181146130b95761306687828151811061304557fe5b602002602001015187838151811061305957fe5b60200260200101516130db565b875188908590811061307457fe5b6020026020010187858151811061308757fe5b6020026020010187868151811061309a57fe5b931515602094850291909101909301929092529190525260010161302f565b50509250925092565b6060806130cf84846123d7565b91506108818484610ba9565b6130e36141af565b600654604051639d3fa4b960e01b815260009182916001600160a01b0390911690639d3fa4b990613118908890600401615db0565b60606040518083038186803b15801561313057600080fd5b505afa158015613144573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131689190810190614f7d565b855160065460405163a12dcc6f60e01b815292955090916001600160a01b039091169063a12dcc6f906131a19089908990600401615dc3565b60206040518083038186803b1580156131b957600080fd5b505afa1580156131cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131f19190810190614dc3565b91506000613204828861014001516108e7565b60a088015160c08901516101808a01516101408b0151939450919290916000916132339163ffffffff613cc016565b156132605761325984613253848d60800151613ce590919063ffffffff16565b85613d01565b90506132b9565b8161327457613259848b6080015185613d01565b6000613285868c61018001516108e7565b90506000613298868d6080015187613d01565b905060006132a7838688613d01565b90506132b3828261345c565b93505050505b6132d96132d3896040015185613d2390919063ffffffff16565b8261345c565b965060046132ec8b8c602001518a6115dc565b60048111156132f757fe5b14613303576000613305565b865b965050505050509250925092565b6000806000613324846107a0613d42565b600061333d600486518761339b9092919063ffffffff16565b8060200190516108c791908101906152a2565b63fdb6ca8d60e01b90565b60006133688360006133de565b90506001600160e01b0319808216908316146133965760405162461bcd60e51b815260040161083390615d3e565b505050565b6060818311156133b9576133b96133b460008585613d4d565b613d6c565b83518211156133d2576133d26133b46001848751613d4d565b50819003910190815290565b600081600401835110156133ff576133ff6133b46003855185600401613d4d565b5001602001516001600160e01b03191690565b60008160140183511015613433576134336133b46004855185601401613d4d565b5001601401516001600160a01b031690565b6000610cd88383613d74565b6318e4b14160e01b90565b600081831061346b5781610cd8565b5090919050565b634678472b60e01b90565b63b6555d6f60e01b90565b6324410cd360e11b90565b631b8388f760e01b90565b630e94a7ed60e41b90565b634ad3127560e01b90565b6060818311156134cd576134cd6133b460008585613d4d565b83518211156134e6576134e66133b46001848751613d4d565b8282036040519080825280601f01601f191660200182016040528015613513576020820181803883390190505b509050610cd861352282613d9e565b8461352c87613d9e565b018351613da4565b606080606061355060048551866134b49092919063ffffffff16565b8060200190516109499190810190614c6e565b60408051600180825281830190925260609182918291816020015b6135866140ed565b81526020019060019003908161357e5750506040805160018082528183019092529194506020808301908038833901905050604080516001808252818301909252919350816020015b60608152602001906001900390816135cf57505084519091506135fc90859060049063ffffffff6134b416565b80602001905161360f9190810190615154565b8560008151811061361c57fe5b602002602001018560008151811061363057fe5b602002602001018560008151811061364457fe5b6020908102919091010192909252919052529193909250565b6040805160018082528183019092526060918291829160208083019080388339505085519193506136999186915060049063ffffffff6134b416565b8060200190516136ac9190810190614ce7565b845185906000906136b957fe5b60209081029190910101919091529095929450925050565b628e3db960e51b90565b6136e3614180565b6020810184905260a085015160808601516136ff918691613e49565b815260a085015160c0860151613716918691613e49565b604082015260a085015160e0860151613730918691613e49565b6060820152613745828463ffffffff613e7d16565b6080820152949350505050565b60405160009060609063b04fbddd60e01b9061377890889088908890889060240161570d565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925260065491519092506060916001600160a01b0316906137ca9084906155c8565b6000604051808303816000865af19150503d8060008114613807576040519150601f19603f3d011682016040523d82523d6000602084013e61380c565b606091505b50915060009050613823828263ffffffff6133de16565b905061382d613488565b6001600160e01b03198281169116141561386a57600061384c83610998565b5091505060ff8116600481111561385f57fe5b9450505050506118ba565b613872613472565b6001600160e01b0319828116911614156138a55760006138918361090f565b509091505060ff8116600481111561385f57fe5b815160208301207ff43f26ea5a94b478394a975e856464913dc1a8a1ca70939d974aa7c238aa0ce014156138df57600493505050506118ba565b60405162461bcd60e51b815260040161083390615cb3565b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a0902090565b6000610cd88261395d85613eae565b613f29565b6350ae068360e11b90565b6040516000906060906370a0823160e01b9061398d9085906024016155e4565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060856001600160a01b0316836040516139de91906155c8565b600060405180830381855afa9150503d8060008114613a19576040519150601f19603f3d011682016040523d82523d6000602084013e613a1e565b606091505b5091509150818015613a31575080516020145b613a3c576000613a4d565b613a4d81600063ffffffff61344516565b9695505050505050565b736b175474e89094c44da98b954eedeac495271d0f90565b7306af07097c9eeb7fd685c692751d5c66db49c21590565b600080613a92613a6f565b6001600160a01b0316634ba2363a6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015613acc57600080fd5b505af1158015613ae0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613b049190810190614f61565b90506000816001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015613b4357600080fd5b505af1158015613b57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613b7b919081019061525d565b4211613bf957816001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381600087803b158015613bbc57600080fd5b505af1158015613bd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613bf4919081019061525d565b613c6c565b816001600160a01b0316639f678cca6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015613c3457600080fd5b505af1158015613c48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613c6c919081019061525d565b90506118ba816b033b2e3c9fd0803ce800000086613d01565b630fcb446360e31b90565b6000610cd88261395d85613f48565b635bd0428d60e01b90565b6320d11f6160e01b90565b633d66146160e21b90565b600081518351148015610cd85750508051602091820120825192909101919091201490565b600082820183811015610cd857610cd86133b460008686614001565b60006118ba83613d17868563ffffffff613e7d16565b9063ffffffff61402016565b600082821115613d3c57613d3c6133b460028585614001565b50900390565b631ca78ed960e31b90565b6060632800659560e01b848484604051602401610ca393929190615bbe565b805160208201fd5b60008160200183511015613d9557613d956133b46005855185602001613d4d565b50016020015190565b60200190565b6020811015613dce576001816020036101000a038019835116818551168082178652505050613396565b82821415613ddb57613396565b82821115613e155760208103905080820181840181515b82851015613e0d578451865260209586019590940193613df2565b905250613396565b60208103905080820181840183515b81861215613e405782518252601f199283019290910190613e24565b85525050505050565b6000613e5684848461404a565b15613e6957613e696133b48585856140b0565b6118ba83613d17868563ffffffff613e7d16565b600082613e8c57506000610909565b82820282848281613e9957fe5b0414610cd857610cd86133b460018686614001565b608081810151825160208085015160408087015160609788015186519685019690962082517fec69816980a3a3ca4554410e60253953e9ff375ba4536a98adfa15cc7154150881529485019590955290830191909152948101949094526001600160a01b039091169183019190915260a082015260c0902090565b60405161190160f01b8152600281019290925260228201526042902090565b6101408101516101608201516101808301516101a08401516000937ff80322eb8376aafb64eadf8f0d7623f22130fd9491a221e902b713cb984a753493909290916020871015613f9457fe5b601f1987018051610140890180516101608b0180516101808d0180516101a08f0180519d89528c5160209d8e012087528b519b8d019b909b2084528951998c01999099208152875197909a019690962088526101e085209390945290529190529252919091529050919050565b606063e946c1bb60e01b848484604051602401610ca393929190615b4f565b600081614036576140366133b460038585614001565b600082848161404157fe5b04949350505050565b60008261405c5761405c6133b46140cf565b811580614067575083155b1561407457506000610cd8565b6000838061407e57fe5b8584099050614093858463ffffffff613e7d16565b6140a5826103e863ffffffff613e7d16565b101595945050505050565b606063339f3de260e01b848484604051602401610ca393929190615de8565b60408051808201909152600481526329e460df60e21b602082015290565b604051806101c0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b03168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001606081526020016060815260200160608152602001606081525090565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6040805160608101909152806000815260006020820181905260409091015290565b803561090981615ec1565b805161090981615ec1565b600082601f8301126141f7578081fd5b813561420a61420582615e24565b615dfe565b81815291506020808301908481018184028601820187101561422b57600080fd5b60005b84811015611e9657813561424181615ec1565b8452928201929082019060010161422e565b600082601f830112614263578081fd5b815161427161420582615e24565b8181529150602080830190840160005b838110156142ae5761429987602084518901016144d3565b83526020928301929190910190600101614281565b5050505092915050565b600082601f8301126142c8578081fd5b81356142d661420582615e24565b8181529150602080830190840160005b838110156142ae576142fe8760208435890101614485565b835260209283019291909101906001016142e6565b600082601f830112614323578081fd5b815161433161420582615e24565b8181529150602080830190840160005b838110156142ae576143598760208451890101614667565b83526020928301929190910190600101614341565b600082601f83011261437e578081fd5b813561438c61420582615e24565b8181529150602080830190840160005b838110156142ae576143b48760208435890101614519565b8352602092830192919091019060010161439c565b600082601f8301126143d9578081fd5b81516143e761420582615e24565b81815291506020808301908481018184028601820187101561440857600080fd5b60005b84811015611e965781518452928201929082019060010161440b565b600082601f830112614437578081fd5b813561444561420582615e24565b81815291506020808301908481018184028601820187101561446657600080fd5b60005b84811015611e9657813584529282019290820190600101614469565b600082601f830112614495578081fd5b81356144a361420582615e43565b91508082528360208285010111156144ba57600080fd5b8060208401602084013760009082016020015292915050565b600082601f8301126144e3578081fd5b81516144f161420582615e43565b915080825283602082850101111561450857600080fd5b611e9b816020840160208601615e66565b60006101c080838503121561452c578182fd5b61453581615dfe565b91505061454283836141d1565b815261455183602084016141d1565b602082015261456383604084016141d1565b604082015261457583606084016141d1565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e0820152610100808301358183015250610120808301358183015250610140808301356001600160401b03808211156145d657600080fd5b6145e286838701614485565b838501526101609250828501359150808211156145fe57600080fd5b61460a86838701614485565b8385015261018092508285013591508082111561462657600080fd5b61463286838701614485565b838501526101a092508285013591508082111561464e57600080fd5b5061465b85828601614485565b82840152505092915050565b60006101c080838503121561467a578182fd5b61468381615dfe565b91505061469083836141dc565b815261469f83602084016141dc565b60208201526146b183604084016141dc565b60408201526146c383606084016141dc565b60608201526080820151608082015260a082015160a082015260c082015160c082015260e082015160e0820152610100808301518183015250610120808301518183015250610140808301516001600160401b038082111561472457600080fd5b614730868387016144d3565b8385015261016092508285015191508082111561474c57600080fd5b614758868387016144d3565b8385015261018092508285015191508082111561477457600080fd5b614780868387016144d3565b838501526101a092508285015191508082111561479c57600080fd5b5061465b858286016144d3565b805160ff8116811461090957600080fd5b6000602082840312156147cb578081fd5b8135610cd881615ec1565b600080604083850312156147e8578081fd5b82516147f381615ec1565b602084015190925061480481615ec1565b809150509250929050565b600080600060608486031215614823578081fd5b835161482e81615ec1565b602085015190935061483f81615ec1565b60408501519092506001600160401b0381111561485a578182fd5b614866868287016144d3565b9150509250925092565b600080600060608486031215614884578081fd5b835161488f81615ec1565b60208501519093506148a081615ec1565b80925050604084015190509250925092565b6000806000606084860312156148c6578081fd5b83516148d181615ec1565b60208501519093506001600160401b038111156148ec578182fd5b6148f8868287016144d3565b925050604084015190509250925092565b6000806000806080858703121561491e578182fd5b845161492981615ec1565b60208601519094506001600160401b0380821115614945578384fd5b614951888389016144d3565b94506040870151915080821115614966578384fd5b614972888389016144d3565b93506060870151915080821115614987578283fd5b50614994878288016144d3565b91505092959194509250565b600080604083850312156149b2578182fd5b82356149bd81615ec1565b915060208301356001600160401b038111156149d7578182fd5b6149e3858286016142b8565b9150509250929050565b60008060008060808587031215614a02578182fd5b8435614a0d81615ec1565b935060208501356001600160401b0380821115614a28578384fd5b614a3488838901614427565b94506040870135915080821115614a49578384fd5b614a5588838901614427565b93506060870135915080821115614a6a578283fd5b5061499487828801614485565b60008060408385031215614a89578182fd5b8235614a9481615ec1565b915060208301356001600160401b03811115614aae578182fd5b6149e385828601614485565b600080600060608486031215614ace578081fd5b8335614ad981615ec1565b925060208401356001600160401b03811115614af3578182fd5b614aff86828701614485565b925050604084013590509250925092565b60008060408385031215614b22578182fd5b8235614b2d81615ec1565b946020939093013593505050565b600060208284031215614b4c578081fd5b81356001600160401b03811115614b61578182fd5b6118ba848285016141e7565b600060208284031215614b7e578081fd5b81516001600160401b03811115614b93578182fd5b6118ba84828501614313565b600080600060608486031215614bb3578081fd5b83356001600160401b0380821115614bc9578283fd5b614bd58783880161436e565b94506020860135915080821115614bea578283fd5b614bf6878388016141e7565b93506040860135915080821115614c0b578283fd5b5061486686828701614427565b60008060408385031215614c2a578182fd5b82356001600160401b0380821115614c40578384fd5b614c4c8683870161436e565b93506020850135915080821115614c61578283fd5b506149e3858286016142b8565b600080600060608486031215614c82578081fd5b83516001600160401b0380821115614c98578283fd5b614ca487838801614313565b94506020860151915080821115614cb9578283fd5b614cc5878388016143c9565b93506040860151915080821115614cda578283fd5b5061486686828701614253565b600080600060608486031215614cfb578081fd5b83516001600160401b0380821115614d11578283fd5b614d1d87838801614313565b9450602086015193506040860151915080821115614cda578283fd5b60008060408385031215614d4b578182fd5b82356001600160401b0380821115614d61578384fd5b614c4c86838701614427565b60008060408385031215614d7f578182fd5b82516001600160401b0380821115614d95578384fd5b614da1868387016143c9565b93506020850151915080821115614db6578283fd5b506149e385828601614253565b600060208284031215614dd4578081fd5b81518015158114610cd8578182fd5b60008060008060808587031215614df8578182fd5b845193506020850151614e0a81615ec1565b60408601519093506001600160401b0380821115614966578384fd5b60008060408385031215614e38578182fd5b505080516020909101519092909150565b60008060408385031215614e5b578182fd5b8251915060208301516001600160401b03811115614e77578182fd5b6149e3858286016144d3565b600080600060608486031215614e97578081fd5b8351925060208401516001600160401b0380821115614eb4578283fd5b614ec0878388016144d3565b93506040860151915080821115614ed5578283fd5b50614866868287016144d3565b60008060408385031215614ef4578182fd5b82519150602083015161480481615ed6565b60008060408385031215614f18578182fd5b82516001600160e01b0319811681146147f3578283fd5b600060208284031215614f40578081fd5b81356001600160401b03811115614f55578182fd5b6118ba84828501614485565b600060208284031215614f72578081fd5b8151610cd881615ec1565b600060608284031215614f8e578081fd5b614f986060615dfe565b825160078110614fa6578283fd5b8152602083810151908201526040928301519281019290925250919050565b600060208284031215614fd6578081fd5b81516001600160401b03811115614feb578182fd5b6118ba84828501614667565b60008060006060848603121561500b578081fd5b83356001600160401b03811115615020578182fd5b61502c86828701614519565b935050602084013561503d81615ec1565b929592945050506040919091013590565b60008060408385031215615060578182fd5b82356001600160401b0380821115615076578384fd5b61508286838701614519565b93506020850135915080821115615097578283fd5b506149e385828601614485565b6000806000606084860312156150b8578081fd5b83356001600160401b038111156150cd578182fd5b6150d986828701614519565b9350506020840135915060408401356150f181615ec1565b809150509250925092565b60008060008060808587031215615111578182fd5b84516001600160401b0380821115615127578384fd5b61513388838901614667565b95506020870151915080821115615148578384fd5b61495188838901614667565b600080600060608486031215615168578081fd5b83516001600160401b038082111561517e578283fd5b61518a87838801614667565b9450602086015193506040860151915080821115614ed5578283fd5b6000806000606084860312156151ba578081fd5b83356001600160401b03808211156151d0578283fd5b81860160a081890312156151e2578384fd5b6151ec60a0615dfe565b925080358352602081013560208401526040810135604084015261521388606083016141d1565b6060840152608081013582811115615229578485fd5b61523589828401614485565b60808501525091945050506020840135915061525485604086016141d1565b90509250925092565b60006020828403121561526e578081fd5b5051919050565b60008060408385031215615287578182fd5b825161529281615ed6565b6020939093015192949293505050565b6000806000606084860312156152b6578081fd5b83516152c181615ed6565b6020850151604086015191945092506150f181615ec1565b600080600080608085870312156152ee578182fd5b6152f886866147a9565b935060208501519250604085015161530f81615ec1565b60608601519092506001600160401b0381111561532a578182fd5b614994878288016144d3565b60008060006060848603121561534a578081fd5b61535485856147a9565b92506020840151915060408401516001600160401b0381111561485a578182fd5b600080600060608486031215615389578081fd5b61539385856147a9565b925060208401519150604084015190509250925092565b6001600160a01b03169052565b6000815180845260208401935060208301825b828110156153f15781516001600160a01b03168652602095860195909101906001016153ca565b5093949350505050565b600081518084526020840180819550602083028101915060208501845b84811015615446578284038852615430848351615483565b6020988901989094509190910190600101615418565b50919695505050505050565b6000815180845260208401935060208301825b828110156153f1578151865260209586019590910190600101615465565b6000815180845261549b816020860160208601615e66565b601f01601f19169290920160200192915050565b80516154ba81615ead565b825260208181015190830152604090810151910152565b60006101c06154e18484516153aa565b60208301516154f360208601826153aa565b50604083015161550660408601826153aa565b50606083015161551960608601826153aa565b506080830151608085015260a083015160a085015260c083015160c085015260e083015160e085015261010080840151818601525061012080840151818601525061014080840151828287015261557283870182615483565b9150506101609150818401518582038387015261558f8282615483565b9250505061018080840151858303828701526155ab8382615483565b9150506101a091508184015185820383870152613a4d8282615483565b600082516155da818460208701615e66565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b038516815260806020820181905260009061565a90830186615452565b828103604084015261566c8186615452565b838103606085015261567e8186615483565b98975050505050505050565b6001600160a01b03841681526060602082018190526000906156ae90830185615483565b9050826040830152949350505050565b6001600160a01b03851681526080602082018190526000906156e290830186615483565b828103604084015261566c8186615483565b6001600160a01b03929092168252602082015260400190565b60006080825261572060808301876153fb565b828103602084015261573281876153b7565b838103604085015261574481876153b7565b91505082810360608401526157598185615452565b979650505050505050565b602080825282518282018190526000918401906040840190835b818110156157a557835161579181615eb7565b83526020938401939092019160010161577e565b509095945050505050565b606080825284519082018190526000906020906080840190828801845b828110156157f3576157e08483516154af565b60609390930192908401906001016157cd565b505050838103828501526158078187615452565b84810360408601528551808252908301915082860190845b8181101561583d57825115158452928401929184019160010161581f565b509198975050505050505050565b600060208252610cd86020830184615452565b6000604082526158716040830185615452565b828103602084015261588381856153fb565b95945050505050565b60006040825261589f6040830185615452565b82810360208401526158838185615452565b90815260200190565b8481526001600160a01b03841660208201526080604082018190526000906158e490830185615483565b82810360608401526157598185615483565b918252602082015260400190565b6000838252604060208301526118ba6040830184615483565b6000848252606060208301526159366060830185615483565b8281036040840152613a4d8185615483565b8281526040810161595883615ead565b8260208301529392505050565b6001600160e01b031991909116815260200190565b6001600160e01b03199290921682526001600160a01b0316602082015260400190565b6001600160e01b0319851681526001600160a01b03848116602083015283166040820152608060608201819052600090613a4d90830184615483565b6001600160e01b0319861681526001600160a01b038516602082015260a060408201819052600090615a0d90830186615452565b8281036060840152615a1f8186615452565b83810360808501526118568186615483565b6001600160e01b0319851681526001600160a01b0384166020820152608060408201819052600090615a6590830185615483565b905082606083015295945050505050565b6001600160e01b03199390931683526001600160a01b03919091166020830152604082015260600190565b600063ffffffff60e01b8516825260606020830152615ac36060830185615452565b8281036040840152613a4d81856153fb565b600060208252610cd86020830184615483565b600060808252615afb6080830187615483565b6001600160a01b03958616602084015293909416604082015260ff9190911660609091015292915050565b600060028510615b3257fe5b848252836020830152606060408301526158836060830184615483565b60608101615b5c85615e96565b938152602081019290925260409091015290565b60608101615b7d85615ea3565b93815260208101929092526001600160a01b031660409091015290565b60408101615ba784615e96565b9281526020015290565b60608101615b5c85615ea3565b6060810160088510615b5c57fe5b60208101615bd983615eb7565b91905290565b6000615bea86615ead565b858252602082018590526001600160a01b0384166040830152608060608301819052613a4d90830184615483565b6040810160028410615ba757fe5b600060808252615c396080830187615483565b602083820381850152818751808452828401915082838202850101838a01865b83811015615c8757601f19878403018552615c758383516154d1565b94860194925090850190600101615c59565b50508681036040880152615c9b818a615452565b945050505050828103606084015261575981856153fb565b602080825260139082015272554e4b4e4f574e5f52455455524e5f4441544160681b604082015260600190565b60208082526019908201527f554e4b4e4f574e5f46554e4354494f4e5f53454c4543544f5200000000000000604082015260600190565b6020808252600d908201526c15539253541311535153951151609a1b604082015260600190565b6020808252600c908201526b2120a22fa9a2a622a1aa27a960a11b604082015260600190565b6020808252600e908201526d15d493d391d7d41493d61657d25160921b604082015260600190565b60a08101615d9a82866154af565b8360608301528215156080830152949350505050565b600060208252610cd860208301846154d1565b600060408252615dd660408301856154d1565b82810360208401526158838185615483565b9283526020830191909152604082015260600190565b6040518181016001600160401b0381118282101715615e1c57600080fd5b604052919050565b60006001600160401b03821115615e39578081fd5b5060209081020190565b60006001600160401b03821115615e58578081fd5b50601f01601f191660200190565b60005b83811015615e81578181015183820152602001615e69565b83811115615e90576000848401525b50505050565b60048110615ea057fe5b50565b60038110615ea057fe5b60078110615ea057fe5b60058110615ea057fe5b6001600160a01b0381168114615ea057600080fd5b60ff81168114615ea057600080fdfea365627a7a72315820a1f72e0fecf83c3e25dfac45671531008e6d10bf428de8acfd449b715d8f4ad16c6578706572696d656e74616cf564736f6c63430005100040" + "object": "0x608060405234801561001057600080fd5b50600436106102f45760003560e01c80639a7e752611610191578063ca49f47c116100e3578063d3d862d111610097578063e4e6e7da11610071578063e4e6e7da1461077e578063e77286eb1461079f578063ee4f5a94146107c1576102f4565b8063d3d862d114610729578063d46950281461073c578063e25cabf71461075c576102f4565b8063d001c5dc116100c8578063d001c5dc146106f0578063d186037f14610703578063d363790514610716576102f4565b8063ca49f47c146106ac578063cafd3a07146106cf576102f4565b8063a6627e9f11610145578063bbb2dcf61161011f578063bbb2dcf614610661578063bc03f96414610683578063c26cfecd146106a4576102f4565b8063a6627e9f14610618578063acaedc741461062b578063b43cffe11461064e576102f4565b8063a070cac811610176578063a070cac8146105d2578063a0901e51146105e5578063a5cd62ba146105f8576102f4565b80639a7e75261461058b5780639eadc835146105ae576102f4565b80634dfdac201161024a5780637914b2ec116101fe5780637b66ad34116101d85780637b66ad34146105445780637d727512146105655780638f4ce47914610578576102f4565b80637914b2ec146104f05780637982653e1461051157806379c9c42614610531576102f4565b806363eb39921161022f57806363eb39921461049857806365129042146104ab578063750bdb30146104cd576102f4565b80634dfdac2014610458578063590aa87514610478576102f4565b8063314853ff116102ac5780633db6dc61116102865780633db6dc61146103ff578063459be5e21461042257806346eb65cb14610443576102f4565b8063314853ff146103a8578063327d3054146103ca57806332aae3ad146103dd576102f4565b80630d7b7d76116102dd5780630d7b7d7614610345578063165979e1146103665780632322cf7614610388576102f4565b806302d0aec3146102f957806304a5618a14610323575b600080fd5b61030c610307366004614a21565b6107e3565b60405161031a92919061535e565b60405180910390f35b610336610331366004614a21565b61083f565b60405161031a93929190615488565b610358610353366004614603565b6108ba565b60405161031a92919061530c565b610379610374366004614a21565b6108dc565b60405161031a939291906155c3565b61039b610396366004614603565b610939565b60405161031a91906152c9565b6103bb6103b6366004614a21565b610961565b60405161031a93929190615333565b6103586103d8366004614a21565b6109a8565b6103f06103eb366004614a21565b6109ea565b60405161031a93929190615539565b61041261040d366004614a21565b610a3d565b60405161031a94939291906152d2565b610435610430366004614a21565b610a87565b60405161031a9291906155ac565b610456610451366004614a21565b610add565b005b61046b61046636600461452a565b610c5f565b60405161031a9190615263565b61048b610486366004614341565b610ce2565b60405161031a91906154e8565b61048b6104a6366004614647565b610d52565b6104be6104b9366004614a21565b610dc8565b60405161031a9392919061502f565b6104e06104db366004614a21565b610e02565b60405161031a94939291906153b3565b6105036104fe366004614a21565b610e99565b60405161031a929190615390565b61052461051f366004614ab8565b610ed1565b60405161031a91906155de565b61039b61053f366004614bc0565b61118c565b610557610552366004614a21565b611215565b60405161031a929190615015565b61039b610573366004614603565b61124d565b610503610586366004614a21565b6118a4565b61059e610599366004614a21565b61191a565b60405161031a94939291906155f2565b6105c16105bc366004614a21565b61197b565b60405161031a9594939291906153ef565b61039b6105e0366004614b67565b611a0c565b61046b6105f33660046146c9565b611a8d565b61060b6106063660046146fc565b611b06565b60405161031a919061517b565b61048b61062636600461469e565b611bc9565b61063e610639366004614a21565b611c22565b60405161031a94939291906150d7565b61048b61065c366004614578565b611c5e565b61067461066f366004614a21565b611cd6565b60405161031a939291906154b3565b610696610691366004614a21565b611d50565b60405161031a92919061531a565b61039b611d89565b6106bf6106ba366004614a21565b611d8f565b60405161031a9493929190615445565b6106e26106dd366004614a21565b611e19565b60405161031a929190615629565b61046b6106fe36600461452a565b611e67565b61039b610711366004614603565b611ed5565b610524610724366004614ab8565b6126c7565b61048b6107373660046147cd565b612a77565b61074f61074a366004614a21565b612a96565b60405161031a919061537b565b61076f61076a366004614776565b612b91565b60405161031a939291906151c8565b61079161078c36600461452a565b612cc9565b60405161031a9291906152a4565b6107b26107ad366004614b10565b612ce2565b60405161031a939291906156db565b6107d46107cf366004614a21565b612fa4565b60405161031a93929190615582565b6000806107f7836107f2612fe1565b613005565b600061081060048551866130459092919063ffffffff16565b80602001905161082391908101906149d4565b909350905060ff8116600681111561083757fe5b915050915091565b60008080610853848263ffffffff61308816565b92506001600160e01b0319831663012b8bc960e11b1461088e5760405162461bcd60e51b8152600401610885906156a4565b60405180910390fd5b61089f84601063ffffffff6130bc16565b91506108b284602463ffffffff6130ef16565b929491935050565b6000806108c7848461124d565b91506108d38484611ed5565b90509250929050565b60008060006108ed846107f26130fb565b600061090660048651876130459092919063ffffffff16565b8060200190516109199190810190614d92565b9094509250905060ff8116600281111561092f57fe5b9350509193909250565b600080600061094885856108ba565b91509150610956828261311f565b925050505b92915050565b6000606080610972846107f2613135565b835161098890859060049063ffffffff61304516565b80602001905161099b9190810190614974565b9196909550909350915050565b6000806109b7836107f2613159565b82516109cd90849060049063ffffffff61304516565b8060200190516109e09190810190614916565b9094909350915050565b60008060606109fb846107f261317d565b6000610a1460048651876130459092919063ffffffff16565b806020019051610a279190810190614d52565b9094509250905060ff8116600181111561092f57fe5b600080606080610a4f856107f26131a1565b8451610a6590869060049063ffffffff61304516565b806020019051610a7891908101906148d2565b92989197509550909350915050565b600080610a96836107f26131c5565b6000610aaf60048551866130459092919063ffffffff16565b806020019051610ac29190810190614c90565b9250905060ff81166003811115610ad557fe5b925050915091565b6000610aef828263ffffffff61308816565b90506001600160e01b031981167ff47261b0000000000000000000000000000000000000000000000000000000001415610b3357610b2c826118a4565b5050610c5b565b6001600160e01b0319811663012b8bc960e11b1415610b5d57610b558261083f565b505050610c5b565b6001600160e01b031981167fa7cb5fb7000000000000000000000000000000000000000000000000000000001415610ba257610b988261197b565b5050505050610c5b565b6001600160e01b031981166394cfcdd760e01b1415610bc457610b5582611cd6565b6001600160e01b031981167fc339d10a000000000000000000000000000000000000000000000000000000001415610c0857610bff82611d8f565b50505050610c5b565b6001600160e01b031981167fdc1600f3000000000000000000000000000000000000000000000000000000001415610c4357610bff82610e02565b60405162461bcd60e51b8152600401610885906156a4565b5050565b606060008251905080604051908082528060200260200182016040528015610c91578160200160208202803883390190505b50915060005b818114610cda57610cbb85858381518110610cae57fe5b6020026020010151611ed5565b838281518110610cc757fe5b6020908102919091010152600101610c97565b505092915050565b6040516060907ff47261b00000000000000000000000000000000000000000000000000000000090610d18908490602401615001565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915290505b919050565b6040516060907fc339d10a0000000000000000000000000000000000000000000000000000000090610d8c908690869086906024016150a5565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915290505b9392505050565b6000806000610dd9846107f26131e9565b8351610def90859060049063ffffffff61304516565b80602001905161099b91908101906143f8565b600080806060610e18858363ffffffff61308816565b93506001600160e01b031984167fdc1600f30000000000000000000000000000000000000000000000000000000014610e635760405162461bcd60e51b8152600401610885906156a4565b8451610e7990869060049063ffffffff61320d16565b806020019051610e8c9190810190614396565b9597919650949350915050565b600080610ea8836107f261328d565b8251610ebe90849060049063ffffffff61304516565b8060200190516109e091908101906149f8565b6000610edb613f0c565b610f6c8584600660009054906101000a90046001600160a01b03166001600160a01b0316631ce4c78b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f2e57600080fd5b505afa158015610f42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f669190810190614c78565b3a6132b1565b60408051600280825260608281019093529293509091816020015b6060815260200190600190039081610f8757505060408051600280825260608083018452939450909160208301908038833950506040805160028082526060808301845294955090925090602083019080388339505060408051600280825260608083018452949550909250906020830190803883390190505090508861014001518460008151811061101657fe5b602002602001018190525088600001518360008151811061103357fe5b6001600160a01b039283166020918202929092010152881615611056578761106c565b73377f698c4c287018d09b516f415317aec59193325b8260008151811061107957fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508460000151816000815181106110ab57fe5b602002602001018181525050886101800151846001815181106110ca57fe5b60200260200101819052508860000151836001815181106110e757fe5b6001600160a01b03928316602091820292909201015260408a01511615611112578860400151611128565b73377f698c4c287018d09b516f415317aec59193325b8260018151811061113557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505084604001518160018151811061116757fe5b60200260200101818152505061117f84848484613328565b9998505050505050505050565b600061120d846112086040518060400160405280600b81526020017f30782050726f746f636f6c0000000000000000000000000000000000000000008152506040518060400160405280600581526020017f332e302e3000000000000000000000000000000000000000000000000000000081525087876134e6565b61353d565b949350505050565b600080611224836107f2613551565b825161123a90849060049063ffffffff61304516565b8060200190516109e0919081019061435d565b600080611260838263ffffffff61308816565b90506001600160e01b031981167ff47261b00000000000000000000000000000000000000000000000000000000014156112bb5760006112a784601063ffffffff6130bc16565b90506112b38186613575565b92505061189d565b6001600160e01b0319811663012b8bc960e11b1415611413576000806112e08561083f565b6040519194509250606091507f6352211e000000000000000000000000000000000000000000000000000000009061131c9084906024016152c9565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060846001600160a01b03168360405161136d9190614fe5565b600060405180830381855afa9150503d80600081146113a8576040519150601f19603f3d011682016040523d82523d6000602084013e6113ad565b606091505b509150915060008280156113c2575081516020145b6113cd5760006113de565b6113de82600c63ffffffff6130bc16565b9050896001600160a01b0316816001600160a01b031614611400576000611403565b60015b60ff16975050505050505061189d565b6001600160e01b031981167fa7cb5fb70000000000000000000000000000000000000000000000000000000014156116035760006060806114538661197b565b5081519296509094509250905060005b8181146115f95782818151811061147657fe5b60200260200101516000141561148b576115f1565b83516060907efdd58e00000000000000000000000000000000000000000000000000000000908b908790859081106114bf57fe5b60200260200101516040516024016114d892919061510b565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060876001600160a01b0316836040516115299190614fe5565b600060405180830381855afa9150503d8060008114611564576040519150601f19603f3d011682016040523d82523d6000602084013e611569565b606091505b5091509150600082801561157e575081516020145b61158957600061159a565b61159a82600063ffffffff6130ef16565b905060008786815181106115aa57fe5b602002602001015182816115ba57fe5b049050806115d65760009b50505050505050505050505061095b565b8b8110806115e257508b155b156115eb57809b505b50505050505b600101611463565b505050505061189d565b6001600160e01b031981167fc339d10a000000000000000000000000000000000000000000000000000000001415611721576040516060907fa85e59e40000000000000000000000000000000000000000000000000000000090611672908690600090819081906024016154fb565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925260045491519092506000916001600160a01b0316906116c4908490614fe5565b600060405180830381855afa9150503d80600081146116ff576040519150601f19603f3d011682016040523d82523d6000602084013e611704565b606091505b5050905080611714576000611718565b6000195b9350505061189d565b6001600160e01b031981167fdc1600f30000000000000000000000000000000000000000000000000000000014156117c85760008061175f85610e02565b50925092505061176d613678565b6001600160a01b0316826001600160a01b031614801561179a57506005546001600160a01b038281169116145b156117c15760006117b26117ac613690565b88613575565b90506117bd816136a8565b9450505b505061189d565b6001600160e01b031981166394cfcdd760e01b141561189d576060806117ed85611cd6565b80519194509250905060005b8181146118985783818151811061180c57fe5b60200260200101516000141561182157611890565b60006118408985848151811061183357fe5b602002602001015161124d565b9050600085838151811061185057fe5b6020026020010151828161186057fe5b0490508061187857600097505050505050505061095b565b87811080611884575087155b1561188d578097505b50505b6001016117f9565b505050505b5092915050565b6000806118b7838263ffffffff61308816565b91506001600160e01b031982167ff47261b000000000000000000000000000000000000000000000000000000000146119025760405162461bcd60e51b8152600401610885906156a4565b61191383601063ffffffff6130bc16565b9050915091565b6000806000606061192d856107f26138a6565b600061194660048751886130459092919063ffffffff16565b8060200190516119599190810190614cf4565b91965094509250905060ff8116600681111561197157fe5b9450509193509193565b60008060608080611992868563ffffffff61308816565b94506001600160e01b031985167fa7cb5fb700000000000000000000000000000000000000000000000000000000146119dd5760405162461bcd60e51b8152600401610885906156a4565b505050506024828101516044840151606485015160848601519496929591820184019490820184019391010190565b600061120d84611a886040518060400160405280600b81526020017f30782050726f746f636f6c0000000000000000000000000000000000000000008152506040518060400160405280600581526020017f332e302e3000000000000000000000000000000000000000000000000000000081525087876134e6565b6138ca565b6060808251604051908082528060200260200182016040528015611abb578160200160208202803883390190505b50905060005b8351811461189d57838181518110611ad557fe5b60200260200101516001600160a01b031631828281518110611af357fe5b6020908102919091010152600101611ac1565b606060008451905080604051908082528060200260200182016040528015611b38578160200160208202803883390190505b50915060005b818114611bc057611b89868281518110611b5457fe5b6020026020010151868381518110611b6857fe5b6020026020010151868481518110611b7c57fe5b60200260200101516126c7565b838281518110611b9557fe5b60200260200101906004811115611ba857fe5b90816004811115611bb557fe5b905250600101611b3e565b50509392505050565b60405160609063012b8bc960e11b90611be8908590859060240161510b565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152905092915050565b60006060806060611c35856107f26138d9565b8451611c4b90869060049063ffffffff61304516565b806020019051610a789190810190614492565b6040516060907fa7cb5fb70000000000000000000000000000000000000000000000000000000090611c9a908790879087908790602401615053565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091529050949350505050565b6000606080611ceb848463ffffffff61308816565b92506001600160e01b031983166394cfcdd760e01b14611d1d5760405162461bcd60e51b8152600401610885906156a4565b8351611d3390859060049063ffffffff61320d16565b806020019051611d469190810190614802565b9395909450915050565b60006060611d60836107f26138fd565b8251611d7690849060049063ffffffff61304516565b8060200190516109e09190810190614939565b60075481565b600080606081611da5858263ffffffff61308816565b93506001600160e01b031984167fc339d10a0000000000000000000000000000000000000000000000000000000014611df05760405162461bcd60e51b8152600401610885906156a4565b8451611e0690869060049063ffffffff61320d16565b806020019051610e8c919081019061443a565b600080611e28836107f2613921565b6000611e4160048551866130459092919063ffffffff16565b806020019051611e549190810190614c90565b9250905060ff81166001811115610ad557fe5b606060008251905080604051908082528060200260200182016040528015611e99578160200160208202803883390190505b50915060005b818114610cda57611eb68585838151811061183357fe5b838281518110611ec257fe5b6020908102919091010152600101611e9f565b600080611ee8838263ffffffff61308816565b90506001600160e01b031981166394cfcdd760e01b1415611fb857606080611f0f85611cd6565b80519194509250905060005b818114611fad57838181518110611f2e57fe5b602002602001015160001415611f4357611fa5565b6000611f5589858481518110610cae57fe5b90506000858381518110611f6557fe5b60200260200101518281611f7557fe5b04905080611f8d57600097505050505050505061095b565b87811080611f99575087155b15611fa2578097505b50505b600101611f1b565b5061095b9350505050565b6001600160e01b031981167ff47261b000000000000000000000000000000000000000000000000000000000141561210e576000611ffd84601063ffffffff6130bc16565b6001546040519192506060917fdd62ed3e00000000000000000000000000000000000000000000000000000000916120439189916001600160a01b031690602401615015565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060836001600160a01b0316836040516120949190614fe5565b600060405180830381855afa9150503d80600081146120cf576040519150601f19603f3d011682016040523d82523d6000602084013e6120d4565b606091505b50915091508180156120e7575080516020145b6120f2576000612103565b61210381600063ffffffff6130ef16565b95505050505061189d565b6001600160e01b0319811663012b8bc960e11b1415612373576000806121338561083f565b600254604051929550909350606092507fe985e9c5000000000000000000000000000000000000000000000000000000009161217f918a916001600160a01b0390911690602401615015565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060846001600160a01b0316836040516121d09190614fe5565b600060405180830381855afa9150503d806000811461220b576040519150601f19603f3d011682016040523d82523d6000602084013e612210565b606091505b509150915081158061222457508051602014155b80612240575061223b81600063ffffffff6130ef16565b600114155b15612364576040516060907f081812fc000000000000000000000000000000000000000000000000000000009061227b9087906024016152c9565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050509050856001600160a01b0316816040516122c89190614fe5565b600060405180830381855afa9150503d8060008114612303576040519150601f19603f3d011682016040523d82523d6000602084013e612308565b606091505b50909350915082801561231c575081516020145b801561234b57506002546001600160a01b031661234083600c63ffffffff6130bc16565b6001600160a01b0316145b612356576000612359565b60015b60ff169750506115f9565b6000199650505050505061189d565b6001600160e01b031981167fa7cb5fb70000000000000000000000000000000000000000000000000000000014156124d35760006123b08461197b565b5050600354604051929450606093507fe985e9c500000000000000000000000000000000000000000000000000000000926123fa925089916001600160a01b031690602401615015565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060836001600160a01b03168360405161244b9190614fe5565b600060405180830381855afa9150503d8060008114612486576040519150601f19603f3d011682016040523d82523d6000602084013e61248b565b606091505b509150915081801561249e575080516020145b80156124ba57506124b681600063ffffffff6130ef16565b6001145b6124c5576000612103565b60001995505050505061189d565b6001600160e01b031981167fc339d10a00000000000000000000000000000000000000000000000000000000141561250f57600019915061189d565b6001600160e01b031981167fdc1600f300000000000000000000000000000000000000000000000000000000141561189d5760008061254d85610e02565b50925092505061255b613678565b6001600160a01b0316826001600160a01b031614801561258857506005546001600160a01b038281169116145b156126be576005546040516060917fdd62ed3e00000000000000000000000000000000000000000000000000000000916125d2918a916001600160a01b0390911690602401615015565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152905060006060612612613690565b6001600160a01b0316836040516126299190614fe5565b600060405180830381855afa9150503d8060008114612664576040519150601f19603f3d011682016040523d82523d6000602084013e612669565b606091505b5091509150600082801561267e575081516020145b61268957600061269a565b61269a82600063ffffffff6130ef16565b905060001981146126b3576126ae816136a8565b6126b7565b6000195b9750505050505b50505092915050565b60006126d1613f0c565b6127248584600660009054906101000a90046001600160a01b03166001600160a01b0316631ce4c78b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f2e57600080fd5b60408051600480825260a0820190925291925060609190816020015b606081526020019060019003908161274057505060408051600480825260a082019092529192506060919060208201608080388339505060408051600480825260a08201909252929350606092915060208201608080388339505060408051600480825260a08201909252929350606092915060208201608080388339019050509050886101600151846000815181106127d657fe5b602002602001018190525087836000815181106127ef57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505088600001518260008151811061282157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050868160008151811061284f57fe5b6020026020010181815250508861014001518460018151811061286e57fe5b602002602001018190525088600001518360018151811061288b57fe5b6001600160a01b0392831660209182029290920101528816156128ae57876128c4565b73377f698c4c287018d09b516f415317aec59193325b826001815181106128d157fe5b60200260200101906001600160a01b031690816001600160a01b03168152505084600001518160018151811061290357fe5b602002602001018181525050886101a001518460028151811061292257fe5b6020026020010181905250878360028151811061293b57fe5b6001600160a01b03928316602091820292909201015260408a0151161561296657886040015161297c565b73377f698c4c287018d09b516f415317aec59193325b8260028151811061298957fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508460600151816002815181106129bb57fe5b602002602001018181525050886101800151846003815181106129da57fe5b60200260200101819052508860000151836003815181106129f757fe5b6001600160a01b03928316602091820292909201015260408a01511615612a22578860400151612a38565b73377f698c4c287018d09b516f415317aec59193325b82600381518110612a4557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505084604001518160038151811061116757fe5b6040516060906394cfcdd760e01b90611be89085908590602401615276565b6000612aa8828263ffffffff61308816565b90506001600160e01b031981167ff47261b0000000000000000000000000000000000000000000000000000000001480612af257506001600160e01b0319811663012b8bc960e11b145b80612b2657506001600160e01b031981167fa7cb5fb700000000000000000000000000000000000000000000000000000000145b80612b4157506001600160e01b031981166394cfcdd760e01b145b80612b7557506001600160e01b031981167fc339d10a00000000000000000000000000000000000000000000000000000000145b610d4d5760405162461bcd60e51b8152600401610885906156a4565b606080606060008551905080604051908082528060200260200182016040528015612bd657816020015b612bc3613f3b565b815260200190600190039081612bbb5790505b50935080604051908082528060200260200182016040528015612c03578160200160208202803883390190505b50925080604051908082528060200260200182016040528015612c30578160200160208202803883390190505b50915060005b818114612cc057612c6d878281518110612c4c57fe5b6020026020010151878381518110612c6057fe5b6020026020010151612ce2565b8751889085908110612c7b57fe5b60200260200101878581518110612c8e57fe5b60200260200101878681518110612ca157fe5b9315156020948502919091019093019290925291905252600101612c36565b50509250925092565b606080612cd68484611e67565b91506108d38484610c5f565b612cea613f3b565b6006546040517f9d3fa4b900000000000000000000000000000000000000000000000000000000815260009182916001600160a01b0390911690639d3fa4b990612d389088906004016156ff565b60606040518083038186803b158015612d5057600080fd5b505afa158015612d64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612d889190810190614a70565b85516006546040517fa12dcc6f00000000000000000000000000000000000000000000000000000000815292955090916001600160a01b039091169063a12dcc6f90612dda9089908990600401615712565b60206040518083038186803b158015612df257600080fd5b505afa158015612e06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612e2a91908101906148b2565b91506000612e3d82886101400151610939565b60a088015160c08901516101808a01516101408b015193945091929091600091612e6c9163ffffffff61394516565b15612e9957612e9284612e8c848d6080015161396a90919063ffffffff16565b85613986565b9050612ef2565b81612ead57612e92848b6080015185613986565b6000612ebe868c6101800151610939565b90506000612ed1868d6080015187613986565b90506000612ee0838688613986565b9050612eec828261311f565b93505050505b612f12612f0c8960400151856139a890919063ffffffff16565b8261311f565b96506004612f258b8c602001518a610ed1565b6004811115612f3057fe5b14612f3c576000612f3e565b865b9650612f4e8a61016001516139c7565b612f5757600096505b60e08a015115801590612f755750612f738a6101a001516139c7565b155b15612f7f57600096505b600388516006811115612f8e57fe5b14612f9857600096505b50505050509250925092565b6000806000612fb5846107f2613ab1565b6000612fce60048651876130459092919063ffffffff16565b8060200190516109199190810190614cbd565b7ffdb6ca8d0000000000000000000000000000000000000000000000000000000090565b6000613012836000613088565b90506001600160e01b0319808216908316146130405760405162461bcd60e51b81526004016108859061566d565b505050565b6060818311156130635761306361305e60008585613ad5565b613af4565b835182111561307c5761307c61305e6001848751613ad5565b50819003910190815290565b600081600401835110156130a9576130a961305e6003855185600401613ad5565b5001602001516001600160e01b03191690565b600081601401835110156130dd576130dd61305e6004855185601401613ad5565b5001601401516001600160a01b031690565b6000610dc18383613afc565b7f18e4b1410000000000000000000000000000000000000000000000000000000090565b600081831061312e5781610dc1565b5090919050565b7f4678472b0000000000000000000000000000000000000000000000000000000090565b7fb6555d6f0000000000000000000000000000000000000000000000000000000090565b7f488219a60000000000000000000000000000000000000000000000000000000090565b7f1b8388f70000000000000000000000000000000000000000000000000000000090565b7fe94a7ed00000000000000000000000000000000000000000000000000000000090565b7f4ad312750000000000000000000000000000000000000000000000000000000090565b6060818311156132265761322661305e60008585613ad5565b835182111561323f5761323f61305e6001848751613ad5565b8282036040519080825280601f01601f19166020018201604052801561326c576020820181803883390190505b509050610dc161327b82613b26565b8461328587613b26565b018351613b2c565b7f11c7b7200000000000000000000000000000000000000000000000000000000090565b6132b9613f0c565b6020810184905260a085015160808601516132d5918691613bd1565b815260a085015160c08601516132ec918691613bd1565b604082015260a085015160e0860151613306918691613bd1565b606082015261331b828463ffffffff613c0516565b6080820152949350505050565b6040516000906060907fb04fbddd0000000000000000000000000000000000000000000000000000000090613367908890889088908890602401615124565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925260065491519092506060916001600160a01b0316906133b9908490614fe5565b6000604051808303816000865af19150503d80600081146133f6576040519150601f19603f3d011682016040523d82523d6000602084013e6133fb565b606091505b50915060009050613412828263ffffffff61308816565b905061341c61317d565b6001600160e01b03198281169116141561345957600061343b836109ea565b5091505060ff8116600481111561344e57fe5b94505050505061120d565b613461613135565b6001600160e01b03198281169116141561349457600061348083610961565b509091505060ff8116600481111561344e57fe5b815160208301207ff43f26ea5a94b478394a975e856464913dc1a8a1ca70939d974aa7c238aa0ce014156134ce576004935050505061120d565b60405162461bcd60e51b815260040161088590615636565b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a0902090565b6000610dc18261354c85613c36565b613cb1565b7fa15c0d060000000000000000000000000000000000000000000000000000000090565b6040516000906060907f70a0823100000000000000000000000000000000000000000000000000000000906135ae908590602401615001565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060856001600160a01b0316836040516135ff9190614fe5565b600060405180830381855afa9150503d806000811461363a576040519150601f19603f3d011682016040523d82523d6000602084013e61363f565b606091505b5091509150818015613652575080516020145b61365d57600061366e565b61366e81600063ffffffff6130ef16565b9695505050505050565b736b175474e89094c44da98b954eedeac495271d0f90565b7306af07097c9eeb7fd685c692751d5c66db49c21590565b6000806136b3613690565b6001600160a01b0316634ba2363a6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156136ed57600080fd5b505af1158015613701573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506137259190810190614a54565b90506000816001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561376457600080fd5b505af1158015613778573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061379c9190810190614c78565b421161381a57816001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156137dd57600080fd5b505af11580156137f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506138159190810190614c78565b61388d565b816001600160a01b0316639f678cca6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561385557600080fd5b505af1158015613869573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061388d9190810190614c78565b905061120d816b033b2e3c9fd0803ce800000086613986565b7f7e5a23180000000000000000000000000000000000000000000000000000000090565b6000610dc18261354c85613ceb565b7f5bd0428d0000000000000000000000000000000000000000000000000000000090565b7f20d11f610000000000000000000000000000000000000000000000000000000090565b7ff59851840000000000000000000000000000000000000000000000000000000090565b600081518351148015610dc15750508051602091820120825192909101919091201490565b600082820183811015610dc157610dc161305e60008686613da4565b600061120d8361399c868563ffffffff613c0516565b9063ffffffff613dc316565b6000828211156139c1576139c161305e60028585613da4565b50900390565b600060208251816139d457fe5b066004146139e457506000610d4d565b60006139f6838263ffffffff61308816565b90506001600160e01b031981166394cfcdd760e01b14613a1a576001915050610d4d565b606080613a2685611cd6565b80519194509250905060005b818114613aa4576000613a626000858481518110613a4c57fe5b602002602001015161308890919063ffffffff16565b90506001600160e01b0319811663012b8bc960e11b1415613a9b57613a878483613ded565b15613a9b5760009650505050505050610d4d565b50600101613a32565b5060019695505050505050565b7fe53c76c80000000000000000000000000000000000000000000000000000000090565b6060632800659560e01b848484604051602401610d8c939291906155d0565b805160208201fd5b60008160200183511015613b1d57613b1d61305e6005855185602001613ad5565b50016020015190565b60200190565b6020811015613b56576001816020036101000a038019835116818551168082178652505050613040565b82821415613b6357613040565b82821115613b9d5760208103905080820181840181515b82851015613b95578451865260209586019590940193613b7a565b905250613040565b60208103905080820181840183515b81861215613bc85782518252601f199283019290910190613bac565b85525050505050565b6000613bde848484613e50565b15613bf157613bf161305e858585613eb6565b61120d8361399c868563ffffffff613c0516565b600082613c145750600061095b565b82820282848281613c2157fe5b0414610dc157610dc161305e60018686613da4565b608081810151825160208085015160408087015160609788015186519685019690962082517fec69816980a3a3ca4554410e60253953e9ff375ba4536a98adfa15cc7154150881529485019590955290830191909152948101949094526001600160a01b039091169183019190915260a082015260c0902090565b6040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b6101408101516101608201516101808301516101a08401516000937ff80322eb8376aafb64eadf8f0d7623f22130fd9491a221e902b713cb984a753493909290916020871015613d3757fe5b601f1987018051610140890180516101608b0180516101808d0180516101a08f0180519d89528c5160209d8e012087528b519b8d019b909b2084528951998c01999099208152875197909a019690962088526101e085209390945290529190529252919091529050919050565b606063e946c1bb60e01b848484604051602401610d8c93929190615561565b600081613dd957613dd961305e60038585613da4565b6000828481613de457fe5b04949350505050565b8151600090600183015b81811015610cda57613e38858281518110613e0e57fe5b6020026020010151868681518110613e2257fe5b602002602001015161394590919063ffffffff16565b15613e485760019250505061095b565b600101613df7565b600082613e6257613e6261305e613ed5565b811580613e6d575083155b15613e7a57506000610dc1565b60008380613e8457fe5b8584099050613e99858463ffffffff613c0516565b613eab826103e863ffffffff613c0516565b101595945050505050565b606063339f3de260e01b848484604051602401610d8c93929190615737565b60408051808201909152600481527fa791837c00000000000000000000000000000000000000000000000000000000602082015290565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6040805160608101909152806000815260006020820181905260409091015290565b803561095b81615813565b600082601f830112613f78578081fd5b8135613f8b613f8682615774565b61574d565b818152915060208083019084810181840286018201871015613fac57600080fd5b60005b84811015611898578135613fc281615813565b84529282019290820190600101613faf565b600082601f830112613fe4578081fd5b8151613ff2613f8682615774565b8181529150602080830190840160005b8381101561402f5761401a876020845189010161419b565b83526020928301929190910190600101614002565b5050505092915050565b600082601f830112614049578081fd5b8135614057613f8682615774565b8181529150602080830190840160005b8381101561402f5761407f876020843589010161414d565b83526020928301929190910190600101614067565b600082601f8301126140a4578081fd5b81356140b2613f8682615774565b8181529150602080830190840160005b8381101561402f576140da87602084358901016141e1565b835260209283019291909101906001016140c2565b600082601f8301126140ff578081fd5b813561410d613f8682615774565b81815291506020808301908481018184028601820187101561412e57600080fd5b60005b8481101561189857813584529282019290820190600101614131565b600082601f83011261415d578081fd5b813561416b613f8682615794565b915080825283602082850101111561418257600080fd5b8060208401602084013760009082016020015292915050565b600082601f8301126141ab578081fd5b81516141b9613f8682615794565b91508082528360208285010111156141d057600080fd5b61189d8160208401602086016157b8565b60006101c08083850312156141f4578182fd5b6141fd8161574d565b91505061420a8383613f5d565b81526142198360208401613f5d565b602082015261422b8360408401613f5d565b604082015261423d8360608401613f5d565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013567ffffffffffffffff8082111561429f57600080fd5b6142ab8683870161414d565b838501526101609250828501359150808211156142c757600080fd5b6142d38683870161414d565b838501526101809250828501359150808211156142ef57600080fd5b6142fb8683870161414d565b838501526101a092508285013591508082111561431757600080fd5b506143248582860161414d565b82840152505092915050565b805160ff8116811461095b57600080fd5b600060208284031215614352578081fd5b8135610dc181615813565b6000806040838503121561436f578081fd5b825161437a81615813565b602084015190925061438b81615813565b809150509250929050565b6000806000606084860312156143aa578081fd5b83516143b581615813565b60208501519093506143c681615813565b604085015190925067ffffffffffffffff8111156143e2578182fd5b6143ee8682870161419b565b9150509250925092565b60008060006060848603121561440c578081fd5b835161441781615813565b602085015190935061442881615813565b80925050604084015190509250925092565b60008060006060848603121561444e578081fd5b835161445981615813565b602085015190935067ffffffffffffffff811115614475578182fd5b6144818682870161419b565b925050604084015190509250925092565b600080600080608085870312156144a7578182fd5b84516144b281615813565b602086015190945067ffffffffffffffff808211156144cf578384fd5b6144db8883890161419b565b945060408701519150808211156144f0578384fd5b6144fc8883890161419b565b93506060870151915080821115614511578283fd5b5061451e8782880161419b565b91505092959194509250565b6000806040838503121561453c578182fd5b823561454781615813565b9150602083013567ffffffffffffffff811115614562578182fd5b61456e85828601614039565b9150509250929050565b6000806000806080858703121561458d578182fd5b843561459881615813565b9350602085013567ffffffffffffffff808211156145b4578384fd5b6145c0888389016140ef565b945060408701359150808211156145d5578384fd5b6145e1888389016140ef565b935060608701359150808211156145f6578283fd5b5061451e8782880161414d565b60008060408385031215614615578182fd5b823561462081615813565b9150602083013567ffffffffffffffff81111561463b578182fd5b61456e8582860161414d565b60008060006060848603121561465b578081fd5b833561466681615813565b9250602084013567ffffffffffffffff811115614681578182fd5b61468d8682870161414d565b925050604084013590509250925092565b600080604083850312156146b0578182fd5b82356146bb81615813565b946020939093013593505050565b6000602082840312156146da578081fd5b813567ffffffffffffffff8111156146f0578182fd5b61120d84828501613f68565b600080600060608486031215614710578081fd5b833567ffffffffffffffff80821115614727578283fd5b61473387838801614094565b94506020860135915080821115614748578283fd5b61475487838801613f68565b93506040860135915080821115614769578283fd5b506143ee868287016140ef565b60008060408385031215614788578182fd5b823567ffffffffffffffff8082111561479f578384fd5b6147ab86838701614094565b935060208501359150808211156147c0578283fd5b5061456e85828601614039565b600080604083850312156147df578182fd5b823567ffffffffffffffff808211156147f6578384fd5b6147ab868387016140ef565b60008060408385031215614814578182fd5b825167ffffffffffffffff8082111561482b578384fd5b81850186601f82011261483c578485fd5b8051925061484c613f8684615774565b80848252602080830192508084018a82838902870101111561486c578889fd5b8894505b8685101561488e578051845260019490940193928101928101614870565b5088015190965093505050808211156148a5578283fd5b5061456e85828601613fd4565b6000602082840312156148c3578081fd5b81518015158114610dc1578182fd5b600080600080608085870312156148e7578182fd5b8451935060208501516148f981615813565b604086015190935067ffffffffffffffff808211156144f0578384fd5b60008060408385031215614928578182fd5b505080516020909101519092909150565b6000806040838503121561494b578182fd5b82519150602083015167ffffffffffffffff811115614968578182fd5b61456e8582860161419b565b600080600060608486031215614988578081fd5b83519250602084015167ffffffffffffffff808211156149a6578283fd5b6149b28783880161419b565b935060408601519150808211156149c7578283fd5b506143ee8682870161419b565b600080604083850312156149e6578182fd5b82519150602083015161438b81615828565b60008060408385031215614a0a578182fd5b82516001600160e01b03198116811461437a578283fd5b600060208284031215614a32578081fd5b813567ffffffffffffffff811115614a48578182fd5b61120d8482850161414d565b600060208284031215614a65578081fd5b8151610dc181615813565b600060608284031215614a81578081fd5b614a8b606061574d565b825160078110614a99578283fd5b8152602083810151908201526040928301519281019290925250919050565b600080600060608486031215614acc578081fd5b833567ffffffffffffffff811115614ae2578182fd5b614aee868287016141e1565b9350506020840135614aff81615813565b929592945050506040919091013590565b60008060408385031215614b22578182fd5b823567ffffffffffffffff80821115614b39578384fd5b614b45868387016141e1565b93506020850135915080821115614b5a578283fd5b5061456e8582860161414d565b600080600060608486031215614b7b578081fd5b833567ffffffffffffffff811115614b91578182fd5b614b9d868287016141e1565b935050602084013591506040840135614bb581615813565b809150509250925092565b600080600060608486031215614bd4578081fd5b833567ffffffffffffffff80821115614beb578283fd5b81860160a08189031215614bfd578384fd5b614c0760a061574d565b9250803583526020810135602084015260408101356040840152614c2e8860608301613f5d565b6060840152608081013582811115614c44578485fd5b614c508982840161414d565b608085015250919450505060208401359150614c6f8560408601613f5d565b90509250925092565b600060208284031215614c89578081fd5b5051919050565b60008060408385031215614ca2578182fd5b8251614cad81615828565b6020939093015192949293505050565b600080600060608486031215614cd1578081fd5b8351614cdc81615828565b602085015160408601519194509250614bb581615813565b60008060008060808587031215614d09578182fd5b614d138686614330565b9350602085015192506040850151614d2a81615813565b606086015190925067ffffffffffffffff811115614d46578182fd5b61451e8782880161419b565b600080600060608486031215614d66578081fd5b614d708585614330565b925060208401519150604084015167ffffffffffffffff8111156143e2578182fd5b600080600060608486031215614da6578081fd5b614db08585614330565b925060208401519150604084015190509250925092565b6001600160a01b03169052565b6000815180845260208401935060208301825b82811015614e0e5781516001600160a01b0316865260209586019590910190600101614de7565b5093949350505050565b600081518084526020840180819550602083028101915060208501845b84811015614e63578284038852614e4d848351614ea0565b6020988901989094509190910190600101614e35565b50919695505050505050565b6000815180845260208401935060208301825b82811015614e0e578151865260209586019590910190600101614e82565b60008151808452614eb88160208601602086016157b8565b601f01601f19169290920160200192915050565b8051614ed781615809565b825260208181015190830152604090810151910152565b60006101c0614efe848451614dc7565b6020830151614f106020860182614dc7565b506040830151614f236040860182614dc7565b506060830151614f366060860182614dc7565b506080830151608085015260a083015160a085015260c083015160c085015260e083015160e0850152610100808401518186015250610120808401518186015250610140808401518282870152614f8f83870182614ea0565b91505061016091508184015185820383870152614fac8282614ea0565b925050506101808084015185830382870152614fc88382614ea0565b9150506101a09150818401518582038387015261366e8282614ea0565b60008251614ff78184602087016157b8565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60006001600160a01b0386168252608060208301526150756080830186614e6f565b82810360408401526150878186614e6f565b83810360608501526150998186614ea0565b98975050505050505050565b60006001600160a01b0385168252606060208301526150c76060830185614ea0565b9050826040830152949350505050565b60006001600160a01b0386168252608060208301526150f96080830186614ea0565b82810360408401526150878186614ea0565b6001600160a01b03929092168252602082015260400190565b6000608082526151376080830187614e18565b82810360208401526151498187614dd4565b838103604085015261515b8187614dd4565b91505082810360608401526151708185614e6f565b979650505050505050565b602080825282518282018190526000918401906040840190835b818110156151bd578351600581106151a957fe5b835260209384019390920191600101615195565b509095945050505050565b606080825284519082018190526000906020906080840190828801845b8281101561520b576151f8848351614ecc565b60609390930192908401906001016151e5565b5050508381038285015261521f8187614e6f565b84810360408601528551808252908301915082860190845b81811015615255578251151584529284019291840191600101615237565b509198975050505050505050565b600060208252610dc16020830184614e6f565b6000604082526152896040830185614e6f565b828103602084015261529b8185614e18565b95945050505050565b6000604082526152b76040830185614e6f565b828103602084015261529b8185614e6f565b90815260200190565b60008582526001600160a01b0385166020830152608060408301526152fa6080830185614ea0565b82810360608401526151708185614ea0565b918252602082015260400190565b60008382526040602083015261120d6040830184614ea0565b60008482526060602083015261534c6060830185614ea0565b828103604084015261366e8185614ea0565b8281526040810161536e83615809565b8260208301529392505050565b6001600160e01b031991909116815260200190565b6001600160e01b03199290921682526001600160a01b0316602082015260400190565b60006001600160e01b0319861682526001600160a01b0380861660208401528085166040840152506080606083015261366e6080830184614ea0565b60006001600160e01b0319871682526001600160a01b038616602083015260a0604083015261542160a0830186614e6f565b82810360608401526154338186614e6f565b838103608085015261117f8186614ea0565b60006001600160e01b0319861682526001600160a01b0385166020830152608060408301526154776080830185614ea0565b905082606083015295945050505050565b6001600160e01b03199390931683526001600160a01b03919091166020830152604082015260600190565b60006001600160e01b031985168252606060208301526154d66060830185614e6f565b828103604084015261366e8185614e18565b600060208252610dc16020830184614ea0565b60006080825261550e6080830187614ea0565b6001600160a01b03958616602084015293909416604082015260ff9190911660609091015292915050565b6000615544856157e8565b8482528360208301526060604083015261529b6060830184614ea0565b6060810161556e856157f5565b938152602081019290925260409091015290565b6060810161558f856157ff565b93815260208101929092526001600160a01b031660409091015290565b604081016155b9846157f5565b9281526020015290565b6060810161556e856157ff565b606081016008851061556e57fe5b60208101600583106155ec57fe5b91905290565b60006155fd86615809565b8582528460208301526001600160a01b03841660408301526080606083015261366e6080830184614ea0565b604081016155b9846157e8565b60208082526013908201527f554e4b4e4f574e5f52455455524e5f4441544100000000000000000000000000604082015260600190565b6020808252600c908201527f4241445f53454c4543544f520000000000000000000000000000000000000000604082015260600190565b6020808252600e908201527f57524f4e475f50524f58595f4944000000000000000000000000000000000000604082015260600190565b60a081016156e98286614ecc565b8360608301528215156080830152949350505050565b600060208252610dc16020830184614eee565b6000604082526157256040830185614eee565b828103602084015261529b8185614ea0565b9283526020830191909152604082015260600190565b60405181810167ffffffffffffffff8111828210171561576c57600080fd5b604052919050565b600067ffffffffffffffff82111561578a578081fd5b5060209081020190565b600067ffffffffffffffff8211156157aa578081fd5b50601f01601f191660200190565b60005b838110156157d35781810151838201526020016157bb565b838111156157e2576000848401525b50505050565b600281106157f257fe5b50565b600481106157f257fe5b600381106157f257fe5b600781106157f257fe5b6001600160a01b03811681146157f257600080fd5b60ff811681146157f257600080fdfea365627a7a72315820b8f5e1baee716487ac576e78a6a19b92db1db8535a5a9d8ed8a3c9e3e2968a386c6578706572696d656e74616cf564736f6c63430005100040" } } }, @@ -1077,7 +1038,7 @@ "settings": { "optimizer": { "enabled": true, - "runs": 200, + "runs": 5000, "details": { "yul": true, "deduplicate": true, "cse": true, "constantOptimizer": true } }, "outputSelection": { diff --git a/packages/contract-artifacts/artifacts/LibTransactionDecoder.json b/packages/contract-artifacts/artifacts/LibTransactionDecoder.json new file mode 100644 index 0000000000..7aaf6848c9 --- /dev/null +++ b/packages/contract-artifacts/artifacts/LibTransactionDecoder.json @@ -0,0 +1,84 @@ +{ + "schemaVersion": "2.0.0", + "contractName": "LibTransactionDecoder", + "compilerOutput": { + "abi": [ + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "transactionData", "type": "bytes" }], + "name": "decodeZeroExTransactionData", + "outputs": [ + { "internalType": "string", "name": "functionName", "type": "string" }, + { + "components": [ + { "internalType": "address", "name": "makerAddress", "type": "address" }, + { "internalType": "address", "name": "takerAddress", "type": "address" }, + { "internalType": "address", "name": "feeRecipientAddress", "type": "address" }, + { "internalType": "address", "name": "senderAddress", "type": "address" }, + { "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "makerFee", "type": "uint256" }, + { "internalType": "uint256", "name": "takerFee", "type": "uint256" }, + { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" }, + { "internalType": "uint256", "name": "salt", "type": "uint256" }, + { "internalType": "bytes", "name": "makerAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "takerAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" }, + { "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" } + ], + "internalType": "struct LibOrder.Order[]", + "name": "orders", + "type": "tuple[]" + }, + { "internalType": "uint256[]", "name": "takerAssetFillAmounts", "type": "uint256[]" }, + { "internalType": "bytes[]", "name": "signatures", "type": "bytes[]" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + } + ], + "devdoc": { + "methods": { + "decodeZeroExTransactionData(bytes)": { + "details": "Decodes the call data for an Exchange contract method call.", + "params": { "transactionData": "ABI-encoded calldata for an Exchange contract method call." }, + "return": "The name of the function called, and the parameters it was given. For single-order fills and cancels, the arrays will have just one element." + } + } + }, + "evm": { + "bytecode": { + "object": "0x608060405234801561001057600080fd5b5061198b806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80636f83188e14610030575b600080fd5b61004361003e3660046113f4565b61005c565b604051610053949392919061176e565b60405180910390f35b60608080806000610073868263ffffffff610ba616565b90506001600160e01b031981167fdedfc1f10000000000000000000000000000000000000000000000000000000014156100e4576040518060400160405280601181526020017f626174636843616e63656c4f7264657273000000000000000000000000000000815250945061067c565b6001600160e01b031981167f9694a402000000000000000000000000000000000000000000000000000000001415610153576040518060400160405280600f81526020017f626174636846696c6c4f72646572730000000000000000000000000000000000815250945061067c565b6001600160e01b031981167f8ea8dfe40000000000000000000000000000000000000000000000000000000014156101c2576040518060400160405280601681526020017f626174636846696c6c4f72646572734e6f5468726f7700000000000000000000815250945061067c565b6001600160e01b031981167fbeee2e14000000000000000000000000000000000000000000000000000000001415610231576040518060400160405280601581526020017f626174636846696c6c4f724b696c6c4f72646572730000000000000000000000815250945061067c565b6001600160e01b031981167f2da629870000000000000000000000000000000000000000000000000000000014156102a0576040518060400160405280600b81526020017f63616e63656c4f72646572000000000000000000000000000000000000000000815250945061067c565b6001600160e01b031981167f9b44d55600000000000000000000000000000000000000000000000000000000141561030f576040518060400160405280600981526020017f66696c6c4f726465720000000000000000000000000000000000000000000000815250945061067c565b6001600160e01b031981167fe14b58c400000000000000000000000000000000000000000000000000000000141561037e576040518060400160405280600f81526020017f66696c6c4f724b696c6c4f726465720000000000000000000000000000000000815250945061067c565b6001600160e01b031981167f78d29ac10000000000000000000000000000000000000000000000000000000014156103ed576040518060400160405280601681526020017f6d61726b65744275794f72646572734e6f5468726f7700000000000000000000815250945061067c565b6001600160e01b031981167f369da09900000000000000000000000000000000000000000000000000000000141561045c576040518060400160405280601781526020017f6d61726b657453656c6c4f72646572734e6f5468726f77000000000000000000815250945061067c565b6001600160e01b031981167f8bc8efb30000000000000000000000000000000000000000000000000000000014156104cb576040518060400160405280601981526020017f6d61726b65744275794f726465727346696c6c4f724b696c6c00000000000000815250945061067c565b6001600160e01b031981167fa6c3bf3300000000000000000000000000000000000000000000000000000000141561053a576040518060400160405280601a81526020017f6d61726b657453656c6c4f726465727346696c6c4f724b696c6c000000000000815250945061067c565b6001600160e01b031981167f88ec79fb0000000000000000000000000000000000000000000000000000000014156105a9576040518060400160405280600b81526020017f6d617463684f7264657273000000000000000000000000000000000000000000815250945061067c565b6001600160e01b031981167f4f9559b100000000000000000000000000000000000000000000000000000000148061060a57506001600160e01b031981167f2280c91000000000000000000000000000000000000000000000000000000000145b1561064a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106419061186d565b60405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064190611836565b6001600160e01b031981167fdedfc1f10000000000000000000000000000000000000000000000000000000014156107215785516106c490879060049063ffffffff610be916565b8060200190516106d79190810190611289565b604080516000808252602082019092529195505b5060408051600080825260208201909252919450610719565b60608152602001906001900390816107045790505b509150610b9e565b6001600160e01b031981167fbeee2e1400000000000000000000000000000000000000000000000000000000148061078257506001600160e01b031981167f9694a40200000000000000000000000000000000000000000000000000000000145b806107b657506001600160e01b031981167f8ea8dfe400000000000000000000000000000000000000000000000000000000145b156107d0576107c486610c70565b91955093509150610b9e565b6001600160e01b031981167f2da629870000000000000000000000000000000000000000000000000000000014156108b85760408051600180825281830190925290816020015b61081f610f3d565b815260200190600190039081610817575050865190945061084a90879060049063ffffffff610be916565b80602001905161085d919081019061146b565b8460008151811061086a57fe5b602002602001018190525060006040519080825280602002602001820160405280156106eb578160200160208202803883390190505060408051600080825260208201909252919450610719565b6001600160e01b031981167fe14b58c400000000000000000000000000000000000000000000000000000000148061091957506001600160e01b031981167f9b44d55600000000000000000000000000000000000000000000000000000000145b15610927576107c486610cac565b6001600160e01b031981167f78d29ac100000000000000000000000000000000000000000000000000000000148061098857506001600160e01b031981167f369da09900000000000000000000000000000000000000000000000000000000145b806109bc57506001600160e01b031981167f8bc8efb300000000000000000000000000000000000000000000000000000000145b806109f057506001600160e01b031981167fa6c3bf3300000000000000000000000000000000000000000000000000000000145b156109fe576107c486610da6565b6001600160e01b031981167f88ec79fb000000000000000000000000000000000000000000000000000000001415610b9e57610a38610f3d565b610a40610f3d565b606080610a5a60048b518c610be99092919063ffffffff16565b806020019051610a6d919081019061149e565b604080516002808252606082019092529498509296509094509250816020015b610a95610f3d565b815260200190600190039081610a8d5790505097508388600081518110610ab857fe5b60200260200101819052508288600181518110610ad157fe5b602090810291909101015260408051600280825260608201909252908160200160208202803883390190505096508360a0015187600081518110610b1157fe5b6020026020010181815250508260a0015187600181518110610b2f57fe5b60209081029190910101526040805160028082526060820190925290816020015b6060815260200190600190039081610b505790505095508186600081518110610b7557fe5b60200260200101819052508086600181518110610b8e57fe5b6020026020010181905250505050505b509193509193565b60008160040183511015610bcc57610bcc610bc76003855185600401610e1a565b610e89565b5060208183018101519101906001600160e01b0319165b92915050565b606081831115610c0257610c02610bc760008585610e1a565b8351821115610c1b57610c1b610bc76001848751610e1a565b8282036040519080825280601f01601f191660200182016040528015610c48576020820181803883390190505b509050610c69610c5782610e91565b84610c6187610e91565b018351610e97565b9392505050565b6060806060610c8c6004855186610be99092919063ffffffff16565b806020019051610c9f91908101906112c4565b9196909550909350915050565b60408051600180825281830190925260609182918291816020015b610ccf610f3d565b815260200190600190039081610cc75750506040805160018082528183019092529194506020808301908038833901905050604080516001808252818301909252919350816020015b6060815260200190600190039081610d185750508451909150610d4590859060049063ffffffff610be916565b806020019051610d589190810190611546565b85600081518110610d6557fe5b6020026020010185600081518110610d7957fe5b6020026020010185600081518110610d8d57fe5b6020908102919091010192909252919052529193909250565b604080516001808252818301909252606091829182916020808301908038833950508551919350610de29186915060049063ffffffff610be916565b806020019051610df591908101906113a1565b84518590600090610e0257fe5b60209081029190910101919091529095929450925050565b6060632800659560e01b848484604051602401610e399392919061174c565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b03199093169290921790915290509392505050565b805160208201fd5b60200190565b6020811015610ec1576001816020036101000a038019835116818551168082178652505050610f38565b82821415610ece57610f38565b82821115610f085760208103905080820181840181515b82851015610f00578451865260209586019590940193610ee5565b905250610f38565b60208103905080820181840183515b81861215610f335782518252601f199283019290910190610f17565b855250505b505050565b604051806101c00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001606081526020016060815260200160608152602001606081525090565b805173ffffffffffffffffffffffffffffffffffffffff81168114610be357600080fd5b600082601f830112611038578081fd5b815161104b611046826118cb565b6118a4565b8181529150602080830190840160005b838110156110885761107387602084518901016110ed565b8352602092830192919091019060010161105b565b5050505092915050565b600082601f8301126110a2578081fd5b81516110b0611046826118cb565b8181529150602080830190840160005b83811015611088576110d8876020845189010161113a565b835260209283019291909101906001016110c0565b600082601f8301126110fd578081fd5b815161110b611046826118eb565b915080825283602082850101111561112257600080fd5b611133816020840160208601611918565b5092915050565b60006101c080838503121561114d578182fd5b611156816118a4565b9150506111638383611004565b81526111728360208401611004565b60208201526111848360408401611004565b60408201526111968360608401611004565b60608201526080820151608082015260a082015160a082015260c082015160c082015260e082015160e08201526101008083015181830152506101208083015181830152506101408083015167ffffffffffffffff808211156111f857600080fd5b611204868387016110ed565b8385015261016092508285015191508082111561122057600080fd5b61122c868387016110ed565b8385015261018092508285015191508082111561124857600080fd5b611254868387016110ed565b838501526101a092508285015191508082111561127057600080fd5b5061127d858286016110ed565b82840152505092915050565b60006020828403121561129a578081fd5b815167ffffffffffffffff8111156112b0578182fd5b6112bc84828501611092565b949350505050565b6000806000606084860312156112d8578182fd5b835167ffffffffffffffff808211156112ef578384fd5b6112fb87838801611092565b9450602091508186015181811115611311578485fd5b80870188601f820112611322578586fd5b80519150611332611046836118cb565b82815284810190828601868502840187018c101561134e578889fd5b8893505b84841015611370578051835260019390930192918601918601611352565b5060408a015190975094505050508082111561138a578283fd5b5061139786828701611028565b9150509250925092565b6000806000606084860312156113b5578283fd5b835167ffffffffffffffff808211156113cc578485fd5b6113d887838801611092565b945060208601519350604086015191508082111561138a578283fd5b600060208284031215611405578081fd5b813567ffffffffffffffff81111561141b578182fd5b80830184601f82011261142c578283fd5b8035915061143c611046836118eb565b828152856020848401011115611450578384fd5b82602083016020830137918201602001929092529392505050565b60006020828403121561147c578081fd5b815167ffffffffffffffff811115611492578182fd5b6112bc8482850161113a565b600080600080608085870312156114b3578081fd5b845167ffffffffffffffff808211156114ca578283fd5b6114d68883890161113a565b955060208701519150808211156114eb578283fd5b6114f78883890161113a565b9450604087015191508082111561150c578283fd5b611518888389016110ed565b9350606087015191508082111561152d578283fd5b5061153a878288016110ed565b91505092959194509250565b60008060006060848603121561155a578283fd5b835167ffffffffffffffff80821115611571578485fd5b61157d8783880161113a565b9450602086015193506040860151915080821115611599578283fd5b50611397868287016110ed565b60006101c06115b68484516116af565b60208301516115c860208601826116af565b5060408301516115db60408601826116af565b5060608301516115ee60608601826116af565b506080830151608085015260a083015160a085015260c083015160c085015260e083015160e085015261010080840151818601525061012080840151818601525061014080840151828287015261164783870182611720565b915050610160915081840151858203838701526116648282611720565b9250505061018080840151858303828701526116808382611720565b9150506101a09150818401518582038387015261169d8282611720565b9695505050505050565b815260200190565b73ffffffffffffffffffffffffffffffffffffffff169052565b600081518084526020840180819550602083028101915060208501845b848110156117145782840388526116fe848351611720565b60209889019890945091909101906001016116e6565b50919695505050505050565b60008151808452611738816020860160208601611918565b601f01601f19169290920160200192915050565b606081016008851061175a57fe5b938152602081019290925260409091015290565b6000608082526117816080830187611720565b602083820381850152818751611797818561190f565b91508193508281028201838a01865b838110156117d05786830385526117be8383516115a6565b948601949250908501906001016117a6565b50508681036040880152809450885192506117eb838261190f565b94505050818701845b82811015611815576118078583516116a7565b9450908301906001016117f4565b50505050828103606084015261182b81856116c9565b979650505050505050565b60208082526019908201527f554e4b4e4f574e5f46554e4354494f4e5f53454c4543544f5200000000000000604082015260600190565b6020808252600d908201527f554e494d504c454d454e54454400000000000000000000000000000000000000604082015260600190565b60405181810167ffffffffffffffff811182821017156118c357600080fd5b604052919050565b600067ffffffffffffffff8211156118e1578081fd5b5060209081020190565b600067ffffffffffffffff821115611901578081fd5b50601f01601f191660200190565b90815260200190565b60005b8381101561193357818101518382015260200161191b565b83811115611942576000848401525b5050505056fea365627a7a72315820884abdfe69fd82b726a34318b3e10d0da6e8c516e328d10258429ee105f0ad396c6578706572696d656e74616cf564736f6c63430005100040" + }, + "deployedBytecode": { + "object": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80636f83188e14610030575b600080fd5b61004361003e3660046113f4565b61005c565b604051610053949392919061176e565b60405180910390f35b60608080806000610073868263ffffffff610ba616565b90506001600160e01b031981167fdedfc1f10000000000000000000000000000000000000000000000000000000014156100e4576040518060400160405280601181526020017f626174636843616e63656c4f7264657273000000000000000000000000000000815250945061067c565b6001600160e01b031981167f9694a402000000000000000000000000000000000000000000000000000000001415610153576040518060400160405280600f81526020017f626174636846696c6c4f72646572730000000000000000000000000000000000815250945061067c565b6001600160e01b031981167f8ea8dfe40000000000000000000000000000000000000000000000000000000014156101c2576040518060400160405280601681526020017f626174636846696c6c4f72646572734e6f5468726f7700000000000000000000815250945061067c565b6001600160e01b031981167fbeee2e14000000000000000000000000000000000000000000000000000000001415610231576040518060400160405280601581526020017f626174636846696c6c4f724b696c6c4f72646572730000000000000000000000815250945061067c565b6001600160e01b031981167f2da629870000000000000000000000000000000000000000000000000000000014156102a0576040518060400160405280600b81526020017f63616e63656c4f72646572000000000000000000000000000000000000000000815250945061067c565b6001600160e01b031981167f9b44d55600000000000000000000000000000000000000000000000000000000141561030f576040518060400160405280600981526020017f66696c6c4f726465720000000000000000000000000000000000000000000000815250945061067c565b6001600160e01b031981167fe14b58c400000000000000000000000000000000000000000000000000000000141561037e576040518060400160405280600f81526020017f66696c6c4f724b696c6c4f726465720000000000000000000000000000000000815250945061067c565b6001600160e01b031981167f78d29ac10000000000000000000000000000000000000000000000000000000014156103ed576040518060400160405280601681526020017f6d61726b65744275794f72646572734e6f5468726f7700000000000000000000815250945061067c565b6001600160e01b031981167f369da09900000000000000000000000000000000000000000000000000000000141561045c576040518060400160405280601781526020017f6d61726b657453656c6c4f72646572734e6f5468726f77000000000000000000815250945061067c565b6001600160e01b031981167f8bc8efb30000000000000000000000000000000000000000000000000000000014156104cb576040518060400160405280601981526020017f6d61726b65744275794f726465727346696c6c4f724b696c6c00000000000000815250945061067c565b6001600160e01b031981167fa6c3bf3300000000000000000000000000000000000000000000000000000000141561053a576040518060400160405280601a81526020017f6d61726b657453656c6c4f726465727346696c6c4f724b696c6c000000000000815250945061067c565b6001600160e01b031981167f88ec79fb0000000000000000000000000000000000000000000000000000000014156105a9576040518060400160405280600b81526020017f6d617463684f7264657273000000000000000000000000000000000000000000815250945061067c565b6001600160e01b031981167f4f9559b100000000000000000000000000000000000000000000000000000000148061060a57506001600160e01b031981167f2280c91000000000000000000000000000000000000000000000000000000000145b1561064a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106419061186d565b60405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064190611836565b6001600160e01b031981167fdedfc1f10000000000000000000000000000000000000000000000000000000014156107215785516106c490879060049063ffffffff610be916565b8060200190516106d79190810190611289565b604080516000808252602082019092529195505b5060408051600080825260208201909252919450610719565b60608152602001906001900390816107045790505b509150610b9e565b6001600160e01b031981167fbeee2e1400000000000000000000000000000000000000000000000000000000148061078257506001600160e01b031981167f9694a40200000000000000000000000000000000000000000000000000000000145b806107b657506001600160e01b031981167f8ea8dfe400000000000000000000000000000000000000000000000000000000145b156107d0576107c486610c70565b91955093509150610b9e565b6001600160e01b031981167f2da629870000000000000000000000000000000000000000000000000000000014156108b85760408051600180825281830190925290816020015b61081f610f3d565b815260200190600190039081610817575050865190945061084a90879060049063ffffffff610be916565b80602001905161085d919081019061146b565b8460008151811061086a57fe5b602002602001018190525060006040519080825280602002602001820160405280156106eb578160200160208202803883390190505060408051600080825260208201909252919450610719565b6001600160e01b031981167fe14b58c400000000000000000000000000000000000000000000000000000000148061091957506001600160e01b031981167f9b44d55600000000000000000000000000000000000000000000000000000000145b15610927576107c486610cac565b6001600160e01b031981167f78d29ac100000000000000000000000000000000000000000000000000000000148061098857506001600160e01b031981167f369da09900000000000000000000000000000000000000000000000000000000145b806109bc57506001600160e01b031981167f8bc8efb300000000000000000000000000000000000000000000000000000000145b806109f057506001600160e01b031981167fa6c3bf3300000000000000000000000000000000000000000000000000000000145b156109fe576107c486610da6565b6001600160e01b031981167f88ec79fb000000000000000000000000000000000000000000000000000000001415610b9e57610a38610f3d565b610a40610f3d565b606080610a5a60048b518c610be99092919063ffffffff16565b806020019051610a6d919081019061149e565b604080516002808252606082019092529498509296509094509250816020015b610a95610f3d565b815260200190600190039081610a8d5790505097508388600081518110610ab857fe5b60200260200101819052508288600181518110610ad157fe5b602090810291909101015260408051600280825260608201909252908160200160208202803883390190505096508360a0015187600081518110610b1157fe5b6020026020010181815250508260a0015187600181518110610b2f57fe5b60209081029190910101526040805160028082526060820190925290816020015b6060815260200190600190039081610b505790505095508186600081518110610b7557fe5b60200260200101819052508086600181518110610b8e57fe5b6020026020010181905250505050505b509193509193565b60008160040183511015610bcc57610bcc610bc76003855185600401610e1a565b610e89565b5060208183018101519101906001600160e01b0319165b92915050565b606081831115610c0257610c02610bc760008585610e1a565b8351821115610c1b57610c1b610bc76001848751610e1a565b8282036040519080825280601f01601f191660200182016040528015610c48576020820181803883390190505b509050610c69610c5782610e91565b84610c6187610e91565b018351610e97565b9392505050565b6060806060610c8c6004855186610be99092919063ffffffff16565b806020019051610c9f91908101906112c4565b9196909550909350915050565b60408051600180825281830190925260609182918291816020015b610ccf610f3d565b815260200190600190039081610cc75750506040805160018082528183019092529194506020808301908038833901905050604080516001808252818301909252919350816020015b6060815260200190600190039081610d185750508451909150610d4590859060049063ffffffff610be916565b806020019051610d589190810190611546565b85600081518110610d6557fe5b6020026020010185600081518110610d7957fe5b6020026020010185600081518110610d8d57fe5b6020908102919091010192909252919052529193909250565b604080516001808252818301909252606091829182916020808301908038833950508551919350610de29186915060049063ffffffff610be916565b806020019051610df591908101906113a1565b84518590600090610e0257fe5b60209081029190910101919091529095929450925050565b6060632800659560e01b848484604051602401610e399392919061174c565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b03199093169290921790915290509392505050565b805160208201fd5b60200190565b6020811015610ec1576001816020036101000a038019835116818551168082178652505050610f38565b82821415610ece57610f38565b82821115610f085760208103905080820181840181515b82851015610f00578451865260209586019590940193610ee5565b905250610f38565b60208103905080820181840183515b81861215610f335782518252601f199283019290910190610f17565b855250505b505050565b604051806101c00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001606081526020016060815260200160608152602001606081525090565b805173ffffffffffffffffffffffffffffffffffffffff81168114610be357600080fd5b600082601f830112611038578081fd5b815161104b611046826118cb565b6118a4565b8181529150602080830190840160005b838110156110885761107387602084518901016110ed565b8352602092830192919091019060010161105b565b5050505092915050565b600082601f8301126110a2578081fd5b81516110b0611046826118cb565b8181529150602080830190840160005b83811015611088576110d8876020845189010161113a565b835260209283019291909101906001016110c0565b600082601f8301126110fd578081fd5b815161110b611046826118eb565b915080825283602082850101111561112257600080fd5b611133816020840160208601611918565b5092915050565b60006101c080838503121561114d578182fd5b611156816118a4565b9150506111638383611004565b81526111728360208401611004565b60208201526111848360408401611004565b60408201526111968360608401611004565b60608201526080820151608082015260a082015160a082015260c082015160c082015260e082015160e08201526101008083015181830152506101208083015181830152506101408083015167ffffffffffffffff808211156111f857600080fd5b611204868387016110ed565b8385015261016092508285015191508082111561122057600080fd5b61122c868387016110ed565b8385015261018092508285015191508082111561124857600080fd5b611254868387016110ed565b838501526101a092508285015191508082111561127057600080fd5b5061127d858286016110ed565b82840152505092915050565b60006020828403121561129a578081fd5b815167ffffffffffffffff8111156112b0578182fd5b6112bc84828501611092565b949350505050565b6000806000606084860312156112d8578182fd5b835167ffffffffffffffff808211156112ef578384fd5b6112fb87838801611092565b9450602091508186015181811115611311578485fd5b80870188601f820112611322578586fd5b80519150611332611046836118cb565b82815284810190828601868502840187018c101561134e578889fd5b8893505b84841015611370578051835260019390930192918601918601611352565b5060408a015190975094505050508082111561138a578283fd5b5061139786828701611028565b9150509250925092565b6000806000606084860312156113b5578283fd5b835167ffffffffffffffff808211156113cc578485fd5b6113d887838801611092565b945060208601519350604086015191508082111561138a578283fd5b600060208284031215611405578081fd5b813567ffffffffffffffff81111561141b578182fd5b80830184601f82011261142c578283fd5b8035915061143c611046836118eb565b828152856020848401011115611450578384fd5b82602083016020830137918201602001929092529392505050565b60006020828403121561147c578081fd5b815167ffffffffffffffff811115611492578182fd5b6112bc8482850161113a565b600080600080608085870312156114b3578081fd5b845167ffffffffffffffff808211156114ca578283fd5b6114d68883890161113a565b955060208701519150808211156114eb578283fd5b6114f78883890161113a565b9450604087015191508082111561150c578283fd5b611518888389016110ed565b9350606087015191508082111561152d578283fd5b5061153a878288016110ed565b91505092959194509250565b60008060006060848603121561155a578283fd5b835167ffffffffffffffff80821115611571578485fd5b61157d8783880161113a565b9450602086015193506040860151915080821115611599578283fd5b50611397868287016110ed565b60006101c06115b68484516116af565b60208301516115c860208601826116af565b5060408301516115db60408601826116af565b5060608301516115ee60608601826116af565b506080830151608085015260a083015160a085015260c083015160c085015260e083015160e085015261010080840151818601525061012080840151818601525061014080840151828287015261164783870182611720565b915050610160915081840151858203838701526116648282611720565b9250505061018080840151858303828701526116808382611720565b9150506101a09150818401518582038387015261169d8282611720565b9695505050505050565b815260200190565b73ffffffffffffffffffffffffffffffffffffffff169052565b600081518084526020840180819550602083028101915060208501845b848110156117145782840388526116fe848351611720565b60209889019890945091909101906001016116e6565b50919695505050505050565b60008151808452611738816020860160208601611918565b601f01601f19169290920160200192915050565b606081016008851061175a57fe5b938152602081019290925260409091015290565b6000608082526117816080830187611720565b602083820381850152818751611797818561190f565b91508193508281028201838a01865b838110156117d05786830385526117be8383516115a6565b948601949250908501906001016117a6565b50508681036040880152809450885192506117eb838261190f565b94505050818701845b82811015611815576118078583516116a7565b9450908301906001016117f4565b50505050828103606084015261182b81856116c9565b979650505050505050565b60208082526019908201527f554e4b4e4f574e5f46554e4354494f4e5f53454c4543544f5200000000000000604082015260600190565b6020808252600d908201527f554e494d504c454d454e54454400000000000000000000000000000000000000604082015260600190565b60405181810167ffffffffffffffff811182821017156118c357600080fd5b604052919050565b600067ffffffffffffffff8211156118e1578081fd5b5060209081020190565b600067ffffffffffffffff821115611901578081fd5b50601f01601f191660200190565b90815260200190565b60005b8381101561193357818101518382015260200161191b565b83811115611942576000848401525b5050505056fea365627a7a72315820884abdfe69fd82b726a34318b3e10d0da6e8c516e328d10258429ee105f0ad396c6578706572696d656e74616cf564736f6c63430005100040" + } + } + }, + "compiler": { + "name": "solc", + "version": "soljson-v0.5.16+commit.9c3226ce.js", + "settings": { + "optimizer": { + "enabled": true, + "runs": 5000, + "details": { "yul": true, "deduplicate": true, "cse": true, "constantOptimizer": true } + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "devdoc", + "evm.bytecode.object", + "evm.bytecode.sourceMap", + "evm.deployedBytecode.object", + "evm.deployedBytecode.sourceMap" + ] + } + }, + "evmVersion": "istanbul" + } + }, + "chains": {} +} diff --git a/packages/contract-artifacts/src/index.ts b/packages/contract-artifacts/src/index.ts index c9f07ebfb6..f4678b2976 100644 --- a/packages/contract-artifacts/src/index.ts +++ b/packages/contract-artifacts/src/index.ts @@ -15,6 +15,7 @@ import * as Forwarder from '../artifacts/Forwarder.json'; import * as IAssetProxy from '../artifacts/IAssetProxy.json'; import * as IValidator from '../artifacts/IValidator.json'; import * as IWallet from '../artifacts/IWallet.json'; +import * as LibTransactionDecoder from '../artifacts/LibTransactionDecoder.json'; import * as MultiAssetProxy from '../artifacts/MultiAssetProxy.json'; import * as Staking from '../artifacts/Staking.json'; import * as StakingProxy from '../artifacts/StakingProxy.json'; @@ -42,6 +43,7 @@ export { IAssetProxy, IValidator, IWallet, + LibTransactionDecoder, MultiAssetProxy, StaticCallProxy, WETH9, diff --git a/packages/contract-artifacts/tsconfig.json b/packages/contract-artifacts/tsconfig.json index 36866ab760..681825c0cf 100644 --- a/packages/contract-artifacts/tsconfig.json +++ b/packages/contract-artifacts/tsconfig.json @@ -19,6 +19,7 @@ "./artifacts/ERC721Token.json", "./artifacts/Exchange.json", "./artifacts/Forwarder.json", + "./artifacts/LibTransactionDecoder.json", "./artifacts/IAssetProxy.json", "./artifacts/IValidator.json", "./artifacts/IWallet.json", diff --git a/packages/contract-wrappers/package.json b/packages/contract-wrappers/package.json index 585035a1aa..261695c63d 100644 --- a/packages/contract-wrappers/package.json +++ b/packages/contract-wrappers/package.json @@ -31,7 +31,7 @@ "wrappers:generate": "abi-gen --abis ${npm_package_config_abis} --output src/generated-wrappers --backend ethers" }, "config": { - "abis": "../contract-artifacts/artifacts/@(DevUtils|ERC20Token|ERC721Token|Exchange|Forwarder|IAssetData|WETH9|Coordinator|Staking|StakingProxy|IERC20BridgeSampler).json" + "abis": "../contract-artifacts/artifacts/@(DevUtils|ERC20Token|ERC721Token|Exchange|Forwarder|IAssetData|LibTransactionDecoder|WETH9|Coordinator|Staking|StakingProxy|IERC20BridgeSampler).json" }, "repository": { "type": "git", diff --git a/packages/contract-wrappers/src/contract_wrappers.ts b/packages/contract-wrappers/src/contract_wrappers.ts index 03889ff778..3057564899 100644 --- a/packages/contract-wrappers/src/contract_wrappers.ts +++ b/packages/contract-wrappers/src/contract_wrappers.ts @@ -11,6 +11,7 @@ import { ERC20TokenContract } from './generated-wrappers/erc20_token'; import { ERC721TokenContract } from './generated-wrappers/erc721_token'; import { ExchangeContract } from './generated-wrappers/exchange'; import { ForwarderContract } from './generated-wrappers/forwarder'; +import { LibTransactionDecoderContract } from './generated-wrappers/lib_transaction_decoder'; import { StakingContract } from './generated-wrappers/staking'; import { WETH9Contract } from './generated-wrappers/weth9'; import { ContractWrappersConfig } from './types'; @@ -46,9 +47,13 @@ export class ContractWrappers { */ public coordinator: CoordinatorContract; /** - * An instance of the StakingContract class containing methods for interacting with the Coordinator extension contract. + * An instance of the StakingContract class containing methods for interacting with the Staking contracts. */ public staking: StakingContract; + /** + * An instance of the LibTransactionDecoder class containing methods for interacting with the LibTransactionDecoder smart contract. + */ + public libTransactionDecoder: LibTransactionDecoderContract; private readonly _web3Wrapper: Web3Wrapper; /** @@ -73,6 +78,7 @@ export class ContractWrappers { ForwarderContract, StakingContract, WETH9Contract, + LibTransactionDecoderContract, ]; contractsArray.forEach(contract => { this._web3Wrapper.abiDecoder.addABI(contract.ABI(), contract.contractName); @@ -87,6 +93,10 @@ export class ContractWrappers { this.staking = new StakingContract(contractAddresses.stakingProxy, this.getProvider()); this.devUtils = new DevUtilsContract(contractAddresses.devUtils, this.getProvider()); this.coordinator = new CoordinatorContract(contractAddresses.coordinator, this.getProvider()); + this.libTransactionDecoder = new LibTransactionDecoderContract( + contractAddresses.libTransactionDecoder, + this.getProvider(), + ); this.contractAddresses = contractAddresses; } /** diff --git a/packages/contract-wrappers/src/generated-wrappers/dev_utils.ts b/packages/contract-wrappers/src/generated-wrappers/dev_utils.ts index 58e9bae473..bb24dc4a88 100644 --- a/packages/contract-wrappers/src/generated-wrappers/dev_utils.ts +++ b/packages/contract-wrappers/src/generated-wrappers/dev_utils.ts @@ -40,7 +40,7 @@ export class DevUtilsContract extends BaseContract { * @ignore */ public static deployedBytecode = - '0x608060405234801561001057600080fd5b506004361061027f5760003560e01c80638f4ce4791161015c578063c26cfecd116100ce578063d3d862d111610087578063d3d862d1146106d7578063d4695028146106ea578063e25cabf71461070a578063e4e6e7da1461072c578063e77286eb1461074d578063ee4f5a941461076f5761027f565b8063c26cfecd14610652578063ca49f47c1461065a578063cafd3a071461067d578063d001c5dc1461069e578063d186037f146106b1578063d3637905146106c45761027f565b8063a5cd62ba11610120578063a5cd62ba146105a6578063a6627e9f146105c6578063acaedc74146105d9578063b43cffe1146105fc578063bbb2dcf61461060f578063bc03f964146106315761027f565b80638f4ce479146105265780639a7e7526146105395780639eadc8351461055c578063a070cac814610580578063a0901e51146105935761027f565b80634dfdac20116101f5578063750bdb30116101b9578063750bdb301461047b5780637914b2ec1461049e5780637982653e146104bf57806379c9c426146104df5780637b66ad34146104f25780637d727512146105135761027f565b80634dfdac20146103e3578063590aa8751461040357806363eb39921461042357806365129042146104365780636f83188e146104585761027f565b8063314853ff11610247578063314853ff14610333578063327d30541461035557806332aae3ad146103685780633db6dc611461038a578063459be5e2146103ad57806346eb65cb146103ce5761027f565b806302d0aec31461028457806304a5618a146102ae5780630d7b7d76146102d0578063165979e1146102f15780632322cf7614610313575b600080fd5b610297610292366004614f2f565b610791565b6040516102a5929190615948565b60405180910390f35b6102c16102bc366004614f2f565b6107ed565b6040516102a593929190615a76565b6102e36102de366004614a77565b610868565b6040516102a59291906158f6565b6103046102ff366004614f2f565b61088a565b6040516102a593929190615bb1565b610326610321366004614a77565b6108e7565b6040516102a591906158b1565b610346610341366004614f2f565b61090f565b6040516102a59392919061591d565b6102e3610363366004614f2f565b610956565b61037b610376366004614f2f565b610998565b6040516102a593929190615b26565b61039d610398366004614f2f565b6109eb565b6040516102a594939291906158ba565b6103c06103bb366004614f2f565b610a35565b6040516102a5929190615b9a565b6103e16103dc366004614f2f565b610a8b565b005b6103f66103f13660046149a0565b610ba9565b6040516102a5919061584b565b6104166104113660046147ba565b610c2c565b6040516102a59190615ad5565b610416610431366004614aba565b610c82565b610449610444366004614f2f565b610cdf565b6040516102a593929190615612565b61046b610466366004614f2f565b610d19565b6040516102a59493929190615c26565b61048e610489366004614f2f565b611526565b6040516102a5949392919061599d565b6104b16104ac366004614f2f565b6115a4565b6040516102a592919061597a565b6104d26104cd366004614ff7565b6115dc565b6040516102a59190615bcc565b6103266104ed3660046151a6565b611863565b610505610500366004614f2f565b6118c2565b6040516102a59291906155f8565b610326610521366004614a77565b6118fa565b6104b1610534366004614f2f565b611ea2565b61054c610547366004614f2f565b611eff565b6040516102a59493929190615bdf565b61056f61056a366004614f2f565b611f60565b6040516102a59594939291906159d9565b61032661058e3660046150a4565b611fd8565b6103f66105a1366004614b3b565b61202f565b6105b96105b4366004614b9f565b6120a8565b6040516102a59190615764565b6104166105d4366004614b10565b61216b565b6105ec6105e7366004614f2f565b6121c4565b6040516102a594939291906156be565b61041661060a3660046149ed565b612200565b61062261061d366004614f2f565b61225f565b6040516102a593929190615aa1565b61064461063f366004614f2f565b6122d9565b6040516102a5929190615904565b610326612312565b61066d610668366004614f2f565b612318565b6040516102a59493929190615a31565b61069061068b366004614f2f565b612389565b6040516102a5929190615c18565b6103f66106ac3660046149a0565b6123d7565b6103266106bf366004614a77565b612445565b6104d26106d2366004614ff7565b612b56565b6104166106e5366004614d39565b612eb6565b6106fd6106f8366004614f2f565b612ed5565b6040516102a59190615965565b61071d610718366004614c18565b612f8a565b6040516102a5939291906157b0565b61073f61073a3660046149a0565b6130c2565b6040516102a592919061588c565b61076061075b36600461504e565b6130db565b6040516102a593929190615d8c565b61078261077d366004614f2f565b613313565b6040516102a593929190615b70565b6000806107a5836107a0613350565b61335b565b60006107be600485518661339b9092919063ffffffff16565b8060200190516107d19190810190614ee2565b909350905060ff811660068111156107e557fe5b915050915091565b60008080610801848263ffffffff6133de16565b92506001600160e01b0319831663012b8bc960e11b1461083c5760405162461bcd60e51b815260040161083390615d64565b60405180910390fd5b61084d84601063ffffffff61341216565b915061086084602463ffffffff61344516565b929491935050565b60008061087584846118fa565b91506108818484612445565b90509250929050565b600080600061089b846107a0613451565b60006108b4600486518761339b9092919063ffffffff16565b8060200190516108c79190810190615375565b9094509250905060ff811660028111156108dd57fe5b9350509193909250565b60008060006108f68585610868565b91509150610904828261345c565b925050505b92915050565b6000606080610920846107a0613472565b835161093690859060049063ffffffff61339b16565b8060200190516109499190810190614e83565b9196909550909350915050565b600080610965836107a061347d565b825161097b90849060049063ffffffff61339b16565b80602001905161098e9190810190614e26565b9094909350915050565b60008060606109a9846107a0613488565b60006109c2600486518761339b9092919063ffffffff16565b8060200190516109d59190810190615336565b9094509250905060ff811660018111156108dd57fe5b6000806060806109fd856107a0613493565b8451610a1390869060049063ffffffff61339b16565b806020019051610a269190810190614de3565b92989197509550909350915050565b600080610a44836107a061349e565b6000610a5d600485518661339b9092919063ffffffff16565b806020019051610a709190810190615275565b9250905060ff81166003811115610a8357fe5b925050915091565b6000610a9d828263ffffffff6133de16565b90506001600160e01b03198116630f47261b60e41b1415610ac857610ac182611ea2565b5050610ba5565b6001600160e01b0319811663012b8bc960e11b1415610af257610aea826107ed565b505050610ba5565b6001600160e01b0319811663a7cb5fb760e01b1415610b1e57610b1482611f60565b5050505050610ba5565b6001600160e01b031981166394cfcdd760e01b1415610b4057610aea8261225f565b6001600160e01b0319811663619ce88560e11b1415610b6b57610b6282612318565b50505050610ba5565b6001600160e01b0319811663dc1600f360e01b1415610b8d57610b6282611526565b60405162461bcd60e51b815260040161083390615d64565b5050565b606060008251905080604051908082528060200260200182016040528015610bdb578160200160208202803883390190505b50915060005b818114610c2457610c0585858381518110610bf857fe5b6020026020010151612445565b838281518110610c1157fe5b6020908102919091010152600101610be1565b505092915050565b604051606090630f47261b60e41b90610c499084906024016155e4565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091529050919050565b60405160609063619ce88560e11b90610ca39086908690869060240161568a565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915290505b9392505050565b6000806000610cf0846107a06134a9565b8351610d0690859060049063ffffffff61339b16565b8060200190516109499190810190614870565b60608080806000610d30868263ffffffff6133de16565b90506001600160e01b0319811663dedfc1f160e01b1415610d7c5760405180604001604052806011815260200170626174636843616e63656c4f726465727360781b8152509450611128565b6001600160e01b03198116634b4a520160e11b1415610dc4576040518060400160405280600f81526020016e626174636846696c6c4f726465727360881b8152509450611128565b6001600160e01b031981166323aa37f960e21b1415610e135760405180604001604052806016815260200175626174636846696c6c4f72646572734e6f5468726f7760501b8152509450611128565b6001600160e01b03198116632fbb8b8560e21b1415610e615760405180604001604052806015815260200174626174636846696c6c4f724b696c6c4f726465727360581b8152509450611128565b6001600160e01b03198116632da6298760e01b1415610ea5576040518060400160405280600b81526020016a31b0b731b2b627b93232b960a91b8152509450611128565b6001600160e01b03198116634da26aab60e11b1415610ee757604051806040016040528060098152602001683334b63627b93232b960b91b8152509450611128565b6001600160e01b03198116633852d63160e21b1415610f2f576040518060400160405280600f81526020016e3334b63627b925b4b63627b93232b960891b8152509450611128565b6001600160e01b031981166378d29ac160e01b1415610f7e57604051806040016040528060168152602001756d61726b65744275794f72646572734e6f5468726f7760501b8152509450611128565b6001600160e01b0319811663369da09960e01b1415610fd4576040518060400160405280601781526020017f6d61726b657453656c6c4f72646572734e6f5468726f770000000000000000008152509450611128565b6001600160e01b03198116638bc8efb360e01b141561102a576040518060400160405280601981526020017f6d61726b65744275794f726465727346696c6c4f724b696c6c000000000000008152509450611128565b6001600160e01b0319811663a6c3bf3360e01b1415611080576040518060400160405280601a81526020017f6d61726b657453656c6c4f726465727346696c6c4f724b696c6c0000000000008152509450611128565b6001600160e01b031981166388ec79fb60e01b14156110c4576040518060400160405280600b81526020016a6d617463684f726465727360a81b8152509450611128565b6001600160e01b03198116634f9559b160e01b14806110f357506001600160e01b031981166302280c9160e41b145b156111105760405162461bcd60e51b815260040161083390615d17565b60405162461bcd60e51b815260040161083390615ce0565b6001600160e01b0319811663dedfc1f160e01b14156111b457855161115790879060049063ffffffff6134b416565b80602001905161116a9190810190614b6d565b604080516000808252602082019092529195505b50604080516000808252602082019092529194506111ac565b60608152602001906001900390816111975790505b50915061151e565b6001600160e01b03198116632fbb8b8560e21b14806111e357506001600160e01b03198116634b4a520160e11b145b806111fe57506001600160e01b031981166323aa37f960e21b145b156112185761120c86613534565b9195509350915061151e565b6001600160e01b03198116632da6298760e01b14156112e75760408051600180825281830190925290816020015b61124e6140ed565b815260200190600190039081611246575050865190945061127990879060049063ffffffff6134b416565b80602001905161128c9190810190614fc5565b8460008151811061129957fe5b6020026020010181905250600060405190808252806020026020018201604052801561117e5781602001602082028038833901905050604080516000808252602082019092529194506111ac565b6001600160e01b03198116633852d63160e21b148061131657506001600160e01b03198116634da26aab60e11b145b156113245761120c86613563565b6001600160e01b031981166378d29ac160e01b148061135357506001600160e01b0319811663369da09960e01b145b8061136e57506001600160e01b03198116638bc8efb360e01b145b8061138957506001600160e01b0319811663a6c3bf3360e01b145b156113975761120c8661365d565b6001600160e01b031981166388ec79fb60e01b141561151e576113b86140ed565b6113c06140ed565b6060806113da60048b518c6134b49092919063ffffffff16565b8060200190516113ed91908101906150fc565b604080516002808252606082019092529498509296509094509250816020015b6114156140ed565b81526020019060019003908161140d579050509750838860008151811061143857fe5b6020026020010181905250828860018151811061145157fe5b602090810291909101015260408051600280825260608201909252908160200160208202803883390190505096508360a001518760008151811061149157fe5b6020026020010181815250508260a00151876001815181106114af57fe5b60209081029190910101526040805160028082526060820190925290816020015b60608152602001906001900390816114d057905050955081866000815181106114f557fe5b6020026020010181905250808660018151811061150e57fe5b6020026020010181905250505050505b509193509193565b60008080606061153c858363ffffffff6133de16565b93506001600160e01b0319841663dc1600f360e01b1461156e5760405162461bcd60e51b815260040161083390615d64565b845161158490869060049063ffffffff6134b416565b806020019051611597919081019061480f565b9597919650949350915050565b6000806115b3836107a06136d1565b82516115c990849060049063ffffffff61339b16565b80602001905161098e9190810190614f06565b60006115e6614180565b6116778584600660009054906101000a90046001600160a01b03166001600160a01b0316631ce4c78b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561163957600080fd5b505afa15801561164d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611671919081019061525d565b3a6136db565b60408051600280825260608281019093529293509091816020015b606081526020019060019003908161169257505060408051600280825260608083018452939450909160208301908038833950506040805160028082526060808301845294955090925090602083019080388339505060408051600280825260608083018452949550909250906020830190803883390190505090508861014001518460008151811061172157fe5b602002602001018190525088600001518360008151811061173e57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050878260008151811061176c57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505084600001518160008151811061179e57fe5b602002602001018181525050886101800151846001815181106117bd57fe5b60200260200101819052508860000151836001815181106117da57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505088604001518260018151811061180c57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505084604001518160018151811061183e57fe5b60200260200101818152505061185684848484613752565b9998505050505050505050565b60006118ba846118b56040518060400160405280600b81526020016a0c1e08141c9bdd1bd8dbdb60aa1b815250604051806040016040528060058152602001640332e302e360dc1b81525087876138f7565b61394e565b949350505050565b6000806118d1836107a0613962565b82516118e790849060049063ffffffff61339b16565b80602001905161098e91908101906147d6565b60008061190d838263ffffffff6133de16565b90506001600160e01b03198116630f47261b60e41b141561194f57600061193b84601063ffffffff61341216565b9050611947818661396d565b925050611e9b565b6001600160e01b0319811663012b8bc960e11b1415611a8e57600080611974856107ed565b6040519194509250606091506331a9108f60e11b906119979084906024016158b1565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060846001600160a01b0316836040516119e891906155c8565b600060405180830381855afa9150503d8060008114611a23576040519150601f19603f3d011682016040523d82523d6000602084013e611a28565b606091505b50915091506000828015611a3d575081516020145b611a48576000611a59565b611a5982600c63ffffffff61341216565b9050896001600160a01b0316816001600160a01b031614611a7b576000611a7e565b60015b60ff169750505050505050611e9b565b6001600160e01b0319811663a7cb5fb760e01b1415611c4c576000606080611ab586611f60565b5081519296509094509250905060005b818114611c4257828181518110611ad857fe5b602002602001015160001415611aed57611c3a565b8351606090627eeac760e11b908b90879085908110611b0857fe5b6020026020010151604051602401611b219291906156f4565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060876001600160a01b031683604051611b7291906155c8565b600060405180830381855afa9150503d8060008114611bad576040519150601f19603f3d011682016040523d82523d6000602084013e611bb2565b606091505b50915091506000828015611bc7575081516020145b611bd2576000611be3565b611be382600063ffffffff61344516565b90506000878681518110611bf357fe5b60200260200101518281611c0357fe5b04905080611c1f5760009b505050505050505050505050610909565b8b811080611c2b57508b155b15611c3457809b505b50505050505b600101611ac5565b5050505050611e9b565b6001600160e01b0319811663619ce88560e11b1415611d3857604051606090632a17967960e21b90611c8990869060009081908190602401615ae8565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925260045491519092506000916001600160a01b031690611cdb9084906155c8565b600060405180830381855afa9150503d8060008114611d16576040519150601f19603f3d011682016040523d82523d6000602084013e611d1b565b606091505b5050905080611d2b576000611d2f565b6000195b93505050611e9b565b6001600160e01b0319811663dc1600f360e01b1415611dc657600080611d5d85611526565b509250925050611d6b613a57565b6001600160a01b0316826001600160a01b0316148015611d9857506005546001600160a01b038281169116145b15611dbf576000611db0611daa613a6f565b8861396d565b9050611dbb81613a87565b9450505b5050611e9b565b6001600160e01b031981166394cfcdd760e01b1415611e9b57606080611deb8561225f565b80519194509250905060005b818114611e9657838181518110611e0a57fe5b602002602001015160001415611e1f57611e8e565b6000611e3e89858481518110611e3157fe5b60200260200101516118fa565b90506000858381518110611e4e57fe5b60200260200101518281611e5e57fe5b04905080611e76576000975050505050505050610909565b87811080611e82575087155b15611e8b578097505b50505b600101611df7565b505050505b5092915050565b600080611eb5838263ffffffff6133de16565b91506001600160e01b03198216630f47261b60e41b14611ee75760405162461bcd60e51b815260040161083390615d64565b611ef883601063ffffffff61341216565b9050915091565b60008060006060611f12856107a0613c85565b6000611f2b600487518861339b9092919063ffffffff16565b806020019051611f3e91908101906152d9565b91965094509250905060ff81166006811115611f5657fe5b9450509193509193565b60008060608080611f77868563ffffffff6133de16565b94506001600160e01b0319851663a7cb5fb760e01b14611fa95760405162461bcd60e51b815260040161083390615d64565b505050506024828101516044840151606485015160848601519496929591820184019490820184019391010190565b60006118ba8461202a6040518060400160405280600b81526020016a0c1e08141c9bdd1bd8dbdb60aa1b815250604051806040016040528060058152602001640332e302e360dc1b81525087876138f7565b613c90565b606080825160405190808252806020026020018201604052801561205d578160200160208202803883390190505b50905060005b83518114611e9b5783818151811061207757fe5b60200260200101516001600160a01b03163182828151811061209557fe5b6020908102919091010152600101612063565b6060600084519050806040519080825280602002602001820160405280156120da578160200160208202803883390190505b50915060005b8181146121625761212b8682815181106120f657fe5b602002602001015186838151811061210a57fe5b602002602001015186848151811061211e57fe5b6020026020010151612b56565b83828151811061213757fe5b6020026020010190600481111561214a57fe5b9081600481111561215757fe5b9052506001016120e0565b50509392505050565b60405160609063012b8bc960e11b9061218a90859085906024016156f4565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152905092915050565b600060608060606121d7856107a0613c9f565b84516121ed90869060049063ffffffff61339b16565b806020019051610a269190810190614909565b60405160609063a7cb5fb760e01b90612223908790879087908790602401615636565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091529050949350505050565b6000606080612274848463ffffffff6133de16565b92506001600160e01b031983166394cfcdd760e01b146122a65760405162461bcd60e51b815260040161083390615d64565b83516122bc90859060049063ffffffff6134b416565b8060200190516122cf9190810190614d6d565b9395909450915050565b600060606122e9836107a0613caa565b82516122ff90849060049063ffffffff61339b16565b80602001905161098e9190810190614e49565b60075481565b60008060608161232e858263ffffffff6133de16565b93506001600160e01b0319841663619ce88560e11b146123605760405162461bcd60e51b815260040161083390615d64565b845161237690869060049063ffffffff6134b416565b80602001905161159791908101906148b2565b600080612398836107a0613cb5565b60006123b1600485518661339b9092919063ffffffff16565b8060200190516123c49190810190615275565b9250905060ff81166001811115610a8357fe5b606060008251905080604051908082528060200260200182016040528015612409578160200160208202803883390190505b50915060005b818114610c245761242685858381518110611e3157fe5b83828151811061243257fe5b602090810291909101015260010161240f565b600080612458838263ffffffff6133de16565b90506001600160e01b031981166394cfcdd760e01b14156125285760608061247f8561225f565b80519194509250905060005b81811461251d5783818151811061249e57fe5b6020026020010151600014156124b357612515565b60006124c589858481518110610bf857fe5b905060008583815181106124d557fe5b602002602001015182816124e557fe5b049050806124fd576000975050505050505050610909565b87811080612509575087155b15612512578097505b50505b60010161248b565b506109099350505050565b6001600160e01b03198116630f47261b60e41b141561264c57600061255484601063ffffffff61341216565b600154604051919250606091636eb1769f60e11b916125819189916001600160a01b0316906024016155f8565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060836001600160a01b0316836040516125d291906155c8565b600060405180830381855afa9150503d806000811461260d576040519150601f19603f3d011682016040523d82523d6000602084013e612612565b606091505b5091509150818015612625575080516020145b612630576000612641565b61264181600063ffffffff61344516565b955050505050611e9b565b6001600160e01b0319811663012b8bc960e11b141561287f57600080612671856107ed565b6002546040519295509093506060925063e985e9c560e01b916126a4918a916001600160a01b03909116906024016155f8565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060846001600160a01b0316836040516126f591906155c8565b600060405180830381855afa9150503d8060008114612730576040519150601f19603f3d011682016040523d82523d6000602084013e612735565b606091505b509150915081158061274957508051602014155b80612765575061276081600063ffffffff61344516565b600114155b156128705760405160609063020604bf60e21b906127879087906024016158b1565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050509050856001600160a01b0316816040516127d491906155c8565b600060405180830381855afa9150503d806000811461280f576040519150601f19603f3d011682016040523d82523d6000602084013e612814565b606091505b509093509150828015612828575081516020145b801561285757506002546001600160a01b031661284c83600c63ffffffff61341216565b6001600160a01b0316145b612862576000612865565b60015b60ff16975050611c42565b60001996505050505050611e9b565b6001600160e01b0319811663a7cb5fb760e01b14156129ad5760006128a384611f60565b50506003546040519294506060935063e985e9c560e01b926128d4925089916001600160a01b0316906024016155f8565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060836001600160a01b03168360405161292591906155c8565b600060405180830381855afa9150503d8060008114612960576040519150601f19603f3d011682016040523d82523d6000602084013e612965565b606091505b5091509150818015612978575080516020145b8015612994575061299081600063ffffffff61344516565b6001145b61299f576000612641565b600019955050505050611e9b565b6001600160e01b0319811663619ce88560e11b14156129d0576000199150611e9b565b6001600160e01b0319811663dc1600f360e01b1415611e9b576000806129f585611526565b509250925050612a03613a57565b6001600160a01b0316826001600160a01b0316148015612a3057506005546001600160a01b038281169116145b15612b4d57600554604051606091636eb1769f60e11b91612a61918a916001600160a01b03909116906024016155f8565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152905060006060612aa1613a6f565b6001600160a01b031683604051612ab891906155c8565b600060405180830381855afa9150503d8060008114612af3576040519150601f19603f3d011682016040523d82523d6000602084013e612af8565b606091505b50915091506000828015612b0d575081516020145b612b18576000612b29565b612b2982600063ffffffff61344516565b90506000198114612b4257612b3d81613a87565b612b46565b6000195b9750505050505b50505092915050565b6000612b60614180565b612bb38584600660009054906101000a90046001600160a01b03166001600160a01b0316631ce4c78b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561163957600080fd5b60408051600480825260a0820190925291925060609190816020015b6060815260200190600190039081612bcf57505060408051600480825260a082019092529192506060919060208201608080388339505060408051600480825260a08201909252929350606092915060208201608080388339505060408051600480825260a0820190925292935060609291506020820160808038833901905050905088610160015184600081518110612c6557fe5b60200260200101819052508783600081518110612c7e57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050886000015182600081518110612cb057fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508681600081518110612cde57fe5b60200260200101818152505088610140015184600181518110612cfd57fe5b6020026020010181905250886000015183600181518110612d1a57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508782600181518110612d4857fe5b60200260200101906001600160a01b031690816001600160a01b031681525050846000015181600181518110612d7a57fe5b602002602001018181525050886101a0015184600281518110612d9957fe5b60200260200101819052508783600281518110612db257fe5b60200260200101906001600160a01b031690816001600160a01b031681525050886040015182600281518110612de457fe5b60200260200101906001600160a01b031690816001600160a01b031681525050846060015181600281518110612e1657fe5b60200260200101818152505088610180015184600381518110612e3557fe5b6020026020010181905250886000015183600381518110612e5257fe5b60200260200101906001600160a01b031690816001600160a01b031681525050886040015182600381518110612e8457fe5b60200260200101906001600160a01b031690816001600160a01b03168152505084604001518160038151811061183e57fe5b6040516060906394cfcdd760e01b9061218a908590859060240161585e565b6000612ee7828263ffffffff6133de16565b90506001600160e01b03198116630f47261b60e41b1480612f1857506001600160e01b0319811663012b8bc960e11b145b80612f3357506001600160e01b0319811663a7cb5fb760e01b145b80612f4e57506001600160e01b031981166394cfcdd760e01b145b80612f6957506001600160e01b0319811663619ce88560e11b145b612f855760405162461bcd60e51b815260040161083390615d64565b919050565b606080606060008551905080604051908082528060200260200182016040528015612fcf57816020015b612fbc6141af565b815260200190600190039081612fb45790505b50935080604051908082528060200260200182016040528015612ffc578160200160208202803883390190505b50925080604051908082528060200260200182016040528015613029578160200160208202803883390190505b50915060005b8181146130b95761306687828151811061304557fe5b602002602001015187838151811061305957fe5b60200260200101516130db565b875188908590811061307457fe5b6020026020010187858151811061308757fe5b6020026020010187868151811061309a57fe5b931515602094850291909101909301929092529190525260010161302f565b50509250925092565b6060806130cf84846123d7565b91506108818484610ba9565b6130e36141af565b600654604051639d3fa4b960e01b815260009182916001600160a01b0390911690639d3fa4b990613118908890600401615db0565b60606040518083038186803b15801561313057600080fd5b505afa158015613144573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131689190810190614f7d565b855160065460405163a12dcc6f60e01b815292955090916001600160a01b039091169063a12dcc6f906131a19089908990600401615dc3565b60206040518083038186803b1580156131b957600080fd5b505afa1580156131cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131f19190810190614dc3565b91506000613204828861014001516108e7565b60a088015160c08901516101808a01516101408b0151939450919290916000916132339163ffffffff613cc016565b156132605761325984613253848d60800151613ce590919063ffffffff16565b85613d01565b90506132b9565b8161327457613259848b6080015185613d01565b6000613285868c61018001516108e7565b90506000613298868d6080015187613d01565b905060006132a7838688613d01565b90506132b3828261345c565b93505050505b6132d96132d3896040015185613d2390919063ffffffff16565b8261345c565b965060046132ec8b8c602001518a6115dc565b60048111156132f757fe5b14613303576000613305565b865b965050505050509250925092565b6000806000613324846107a0613d42565b600061333d600486518761339b9092919063ffffffff16565b8060200190516108c791908101906152a2565b63fdb6ca8d60e01b90565b60006133688360006133de565b90506001600160e01b0319808216908316146133965760405162461bcd60e51b815260040161083390615d3e565b505050565b6060818311156133b9576133b96133b460008585613d4d565b613d6c565b83518211156133d2576133d26133b46001848751613d4d565b50819003910190815290565b600081600401835110156133ff576133ff6133b46003855185600401613d4d565b5001602001516001600160e01b03191690565b60008160140183511015613433576134336133b46004855185601401613d4d565b5001601401516001600160a01b031690565b6000610cd88383613d74565b6318e4b14160e01b90565b600081831061346b5781610cd8565b5090919050565b634678472b60e01b90565b63b6555d6f60e01b90565b6324410cd360e11b90565b631b8388f760e01b90565b630e94a7ed60e41b90565b634ad3127560e01b90565b6060818311156134cd576134cd6133b460008585613d4d565b83518211156134e6576134e66133b46001848751613d4d565b8282036040519080825280601f01601f191660200182016040528015613513576020820181803883390190505b509050610cd861352282613d9e565b8461352c87613d9e565b018351613da4565b606080606061355060048551866134b49092919063ffffffff16565b8060200190516109499190810190614c6e565b60408051600180825281830190925260609182918291816020015b6135866140ed565b81526020019060019003908161357e5750506040805160018082528183019092529194506020808301908038833901905050604080516001808252818301909252919350816020015b60608152602001906001900390816135cf57505084519091506135fc90859060049063ffffffff6134b416565b80602001905161360f9190810190615154565b8560008151811061361c57fe5b602002602001018560008151811061363057fe5b602002602001018560008151811061364457fe5b6020908102919091010192909252919052529193909250565b6040805160018082528183019092526060918291829160208083019080388339505085519193506136999186915060049063ffffffff6134b416565b8060200190516136ac9190810190614ce7565b845185906000906136b957fe5b60209081029190910101919091529095929450925050565b628e3db960e51b90565b6136e3614180565b6020810184905260a085015160808601516136ff918691613e49565b815260a085015160c0860151613716918691613e49565b604082015260a085015160e0860151613730918691613e49565b6060820152613745828463ffffffff613e7d16565b6080820152949350505050565b60405160009060609063b04fbddd60e01b9061377890889088908890889060240161570d565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925260065491519092506060916001600160a01b0316906137ca9084906155c8565b6000604051808303816000865af19150503d8060008114613807576040519150601f19603f3d011682016040523d82523d6000602084013e61380c565b606091505b50915060009050613823828263ffffffff6133de16565b905061382d613488565b6001600160e01b03198281169116141561386a57600061384c83610998565b5091505060ff8116600481111561385f57fe5b9450505050506118ba565b613872613472565b6001600160e01b0319828116911614156138a55760006138918361090f565b509091505060ff8116600481111561385f57fe5b815160208301207ff43f26ea5a94b478394a975e856464913dc1a8a1ca70939d974aa7c238aa0ce014156138df57600493505050506118ba565b60405162461bcd60e51b815260040161083390615cb3565b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a0902090565b6000610cd88261395d85613eae565b613f29565b6350ae068360e11b90565b6040516000906060906370a0823160e01b9061398d9085906024016155e4565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060856001600160a01b0316836040516139de91906155c8565b600060405180830381855afa9150503d8060008114613a19576040519150601f19603f3d011682016040523d82523d6000602084013e613a1e565b606091505b5091509150818015613a31575080516020145b613a3c576000613a4d565b613a4d81600063ffffffff61344516565b9695505050505050565b736b175474e89094c44da98b954eedeac495271d0f90565b7306af07097c9eeb7fd685c692751d5c66db49c21590565b600080613a92613a6f565b6001600160a01b0316634ba2363a6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015613acc57600080fd5b505af1158015613ae0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613b049190810190614f61565b90506000816001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015613b4357600080fd5b505af1158015613b57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613b7b919081019061525d565b4211613bf957816001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381600087803b158015613bbc57600080fd5b505af1158015613bd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613bf4919081019061525d565b613c6c565b816001600160a01b0316639f678cca6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015613c3457600080fd5b505af1158015613c48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613c6c919081019061525d565b90506118ba816b033b2e3c9fd0803ce800000086613d01565b630fcb446360e31b90565b6000610cd88261395d85613f48565b635bd0428d60e01b90565b6320d11f6160e01b90565b633d66146160e21b90565b600081518351148015610cd85750508051602091820120825192909101919091201490565b600082820183811015610cd857610cd86133b460008686614001565b60006118ba83613d17868563ffffffff613e7d16565b9063ffffffff61402016565b600082821115613d3c57613d3c6133b460028585614001565b50900390565b631ca78ed960e31b90565b6060632800659560e01b848484604051602401610ca393929190615bbe565b805160208201fd5b60008160200183511015613d9557613d956133b46005855185602001613d4d565b50016020015190565b60200190565b6020811015613dce576001816020036101000a038019835116818551168082178652505050613396565b82821415613ddb57613396565b82821115613e155760208103905080820181840181515b82851015613e0d578451865260209586019590940193613df2565b905250613396565b60208103905080820181840183515b81861215613e405782518252601f199283019290910190613e24565b85525050505050565b6000613e5684848461404a565b15613e6957613e696133b48585856140b0565b6118ba83613d17868563ffffffff613e7d16565b600082613e8c57506000610909565b82820282848281613e9957fe5b0414610cd857610cd86133b460018686614001565b608081810151825160208085015160408087015160609788015186519685019690962082517fec69816980a3a3ca4554410e60253953e9ff375ba4536a98adfa15cc7154150881529485019590955290830191909152948101949094526001600160a01b039091169183019190915260a082015260c0902090565b60405161190160f01b8152600281019290925260228201526042902090565b6101408101516101608201516101808301516101a08401516000937ff80322eb8376aafb64eadf8f0d7623f22130fd9491a221e902b713cb984a753493909290916020871015613f9457fe5b601f1987018051610140890180516101608b0180516101808d0180516101a08f0180519d89528c5160209d8e012087528b519b8d019b909b2084528951998c01999099208152875197909a019690962088526101e085209390945290529190529252919091529050919050565b606063e946c1bb60e01b848484604051602401610ca393929190615b4f565b600081614036576140366133b460038585614001565b600082848161404157fe5b04949350505050565b60008261405c5761405c6133b46140cf565b811580614067575083155b1561407457506000610cd8565b6000838061407e57fe5b8584099050614093858463ffffffff613e7d16565b6140a5826103e863ffffffff613e7d16565b101595945050505050565b606063339f3de260e01b848484604051602401610ca393929190615de8565b60408051808201909152600481526329e460df60e21b602082015290565b604051806101c0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b03168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001606081526020016060815260200160608152602001606081525090565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6040805160608101909152806000815260006020820181905260409091015290565b803561090981615ec1565b805161090981615ec1565b600082601f8301126141f7578081fd5b813561420a61420582615e24565b615dfe565b81815291506020808301908481018184028601820187101561422b57600080fd5b60005b84811015611e9657813561424181615ec1565b8452928201929082019060010161422e565b600082601f830112614263578081fd5b815161427161420582615e24565b8181529150602080830190840160005b838110156142ae5761429987602084518901016144d3565b83526020928301929190910190600101614281565b5050505092915050565b600082601f8301126142c8578081fd5b81356142d661420582615e24565b8181529150602080830190840160005b838110156142ae576142fe8760208435890101614485565b835260209283019291909101906001016142e6565b600082601f830112614323578081fd5b815161433161420582615e24565b8181529150602080830190840160005b838110156142ae576143598760208451890101614667565b83526020928301929190910190600101614341565b600082601f83011261437e578081fd5b813561438c61420582615e24565b8181529150602080830190840160005b838110156142ae576143b48760208435890101614519565b8352602092830192919091019060010161439c565b600082601f8301126143d9578081fd5b81516143e761420582615e24565b81815291506020808301908481018184028601820187101561440857600080fd5b60005b84811015611e965781518452928201929082019060010161440b565b600082601f830112614437578081fd5b813561444561420582615e24565b81815291506020808301908481018184028601820187101561446657600080fd5b60005b84811015611e9657813584529282019290820190600101614469565b600082601f830112614495578081fd5b81356144a361420582615e43565b91508082528360208285010111156144ba57600080fd5b8060208401602084013760009082016020015292915050565b600082601f8301126144e3578081fd5b81516144f161420582615e43565b915080825283602082850101111561450857600080fd5b611e9b816020840160208601615e66565b60006101c080838503121561452c578182fd5b61453581615dfe565b91505061454283836141d1565b815261455183602084016141d1565b602082015261456383604084016141d1565b604082015261457583606084016141d1565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e0820152610100808301358183015250610120808301358183015250610140808301356001600160401b03808211156145d657600080fd5b6145e286838701614485565b838501526101609250828501359150808211156145fe57600080fd5b61460a86838701614485565b8385015261018092508285013591508082111561462657600080fd5b61463286838701614485565b838501526101a092508285013591508082111561464e57600080fd5b5061465b85828601614485565b82840152505092915050565b60006101c080838503121561467a578182fd5b61468381615dfe565b91505061469083836141dc565b815261469f83602084016141dc565b60208201526146b183604084016141dc565b60408201526146c383606084016141dc565b60608201526080820151608082015260a082015160a082015260c082015160c082015260e082015160e0820152610100808301518183015250610120808301518183015250610140808301516001600160401b038082111561472457600080fd5b614730868387016144d3565b8385015261016092508285015191508082111561474c57600080fd5b614758868387016144d3565b8385015261018092508285015191508082111561477457600080fd5b614780868387016144d3565b838501526101a092508285015191508082111561479c57600080fd5b5061465b858286016144d3565b805160ff8116811461090957600080fd5b6000602082840312156147cb578081fd5b8135610cd881615ec1565b600080604083850312156147e8578081fd5b82516147f381615ec1565b602084015190925061480481615ec1565b809150509250929050565b600080600060608486031215614823578081fd5b835161482e81615ec1565b602085015190935061483f81615ec1565b60408501519092506001600160401b0381111561485a578182fd5b614866868287016144d3565b9150509250925092565b600080600060608486031215614884578081fd5b835161488f81615ec1565b60208501519093506148a081615ec1565b80925050604084015190509250925092565b6000806000606084860312156148c6578081fd5b83516148d181615ec1565b60208501519093506001600160401b038111156148ec578182fd5b6148f8868287016144d3565b925050604084015190509250925092565b6000806000806080858703121561491e578182fd5b845161492981615ec1565b60208601519094506001600160401b0380821115614945578384fd5b614951888389016144d3565b94506040870151915080821115614966578384fd5b614972888389016144d3565b93506060870151915080821115614987578283fd5b50614994878288016144d3565b91505092959194509250565b600080604083850312156149b2578182fd5b82356149bd81615ec1565b915060208301356001600160401b038111156149d7578182fd5b6149e3858286016142b8565b9150509250929050565b60008060008060808587031215614a02578182fd5b8435614a0d81615ec1565b935060208501356001600160401b0380821115614a28578384fd5b614a3488838901614427565b94506040870135915080821115614a49578384fd5b614a5588838901614427565b93506060870135915080821115614a6a578283fd5b5061499487828801614485565b60008060408385031215614a89578182fd5b8235614a9481615ec1565b915060208301356001600160401b03811115614aae578182fd5b6149e385828601614485565b600080600060608486031215614ace578081fd5b8335614ad981615ec1565b925060208401356001600160401b03811115614af3578182fd5b614aff86828701614485565b925050604084013590509250925092565b60008060408385031215614b22578182fd5b8235614b2d81615ec1565b946020939093013593505050565b600060208284031215614b4c578081fd5b81356001600160401b03811115614b61578182fd5b6118ba848285016141e7565b600060208284031215614b7e578081fd5b81516001600160401b03811115614b93578182fd5b6118ba84828501614313565b600080600060608486031215614bb3578081fd5b83356001600160401b0380821115614bc9578283fd5b614bd58783880161436e565b94506020860135915080821115614bea578283fd5b614bf6878388016141e7565b93506040860135915080821115614c0b578283fd5b5061486686828701614427565b60008060408385031215614c2a578182fd5b82356001600160401b0380821115614c40578384fd5b614c4c8683870161436e565b93506020850135915080821115614c61578283fd5b506149e3858286016142b8565b600080600060608486031215614c82578081fd5b83516001600160401b0380821115614c98578283fd5b614ca487838801614313565b94506020860151915080821115614cb9578283fd5b614cc5878388016143c9565b93506040860151915080821115614cda578283fd5b5061486686828701614253565b600080600060608486031215614cfb578081fd5b83516001600160401b0380821115614d11578283fd5b614d1d87838801614313565b9450602086015193506040860151915080821115614cda578283fd5b60008060408385031215614d4b578182fd5b82356001600160401b0380821115614d61578384fd5b614c4c86838701614427565b60008060408385031215614d7f578182fd5b82516001600160401b0380821115614d95578384fd5b614da1868387016143c9565b93506020850151915080821115614db6578283fd5b506149e385828601614253565b600060208284031215614dd4578081fd5b81518015158114610cd8578182fd5b60008060008060808587031215614df8578182fd5b845193506020850151614e0a81615ec1565b60408601519093506001600160401b0380821115614966578384fd5b60008060408385031215614e38578182fd5b505080516020909101519092909150565b60008060408385031215614e5b578182fd5b8251915060208301516001600160401b03811115614e77578182fd5b6149e3858286016144d3565b600080600060608486031215614e97578081fd5b8351925060208401516001600160401b0380821115614eb4578283fd5b614ec0878388016144d3565b93506040860151915080821115614ed5578283fd5b50614866868287016144d3565b60008060408385031215614ef4578182fd5b82519150602083015161480481615ed6565b60008060408385031215614f18578182fd5b82516001600160e01b0319811681146147f3578283fd5b600060208284031215614f40578081fd5b81356001600160401b03811115614f55578182fd5b6118ba84828501614485565b600060208284031215614f72578081fd5b8151610cd881615ec1565b600060608284031215614f8e578081fd5b614f986060615dfe565b825160078110614fa6578283fd5b8152602083810151908201526040928301519281019290925250919050565b600060208284031215614fd6578081fd5b81516001600160401b03811115614feb578182fd5b6118ba84828501614667565b60008060006060848603121561500b578081fd5b83356001600160401b03811115615020578182fd5b61502c86828701614519565b935050602084013561503d81615ec1565b929592945050506040919091013590565b60008060408385031215615060578182fd5b82356001600160401b0380821115615076578384fd5b61508286838701614519565b93506020850135915080821115615097578283fd5b506149e385828601614485565b6000806000606084860312156150b8578081fd5b83356001600160401b038111156150cd578182fd5b6150d986828701614519565b9350506020840135915060408401356150f181615ec1565b809150509250925092565b60008060008060808587031215615111578182fd5b84516001600160401b0380821115615127578384fd5b61513388838901614667565b95506020870151915080821115615148578384fd5b61495188838901614667565b600080600060608486031215615168578081fd5b83516001600160401b038082111561517e578283fd5b61518a87838801614667565b9450602086015193506040860151915080821115614ed5578283fd5b6000806000606084860312156151ba578081fd5b83356001600160401b03808211156151d0578283fd5b81860160a081890312156151e2578384fd5b6151ec60a0615dfe565b925080358352602081013560208401526040810135604084015261521388606083016141d1565b6060840152608081013582811115615229578485fd5b61523589828401614485565b60808501525091945050506020840135915061525485604086016141d1565b90509250925092565b60006020828403121561526e578081fd5b5051919050565b60008060408385031215615287578182fd5b825161529281615ed6565b6020939093015192949293505050565b6000806000606084860312156152b6578081fd5b83516152c181615ed6565b6020850151604086015191945092506150f181615ec1565b600080600080608085870312156152ee578182fd5b6152f886866147a9565b935060208501519250604085015161530f81615ec1565b60608601519092506001600160401b0381111561532a578182fd5b614994878288016144d3565b60008060006060848603121561534a578081fd5b61535485856147a9565b92506020840151915060408401516001600160401b0381111561485a578182fd5b600080600060608486031215615389578081fd5b61539385856147a9565b925060208401519150604084015190509250925092565b6001600160a01b03169052565b6000815180845260208401935060208301825b828110156153f15781516001600160a01b03168652602095860195909101906001016153ca565b5093949350505050565b600081518084526020840180819550602083028101915060208501845b84811015615446578284038852615430848351615483565b6020988901989094509190910190600101615418565b50919695505050505050565b6000815180845260208401935060208301825b828110156153f1578151865260209586019590910190600101615465565b6000815180845261549b816020860160208601615e66565b601f01601f19169290920160200192915050565b80516154ba81615ead565b825260208181015190830152604090810151910152565b60006101c06154e18484516153aa565b60208301516154f360208601826153aa565b50604083015161550660408601826153aa565b50606083015161551960608601826153aa565b506080830151608085015260a083015160a085015260c083015160c085015260e083015160e085015261010080840151818601525061012080840151818601525061014080840151828287015261557283870182615483565b9150506101609150818401518582038387015261558f8282615483565b9250505061018080840151858303828701526155ab8382615483565b9150506101a091508184015185820383870152613a4d8282615483565b600082516155da818460208701615e66565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b038516815260806020820181905260009061565a90830186615452565b828103604084015261566c8186615452565b838103606085015261567e8186615483565b98975050505050505050565b6001600160a01b03841681526060602082018190526000906156ae90830185615483565b9050826040830152949350505050565b6001600160a01b03851681526080602082018190526000906156e290830186615483565b828103604084015261566c8186615483565b6001600160a01b03929092168252602082015260400190565b60006080825261572060808301876153fb565b828103602084015261573281876153b7565b838103604085015261574481876153b7565b91505082810360608401526157598185615452565b979650505050505050565b602080825282518282018190526000918401906040840190835b818110156157a557835161579181615eb7565b83526020938401939092019160010161577e565b509095945050505050565b606080825284519082018190526000906020906080840190828801845b828110156157f3576157e08483516154af565b60609390930192908401906001016157cd565b505050838103828501526158078187615452565b84810360408601528551808252908301915082860190845b8181101561583d57825115158452928401929184019160010161581f565b509198975050505050505050565b600060208252610cd86020830184615452565b6000604082526158716040830185615452565b828103602084015261588381856153fb565b95945050505050565b60006040825261589f6040830185615452565b82810360208401526158838185615452565b90815260200190565b8481526001600160a01b03841660208201526080604082018190526000906158e490830185615483565b82810360608401526157598185615483565b918252602082015260400190565b6000838252604060208301526118ba6040830184615483565b6000848252606060208301526159366060830185615483565b8281036040840152613a4d8185615483565b8281526040810161595883615ead565b8260208301529392505050565b6001600160e01b031991909116815260200190565b6001600160e01b03199290921682526001600160a01b0316602082015260400190565b6001600160e01b0319851681526001600160a01b03848116602083015283166040820152608060608201819052600090613a4d90830184615483565b6001600160e01b0319861681526001600160a01b038516602082015260a060408201819052600090615a0d90830186615452565b8281036060840152615a1f8186615452565b83810360808501526118568186615483565b6001600160e01b0319851681526001600160a01b0384166020820152608060408201819052600090615a6590830185615483565b905082606083015295945050505050565b6001600160e01b03199390931683526001600160a01b03919091166020830152604082015260600190565b600063ffffffff60e01b8516825260606020830152615ac36060830185615452565b8281036040840152613a4d81856153fb565b600060208252610cd86020830184615483565b600060808252615afb6080830187615483565b6001600160a01b03958616602084015293909416604082015260ff9190911660609091015292915050565b600060028510615b3257fe5b848252836020830152606060408301526158836060830184615483565b60608101615b5c85615e96565b938152602081019290925260409091015290565b60608101615b7d85615ea3565b93815260208101929092526001600160a01b031660409091015290565b60408101615ba784615e96565b9281526020015290565b60608101615b5c85615ea3565b6060810160088510615b5c57fe5b60208101615bd983615eb7565b91905290565b6000615bea86615ead565b858252602082018590526001600160a01b0384166040830152608060608301819052613a4d90830184615483565b6040810160028410615ba757fe5b600060808252615c396080830187615483565b602083820381850152818751808452828401915082838202850101838a01865b83811015615c8757601f19878403018552615c758383516154d1565b94860194925090850190600101615c59565b50508681036040880152615c9b818a615452565b945050505050828103606084015261575981856153fb565b602080825260139082015272554e4b4e4f574e5f52455455524e5f4441544160681b604082015260600190565b60208082526019908201527f554e4b4e4f574e5f46554e4354494f4e5f53454c4543544f5200000000000000604082015260600190565b6020808252600d908201526c15539253541311535153951151609a1b604082015260600190565b6020808252600c908201526b2120a22fa9a2a622a1aa27a960a11b604082015260600190565b6020808252600e908201526d15d493d391d7d41493d61657d25160921b604082015260600190565b60a08101615d9a82866154af565b8360608301528215156080830152949350505050565b600060208252610cd860208301846154d1565b600060408252615dd660408301856154d1565b82810360208401526158838185615483565b9283526020830191909152604082015260600190565b6040518181016001600160401b0381118282101715615e1c57600080fd5b604052919050565b60006001600160401b03821115615e39578081fd5b5060209081020190565b60006001600160401b03821115615e58578081fd5b50601f01601f191660200190565b60005b83811015615e81578181015183820152602001615e69565b83811115615e90576000848401525b50505050565b60048110615ea057fe5b50565b60038110615ea057fe5b60078110615ea057fe5b60058110615ea057fe5b6001600160a01b0381168114615ea057600080fd5b60ff81168114615ea057600080fdfea365627a7a72315820a1f72e0fecf83c3e25dfac45671531008e6d10bf428de8acfd449b715d8f4ad16c6578706572696d656e74616cf564736f6c63430005100040'; + '0x608060405234801561001057600080fd5b50600436106102f45760003560e01c80639a7e752611610191578063ca49f47c116100e3578063d3d862d111610097578063e4e6e7da11610071578063e4e6e7da1461077e578063e77286eb1461079f578063ee4f5a94146107c1576102f4565b8063d3d862d114610729578063d46950281461073c578063e25cabf71461075c576102f4565b8063d001c5dc116100c8578063d001c5dc146106f0578063d186037f14610703578063d363790514610716576102f4565b8063ca49f47c146106ac578063cafd3a07146106cf576102f4565b8063a6627e9f11610145578063bbb2dcf61161011f578063bbb2dcf614610661578063bc03f96414610683578063c26cfecd146106a4576102f4565b8063a6627e9f14610618578063acaedc741461062b578063b43cffe11461064e576102f4565b8063a070cac811610176578063a070cac8146105d2578063a0901e51146105e5578063a5cd62ba146105f8576102f4565b80639a7e75261461058b5780639eadc835146105ae576102f4565b80634dfdac201161024a5780637914b2ec116101fe5780637b66ad34116101d85780637b66ad34146105445780637d727512146105655780638f4ce47914610578576102f4565b80637914b2ec146104f05780637982653e1461051157806379c9c42614610531576102f4565b806363eb39921161022f57806363eb39921461049857806365129042146104ab578063750bdb30146104cd576102f4565b80634dfdac2014610458578063590aa87514610478576102f4565b8063314853ff116102ac5780633db6dc61116102865780633db6dc61146103ff578063459be5e21461042257806346eb65cb14610443576102f4565b8063314853ff146103a8578063327d3054146103ca57806332aae3ad146103dd576102f4565b80630d7b7d76116102dd5780630d7b7d7614610345578063165979e1146103665780632322cf7614610388576102f4565b806302d0aec3146102f957806304a5618a14610323575b600080fd5b61030c610307366004614a21565b6107e3565b60405161031a92919061535e565b60405180910390f35b610336610331366004614a21565b61083f565b60405161031a93929190615488565b610358610353366004614603565b6108ba565b60405161031a92919061530c565b610379610374366004614a21565b6108dc565b60405161031a939291906155c3565b61039b610396366004614603565b610939565b60405161031a91906152c9565b6103bb6103b6366004614a21565b610961565b60405161031a93929190615333565b6103586103d8366004614a21565b6109a8565b6103f06103eb366004614a21565b6109ea565b60405161031a93929190615539565b61041261040d366004614a21565b610a3d565b60405161031a94939291906152d2565b610435610430366004614a21565b610a87565b60405161031a9291906155ac565b610456610451366004614a21565b610add565b005b61046b61046636600461452a565b610c5f565b60405161031a9190615263565b61048b610486366004614341565b610ce2565b60405161031a91906154e8565b61048b6104a6366004614647565b610d52565b6104be6104b9366004614a21565b610dc8565b60405161031a9392919061502f565b6104e06104db366004614a21565b610e02565b60405161031a94939291906153b3565b6105036104fe366004614a21565b610e99565b60405161031a929190615390565b61052461051f366004614ab8565b610ed1565b60405161031a91906155de565b61039b61053f366004614bc0565b61118c565b610557610552366004614a21565b611215565b60405161031a929190615015565b61039b610573366004614603565b61124d565b610503610586366004614a21565b6118a4565b61059e610599366004614a21565b61191a565b60405161031a94939291906155f2565b6105c16105bc366004614a21565b61197b565b60405161031a9594939291906153ef565b61039b6105e0366004614b67565b611a0c565b61046b6105f33660046146c9565b611a8d565b61060b6106063660046146fc565b611b06565b60405161031a919061517b565b61048b61062636600461469e565b611bc9565b61063e610639366004614a21565b611c22565b60405161031a94939291906150d7565b61048b61065c366004614578565b611c5e565b61067461066f366004614a21565b611cd6565b60405161031a939291906154b3565b610696610691366004614a21565b611d50565b60405161031a92919061531a565b61039b611d89565b6106bf6106ba366004614a21565b611d8f565b60405161031a9493929190615445565b6106e26106dd366004614a21565b611e19565b60405161031a929190615629565b61046b6106fe36600461452a565b611e67565b61039b610711366004614603565b611ed5565b610524610724366004614ab8565b6126c7565b61048b6107373660046147cd565b612a77565b61074f61074a366004614a21565b612a96565b60405161031a919061537b565b61076f61076a366004614776565b612b91565b60405161031a939291906151c8565b61079161078c36600461452a565b612cc9565b60405161031a9291906152a4565b6107b26107ad366004614b10565b612ce2565b60405161031a939291906156db565b6107d46107cf366004614a21565b612fa4565b60405161031a93929190615582565b6000806107f7836107f2612fe1565b613005565b600061081060048551866130459092919063ffffffff16565b80602001905161082391908101906149d4565b909350905060ff8116600681111561083757fe5b915050915091565b60008080610853848263ffffffff61308816565b92506001600160e01b0319831663012b8bc960e11b1461088e5760405162461bcd60e51b8152600401610885906156a4565b60405180910390fd5b61089f84601063ffffffff6130bc16565b91506108b284602463ffffffff6130ef16565b929491935050565b6000806108c7848461124d565b91506108d38484611ed5565b90509250929050565b60008060006108ed846107f26130fb565b600061090660048651876130459092919063ffffffff16565b8060200190516109199190810190614d92565b9094509250905060ff8116600281111561092f57fe5b9350509193909250565b600080600061094885856108ba565b91509150610956828261311f565b925050505b92915050565b6000606080610972846107f2613135565b835161098890859060049063ffffffff61304516565b80602001905161099b9190810190614974565b9196909550909350915050565b6000806109b7836107f2613159565b82516109cd90849060049063ffffffff61304516565b8060200190516109e09190810190614916565b9094909350915050565b60008060606109fb846107f261317d565b6000610a1460048651876130459092919063ffffffff16565b806020019051610a279190810190614d52565b9094509250905060ff8116600181111561092f57fe5b600080606080610a4f856107f26131a1565b8451610a6590869060049063ffffffff61304516565b806020019051610a7891908101906148d2565b92989197509550909350915050565b600080610a96836107f26131c5565b6000610aaf60048551866130459092919063ffffffff16565b806020019051610ac29190810190614c90565b9250905060ff81166003811115610ad557fe5b925050915091565b6000610aef828263ffffffff61308816565b90506001600160e01b031981167ff47261b0000000000000000000000000000000000000000000000000000000001415610b3357610b2c826118a4565b5050610c5b565b6001600160e01b0319811663012b8bc960e11b1415610b5d57610b558261083f565b505050610c5b565b6001600160e01b031981167fa7cb5fb7000000000000000000000000000000000000000000000000000000001415610ba257610b988261197b565b5050505050610c5b565b6001600160e01b031981166394cfcdd760e01b1415610bc457610b5582611cd6565b6001600160e01b031981167fc339d10a000000000000000000000000000000000000000000000000000000001415610c0857610bff82611d8f565b50505050610c5b565b6001600160e01b031981167fdc1600f3000000000000000000000000000000000000000000000000000000001415610c4357610bff82610e02565b60405162461bcd60e51b8152600401610885906156a4565b5050565b606060008251905080604051908082528060200260200182016040528015610c91578160200160208202803883390190505b50915060005b818114610cda57610cbb85858381518110610cae57fe5b6020026020010151611ed5565b838281518110610cc757fe5b6020908102919091010152600101610c97565b505092915050565b6040516060907ff47261b00000000000000000000000000000000000000000000000000000000090610d18908490602401615001565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915290505b919050565b6040516060907fc339d10a0000000000000000000000000000000000000000000000000000000090610d8c908690869086906024016150a5565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915290505b9392505050565b6000806000610dd9846107f26131e9565b8351610def90859060049063ffffffff61304516565b80602001905161099b91908101906143f8565b600080806060610e18858363ffffffff61308816565b93506001600160e01b031984167fdc1600f30000000000000000000000000000000000000000000000000000000014610e635760405162461bcd60e51b8152600401610885906156a4565b8451610e7990869060049063ffffffff61320d16565b806020019051610e8c9190810190614396565b9597919650949350915050565b600080610ea8836107f261328d565b8251610ebe90849060049063ffffffff61304516565b8060200190516109e091908101906149f8565b6000610edb613f0c565b610f6c8584600660009054906101000a90046001600160a01b03166001600160a01b0316631ce4c78b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f2e57600080fd5b505afa158015610f42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f669190810190614c78565b3a6132b1565b60408051600280825260608281019093529293509091816020015b6060815260200190600190039081610f8757505060408051600280825260608083018452939450909160208301908038833950506040805160028082526060808301845294955090925090602083019080388339505060408051600280825260608083018452949550909250906020830190803883390190505090508861014001518460008151811061101657fe5b602002602001018190525088600001518360008151811061103357fe5b6001600160a01b039283166020918202929092010152881615611056578761106c565b73377f698c4c287018d09b516f415317aec59193325b8260008151811061107957fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508460000151816000815181106110ab57fe5b602002602001018181525050886101800151846001815181106110ca57fe5b60200260200101819052508860000151836001815181106110e757fe5b6001600160a01b03928316602091820292909201015260408a01511615611112578860400151611128565b73377f698c4c287018d09b516f415317aec59193325b8260018151811061113557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505084604001518160018151811061116757fe5b60200260200101818152505061117f84848484613328565b9998505050505050505050565b600061120d846112086040518060400160405280600b81526020017f30782050726f746f636f6c0000000000000000000000000000000000000000008152506040518060400160405280600581526020017f332e302e3000000000000000000000000000000000000000000000000000000081525087876134e6565b61353d565b949350505050565b600080611224836107f2613551565b825161123a90849060049063ffffffff61304516565b8060200190516109e0919081019061435d565b600080611260838263ffffffff61308816565b90506001600160e01b031981167ff47261b00000000000000000000000000000000000000000000000000000000014156112bb5760006112a784601063ffffffff6130bc16565b90506112b38186613575565b92505061189d565b6001600160e01b0319811663012b8bc960e11b1415611413576000806112e08561083f565b6040519194509250606091507f6352211e000000000000000000000000000000000000000000000000000000009061131c9084906024016152c9565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060846001600160a01b03168360405161136d9190614fe5565b600060405180830381855afa9150503d80600081146113a8576040519150601f19603f3d011682016040523d82523d6000602084013e6113ad565b606091505b509150915060008280156113c2575081516020145b6113cd5760006113de565b6113de82600c63ffffffff6130bc16565b9050896001600160a01b0316816001600160a01b031614611400576000611403565b60015b60ff16975050505050505061189d565b6001600160e01b031981167fa7cb5fb70000000000000000000000000000000000000000000000000000000014156116035760006060806114538661197b565b5081519296509094509250905060005b8181146115f95782818151811061147657fe5b60200260200101516000141561148b576115f1565b83516060907efdd58e00000000000000000000000000000000000000000000000000000000908b908790859081106114bf57fe5b60200260200101516040516024016114d892919061510b565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060876001600160a01b0316836040516115299190614fe5565b600060405180830381855afa9150503d8060008114611564576040519150601f19603f3d011682016040523d82523d6000602084013e611569565b606091505b5091509150600082801561157e575081516020145b61158957600061159a565b61159a82600063ffffffff6130ef16565b905060008786815181106115aa57fe5b602002602001015182816115ba57fe5b049050806115d65760009b50505050505050505050505061095b565b8b8110806115e257508b155b156115eb57809b505b50505050505b600101611463565b505050505061189d565b6001600160e01b031981167fc339d10a000000000000000000000000000000000000000000000000000000001415611721576040516060907fa85e59e40000000000000000000000000000000000000000000000000000000090611672908690600090819081906024016154fb565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925260045491519092506000916001600160a01b0316906116c4908490614fe5565b600060405180830381855afa9150503d80600081146116ff576040519150601f19603f3d011682016040523d82523d6000602084013e611704565b606091505b5050905080611714576000611718565b6000195b9350505061189d565b6001600160e01b031981167fdc1600f30000000000000000000000000000000000000000000000000000000014156117c85760008061175f85610e02565b50925092505061176d613678565b6001600160a01b0316826001600160a01b031614801561179a57506005546001600160a01b038281169116145b156117c15760006117b26117ac613690565b88613575565b90506117bd816136a8565b9450505b505061189d565b6001600160e01b031981166394cfcdd760e01b141561189d576060806117ed85611cd6565b80519194509250905060005b8181146118985783818151811061180c57fe5b60200260200101516000141561182157611890565b60006118408985848151811061183357fe5b602002602001015161124d565b9050600085838151811061185057fe5b6020026020010151828161186057fe5b0490508061187857600097505050505050505061095b565b87811080611884575087155b1561188d578097505b50505b6001016117f9565b505050505b5092915050565b6000806118b7838263ffffffff61308816565b91506001600160e01b031982167ff47261b000000000000000000000000000000000000000000000000000000000146119025760405162461bcd60e51b8152600401610885906156a4565b61191383601063ffffffff6130bc16565b9050915091565b6000806000606061192d856107f26138a6565b600061194660048751886130459092919063ffffffff16565b8060200190516119599190810190614cf4565b91965094509250905060ff8116600681111561197157fe5b9450509193509193565b60008060608080611992868563ffffffff61308816565b94506001600160e01b031985167fa7cb5fb700000000000000000000000000000000000000000000000000000000146119dd5760405162461bcd60e51b8152600401610885906156a4565b505050506024828101516044840151606485015160848601519496929591820184019490820184019391010190565b600061120d84611a886040518060400160405280600b81526020017f30782050726f746f636f6c0000000000000000000000000000000000000000008152506040518060400160405280600581526020017f332e302e3000000000000000000000000000000000000000000000000000000081525087876134e6565b6138ca565b6060808251604051908082528060200260200182016040528015611abb578160200160208202803883390190505b50905060005b8351811461189d57838181518110611ad557fe5b60200260200101516001600160a01b031631828281518110611af357fe5b6020908102919091010152600101611ac1565b606060008451905080604051908082528060200260200182016040528015611b38578160200160208202803883390190505b50915060005b818114611bc057611b89868281518110611b5457fe5b6020026020010151868381518110611b6857fe5b6020026020010151868481518110611b7c57fe5b60200260200101516126c7565b838281518110611b9557fe5b60200260200101906004811115611ba857fe5b90816004811115611bb557fe5b905250600101611b3e565b50509392505050565b60405160609063012b8bc960e11b90611be8908590859060240161510b565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152905092915050565b60006060806060611c35856107f26138d9565b8451611c4b90869060049063ffffffff61304516565b806020019051610a789190810190614492565b6040516060907fa7cb5fb70000000000000000000000000000000000000000000000000000000090611c9a908790879087908790602401615053565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091529050949350505050565b6000606080611ceb848463ffffffff61308816565b92506001600160e01b031983166394cfcdd760e01b14611d1d5760405162461bcd60e51b8152600401610885906156a4565b8351611d3390859060049063ffffffff61320d16565b806020019051611d469190810190614802565b9395909450915050565b60006060611d60836107f26138fd565b8251611d7690849060049063ffffffff61304516565b8060200190516109e09190810190614939565b60075481565b600080606081611da5858263ffffffff61308816565b93506001600160e01b031984167fc339d10a0000000000000000000000000000000000000000000000000000000014611df05760405162461bcd60e51b8152600401610885906156a4565b8451611e0690869060049063ffffffff61320d16565b806020019051610e8c919081019061443a565b600080611e28836107f2613921565b6000611e4160048551866130459092919063ffffffff16565b806020019051611e549190810190614c90565b9250905060ff81166001811115610ad557fe5b606060008251905080604051908082528060200260200182016040528015611e99578160200160208202803883390190505b50915060005b818114610cda57611eb68585838151811061183357fe5b838281518110611ec257fe5b6020908102919091010152600101611e9f565b600080611ee8838263ffffffff61308816565b90506001600160e01b031981166394cfcdd760e01b1415611fb857606080611f0f85611cd6565b80519194509250905060005b818114611fad57838181518110611f2e57fe5b602002602001015160001415611f4357611fa5565b6000611f5589858481518110610cae57fe5b90506000858381518110611f6557fe5b60200260200101518281611f7557fe5b04905080611f8d57600097505050505050505061095b565b87811080611f99575087155b15611fa2578097505b50505b600101611f1b565b5061095b9350505050565b6001600160e01b031981167ff47261b000000000000000000000000000000000000000000000000000000000141561210e576000611ffd84601063ffffffff6130bc16565b6001546040519192506060917fdd62ed3e00000000000000000000000000000000000000000000000000000000916120439189916001600160a01b031690602401615015565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060836001600160a01b0316836040516120949190614fe5565b600060405180830381855afa9150503d80600081146120cf576040519150601f19603f3d011682016040523d82523d6000602084013e6120d4565b606091505b50915091508180156120e7575080516020145b6120f2576000612103565b61210381600063ffffffff6130ef16565b95505050505061189d565b6001600160e01b0319811663012b8bc960e11b1415612373576000806121338561083f565b600254604051929550909350606092507fe985e9c5000000000000000000000000000000000000000000000000000000009161217f918a916001600160a01b0390911690602401615015565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060846001600160a01b0316836040516121d09190614fe5565b600060405180830381855afa9150503d806000811461220b576040519150601f19603f3d011682016040523d82523d6000602084013e612210565b606091505b509150915081158061222457508051602014155b80612240575061223b81600063ffffffff6130ef16565b600114155b15612364576040516060907f081812fc000000000000000000000000000000000000000000000000000000009061227b9087906024016152c9565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050509050856001600160a01b0316816040516122c89190614fe5565b600060405180830381855afa9150503d8060008114612303576040519150601f19603f3d011682016040523d82523d6000602084013e612308565b606091505b50909350915082801561231c575081516020145b801561234b57506002546001600160a01b031661234083600c63ffffffff6130bc16565b6001600160a01b0316145b612356576000612359565b60015b60ff169750506115f9565b6000199650505050505061189d565b6001600160e01b031981167fa7cb5fb70000000000000000000000000000000000000000000000000000000014156124d35760006123b08461197b565b5050600354604051929450606093507fe985e9c500000000000000000000000000000000000000000000000000000000926123fa925089916001600160a01b031690602401615015565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060836001600160a01b03168360405161244b9190614fe5565b600060405180830381855afa9150503d8060008114612486576040519150601f19603f3d011682016040523d82523d6000602084013e61248b565b606091505b509150915081801561249e575080516020145b80156124ba57506124b681600063ffffffff6130ef16565b6001145b6124c5576000612103565b60001995505050505061189d565b6001600160e01b031981167fc339d10a00000000000000000000000000000000000000000000000000000000141561250f57600019915061189d565b6001600160e01b031981167fdc1600f300000000000000000000000000000000000000000000000000000000141561189d5760008061254d85610e02565b50925092505061255b613678565b6001600160a01b0316826001600160a01b031614801561258857506005546001600160a01b038281169116145b156126be576005546040516060917fdd62ed3e00000000000000000000000000000000000000000000000000000000916125d2918a916001600160a01b0390911690602401615015565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152905060006060612612613690565b6001600160a01b0316836040516126299190614fe5565b600060405180830381855afa9150503d8060008114612664576040519150601f19603f3d011682016040523d82523d6000602084013e612669565b606091505b5091509150600082801561267e575081516020145b61268957600061269a565b61269a82600063ffffffff6130ef16565b905060001981146126b3576126ae816136a8565b6126b7565b6000195b9750505050505b50505092915050565b60006126d1613f0c565b6127248584600660009054906101000a90046001600160a01b03166001600160a01b0316631ce4c78b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f2e57600080fd5b60408051600480825260a0820190925291925060609190816020015b606081526020019060019003908161274057505060408051600480825260a082019092529192506060919060208201608080388339505060408051600480825260a08201909252929350606092915060208201608080388339505060408051600480825260a08201909252929350606092915060208201608080388339019050509050886101600151846000815181106127d657fe5b602002602001018190525087836000815181106127ef57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505088600001518260008151811061282157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050868160008151811061284f57fe5b6020026020010181815250508861014001518460018151811061286e57fe5b602002602001018190525088600001518360018151811061288b57fe5b6001600160a01b0392831660209182029290920101528816156128ae57876128c4565b73377f698c4c287018d09b516f415317aec59193325b826001815181106128d157fe5b60200260200101906001600160a01b031690816001600160a01b03168152505084600001518160018151811061290357fe5b602002602001018181525050886101a001518460028151811061292257fe5b6020026020010181905250878360028151811061293b57fe5b6001600160a01b03928316602091820292909201015260408a0151161561296657886040015161297c565b73377f698c4c287018d09b516f415317aec59193325b8260028151811061298957fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508460600151816002815181106129bb57fe5b602002602001018181525050886101800151846003815181106129da57fe5b60200260200101819052508860000151836003815181106129f757fe5b6001600160a01b03928316602091820292909201015260408a01511615612a22578860400151612a38565b73377f698c4c287018d09b516f415317aec59193325b82600381518110612a4557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505084604001518160038151811061116757fe5b6040516060906394cfcdd760e01b90611be89085908590602401615276565b6000612aa8828263ffffffff61308816565b90506001600160e01b031981167ff47261b0000000000000000000000000000000000000000000000000000000001480612af257506001600160e01b0319811663012b8bc960e11b145b80612b2657506001600160e01b031981167fa7cb5fb700000000000000000000000000000000000000000000000000000000145b80612b4157506001600160e01b031981166394cfcdd760e01b145b80612b7557506001600160e01b031981167fc339d10a00000000000000000000000000000000000000000000000000000000145b610d4d5760405162461bcd60e51b8152600401610885906156a4565b606080606060008551905080604051908082528060200260200182016040528015612bd657816020015b612bc3613f3b565b815260200190600190039081612bbb5790505b50935080604051908082528060200260200182016040528015612c03578160200160208202803883390190505b50925080604051908082528060200260200182016040528015612c30578160200160208202803883390190505b50915060005b818114612cc057612c6d878281518110612c4c57fe5b6020026020010151878381518110612c6057fe5b6020026020010151612ce2565b8751889085908110612c7b57fe5b60200260200101878581518110612c8e57fe5b60200260200101878681518110612ca157fe5b9315156020948502919091019093019290925291905252600101612c36565b50509250925092565b606080612cd68484611e67565b91506108d38484610c5f565b612cea613f3b565b6006546040517f9d3fa4b900000000000000000000000000000000000000000000000000000000815260009182916001600160a01b0390911690639d3fa4b990612d389088906004016156ff565b60606040518083038186803b158015612d5057600080fd5b505afa158015612d64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612d889190810190614a70565b85516006546040517fa12dcc6f00000000000000000000000000000000000000000000000000000000815292955090916001600160a01b039091169063a12dcc6f90612dda9089908990600401615712565b60206040518083038186803b158015612df257600080fd5b505afa158015612e06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612e2a91908101906148b2565b91506000612e3d82886101400151610939565b60a088015160c08901516101808a01516101408b015193945091929091600091612e6c9163ffffffff61394516565b15612e9957612e9284612e8c848d6080015161396a90919063ffffffff16565b85613986565b9050612ef2565b81612ead57612e92848b6080015185613986565b6000612ebe868c6101800151610939565b90506000612ed1868d6080015187613986565b90506000612ee0838688613986565b9050612eec828261311f565b93505050505b612f12612f0c8960400151856139a890919063ffffffff16565b8261311f565b96506004612f258b8c602001518a610ed1565b6004811115612f3057fe5b14612f3c576000612f3e565b865b9650612f4e8a61016001516139c7565b612f5757600096505b60e08a015115801590612f755750612f738a6101a001516139c7565b155b15612f7f57600096505b600388516006811115612f8e57fe5b14612f9857600096505b50505050509250925092565b6000806000612fb5846107f2613ab1565b6000612fce60048651876130459092919063ffffffff16565b8060200190516109199190810190614cbd565b7ffdb6ca8d0000000000000000000000000000000000000000000000000000000090565b6000613012836000613088565b90506001600160e01b0319808216908316146130405760405162461bcd60e51b81526004016108859061566d565b505050565b6060818311156130635761306361305e60008585613ad5565b613af4565b835182111561307c5761307c61305e6001848751613ad5565b50819003910190815290565b600081600401835110156130a9576130a961305e6003855185600401613ad5565b5001602001516001600160e01b03191690565b600081601401835110156130dd576130dd61305e6004855185601401613ad5565b5001601401516001600160a01b031690565b6000610dc18383613afc565b7f18e4b1410000000000000000000000000000000000000000000000000000000090565b600081831061312e5781610dc1565b5090919050565b7f4678472b0000000000000000000000000000000000000000000000000000000090565b7fb6555d6f0000000000000000000000000000000000000000000000000000000090565b7f488219a60000000000000000000000000000000000000000000000000000000090565b7f1b8388f70000000000000000000000000000000000000000000000000000000090565b7fe94a7ed00000000000000000000000000000000000000000000000000000000090565b7f4ad312750000000000000000000000000000000000000000000000000000000090565b6060818311156132265761322661305e60008585613ad5565b835182111561323f5761323f61305e6001848751613ad5565b8282036040519080825280601f01601f19166020018201604052801561326c576020820181803883390190505b509050610dc161327b82613b26565b8461328587613b26565b018351613b2c565b7f11c7b7200000000000000000000000000000000000000000000000000000000090565b6132b9613f0c565b6020810184905260a085015160808601516132d5918691613bd1565b815260a085015160c08601516132ec918691613bd1565b604082015260a085015160e0860151613306918691613bd1565b606082015261331b828463ffffffff613c0516565b6080820152949350505050565b6040516000906060907fb04fbddd0000000000000000000000000000000000000000000000000000000090613367908890889088908890602401615124565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925260065491519092506060916001600160a01b0316906133b9908490614fe5565b6000604051808303816000865af19150503d80600081146133f6576040519150601f19603f3d011682016040523d82523d6000602084013e6133fb565b606091505b50915060009050613412828263ffffffff61308816565b905061341c61317d565b6001600160e01b03198281169116141561345957600061343b836109ea565b5091505060ff8116600481111561344e57fe5b94505050505061120d565b613461613135565b6001600160e01b03198281169116141561349457600061348083610961565b509091505060ff8116600481111561344e57fe5b815160208301207ff43f26ea5a94b478394a975e856464913dc1a8a1ca70939d974aa7c238aa0ce014156134ce576004935050505061120d565b60405162461bcd60e51b815260040161088590615636565b8351602094850120835193850193909320604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f815295860194909452928401929092526060830152608082015260a0902090565b6000610dc18261354c85613c36565b613cb1565b7fa15c0d060000000000000000000000000000000000000000000000000000000090565b6040516000906060907f70a0823100000000000000000000000000000000000000000000000000000000906135ae908590602401615001565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060856001600160a01b0316836040516135ff9190614fe5565b600060405180830381855afa9150503d806000811461363a576040519150601f19603f3d011682016040523d82523d6000602084013e61363f565b606091505b5091509150818015613652575080516020145b61365d57600061366e565b61366e81600063ffffffff6130ef16565b9695505050505050565b736b175474e89094c44da98b954eedeac495271d0f90565b7306af07097c9eeb7fd685c692751d5c66db49c21590565b6000806136b3613690565b6001600160a01b0316634ba2363a6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156136ed57600080fd5b505af1158015613701573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506137259190810190614a54565b90506000816001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561376457600080fd5b505af1158015613778573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061379c9190810190614c78565b421161381a57816001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156137dd57600080fd5b505af11580156137f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506138159190810190614c78565b61388d565b816001600160a01b0316639f678cca6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561385557600080fd5b505af1158015613869573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061388d9190810190614c78565b905061120d816b033b2e3c9fd0803ce800000086613986565b7f7e5a23180000000000000000000000000000000000000000000000000000000090565b6000610dc18261354c85613ceb565b7f5bd0428d0000000000000000000000000000000000000000000000000000000090565b7f20d11f610000000000000000000000000000000000000000000000000000000090565b7ff59851840000000000000000000000000000000000000000000000000000000090565b600081518351148015610dc15750508051602091820120825192909101919091201490565b600082820183811015610dc157610dc161305e60008686613da4565b600061120d8361399c868563ffffffff613c0516565b9063ffffffff613dc316565b6000828211156139c1576139c161305e60028585613da4565b50900390565b600060208251816139d457fe5b066004146139e457506000610d4d565b60006139f6838263ffffffff61308816565b90506001600160e01b031981166394cfcdd760e01b14613a1a576001915050610d4d565b606080613a2685611cd6565b80519194509250905060005b818114613aa4576000613a626000858481518110613a4c57fe5b602002602001015161308890919063ffffffff16565b90506001600160e01b0319811663012b8bc960e11b1415613a9b57613a878483613ded565b15613a9b5760009650505050505050610d4d565b50600101613a32565b5060019695505050505050565b7fe53c76c80000000000000000000000000000000000000000000000000000000090565b6060632800659560e01b848484604051602401610d8c939291906155d0565b805160208201fd5b60008160200183511015613b1d57613b1d61305e6005855185602001613ad5565b50016020015190565b60200190565b6020811015613b56576001816020036101000a038019835116818551168082178652505050613040565b82821415613b6357613040565b82821115613b9d5760208103905080820181840181515b82851015613b95578451865260209586019590940193613b7a565b905250613040565b60208103905080820181840183515b81861215613bc85782518252601f199283019290910190613bac565b85525050505050565b6000613bde848484613e50565b15613bf157613bf161305e858585613eb6565b61120d8361399c868563ffffffff613c0516565b600082613c145750600061095b565b82820282848281613c2157fe5b0414610dc157610dc161305e60018686613da4565b608081810151825160208085015160408087015160609788015186519685019690962082517fec69816980a3a3ca4554410e60253953e9ff375ba4536a98adfa15cc7154150881529485019590955290830191909152948101949094526001600160a01b039091169183019190915260a082015260c0902090565b6040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b6101408101516101608201516101808301516101a08401516000937ff80322eb8376aafb64eadf8f0d7623f22130fd9491a221e902b713cb984a753493909290916020871015613d3757fe5b601f1987018051610140890180516101608b0180516101808d0180516101a08f0180519d89528c5160209d8e012087528b519b8d019b909b2084528951998c01999099208152875197909a019690962088526101e085209390945290529190529252919091529050919050565b606063e946c1bb60e01b848484604051602401610d8c93929190615561565b600081613dd957613dd961305e60038585613da4565b6000828481613de457fe5b04949350505050565b8151600090600183015b81811015610cda57613e38858281518110613e0e57fe5b6020026020010151868681518110613e2257fe5b602002602001015161394590919063ffffffff16565b15613e485760019250505061095b565b600101613df7565b600082613e6257613e6261305e613ed5565b811580613e6d575083155b15613e7a57506000610dc1565b60008380613e8457fe5b8584099050613e99858463ffffffff613c0516565b613eab826103e863ffffffff613c0516565b101595945050505050565b606063339f3de260e01b848484604051602401610d8c93929190615737565b60408051808201909152600481527fa791837c00000000000000000000000000000000000000000000000000000000602082015290565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6040805160608101909152806000815260006020820181905260409091015290565b803561095b81615813565b600082601f830112613f78578081fd5b8135613f8b613f8682615774565b61574d565b818152915060208083019084810181840286018201871015613fac57600080fd5b60005b84811015611898578135613fc281615813565b84529282019290820190600101613faf565b600082601f830112613fe4578081fd5b8151613ff2613f8682615774565b8181529150602080830190840160005b8381101561402f5761401a876020845189010161419b565b83526020928301929190910190600101614002565b5050505092915050565b600082601f830112614049578081fd5b8135614057613f8682615774565b8181529150602080830190840160005b8381101561402f5761407f876020843589010161414d565b83526020928301929190910190600101614067565b600082601f8301126140a4578081fd5b81356140b2613f8682615774565b8181529150602080830190840160005b8381101561402f576140da87602084358901016141e1565b835260209283019291909101906001016140c2565b600082601f8301126140ff578081fd5b813561410d613f8682615774565b81815291506020808301908481018184028601820187101561412e57600080fd5b60005b8481101561189857813584529282019290820190600101614131565b600082601f83011261415d578081fd5b813561416b613f8682615794565b915080825283602082850101111561418257600080fd5b8060208401602084013760009082016020015292915050565b600082601f8301126141ab578081fd5b81516141b9613f8682615794565b91508082528360208285010111156141d057600080fd5b61189d8160208401602086016157b8565b60006101c08083850312156141f4578182fd5b6141fd8161574d565b91505061420a8383613f5d565b81526142198360208401613f5d565b602082015261422b8360408401613f5d565b604082015261423d8360608401613f5d565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013567ffffffffffffffff8082111561429f57600080fd5b6142ab8683870161414d565b838501526101609250828501359150808211156142c757600080fd5b6142d38683870161414d565b838501526101809250828501359150808211156142ef57600080fd5b6142fb8683870161414d565b838501526101a092508285013591508082111561431757600080fd5b506143248582860161414d565b82840152505092915050565b805160ff8116811461095b57600080fd5b600060208284031215614352578081fd5b8135610dc181615813565b6000806040838503121561436f578081fd5b825161437a81615813565b602084015190925061438b81615813565b809150509250929050565b6000806000606084860312156143aa578081fd5b83516143b581615813565b60208501519093506143c681615813565b604085015190925067ffffffffffffffff8111156143e2578182fd5b6143ee8682870161419b565b9150509250925092565b60008060006060848603121561440c578081fd5b835161441781615813565b602085015190935061442881615813565b80925050604084015190509250925092565b60008060006060848603121561444e578081fd5b835161445981615813565b602085015190935067ffffffffffffffff811115614475578182fd5b6144818682870161419b565b925050604084015190509250925092565b600080600080608085870312156144a7578182fd5b84516144b281615813565b602086015190945067ffffffffffffffff808211156144cf578384fd5b6144db8883890161419b565b945060408701519150808211156144f0578384fd5b6144fc8883890161419b565b93506060870151915080821115614511578283fd5b5061451e8782880161419b565b91505092959194509250565b6000806040838503121561453c578182fd5b823561454781615813565b9150602083013567ffffffffffffffff811115614562578182fd5b61456e85828601614039565b9150509250929050565b6000806000806080858703121561458d578182fd5b843561459881615813565b9350602085013567ffffffffffffffff808211156145b4578384fd5b6145c0888389016140ef565b945060408701359150808211156145d5578384fd5b6145e1888389016140ef565b935060608701359150808211156145f6578283fd5b5061451e8782880161414d565b60008060408385031215614615578182fd5b823561462081615813565b9150602083013567ffffffffffffffff81111561463b578182fd5b61456e8582860161414d565b60008060006060848603121561465b578081fd5b833561466681615813565b9250602084013567ffffffffffffffff811115614681578182fd5b61468d8682870161414d565b925050604084013590509250925092565b600080604083850312156146b0578182fd5b82356146bb81615813565b946020939093013593505050565b6000602082840312156146da578081fd5b813567ffffffffffffffff8111156146f0578182fd5b61120d84828501613f68565b600080600060608486031215614710578081fd5b833567ffffffffffffffff80821115614727578283fd5b61473387838801614094565b94506020860135915080821115614748578283fd5b61475487838801613f68565b93506040860135915080821115614769578283fd5b506143ee868287016140ef565b60008060408385031215614788578182fd5b823567ffffffffffffffff8082111561479f578384fd5b6147ab86838701614094565b935060208501359150808211156147c0578283fd5b5061456e85828601614039565b600080604083850312156147df578182fd5b823567ffffffffffffffff808211156147f6578384fd5b6147ab868387016140ef565b60008060408385031215614814578182fd5b825167ffffffffffffffff8082111561482b578384fd5b81850186601f82011261483c578485fd5b8051925061484c613f8684615774565b80848252602080830192508084018a82838902870101111561486c578889fd5b8894505b8685101561488e578051845260019490940193928101928101614870565b5088015190965093505050808211156148a5578283fd5b5061456e85828601613fd4565b6000602082840312156148c3578081fd5b81518015158114610dc1578182fd5b600080600080608085870312156148e7578182fd5b8451935060208501516148f981615813565b604086015190935067ffffffffffffffff808211156144f0578384fd5b60008060408385031215614928578182fd5b505080516020909101519092909150565b6000806040838503121561494b578182fd5b82519150602083015167ffffffffffffffff811115614968578182fd5b61456e8582860161419b565b600080600060608486031215614988578081fd5b83519250602084015167ffffffffffffffff808211156149a6578283fd5b6149b28783880161419b565b935060408601519150808211156149c7578283fd5b506143ee8682870161419b565b600080604083850312156149e6578182fd5b82519150602083015161438b81615828565b60008060408385031215614a0a578182fd5b82516001600160e01b03198116811461437a578283fd5b600060208284031215614a32578081fd5b813567ffffffffffffffff811115614a48578182fd5b61120d8482850161414d565b600060208284031215614a65578081fd5b8151610dc181615813565b600060608284031215614a81578081fd5b614a8b606061574d565b825160078110614a99578283fd5b8152602083810151908201526040928301519281019290925250919050565b600080600060608486031215614acc578081fd5b833567ffffffffffffffff811115614ae2578182fd5b614aee868287016141e1565b9350506020840135614aff81615813565b929592945050506040919091013590565b60008060408385031215614b22578182fd5b823567ffffffffffffffff80821115614b39578384fd5b614b45868387016141e1565b93506020850135915080821115614b5a578283fd5b5061456e8582860161414d565b600080600060608486031215614b7b578081fd5b833567ffffffffffffffff811115614b91578182fd5b614b9d868287016141e1565b935050602084013591506040840135614bb581615813565b809150509250925092565b600080600060608486031215614bd4578081fd5b833567ffffffffffffffff80821115614beb578283fd5b81860160a08189031215614bfd578384fd5b614c0760a061574d565b9250803583526020810135602084015260408101356040840152614c2e8860608301613f5d565b6060840152608081013582811115614c44578485fd5b614c508982840161414d565b608085015250919450505060208401359150614c6f8560408601613f5d565b90509250925092565b600060208284031215614c89578081fd5b5051919050565b60008060408385031215614ca2578182fd5b8251614cad81615828565b6020939093015192949293505050565b600080600060608486031215614cd1578081fd5b8351614cdc81615828565b602085015160408601519194509250614bb581615813565b60008060008060808587031215614d09578182fd5b614d138686614330565b9350602085015192506040850151614d2a81615813565b606086015190925067ffffffffffffffff811115614d46578182fd5b61451e8782880161419b565b600080600060608486031215614d66578081fd5b614d708585614330565b925060208401519150604084015167ffffffffffffffff8111156143e2578182fd5b600080600060608486031215614da6578081fd5b614db08585614330565b925060208401519150604084015190509250925092565b6001600160a01b03169052565b6000815180845260208401935060208301825b82811015614e0e5781516001600160a01b0316865260209586019590910190600101614de7565b5093949350505050565b600081518084526020840180819550602083028101915060208501845b84811015614e63578284038852614e4d848351614ea0565b6020988901989094509190910190600101614e35565b50919695505050505050565b6000815180845260208401935060208301825b82811015614e0e578151865260209586019590910190600101614e82565b60008151808452614eb88160208601602086016157b8565b601f01601f19169290920160200192915050565b8051614ed781615809565b825260208181015190830152604090810151910152565b60006101c0614efe848451614dc7565b6020830151614f106020860182614dc7565b506040830151614f236040860182614dc7565b506060830151614f366060860182614dc7565b506080830151608085015260a083015160a085015260c083015160c085015260e083015160e0850152610100808401518186015250610120808401518186015250610140808401518282870152614f8f83870182614ea0565b91505061016091508184015185820383870152614fac8282614ea0565b925050506101808084015185830382870152614fc88382614ea0565b9150506101a09150818401518582038387015261366e8282614ea0565b60008251614ff78184602087016157b8565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60006001600160a01b0386168252608060208301526150756080830186614e6f565b82810360408401526150878186614e6f565b83810360608501526150998186614ea0565b98975050505050505050565b60006001600160a01b0385168252606060208301526150c76060830185614ea0565b9050826040830152949350505050565b60006001600160a01b0386168252608060208301526150f96080830186614ea0565b82810360408401526150878186614ea0565b6001600160a01b03929092168252602082015260400190565b6000608082526151376080830187614e18565b82810360208401526151498187614dd4565b838103604085015261515b8187614dd4565b91505082810360608401526151708185614e6f565b979650505050505050565b602080825282518282018190526000918401906040840190835b818110156151bd578351600581106151a957fe5b835260209384019390920191600101615195565b509095945050505050565b606080825284519082018190526000906020906080840190828801845b8281101561520b576151f8848351614ecc565b60609390930192908401906001016151e5565b5050508381038285015261521f8187614e6f565b84810360408601528551808252908301915082860190845b81811015615255578251151584529284019291840191600101615237565b509198975050505050505050565b600060208252610dc16020830184614e6f565b6000604082526152896040830185614e6f565b828103602084015261529b8185614e18565b95945050505050565b6000604082526152b76040830185614e6f565b828103602084015261529b8185614e6f565b90815260200190565b60008582526001600160a01b0385166020830152608060408301526152fa6080830185614ea0565b82810360608401526151708185614ea0565b918252602082015260400190565b60008382526040602083015261120d6040830184614ea0565b60008482526060602083015261534c6060830185614ea0565b828103604084015261366e8185614ea0565b8281526040810161536e83615809565b8260208301529392505050565b6001600160e01b031991909116815260200190565b6001600160e01b03199290921682526001600160a01b0316602082015260400190565b60006001600160e01b0319861682526001600160a01b0380861660208401528085166040840152506080606083015261366e6080830184614ea0565b60006001600160e01b0319871682526001600160a01b038616602083015260a0604083015261542160a0830186614e6f565b82810360608401526154338186614e6f565b838103608085015261117f8186614ea0565b60006001600160e01b0319861682526001600160a01b0385166020830152608060408301526154776080830185614ea0565b905082606083015295945050505050565b6001600160e01b03199390931683526001600160a01b03919091166020830152604082015260600190565b60006001600160e01b031985168252606060208301526154d66060830185614e6f565b828103604084015261366e8185614e18565b600060208252610dc16020830184614ea0565b60006080825261550e6080830187614ea0565b6001600160a01b03958616602084015293909416604082015260ff9190911660609091015292915050565b6000615544856157e8565b8482528360208301526060604083015261529b6060830184614ea0565b6060810161556e856157f5565b938152602081019290925260409091015290565b6060810161558f856157ff565b93815260208101929092526001600160a01b031660409091015290565b604081016155b9846157f5565b9281526020015290565b6060810161556e856157ff565b606081016008851061556e57fe5b60208101600583106155ec57fe5b91905290565b60006155fd86615809565b8582528460208301526001600160a01b03841660408301526080606083015261366e6080830184614ea0565b604081016155b9846157e8565b60208082526013908201527f554e4b4e4f574e5f52455455524e5f4441544100000000000000000000000000604082015260600190565b6020808252600c908201527f4241445f53454c4543544f520000000000000000000000000000000000000000604082015260600190565b6020808252600e908201527f57524f4e475f50524f58595f4944000000000000000000000000000000000000604082015260600190565b60a081016156e98286614ecc565b8360608301528215156080830152949350505050565b600060208252610dc16020830184614eee565b6000604082526157256040830185614eee565b828103602084015261529b8185614ea0565b9283526020830191909152604082015260600190565b60405181810167ffffffffffffffff8111828210171561576c57600080fd5b604052919050565b600067ffffffffffffffff82111561578a578081fd5b5060209081020190565b600067ffffffffffffffff8211156157aa578081fd5b50601f01601f191660200190565b60005b838110156157d35781810151838201526020016157bb565b838111156157e2576000848401525b50505050565b600281106157f257fe5b50565b600481106157f257fe5b600381106157f257fe5b600781106157f257fe5b6001600160a01b03811681146157f257600080fd5b60ff811681146157f257600080fdfea365627a7a72315820b8f5e1baee716487ac576e78a6a19b92db1db8535a5a9d8ed8a3c9e3e2968a386c6578706572696d656e74616cf564736f6c63430005100040'; public static contractName = 'DevUtils'; private readonly _methodABIIndex: { [name: string]: number } = {}; public static async deployFrom0xArtifactAsync( @@ -742,95 +742,6 @@ export class DevUtilsContract extends BaseContract { stateMutability: 'pure', type: 'function', }, - { - constant: true, - inputs: [ - { - name: 'transactionData', - type: 'bytes', - }, - ], - name: 'decodeZeroExTransactionData', - outputs: [ - { - name: 'functionName', - type: 'string', - }, - { - name: 'orders', - type: 'tuple[]', - components: [ - { - name: 'makerAddress', - type: 'address', - }, - { - name: 'takerAddress', - type: 'address', - }, - { - name: 'feeRecipientAddress', - type: 'address', - }, - { - name: 'senderAddress', - type: 'address', - }, - { - name: 'makerAssetAmount', - type: 'uint256', - }, - { - name: 'takerAssetAmount', - type: 'uint256', - }, - { - name: 'makerFee', - type: 'uint256', - }, - { - name: 'takerFee', - type: 'uint256', - }, - { - name: 'expirationTimeSeconds', - type: 'uint256', - }, - { - name: 'salt', - type: 'uint256', - }, - { - name: 'makerAssetData', - type: 'bytes', - }, - { - name: 'takerAssetData', - type: 'bytes', - }, - { - name: 'makerFeeAssetData', - type: 'bytes', - }, - { - name: 'takerFeeAssetData', - type: 'bytes', - }, - ], - }, - { - name: 'takerAssetFillAmounts', - type: 'uint256[]', - }, - { - name: 'signatures', - type: 'bytes[]', - }, - ], - payable: false, - stateMutability: 'pure', - type: 'function', - }, { constant: true, inputs: [ @@ -2356,101 +2267,6 @@ export class DevUtilsContract extends BaseContract { }, }; } - /** - * Decodes the call data for an Exchange contract method call. - * @param transactionData ABI-encoded calldata for an Exchange contract - * method call. - * @returns The name of the function called, and the parameters it was given. For single-order fills and cancels, the arrays will have just one element. - */ - public decodeZeroExTransactionData( - transactionData: string, - ): ContractFunctionObj< - [ - string, - Array<{ - makerAddress: string; - takerAddress: string; - feeRecipientAddress: string; - senderAddress: string; - makerAssetAmount: BigNumber; - takerAssetAmount: BigNumber; - makerFee: BigNumber; - takerFee: BigNumber; - expirationTimeSeconds: BigNumber; - salt: BigNumber; - makerAssetData: string; - takerAssetData: string; - makerFeeAssetData: string; - takerFeeAssetData: string; - }>, - BigNumber[], - string[] - ] - > { - const self = (this as any) as DevUtilsContract; - assert.isString('transactionData', transactionData); - const functionSignature = 'decodeZeroExTransactionData(bytes)'; - - return { - async callAsync( - callData: Partial = {}, - defaultBlock?: BlockParam, - ): Promise< - [ - string, - Array<{ - makerAddress: string; - takerAddress: string; - feeRecipientAddress: string; - senderAddress: string; - makerAssetAmount: BigNumber; - takerAssetAmount: BigNumber; - makerFee: BigNumber; - takerFee: BigNumber; - expirationTimeSeconds: BigNumber; - salt: BigNumber; - makerAssetData: string; - takerAssetData: string; - makerFeeAssetData: string; - takerFeeAssetData: string; - }>, - BigNumber[], - string[] - ] - > { - BaseContract._assertCallParams(callData, defaultBlock); - const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); - const abiEncoder = self._lookupAbiEncoder(functionSignature); - BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); - return abiEncoder.strictDecodeReturnValue< - [ - string, - Array<{ - makerAddress: string; - takerAddress: string; - feeRecipientAddress: string; - senderAddress: string; - makerAssetAmount: BigNumber; - takerAssetAmount: BigNumber; - makerFee: BigNumber; - takerFee: BigNumber; - expirationTimeSeconds: BigNumber; - salt: BigNumber; - makerAssetData: string; - takerAssetData: string; - makerFeeAssetData: string; - takerFeeAssetData: string; - }>, - BigNumber[], - string[] - ] - >(rawCallResult); - }, - getABIEncodedTransactionData(): string { - return self._strictEncodeArguments(functionSignature, [transactionData]); - }, - }; - } /** * Encode ERC-1155 asset data into the format described in the AssetProxy contract specification. * @param tokenAddress The address of the ERC-1155 contract hosting the diff --git a/packages/contract-wrappers/src/generated-wrappers/lib_transaction_decoder.ts b/packages/contract-wrappers/src/generated-wrappers/lib_transaction_decoder.ts new file mode 100644 index 0000000000..009ced047d --- /dev/null +++ b/packages/contract-wrappers/src/generated-wrappers/lib_transaction_decoder.ts @@ -0,0 +1,367 @@ +// tslint:disable:no-consecutive-blank-lines ordered-imports align trailing-comma enum-naming +// tslint:disable:whitespace no-unbound-method no-trailing-whitespace +// tslint:disable:no-unused-variable +import { + AwaitTransactionSuccessOpts, + ContractFunctionObj, + ContractTxFunctionObj, + SendTransactionOpts, + BaseContract, + PromiseWithTransactionHash, + methodAbiToFunctionSignature, +} from '@0x/base-contract'; +import { schemas } from '@0x/json-schemas'; +import { + BlockParam, + BlockParamLiteral, + BlockRange, + CallData, + ContractAbi, + ContractArtifact, + DecodedLogArgs, + MethodAbi, + TransactionReceiptWithDecodedLogs, + TxData, + TxDataPayable, + SupportedProvider, +} from 'ethereum-types'; +import { BigNumber, classUtils, logUtils, providerUtils } from '@0x/utils'; +import { EventCallback, IndexedFilterValues, SimpleContractArtifact } from '@0x/types'; +import { Web3Wrapper } from '@0x/web3-wrapper'; +import { assert } from '@0x/assert'; +import * as ethers from 'ethers'; +// tslint:enable:no-unused-variable + +/* istanbul ignore next */ +// tslint:disable:no-parameter-reassignment +// tslint:disable-next-line:class-name +export class LibTransactionDecoderContract extends BaseContract { + /** + * @ignore + */ + public static deployedBytecode = + '0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80636f83188e14610030575b600080fd5b61004361003e3660046113f4565b61005c565b604051610053949392919061176e565b60405180910390f35b60608080806000610073868263ffffffff610ba616565b90506001600160e01b031981167fdedfc1f10000000000000000000000000000000000000000000000000000000014156100e4576040518060400160405280601181526020017f626174636843616e63656c4f7264657273000000000000000000000000000000815250945061067c565b6001600160e01b031981167f9694a402000000000000000000000000000000000000000000000000000000001415610153576040518060400160405280600f81526020017f626174636846696c6c4f72646572730000000000000000000000000000000000815250945061067c565b6001600160e01b031981167f8ea8dfe40000000000000000000000000000000000000000000000000000000014156101c2576040518060400160405280601681526020017f626174636846696c6c4f72646572734e6f5468726f7700000000000000000000815250945061067c565b6001600160e01b031981167fbeee2e14000000000000000000000000000000000000000000000000000000001415610231576040518060400160405280601581526020017f626174636846696c6c4f724b696c6c4f72646572730000000000000000000000815250945061067c565b6001600160e01b031981167f2da629870000000000000000000000000000000000000000000000000000000014156102a0576040518060400160405280600b81526020017f63616e63656c4f72646572000000000000000000000000000000000000000000815250945061067c565b6001600160e01b031981167f9b44d55600000000000000000000000000000000000000000000000000000000141561030f576040518060400160405280600981526020017f66696c6c4f726465720000000000000000000000000000000000000000000000815250945061067c565b6001600160e01b031981167fe14b58c400000000000000000000000000000000000000000000000000000000141561037e576040518060400160405280600f81526020017f66696c6c4f724b696c6c4f726465720000000000000000000000000000000000815250945061067c565b6001600160e01b031981167f78d29ac10000000000000000000000000000000000000000000000000000000014156103ed576040518060400160405280601681526020017f6d61726b65744275794f72646572734e6f5468726f7700000000000000000000815250945061067c565b6001600160e01b031981167f369da09900000000000000000000000000000000000000000000000000000000141561045c576040518060400160405280601781526020017f6d61726b657453656c6c4f72646572734e6f5468726f77000000000000000000815250945061067c565b6001600160e01b031981167f8bc8efb30000000000000000000000000000000000000000000000000000000014156104cb576040518060400160405280601981526020017f6d61726b65744275794f726465727346696c6c4f724b696c6c00000000000000815250945061067c565b6001600160e01b031981167fa6c3bf3300000000000000000000000000000000000000000000000000000000141561053a576040518060400160405280601a81526020017f6d61726b657453656c6c4f726465727346696c6c4f724b696c6c000000000000815250945061067c565b6001600160e01b031981167f88ec79fb0000000000000000000000000000000000000000000000000000000014156105a9576040518060400160405280600b81526020017f6d617463684f7264657273000000000000000000000000000000000000000000815250945061067c565b6001600160e01b031981167f4f9559b100000000000000000000000000000000000000000000000000000000148061060a57506001600160e01b031981167f2280c91000000000000000000000000000000000000000000000000000000000145b1561064a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106419061186d565b60405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064190611836565b6001600160e01b031981167fdedfc1f10000000000000000000000000000000000000000000000000000000014156107215785516106c490879060049063ffffffff610be916565b8060200190516106d79190810190611289565b604080516000808252602082019092529195505b5060408051600080825260208201909252919450610719565b60608152602001906001900390816107045790505b509150610b9e565b6001600160e01b031981167fbeee2e1400000000000000000000000000000000000000000000000000000000148061078257506001600160e01b031981167f9694a40200000000000000000000000000000000000000000000000000000000145b806107b657506001600160e01b031981167f8ea8dfe400000000000000000000000000000000000000000000000000000000145b156107d0576107c486610c70565b91955093509150610b9e565b6001600160e01b031981167f2da629870000000000000000000000000000000000000000000000000000000014156108b85760408051600180825281830190925290816020015b61081f610f3d565b815260200190600190039081610817575050865190945061084a90879060049063ffffffff610be916565b80602001905161085d919081019061146b565b8460008151811061086a57fe5b602002602001018190525060006040519080825280602002602001820160405280156106eb578160200160208202803883390190505060408051600080825260208201909252919450610719565b6001600160e01b031981167fe14b58c400000000000000000000000000000000000000000000000000000000148061091957506001600160e01b031981167f9b44d55600000000000000000000000000000000000000000000000000000000145b15610927576107c486610cac565b6001600160e01b031981167f78d29ac100000000000000000000000000000000000000000000000000000000148061098857506001600160e01b031981167f369da09900000000000000000000000000000000000000000000000000000000145b806109bc57506001600160e01b031981167f8bc8efb300000000000000000000000000000000000000000000000000000000145b806109f057506001600160e01b031981167fa6c3bf3300000000000000000000000000000000000000000000000000000000145b156109fe576107c486610da6565b6001600160e01b031981167f88ec79fb000000000000000000000000000000000000000000000000000000001415610b9e57610a38610f3d565b610a40610f3d565b606080610a5a60048b518c610be99092919063ffffffff16565b806020019051610a6d919081019061149e565b604080516002808252606082019092529498509296509094509250816020015b610a95610f3d565b815260200190600190039081610a8d5790505097508388600081518110610ab857fe5b60200260200101819052508288600181518110610ad157fe5b602090810291909101015260408051600280825260608201909252908160200160208202803883390190505096508360a0015187600081518110610b1157fe5b6020026020010181815250508260a0015187600181518110610b2f57fe5b60209081029190910101526040805160028082526060820190925290816020015b6060815260200190600190039081610b505790505095508186600081518110610b7557fe5b60200260200101819052508086600181518110610b8e57fe5b6020026020010181905250505050505b509193509193565b60008160040183511015610bcc57610bcc610bc76003855185600401610e1a565b610e89565b5060208183018101519101906001600160e01b0319165b92915050565b606081831115610c0257610c02610bc760008585610e1a565b8351821115610c1b57610c1b610bc76001848751610e1a565b8282036040519080825280601f01601f191660200182016040528015610c48576020820181803883390190505b509050610c69610c5782610e91565b84610c6187610e91565b018351610e97565b9392505050565b6060806060610c8c6004855186610be99092919063ffffffff16565b806020019051610c9f91908101906112c4565b9196909550909350915050565b60408051600180825281830190925260609182918291816020015b610ccf610f3d565b815260200190600190039081610cc75750506040805160018082528183019092529194506020808301908038833901905050604080516001808252818301909252919350816020015b6060815260200190600190039081610d185750508451909150610d4590859060049063ffffffff610be916565b806020019051610d589190810190611546565b85600081518110610d6557fe5b6020026020010185600081518110610d7957fe5b6020026020010185600081518110610d8d57fe5b6020908102919091010192909252919052529193909250565b604080516001808252818301909252606091829182916020808301908038833950508551919350610de29186915060049063ffffffff610be916565b806020019051610df591908101906113a1565b84518590600090610e0257fe5b60209081029190910101919091529095929450925050565b6060632800659560e01b848484604051602401610e399392919061174c565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b03199093169290921790915290509392505050565b805160208201fd5b60200190565b6020811015610ec1576001816020036101000a038019835116818551168082178652505050610f38565b82821415610ece57610f38565b82821115610f085760208103905080820181840181515b82851015610f00578451865260209586019590940193610ee5565b905250610f38565b60208103905080820181840183515b81861215610f335782518252601f199283019290910190610f17565b855250505b505050565b604051806101c00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001606081526020016060815260200160608152602001606081525090565b805173ffffffffffffffffffffffffffffffffffffffff81168114610be357600080fd5b600082601f830112611038578081fd5b815161104b611046826118cb565b6118a4565b8181529150602080830190840160005b838110156110885761107387602084518901016110ed565b8352602092830192919091019060010161105b565b5050505092915050565b600082601f8301126110a2578081fd5b81516110b0611046826118cb565b8181529150602080830190840160005b83811015611088576110d8876020845189010161113a565b835260209283019291909101906001016110c0565b600082601f8301126110fd578081fd5b815161110b611046826118eb565b915080825283602082850101111561112257600080fd5b611133816020840160208601611918565b5092915050565b60006101c080838503121561114d578182fd5b611156816118a4565b9150506111638383611004565b81526111728360208401611004565b60208201526111848360408401611004565b60408201526111968360608401611004565b60608201526080820151608082015260a082015160a082015260c082015160c082015260e082015160e08201526101008083015181830152506101208083015181830152506101408083015167ffffffffffffffff808211156111f857600080fd5b611204868387016110ed565b8385015261016092508285015191508082111561122057600080fd5b61122c868387016110ed565b8385015261018092508285015191508082111561124857600080fd5b611254868387016110ed565b838501526101a092508285015191508082111561127057600080fd5b5061127d858286016110ed565b82840152505092915050565b60006020828403121561129a578081fd5b815167ffffffffffffffff8111156112b0578182fd5b6112bc84828501611092565b949350505050565b6000806000606084860312156112d8578182fd5b835167ffffffffffffffff808211156112ef578384fd5b6112fb87838801611092565b9450602091508186015181811115611311578485fd5b80870188601f820112611322578586fd5b80519150611332611046836118cb565b82815284810190828601868502840187018c101561134e578889fd5b8893505b84841015611370578051835260019390930192918601918601611352565b5060408a015190975094505050508082111561138a578283fd5b5061139786828701611028565b9150509250925092565b6000806000606084860312156113b5578283fd5b835167ffffffffffffffff808211156113cc578485fd5b6113d887838801611092565b945060208601519350604086015191508082111561138a578283fd5b600060208284031215611405578081fd5b813567ffffffffffffffff81111561141b578182fd5b80830184601f82011261142c578283fd5b8035915061143c611046836118eb565b828152856020848401011115611450578384fd5b82602083016020830137918201602001929092529392505050565b60006020828403121561147c578081fd5b815167ffffffffffffffff811115611492578182fd5b6112bc8482850161113a565b600080600080608085870312156114b3578081fd5b845167ffffffffffffffff808211156114ca578283fd5b6114d68883890161113a565b955060208701519150808211156114eb578283fd5b6114f78883890161113a565b9450604087015191508082111561150c578283fd5b611518888389016110ed565b9350606087015191508082111561152d578283fd5b5061153a878288016110ed565b91505092959194509250565b60008060006060848603121561155a578283fd5b835167ffffffffffffffff80821115611571578485fd5b61157d8783880161113a565b9450602086015193506040860151915080821115611599578283fd5b50611397868287016110ed565b60006101c06115b68484516116af565b60208301516115c860208601826116af565b5060408301516115db60408601826116af565b5060608301516115ee60608601826116af565b506080830151608085015260a083015160a085015260c083015160c085015260e083015160e085015261010080840151818601525061012080840151818601525061014080840151828287015261164783870182611720565b915050610160915081840151858203838701526116648282611720565b9250505061018080840151858303828701526116808382611720565b9150506101a09150818401518582038387015261169d8282611720565b9695505050505050565b815260200190565b73ffffffffffffffffffffffffffffffffffffffff169052565b600081518084526020840180819550602083028101915060208501845b848110156117145782840388526116fe848351611720565b60209889019890945091909101906001016116e6565b50919695505050505050565b60008151808452611738816020860160208601611918565b601f01601f19169290920160200192915050565b606081016008851061175a57fe5b938152602081019290925260409091015290565b6000608082526117816080830187611720565b602083820381850152818751611797818561190f565b91508193508281028201838a01865b838110156117d05786830385526117be8383516115a6565b948601949250908501906001016117a6565b50508681036040880152809450885192506117eb838261190f565b94505050818701845b82811015611815576118078583516116a7565b9450908301906001016117f4565b50505050828103606084015261182b81856116c9565b979650505050505050565b60208082526019908201527f554e4b4e4f574e5f46554e4354494f4e5f53454c4543544f5200000000000000604082015260600190565b6020808252600d908201527f554e494d504c454d454e54454400000000000000000000000000000000000000604082015260600190565b60405181810167ffffffffffffffff811182821017156118c357600080fd5b604052919050565b600067ffffffffffffffff8211156118e1578081fd5b5060209081020190565b600067ffffffffffffffff821115611901578081fd5b50601f01601f191660200190565b90815260200190565b60005b8381101561193357818101518382015260200161191b565b83811115611942576000848401525b5050505056fea365627a7a72315820884abdfe69fd82b726a34318b3e10d0da6e8c516e328d10258429ee105f0ad396c6578706572696d656e74616cf564736f6c63430005100040'; + public static contractName = 'LibTransactionDecoder'; + private readonly _methodABIIndex: { [name: string]: number } = {}; + public static async deployFrom0xArtifactAsync( + artifact: ContractArtifact | SimpleContractArtifact, + supportedProvider: SupportedProvider, + txDefaults: Partial, + logDecodeDependencies: { [contractName: string]: ContractArtifact | SimpleContractArtifact }, + ): Promise { + assert.doesConformToSchema('txDefaults', txDefaults, schemas.txDataSchema, [ + schemas.addressSchema, + schemas.numberSchema, + schemas.jsNumber, + ]); + if (artifact.compilerOutput === undefined) { + throw new Error('Compiler output not found in the artifact file'); + } + const provider = providerUtils.standardizeOrThrow(supportedProvider); + const bytecode = artifact.compilerOutput.evm.bytecode.object; + const abi = artifact.compilerOutput.abi; + const logDecodeDependenciesAbiOnly: { [contractName: string]: ContractAbi } = {}; + if (Object.keys(logDecodeDependencies) !== undefined) { + for (const key of Object.keys(logDecodeDependencies)) { + logDecodeDependenciesAbiOnly[key] = logDecodeDependencies[key].compilerOutput.abi; + } + } + return LibTransactionDecoderContract.deployAsync( + bytecode, + abi, + provider, + txDefaults, + logDecodeDependenciesAbiOnly, + ); + } + public static async deployAsync( + bytecode: string, + abi: ContractAbi, + supportedProvider: SupportedProvider, + txDefaults: Partial, + logDecodeDependencies: { [contractName: string]: ContractAbi }, + ): Promise { + assert.isHexString('bytecode', bytecode); + assert.doesConformToSchema('txDefaults', txDefaults, schemas.txDataSchema, [ + schemas.addressSchema, + schemas.numberSchema, + schemas.jsNumber, + ]); + const provider = providerUtils.standardizeOrThrow(supportedProvider); + const constructorAbi = BaseContract._lookupConstructorAbi(abi); + [] = BaseContract._formatABIDataItemList(constructorAbi.inputs, [], BaseContract._bigNumberToString); + const iface = new ethers.utils.Interface(abi); + const deployInfo = iface.deployFunction; + const txData = deployInfo.encode(bytecode, []); + const web3Wrapper = new Web3Wrapper(provider); + const txDataWithDefaults = await BaseContract._applyDefaultsToContractTxDataAsync( + { + data: txData, + ...txDefaults, + }, + web3Wrapper.estimateGasAsync.bind(web3Wrapper), + ); + const txHash = await web3Wrapper.sendTransactionAsync(txDataWithDefaults); + logUtils.log(`transactionHash: ${txHash}`); + const txReceipt = await web3Wrapper.awaitTransactionSuccessAsync(txHash); + logUtils.log(`LibTransactionDecoder successfully deployed at ${txReceipt.contractAddress}`); + const contractInstance = new LibTransactionDecoderContract( + txReceipt.contractAddress as string, + provider, + txDefaults, + logDecodeDependencies, + ); + contractInstance.constructorArgs = []; + return contractInstance; + } + + /** + * @returns The contract ABI + */ + public static ABI(): ContractAbi { + const abi = [ + { + constant: true, + inputs: [ + { + name: 'transactionData', + type: 'bytes', + }, + ], + name: 'decodeZeroExTransactionData', + outputs: [ + { + name: 'functionName', + type: 'string', + }, + { + name: 'orders', + type: 'tuple[]', + components: [ + { + name: 'makerAddress', + type: 'address', + }, + { + name: 'takerAddress', + type: 'address', + }, + { + name: 'feeRecipientAddress', + type: 'address', + }, + { + name: 'senderAddress', + type: 'address', + }, + { + name: 'makerAssetAmount', + type: 'uint256', + }, + { + name: 'takerAssetAmount', + type: 'uint256', + }, + { + name: 'makerFee', + type: 'uint256', + }, + { + name: 'takerFee', + type: 'uint256', + }, + { + name: 'expirationTimeSeconds', + type: 'uint256', + }, + { + name: 'salt', + type: 'uint256', + }, + { + name: 'makerAssetData', + type: 'bytes', + }, + { + name: 'takerAssetData', + type: 'bytes', + }, + { + name: 'makerFeeAssetData', + type: 'bytes', + }, + { + name: 'takerFeeAssetData', + type: 'bytes', + }, + ], + }, + { + name: 'takerAssetFillAmounts', + type: 'uint256[]', + }, + { + name: 'signatures', + type: 'bytes[]', + }, + ], + payable: false, + stateMutability: 'pure', + type: 'function', + }, + ] as ContractAbi; + return abi; + } + + public getFunctionSignature(methodName: string): string { + const index = this._methodABIIndex[methodName]; + const methodAbi = LibTransactionDecoderContract.ABI()[index] as MethodAbi; // tslint:disable-line:no-unnecessary-type-assertion + const functionSignature = methodAbiToFunctionSignature(methodAbi); + return functionSignature; + } + public getABIDecodedTransactionData(methodName: string, callData: string): T { + const functionSignature = this.getFunctionSignature(methodName); + const self = (this as any) as LibTransactionDecoderContract; + const abiEncoder = self._lookupAbiEncoder(functionSignature); + const abiDecodedCallData = abiEncoder.strictDecode(callData); + return abiDecodedCallData; + } + public getABIDecodedReturnData(methodName: string, callData: string): T { + const functionSignature = this.getFunctionSignature(methodName); + const self = (this as any) as LibTransactionDecoderContract; + const abiEncoder = self._lookupAbiEncoder(functionSignature); + const abiDecodedCallData = abiEncoder.strictDecodeReturnValue(callData); + return abiDecodedCallData; + } + public getSelector(methodName: string): string { + const functionSignature = this.getFunctionSignature(methodName); + const self = (this as any) as LibTransactionDecoderContract; + const abiEncoder = self._lookupAbiEncoder(functionSignature); + return abiEncoder.getSelector(); + } + + /** + * Decodes the call data for an Exchange contract method call. + * @param transactionData ABI-encoded calldata for an Exchange contract + * method call. + * @returns The name of the function called, and the parameters it was given. For single-order fills and cancels, the arrays will have just one element. + */ + public decodeZeroExTransactionData( + transactionData: string, + ): ContractFunctionObj< + [ + string, + Array<{ + makerAddress: string; + takerAddress: string; + feeRecipientAddress: string; + senderAddress: string; + makerAssetAmount: BigNumber; + takerAssetAmount: BigNumber; + makerFee: BigNumber; + takerFee: BigNumber; + expirationTimeSeconds: BigNumber; + salt: BigNumber; + makerAssetData: string; + takerAssetData: string; + makerFeeAssetData: string; + takerFeeAssetData: string; + }>, + BigNumber[], + string[] + ] + > { + const self = (this as any) as LibTransactionDecoderContract; + assert.isString('transactionData', transactionData); + const functionSignature = 'decodeZeroExTransactionData(bytes)'; + + return { + async callAsync( + callData: Partial = {}, + defaultBlock?: BlockParam, + ): Promise< + [ + string, + Array<{ + makerAddress: string; + takerAddress: string; + feeRecipientAddress: string; + senderAddress: string; + makerAssetAmount: BigNumber; + takerAssetAmount: BigNumber; + makerFee: BigNumber; + takerFee: BigNumber; + expirationTimeSeconds: BigNumber; + salt: BigNumber; + makerAssetData: string; + takerAssetData: string; + makerFeeAssetData: string; + takerFeeAssetData: string; + }>, + BigNumber[], + string[] + ] + > { + BaseContract._assertCallParams(callData, defaultBlock); + const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); + const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); + return abiEncoder.strictDecodeReturnValue< + [ + string, + Array<{ + makerAddress: string; + takerAddress: string; + feeRecipientAddress: string; + senderAddress: string; + makerAssetAmount: BigNumber; + takerAssetAmount: BigNumber; + makerFee: BigNumber; + takerFee: BigNumber; + expirationTimeSeconds: BigNumber; + salt: BigNumber; + makerAssetData: string; + takerAssetData: string; + makerFeeAssetData: string; + takerFeeAssetData: string; + }>, + BigNumber[], + string[] + ] + >(rawCallResult); + }, + getABIEncodedTransactionData(): string { + return self._strictEncodeArguments(functionSignature, [transactionData]); + }, + }; + } + + constructor( + address: string, + supportedProvider: SupportedProvider, + txDefaults?: Partial, + logDecodeDependencies?: { [contractName: string]: ContractAbi }, + deployedBytecode: string | undefined = LibTransactionDecoderContract.deployedBytecode, + ) { + super( + 'LibTransactionDecoder', + LibTransactionDecoderContract.ABI(), + address, + supportedProvider, + txDefaults, + logDecodeDependencies, + deployedBytecode, + ); + classUtils.bindAll(this, ['_abiEncoderByFunctionSignature', 'address', '_web3Wrapper']); + LibTransactionDecoderContract.ABI().forEach((item, index) => { + if (item.type === 'function') { + const methodAbi = item as MethodAbi; + this._methodABIIndex[methodAbi.name] = index; + } + }); + } +} + +// tslint:disable:max-file-line-count +// tslint:enable:no-unbound-method no-parameter-reassignment no-consecutive-blank-lines ordered-imports align +// tslint:enable:trailing-comma whitespace no-trailing-whitespace diff --git a/packages/contract-wrappers/src/index.ts b/packages/contract-wrappers/src/index.ts index 12a154eece..e355ed2d1d 100644 --- a/packages/contract-wrappers/src/index.ts +++ b/packages/contract-wrappers/src/index.ts @@ -2,6 +2,7 @@ export { ContractAddresses } from '@0x/contract-addresses'; export { ContractWrappers } from './contract_wrappers'; export { DevUtilsContract } from './generated-wrappers/dev_utils'; +export { LibTransactionDecoderContract } from './generated-wrappers/lib_transaction_decoder'; export { IAssetDataContract } from './generated-wrappers/i_asset_data'; // used for synchronously encoding and decoding asset data export { ERC20TokenEventArgs, diff --git a/packages/migrations/src/migration.ts b/packages/migrations/src/migration.ts index 6f5ef71662..6674bb21e7 100644 --- a/packages/migrations/src/migration.ts +++ b/packages/migrations/src/migration.ts @@ -10,7 +10,7 @@ import { StaticCallProxyContract, } from '@0x/contracts-asset-proxy'; import { CoordinatorContract, CoordinatorRegistryContract } from '@0x/contracts-coordinator'; -import { DevUtilsContract } from '@0x/contracts-dev-utils'; +import { DevUtilsContract, LibTransactionDecoderContract } from '@0x/contracts-dev-utils'; import { ERC1155MintableContract } from '@0x/contracts-erc1155'; import { DummyERC20TokenContract, WETH9Contract } from '@0x/contracts-erc20'; import { DummyERC721TokenContract } from '@0x/contracts-erc721'; @@ -254,6 +254,14 @@ export async function runMigrationsAsync( etherToken.address, ); + // LibTransactionDecoder + const libTransactionDecoder = await LibTransactionDecoderContract.deployFrom0xArtifactAsync( + artifacts.LibTransactionDecoder, + provider, + txDefaults, + artifacts, + ); + const contractAddresses = { erc20Proxy: erc20Proxy.address, erc721Proxy: erc721Proxy.address, @@ -265,6 +273,7 @@ export async function runMigrationsAsync( erc20BridgeProxy: erc20BridgeProxy.address, zeroExGovernor: constants.NULL_ADDRESS, forwarder: forwarder.address, + libTransactionDecoder: libTransactionDecoder.address, orderValidator: constants.NULL_ADDRESS, dutchAuction: constants.NULL_ADDRESS, coordinatorRegistry: coordinatorRegistry.address, diff --git a/packages/migrations/src/testnet_migrations.ts b/packages/migrations/src/testnet_migrations.ts index 0613aee772..445a6a0884 100644 --- a/packages/migrations/src/testnet_migrations.ts +++ b/packages/migrations/src/testnet_migrations.ts @@ -9,7 +9,11 @@ import { UniswapBridgeContract, } from '@0x/contracts-asset-proxy'; import { artifacts as coordinatorArtifacts, CoordinatorContract } from '@0x/contracts-coordinator'; -import { artifacts as devUtilsArtifacts, DevUtilsContract } from '@0x/contracts-dev-utils'; +import { + artifacts as devUtilsArtifacts, + DevUtilsContract, + LibTransactionDecoderContract, +} from '@0x/contracts-dev-utils'; import { artifacts as exchangeArtifacts, ExchangeContract } from '@0x/contracts-exchange'; import { artifacts as forwarderArtifacts, ForwarderContract } from '@0x/contracts-exchange-forwarder'; import { @@ -272,6 +276,13 @@ export async function runMigrationsAsync(supportedProvider: SupportedProvider, t deployedAddresses.exchangeV2, deployedAddresses.etherToken, ); + + await LibTransactionDecoderContract.deployFrom0xArtifactAsync( + devUtilsArtifacts.LibTransactionDecoder, + provider, + txDefaults, + devUtilsArtifacts, + ); } (async () => {