[ { "inputs": [ { "internalType": "address", "name": "_poolOwner", "type": "address" }, { "internalType": "address", "name": "_weth", "type": "address" }, { "internalType": "address", "name": "_usdc", "type": "address" }, { "internalType": "string", "name": "_name", "type": "string" }, { "internalType": "string", "name": "_symbol", "type": "string" }, { "internalType": "bytes32", "name": "_marketId", "type": "bytes32" } ], "stateMutability": "nonpayable", "type": "constructor" }, { "inputs": [], "name": "AlreadyInitialized", "type": "error" }, { "inputs": [], "name": "MarketUtils_AmountTooSmall", "type": "error" }, { "inputs": [], "name": "NewOwnerIsZeroAddress", "type": "error" }, { "inputs": [], "name": "NoHandoverRequest", "type": "error" }, { "inputs": [], "name": "Reentrancy", "type": "error" }, { "inputs": [], "name": "Unauthorized", "type": "error" }, { "inputs": [], "name": "Vault_AccessDenied", "type": "error" }, { "inputs": [], "name": "Vault_AlreadyInitialized", "type": "error" }, { "inputs": [], "name": "Vault_InsufficientAvailableTokens", "type": "error" }, { "inputs": [], "name": "Vault_InvalidDeposit", "type": "error" }, { "inputs": [], "name": "Vault_InvalidWithdrawal", "type": "error" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "Approval", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" }, { "indexed": false, "internalType": "bool", "name": "isLong", "type": "bool" } ], "name": "BadDebtCreated", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "key", "type": "bytes32" }, { "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amountIn", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "mintAmount", "type": "uint256" }, { "indexed": false, "internalType": "bool", "name": "isLongToken", "type": "bool" } ], "name": "DepositExecuted", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" }, { "indexed": false, "internalType": "bool", "name": "isLong", "type": "bool" } ], "name": "FeesAccumulated", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "longFees", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "shortFees", "type": "uint256" } ], "name": "FeesWithdrawn", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "user", "type": "address" }, { "indexed": true, "internalType": "address", "name": "amount", "type": "address" }, { "indexed": true, "internalType": "address", "name": "token", "type": "address" } ], "name": "HoldingTokens", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "pendingOwner", "type": "address" } ], "name": "OwnershipHandoverCanceled", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "pendingOwner", "type": "address" } ], "name": "OwnershipHandoverRequested", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "oldOwner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "OwnershipTransferred", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "user", "type": "address" }, { "indexed": true, "internalType": "uint256", "name": "roles", "type": "uint256" } ], "name": "RolesUpdated", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "Transfer", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "user", "type": "address" }, { "indexed": true, "internalType": "address", "name": "amount", "type": "address" }, { "indexed": true, "internalType": "address", "name": "token", "type": "address" } ], "name": "Vault_HoldingTokens", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "key", "type": "bytes32" }, { "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amountIn", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amountOut", "type": "uint256" }, { "indexed": false, "internalType": "bool", "name": "isLongToken", "type": "bool" } ], "name": "WithdrawalExecuted", "type": "event" }, { "inputs": [], "name": "DOMAIN_SEPARATOR", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_amount", "type": "uint256" }, { "internalType": "bool", "name": "_isLong", "type": "bool" } ], "name": "accumulateFees", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" }, { "internalType": "address", "name": "", "type": "address" } ], "name": "allowance", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "approve", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bool", "name": "_isLong", "type": "bool" } ], "name": "badDebt", "outputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "balanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "batchWithdrawFees", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "cancelOwnershipHandover", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "user", "type": "address" }, { "internalType": "bool", "name": "_isLong", "type": "bool" } ], "name": "collateralAmounts", "outputs": [ { "internalType": "uint256", "name": "collateralAmount", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "pendingOwner", "type": "address" } ], "name": "completeOwnershipHandover", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [], "name": "decimals", "outputs": [ { "internalType": "uint8", "name": "", "type": "uint8" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "components": [ { "internalType": "contract IMarket", "name": "market", "type": "address" }, { "internalType": "contract IVault", "name": "vault", "type": "address" }, { "components": [ { "internalType": "uint256", "name": "amountIn", "type": "uint256" }, { "internalType": "uint256", "name": "executionFee", "type": "uint256" }, { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "uint48", "name": "requestTimestamp", "type": "uint48" }, { "internalType": "uint40", "name": "stakeDuration", "type": "uint40" }, { "internalType": "bool", "name": "isLongToken", "type": "bool" }, { "internalType": "bool", "name": "reverseWrap", "type": "bool" }, { "internalType": "bool", "name": "isDeposit", "type": "bool" }, { "internalType": "bytes32", "name": "key", "type": "bytes32" }, { "internalType": "bytes32", "name": "priceRequestKey", "type": "bytes32" } ], "internalType": "struct Pool.Input", "name": "deposit", "type": "tuple" }, { "components": [ { "internalType": "uint256", "name": "min", "type": "uint256" }, { "internalType": "uint256", "name": "med", "type": "uint256" }, { "internalType": "uint256", "name": "max", "type": "uint256" } ], "internalType": "struct Oracle.Prices", "name": "longPrices", "type": "tuple" }, { "components": [ { "internalType": "uint256", "name": "min", "type": "uint256" }, { "internalType": "uint256", "name": "med", "type": "uint256" }, { "internalType": "uint256", "name": "max", "type": "uint256" } ], "internalType": "struct Oracle.Prices", "name": "shortPrices", "type": "tuple" }, { "internalType": "bytes32", "name": "key", "type": "bytes32" }, { "internalType": "uint256", "name": "longBorrowFeesUsd", "type": "uint256" }, { "internalType": "uint256", "name": "shortBorrowFeesUsd", "type": "uint256" }, { "internalType": "int256", "name": "cumulativePnl", "type": "int256" } ], "internalType": "struct IVault.ExecuteDeposit", "name": "_params", "type": "tuple" }, { "internalType": "address", "name": "_tokenIn", "type": "address" }, { "internalType": "address", "name": "_positionManager", "type": "address" } ], "name": "executeDeposit", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "components": [ { "internalType": "contract IMarket", "name": "market", "type": "address" }, { "internalType": "contract IVault", "name": "vault", "type": "address" }, { "components": [ { "internalType": "uint256", "name": "amountIn", "type": "uint256" }, { "internalType": "uint256", "name": "executionFee", "type": "uint256" }, { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "uint48", "name": "requestTimestamp", "type": "uint48" }, { "internalType": "uint40", "name": "stakeDuration", "type": "uint40" }, { "internalType": "bool", "name": "isLongToken", "type": "bool" }, { "internalType": "bool", "name": "reverseWrap", "type": "bool" }, { "internalType": "bool", "name": "isDeposit", "type": "bool" }, { "internalType": "bytes32", "name": "key", "type": "bytes32" }, { "internalType": "bytes32", "name": "priceRequestKey", "type": "bytes32" } ], "internalType": "struct Pool.Input", "name": "withdrawal", "type": "tuple" }, { "components": [ { "internalType": "uint256", "name": "min", "type": "uint256" }, { "internalType": "uint256", "name": "med", "type": "uint256" }, { "internalType": "uint256", "name": "max", "type": "uint256" } ], "internalType": "struct Oracle.Prices", "name": "longPrices", "type": "tuple" }, { "components": [ { "internalType": "uint256", "name": "min", "type": "uint256" }, { "internalType": "uint256", "name": "med", "type": "uint256" }, { "internalType": "uint256", "name": "max", "type": "uint256" } ], "internalType": "struct Oracle.Prices", "name": "shortPrices", "type": "tuple" }, { "internalType": "bytes32", "name": "key", "type": "bytes32" }, { "internalType": "uint256", "name": "longBorrowFeesUsd", "type": "uint256" }, { "internalType": "uint256", "name": "shortBorrowFeesUsd", "type": "uint256" }, { "internalType": "int256", "name": "cumulativePnl", "type": "int256" }, { "internalType": "bool", "name": "shouldUnwrap", "type": "bool" } ], "internalType": "struct IVault.ExecuteWithdrawal", "name": "_params", "type": "tuple" }, { "internalType": "address", "name": "_tokenOut", "type": "address" }, { "internalType": "address", "name": "_positionManager", "type": "address" } ], "name": "executeWithdrawal", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "feeDistributor", "outputs": [ { "internalType": "contract IFeeDistributor", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "feeReceiver", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "user", "type": "address" }, { "internalType": "uint256", "name": "roles", "type": "uint256" } ], "name": "grantRoles", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "user", "type": "address" }, { "internalType": "uint256", "name": "roles", "type": "uint256" } ], "name": "hasAllRoles", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "user", "type": "address" }, { "internalType": "uint256", "name": "roles", "type": "uint256" } ], "name": "hasAnyRole", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_market", "type": "address" }, { "internalType": "address", "name": "_feeDistributor", "type": "address" }, { "internalType": "address", "name": "_rewardTracker", "type": "address" }, { "internalType": "address", "name": "_tradeEngine", "type": "address" }, { "internalType": "address", "name": "_feeReceiver", "type": "address" }, { "internalType": "uint256", "name": "_transferGasLimit", "type": "uint256" } ], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "longAccumulatedFees", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "longTokenBalance", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "longTokensReserved", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "marketId", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "name", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "nonces", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "owner", "outputs": [ { "internalType": "address", "name": "result", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "pendingOwner", "type": "address" } ], "name": "ownershipHandoverExpiresAt", "outputs": [ { "internalType": "uint256", "name": "result", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "uint256", "name": "deadline", "type": "uint256" }, { "internalType": "uint8", "name": "v", "type": "uint8" }, { "internalType": "bytes32", "name": "r", "type": "bytes32" }, { "internalType": "bytes32", "name": "s", "type": "bytes32" } ], "name": "permit", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "poolOwner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "renounceOwnership", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "roles", "type": "uint256" } ], "name": "renounceRoles", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_previousTradeEngine", "type": "address" }, { "internalType": "address", "name": "_newTradeEngine", "type": "address" } ], "name": "replaceTradeEngine", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "requestOwnershipHandover", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "user", "type": "address" }, { "internalType": "uint256", "name": "roles", "type": "uint256" } ], "name": "revokeRoles", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [], "name": "rewardTracker", "outputs": [ { "internalType": "contract IRewardTracker", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "user", "type": "address" } ], "name": "rolesOf", "outputs": [ { "internalType": "uint256", "name": "roles", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "shortAccumulatedFees", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "shortTokenBalance", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "shortTokensReserved", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "symbol", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bool", "name": "_isLong", "type": "bool" } ], "name": "totalAvailableLiquidity", "outputs": [ { "internalType": "uint256", "name": "total", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalSupply", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "transfer", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "transferFrom", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "transferGasLimit", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_to", "type": "address" }, { "internalType": "uint256", "name": "_amount", "type": "uint256" }, { "internalType": "bool", "name": "_isLongToken", "type": "bool" }, { "internalType": "bool", "name": "_shouldUnwrap", "type": "bool" } ], "name": "transferOutTokens", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "transferOwnership", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_amount", "type": "uint256" }, { "internalType": "address", "name": "_user", "type": "address" }, { "internalType": "bool", "name": "_isLong", "type": "bool" }, { "internalType": "bool", "name": "_isIncrease", "type": "bool" }, { "internalType": "bool", "name": "_isFullClose", "type": "bool" } ], "name": "updateCollateralAmount", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_amount", "type": "uint256" }, { "internalType": "bool", "name": "_isLong", "type": "bool" }, { "internalType": "bool", "name": "_isIncrease", "type": "bool" } ], "name": "updateLiquidityReservation", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_amount", "type": "uint256" }, { "internalType": "bool", "name": "_isLong", "type": "bool" }, { "internalType": "bool", "name": "_isIncrease", "type": "bool" } ], "name": "updatePoolBalance", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "stateMutability": "payable", "type": "receive" } ]
6101206040523480156200001257600080fd5b5060405162004429380380620044298339810160408190526200003591620002e9565b82826012600062000047848262000425565b50600162000056838262000425565b5060ff81166080524660a0526200006c620000c0565b60c052506200007f91503390506200015c565b6200008c86600462000198565b600a80546001600160a01b0319166001600160a01b0397881617905593851660e0525050909116610100526009556200056f565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051620000f49190620004f1565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b6001600160a01b0316638b78c6d8198190558060007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a350565b620001a682826001620001aa565b5050565b638b78c6d8600c52826000526020600c20805483811783620001cd575080841681185b80835580600c5160601c7f715ad5ce61fc9595c7b415289d59cf203f23a94fa06f04af7e489a0a76e1fe26600080a3505050505050565b80516001600160a01b03811681146200021c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200024957600080fd5b81516001600160401b038082111562000266576200026662000221565b604051601f8301601f19908116603f0116810190828211818310171562000291576200029162000221565b8160405283815260209250866020858801011115620002af57600080fd5b600091505b83821015620002d35785820183015181830184015290820190620002b4565b6000602085830101528094505050505092915050565b60008060008060008060c087890312156200030357600080fd5b6200030e8762000204565b95506200031e6020880162000204565b94506200032e6040880162000204565b60608801519094506001600160401b03808211156200034c57600080fd5b6200035a8a838b0162000237565b945060808901519150808211156200037157600080fd5b506200038089828a0162000237565b92505060a087015190509295509295509295565b600181811c90821680620003a957607f821691505b602082108103620003ca57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000420576000816000526020600020601f850160051c81016020861015620003fb5750805b601f850160051c820191505b818110156200041c5782815560010162000407565b5050505b505050565b81516001600160401b0381111562000441576200044162000221565b620004598162000452845462000394565b84620003d0565b602080601f831160018114620004915760008415620004785750858301515b600019600386901b1c1916600185901b1785556200041c565b600085815260208120601f198616915b82811015620004c257888601518255948401946001909101908401620004a1565b5085821015620004e15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000808354620005018162000394565b600182811680156200051c5760018114620005325762000563565b60ff198416875282151583028701945062000563565b8760005260208060002060005b858110156200055a5781548a8201529084019082016200053f565b50505082870194505b50929695505050505050565b60805160a05160c05160e05161010051613e136200061660003960008181610c20015281816114de01528181611684015281816116d201528181611ad101528181611db4015281816123880152612930015260008181610cad0152818161144a015281816115e50152818161163301528181611b5e01528181611dda015281816122af015261285701526000610bc501526000610b90015260006104a40152613e136000f3fe6080604052600436106102cd5760003560e01c80637547ab6711610175578063b4d58e66116100dc578063dd62ed3e11610095578063f1c46f381161006f578063f1c46f3814610898578063f2fde38b146108b8578063fc7e0f85146108cb578063fee81cf4146108eb57600080fd5b8063dd62ed3e14610837578063e8f67c3b1461086f578063f04e283e1461088557600080fd5b8063b4d58e6614610782578063b525285f146107a2578063b52ab49c146107b7578063b92bf1c7146107d7578063cf0b2270146107f7578063d505accf1461081757600080fd5b80638da5cb5b1161012e5780638da5cb5b146106d457806395b6ef0c146106ed57806395d89b411461070d578063a9059cbb14610722578063ad03c84814610742578063b3f006741461076257600080fd5b80637547ab67146105f65780637776a9e61461062357806379fc630d146106395780637ecebe0014610671578063870708381461069e57806388e2dfd5146106be57600080fd5b80632de9480711610234578063514e62fc116101ed5780636bcb411a116101c75780636bcb411a1461058b5780636ed71ede146105ab57806370a08231146105c1578063715018a6146105ee57600080fd5b8063514e62fc1461053657806354d1f13d1461056d5780635d48fcd41461057557600080fd5b80632de948071461045f578063313ce567146104925780633644e515146104d8578063477c6cb8146104ed57806349a2fa24146105035780634a4ee7b11461052357600080fd5b80631c10893f116102865780631c10893f146103b75780631cd64df4146103ca5780631de6e1061461040157806323b872dd1461042157806325692962146104415780632da906f71461044957600080fd5b8063055c89dc146102d957806306fdde0314610302578063095ea7b3146103245780630d43e8ad1461035457806318160ddd1461038c578063183a4f6e146103a257600080fd5b366102d457005b600080fd5b3480156102e557600080fd5b506102ef60115481565b6040519081526020015b60405180910390f35b34801561030e57600080fd5b5061031761091e565b6040516102f991906134cf565b34801561033057600080fd5b5061034461033f366004613543565b6109ac565b60405190151581526020016102f9565b34801561036057600080fd5b50600854610374906001600160a01b031681565b6040516001600160a01b0390911681526020016102f9565b34801561039857600080fd5b506102ef60025481565b6103b56103b036600461356f565b610a19565b005b6103b56103c5366004613543565b610a26565b3480156103d657600080fd5b506103446103e5366004613543565b638b78c6d8600c90815260009290925260209091205481161490565b34801561040d57600080fd5b506103b561041c366004613588565b610a3c565b34801561042d57600080fd5b5061034461043c3660046135c1565b610a5a565b6103b5610b3c565b34801561045557600080fd5b506102ef60125481565b34801561046b57600080fd5b506102ef61047a366004613602565b638b78c6d8600c908152600091909152602090205490565b34801561049e57600080fd5b506104c67f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016102f9565b3480156104e457600080fd5b506102ef610b8c565b3480156104f957600080fd5b506102ef600f5481565b34801561050f57600080fd5b506102ef61051e36600461361f565b610be7565b6103b5610531366004613543565b610e47565b34801561054257600080fd5b50610344610551366004613543565b638b78c6d8600c90815260009290925260209091205416151590565b6103b5610e59565b34801561058157600080fd5b506102ef600e5481565b34801561059757600080fd5b50600754610374906001600160a01b031681565b3480156105b757600080fd5b506102ef60095481565b3480156105cd57600080fd5b506102ef6105dc366004613602565b60036020526000908152604090205481565b6103b5610e95565b34801561060257600080fd5b506102ef61061136600461368c565b60156020526000908152604090205481565b34801561062f57600080fd5b506102ef60105481565b34801561064557600080fd5b506102ef6106543660046136a9565b601460209081526000928352604080842090915290825290205481565b34801561067d57600080fd5b506102ef61068c366004613602565b60056020526000908152604090205481565b3480156106aa57600080fd5b506102ef6106b936600461368c565b610ea9565b3480156106ca57600080fd5b506102ef600d5481565b3480156106e057600080fd5b50638b78c6d81954610374565b3480156106f957600080fd5b506103b56107083660046136d7565b610ed5565b34801561071957600080fd5b50610317610f7b565b34801561072e57600080fd5b5061034461073d366004613543565b610f88565b34801561074e57600080fd5b506103b561075d366004613750565b610fee565b34801561076e57600080fd5b50600b54610374906001600160a01b031681565b34801561078e57600080fd5b506103b561079d3660046137b8565b6112f2565b3480156107ae57600080fd5b506103b561130c565b3480156107c357600080fd5b506103b56107d23660046137dd565b61174e565b3480156107e357600080fd5b506103b56107f23660046137dd565b6117fe565b34801561080357600080fd5b50600a54610374906001600160a01b031681565b34801561082357600080fd5b506103b5610832366004613814565b611814565b34801561084357600080fd5b506102ef610852366004613588565b600460209081526000928352604080842090915290825290205481565b34801561087b57600080fd5b506102ef600c5481565b6103b5610893366004613602565b611a5d565b3480156108a457600080fd5b506103b56108b336600461388b565b611a9a565b6103b56108c6366004613602565b611d78565b3480156108d757600080fd5b506103b56108e63660046138d4565b611d9f565b3480156108f757600080fd5b506102ef610906366004613602565b63389a75e1600c908152600091909152602090205490565b6000805461092b90613927565b80601f016020809104026020016040519081016040528092919081815260200182805461095790613927565b80156109a45780601f10610979576101008083540402835291602001916109a4565b820191906000526020600020905b81548152906001019060200180831161098757829003601f168201915b505050505081565b3360008181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610a079086815260200190565b60405180910390a35060015b92915050565b610a233382611e0a565b50565b610a2e611e16565b610a388282611e31565b5050565b610a44611e16565b610a4f826040610e47565b610a38816040611e31565b6001600160a01b03831660009081526004602090815260408083203384529091528120546000198114610ab657610a918382613977565b6001600160a01b03861660009081526004602090815260408083203384529091529020555b6001600160a01b03851660009081526003602052604081208054859290610ade908490613977565b90915550506001600160a01b0380851660008181526003602052604090819020805487019055519091871690600080516020613dbe83398151915290610b279087815260200190565b60405180910390a360019150505b9392505050565b60006202a30067ffffffffffffffff164201905063389a75e1600c5233600052806020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d600080a250565b60007f00000000000000000000000000000000000000000000000000000000000000004614610bc257610bbd611e3d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b60006080610bf481611ed7565b6000610c07610100870160e0880161368c565b610c98576040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610c6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c93919061398a565b610d20565b6040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610cfc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d20919061398a565b9050610d3b6001600160a01b038616853060408a0135611efd565b60008080610d56610d51368b90038b018b613b51565b611f92565b91945092509050610d7782610d726101008c0160e08d0161368c565b6120d9565b610d9383610d8c6101008c0160e08d0161368c565b6001612153565b610da360a08a0160808b01613602565b6001600160a01b03168961024001357fd73aefea5fd72faf3628fb3e9239ab6ae73df634622685208ca2cd6dd25a34848b60400160000135848d60400160a0016020810190610df2919061368c565b60408051938452602084019290925215159082015260600160405180910390a3610e1c8782612237565b610e3b8460408b0135610e366101008d0160e08e0161368c565b612291565b98975050505050505050565b610e4f611e16565b610a388282611e0a565b63389a75e1600c523360005260006020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92600080a2565b610e9d611e16565b610ea76000612420565b565b600081610ec557601254601054610ec09190613977565b610a13565b601154600f54610a139190613977565b610edd611e16565b60135460ff1615610f01576040516390a3530760e01b815260040160405180910390fd5b600680546001600160a01b038089166001600160a01b0319928316179092556008805488841690831617905560078054878416908316179055600b805492851692909116919091179055600c819055610f5b866080611e31565b610f66836040611e31565b50506013805460ff1916600117905550505050565b6001805461092b90613927565b33600090815260036020526040812080548391908390610fa9908490613977565b90915550506001600160a01b03831660008181526003602052604090819020805485019055513390600080516020613dbe83398151915290610a079086815260200190565b6040610ff981611ed7565b6001600160a01b038516600090815260146020908152604080832087151584529091529020548315611065576001600160a01b038616600090815260146020908152604080832088151584529091528120805489929061105a908490613bf4565b909155506112e99050565b8087106112185760006110788289613977565b6001600160a01b03881660009081526014602090815260408083208a1580158552925282209190915590915061115f576000601154600f546110ba9190613977565b90508082111561114157601154600f5560006110d68284613977565b8815156000908152601560205260408120805492935083929091906110fc908490613bf4565b90915550506040805182815289151560208201527f1a852bbf2c6d09329dd417611a10e4133f7f61c236d5b9825dc5b1fa1c5038c5910160405180910390a150611159565b81600f60008282546111539190613977565b90915550505b50611212565b60006012546010546111719190613977565b9050808211156111f857601254601055600061118d8284613977565b8815156000908152601560205260408120805492935083929091906111b3908490613bf4565b90915550506040805182815289151560208201527f1a852bbf2c6d09329dd417611a10e4133f7f61c236d5b9825dc5b1fa1c5038c5910160405180910390a150611210565b816010600082825461120a9190613977565b90915550505b505b50611253565b6001600160a01b038616600090815260146020908152604080832088151584529091528120805489929061124d908490613977565b90915550505b82156112e9576001600160a01b0386166000908152601460209081526040808320881515845290915290205480156112e7576001600160a01b038716600090815260146020908152604080832089158015855292528220919091556112cf5780600f60008282546112c49190613bf4565b909155506112e79050565b80601060008282546112e19190613bf4565b90915550505b505b50505050505050565b60406112fd81611ed7565b61130783836120d9565b505050565b600461131781611ed7565b3068929eee149b4bd2126854036113365763ab143c066000526004601cfd5b3068929eee149b4bd2126855600d8054600e805460009384905590839055909161136883670b1a2bc2ec50000061245e565b9050600061137e83670b1a2bc2ec50000061245e565b9050600061138c8386613977565b9050600061139a8386613977565b600160005260156020527f27739e4bb5e6f8b5e4b57a047dca8767cc9b982a011081e086cbb0dfa9de818d5490915082908290156113e0576113dd846001612473565b91505b6000805260156020527fa31547ce6245cdb9ecea19cf8c7eb9f5974025bb4075011409251ae855b30aed541561141e5761141b836000612473565b90505b60085460405163095ea7b360e01b81526001600160a01b039182166004820181905260248201899052917f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303816000875af1158015611493573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b79190613c07565b5060405163095ea7b360e01b81526001600160a01b038281166004830152602482018890527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303816000875af1158015611527573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154b9190613c07565b50604051632083898b60e11b815260048101889052602481018790526001600160a01b03821690634107131690604401600060405180830381600087803b15801561159557600080fd5b505af11580156115a9573d6000803e3d6000fd5b5050505060006115bc638b78c6d8195490565b9050831561165d5760006115d1600286613c24565b600a5490915061160f906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169116838561255a565b600b5461165b906001600160a01b03166116298388613977565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691908561255a565b505b82156116fc576000611670600285613c24565b600a549091506116ae906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169116838561255a565b600b546116fa906001600160a01b03166116c88387613977565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691908561255a565b505b604080518b8152602081018b90527fd9787bf70d3926a4a81c52cba8799d18903ce0132aaa4b7de9e92dc893303a7f910160405180910390a1505050505050505050503868929eee149b4bd212685550565b604061175981611ed7565b81156117a057826117815783601260008282546117769190613bf4565b92505081905561179a565b83601160008282546117939190613bf4565b9250508190555b506117f8565b82156117cc576011548411156117ba5760006011556117f8565b83601160008282546117939190613977565b6012548411156117e05760006012556117f8565b83601260008282546117f29190613977565b90915550505b50505050565b604061180981611ed7565b6117f8848484612153565b428410156118695760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064015b60405180910390fd5b60006001611875610b8c565b6001600160a01b038a811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015611981573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906119b75750876001600160a01b0316816001600160a01b0316145b6119f45760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b6044820152606401611860565b6001600160a01b0390811660009081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b611a65611e16565b63389a75e1600c52806000526020600c208054421115611a8d57636f5e88186000526004601cfd5b60009055610a2381612420565b6080611aa581611ed7565b6000611ab8610100860160e0870161368c565b611b49576040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611b20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b44919061398a565b611bd1565b6040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611bad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd1919061398a565b9050611be33084816040890135611efd565b600080611bfd611bf836899003890189613c46565b6125ca565b9092509050611c1030604089013561270e565b611c2e611c1d8383613977565b610d726101008a0160e08b0161368c565b6000611c41610100890160e08a0161368c565b611c5a57601254601054611c559190613977565b611c6a565b601154600f54611c6a9190613977565b905080831115611c8d57604051630e35b43f60e11b815260040160405180910390fd5b611ca982611ca26101008b0160e08c0161368c565b6000612153565b611cb960a0890160808a01613602565b6001600160a01b03166102408901357fb97b67dc23d7b0e8db8d266123720e102347958aaf40de01240d76cbfdc5e53c60408b013586611d006101008e0160e08f0161368c565b60408051938452602084019290925215159082015260600160405180910390a3611d5d87611d3460a08b0160808c01613602565b85611d466101008d0160e08e0161368c565b611d586101208e016101008f0161368c565b612770565b6112e78484611d736101008c0160e08d0161368c565b612839565b611d80611e16565b8060601b611d9657637448fbae6000526004601cfd5b610a2381612420565b6040611daa81611ed7565b611e0383611dd8577f0000000000000000000000000000000000000000000000000000000000000000611dfa565b7f00000000000000000000000000000000000000000000000000000000000000005b86868686612770565b5050505050565b610a38828260006129c8565b638b78c6d819543314610ea7576382b429006000526004601cfd5b610a38828260016129c8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051611e6f9190613cfc565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b638b78c6d8600c5233600052806020600c205416610a23576382b429006000526004601cfd5b60006040516323b872dd60e01b81526001600160a01b03851660048201526001600160a01b03841660248201528260448201526020600060648360008a5af13d15601f3d1160016000511416171691505080611e035760405162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b6044820152606401611860565b600080600061208a84606001516020015185608001516020015186602001516001600160a01b031663477c6cb86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612012919061398a565b87602001516001600160a01b0316637776a9e66040518163ffffffff1660e01b8152600401602060405180830381865afa158015612054573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612078919061398a565b6040890151805160a090910151612a21565b60408501515190925061209e908390613977565b92506120d1846020015185606001518660800151868860c001518960e001518a61010001518b6040015160a00151612be2565b929491935050565b806120fb5781600e60008282546120f09190613bf4565b925050819055612114565b81600d600082825461210d9190613bf4565b9250508190555b506040805183815282151560208201527f595d66cc071469d9b1022b6aa1f9ff20ade4df6f8c92e2e7257279cc338b9b02910160405180910390a15050565b8015612197578161217b5782601060008282546121709190613bf4565b9250508190556117f8565b82600f600082825461218d9190613bf4565b9091555050505050565b81156121f0576000601154600f546121af9190613977565b9050808411156121d257604051630e35b43f60e11b815260040160405180910390fd5b83600f60008282546121e49190613977565b90915550611307915050565b60006012546010546122029190613977565b90508084111561222557604051630e35b43f60e11b815260040160405180910390fd5b83601060008282546117f29190613977565b80600260008282546122499190613bf4565b90915550506001600160a01b038216600081815260036020908152604080832080548601905551848152600080516020613dbe83398151915291015b60405180910390a35050565b8015612370576040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156122fe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612322919061398a565b905080600f54111561234757604051637a203bfd60e01b815260040160405180910390fd5b6123518385613bf4565b81146117f857604051637a203bfd60e01b815260040160405180910390fd5b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156123d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123fb919061398a565b905080601054111561234757604051637a203bfd60e01b815260040160405180910390fd5b638b78c6d81980546001600160a01b039092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a355565b6000610b358383670de0b6b3a7640000612ca0565b8015156000908152601560205260408120548084106124eb57821515600090815260156020526040812055826124c05780601060008282546124b59190613bf4565b9250508190556124d9565b80600f60008282546124d29190613bf4565b9250508190555b506124e48185613977565b9150612553565b8215156000908152601560205260408120805486929061250c908490613977565b909155508390506125345783601060008282546125299190613bf4565b92505081905561254d565b83600f60008282546125469190613bf4565b9250508190555b50600091505b5092915050565b6000612567858585612d40565b905080611e0357612579858385612d88565b846001600160a01b0316826001600160a01b0316856001600160a01b03167fe4f733266fd15005f4c01be334a8107c4bf1b855bebfa306c010f5664e74ab5560405160405180910390a45050505050565b6000806126068360200151846060015185608001518660400151600001518760c001518860e001518961010001518a6040015160a00151612e09565b905060006126fa84606001516020015185608001516020015186602001516001600160a01b031663477c6cb86040518163ffffffff1660e01b8152600401602060405180830381865afa158015612661573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612685919061398a565b87602001516001600160a01b0316637776a9e66040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126eb919061398a565b86896040015160a00151612f72565b90506127068183613977565b925050915091565b6001600160a01b03821660009081526003602052604081208054839290612736908490613977565b90915550506002805482900390556040518181526000906001600160a01b03841690600080516020613dbe83398151915290602001612285565b811561282757801561280357604051632e1a7d4d60e01b8152600481018490526001600160a01b03861690632e1a7d4d90602401600060405180830381600087803b1580156127be57600080fd5b505af11580156127d2573d6000803e3d6000fd5b505050506127fe8484600c546127eb638b78c6d8195490565b6001600160a01b038a16939291906130e7565b611e03565b6127fe8484612815638b78c6d8195490565b6001600160a01b03891692919061255a565b611e038484612815638b78c6d8195490565b8015612918576040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156128a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128ca919061398a565b905080600f5411156128ef57604051633f45757b60e11b815260040160405180910390fd5b6128f98385613977565b81146117f857604051633f45757b60e11b815260040160405180910390fd5b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561297f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129a3919061398a565b90508060105411156128ef57604051633f45757b60e11b815260040160405180910390fd5b638b78c6d8600c52826000526020600c208054838117836129ea575080841681185b80835580600c5160601c7f715ad5ce61fc9595c7b415289d59cf203f23a94fa06f04af7e489a0a76e1fe26600080a3505050505050565b600080612a358466038d7ea4c6800061245e565b9050851580612a42575084155b15612a4e579050612bd8565b600083612a6857612a638589620f4240613163565b612a7b565b612a7b858a670de0b6b3a7640000613163565b905080600003612a9e576040516369be95d560e01b815260040160405180910390fd5b6000612ab3888b670de0b6b3a7640000613163565b90506000612ac5888b620f4240613163565b905081158015612ad25750855b15612ae35783945050505050612bd8565b80158015612aef575085155b15612b005783945050505050612bd8565b6000612b0c8383613178565b905086612b2557612b1d8483613bf4565b915081612b33565b612b2f8484613bf4565b9250825b506000612b408484613178565b905060008282181260ff83901d8084011860ff83901d80840118108015612b65575080155b15612b795786975050505050505050612bd8565b600081612b865786612b90565b60ff83901d808401185b90506000612bb182612ba2888a613bf4565b662386f26fc100009190613163565b90506000612bbf8d8361245e565b9050612bcb818b613bf4565b9a50505050505050505050505b9695505050505050565b600080612bfb8a8a60400151888b604001518989613196565b905080600003612c475782612c25578751612c20908890670de0b6b3a7640000612ca0565b612c40565b8851612c409088906c0c9f2c9cd04674edea40000000612ca0565b9150612c93565b600083612c64578851612c5f908990620f4240613163565b612c7a565b8951612c7a908990670de0b6b3a7640000613163565b9050612c8f81670de0b6b3a764000084612ca0565b9250505b5098975050505050505050565b8282026000198385098181108201900380612cd15782612cc85763ae47f7026000526004601cfd5b50819004610b35565b808311612ce65763ae47f7026000526004601cfd5b82848609600084810385169485900494848311909303908390038390046001010292030417600260038302811880840282030280840282030280840282030280840282030280840282030280840290910302029392505050565b600060405163a9059cbb60e01b81526001600160a01b0384166004820152826024820152602060006044836000895af1600051600114601f3d11163d15171695945050505050565b600060405163a9059cbb60e01b81526001600160a01b0384166004820152826024820152602060006044836000895af13d15601f3d11600160005114161716915050806117f85760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b6044820152606401611860565b6000808990506000612e278b8b60000151898c600001518a8a613196565b90506000612e3e8983670de0b6b3a7640000613163565b90508415612ed95760408b0151612e5f908290670de0b6b3a764000061323f565b93506000836001600160a01b031663477c6cb86040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ea1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ec5919061398a565b905080851115612ed3578094505b50612f63565b60408a0151612eed908290620f424061323f565b93506000836001600160a01b0316637776a9e66040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f53919061398a565b905080851115612f61578094505b505b50505098975050505050505050565b600080612f868466038d7ea4c6800061245e565b9050600083612fa257612f9d8589620f4240613163565b612fb5565b612fb5858a670de0b6b3a7640000613163565b905080600003612fd8576040516369be95d560e01b815260040160405180910390fd5b6000612fed888b670de0b6b3a7640000613163565b90506000612fff888b620f4240613163565b9050600061300d8383613178565b9050866130265761301e8483613977565b915081613034565b6130308484613977565b9250825b5060006130418484613178565b905061304d8385613bf4565b60000361307c5761306589662386f26fc1000061245e565b61306f9087613bf4565b9650505050505050612bd8565b60008183181260ff83901d8084011860ff83901d8084011810801561309f575080155b156130b35786975050505050505050612bd8565b6000816130c057866130ca565b60ff83901d808401185b90506000612bb182896130dd898b613bf4565b612ba29190613bf4565b60006130f485858561324c565b90508061315b57856001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561313657600080fd5b505af115801561314a573d6000803e3d6000fd5b505050505061315b8686868561255a565b505050505050565b6000613170848484612ca0565b949350505050565b600061318382613260565b61318c84613260565b610b359190613d9d565b6000808790506000816001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131dc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613200919061398a565b9050806000036132135760009250613233565b60006132238a8a8a8a8a8a613279565b905061322f8183613472565b9350505b50509695505050505050565b6000613170848385612ca0565b6000806000806000868887f1949350505050565b6000600160ff1b8210613275576132756134c1565b5090565b60008087905061336b87670de0b6b3a764000067ffffffffffffffff16836001600160a01b031663055c89dc6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156132d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132f8919061398a565b846001600160a01b031663477c6cb86040518163ffffffff1660e01b8152600401602060405180830381865afa158015613336573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061335a919061398a565b6133649190613977565b9190613163565b6133759083613bf4565b915061342585620f424063ffffffff16836001600160a01b0316632da906f76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156133c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133e7919061398a565b846001600160a01b0316637776a9e66040518163ffffffff1660e01b8152600401602060405180830381865afa158015613336573d6000803e3d6000fd5b61342f9083613bf4565b915061343b8683613bf4565b91506134478483613bf4565b915060008312156134675761346460ff84901d8085011883613977565b91505b509695505050505050565b60007812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f218311670de0b6b3a7640000021582026134af57637c5f487d6000526004601cfd5b50670de0b6b3a7640000919091020490565b6335278d126000526004601cfd5b60006020808352835180602085015260005b818110156134fd578581018301518582016040015282016134e1565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610a2357600080fd5b803561353e8161351e565b919050565b6000806040838503121561355657600080fd5b82356135618161351e565b946020939093013593505050565b60006020828403121561358157600080fd5b5035919050565b6000806040838503121561359b57600080fd5b82356135a68161351e565b915060208301356135b68161351e565b809150509250929050565b6000806000606084860312156135d657600080fd5b83356135e18161351e565b925060208401356135f18161351e565b929592945050506040919091013590565b60006020828403121561361457600080fd5b8135610b358161351e565b600080600083850361030081121561363657600080fd5b6102c08082121561364657600080fd5b85945084013590506136578161351e565b91506102e08401356136688161351e565b809150509250925092565b8015158114610a2357600080fd5b803561353e81613673565b60006020828403121561369e57600080fd5b8135610b3581613673565b600080604083850312156136bc57600080fd5b82356136c78161351e565b915060208301356135b681613673565b60008060008060008060c087890312156136f057600080fd5b86356136fb8161351e565b9550602087013561370b8161351e565b9450604087013561371b8161351e565b9350606087013561372b8161351e565b9250608087013561373b8161351e565b8092505060a087013590509295509295509295565b600080600080600060a0868803121561376857600080fd5b85359450602086013561377a8161351e565b9350604086013561378a81613673565b9250606086013561379a81613673565b915060808601356137aa81613673565b809150509295509295909350565b600080604083850312156137cb57600080fd5b8235915060208301356135b681613673565b6000806000606084860312156137f257600080fd5b83359250602084013561380481613673565b9150604084013561366881613673565b600080600080600080600060e0888a03121561382f57600080fd5b873561383a8161351e565b9650602088013561384a8161351e565b95506040880135945060608801359350608088013560ff8116811461386e57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060008385036103208112156138a257600080fd5b6102e0808212156138b257600080fd5b85945084013590506138c38161351e565b91506103008401356136688161351e565b600080600080608085870312156138ea57600080fd5b84356138f58161351e565b935060208501359250604085013561390c81613673565b9150606085013561391c81613673565b939692955090935050565b600181811c9082168061393b57607f821691505b60208210810361395b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610a1357610a13613961565b60006020828403121561399c57600080fd5b5051919050565b604051610140810167ffffffffffffffff811182821017156139d557634e487b7160e01b600052604160045260246000fd5b60405290565b604051610120810167ffffffffffffffff811182821017156139d557634e487b7160e01b600052604160045260246000fd5b803565ffffffffffff8116811461353e57600080fd5b803564ffffffffff8116811461353e57600080fd5b60006101408284031215613a4b57600080fd5b613a536139a3565b90508135815260208201356020820152613a6f60408301613533565b6040820152613a8060608301613a0d565b6060820152613a9160808301613a23565b6080820152613aa260a08301613681565b60a0820152613ab360c08301613681565b60c0820152613ac460e08301613681565b60e082015261010080830135818301525061012080830135818301525092915050565b600060608284031215613af957600080fd5b6040516060810181811067ffffffffffffffff82111715613b2a57634e487b7160e01b600052604160045260246000fd5b80604052508091508235815260208301356020820152604083013560408201525092915050565b60006102c08284031215613b6457600080fd5b613b6c6139db565b613b7583613533565b8152613b8360208401613533565b6020820152613b958460408501613a38565b6040820152613ba8846101808501613ae7565b6060820152613bbb846101e08501613ae7565b608082015261024083013560a082015261026083013560c082015261028083013560e08201526102a09092013561010083015250919050565b80820180821115610a1357610a13613961565b600060208284031215613c1957600080fd5b8151610b3581613673565b600082613c4157634e487b7160e01b600052601260045260246000fd5b500490565b60006102e08284031215613c5957600080fd5b613c616139a3565b613c6a83613533565b8152613c7860208401613533565b6020820152613c8a8460408501613a38565b6040820152613c9d846101808501613ae7565b6060820152613cb0846101e08501613ae7565b608082015261024083013560a082015261026083013560c082015261028083013560e08201526102a0830135610100820152613cef6102c08401613681565b6101208201529392505050565b60008083548160018260011c91506001831680613d1a57607f831692505b60208084108203613d3957634e487b7160e01b86526022600452602486fd5b818015613d4d5760018114613d6257613d8f565b60ff1986168952841515850289019650613d8f565b60008a81526020902060005b86811015613d875781548b820152908501908301613d6e565b505084890196505b509498975050505050505050565b81810360008312801583831316838312821617156125535761255361396156feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220a40adbdeb61cf49032612bac7cd3f86000bab7913346767f9aad6ffd7a43d30064736f6c63430008170033000000000000000000000000656faa1fc88ff4087c9523a211ea47b29f979a0f00000000000000000000000042000000000000000000000000000000000000060000000000000000000000009881f8b307cc3383500b432a8ce9597fafc73a7700000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100f69c410df0b0c5faae063e6ec0736f35766952298a467b27a3236c644f3c513f00000000000000000000000000000000000000000000000000000000000000094d4f47203130303058000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064d4f472d4c500000000000000000000000000000000000000000000000000000