Loading
[ { "inputs": [ { "internalType": "address", "name": "cowSolutionSettler", "type": "address" }, { "internalType": "bytes32", "name": "appData", "type": "bytes32" }, { "internalType": "string", "name": "name", "type": "string" }, { "internalType": "string", "name": "symbol", "type": "string" } ], "stateMutability": "nonpayable", "type": "constructor" }, { "inputs": [ { "internalType": "address", "name": "target", "type": "address" } ], "name": "AddressEmptyCode", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "AddressInsufficientBalance", "type": "error" }, { "inputs": [], "name": "AppDataDoesNotMatch", "type": "error" }, { "inputs": [], "name": "BCoWPool_FeeMustBeZero", "type": "error" }, { "inputs": [], "name": "BCoWPool_InvalidBalanceMarker", "type": "error" }, { "inputs": [], "name": "BCoWPool_InvalidOperation", "type": "error" }, { "inputs": [], "name": "BCoWPool_OrderValidityTooLong", "type": "error" }, { "inputs": [], "name": "BCoWPool_ReceiverIsNotBCoWPool", "type": "error" }, { "inputs": [], "name": "BNum_AddOverflow", "type": "error" }, { "inputs": [], "name": "BNum_BPowBaseTooHigh", "type": "error" }, { "inputs": [], "name": "BNum_BPowBaseTooLow", "type": "error" }, { "inputs": [], "name": "BNum_DivInternal", "type": "error" }, { "inputs": [], "name": "BNum_DivZero", "type": "error" }, { "inputs": [], "name": "BNum_MulOverflow", "type": "error" }, { "inputs": [], "name": "BNum_SubUnderflow", "type": "error" }, { "inputs": [], "name": "BPool_AddressZero", "type": "error" }, { "inputs": [], "name": "BPool_BalanceBelowMinimum", "type": "error" }, { "inputs": [], "name": "BPool_CallerIsNotController", "type": "error" }, { "inputs": [], "name": "BPool_FeeAboveMaximum", "type": "error" }, { "inputs": [], "name": "BPool_FeeBelowMinimum", "type": "error" }, { "inputs": [], "name": "BPool_InvalidPoolAmountIn", "type": "error" }, { "inputs": [], "name": "BPool_InvalidPoolRatio", "type": "error" }, { "inputs": [], "name": "BPool_InvalidTokenAmountIn", "type": "error" }, { "inputs": [], "name": "BPool_InvalidTokenAmountOut", "type": "error" }, { "inputs": [], "name": "BPool_PoolAmountInAboveMaxPoolAmountIn", "type": "error" }, { "inputs": [], "name": "BPool_PoolAmountOutBelowMinPoolAmountOut", "type": "error" }, { "inputs": [], "name": "BPool_PoolIsFinalized", "type": "error" }, { "inputs": [], "name": "BPool_PoolNotFinalized", "type": "error" }, { "inputs": [], "name": "BPool_Reentrancy", "type": "error" }, { "inputs": [], "name": "BPool_SpotPriceAboveMaxPrice", "type": "error" }, { "inputs": [], "name": "BPool_SpotPriceAfterBelowSpotPriceBefore", "type": "error" }, { "inputs": [], "name": "BPool_SpotPriceBeforeAboveTokenRatio", "type": "error" }, { "inputs": [], "name": "BPool_TokenAlreadyBound", "type": "error" }, { "inputs": [], "name": "BPool_TokenAmountInAboveMaxAmountIn", "type": "error" }, { "inputs": [], "name": "BPool_TokenAmountInAboveMaxRatio", "type": "error" }, { "inputs": [], "name": "BPool_TokenAmountOutAboveMaxOut", "type": "error" }, { "inputs": [], "name": "BPool_TokenAmountOutBelowMinAmountOut", "type": "error" }, { "inputs": [], "name": "BPool_TokenAmountOutBelowMinOut", "type": "error" }, { "inputs": [], "name": "BPool_TokenNotBound", "type": "error" }, { "inputs": [], "name": "BPool_TokensAboveMaximum", "type": "error" }, { "inputs": [], "name": "BPool_TokensBelowMinimum", "type": "error" }, { "inputs": [], "name": "BPool_TotalWeightAboveMaximum", "type": "error" }, { "inputs": [], "name": "BPool_WeightAboveMaximum", "type": "error" }, { "inputs": [], "name": "BPool_WeightBelowMinimum", "type": "error" }, { "inputs": [], "name": "CommitOutsideOfSettlement", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "allowance", "type": "uint256" }, { "internalType": "uint256", "name": "needed", "type": "uint256" } ], "name": "ERC20InsufficientAllowance", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "sender", "type": "address" }, { "internalType": "uint256", "name": "balance", "type": "uint256" }, { "internalType": "uint256", "name": "needed", "type": "uint256" } ], "name": "ERC20InsufficientBalance", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "approver", "type": "address" } ], "name": "ERC20InvalidApprover", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "receiver", "type": "address" } ], "name": "ERC20InvalidReceiver", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "sender", "type": "address" } ], "name": "ERC20InvalidSender", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" } ], "name": "ERC20InvalidSpender", "type": "error" }, { "inputs": [], "name": "FailedInnerCall", "type": "error" }, { "inputs": [], "name": "OrderDoesNotMatchCommitmentHash", "type": "error" }, { "inputs": [], "name": "OrderDoesNotMatchMessageHash", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "token", "type": "address" } ], "name": "SafeERC20FailedOperation", "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": true, "internalType": "address", "name": "bCoWPool", "type": "address" } ], "name": "COWAMMPoolCreated", "type": "event" }, { "anonymous": true, "inputs": [ { "indexed": true, "internalType": "bytes4", "name": "sig", "type": "bytes4" }, { "indexed": true, "internalType": "address", "name": "caller", "type": "address" }, { "indexed": false, "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "LOG_CALL", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "caller", "type": "address" }, { "indexed": true, "internalType": "address", "name": "tokenOut", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "tokenAmountOut", "type": "uint256" } ], "name": "LOG_EXIT", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "caller", "type": "address" }, { "indexed": true, "internalType": "address", "name": "tokenIn", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "tokenAmountIn", "type": "uint256" } ], "name": "LOG_JOIN", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "caller", "type": "address" }, { "indexed": true, "internalType": "address", "name": "tokenIn", "type": "address" }, { "indexed": true, "internalType": "address", "name": "tokenOut", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "tokenAmountIn", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "tokenAmountOut", "type": "uint256" } ], "name": "LOG_SWAP", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "Transfer", "type": "event" }, { "inputs": [], "name": "APP_DATA", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "BONE", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "BPOW_PRECISION", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "EXIT_FEE", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "FACTORY", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "INIT_POOL_SUPPLY", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "MAX_BOUND_TOKENS", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "MAX_BPOW_BASE", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "MAX_FEE", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "MAX_IN_RATIO", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "MAX_ORDER_DURATION", "outputs": [ { "internalType": "uint32", "name": "", "type": "uint32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "MAX_OUT_RATIO", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "MAX_TOTAL_WEIGHT", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "MAX_WEIGHT", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "MIN_BALANCE", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "MIN_BOUND_TOKENS", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "MIN_BPOW_BASE", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "MIN_FEE", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "MIN_WEIGHT", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "SOLUTION_SETTLER", "outputs": [ { "internalType": "contract ISettlement", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "SOLUTION_SETTLER_DOMAIN_SEPARATOR", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "VAULT_RELAYER", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "spender", "type": "address" } ], "name": "allowance", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "approve", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "balanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "token", "type": "address" }, { "internalType": "uint256", "name": "balance", "type": "uint256" }, { "internalType": "uint256", "name": "denorm", "type": "uint256" } ], "name": "bind", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenBalanceIn", "type": "uint256" }, { "internalType": "uint256", "name": "tokenWeightIn", "type": "uint256" }, { "internalType": "uint256", "name": "tokenBalanceOut", "type": "uint256" }, { "internalType": "uint256", "name": "tokenWeightOut", "type": "uint256" }, { "internalType": "uint256", "name": "tokenAmountOut", "type": "uint256" }, { "internalType": "uint256", "name": "swapFee", "type": "uint256" } ], "name": "calcInGivenOut", "outputs": [ { "internalType": "uint256", "name": "tokenAmountIn", "type": "uint256" } ], "stateMutability": "pure", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenBalanceIn", "type": "uint256" }, { "internalType": "uint256", "name": "tokenWeightIn", "type": "uint256" }, { "internalType": "uint256", "name": "tokenBalanceOut", "type": "uint256" }, { "internalType": "uint256", "name": "tokenWeightOut", "type": "uint256" }, { "internalType": "uint256", "name": "tokenAmountIn", "type": "uint256" }, { "internalType": "uint256", "name": "swapFee", "type": "uint256" } ], "name": "calcOutGivenIn", "outputs": [ { "internalType": "uint256", "name": "tokenAmountOut", "type": "uint256" } ], "stateMutability": "pure", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenBalanceIn", "type": "uint256" }, { "internalType": "uint256", "name": "tokenWeightIn", "type": "uint256" }, { "internalType": "uint256", "name": "tokenBalanceOut", "type": "uint256" }, { "internalType": "uint256", "name": "tokenWeightOut", "type": "uint256" }, { "internalType": "uint256", "name": "swapFee", "type": "uint256" } ], "name": "calcSpotPrice", "outputs": [ { "internalType": "uint256", "name": "spotPrice", "type": "uint256" } ], "stateMutability": "pure", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "orderHash", "type": "bytes32" } ], "name": "commit", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "decimals", "outputs": [ { "internalType": "uint8", "name": "", "type": "uint8" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "decreaseApproval", "outputs": [ { "internalType": "bool", "name": "success", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "poolAmountIn", "type": "uint256" }, { "internalType": "uint256[]", "name": "minAmountsOut", "type": "uint256[]" } ], "name": "exitPool", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "finalize", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "token", "type": "address" } ], "name": "getBalance", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getController", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getCurrentTokens", "outputs": [ { "internalType": "address[]", "name": "", "type": "address[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "token", "type": "address" } ], "name": "getDenormalizedWeight", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getFinalTokens", "outputs": [ { "internalType": "address[]", "name": "", "type": "address[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "token", "type": "address" } ], "name": "getNormalizedWeight", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getNumTokens", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "tokenIn", "type": "address" }, { "internalType": "address", "name": "tokenOut", "type": "address" } ], "name": "getSpotPrice", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "tokenIn", "type": "address" }, { "internalType": "address", "name": "tokenOut", "type": "address" } ], "name": "getSpotPriceSansFee", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getSwapFee", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getTotalDenormalizedWeight", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "increaseApproval", "outputs": [ { "internalType": "bool", "name": "success", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "token", "type": "address" } ], "name": "isBound", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "isFinalized", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "orderHash", "type": "bytes32" }, { "internalType": "bytes", "name": "signature", "type": "bytes" } ], "name": "isValidSignature", "outputs": [ { "internalType": "bytes4", "name": "magicValue", "type": "bytes4" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "poolAmountOut", "type": "uint256" }, { "internalType": "uint256[]", "name": "maxAmountsIn", "type": "uint256[]" } ], "name": "joinPool", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "name", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newController", "type": "address" } ], "name": "setController", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "swapFee", "type": "uint256" } ], "name": "setSwapFee", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "tokenIn", "type": "address" }, { "internalType": "uint256", "name": "tokenAmountIn", "type": "uint256" }, { "internalType": "address", "name": "tokenOut", "type": "address" }, { "internalType": "uint256", "name": "minAmountOut", "type": "uint256" }, { "internalType": "uint256", "name": "maxPrice", "type": "uint256" } ], "name": "swapExactAmountIn", "outputs": [ { "internalType": "uint256", "name": "tokenAmountOut", "type": "uint256" }, { "internalType": "uint256", "name": "spotPriceAfter", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "tokenIn", "type": "address" }, { "internalType": "uint256", "name": "maxAmountIn", "type": "uint256" }, { "internalType": "address", "name": "tokenOut", "type": "address" }, { "internalType": "uint256", "name": "tokenAmountOut", "type": "uint256" }, { "internalType": "uint256", "name": "maxPrice", "type": "uint256" } ], "name": "swapExactAmountOut", "outputs": [ { "internalType": "uint256", "name": "tokenAmountIn", "type": "uint256" }, { "internalType": "uint256", "name": "spotPriceAfter", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "symbol", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalSupply", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "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": "value", "type": "uint256" } ], "name": "transferFrom", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "token", "type": "address" } ], "name": "unbind", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "components": [ { "internalType": "contract IERC20", "name": "sellToken", "type": "address" }, { "internalType": "contract IERC20", "name": "buyToken", "type": "address" }, { "internalType": "address", "name": "receiver", "type": "address" }, { "internalType": "uint256", "name": "sellAmount", "type": "uint256" }, { "internalType": "uint256", "name": "buyAmount", "type": "uint256" }, { "internalType": "uint32", "name": "validTo", "type": "uint32" }, { "internalType": "bytes32", "name": "appData", "type": "bytes32" }, { "internalType": "uint256", "name": "feeAmount", "type": "uint256" }, { "internalType": "bytes32", "name": "kind", "type": "bytes32" }, { "internalType": "bool", "name": "partiallyFillable", "type": "bool" }, { "internalType": "bytes32", "name": "sellTokenBalance", "type": "bytes32" }, { "internalType": "bytes32", "name": "buyTokenBalance", "type": "bytes32" } ], "internalType": "struct GPv2Order.Data", "name": "order", "type": "tuple" } ], "name": "verify", "outputs": [], "stateMutability": "view", "type": "function" } ]
610120604052348015610010575f80fd5b5060405161440938038061440983398101604081905261002f91610233565b81818181818160036100418382610330565b50600461004e8282610330565b5050600580546001600160a01b03191633908117909155608052506100829150620f42409050670de0b6b3a76400006103ef565b60065550506007805460ff191690556001600160a01b03841660e08190526040805163f698da2560e01b8152905163f698da25916004808201926020929091908290030181865afa1580156100d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100fd919061040e565b60c08181525050836001600160a01b0316639b552cc26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610140573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101649190610425565b6001600160a01b031660a05250506101005250610445565b80516001600160a01b0381168114610192575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126101ba575f80fd5b81516001600160401b03808211156101d4576101d4610197565b604051601f8301601f19908116603f011681019082821181831017156101fc576101fc610197565b81604052838152866020858801011115610214575f80fd5b8360208701602083015e5f602085830101528094505050505092915050565b5f805f8060808587031215610246575f80fd5b61024f8561017c565b6020860151604087015191955093506001600160401b0380821115610272575f80fd5b61027e888389016101ab565b93506060870151915080821115610293575f80fd5b506102a0878288016101ab565b91505092959194509250565b600181811c908216806102c057607f821691505b6020821081036102de57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561032b57805f5260205f20601f840160051c810160208510156103095750805b601f840160051c820191505b81811015610328575f8155600101610315565b50505b505050565b81516001600160401b0381111561034957610349610197565b61035d8161035784546102ac565b846102e4565b602080601f831160018114610390575f84156103795750858301515b5f19600386901b1c1916600185901b1785556103e7565b5f85815260208120601f198616915b828110156103be5788860151825594840194600190910190840161039f565b50858210156103db57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f8261040957634e487b7160e01b5f52601260045260245ffd5b500490565b5f6020828403121561041e575f80fd5b5051919050565b5f60208284031215610435575f80fd5b61043e8261017c565b9392505050565b60805160a05160c05160e05161010051613f5d6104ac5f395f81816105800152610c5601525f818161061a0152612a5101525f818161077e0152610cd601525f81816104820152612e1c01525f81816104d6015281816120ef0152612e760152613f5d5ff3fe608060405234801561000f575f80fd5b506004361061039e575f3560e01c80639381cd2b116101ea578063c36596a611610114578063dd62ed3e116100a9578063f14fcbc811610079578063f14fcbc8146107fa578063f1b8a9b71461080d578063f8b2cb4f14610820578063f8d6aed414610833575f80fd5b8063dd62ed3e146107a0578063e4a28a52146103e3578063e4e1e538146107d8578063ec093021146107eb575f80fd5b8063cf5e7bd3116100e4578063cf5e7bd31461074b578063d4cadf681461075e578063d73dd62314610766578063da08c4dc14610779575f80fd5b8063c36596a61461045b578063c6580d1214610734578063cc77828d1461073b578063cd2ed8fb14610743575f80fd5b8063b02f0b731161018a578063ba9530a61161015a578063ba9530a6146106fc578063bc063e1a1461070f578063bc694ea214610717578063be3bbd2e1461071f575f80fd5b8063b02f0b73146106d1578063b0e0d136146106e4578063b7b800a4146106ec578063ba019dab146106f4575f80fd5b8063981a160b116101c5578063981a160b14610685578063992e2a92146106a3578063a221ee49146106ab578063a9059cbb146106be575f80fd5b80639381cd2b14610662578063948d8ce61461066a57806395d89b411461067d575f80fd5b8063313ce567116102cb57806376c7a3c71161026b5780638b54ab1f1161023b5780638b54ab1f146106155780638d4e40831461063c57806392eefe9b14610647578063936c34771461065a575f80fd5b806376c7a3c7146105ca5780637c5e9ea4146105d25780638201aa3f146105fa578063867378c51461060d575f80fd5b80634f69c0d4116102a65780634f69c0d41461055557806366188463146105685780636dbc88131461057b57806370a08231146105a2575f80fd5b8063313ce5671461052b57806334e199071461053a5780634bb278f31461054d575f80fd5b8063189d00ca1161034157806328bd64431161031157806328bd6443146104bc5780632dd31000146104d15780632f37b624146104f85780633018205f14610523575f80fd5b8063189d00ca14610453578063218b53821461045b57806323b872dd1461046a5780632626f2941461047d575f80fd5b80631446a7ff1161037c5780631446a7ff146103f957806315e84af91461040c5780631626ba7e1461041f57806318160ddd1461044b575f80fd5b806306fdde03146103a2578063095ea7b3146103c057806309a3bbe4146103e3575b5f80fd5b6103aa610846565b6040516103b791906137f9565b60405180910390f35b6103d36103ce36600461384d565b6108d6565b60405190151581526020016103b7565b6103eb6108ef565b6040519081526020016103b7565b6103eb610407366004613877565b610905565b6103eb61041a366004613877565b610aa4565b61043261042d36600461391d565b610c3c565b6040516001600160e01b031990911681526020016103b7565b6002546103eb565b6103eb610d6e565b6103eb670de0b6b3a764000081565b6103d36104783660046139b6565b610d85565b6104a47f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016103b7565b6104cf6104ca366004613a28565b610daa565b005b6104a47f000000000000000000000000000000000000000000000000000000000000000081565b6103d3610506366004613ae4565b6001600160a01b03165f9081526009602052604090205460ff1690565b6104a46110e9565b604051601281526020016103b7565b6104cf610548366004613aff565b611127565b6104cf611272565b6104cf610563366004613b16565b6113ab565b6103d361057636600461384d565b6115f0565b6103eb7f000000000000000000000000000000000000000000000000000000000000000081565b6103eb6105b0366004613ae4565b6001600160a01b03165f9081526020819052604090205490565b6103eb61163f565b6105e56105e0366004613b8e565b611654565b604080519283526020830191909152016103b7565b6105e5610608366004613b8e565b611a09565b6103eb611d8f565b6104a47f000000000000000000000000000000000000000000000000000000000000000081565b60075460ff166103d3565b6104cf610655366004613ae4565b611da6565b6103eb611e8b565b6103eb611ec0565b6103eb610678366004613ae4565b611ed3565b6103aa611f5b565b61068e61012c81565b60405163ffffffff90911681526020016103b7565b6103eb611f6a565b6103eb6106b9366004613bdc565b611f88565b6103d36106cc36600461384d565b611fee565b6104cf6106df366004613b16565b611ffb565b6103eb600881565b6103eb600281565b6103eb600181565b6103eb61070a366004613c13565b612281565b6103eb6122fd565b6103eb612324565b610727612343565b6040516103b79190613c52565b6103eb5f81565b6107276123f2565b6008546103eb565b6104cf610759366004613ae4565b612421565b6103eb61270e565b6103d361077436600461384d565b612743565b6103eb7f000000000000000000000000000000000000000000000000000000000000000081565b6103eb6107ae366004613877565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6104cf6107e6366004613c9e565b612782565b6103eb6706f05b59d3b2000081565b6104cf610808366004613aff565b612a19565b6103eb61081b366004613ae4565b612a98565b6103eb61082e366004613ae4565b612b27565b6103eb610841366004613c13565b612bf3565b60606003805461085590613cd0565b80601f016020809104026020016040519081016040528092919081815260200182805461088190613cd0565b80156108cc5780601f106108a3576101008083540402835291602001916108cc565b820191905f5260205f20905b8154815290600101906020018083116108af57829003601f168201915b5050505050905090565b5f336108e3818585612c72565b60019150505b92915050565b610902670de0b6b3a76400006032613d1c565b81565b5f5f80516020613f088339815191525c156109335760405163d56a08b560e01b815260040160405180910390fd5b6001600160a01b0383165f9081526009602052604090205460ff1661096b57604051634b16fc2d60e11b815260040160405180910390fd5b6001600160a01b0382165f9081526009602052604090205460ff166109a357604051634b16fc2d60e11b815260040160405180910390fd5b6001600160a01b038381165f8181526009602052604080822093861682529081902090516370a0823160e01b81523060048201529091610a9b916370a0823190602401602060405180830381865afa158015610a01573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a259190613d33565b60028401546040516370a0823160e01b81523060048201526001600160a01b038816906370a0823190602401602060405180830381865afa158015610a6c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a909190613d33565b84600201545f611f88565b95945050505050565b5f5f80516020613f088339815191525c15610ad25760405163d56a08b560e01b815260040160405180910390fd5b6001600160a01b0383165f9081526009602052604090205460ff16610b0a57604051634b16fc2d60e11b815260040160405180910390fd5b6001600160a01b0382165f9081526009602052604090205460ff16610b4257604051634b16fc2d60e11b815260040160405180910390fd5b6001600160a01b038381165f8181526009602052604080822093861682529081902090516370a0823160e01b81523060048201529091610a9b916370a0823190602401602060405180830381865afa158015610ba0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bc49190613d33565b60028401546040516370a0823160e01b81523060048201526001600160a01b038816906370a0823190602401602060405180830381865afa158015610c0b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c2f9190613d33565b8460020154600654611f88565b5f8082806020019051810190610c529190613d6b565b90507f00000000000000000000000000000000000000000000000000000000000000008160c0015114610c9857604051630e1a1b6360e41b815260040160405180910390fd5b601f19810180517fd5a25ba2e97094ad7d83dc28a6572da797d6b3e7fc6663bd93efb789fc17e48982526101a08220915260405161190160f01b81527f00000000000000000000000000000000000000000000000000000000000000006002820152602281019190915260429020848114610d265760405163593fcacd60e01b815260040160405180910390fd5b5f80516020613f088339815191525c8114610d545760405163dafbdd1f60e01b815260040160405180910390fd5b610d5d82610daa565b50630b135d3f60e11b949350505050565b6109026402540be400670de0b6b3a7640000613e3b565b5f33610d92858285612c7f565b610d9d858585612cff565b60019150505b9392505050565b6020808201516001600160a01b039081165f90815260098084526040808320815160608082018452825460ff90811615158352600180850154848b0152600294850154848701528a519098168752948852948390208351958601845280549094161515855294830154958401959095529301549281019290925280519091901580610e3457508051155b15610e5257604051634b16fc2d60e11b815260040160405180910390fd5b60408301516001600160a01b031615610e7d57604051623c9da560e61b815260040160405180910390fd5b610e8961012c42613e5a565b8360a0015163ffffffff161115610eb35760405163326389f960e11b815260040160405180910390fd5b60e083015115610ed557604051620e5bdf60e41b815260040160405180910390fd5b7ff3b277728b3fee749481eb3e0b3b48980dbbab78658fc419025cb16eee34677583610100015114610f1a57604051632c9634af60e01b815260040160405180910390fd5b7f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc9836101600151141580610f7357507f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc983610140015114155b15610f91576040516397a2328160e01b815260040160405180910390fd5b60208301516040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610fd9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ffd9190613d33565b9050611011816706f05b59d3b20000612d5c565b846080015111156110355760405163558fcd9160e11b815260040160405180910390fd5b604080840151855191516370a0823160e01b81523060048201525f926110bb92859290916001600160a01b0316906370a0823190602401602060405180830381865afa158015611087573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110ab9190613d33565b866040015189608001515f612281565b905084606001518110156110e25760405163d6ac339560e01b815260040160405180910390fd5b5050505050565b5f5f80516020613f088339815191525c156111175760405163d56a08b560e01b815260040160405180910390fd5b506005546001600160a01b031690565b336001600160a01b03165f356001600160e01b0319166001600160e01b0319165f36604051611157929190613e6d565b60405180910390a25f80516020613f088339815191525c1561118c5760405163d56a08b560e01b815260040160405180910390fd5b6111966001612ddf565b6005546001600160a01b031633146111c157604051634f0f549960e11b815260040160405180910390fd5b60075460ff16156111e55760405163056f633d60e21b815260040160405180910390fd5b6111fa620f4240670de0b6b3a7640000613e3b565b81101561121a57604051633b46575d60e01b815260040160405180910390fd5b61122f620f4240670de0b6b3a7640000613e3b565b61124190670de0b6b3a7640000613e9b565b81111561126157604051630f71fbbf60e11b815260040160405180910390fd5b600681905561126f5f612ddf565b50565b336001600160a01b03165f356001600160e01b0319166001600160e01b0319165f366040516112a2929190613e6d565b60405180910390a25f80516020613f088339815191525c156112d75760405163d56a08b560e01b815260040160405180910390fd5b6112e16001612ddf565b6005546001600160a01b0316331461130c57604051634f0f549960e11b815260040160405180910390fd5b60075460ff16156113305760405163056f633d60e21b815260040160405180910390fd5b600854600211156113545760405163af785ec560e01b815260040160405180910390fd5b6007805460ff1916600117905561137c611377670de0b6b3a76400006064613d1c565b612df2565b61139833611393670de0b6b3a76400006064613d1c565b612dfc565b6113a0612e0a565b6113a95f612ddf565b565b336001600160a01b03165f356001600160e01b0319166001600160e01b0319165f366040516113db929190613e6d565b60405180910390a25f80516020613f088339815191525c156114105760405163d56a08b560e01b815260040160405180910390fd5b61141a6001612ddf565b60075460ff1661143d57604051632e41ba2d60e01b815260040160405180910390fd5b5f61144760025490565b90505f6114548583612f0e565b9050805f0361147657604051630c499f4760e01b815260040160405180910390fd5b6008545f5b818110156115c9575f6008828154811061149757611497613eae565b5f9182526020822001546040516370a0823160e01b81523060048201526001600160a01b03909116925082906370a0823190602401602060405180830381865afa1580156114e7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061150b9190613d33565b90505f6115188683612d5c565b9050805f0361153a57604051635b00df6960e11b815260040160405180910390fd5b88888581811061154c5761154c613eae565b9050602002013581111561157357604051630451d9ed60e31b815260040160405180910390fd5b6040518181526001600160a01b0384169033907f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a9060200160405180910390a36115be833383612fb6565b50505060010161147b565b506115d386612df2565b6115dd3387612dfc565b5050506115eb5f801b612ddf565b505050565b335f9081526001602090815260408083206001600160a01b03861684529091528120548083111561162b5761162633855f612c72565b6108e3565b6108e3338561163a8685613e9b565b612c72565b610902620f4240670de0b6b3a7640000613e3b565b6040515f90819033906001600160e01b0319833516906116779084903690613e6d565b60405180910390a25f80516020613f088339815191525c156116ac5760405163d56a08b560e01b815260040160405180910390fd5b6116b66001612ddf565b60075460ff166116d957604051632e41ba2d60e01b815260040160405180910390fd5b6001600160a01b0387165f9081526009602052604090205460ff1661171157604051634b16fc2d60e11b815260040160405180910390fd5b6001600160a01b0385165f9081526009602052604090205460ff1661174957604051634b16fc2d60e11b815260040160405180910390fd5b6001600160a01b038781165f81815260096020526040808220938916825280822090516370a0823160e01b81523060048201529092906370a0823190602401602060405180830381865afa1580156117a3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117c79190613d33565b6040516370a0823160e01b81523060048201529091505f906001600160a01b038a16906370a0823190602401602060405180830381865afa15801561180e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118329190613d33565b905061185b8161184b6003670de0b6b3a7640000613e3b565b611856906001613e5a565b612d5c565b88111561187b5760405163dad25d8560e01b815260040160405180910390fd5b5f611893838660020154848760020154600654611f88565b9050878111156118b65760405163823a9c3760e01b815260040160405180910390fd5b6118ce8386600201548487600201548d600654612bf3565b96508a8711156118f157604051630451d9ed60e31b815260040160405180910390fd5b6118fb8388612fcb565b9250611907828a612ff0565b9150611920838660020154848760020154600654611f88565b95508086101561194357604051636212302360e01b815260040160405180910390fd5b878611156119645760405163823a9c3760e01b815260040160405180910390fd5b61196e878a612f0e565b81111561198e576040516337fb98f960e11b815260040160405180910390fd5b60408051888152602081018b90526001600160a01b03808d1692908f169133917f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d43378910160405180910390a46119e48c3389612fb6565b6119ef8a338b613028565b50505050506119ff5f801b612ddf565b9550959350505050565b6040515f90819033906001600160e01b031983351690611a2c9084903690613e6d565b60405180910390a25f80516020613f088339815191525c15611a615760405163d56a08b560e01b815260040160405180910390fd5b611a6b6001612ddf565b60075460ff16611a8e57604051632e41ba2d60e01b815260040160405180910390fd5b6001600160a01b0387165f9081526009602052604090205460ff16611ac657604051634b16fc2d60e11b815260040160405180910390fd5b6001600160a01b0385165f9081526009602052604090205460ff16611afe57604051634b16fc2d60e11b815260040160405180910390fd5b6001600160a01b038781165f81815260096020526040808220938916825280822090516370a0823160e01b81523060048201529092906370a0823190602401602060405180830381865afa158015611b58573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b7c9190613d33565b6040516370a0823160e01b81523060048201529091505f906001600160a01b038a16906370a0823190602401602060405180830381865afa158015611bc3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611be79190613d33565b9050611bfb826706f05b59d3b20000612d5c565b8a1115611c1b5760405163558fcd9160e11b815260040160405180910390fd5b5f611c33838660020154848760020154600654611f88565b905087811115611c565760405163823a9c3760e01b815260040160405180910390fd5b611c6e8386600201548487600201548f600654612281565b965088871015611c915760405163d6ac339560e01b815260040160405180910390fd5b611c9b838c612fcb565b9250611ca78288612ff0565b9150611cc0838660020154848760020154600654611f88565b955080861015611ce357604051636212302360e01b815260040160405180910390fd5b87861115611d045760405163823a9c3760e01b815260040160405180910390fd5b611d0e8b88612f0e565b811115611d2e576040516337fb98f960e11b815260040160405180910390fd5b604080518c8152602081018990526001600160a01b03808d1692908f169133917f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d43378910160405180910390a4611d848c338d612fb6565b6119ef8a3389613028565b61090264e8d4a51000670de0b6b3a7640000613e3b565b336001600160a01b03165f356001600160e01b0319166001600160e01b0319165f36604051611dd6929190613e6d565b60405180910390a25f80516020613f088339815191525c15611e0b5760405163d56a08b560e01b815260040160405180910390fd5b611e156001612ddf565b6005546001600160a01b03163314611e4057604051634f0f549960e11b815260040160405180910390fd5b6001600160a01b038116611e67576040516351a9e5c560e01b815260040160405180910390fd5b600580546001600160a01b0319166001600160a01b03831617905561126f5f612ddf565b5f5f80516020613f088339815191525c15611eb95760405163d56a08b560e01b815260040160405180910390fd5b50600a5490565b610902670de0b6b3a76400006064613d1c565b5f5f80516020613f088339815191525c15611f015760405163d56a08b560e01b815260040160405180910390fd5b6001600160a01b0382165f9081526009602052604090205460ff16611f3957604051634b16fc2d60e11b815260040160405180910390fd5b506001600160a01b0381165f908152600960205260409020600201545b919050565b60606004805461085590613cd0565b611f7d6003670de0b6b3a7640000613e3b565b610902906001613e5a565b5f80611f948787612f0e565b90505f611fa18686612f0e565b90505f611fae8383612f0e565b90505f611fd4670de0b6b3a7640000611fcf670de0b6b3a764000089612ff0565b612f0e565b9050611fe08282612d5c565b9a9950505050505050505050565b5f336108e3818585612cff565b336001600160a01b03165f356001600160e01b0319166001600160e01b0319165f3660405161202b929190613e6d565b60405180910390a25f80516020613f088339815191525c156120605760405163d56a08b560e01b815260040160405180910390fd5b61206a6001612ddf565b60075460ff1661208d57604051632e41ba2d60e01b815260040160405180910390fd5b5f61209760025490565b90505f6120a4855f612d5c565b90505f6120b18683612ff0565b90505f6120be8285612f0e565b9050805f036120e057604051630c499f4760e01b815260040160405180910390fd5b6120ea338861303c565b6121147f000000000000000000000000000000000000000000000000000000000000000084612dfc565b61211d82613046565b6008545f5b81811015612270575f6008828154811061213e5761213e613eae565b5f9182526020822001546040516370a0823160e01b81523060048201526001600160a01b03909116925082906370a0823190602401602060405180830381865afa15801561218e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121b29190613d33565b90505f6121bf8683612d5c565b9050805f036121e157604051634b4ae51b60e11b815260040160405180910390fd5b8a8a858181106121f3576121f3613eae565b9050602002013581101561221a5760405163341a1f3360e11b815260040160405180910390fd5b6040518181526001600160a01b0384169033907fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed9060200160405180910390a3612265833383613028565b505050600101612122565b5050505050506115eb5f801b612ddf565b5f8061228d8786612f0e565b90505f6122a2670de0b6b3a764000085612ff0565b90506122ae8582612d5c565b90505f6122bf8a611fcf8c85612fcb565b90505f6122cc8285613050565b90505f6122e1670de0b6b3a764000083612ff0565b90506122ed8a82612d5c565b9c9b505050505050505050505050565b612312620f4240670de0b6b3a7640000613e3b565b61090290670de0b6b3a7640000613e9b565b6001612339670de0b6b3a76400006002613d1c565b6109029190613e9b565b60605f80516020613f088339815191525c156123725760405163d56a08b560e01b815260040160405180910390fd5b60075460ff1661239557604051632e41ba2d60e01b815260040160405180910390fd5b60088054806020026020016040519081016040528092919081815260200182805480156108cc57602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116123cb575050505050905090565b60605f80516020613f088339815191525c156123955760405163d56a08b560e01b815260040160405180910390fd5b336001600160a01b03165f356001600160e01b0319166001600160e01b0319165f36604051612451929190613e6d565b60405180910390a25f80516020613f088339815191525c156124865760405163d56a08b560e01b815260040160405180910390fd5b6124906001612ddf565b6005546001600160a01b031633146124bb57604051634f0f549960e11b815260040160405180910390fd5b60075460ff16156124df5760405163056f633d60e21b815260040160405180910390fd5b6001600160a01b0381165f9081526009602052604090205460ff1661251757604051634b16fc2d60e11b815260040160405180910390fd5b600a546001600160a01b0382165f9081526009602052604090206002015461253f9190612ff0565b600a556001600160a01b0381165f90815260096020526040812060019081015460085490929161256e91613e9b565b90506008818154811061258357612583613eae565b5f91825260209091200154600880546001600160a01b0390921691849081106125ae576125ae613eae565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508160095f600885815481106125f0576125f0613eae565b5f9182526020808320909101546001600160a01b03168352820192909252604001902060010155600880548061262857612628613ec2565b5f82815260208082205f19908401810180546001600160a01b0319169055909201909255604080516060810182528381528083018481528183018581526001600160a01b0389168087526009909552948390209151825460ff1916901515178255516001820155925160029093019290925590516370a0823160e01b81523060048201526127029185913391906370a0823190602401602060405180830381865afa1580156126d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126fd9190613d33565b613028565b5061126f90505f612ddf565b5f5f80516020613f088339815191525c1561273c5760405163d56a08b560e01b815260040160405180910390fd5b5060065490565b335f8181526001602090815260408083206001600160a01b0387168452909152812054909161277991859061163a908690613e5a565b50600192915050565b336001600160a01b03165f356001600160e01b0319166001600160e01b0319165f366040516127b2929190613e6d565b60405180910390a25f80516020613f088339815191525c156127e75760405163d56a08b560e01b815260040160405180910390fd5b6127f16001612ddf565b6005546001600160a01b0316331461281c57604051634f0f549960e11b815260040160405180910390fd5b60075460ff16156128405760405163056f633d60e21b815260040160405180910390fd5b6001600160a01b0383165f9081526009602052604090205460ff161561287957604051636b1ed1b760e11b815260040160405180910390fd5b600880541061289b5760405163c47f9e9360e01b815260040160405180910390fd5b670de0b6b3a76400008110156128c4576040516342eb024360e01b815260040160405180910390fd5b6128d7670de0b6b3a76400006032613d1c565b8111156128f757604051630cbe784360e11b815260040160405180910390fd5b61290e64e8d4a51000670de0b6b3a7640000613e3b565b82101561292e57604051638968448b60e01b815260040160405180910390fd5b61293a600a5482612fcb565b600a55612950670de0b6b3a76400006032613d1c565b600a541115612972576040516342f71f0b60e01b815260040160405180910390fd5b6040805160608101825260018082526008805460208085019182528486018781526001600160a01b038a165f81815260099093529682209551865460ff19169015151786559151858501559051600290940193909355805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169091179055612a10833384612fb6565b6115eb5f612ddf565b5f80516020613f088339815191525c15612a465760405163d56a08b560e01b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614612a8f5760405163bf84897760e01b815260040160405180910390fd5b61126f81612ddf565b5f5f80516020613f088339815191525c15612ac65760405163d56a08b560e01b815260040160405180910390fd5b6001600160a01b0382165f9081526009602052604090205460ff16612afe57604051634b16fc2d60e11b815260040160405180910390fd5b6001600160a01b0382165f90815260096020526040902060020154600a54610da3908290612f0e565b5f5f80516020613f088339815191525c15612b555760405163d56a08b560e01b815260040160405180910390fd5b6001600160a01b0382165f9081526009602052604090205460ff16612b8d57604051634b16fc2d60e11b815260040160405180910390fd5b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015612bcf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108e99190613d33565b5f80612bff8588612f0e565b90505f612c0c8786612ff0565b90505f612c198883612f0e565b90505f612c268285613050565b9050612c3a81670de0b6b3a7640000612ff0565b9050612c4e670de0b6b3a764000087612ff0565b9450612c63612c5d8c83612d5c565b86612f0e565b9b9a5050505050505050505050565b6115eb8383836001613105565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198114612cf95781811015612ceb57604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064015b60405180910390fd5b612cf984848484035f613105565b50505050565b6001600160a01b038316612d2857604051634b637e8f60e11b81525f6004820152602401612ce2565b6001600160a01b038216612d515760405163ec442f0560e01b81525f6004820152602401612ce2565b6115eb8383836131d7565b5f8282028315801590612d7e575082848281612d7a57612d7a613e27565b0414155b15612d9c5760405163202e377f60e01b815260040160405180910390fd5b6706f05b59d3b20000810181811015612dc85760405163202e377f60e01b815260040160405180910390fd5b5f670de0b6b3a7640000825b049695505050505050565b805f80516020613f088339815191525d50565b61126f30826132fd565b612e068282613331565b5050565b6008545f5b81811015612e7357612e6b7f00000000000000000000000000000000000000000000000000000000000000005f1960088481548110612e5057612e50613eae565b5f918252602090912001546001600160a01b0316919061333c565b600101612e0f565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166352b8cb636040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612ecc575f80fd5b505af1925050508015612edd575060015b61126f5760405130907f0d03834d0d86c7f57e877af40e26f176dc31bd637535d4ba153d1ac9de88a7ea905f90a250565b5f815f03612f2f5760405163abcf2e7560e01b815260040160405180910390fd5b670de0b6b3a764000083028315801590612f605750670de0b6b3a7640000848281612f5c57612f5c613e27565b0414155b15612f7e576040516394fb03d760e01b815260040160405180910390fd5b600183901c810181811015612fa6576040516394fb03d760e01b815260040160405180910390fd5b5f848281612dd457612dd4613e27565b6115eb6001600160a01b0384168330846133f9565b5f82820183811015610da35760405163e468448f60e01b815260040160405180910390fd5b5f805f612ffd8585613432565b91509150801561302057604051630a5c778b60e31b815260040160405180910390fd5b509392505050565b6115eb6001600160a01b0384168383613455565b612e068282613486565b61126f3082613491565b5f600183101561307357604051635567969f60e11b815260040160405180910390fd5b671bc16d674ec7ffff83111561309c57604051638554775f60e01b815260040160405180910390fd5b670de0b6b3a7640000808304025f6130b48483612ff0565b90505f6130cb86670de0b6b3a764000085046134c5565b9050815f036130de5792506108e9915050565b5f6130ee87846305f5e10061351d565b90506130fa8282612d5c565b979650505050505050565b6001600160a01b03841661312e5760405163e602df0560e01b81525f6004820152602401612ce2565b6001600160a01b03831661315757604051634a1406b160e11b81525f6004820152602401612ce2565b6001600160a01b038085165f9081526001602090815260408083209387168352929052208290558015612cf957826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516131c991815260200190565b60405180910390a350505050565b6001600160a01b038316613201578060025f8282546131f69190613e5a565b909155506132719050565b6001600160a01b0383165f90815260208190526040902054818110156132535760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401612ce2565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661328d576002805482900390556132ab565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516132f091815260200190565b60405180910390a3505050565b6001600160a01b0382166133265760405163ec442f0560e01b81525f6004820152602401612ce2565b612e065f83836131d7565b612e06308383612cff565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b17905261338d84826135f9565b612cf9576040516001600160a01b0384811660248301525f60448301526133ef91869182169063095ea7b3906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613696565b612cf98482613696565b6040516001600160a01b038481166024830152838116604483015260648201839052612cf99186918216906323b872dd906084016133bd565b5f808284106134465750508082035f61344e565b505081810360015b9250929050565b6040516001600160a01b038381166024830152604482018390526115eb91859182169063a9059cbb906064016133bd565b612e06823083612cff565b6001600160a01b0382166134ba57604051634b637e8f60e11b81525f6004820152602401612ce2565b612e06825f836131d7565b5f80600283065f036134df57670de0b6b3a76400006134e1565b835b90506002830492505b8215610da3576134fa8485612d5c565b935060028306156135125761350f8185612d5c565b90505b6002830492506134ea565b5f82818061353387670de0b6b3a7640000613432565b9092509050670de0b6b3a7640000805f60015b8884106135ea575f670de0b6b3a7640000820290505f806135788a61357385670de0b6b3a7640000612ff0565b613432565b9150915061358a87611856848c612d5c565b96506135968784612f0e565b9650865f036135a7575050506135ea565b87156135b1579315935b80156135bb579315935b84156135d2576135cb8688612ff0565b95506135df565b6135dc8688612fcb565b95505b505050600101613546565b50909998505050505050505050565b5f805f846001600160a01b0316846040516136149190613ed6565b5f604051808303815f865af19150503d805f811461364d576040519150601f19603f3d011682016040523d82523d5f602084013e613652565b606091505b509150915081801561367c57508051158061367c57508080602001905181019061367c9190613eec565b8015610a9b5750505050506001600160a01b03163b151590565b5f6136aa6001600160a01b038416836136f7565b905080515f141580156136ce5750808060200190518101906136cc9190613eec565b155b156115eb57604051635274afe760e01b81526001600160a01b0384166004820152602401612ce2565b6060610da383835f845f80856001600160a01b0316848660405161371b9190613ed6565b5f6040518083038185875af1925050503d805f8114613755576040519150601f19603f3d011682016040523d82523d5f602084013e61375a565b606091505b509150915061376a868383613774565b9695505050505050565b60608261378957613784826137d0565b610da3565b81511580156137a057506001600160a01b0384163b155b156137c957604051639996b31560e01b81526001600160a01b0385166004820152602401612ce2565b5080610da3565b8051156137e05780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b6001600160a01b038116811461126f575f80fd5b8035611f568161382e565b5f806040838503121561385e575f80fd5b82356138698161382e565b946020939093013593505050565b5f8060408385031215613888575f80fd5b82356138938161382e565b915060208301356138a38161382e565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051610180810167ffffffffffffffff811182821017156138e6576138e66138ae565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715613915576139156138ae565b604052919050565b5f806040838503121561392e575f80fd5b8235915060208084013567ffffffffffffffff8082111561394d575f80fd5b818601915086601f830112613960575f80fd5b813581811115613972576139726138ae565b613984601f8201601f191685016138ec565b91508082528784828501011115613999575f80fd5b80848401858401375f848284010152508093505050509250929050565b5f805f606084860312156139c8575f80fd5b83356139d38161382e565b925060208401356139e38161382e565b929592945050506040919091013590565b63ffffffff8116811461126f575f80fd5b8035611f56816139f4565b801515811461126f575f80fd5b8035611f5681613a10565b5f6101808284031215613a39575f80fd5b613a416138c2565b613a4a83613842565b8152613a5860208401613842565b6020820152613a6960408401613842565b60408201526060830135606082015260808301356080820152613a8e60a08401613a05565b60a082015260c083013560c082015260e083013560e0820152610100808401358183015250610120613ac1818501613a1d565b908201526101408381013590820152610160928301359281019290925250919050565b5f60208284031215613af4575f80fd5b8135610da38161382e565b5f60208284031215613b0f575f80fd5b5035919050565b5f805f60408486031215613b28575f80fd5b83359250602084013567ffffffffffffffff80821115613b46575f80fd5b818601915086601f830112613b59575f80fd5b813581811115613b67575f80fd5b8760208260051b8501011115613b7b575f80fd5b6020830194508093505050509250925092565b5f805f805f60a08688031215613ba2575f80fd5b8535613bad8161382e565b9450602086013593506040860135613bc48161382e565b94979396509394606081013594506080013592915050565b5f805f805f60a08688031215613bf0575f80fd5b505083359560208501359550604085013594606081013594506080013592509050565b5f805f805f8060c08789031215613c28575f80fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b602080825282518282018190525f9190848201906040850190845b81811015613c925783516001600160a01b031683529284019291840191600101613c6d565b50909695505050505050565b5f805f60608486031215613cb0575f80fd5b8335613cbb8161382e565b95602085013595506040909401359392505050565b600181811c90821680613ce457607f821691505b602082108103613d0257634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176108e9576108e9613d08565b5f60208284031215613d43575f80fd5b5051919050565b8051611f568161382e565b8051611f56816139f4565b8051611f5681613a10565b5f6101808284031215613d7c575f80fd5b613d846138c2565b613d8d83613d4a565b8152613d9b60208401613d4a565b6020820152613dac60408401613d4a565b60408201526060830151606082015260808301516080820152613dd160a08401613d55565b60a082015260c083015160c082015260e083015160e0820152610100808401518183015250610120613e04818501613d60565b908201526101408381015190820152610160928301519281019290925250919050565b634e487b7160e01b5f52601260045260245ffd5b5f82613e5557634e487b7160e01b5f52601260045260245ffd5b500490565b808201808211156108e9576108e9613d08565b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b818103818111156108e9576108e9613d08565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f82518060208501845e5f920191825250919050565b5f60208284031215613efc575f80fd5b8151610da381613a1056fe3f8f4c536ce1b925b469af1b09a44da237dab5bbc584585648c12be1ca25a8c4a26469706673582212201c2ab66e24826998fe1115ecda27a1ca1f02b6dd605dfec58cf6ededc7327f0764736f6c634300081900330000000000000000000000009008d19f58aabd9ed0d60971565aa8510560ab41362e5182440b52aa8fffe70a251550fbbcbca424740fe5a14f59bf0c1b06fe1d000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000001742436f5720414d4d203530434f572d3530777374455448000000000000000000000000000000000000000000000000000000000000000000000000000000001342436f572d3530434f572d353077737445544800000000000000000000000000