diff --git a/packages/contract-addresses/src/index.ts b/packages/contract-addresses/src/index.ts index 94c7a467b3..5aa083268b 100644 --- a/packages/contract-addresses/src/index.ts +++ b/packages/contract-addresses/src/index.ts @@ -95,7 +95,7 @@ const networkToAddresses: { [networkId: number]: ContractAddresses } = { multiAssetProxy: '0xf6313a772c222f51c28f2304c0703b8cf5428fd8', staticCallProxy: '0x48e94bdb9033640d45ea7c721e25f380f8bffa43', erc1155Proxy: '0x64517fa2b480ba3678a2a3c0cf08ef7fd4fad36f', - devUtils: '0x1e3616bc5144362f95d72de41874395567697e93', + devUtils: '0xa5f985e8df08e17e88001dd85724707bcb80e413', }, // NetworkId 50 represents our Ganache snapshot generated from migrations. 50: { diff --git a/packages/contract-artifacts/artifacts/DevUtils.json b/packages/contract-artifacts/artifacts/DevUtils.json index 58e6484998..ff7de281a4 100644 --- a/packages/contract-artifacts/artifacts/DevUtils.json +++ b/packages/contract-artifacts/artifacts/DevUtils.json @@ -5,12 +5,11 @@ "abi": [ { "constant": true, - "inputs": [{ "name": "assetData", "type": "bytes" }], - "name": "decodeERC721AssetData", + "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], + "name": "decodeOrderStatusError", "outputs": [ - { "name": "assetProxyId", "type": "bytes4" }, - { "name": "tokenAddress", "type": "address" }, - { "name": "tokenId", "type": "uint256" } + { "internalType": "bytes32", "name": "orderHash", "type": "bytes32" }, + { "internalType": "enum LibOrder.OrderStatus", "name": "orderStatus", "type": "uint8" } ], "payable": false, "stateMutability": "pure", @@ -18,75 +17,196 @@ }, { "constant": true, - "inputs": [{ "name": "ownerAddress", "type": "address" }, { "name": "assetData", "type": "bytes" }], - "name": "getBalanceAndAssetProxyAllowance", - "outputs": [{ "name": "balance", "type": "uint256" }, { "name": "allowance", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "ERC1155_PROXY_ID", - "outputs": [{ "name": "", "type": "bytes4" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "name": "ownerAddress", "type": "address" }, { "name": "assetData", "type": "bytes" }], - "name": "getTransferableAssetAmount", - "outputs": [{ "name": "transferableAssetAmount", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "name": "ownerAddress", "type": "address" }, { "name": "assetData", "type": "bytes[]" }], - "name": "getBatchAssetProxyAllowances", - "outputs": [{ "name": "allowances", "type": "uint256[]" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "name": "tokenAddress", "type": "address" }], - "name": "encodeERC20AssetData", - "outputs": [{ "name": "assetData", "type": "bytes" }], + "inputs": [{ "internalType": "bytes", "name": "assetData", "type": "bytes" }], + "name": "decodeERC721AssetData", + "outputs": [ + { "internalType": "bytes4", "name": "assetProxyId", "type": "bytes4" }, + { "internalType": "address", "name": "tokenAddress", "type": "address" }, + { "internalType": "uint256", "name": "tokenId", "type": "uint256" } + ], "payable": false, "stateMutability": "pure", "type": "function" }, { "constant": true, - "inputs": [{ "name": "transactionData", "type": "bytes" }], + "inputs": [ + { "internalType": "address", "name": "ownerAddress", "type": "address" }, + { "internalType": "bytes", "name": "assetData", "type": "bytes" } + ], + "name": "getBalanceAndAssetProxyAllowance", + "outputs": [ + { "internalType": "uint256", "name": "balance", "type": "uint256" }, + { "internalType": "uint256", "name": "allowance", "type": "uint256" } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], + "name": "decodeIncompleteFillError", + "outputs": [ + { + "internalType": "enum LibExchangeRichErrors.IncompleteFillErrorCode", + "name": "errorCode", + "type": "uint8" + }, + { "internalType": "uint256", "name": "expectedAssetFillAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "actualAssetFillAmount", "type": "uint256" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "ownerAddress", "type": "address" }, + { "internalType": "bytes", "name": "assetData", "type": "bytes" } + ], + "name": "getTransferableAssetAmount", + "outputs": [{ "internalType": "uint256", "name": "transferableAssetAmount", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], + "name": "decodeAssetProxyTransferError", + "outputs": [ + { "internalType": "bytes32", "name": "orderHash", "type": "bytes32" }, + { "internalType": "bytes", "name": "assetData", "type": "bytes" }, + { "internalType": "bytes", "name": "errorData", "type": "bytes" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], + "name": "decodeNegativeSpreadError", + "outputs": [ + { "internalType": "bytes32", "name": "leftOrderHash", "type": "bytes32" }, + { "internalType": "bytes32", "name": "rightOrderHash", "type": "bytes32" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], + "name": "decodeAssetProxyDispatchError", + "outputs": [ + { + "internalType": "enum LibExchangeRichErrors.AssetProxyDispatchErrorCodes", + "name": "errorCode", + "type": "uint8" + }, + { "internalType": "bytes32", "name": "orderHash", "type": "bytes32" }, + { "internalType": "bytes", "name": "assetData", "type": "bytes" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], + "name": "decodeSignatureWalletError", + "outputs": [ + { "internalType": "bytes32", "name": "hash", "type": "bytes32" }, + { "internalType": "address", "name": "signerAddress", "type": "address" }, + { "internalType": "bytes", "name": "signature", "type": "bytes" }, + { "internalType": "bytes", "name": "errorData", "type": "bytes" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], + "name": "decodeFillError", + "outputs": [ + { + "internalType": "enum LibExchangeRichErrors.FillErrorCodes", + "name": "errorCode", + "type": "uint8" + }, + { "internalType": "bytes32", "name": "orderHash", "type": "bytes32" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "ownerAddress", "type": "address" }, + { "internalType": "bytes[]", "name": "assetData", "type": "bytes[]" } + ], + "name": "getBatchAssetProxyAllowances", + "outputs": [{ "internalType": "uint256[]", "name": "allowances", "type": "uint256[]" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "address", "name": "tokenAddress", "type": "address" }], + "name": "encodeERC20AssetData", + "outputs": [{ "internalType": "bytes", "name": "assetData", "type": "bytes" }], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], + "name": "decodeOrderEpochError", + "outputs": [ + { "internalType": "address", "name": "makerAddress", "type": "address" }, + { "internalType": "address", "name": "orderSenderAddress", "type": "address" }, + { "internalType": "uint256", "name": "currentEpoch", "type": "uint256" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "transactionData", "type": "bytes" }], "name": "decodeZeroExTransactionData", "outputs": [ - { "name": "functionName", "type": "string" }, + { "internalType": "string", "name": "functionName", "type": "string" }, { "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" } + { "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[]" }, - { "name": "takerAssetFillAmounts", "type": "uint256[]" }, - { "name": "signatures", "type": "bytes[]" } + { "internalType": "uint256[]", "name": "takerAssetFillAmounts", "type": "uint256[]" }, + { "internalType": "bytes[]", "name": "signatures", "type": "bytes[]" } ], "payable": false, "stateMutability": "pure", @@ -94,49 +214,329 @@ }, { "constant": true, - "inputs": [{ "name": "ownerAddress", "type": "address" }, { "name": "assetData", "type": "bytes" }], + "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], + "name": "decodeAssetProxyExistsError", + "outputs": [ + { "internalType": "bytes4", "name": "assetProxyId", "type": "bytes4" }, + { "internalType": "address", "name": "assetProxyAddress", "type": "address" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], + "name": "decodeSignatureValidatorNotApprovedError", + "outputs": [ + { "internalType": "address", "name": "signerAddress", "type": "address" }, + { "internalType": "address", "name": "validatorAddress", "type": "address" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "ownerAddress", "type": "address" }, + { "internalType": "bytes", "name": "assetData", "type": "bytes" } + ], "name": "getBalance", - "outputs": [{ "name": "balance", "type": "uint256" }], + "outputs": [{ "internalType": "uint256", "name": "balance", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "assetData", "type": "bytes" }], + "name": "decodeERC20AssetData", + "outputs": [ + { "internalType": "bytes4", "name": "assetProxyId", "type": "bytes4" }, + { "internalType": "address", "name": "tokenAddress", "type": "address" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], + "name": "decodeSignatureError", + "outputs": [ + { + "internalType": "enum LibExchangeRichErrors.SignatureErrorCodes", + "name": "errorCode", + "type": "uint8" + }, + { "internalType": "bytes32", "name": "hash", "type": "bytes32" }, + { "internalType": "address", "name": "signerAddress", "type": "address" }, + { "internalType": "bytes", "name": "signature", "type": "bytes" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "assetData", "type": "bytes" }], + "name": "decodeERC1155AssetData", + "outputs": [ + { "internalType": "bytes4", "name": "assetProxyId", "type": "bytes4" }, + { "internalType": "address", "name": "tokenAddress", "type": "address" }, + { "internalType": "uint256[]", "name": "tokenIds", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "tokenValues", "type": "uint256[]" }, + { "internalType": "bytes", "name": "callbackData", "type": "bytes" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "address[]", "name": "addresses", "type": "address[]" }], + "name": "getEthBalances", + "outputs": [{ "internalType": "uint256[]", "name": "", "type": "uint256[]" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "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": "address[]", "name": "takerAddresses", "type": "address[]" }, + { "internalType": "uint256[]", "name": "takerAssetFillAmounts", "type": "uint256[]" } + ], + "name": "getSimulatedOrdersTransferResults", + "outputs": [ + { + "internalType": "enum OrderTransferSimulationUtils.OrderTransferResults[]", + "name": "orderTransferResults", + "type": "uint8[]" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "tokenAddress", "type": "address" }, + { "internalType": "uint256", "name": "tokenId", "type": "uint256" } + ], + "name": "encodeERC721AssetData", + "outputs": [{ "internalType": "bytes", "name": "assetData", "type": "bytes" }], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], + "name": "decodeEIP1271SignatureError", + "outputs": [ + { "internalType": "address", "name": "verifyingContractAddress", "type": "address" }, + { "internalType": "bytes", "name": "data", "type": "bytes" }, + { "internalType": "bytes", "name": "signature", "type": "bytes" }, + { "internalType": "bytes", "name": "errorData", "type": "bytes" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "tokenAddress", "type": "address" }, + { "internalType": "uint256[]", "name": "tokenIds", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "tokenValues", "type": "uint256[]" }, + { "internalType": "bytes", "name": "callbackData", "type": "bytes" } + ], + "name": "encodeERC1155AssetData", + "outputs": [{ "internalType": "bytes", "name": "assetData", "type": "bytes" }], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "assetData", "type": "bytes" }], + "name": "decodeMultiAssetData", + "outputs": [ + { "internalType": "bytes4", "name": "assetProxyId", "type": "bytes4" }, + { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, + { "internalType": "bytes[]", "name": "nestedAssetData", "type": "bytes[]" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], + "name": "decodeTransactionExecutionError", + "outputs": [ + { "internalType": "bytes32", "name": "transactionHash", "type": "bytes32" }, + { "internalType": "bytes", "name": "errorData", "type": "bytes" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], + "name": "decodeTransactionError", + "outputs": [ + { + "internalType": "enum LibExchangeRichErrors.TransactionErrorCodes", + "name": "errorCode", + "type": "uint8" + }, + { "internalType": "bytes32", "name": "transactionHash", "type": "bytes32" } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "address", "name": "ownerAddress", "type": "address" }, + { "internalType": "bytes[]", "name": "assetData", "type": "bytes[]" } + ], + "name": "getBatchBalances", + "outputs": [{ "internalType": "uint256[]", "name": "balances", "type": "uint256[]" }], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, + "inputs": [ + { "internalType": "address", "name": "ownerAddress", "type": "address" }, + { "internalType": "bytes", "name": "assetData", "type": "bytes" } + ], + "name": "getAssetProxyAllowance", + "outputs": [{ "internalType": "uint256", "name": "allowance", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, "inputs": [ { "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" } + { "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": "order", + "type": "tuple" + }, + { "internalType": "address", "name": "takerAddress", "type": "address" }, + { "internalType": "uint256", "name": "takerAssetFillAmount", "type": "uint256" } + ], + "name": "getSimulatedOrderTransferResults", + "outputs": [ + { + "internalType": "enum OrderTransferSimulationUtils.OrderTransferResults", + "name": "orderTransferResults", + "type": "uint8" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, + { "internalType": "bytes[]", "name": "nestedAssetData", "type": "bytes[]" } + ], + "name": "encodeMultiAssetData", + "outputs": [{ "internalType": "bytes", "name": "assetData", "type": "bytes" }], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "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[]" }, - { "name": "signatures", "type": "bytes[]" } + { "internalType": "bytes[]", "name": "signatures", "type": "bytes[]" } ], "name": "getOrderRelevantStates", "outputs": [ { "components": [ - { "name": "orderStatus", "type": "uint8" }, - { "name": "orderHash", "type": "bytes32" }, - { "name": "orderTakerAssetFilledAmount", "type": "uint256" } + { "internalType": "uint8", "name": "orderStatus", "type": "uint8" }, + { "internalType": "bytes32", "name": "orderHash", "type": "bytes32" }, + { "internalType": "uint256", "name": "orderTakerAssetFilledAmount", "type": "uint256" } ], + "internalType": "struct LibOrder.OrderInfo[]", "name": "ordersInfo", "type": "tuple[]" }, - { "name": "fillableTakerAssetAmounts", "type": "uint256[]" }, - { "name": "isValidSignature", "type": "bool[]" } + { "internalType": "uint256[]", "name": "fillableTakerAssetAmounts", "type": "uint256[]" }, + { "internalType": "bool[]", "name": "isValidSignature", "type": "bool[]" } ], "payable": false, "stateMutability": "view", @@ -144,23 +544,17 @@ }, { "constant": true, - "inputs": [], - "name": "ERC20_PROXY_ID", - "outputs": [{ "name": "", "type": "bytes4" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "name": "assetData", "type": "bytes" }], - "name": "decodeERC20AssetData", + "inputs": [ + { "internalType": "address", "name": "ownerAddress", "type": "address" }, + { "internalType": "bytes[]", "name": "assetData", "type": "bytes[]" } + ], + "name": "getBatchBalancesAndAssetProxyAllowances", "outputs": [ - { "name": "assetProxyId", "type": "bytes4" }, - { "name": "tokenAddress", "type": "address" } + { "internalType": "uint256[]", "name": "balances", "type": "uint256[]" }, + { "internalType": "uint256[]", "name": "allowances", "type": "uint256[]" } ], "payable": false, - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { @@ -168,37 +562,41 @@ "inputs": [ { "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" } + { "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": "order", "type": "tuple" }, - { "name": "signature", "type": "bytes" } + { "internalType": "bytes", "name": "signature", "type": "bytes" } ], "name": "getOrderRelevantState", "outputs": [ { "components": [ - { "name": "orderStatus", "type": "uint8" }, - { "name": "orderHash", "type": "bytes32" }, - { "name": "orderTakerAssetFilledAmount", "type": "uint256" } + { "internalType": "uint8", "name": "orderStatus", "type": "uint8" }, + { "internalType": "bytes32", "name": "orderHash", "type": "bytes32" }, + { "internalType": "uint256", "name": "orderTakerAssetFilledAmount", "type": "uint256" } ], + "internalType": "struct LibOrder.OrderInfo", "name": "orderInfo", "type": "tuple" }, - { "name": "fillableTakerAssetAmount", "type": "uint256" }, - { "name": "isValidSignature", "type": "bool" } + { "internalType": "uint256", "name": "fillableTakerAssetAmount", "type": "uint256" }, + { "internalType": "bool", "name": "isValidSignature", "type": "bool" } ], "payable": false, "stateMutability": "view", @@ -206,141 +604,23 @@ }, { "constant": true, - "inputs": [{ "name": "assetData", "type": "bytes" }], - "name": "decodeERC1155AssetData", + "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }], + "name": "decodeExchangeInvalidContextError", "outputs": [ - { "name": "assetProxyId", "type": "bytes4" }, - { "name": "tokenAddress", "type": "address" }, - { "name": "tokenIds", "type": "uint256[]" }, - { "name": "tokenValues", "type": "uint256[]" }, - { "name": "callbackData", "type": "bytes" } + { + "internalType": "enum LibExchangeRichErrors.ExchangeContextErrorCodes", + "name": "errorCode", + "type": "uint8" + }, + { "internalType": "bytes32", "name": "orderHash", "type": "bytes32" }, + { "internalType": "address", "name": "contextAddress", "type": "address" } ], "payable": false, "stateMutability": "pure", "type": "function" }, { - "constant": true, - "inputs": [{ "name": "addresses", "type": "address[]" }], - "name": "getEthBalances", - "outputs": [{ "name": "", "type": "uint256[]" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "ERC721_PROXY_ID", - "outputs": [{ "name": "", "type": "bytes4" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "name": "tokenAddress", "type": "address" }, { "name": "tokenId", "type": "uint256" }], - "name": "encodeERC721AssetData", - "outputs": [{ "name": "assetData", "type": "bytes" }], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "MULTI_ASSET_PROXY_ID", - "outputs": [{ "name": "", "type": "bytes4" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { "name": "tokenAddress", "type": "address" }, - { "name": "tokenIds", "type": "uint256[]" }, - { "name": "tokenValues", "type": "uint256[]" }, - { "name": "callbackData", "type": "bytes" } - ], - "name": "encodeERC1155AssetData", - "outputs": [{ "name": "assetData", "type": "bytes" }], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "name": "tokenAddress", "type": "address" }, { "name": "tokenId", "type": "uint256" }], - "name": "getERC721TokenOwner", - "outputs": [{ "name": "ownerAddress", "type": "address" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "name": "assetData", "type": "bytes" }], - "name": "decodeMultiAssetData", - "outputs": [ - { "name": "assetProxyId", "type": "bytes4" }, - { "name": "amounts", "type": "uint256[]" }, - { "name": "nestedAssetData", "type": "bytes[]" } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "name": "ownerAddress", "type": "address" }, { "name": "assetData", "type": "bytes[]" }], - "name": "getBatchBalances", - "outputs": [{ "name": "balances", "type": "uint256[]" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "name": "ownerAddress", "type": "address" }, { "name": "assetData", "type": "bytes" }], - "name": "getAssetProxyAllowance", - "outputs": [{ "name": "allowance", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { "name": "amounts", "type": "uint256[]" }, - { "name": "nestedAssetData", "type": "bytes[]" } - ], - "name": "encodeMultiAssetData", - "outputs": [{ "name": "assetData", "type": "bytes" }], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "STATIC_CALL_PROXY_ID", - "outputs": [{ "name": "", "type": "bytes4" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "name": "ownerAddress", "type": "address" }, { "name": "assetData", "type": "bytes[]" }], - "name": "getBatchBalancesAndAssetProxyAllowances", - "outputs": [{ "name": "balances", "type": "uint256[]" }, { "name": "allowances", "type": "uint256[]" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "name": "_exchange", "type": "address" }, { "name": "_zrxAssetData", "type": "bytes" }], + "inputs": [{ "internalType": "address", "name": "_exchange", "type": "address" }], "payable": false, "stateMutability": "nonpayable", "type": "constructor" @@ -348,6 +628,26 @@ ], "devdoc": { "methods": { + "decodeAssetProxyDispatchError(bytes)": { + "details": "Decompose an ABI-encoded AssetProxyDispatchError.", + "params": { "encoded": "ABI-encoded revert error." }, + "return": "errorCode The error code.orderHash Hash of the order being dispatched.assetData Asset data of the order being dispatched." + }, + "decodeAssetProxyExistsError(bytes)": { + "details": "Decompose an ABI-encoded AssetProxyExistsError.", + "params": { "encoded": "ABI-encoded revert error." }, + "return": "assetProxyId Id of asset proxy.assetProxyAddress The address of the asset proxy." + }, + "decodeAssetProxyTransferError(bytes)": { + "details": "Decompose an ABI-encoded AssetProxyTransferError.", + "params": { "encoded": "ABI-encoded revert error." }, + "return": "orderHash Hash of the order being dispatched.assetData Asset data of the order being dispatched.errorData ABI-encoded revert data from the asset proxy." + }, + "decodeEIP1271SignatureError(bytes)": { + "details": "Decompose an ABI-encoded SignatureValidatorError.", + "params": { "encoded": "ABI-encoded revert error." }, + "return": "signerAddress The expected signer of the hash.signature The full signature bytes.errorData The revert data thrown by the validator contract." + }, "decodeERC1155AssetData(bytes)": { "details": "Decode ERC-1155 asset data from the format described in the AssetProxy contract specification.", "params": { "assetData": "AssetProxy-compliant asset data describing an ERC-1155 set of assets." }, @@ -363,11 +663,66 @@ "params": { "assetData": "AssetProxy-compliant asset data describing an ERC-721 asset." }, "return": "The ERC-721 AssetProxy identifier, the address of the ERC-721 contract hosting this asset, and the identifier of the specific asset to be traded." }, + "decodeExchangeInvalidContextError(bytes)": { + "details": "Decompose an ABI-encoded OrderStatusError.", + "params": { "encoded": "ABI-encoded revert error." }, + "return": "errorCode Error code that corresponds to invalid maker, taker, or sender.orderHash The order hash.contextAddress The maker, taker, or sender address" + }, + "decodeFillError(bytes)": { + "details": "Decompose an ABI-encoded FillError.", + "params": { "encoded": "ABI-encoded revert error." }, + "return": "errorCode The error code.orderHash The order hash." + }, + "decodeIncompleteFillError(bytes)": { + "details": "Decompose an ABI-encoded IncompleteFillError.", + "params": { "encoded": "ABI-encoded revert error." }, + "return": "orderHash Hash of the order being filled." + }, "decodeMultiAssetData(bytes)": { "details": "Decode multi-asset data from the format described in the AssetProxy contract specification.", "params": { "assetData": "AssetProxy-compliant data describing a multi-asset basket." }, "return": "The Multi-Asset AssetProxy identifier, an array of the amounts of the assets to be traded, and an array of the AssetProxy-compliant data describing each asset to be traded. Each element of the arrays corresponds to the same-indexed element of the other array." }, + "decodeNegativeSpreadError(bytes)": { + "details": "Decompose an ABI-encoded NegativeSpreadError.", + "params": { "encoded": "ABI-encoded revert error." }, + "return": "leftOrderHash Hash of the left order being matched.rightOrderHash Hash of the right order being matched." + }, + "decodeOrderEpochError(bytes)": { + "details": "Decompose an ABI-encoded OrderEpochError.", + "params": { "encoded": "ABI-encoded revert error." }, + "return": "makerAddress The order maker.orderSenderAddress The order sender.currentEpoch The current epoch for the maker." + }, + "decodeOrderStatusError(bytes)": { + "details": "Decompose an ABI-encoded OrderStatusError.", + "params": { "encoded": "ABI-encoded revert error." }, + "return": "orderHash The order hash.orderStatus The order status." + }, + "decodeSignatureError(bytes)": { + "details": "Decompose an ABI-encoded SignatureError.", + "params": { "encoded": "ABI-encoded revert error." }, + "return": "errorCode The error code.signerAddress The expected signer of the hash.signature The full signature." + }, + "decodeSignatureValidatorNotApprovedError(bytes)": { + "details": "Decompose an ABI-encoded SignatureValidatorNotApprovedError.", + "params": { "encoded": "ABI-encoded revert error." }, + "return": "signerAddress The expected signer of the hash.validatorAddress The expected validator." + }, + "decodeSignatureWalletError(bytes)": { + "details": "Decompose an ABI-encoded SignatureWalletError.", + "params": { "encoded": "ABI-encoded revert error." }, + "return": "errorCode The error code.signerAddress The expected signer of the hash.signature The full signature bytes.errorData The revert data thrown by the validator contract." + }, + "decodeTransactionError(bytes)": { + "details": "Decompose an ABI-encoded TransactionError.", + "params": { "encoded": "ABI-encoded revert error." }, + "return": "errorCode The error code.transactionHash Hash of the transaction." + }, + "decodeTransactionExecutionError(bytes)": { + "details": "Decompose an ABI-encoded TransactionExecutionError.", + "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." }, @@ -452,20 +807,12 @@ }, "return": "An array of asset balances from getBalance(), and an array of asset allowances from getAllowance(), with each element corresponding to the same-indexed element in the assetData input." }, - "getERC721TokenOwner(address,uint256)": { - "details": "Calls `asset.ownerOf(tokenId)`, but returns a null owner instead of reverting on an unowned asset.", - "params": { - "tokenAddress": "Address of ERC721 asset.", - "tokenId": "The identifier for the specific NFT." - }, - "return": "Owner of tokenId or null address if unowned." - }, "getEthBalances(address[])": { "details": "Batch fetches ETH balances", "params": { "addresses": "Array of addresses." }, "return": "Array of ETH balances." }, - "getOrderRelevantState((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes)": { + "getOrderRelevantState((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes),bytes)": { "details": "Fetches all order-relevant information needed to validate if the supplied order is fillable.", "params": { "order": "The order structure.", @@ -473,7 +820,7 @@ }, "return": "The orderInfo (hash, status, and `takerAssetAmount` already filled for the given order), fillableTakerAssetAmount (amount of the order's `takerAssetAmount` that is fillable given all on-chain state), and isValidSignature (validity of the provided signature). NOTE: If the `takerAssetData` encodes data for multiple assets, `fillableTakerAssetAmount` will represent a \"scaled\" amount, meaning it must be multiplied by all the individual asset amounts within the `takerAssetData` to get the final amount of each asset that can be filled." }, - "getOrderRelevantStates((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],bytes[])": { + "getOrderRelevantStates((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[])": { "details": "Fetches all order-relevant information needed to validate if the supplied orders are fillable.", "params": { "orders": "Array of order structures.", @@ -481,21 +828,72 @@ }, "return": "The ordersInfo (array of the hash, status, and `takerAssetAmount` already filled for each order), fillableTakerAssetAmounts (array of amounts for each order's `takerAssetAmount` that is fillable given all on-chain state), and isValidSignature (array containing the validity of each provided signature). NOTE: If the `takerAssetData` encodes data for multiple assets, each element of `fillableTakerAssetAmounts` will represent a \"scaled\" amount, meaning it must be multiplied by all the individual asset amounts within the `takerAssetData` to get the final amount of each asset that can be filled." }, + "getSimulatedOrderTransferResults((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes),address,uint256)": { + "details": "Simulates all of the transfers within an order and returns the index of the first failed transfer.", + "params": { + "order": "The order to simulate transfers for.", + "takerAddress": "The address of the taker that will fill the order.", + "takerAssetFillAmount": "The amount of takerAsset that the taker wished to fill." + }, + "return": "The index of the first failed transfer (or 4 if all transfers are successful)." + }, + "getSimulatedOrdersTransferResults((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],address[],uint256[])": { + "details": "Simulates all of the transfers for each given order and returns the indices of each first failed transfer.", + "params": { + "orders": "Array of orders to individually simulate transfers for.", + "takerAddresses": "Array of addresses of takers that will fill each order.", + "takerAssetFillAmounts": "Array of amounts of takerAsset that will be filled for each order." + }, + "return": "The indices of the first failed transfer (or 4 if all transfers are successful) for each order." + }, "getTransferableAssetAmount(address,bytes)": { "details": "Gets the amount of an asset transferable by the owner.", "params": { "assetData": "Description of tokens, per the AssetProxy contract specification.", "ownerAddress": "Address of the owner of the asset." }, - "return": "The amount of the asset tranferable by the owner. NOTE: If the `assetData` encodes data for multiple assets, the `transferableAssetAmount` will represent the amount of times the entire `assetData` can be transferred. To calculate the total individual transferable amounts, this scaled `transferableAmount` must be multiplied by the individual asset amounts located within the `assetData`." + "return": "The amount of the asset tranferable by the owner. NOTE: If the `assetData` encodes data for multiple assets, the `transferableAssetAmount` will represent the amount of times the entire `assetData` can be transferred. To calculate the total individual transferable amounts, this scaled `transferableAmount` must be multiplied by the individual asset amounts located within the `assetData`." } } }, "evm": { "bytecode": { - "object": "0x60806040523480156200001157600080fd5b5060405162004f8938038062004f898339810160408190526200003491620004ae565b600080546001600160a01b0319166001600160a01b0384811691909117918290556040517f60704108000000000000000000000000000000000000000000000000000000008152849284928492911690636070410890620000ba907ff47261b0000000000000000000000000000000000000000000000000000000009060040162000589565b60206040518083038186803b158015620000d357600080fd5b505afa158015620000e8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200010e919081019062000488565b600180546001600160a01b0319166001600160a01b039283161790556000546040517f607041080000000000000000000000000000000000000000000000000000000081529116906360704108906200018c907f02571792000000000000000000000000000000000000000000000000000000009060040162000589565b60206040518083038186803b158015620001a557600080fd5b505afa158015620001ba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620001e0919081019062000488565b600280546001600160a01b0319166001600160a01b039283161790556000546040517f607041080000000000000000000000000000000000000000000000000000000081529116906360704108906200025e907fa7cb5fb7000000000000000000000000000000000000000000000000000000009060040162000589565b60206040518083038186803b1580156200027757600080fd5b505afa1580156200028c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620002b2919081019062000488565b600380546001600160a01b0319166001600160a01b039283161790556000546040517f6070410800000000000000000000000000000000000000000000000000000000815291169063607041089062000330907fc339d10a000000000000000000000000000000000000000000000000000000009060040162000589565b60206040518083038186803b1580156200034957600080fd5b505afa1580156200035e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000384919081019062000488565b600480546001600160a01b0319166001600160a01b0392909216919091179055508051620003ba906005906020840190620003c5565b5050505050620005b6565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200040857805160ff191683800117855562000438565b8280016001018555821562000438579182015b82811115620004385782518255916020019190600101906200041b565b50620004469291506200044a565b5090565b6200046791905b8082111562000446576000815560010162000451565b90565b80516001600160a01b03811681146200048257600080fd5b92915050565b6000602082840312156200049b57600080fd5b620004a783836200046a565b9392505050565b60008060408385031215620004c1578081fd5b620004cd84846200046a565b602084810151919350906001600160401b0380821115620004ec578384fd5b81860187601f820112620004fe578485fd5b80519250818311156200050f578485fd5b604051601f8401601f19168101850183811182821017156200052f578687fd5b604052838152818401850189101562000546578586fd5b8592505b838310156200056957818301850151818401860152918401916200054a565b838311156200057a57858585830101525b80955050505050509250929050565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b6149c380620005c66000396000f3fe608060405234801561001057600080fd5b50600436106101a35760003560e01c80639eadc835116100ee578063b698846311610097578063d186037f11610071578063d186037f146103ce578063d3d862d1146103e1578063d965b998146103f4578063e4e6e7da146103fc576101a3565b8063b698846314610379578063bbb2dcf614610399578063d001c5dc146103bb576101a3565b8063a6627e9f116100c8578063a6627e9f1461034b578063b37fda041461035e578063b43cffe114610366576101a3565b80639eadc8351461030c578063a0901e5114610330578063a28fe02e14610343576101a3565b80636f83188e116101505780638ee1a6421161012a5780638ee1a642146102c15780638f4ce479146102c95780638f5afa52146102ea576101a3565b80636f83188e146102695780637d7275121461028c5780637f46448d1461029f576101a3565b80632322cf76116101815780632322cf76146102095780634dfdac2014610229578063590aa87514610249576101a3565b806304a5618a146101a85780630d7b7d76146101d35780631bd0eb8f146101f4575b600080fd5b6101bb6101b6366004613ccb565b61041d565b6040516101ca939291906143d1565b60405180910390f35b6101e66101e1366004613940565b6104e3565b6040516101ca929190614892565b6101fc610505565b6040516101ca91906142d4565b61021c610217366004613940565b610529565b6040516101ca9190614889565b61023c610237366004613858565b610551565b6040516101ca9190614239565b61025c61025736600461383b565b6105d4565b6040516101ca919061446e565b61027c610277366004613ccb565b610673565b6040516101ca94939291906144cc565b61021c61029a366004613940565b6114f7565b6102b26102ad366004613a83565b611b87565b6040516101ca9392919061419d565b6101fc611cbf565b6102dc6102d7366004613ccb565b611ce3565b6040516101ca929190614301565b6102fd6102f8366004613d8b565b611d8b565b6040516101ca93929190614852565b61031f61031a366004613ccb565b612081565b6040516101ca959493929190614349565b61023c61033e3660046139b2565b612144565b6101fc6121ca565b61025c610359366004613986565b6121ee565b6101fc612290565b61025c6103743660046138a8565b6122b4565b61038c610387366004613986565b61235c565b6040516101ca91906140d0565b6103ac6103a7366004613ccb565b61247a565b6040516101ca93929190614421565b61023c6103c9366004613858565b61253f565b61021c6103dc366004613940565b6125ad565b61025c6103ef366004613c02565b612cb5565b6101fc612cd2565b61040f61040a366004613858565b612cf6565b6040516101ca92919061427a565b60008080610431848263ffffffff612d0f16565b92507fffffffff0000000000000000000000000000000000000000000000000000000083167f0257179200000000000000000000000000000000000000000000000000000000146104b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ae9061481b565b60405180910390fd5b6104c884601063ffffffff612d7a16565b91506104db84602463ffffffff612dd916565b929491935050565b6000806104f084846114f7565b91506104fc84846125ad565b90509250929050565b7fa7cb5fb70000000000000000000000000000000000000000000000000000000081565b600080600061053885856104e3565b915091506105468282612dec565b925050505b92915050565b606060008251905080604051908082528060200260200182016040528015610583578160200160208202803883390190505b50915060005b8181146105cc576105ad858583815181106105a057fe5b60200260200101516125ad565b8382815181106105b957fe5b6020908102919091010152600101610589565b505092915050565b606063f47261b060e01b826040516024016105ef91906140d0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050919050565b6060808080600061068a868263ffffffff612d0f16565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167f4ac14782000000000000000000000000000000000000000000000000000000001415610713576040518060400160405280601181526020017f626174636843616e63656c4f72646572730000000000000000000000000000008152509450610e61565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f297bb70b00000000000000000000000000000000000000000000000000000000141561079a576040518060400160405280600f81526020017f626174636846696c6c4f726465727300000000000000000000000000000000008152509450610e61565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f50dde190000000000000000000000000000000000000000000000000000000001415610821576040518060400160405280601681526020017f626174636846696c6c4f72646572734e6f5468726f77000000000000000000008152509450610e61565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f4d0ae5460000000000000000000000000000000000000000000000000000000014156108a8576040518060400160405280601581526020017f626174636846696c6c4f724b696c6c4f726465727300000000000000000000008152509450610e61565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fd46b02c300000000000000000000000000000000000000000000000000000000141561092f576040518060400160405280600b81526020017f63616e63656c4f726465720000000000000000000000000000000000000000008152509450610e61565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fb4be83d50000000000000000000000000000000000000000000000000000000014156109b6576040518060400160405280600981526020017f66696c6c4f7264657200000000000000000000000000000000000000000000008152509450610e61565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f3e228bae000000000000000000000000000000000000000000000000000000001415610a3d576040518060400160405280601081526020017f66696c6c4f726465724e6f5468726f77000000000000000000000000000000008152509450610e61565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f64a3bc15000000000000000000000000000000000000000000000000000000001415610ac4576040518060400160405280600f81526020017f66696c6c4f724b696c6c4f7264657200000000000000000000000000000000008152509450610e61565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fe5fa431b000000000000000000000000000000000000000000000000000000001415610b4b576040518060400160405280600f81526020017f6d61726b65744275794f726465727300000000000000000000000000000000008152509450610e61565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fa3e20380000000000000000000000000000000000000000000000000000000001415610bd2576040518060400160405280601681526020017f6d61726b65744275794f72646572734e6f5468726f77000000000000000000008152509450610e61565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f7e1d9808000000000000000000000000000000000000000000000000000000001415610c59576040518060400160405280601081526020017f6d61726b657453656c6c4f7264657273000000000000000000000000000000008152509450610e61565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fdd1c7d18000000000000000000000000000000000000000000000000000000001415610ce0576040518060400160405280601781526020017f6d61726b657453656c6c4f72646572734e6f5468726f770000000000000000008152509450610e61565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f3c28d861000000000000000000000000000000000000000000000000000000001415610d67576040518060400160405280600b81526020017f6d617463684f72646572730000000000000000000000000000000000000000008152509450610e61565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f4f9559b1000000000000000000000000000000000000000000000000000000001480610df857507fffffffff0000000000000000000000000000000000000000000000000000000081167fbfc8bfce00000000000000000000000000000000000000000000000000000000145b15610e2f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ae9061472a565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ae906146f3565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f4ac14782000000000000000000000000000000000000000000000000000000001415610f1e578551610ec190879060049063ffffffff612e0216565b806020019051610ed49190810190613a4e565b604080516000808252602082019092529195505b5060408051600080825260208201909252919450610f16565b6060815260200190600190039081610f015790505b5091506114ef565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f4d0ae546000000000000000000000000000000000000000000000000000000001480610faf57507fffffffff0000000000000000000000000000000000000000000000000000000081167f50dde19000000000000000000000000000000000000000000000000000000000145b80610ffb57507fffffffff0000000000000000000000000000000000000000000000000000000081167f297bb70b00000000000000000000000000000000000000000000000000000000145b156110155761100986612ec7565b919550935091506114ef565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fd46b02c30000000000000000000000000000000000000000000000000000000014156111155760408051600180825281830190925290816020015b61107c6132e9565b81526020019060019003908161107457505086519094506110a790879060049063ffffffff612e0216565b8060200190516110ba9190810190613d56565b846000815181106110c757fe5b60200260200101819052506000604051908082528060200260200182016040528015610ee8578160200160208202803883390190505060408051600080825260208201909252919450610f16565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f64a3bc150000000000000000000000000000000000000000000000000000000014806111a657507fffffffff0000000000000000000000000000000000000000000000000000000081167fb4be83d500000000000000000000000000000000000000000000000000000000145b806111f257507fffffffff0000000000000000000000000000000000000000000000000000000081167f3e228bae00000000000000000000000000000000000000000000000000000000145b156112005761100986612f03565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fe5fa431b00000000000000000000000000000000000000000000000000000000148061129157507fffffffff0000000000000000000000000000000000000000000000000000000081167fa3e2038000000000000000000000000000000000000000000000000000000000145b806112dd57507fffffffff0000000000000000000000000000000000000000000000000000000081167f7e1d980800000000000000000000000000000000000000000000000000000000145b8061132957507fffffffff0000000000000000000000000000000000000000000000000000000081167fdd1c7d1800000000000000000000000000000000000000000000000000000000145b156113375761100986612ffd565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f3c28d8610000000000000000000000000000000000000000000000000000000014156114ef576113896132e9565b6113916132e9565b6060806113ab60048b518c612e029092919063ffffffff16565b8060200190516113be9190810190613de5565b604080516002808252606082019092529498509296509094509250816020015b6113e66132e9565b8152602001906001900390816113de579050509750838860008151811061140957fe5b6020026020010181905250828860018151811061142257fe5b602090810291909101015260408051600280825260608201909252908160200160208202803883390190505096508360a001518760008151811061146257fe5b6020026020010181815250508260a001518760018151811061148057fe5b60209081029190910101526040805160028082526060820190925290816020015b60608152602001906001900390816114a157905050955081866000815181106114c657fe5b602002602001018190525080866001815181106114df57fe5b6020026020010181905250505050505b509193509193565b60008061150a838263ffffffff612d0f16565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167ff47261b000000000000000000000000000000000000000000000000000000000141561168857600061156984601063ffffffff612d7a16565b905060606370a0823160e01b8660405160240161158691906140d0565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608373ffffffffffffffffffffffffffffffffffffffff168360405161160e91906140b4565b600060405180830381855afa9150503d8060008114611649576040519150601f19603f3d011682016040523d82523d6000602084013e61164e565b606091505b5091509150818015611661575080516020145b61166c57600061167d565b61167d81600063ffffffff612dd916565b955050505050611b80565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f02571792000000000000000000000000000000000000000000000000000000001415611735576000806116de8561041d565b92509250508573ffffffffffffffffffffffffffffffffffffffff16611704838361235c565b73ffffffffffffffffffffffffffffffffffffffff1614611726576000611729565b60015b60ff1693505050611b80565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fa7cb5fb700000000000000000000000000000000000000000000000000000000141561191f57600060608061178d86612081565b5081519296509094509250905060005b81811461191557606062fdd58e60e01b8a8684815181106117ba57fe5b60200260200101516040516024016117d3929190614177565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608773ffffffffffffffffffffffffffffffffffffffff168360405161185b91906140b4565b600060405180830381855afa9150503d8060008114611896576040519150601f19603f3d011682016040523d82523d6000602084013e61189b565b606091505b509150915060008280156118b0575081516020145b6118bb5760006118cc565b6118cc82600063ffffffff612dd916565b905060008786815181106118dc57fe5b602002602001015182816118ec57fe5b0490508b8110806118fb57508b155b1561190457809b505b50506001909301925061179d915050565b5050505050611b80565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fc339d10a000000000000000000000000000000000000000000000000000000001415611ab157606063a85e59e460e01b84600080600060405160240161198c9493929190614481565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252600454915190925060009173ffffffffffffffffffffffffffffffffffffffff1690611a369084906140b4565b600060405180830381855afa9150503d8060008114611a71576040519150601f19603f3d011682016040523d82523d6000602084013e611a76565b606091505b5050905080611a86576000611aa8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b93505050611b80565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f94cfcdd7000000000000000000000000000000000000000000000000000000001415611b8057606080611b078561247a565b80519194509250905060005b818114611b7b576000611b3989858481518110611b2c57fe5b60200260200101516114f7565b90506000858381518110611b4957fe5b60200260200101518281611b5957fe5b04905087811080611b68575087155b15611b71578097505b5050600101611b13565b505050505b5092915050565b606080606060008551905080604051908082528060200260200182016040528015611bcc57816020015b611bb96133a2565b815260200190600190039081611bb15790505b50935080604051908082528060200260200182016040528015611bf9578160200160208202803883390190505b50925080604051908082528060200260200182016040528015611c26578160200160208202803883390190505b50915060005b818114611cb657611c63878281518110611c4257fe5b6020026020010151878381518110611c5657fe5b6020026020010151611d8b565b8751889085908110611c7157fe5b60200260200101878581518110611c8457fe5b60200260200101878681518110611c9757fe5b9315156020948502919091019093019290925291905252600101611c2c565b50509250925092565b7ff47261b00000000000000000000000000000000000000000000000000000000081565b600080611cf6838263ffffffff612d0f16565b91507fffffffff0000000000000000000000000000000000000000000000000000000082167ff47261b00000000000000000000000000000000000000000000000000000000014611d73576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ae9061481b565b611d8483601063ffffffff612d7a16565b9050915091565b611d936133a2565b600080546040517fc75e0a81000000000000000000000000000000000000000000000000000000008152829173ffffffffffffffffffffffffffffffffffffffff169063c75e0a8190611dea908890600401614876565b60606040518083038186803b158015611e0257600080fd5b505afa158015611e16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611e3a9190810190613d00565b855160005460208301516040517f93634702000000000000000000000000000000000000000000000000000000008152939650919273ffffffffffffffffffffffffffffffffffffffff90911691639363470291611e9f919085908a9060040161429f565b60206040518083038186803b158015611eb757600080fd5b505afa158015611ecb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611eef9190810190613ca9565b91506000611f0282886101400151610529565b60a088015160c08901516005805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152959650939492936060939291830182828015611fba5780601f10611f8f57610100808354040283529160200191611fba565b820191906000526020600020905b815481529060010190602001808311611f9d57829003601f168201915b505050505090506000611fdb828c610140015161307190919063ffffffff16565b15611fff57611ff885611ff28d6080015186613096565b866130d5565b905061205b565b600061200b8784610529565b90508361202857612021868d60800151876130d5565b9150612059565b6000612039878e60800151886130d5565b905060006120488387896130d5565b90506120548282612dec565b935050505b505b61207261206c858b6040015161312b565b82612dec565b97505050505050509250925092565b60008060608080612098868563ffffffff612d0f16565b94507fffffffff0000000000000000000000000000000000000000000000000000000085167fa7cb5fb70000000000000000000000000000000000000000000000000000000014612115576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ae9061481b565b505050506024828101516044840151606485015160848601519496929591820184019490820184019391010190565b6060808251604051908082528060200260200182016040528015612172578160200160208202803883390190505b50905060005b83518114611b805783818151811061218c57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16318282815181106121b757fe5b6020908102919091010152600101612178565b7f025717920000000000000000000000000000000000000000000000000000000081565b6060630257179260e01b838360405160240161220b929190614177565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905092915050565b7f94cfcdd70000000000000000000000000000000000000000000000000000000081565b606063a7cb5fb760e01b858585856040516024016122d59493929190614118565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050949350505050565b60006060636352211e60e01b836040516024016123799190614889565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608573ffffffffffffffffffffffffffffffffffffffff168360405161240191906140b4565b600060405180830381855afa9150503d806000811461243c576040519150601f19603f3d011682016040523d82523d6000602084013e612441565b606091505b5091509150818015612454575080516020145b61245f576000612470565b61247081600c63ffffffff612d7a16565b9695505050505050565b600060608061248f848463ffffffff612d0f16565b92507fffffffff0000000000000000000000000000000000000000000000000000000083167f94cfcdd7000000000000000000000000000000000000000000000000000000001461250c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ae9061481b565b835161252290859060049063ffffffff612e0216565b8060200190516125359190810190613c4f565b9395909450915050565b606060008251905080604051908082528060200260200182016040528015612571578160200160208202803883390190505b50915060005b8181146105cc5761258e85858381518110611b2c57fe5b83828151811061259a57fe5b6020908102919091010152600101612577565b6000806125c0838263ffffffff612d0f16565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167f94cfcdd700000000000000000000000000000000000000000000000000000000141561268a576060806126188561247a565b80519194509250905060005b81811461267f57600061263d898584815181106105a057fe5b9050600085838151811061264d57fe5b6020026020010151828161265d57fe5b0490508781108061266c575087155b15612675578097505b5050600101612624565b5061054b9350505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff47261b000000000000000000000000000000000000000000000000000000000141561273a5760006126e784601063ffffffff612d7a16565b6001546040519192506060917fdd62ed3e000000000000000000000000000000000000000000000000000000009161158691899173ffffffffffffffffffffffffffffffffffffffff16906024016140f1565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f02571792000000000000000000000000000000000000000000000000000000001415612a68576000806127908561041d565b600254604051929550909350606092507fe985e9c500000000000000000000000000000000000000000000000000000000916127e9918a9173ffffffffffffffffffffffffffffffffffffffff909116906024016140f1565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608473ffffffffffffffffffffffffffffffffffffffff168360405161287191906140b4565b600060405180830381855afa9150503d80600081146128ac576040519150601f19603f3d011682016040523d82523d6000602084013e6128b1565b606091505b50915091508115806128c557508051602014155b806128e157506128dc81600063ffffffff612dd916565b600114155b15612a3b57606063081812fc60e01b856040516024016129019190614889565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090508573ffffffffffffffffffffffffffffffffffffffff168160405161298591906140b4565b600060405180830381855afa9150503d80600081146129c0576040519150601f19603f3d011682016040523d82523d6000602084013e6129c5565b606091505b5090935091508280156129d9575081516020145b8015612a22575060025473ffffffffffffffffffffffffffffffffffffffff16612a0a83600c63ffffffff612d7a16565b73ffffffffffffffffffffffffffffffffffffffff16145b612a2d576000612a30565b60015b60ff16975050611915565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff96505050505050611b80565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fa7cb5fb7000000000000000000000000000000000000000000000000000000001415612c42576000612abd84612081565b5050600354604051929450606093507fe985e9c50000000000000000000000000000000000000000000000000000000092612b149250899173ffffffffffffffffffffffffffffffffffffffff16906024016140f1565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608373ffffffffffffffffffffffffffffffffffffffff1683604051612b9c91906140b4565b600060405180830381855afa9150503d8060008114612bd7576040519150601f19603f3d011682016040523d82523d6000602084013e612bdc565b606091505b5091509150818015612bef575080516020145b8015612c0b5750612c0781600063ffffffff612dd916565b6001145b612c1657600061167d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff955050505050611b80565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fc339d10a000000000000000000000000000000000000000000000000000000001415611b8057507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9392505050565b60606394cfcdd760e01b838360405160240161220b92919061424c565b7fc339d10a0000000000000000000000000000000000000000000000000000000081565b606080612d03848461253f565b91506104fc8484610551565b60008160040183511015612d4f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ae906147be565b5001602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b60008160140183511015612dba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ae90614761565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b6000612de5838361316d565b9392505050565b6000818310612dfb5781612de5565b5090919050565b606081831115612e3e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ae90614583565b8351821115612e79576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ae906145ba565b8282036040519080825280601f01601f191660200182016040528015612ea6576020820181803883390190505b509050612de5612eb5826131b6565b84612ebf876131b6565b0183516131bc565b6060806060612ee36004855186612e029092919063ffffffff16565b806020019051612ef69190810190613b2b565b9196909550909350915050565b60408051600180825281830190925260609182918291816020015b612f266132e9565b815260200190600190039081612f1e5750506040805160018082528183019092529194506020808301908038833901905050604080516001808252818301909252919350816020015b6060815260200190600190039081612f6f5750508451909150612f9c90859060049063ffffffff612e0216565b806020019051612faf9190810190613e82565b85600081518110612fbc57fe5b6020026020010185600081518110612fd057fe5b6020026020010185600081518110612fe457fe5b6020908102919091010192909252919052529193909250565b6040805160018082528183019092526060918291829160208083019080388339505085519193506130399186915060049063ffffffff612e0216565b80602001905161304c9190810190613baf565b8451859060009061305957fe5b60209081029190910101919091529095929450925050565b600081518351148015612de55750508051602091820120825192909101919091201490565b600082820183811015612de5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ae906146bc565b6000808311613110576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ae90614685565b61312361311d8584613280565b846132d4565b949350505050565b600082821115613167576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ae906145f1565b50900390565b600081602001835110156131ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ae90614628565b50016020015190565b60200190565b60208110156131e6576001816020036101000a03801983511681855116808217865250505061327b565b828214156131f35761327b565b8282111561322d5760208103905080820181840181515b8285101561322557845186526020958601959094019361320a565b90525061327b565b60208103905080820181840183515b8186121561327657825182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0928301929091019061323c565b855250505b505050565b60008261328f5750600061054b565b8282028284828161329c57fe5b0414612de5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ae906146bc565b6000808284816132e057fe5b04949350505050565b604051806101800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160608152602001606081525090565b604080516060810182526000808252602082018190529181019190915290565b803561054b8161495b565b805161054b8161495b565b600082601f8301126133e8578081fd5b81516133fb6133f6826148c7565b6148a0565b8181529150602080830190840160005b83811015613438576134238760208451890101613602565b8352602092830192919091019060010161340b565b5050505092915050565b600082601f830112613452578081fd5b81356134606133f6826148c7565b8181529150602080830190840160005b838110156134385761348887602084358901016135b4565b83526020928301929190910190600101613470565b600082601f8301126134ad578081fd5b81516134bb6133f6826148c7565b8181529150602080830190840160005b83811015613438576134e38760208451890101613748565b835260209283019291909101906001016134cb565b600082601f830112613508578081fd5b81516135166133f6826148c7565b81815291506020808301908481018184028601820187101561353757600080fd5b60005b84811015611b7b5781518452928201929082019060010161353a565b600082601f830112613566578081fd5b81356135746133f6826148c7565b81815291506020808301908481018184028601820187101561359557600080fd5b60005b84811015611b7b57813584529282019290820190600101613598565b600082601f8301126135c4578081fd5b81356135d26133f6826148e8565b91508082528360208285010111156135e957600080fd5b8060208401602084013760009082016020015292915050565b600082601f83011261361357600080fd5b81516136216133f6826148e8565b915080825283602082850101111561363857600080fd5b611b8081602084016020860161492b565b600061018080838503121561365c578182fd5b613665816148a0565b91505061367283836133c2565b815261368183602084016133c2565b602082015261369383604084016133c2565b60408201526136a583606084016133c2565b60608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013567ffffffffffffffff8082111561370757600080fd5b613713868387016135b4565b8385015261016092508285013591508082111561372f57600080fd5b5061373c858286016135b4565b82840152505092915050565b600061018080838503121561375b578182fd5b613764816148a0565b91505061377183836133cd565b815261378083602084016133cd565b602082015261379283604084016133cd565b60408201526137a483606084016133cd565b60608201526080820151608082015260a082015160a082015260c082015160c082015260e082015160e08201526101008083015181830152506101208083015181830152506101408083015167ffffffffffffffff8082111561380657600080fd5b61381286838701613602565b8385015261016092508285015191508082111561382e57600080fd5b5061373c85828601613602565b60006020828403121561384d57600080fd5b8135612de58161495b565b6000806040838503121561386b57600080fd5b82356138768161495b565b9150602083013567ffffffffffffffff81111561389257600080fd5b61389e85828601613442565b9150509250929050565b600080600080608085870312156138bd578182fd5b84356138c88161495b565b9350602085013567ffffffffffffffff808211156138e4578384fd5b6138f088838901613556565b94506040870135915080821115613905578384fd5b61391188838901613556565b9350606087013591508082111561392757600080fd5b50613934878288016135b4565b91505092959194509250565b6000806040838503121561395357600080fd5b823561395e8161495b565b9150602083013567ffffffffffffffff81111561397a57600080fd5b61389e858286016135b4565b6000806040838503121561399957600080fd5b82356139a48161495b565b946020939093013593505050565b600060208083850312156139c4578182fd5b823567ffffffffffffffff8111156139da578283fd5b80840185601f8201126139eb578384fd5b803591506139fb6133f6836148c7565b8281528381019082850185850284018601891015613a17578687fd5b8693505b84841015613a42578035613a2e8161495b565b835260019390930192918501918501613a1b565b50979650505050505050565b600060208284031215613a6057600080fd5b815167ffffffffffffffff811115613a7757600080fd5b6131238482850161349d565b60008060408385031215613a95578182fd5b823567ffffffffffffffff80821115613aac578384fd5b81850186601f820112613abd578485fd5b80359250613acd6133f6846148c7565b83815260208082019190838101885b87811015613b0557613af38c848435890101613649565b85529382019390820190600101613adc565b50919750880135945050505080821115613b1e57600080fd5b5061389e85828601613442565b600080600060608486031215613b3f578081fd5b835167ffffffffffffffff80821115613b56578283fd5b613b628783880161349d565b94506020860151915080821115613b77578283fd5b613b83878388016134f8565b93506040860151915080821115613b98578283fd5b50613ba5868287016133d8565b9150509250925092565b600080600060608486031215613bc3578081fd5b835167ffffffffffffffff80821115613bda578283fd5b613be68783880161349d565b9450602086015193506040860151915080821115613b98578283fd5b60008060408385031215613c1557600080fd5b823567ffffffffffffffff80821115613c2d57600080fd5b613c3986838701613556565b93506020850135915080821115613b1e57600080fd5b60008060408385031215613c6257600080fd5b825167ffffffffffffffff80821115613c7a57600080fd5b613c86868387016134f8565b93506020850151915080821115613c9c57600080fd5b5061389e858286016133d8565b600060208284031215613cbb57600080fd5b81518015158114612de557600080fd5b600060208284031215613cdd57600080fd5b813567ffffffffffffffff811115613cf457600080fd5b613123848285016135b4565b60006060828403128015613d12578182fd5b8015613d1c578182fd5b50613d2760606148a0565b825160ff81168114613d37578283fd5b8152602083810151908201526040928301519281019290925250919050565b600060208284031215613d6857600080fd5b815167ffffffffffffffff811115613d7f57600080fd5b61312384828501613748565b60008060408385031215613d9e57600080fd5b823567ffffffffffffffff80821115613db657600080fd5b613dc286838701613649565b93506020850135915080821115613dd857600080fd5b5061389e858286016135b4565b60008060008060808587031215613dfa578182fd5b845167ffffffffffffffff80821115613e11578384fd5b613e1d88838901613748565b95506020870151915080821115613e32578384fd5b613e3e88838901613748565b94506040870151915080821115613e53578384fd5b613e5f88838901613602565b93506060870151915080821115613e7557600080fd5b5061393487828801613602565b600080600060608486031215613e96578081fd5b835167ffffffffffffffff80821115613ead578283fd5b613eb987838801613748565b9450602086015193506040860151915080821115613ed5578283fd5b50613ba586828701613602565b73ffffffffffffffffffffffffffffffffffffffff169052565b60008151808452602084018081955060208302810191506020850160005b84811015613f48578284038852613f32848351613f90565b6020988901989094509190910190600101613f1a565b50919695505050505050565b600081518084526020840193506020830160005b82811015613f86578151865260209586019590910190600101613f68565b5093949350505050565b60008151808452613fa881602086016020860161492b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b805160ff16825260208082015190830152604090810151910152565b6000610180614006848451613ee2565b60208301516140186020860182613ee2565b50604083015161402b6040860182613ee2565b50606083015161403e6060860182613ee2565b506080830151608085015260a083015160a085015260c083015160c085015260e083015160e085015261010080840151818601525061012080840151818601525061014080840151828287015261409783870182613f90565b915050610160915081840151858203838701526124708282613f90565b600082516140c681846020870161492b565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff86168252608060208301526141476080830186613f54565b82810360408401526141598186613f54565b838103606085015261416b8186613f90565b98975050505050505050565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b606080825284519082018190526000906020906080840190828801845b828110156141e0576141cd848351613fda565b60609390930192908401906001016141ba565b505050838103828501526141f48187613f54565b8481036040860152855180825290830191508286019060005b8181101561422b57825115158452928401929184019160010161420d565b509198975050505050505050565b600060208252612de56020830184613f54565b60006040825261425f6040830185613f54565b82810360208401526142718185613efc565b95945050505050565b60006040825261428d6040830185613f54565b82810360208401526142718185613f54565b600084825273ffffffffffffffffffffffffffffffffffffffff84166020830152606060408301526142716060830184613f90565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b7fffffffff0000000000000000000000000000000000000000000000000000000092909216825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b60007fffffffff000000000000000000000000000000000000000000000000000000008716825273ffffffffffffffffffffffffffffffffffffffff8616602083015260a060408301526143a060a0830186613f54565b82810360608401526143b28186613f54565b83810360808501526143c48186613f90565b9998505050505050505050565b7fffffffff0000000000000000000000000000000000000000000000000000000093909316835273ffffffffffffffffffffffffffffffffffffffff919091166020830152604082015260600190565b60007fffffffff00000000000000000000000000000000000000000000000000000000851682526060602083015261445c6060830185613f54565b82810360408401526124708185613efc565b600060208252612de56020830184613f90565b6000608082526144946080830187613f90565b73ffffffffffffffffffffffffffffffffffffffff958616602084015293909416604082015260ff9190911660609091015292915050565b6000608082526144df6080830187613f90565b602083820381850152818751808452828401915082838202850101838a0160005b8381101561454c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe087840301855261453a838351613ff6565b94860194925090850190600101614500565b50508681036040880152614560818a613f54565b94505050505082810360608401526145788185613efc565b979650505050505050565b6020808252601a908201527f46524f4d5f4c4553535f5448414e5f544f5f5245515549524544000000000000604082015260600190565b6020808252601c908201527f544f5f4c4553535f5448414e5f4c454e4754485f524551554952454400000000604082015260600190565b60208082526011908201527f55494e543235365f554e444552464c4f57000000000000000000000000000000604082015260600190565b60208082526026908201527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560408201527f5155495245440000000000000000000000000000000000000000000000000000606082015260800190565b60208082526010908201527f4449564953494f4e5f42595f5a45524f00000000000000000000000000000000604082015260600190565b60208082526010908201527f55494e543235365f4f564552464c4f5700000000000000000000000000000000604082015260600190565b60208082526019908201527f554e4b4e4f574e5f46554e4354494f4e5f53454c4543544f5200000000000000604082015260600190565b6020808252600d908201527f554e494d504c454d454e54454400000000000000000000000000000000000000604082015260600190565b60208082526026908201527f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524560408201527f5155495245440000000000000000000000000000000000000000000000000000606082015260800190565b60208082526025908201527f475245415445525f4f525f455155414c5f544f5f345f4c454e4754485f52455160408201527f5549524544000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252600e908201527f57524f4e475f50524f58595f4944000000000000000000000000000000000000604082015260600190565b60a081016148608286613fda565b8360608301528215156080830152949350505050565b600060208252612de56020830184613ff6565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff811182821017156148bf57600080fd5b604052919050565b600067ffffffffffffffff8211156148de57600080fd5b5060209081020190565b600067ffffffffffffffff8211156148ff57600080fd5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b8381101561494657818101518382015260200161492e565b83811115614955576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461497d57600080fd5b5056fea365627a7a72305820b0089191876aedb7c9ca73a599fe9f1af81f739a05048f17544cc85e5cb803f86c6578706572696d656e74616cf564736f6c634300050a0040" + "object": "0x60806040523480156200001157600080fd5b5060405162005cb838038062005cb88339810160408190526200003491620003be565b600080546001600160a01b0319166001600160a01b0383811691909117918290556040517f60704108000000000000000000000000000000000000000000000000000000008152839283928392911690636070410890620000ba907ff47261b00000000000000000000000000000000000000000000000000000000090600401620003f0565b60206040518083038186803b158015620000d357600080fd5b505afa158015620000e8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200010e9190810190620003be565b600180546001600160a01b0319166001600160a01b039283161790556000546040517f607041080000000000000000000000000000000000000000000000000000000081529116906360704108906200018c907f025717920000000000000000000000000000000000000000000000000000000090600401620003f0565b60206040518083038186803b158015620001a557600080fd5b505afa158015620001ba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620001e09190810190620003be565b600280546001600160a01b0319166001600160a01b039283161790556000546040517f607041080000000000000000000000000000000000000000000000000000000081529116906360704108906200025e907fa7cb5fb70000000000000000000000000000000000000000000000000000000090600401620003f0565b60206040518083038186803b1580156200027757600080fd5b505afa1580156200028c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620002b29190810190620003be565b600380546001600160a01b0319166001600160a01b039283161790556000546040517f6070410800000000000000000000000000000000000000000000000000000000815291169063607041089062000330907fc339d10a0000000000000000000000000000000000000000000000000000000090600401620003f0565b60206040518083038186803b1580156200034957600080fd5b505afa1580156200035e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620003849190810190620003be565b600480546001600160a01b039283166001600160a01b0319918216179091556005805495909216941693909317909255506200041d915050565b600060208284031215620003d157600080fd5b81516001600160a01b0381168114620003e957600080fd5b9392505050565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b61588b806200042d6000396000f3fe608060405234801561001057600080fd5b506004361061025c5760003560e01c80639a7e752611610145578063cafd3a07116100bd578063d3d862d11161008c578063e4e6e7da11610071578063e4e6e7da1461063a578063e77286eb1461065b578063ee4f5a941461067d5761025c565b8063d3d862d114610605578063e25cabf7146106185761025c565b8063cafd3a071461059e578063d001c5dc146105bf578063d186037f146105d2578063d3637905146105e55761025c565b8063a6627e9f11610114578063b43cffe1116100f9578063b43cffe114610548578063bbb2dcf61461055b578063bc03f9641461057d5761025c565b8063a6627e9f14610512578063acaedc74146105255761025c565b80639a7e7526146104985780639eadc835146104bb578063a0901e51146104df578063a5cd62ba146104f25761025c565b8063459be5e2116101d85780636f83188e116101a75780637b66ad341161018c5780637b66ad34146104515780637d727512146104725780638f4ce479146104855761025c565b80636f83188e1461040d5780637914b2ec146104305761025c565b8063459be5e21461038a5780634dfdac20146103ab578063590aa875146103cb57806365129042146103eb5761025c565b80632322cf761161022f578063327d305411610214578063327d30541461033257806332aae3ad146103455780633db6dc61146103675761025c565b80632322cf76146102f0578063314853ff146103105761025c565b806302d0aec31461026157806304a5618a1461028b5780630d7b7d76146102ad578063165979e1146102ce575b600080fd5b61027461026f366004614a03565b61069f565b6040516102829291906152ef565b60405180910390f35b61029e610299366004614a03565b6106fb565b60405161028293929190615392565b6102c06102bb366004614572565b6107a9565b60405161028292919061529d565b6102e16102dc366004614a03565b6107cb565b604051610282939291906154cd565b6103036102fe366004614572565b610828565b604051610282919061573d565b61032361031e366004614a03565b610850565b604051610282939291906152c4565b6102c0610340366004614a03565b610897565b610358610353366004614a03565b6108d9565b60405161028293929190615443565b61037a610375366004614a03565b61092c565b6040516102829493929190615263565b61039d610398366004614a03565b610976565b6040516102829291906154b6565b6103be6103b9366004614496565b6109cc565b60405161028291906151fd565b6103de6103d9366004614363565b610a4f565b60405161028291906153f2565b6103fe6103f9366004614a03565b610ad3565b60405161028293929190614ffa565b61042061041b366004614a03565b610b0d565b6040516102829493929190615540565b61044361043e366004614a03565b61164e565b60405161028292919061530c565b61046461045f366004614a03565b611686565b604051610282929190614fe0565b610303610480366004614572565b6116be565b610443610493366004614a03565b611dd3565b6104ab6104a6366004614a03565b611e63565b60405161028294939291906154fc565b6104ce6104c9366004614a03565b611ec4565b60405161028295949392919061532f565b6103be6104ed3660046145e4565b611f6f565b61050561050036600461464e565b611fe8565b6040516102829190615114565b6103de6105203660046145b8565b6120ac565b610538610533366004614a03565b612133565b6040516102829493929190615070565b6103de6105563660046144e6565b61216f565b61056e610569366004614a03565b6121fc565b604051610282939291906153bd565b61059061058b366004614a03565b6122a9565b6040516102829291906152ab565b6105b16105ac366004614a03565b6122e2565b604051610282929190615533565b6103be6105cd366004614496565b612330565b6103036105e0366004614572565b61239e565b6105f86105f3366004614ac0565b6129e1565b60405161028291906154e8565b6103de6106133660046147f9565b612f7e565b61062b6106263660046146d2565b612fb6565b60405161028293929190615161565b61064d610648366004614496565b6130ee565b60405161028292919061523e565b61066e610669366004614b1a565b613107565b604051610282939291906156e1565b61069061068b366004614a03565b613349565b6040516102829392919061548c565b6000806106b3836106ae613386565b6133aa565b60006106cc60048551866134049092919063ffffffff16565b8060200190516106df91908101906149b3565b909350905060ff811660068111156106f357fe5b915050915091565b6000808061070f848263ffffffff61344716565b92506001600160e01b031983167f02571792000000000000000000000000000000000000000000000000000000001461077d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610774906156aa565b60405180910390fd5b61078e84601063ffffffff61347b16565b91506107a184602463ffffffff6134ae16565b929491935050565b6000806107b684846116be565b91506107c2848461239e565b90509250929050565b60008060006107dc846106ae6134ba565b60006107f560048651876134049092919063ffffffff16565b8060200190516108089190810190614d58565b9094509250905060ff8116600281111561081e57fe5b9350509193909250565b600080600061083785856107a9565b9150915061084582826134de565b925050505b92915050565b6000606080610861846106ae6134f4565b835161087790859060049063ffffffff61340416565b80602001905161088a9190810190614953565b9196909550909350915050565b6000806108a6836106ae613518565b82516108bc90849060049063ffffffff61340416565b8060200190516108cf91908101906148f2565b9094909350915050565b60008060606108ea846106ae61353c565b600061090360048651876134049092919063ffffffff16565b8060200190516109169190810190614d0a565b9094509250905060ff8116600181111561081e57fe5b60008060608061093e856106ae613560565b845161095490869060049063ffffffff61340416565b80602001905161096791908101906148ac565b92989197509550909350915050565b600080610985836106ae613584565b600061099e60048551866134049092919063ffffffff16565b8060200190516109b19190810190614c39565b9250905060ff811660038111156109c457fe5b925050915091565b6060600082519050806040519080825280602002602001820160405280156109fe578160200160208202803883390190505b50915060005b818114610a4757610a2885858381518110610a1b57fe5b602002602001015161239e565b838281518110610a3457fe5b6020908102919091010152600101610a04565b505092915050565b6040516060907ff47261b00000000000000000000000000000000000000000000000000000000090610a85908490602401614fcc565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b0319909316929092179091529050919050565b6000806000610ae4846106ae6135a8565b8351610afa90859060049063ffffffff61340416565b80602001905161088a91908101906143ba565b60608080806000610b24868263ffffffff61344716565b90506001600160e01b031981167fdedfc1f1000000000000000000000000000000000000000000000000000000001415610b95576040518060400160405280601181526020017f626174636843616e63656c4f72646572730000000000000000000000000000008152509450611124565b6001600160e01b031981167f9694a402000000000000000000000000000000000000000000000000000000001415610c04576040518060400160405280600f81526020017f626174636846696c6c4f726465727300000000000000000000000000000000008152509450611124565b6001600160e01b031981167f8ea8dfe4000000000000000000000000000000000000000000000000000000001415610c73576040518060400160405280601681526020017f626174636846696c6c4f72646572734e6f5468726f77000000000000000000008152509450611124565b6001600160e01b031981167fbeee2e14000000000000000000000000000000000000000000000000000000001415610ce2576040518060400160405280601581526020017f626174636846696c6c4f724b696c6c4f726465727300000000000000000000008152509450611124565b6001600160e01b031981167f2da62987000000000000000000000000000000000000000000000000000000001415610d51576040518060400160405280600b81526020017f63616e63656c4f726465720000000000000000000000000000000000000000008152509450611124565b6001600160e01b031981167f9b44d556000000000000000000000000000000000000000000000000000000001415610dc0576040518060400160405280600981526020017f66696c6c4f7264657200000000000000000000000000000000000000000000008152509450611124565b6001600160e01b031981167fe14b58c4000000000000000000000000000000000000000000000000000000001415610e2f576040518060400160405280600f81526020017f66696c6c4f724b696c6c4f7264657200000000000000000000000000000000008152509450611124565b6001600160e01b031981167f78d29ac1000000000000000000000000000000000000000000000000000000001415610e9e576040518060400160405280601681526020017f6d61726b65744275794f72646572734e6f5468726f77000000000000000000008152509450611124565b6001600160e01b031981167f369da099000000000000000000000000000000000000000000000000000000001415610f0d576040518060400160405280601781526020017f6d61726b657453656c6c4f72646572734e6f5468726f770000000000000000008152509450611124565b6001600160e01b031981167f8bc8efb3000000000000000000000000000000000000000000000000000000001415610f7c576040518060400160405280601981526020017f6d61726b65744275794f726465727346696c6c4f724b696c6c000000000000008152509450611124565b6001600160e01b031981167fa6c3bf33000000000000000000000000000000000000000000000000000000001415610feb576040518060400160405280601a81526020017f6d61726b657453656c6c4f726465727346696c6c4f724b696c6c0000000000008152509450611124565b6001600160e01b031981167f88ec79fb00000000000000000000000000000000000000000000000000000000141561105a576040518060400160405280600b81526020017f6d617463684f72646572730000000000000000000000000000000000000000008152509450611124565b6001600160e01b031981167f4f9559b10000000000000000000000000000000000000000000000000000000014806110bb57506001600160e01b031981167f2280c91000000000000000000000000000000000000000000000000000000000145b156110f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107749061563c565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077490615605565b6001600160e01b031981167fdedfc1f10000000000000000000000000000000000000000000000000000000014156111c957855161116c90879060049063ffffffff6135cc16565b80602001905161117f9190810190614619565b604080516000808252602082019092529195505b50604080516000808252602082019092529194506111c1565b60608152602001906001900390816111ac5790505b509150611646565b6001600160e01b031981167fbeee2e1400000000000000000000000000000000000000000000000000000000148061122a57506001600160e01b031981167f9694a40200000000000000000000000000000000000000000000000000000000145b8061125e57506001600160e01b031981167f8ea8dfe400000000000000000000000000000000000000000000000000000000145b156112785761126c8661364c565b91955093509150611646565b6001600160e01b031981167f2da629870000000000000000000000000000000000000000000000000000000014156113605760408051600180825281830190925290816020015b6112c7613c98565b8152602001906001900390816112bf57505086519094506112f290879060049063ffffffff6135cc16565b8060200190516113059190810190614a8b565b8460008151811061131257fe5b602002602001018190525060006040519080825280602002602001820160405280156111935781602001602082028038833901905050604080516000808252602082019092529194506111c1565b6001600160e01b031981167fe14b58c40000000000000000000000000000000000000000000000000000000014806113c157506001600160e01b031981167f9b44d55600000000000000000000000000000000000000000000000000000000145b156113cf5761126c8661367b565b6001600160e01b031981167f78d29ac100000000000000000000000000000000000000000000000000000000148061143057506001600160e01b031981167f369da09900000000000000000000000000000000000000000000000000000000145b8061146457506001600160e01b031981167f8bc8efb300000000000000000000000000000000000000000000000000000000145b8061149857506001600160e01b031981167fa6c3bf3300000000000000000000000000000000000000000000000000000000145b156114a65761126c86613775565b6001600160e01b031981167f88ec79fb000000000000000000000000000000000000000000000000000000001415611646576114e0613c98565b6114e8613c98565b60608061150260048b518c6135cc9092919063ffffffff16565b8060200190516115159190810190614b74565b604080516002808252606082019092529498509296509094509250816020015b61153d613c98565b815260200190600190039081611535579050509750838860008151811061156057fe5b6020026020010181905250828860018151811061157957fe5b602090810291909101015260408051600280825260608201909252908160200160208202803883390190505096508360a00151876000815181106115b957fe5b6020026020010181815250508260a00151876001815181106115d757fe5b60209081029190910101526040805160028082526060820190925290816020015b60608152602001906001900390816115f8579050509550818660008151811061161d57fe5b6020026020010181905250808660018151811061163657fe5b6020026020010181905250505050505b509193509193565b60008061165d836106ae6137e9565b825161167390849060049063ffffffff61340416565b8060200190516108cf91908101906149d8565b600080611695836106ae61380d565b82516116ab90849060049063ffffffff61340416565b8060200190516108cf9190810190614380565b6000806116d1838263ffffffff61344716565b90506001600160e01b031981167ff47261b000000000000000000000000000000000000000000000000000000000141561184657600061171884601063ffffffff61347b16565b6040519091506060907f70a082310000000000000000000000000000000000000000000000000000000090611751908890602401614fcc565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060006060836001600160a01b0316836040516117cc9190614fb0565b600060405180830381855afa9150503d8060008114611807576040519150601f19603f3d011682016040523d82523d6000602084013e61180c565b606091505b509150915081801561181f575080516020145b61182a57600061183b565b61183b81600063ffffffff6134ae16565b955050505050611dcc565b6001600160e01b031981167f025717920000000000000000000000000000000000000000000000000000000014156119e157600080611884856106fb565b6040519194509250606091507f6352211e00000000000000000000000000000000000000000000000000000000906118c090849060240161573d565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060006060846001600160a01b03168360405161193b9190614fb0565b600060405180830381855afa9150503d8060008114611976576040519150601f19603f3d011682016040523d82523d6000602084013e61197b565b606091505b50915091506000828015611990575081516020145b61199b5760006119ac565b6119ac82600c63ffffffff61347b16565b9050896001600160a01b0316816001600160a01b0316146119ce5760006119d1565b60015b60ff169750505050505050611dcc565b6001600160e01b031981167fa7cb5fb7000000000000000000000000000000000000000000000000000000001415611bc4576000606080611a2186611ec4565b5081519296509094509250905060005b818114611bba5783516060907efdd58e00000000000000000000000000000000000000000000000000000000908b90879085908110611a6c57fe5b6020026020010151604051602401611a859291906150a4565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060006060876001600160a01b031683604051611b009190614fb0565b600060405180830381855afa9150503d8060008114611b3b576040519150601f19603f3d011682016040523d82523d6000602084013e611b40565b606091505b50915091506000828015611b55575081516020145b611b60576000611b71565b611b7182600063ffffffff6134ae16565b90506000878681518110611b8157fe5b60200260200101518281611b9157fe5b0490508b811080611ba057508b155b15611ba957809b505b505060019093019250611a31915050565b5050505050611dcc565b6001600160e01b031981167fc339d10a000000000000000000000000000000000000000000000000000000001415611d15576040516060907fa85e59e40000000000000000000000000000000000000000000000000000000090611c3390869060009081908190602401615405565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b03199094169390931790925260045491519092506000916001600160a01b031690611c9a908490614fb0565b600060405180830381855afa9150503d8060008114611cd5576040519150601f19603f3d011682016040523d82523d6000602084013e611cda565b606091505b5050905080611cea576000611d0c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b93505050611dcc565b6001600160e01b031981167f94cfcdd7000000000000000000000000000000000000000000000000000000001415611dcc57606080611d53856121fc565b80519194509250905060005b818114611dc7576000611d8589858481518110611d7857fe5b60200260200101516116be565b90506000858381518110611d9557fe5b60200260200101518281611da557fe5b04905087811080611db4575087155b15611dbd578097505b5050600101611d5f565b505050505b5092915050565b600080611de6838263ffffffff61344716565b91506001600160e01b031982167ff47261b00000000000000000000000000000000000000000000000000000000014611e4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610774906156aa565b611e5c83601063ffffffff61347b16565b9050915091565b60008060006060611e76856106ae613831565b6000611e8f60048751886134049092919063ffffffff16565b806020019051611ea29190810190614caa565b91965094509250905060ff81166006811115611eba57fe5b9450509193509193565b60008060608080611edb868563ffffffff61344716565b94506001600160e01b031985167fa7cb5fb70000000000000000000000000000000000000000000000000000000014611f40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610774906156aa565b505050506024828101516044840151606485015160848601519496929591820184019490820184019391010190565b6060808251604051908082528060200260200182016040528015611f9d578160200160208202803883390190505b50905060005b83518114611dcc57838181518110611fb757fe5b60200260200101516001600160a01b031631828281518110611fd557fe5b6020908102919091010152600101611fa3565b60606000845190508060405190808252806020026020018201604052801561201a578160200160208202803883390190505b50915060005b8181146120a25761206b86828151811061203657fe5b602002602001015186838151811061204a57fe5b602002602001015186848151811061205e57fe5b60200260200101516129e1565b83828151811061207757fe5b6020026020010190600481111561208a57fe5b9081600481111561209757fe5b905250600101612020565b50505b9392505050565b6040516060907f0257179200000000000000000000000000000000000000000000000000000000906120e490859085906024016150a4565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b031990931692909217909152905092915050565b60006060806060612146856106ae613855565b845161215c90869060049063ffffffff61340416565b80602001905161096791908101906143fd565b6040516060907fa7cb5fb700000000000000000000000000000000000000000000000000000000906121ab90879087908790879060240161501e565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b0319909316929092179091529050949350505050565b6000606080612211848463ffffffff61344716565b92506001600160e01b031983167f94cfcdd70000000000000000000000000000000000000000000000000000000014612276576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610774906156aa565b835161228c90859060049063ffffffff6135cc16565b80602001905161229f9190810190614830565b9395909450915050565b600060606122b9836106ae613879565b82516122cf90849060049063ffffffff61340416565b8060200190516108cf9190810190614916565b6000806122f1836106ae61389d565b600061230a60048551866134049092919063ffffffff16565b80602001905161231d9190810190614c39565b9250905060ff811660018111156109c457fe5b606060008251905080604051908082528060200260200182016040528015612362578160200160208202803883390190505b50915060005b818114610a475761237f85858381518110611d7857fe5b83828151811061238b57fe5b6020908102919091010152600101612368565b6000806123b1838263ffffffff61344716565b90506001600160e01b031981167f94cfcdd7000000000000000000000000000000000000000000000000000000001415612463576060806123f1856121fc565b80519194509250905060005b81811461245857600061241689858481518110610a1b57fe5b9050600085838151811061242657fe5b6020026020010151828161243657fe5b04905087811080612445575087155b1561244e578097505b50506001016123fd565b5061084a9350505050565b6001600160e01b031981167ff47261b00000000000000000000000000000000000000000000000000000000014156124ee5760006124a884601063ffffffff61347b16565b6001546040519192506060917fdd62ed3e00000000000000000000000000000000000000000000000000000000916117519189916001600160a01b031690602401614fe0565b6001600160e01b031981167f025717920000000000000000000000000000000000000000000000000000000014156127de5760008061252c856106fb565b600254604051929550909350606092507fe985e9c50000000000000000000000000000000000000000000000000000000091612578918a916001600160a01b0390911690602401614fe0565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060006060846001600160a01b0316836040516125f39190614fb0565b600060405180830381855afa9150503d806000811461262e576040519150601f19603f3d011682016040523d82523d6000602084013e612633565b606091505b509150915081158061264757508051602014155b80612663575061265e81600063ffffffff6134ae16565b600114155b156127b1576040516060907f081812fc000000000000000000000000000000000000000000000000000000009061269e90879060240161573d565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050856001600160a01b0316816040516127159190614fb0565b600060405180830381855afa9150503d8060008114612750576040519150601f19603f3d011682016040523d82523d6000602084013e612755565b606091505b509093509150828015612769575081516020145b801561279857506002546001600160a01b031661278d83600c63ffffffff61347b16565b6001600160a01b0316145b6127a35760006127a6565b60015b60ff16975050611bba565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff96505050505050611dcc565b6001600160e01b031981167fa7cb5fb700000000000000000000000000000000000000000000000000000000141561298657600061281b84611ec4565b5050600354604051929450606093507fe985e9c50000000000000000000000000000000000000000000000000000000092612865925089916001600160a01b031690602401614fe0565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060006060836001600160a01b0316836040516128e09190614fb0565b600060405180830381855afa9150503d806000811461291b576040519150601f19603f3d011682016040523d82523d6000602084013e612920565b606091505b5091509150818015612933575080516020145b801561294f575061294b81600063ffffffff6134ae16565b6001145b61295a57600061183b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff955050505050611dcc565b6001600160e01b031981167fc339d10a000000000000000000000000000000000000000000000000000000001415611dcc57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9392505050565b60006129eb613d2b565b612a7c8584600560009054906101000a90046001600160a01b03166001600160a01b0316631ce4c78b6040518163ffffffff1660e01b815260040160206040518083038186803b158015612a3e57600080fd5b505afa158015612a52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612a769190810190614c20565b3a6138c1565b60408051600480825260a0820190925291925060609190816020015b6060815260200190600190039081612a9857505060408051600480825260a082019092529192506060919060208201608080388339505060408051600480825260a08201909252929350606092915060208201608080388339505060408051600480825260a0820190925292935060609291506020820160808038833901905050905088610160015184600081518110612b2e57fe5b60200260200101819052508783600081518110612b4757fe5b60200260200101906001600160a01b031690816001600160a01b031681525050886000015182600081518110612b7957fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508681600081518110612ba757fe5b60200260200101818152505088610140015184600181518110612bc657fe5b6020026020010181905250886000015183600181518110612be357fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508782600181518110612c1157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050846000015181600181518110612c4357fe5b602002602001018181525050886101a0015184600281518110612c6257fe5b60200260200101819052508783600281518110612c7b57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050886040015182600281518110612cad57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050846060015181600281518110612cdf57fe5b60200260200101818152505088610180015184600381518110612cfe57fe5b6020026020010181905250886000015183600381518110612d1b57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050886040015182600381518110612d4d57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050846040015181600381518110612d7f57fe5b60209081029190910101526040516060907fb04fbddd0000000000000000000000000000000000000000000000000000000090612dc69087908790879087906024016150bd565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b03199094169390931790925260055491519092506060916001600160a01b031690612e2d908490614fb0565b6000604051808303816000865af19150503d8060008114612e6a576040519150601f19603f3d011682016040523d82523d6000602084013e612e6f565b606091505b50915060009050612e86828263ffffffff61344716565b9050612e9061353c565b6001600160e01b031982811691161415612ed2576000612eaf836108d9565b5091505060ff81166004811115612ec257fe5b99505050505050505050506120a5565b612eda6134f4565b6001600160e01b031982811691161415612f0d576000612ef983610850565b509091505060ff81166004811115612ec257fe5b815160208301207ff43f26ea5a94b478394a975e856464913dc1a8a1ca70939d974aa7c238aa0ce01415612f4c576004985050505050505050506120a5565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610774906155ce565b6040516060907f94cfcdd700000000000000000000000000000000000000000000000000000000906120e49085908590602401615210565b606080606060008551905080604051908082528060200260200182016040528015612ffb57816020015b612fe8613d5a565b815260200190600190039081612fe05790505b50935080604051908082528060200260200182016040528015613028578160200160208202803883390190505b50925080604051908082528060200260200182016040528015613055578160200160208202803883390190505b50915060005b8181146130e55761309287828151811061307157fe5b602002602001015187838151811061308557fe5b6020026020010151613107565b87518890859081106130a057fe5b602002602001018785815181106130b357fe5b602002602001018786815181106130c657fe5b931515602094850291909101909301929092529190525260010161305b565b50509250925092565b6060806130fb8484612330565b91506107c284846109cc565b61310f613d5a565b600080546040517f9d3fa4b900000000000000000000000000000000000000000000000000000000815282916001600160a01b031690639d3fa4b990613159908890600401615705565b60606040518083038186803b15801561317157600080fd5b505afa158015613185573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131a99190810190614a38565b85516000546040517fa12dcc6f00000000000000000000000000000000000000000000000000000000815292955090916001600160a01b039091169063a12dcc6f906131fb9089908990600401615718565b60206040518083038186803b15801561321357600080fd5b505afa158015613227573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061324b919081019061488a565b9150600061325e82886101400151610828565b60a088015160c08901516101808a01516101408b01519394509192909160009161328d9163ffffffff61393816565b156132ba576132b3846132ad848d6080015161395d90919063ffffffff16565b85613979565b905061331b565b60006132cb868c6101800151610828565b9050826132e8576132e1858c6080015186613979565b9150613319565b60006132f9868d6080015187613979565b90506000613308838688613979565b905061331482826134de565b935050505b505b61333b6133358960400151856139a390919063ffffffff16565b826134de565b965050505050509250925092565b600080600061335a846106ae6139c2565b600061337360048651876134049092919063ffffffff16565b8060200190516108089190810190614c67565b7ffdb6ca8d0000000000000000000000000000000000000000000000000000000090565b60006133b7836000613447565b90506001600160e01b0319808216908316146133ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077490615673565b505050565b6060818311156134225761342261341d600085856139e6565b613a55565b835182111561343b5761343b61341d60018487516139e6565b50819003910190815290565b600081600401835110156134685761346861341d60038551856004016139e6565b5001602001516001600160e01b03191690565b6000816014018351101561349c5761349c61341d60048551856014016139e6565b5001601401516001600160a01b031690565b60006120a58383613a5d565b7f18e4b1410000000000000000000000000000000000000000000000000000000090565b60008183106134ed57816120a5565b5090919050565b7f4678472b0000000000000000000000000000000000000000000000000000000090565b7fb6555d6f0000000000000000000000000000000000000000000000000000000090565b7f488219a60000000000000000000000000000000000000000000000000000000090565b7f1b8388f70000000000000000000000000000000000000000000000000000000090565b7fe94a7ed00000000000000000000000000000000000000000000000000000000090565b7f4ad312750000000000000000000000000000000000000000000000000000000090565b6060818311156135e5576135e561341d600085856139e6565b83518211156135fe576135fe61341d60018487516139e6565b8282036040519080825280601f01601f19166020018201604052801561362b576020820181803883390190505b5090506120a561363a82613a87565b8461364487613a87565b018351613a8d565b606080606061366860048551866135cc9092919063ffffffff16565b80602001905161088a919081019061472c565b60408051600180825281830190925260609182918291816020015b61369e613c98565b8152602001906001900390816136965750506040805160018082528183019092529194506020808301908038833901905050604080516001808252818301909252919350816020015b60608152602001906001900390816136e7575050845190915061371490859060049063ffffffff6135cc16565b8060200190516137279190810190614bcd565b8560008151811061373457fe5b602002602001018560008151811061374857fe5b602002602001018560008151811061375c57fe5b6020908102919091010192909252919052529193909250565b6040805160018082528183019092526060918291829160208083019080388339505085519193506137b19186915060049063ffffffff6135cc16565b8060200190516137c491908101906147a6565b845185906000906137d157fe5b60209081029190910101919091529095929450925050565b7f11c7b7200000000000000000000000000000000000000000000000000000000090565b7fa15c0d060000000000000000000000000000000000000000000000000000000090565b7f7e5a23180000000000000000000000000000000000000000000000000000000090565b7f5bd0428d0000000000000000000000000000000000000000000000000000000090565b7f20d11f610000000000000000000000000000000000000000000000000000000090565b7ff59851840000000000000000000000000000000000000000000000000000000090565b6138c9613d2b565b6020810184905260a085015160808601516138e5918691613b32565b815260a085015160c08601516138fc918691613b32565b604082015260a085015160e0860151613916918691613b32565b606082015261392b828463ffffffff613b6616565b6080820152949350505050565b6000815183511480156120a55750508051602091820120825192909101919091201490565b6000828201838110156120a5576120a561341d60008686613b93565b600061399b8361398f868563ffffffff613b6616565b9063ffffffff613bb216565b949350505050565b6000828211156139bc576139bc61341d60028585613b93565b50900390565b7fe53c76c80000000000000000000000000000000000000000000000000000000090565b6060632800659560e01b848484604051602401613a05939291906154da565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b03199093169290921790915290509392505050565b805160208201fd5b60008160200183511015613a7e57613a7e61341d60058551856020016139e6565b50016020015190565b60200190565b6020811015613ab7576001816020036101000a0380198351168185511680821786525050506133ff565b82821415613ac4576133ff565b82821115613afe5760208103905080820181840181515b82851015613af6578451865260209586019590940193613adb565b9052506133ff565b60208103905080820181840183515b81861215613b295782518252601f199283019290910190613b0d565b85525050505050565b6000613b3f848484613bdc565b15613b5257613b5261341d858585613c42565b61399b8361398f868563ffffffff613b6616565b600082613b755750600061084a565b82820282848281613b8257fe5b04146120a5576120a561341d600186865b606063e946c1bb60e01b848484604051602401613a059392919061546b565b600081613bc857613bc861341d60038585613b93565b6000828481613bd357fe5b04949350505050565b600082613bee57613bee61341d613c61565b811580613bf9575083155b15613c06575060006120a5565b60008380613c1057fe5b8584099050613c25858463ffffffff613b6616565b613c37826103e863ffffffff613b6616565b101595945050505050565b606063339f3de260e01b848484604051602401613a0593929190615746565b60408051808201909152600481527fa791837c00000000000000000000000000000000000000000000000000000000602082015290565b604051806101c0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b03168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001606081526020016060815260200160608152602001606081525090565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b803561084a81615824565b805161084a81615824565b600082601f830112613da0578081fd5b8135613db3613dae82615783565b61575c565b818152915060208083019084810181840286018201871015613dd457600080fd5b60005b84811015611dc7578135613dea81615824565b84529282019290820190600101613dd7565b600082601f830112613e0c578081fd5b8151613e1a613dae82615783565b8181529150602080830190840160005b83811015613e5757613e42876020845189010161407c565b83526020928301929190910190600101613e2a565b5050505092915050565b600082601f830112613e71578081fd5b8135613e7f613dae82615783565b8181529150602080830190840160005b83811015613e5757613ea7876020843589010161402e565b83526020928301929190910190600101613e8f565b600082601f830112613ecc578081fd5b8151613eda613dae82615783565b8181529150602080830190840160005b83811015613e5757613f028760208451890101614211565b83526020928301929190910190600101613eea565b600082601f830112613f27578081fd5b8135613f35613dae82615783565b8181529150602080830190840160005b83811015613e5757613f5d87602084358901016140c3565b83526020928301929190910190600101613f45565b600082601f830112613f82578081fd5b8151613f90613dae82615783565b818152915060208083019084810181840286018201871015613fb157600080fd5b60005b84811015611dc757815184529282019290820190600101613fb4565b600082601f830112613fe0578081fd5b8135613fee613dae82615783565b81815291506020808301908481018184028601820187101561400f57600080fd5b60005b84811015611dc757813584529282019290820190600101614012565b600082601f83011261403e578081fd5b813561404c613dae826157a4565b915080825283602082850101111561406357600080fd5b8060208401602084013760009082016020015292915050565b600082601f83011261408d57600080fd5b815161409b613dae826157a4565b91508082528360208285010111156140b257600080fd5b611dcc8160208401602086016157c9565b60006101c08083850312156140d6578182fd5b6140df8161575c565b91505060006140ee8484613d7a565b82526140fd8460208501613d7a565b602083015261410f8460408501613d7a565b60408301526141218460608501613d7a565b60608301526080830135608083015260a083013560a083015260c083013560c083015260e083013560e08301526101008084013581840152506101208084013581840152506101408084013567ffffffffffffffff80821115614182578384fd5b61418e8783880161402e565b838601526101609250828601359150808211156141a9578384fd5b6141b58783880161402e565b838601526101809250828601359150808211156141d0578384fd5b6141dc8783880161402e565b838601526101a09250828601359150808211156141f7578384fd5b506142048682870161402e565b8285015250505092915050565b60006101c0808385031215614224578182fd5b61422d8161575c565b915050600061423c8484613d85565b825261424b8460208501613d85565b602083015261425d8460408501613d85565b604083015261426f8460608501613d85565b60608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e08301526101008084015181840152506101208084015181840152506101408084015167ffffffffffffffff808211156142d0578384fd5b6142dc8783880161407c565b838601526101609250828601519150808211156142f7578384fd5b6143038783880161407c565b8386015261018092508286015191508082111561431e578384fd5b61432a8783880161407c565b838601526101a0925082860151915080821115614345578384fd5b506142048682870161407c565b805160ff8116811461084a57600080fd5b60006020828403121561437557600080fd5b81356120a581615824565b6000806040838503121561439357600080fd5b825161439e81615824565b60208401519092506143af81615824565b809150509250929050565b6000806000606084860312156143cf57600080fd5b83516143da81615824565b60208501519093506143eb81615824565b80925050604084015190509250925092565b60008060008060808587031215614412578182fd5b845161441d81615824565b602086015190945067ffffffffffffffff8082111561443a578384fd5b6144468883890161407c565b9450604087015191508082111561445b578384fd5b6144678883890161407c565b9350606087015191508082111561447d57600080fd5b5061448a8782880161407c565b91505092959194509250565b600080604083850312156144a957600080fd5b82356144b481615824565b9150602083013567ffffffffffffffff8111156144d057600080fd5b6144dc85828601613e61565b9150509250929050565b600080600080608085870312156144fb578182fd5b843561450681615824565b9350602085013567ffffffffffffffff80821115614522578384fd5b61452e88838901613fd0565b94506040870135915080821115614543578384fd5b61454f88838901613fd0565b9350606087013591508082111561456557600080fd5b5061448a8782880161402e565b6000806040838503121561458557600080fd5b823561459081615824565b9150602083013567ffffffffffffffff8111156145ac57600080fd5b6144dc8582860161402e565b600080604083850312156145cb57600080fd5b82356145d681615824565b946020939093013593505050565b6000602082840312156145f657600080fd5b813567ffffffffffffffff81111561460d57600080fd5b61399b84828501613d90565b60006020828403121561462b57600080fd5b815167ffffffffffffffff81111561464257600080fd5b61399b84828501613ebc565b600080600060608486031215614662578081fd5b833567ffffffffffffffff80821115614679578283fd5b61468587838801613f17565b9450602086013591508082111561469a578283fd5b6146a687838801613d90565b935060408601359150808211156146bb578283fd5b506146c886828701613fd0565b9150509250925092565b600080604083850312156146e557600080fd5b823567ffffffffffffffff808211156146fd57600080fd5b61470986838701613f17565b9350602085013591508082111561471f57600080fd5b506144dc85828601613e61565b600080600060608486031215614740578081fd5b835167ffffffffffffffff80821115614757578283fd5b61476387838801613ebc565b94506020860151915080821115614778578283fd5b61478487838801613f72565b93506040860151915080821115614799578283fd5b506146c886828701613dfc565b6000806000606084860312156147ba578081fd5b835167ffffffffffffffff808211156147d1578283fd5b6147dd87838801613ebc565b9450602086015193506040860151915080821115614799578283fd5b6000806040838503121561480c57600080fd5b823567ffffffffffffffff8082111561482457600080fd5b61470986838701613fd0565b6000806040838503121561484357600080fd5b825167ffffffffffffffff8082111561485b57600080fd5b61486786838701613f72565b9350602085015191508082111561487d57600080fd5b506144dc85828601613dfc565b60006020828403121561489c57600080fd5b815180151581146120a557600080fd5b600080600080608085870312156148c257600080fd5b8451935060208501516148d481615824565b604086015190935067ffffffffffffffff8082111561445b57600080fd5b6000806040838503121561490557600080fd5b505080516020909101519092909150565b6000806040838503121561492957600080fd5b82519150602083015167ffffffffffffffff81111561494757600080fd5b6144dc8582860161407c565b600080600060608486031215614967578081fd5b83519250602084015167ffffffffffffffff80821115614985578283fd5b6149918783880161407c565b935060408601519150808211156149a6578283fd5b506146c88682870161407c565b600080604083850312156149c657600080fd5b8251915060208301516143af81615839565b600080604083850312156149eb57600080fd5b82516001600160e01b03198116811461439e57600080fd5b600060208284031215614a1557600080fd5b813567ffffffffffffffff811115614a2c57600080fd5b61399b8482850161402e565b60006060828403128015614a4b57600080fd5b8015614a5657600080fd5b50614a61606061575c565b8251614a6c81615839565b8152602083810151908201526040928301519281019290925250919050565b600060208284031215614a9d57600080fd5b815167ffffffffffffffff811115614ab457600080fd5b61399b84828501614211565b600080600060608486031215614ad557600080fd5b833567ffffffffffffffff811115614aec57600080fd5b614af8868287016140c3565b9350506020840135614b0981615824565b929592945050506040919091013590565b60008060408385031215614b2d57600080fd5b823567ffffffffffffffff80821115614b4557600080fd5b614b51868387016140c3565b93506020850135915080821115614b6757600080fd5b506144dc8582860161402e565b60008060008060808587031215614b89578182fd5b845167ffffffffffffffff80821115614ba0578384fd5b614bac88838901614211565b95506020870151915080821115614bc1578384fd5b61444688838901614211565b600080600060608486031215614be1578081fd5b835167ffffffffffffffff80821115614bf8578283fd5b614c0487838801614211565b94506020860151935060408601519150808211156149a6578283fd5b600060208284031215614c3257600080fd5b5051919050565b60008060408385031215614c4c57600080fd5b8251614c5781615839565b6020939093015192949293505050565b600080600060608486031215614c7c57600080fd5b8351614c8781615839565b602085015160408601519194509250614c9f81615824565b809150509250925092565b60008060008060808587031215614cc057600080fd5b614cca8686614352565b9350602085015192506040850151614ce181615824565b606086015190925067ffffffffffffffff811115614cfe57600080fd5b61448a8782880161407c565b600080600060608486031215614d1f57600080fd5b614d298585614352565b925060208401519150604084015167ffffffffffffffff811115614d4c57600080fd5b6146c88682870161407c565b600080600060608486031215614d6d57600080fd5b614d778585614352565b925060208401519150604084015190509250925092565b6001600160a01b03169052565b600081518084526020840193506020830160005b82811015614dd65781516001600160a01b0316865260209586019590910190600101614daf565b5093949350505050565b60008151808452602084019350836020820285016020850160005b84811015614e29578383038852614e13838351614e67565b6020988901989093509190910190600101614dfb565b50909695505050505050565b600081518084526020840193506020830160005b82811015614dd6578151865260209586019590910190600101614e49565b60008151808452614e7f8160208601602086016157c9565b601f01601f19169290920160200192915050565b805160ff16825260208082015190830152604090810151910152565b60006101c0614ebf848451614d8e565b6020830151614ed16020860182614d8e565b506040830151614ee46040860182614d8e565b506060830151614ef76060860182614d8e565b506080830151608085015260a083015160a085015260c083015160c085015260e083015160e0850152610100808401518186015250610120808401518186015250610140808401518282870152614f5083870182614e67565b91505061016091508184015185820383870152614f6d8282614e67565b925050506101808084015185830382870152614f898382614e67565b9150506101a091508184015185820383870152614fa68282614e67565b9695505050505050565b60008251614fc28184602087016157c9565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60006001600160a01b0386168252608060208301526150406080830186614e35565b82810360408401526150528186614e35565b83810360608501526150648186614e67565b98975050505050505050565b60006001600160a01b0386168252608060208301526150926080830186614e67565b82810360408401526150528186614e67565b6001600160a01b03929092168252602082015260400190565b6000608082526150d06080830187614de0565b82810360208401526150e28187614d9b565b83810360408501526150f48187614d9b565b91505082810360608401526151098185614e35565b979650505050505050565b602080825282518282018190526000918401906040840190835b818110156151565783516005811061514257fe5b83526020938401939092019160010161512e565b509095945050505050565b606080825284519082018190526000906020906080840190828801845b828110156151a457615191848351614e93565b606093909301929084019060010161517e565b505050838103828501526151b88187614e35565b8481036040860152855180825290830191508286019060005b818110156151ef5782511515845292840192918401916001016151d1565b509198975050505050505050565b6000602082526120a56020830184614e35565b6000604082526152236040830185614e35565b82810360208401526152358185614de0565b95945050505050565b6000604082526152516040830185614e35565b82810360208401526152358185614e35565b60008582526001600160a01b03851660208301526080604083015261528b6080830185614e67565b82810360608401526151098185614e67565b918252602082015260400190565b60008382526040602083015261399b6040830184614e67565b6000848252606060208301526152dd6060830185614e67565b8281036040840152614fa68185614e67565b828152604081016152ff8361581a565b8260208301529392505050565b6001600160e01b03199290921682526001600160a01b0316602082015260400190565b60006001600160e01b0319871682526001600160a01b038616602083015260a0604083015261536160a0830186614e35565b82810360608401526153738186614e35565b83810360808501526153858186614e67565b9998505050505050505050565b6001600160e01b03199390931683526001600160a01b03919091166020830152604082015260600190565b60006001600160e01b031985168252606060208301526153e06060830185614e35565b8281036040840152614fa68185614de0565b6000602082526120a56020830184614e67565b6000608082526154186080830187614e67565b6001600160a01b03958616602084015293909416604082015260ff9190911660609091015292915050565b600061544e856157f9565b848252836020830152606060408301526152356060830184614e67565b6060810161547885615806565b938152602081019290925260409091015290565b6060810161549985615810565b93815260208101929092526001600160a01b031660409091015290565b604081016154c384615806565b9281526020015290565b6060810161547885615810565b606081016008851061547857fe5b60208101600583106154f657fe5b91905290565b60006155078661581a565b8582528460208301526001600160a01b038416604083015260806060830152614fa66080830184614e67565b604081016154c3846157f9565b6000608082526155536080830187614e67565b602083820381850152818751808452828401915082838202850101838a0160005b838110156155a257601f19878403018552615590838351614eaf565b94860194925090850190600101615574565b505086810360408801526155b6818a614e35565b94505050505082810360608401526151098185614de0565b60208082526013908201527f554e4b4e4f574e5f52455455524e5f4441544100000000000000000000000000604082015260600190565b60208082526019908201527f554e4b4e4f574e5f46554e4354494f4e5f53454c4543544f5200000000000000604082015260600190565b6020808252600d908201527f554e494d504c454d454e54454400000000000000000000000000000000000000604082015260600190565b6020808252600c908201527f4241445f53454c4543544f520000000000000000000000000000000000000000604082015260600190565b6020808252600e908201527f57524f4e475f50524f58595f4944000000000000000000000000000000000000604082015260600190565b60a081016156ef8286614e93565b8360608301528215156080830152949350505050565b6000602082526120a56020830184614eaf565b60006040825261572b6040830185614eaf565b82810360208401526152358185614e67565b90815260200190565b9283526020830191909152604082015260600190565b60405181810167ffffffffffffffff8111828210171561577b57600080fd5b604052919050565b600067ffffffffffffffff82111561579a57600080fd5b5060209081020190565b600067ffffffffffffffff8211156157bb57600080fd5b50601f01601f191660200190565b60005b838110156157e45781810151838201526020016157cc565b838111156157f3576000848401525b50505050565b6002811061580357fe5b50565b6004811061580357fe5b6003811061580357fe5b6007811061580357fe5b6001600160a01b038116811461580357600080fd5b60ff8116811461580357600080fdfea365627a7a7231582050ab81401c3f0cb0a03441ded8b119ec9605d7b6b5a793598296814306adace66c6578706572696d656e74616cf564736f6c634300050b0040" } } }, + "compiler": { + "name": "solc", + "version": "soljson-v0.5.11+commit.c082d0b4.js", + "settings": { + "optimizer": { + "enabled": true, + "runs": 10000, + "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": "constantinople", + "remappings": [ + "@0x/contracts-exchange=/home/gene/dev/0x-monorepo-v3/contracts/dev-utils/node_modules/@0x/contracts-exchange", + "@0x/contracts-exchange-libs=/home/gene/dev/0x-monorepo-v3/contracts/dev-utils/node_modules/@0x/contracts-exchange-libs", + "@0x/contracts-utils=/home/gene/dev/0x-monorepo-v3/contracts/dev-utils/node_modules/@0x/contracts-utils", + "@0x/contracts-asset-proxy=/home/gene/dev/0x-monorepo-v3/contracts/dev-utils/node_modules/@0x/contracts-asset-proxy", + "@0x/contracts-erc20=/home/gene/dev/0x-monorepo-v3/contracts/dev-utils/node_modules/@0x/contracts-erc20", + "@0x/contracts-erc721=/home/gene/dev/0x-monorepo-v3/contracts/dev-utils/node_modules/@0x/contracts-erc721", + "@0x/contracts-erc1155=/home/gene/dev/0x-monorepo-v3/contracts/dev-utils/node_modules/@0x/contracts-erc1155" + ] + } + }, "networks": {} }