UNPKG

@muffinfi/muffin-contracts

Version:

Smart contracts of Muffin Protocol

1,333 lines 129 kB
{ "_format": "hh-sol-artifact-1", "contractName": "MuffinHub", "sourceName": "contracts/MuffinHub.sol", "abi": [ { "inputs": [ { "internalType": "address", "name": "_positionController", "type": "address" } ], "stateMutability": "nonpayable", "type": "constructor" }, { "inputs": [], "name": "FailedBalanceOf", "type": "error" }, { "inputs": [], "name": "FailedTransfer", "type": "error" }, { "inputs": [], "name": "InvalidAmount", "type": "error" }, { "inputs": [], "name": "InvalidSwapPath", "type": "error" }, { "inputs": [], "name": "InvalidTierChoices", "type": "error" }, { "inputs": [], "name": "InvalidTokenOrder", "type": "error" }, { "inputs": [], "name": "NotAllowedSqrtGamma", "type": "error" }, { "inputs": [], "name": "NotEnoughFundToWithdraw", "type": "error" }, { "inputs": [], "name": "NotEnoughIntermediateOutput", "type": "error" }, { "inputs": [], "name": "NotEnoughTokenInput", "type": "error" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "uint256", "name": "positionRefId", "type": "uint256" }, { "indexed": false, "internalType": "uint8", "name": "tierId", "type": "uint8" }, { "indexed": false, "internalType": "int24", "name": "tickLower", "type": "int24" }, { "indexed": false, "internalType": "int24", "name": "tickUpper", "type": "int24" }, { "indexed": false, "internalType": "uint256", "name": "ownerAccRefId", "type": "uint256" }, { "indexed": false, "internalType": "uint96", "name": "liquidityD8", "type": "uint96" }, { "indexed": false, "internalType": "uint256", "name": "amount0", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amount1", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "feeAmount0", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "feeAmount1", "type": "uint256" } ], "name": "Burn", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "recipient", "type": "address" }, { "indexed": true, "internalType": "address", "name": "token", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "CollectProtocol", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "uint256", "name": "positionRefId", "type": "uint256" }, { "indexed": false, "internalType": "uint8", "name": "tierId", "type": "uint8" }, { "indexed": false, "internalType": "int24", "name": "tickLower", "type": "int24" }, { "indexed": false, "internalType": "int24", "name": "tickUpper", "type": "int24" }, { "indexed": false, "internalType": "uint256", "name": "ownerAccRefId", "type": "uint256" }, { "indexed": false, "internalType": "uint96", "name": "liquidityD8", "type": "uint96" }, { "indexed": false, "internalType": "uint256", "name": "amount0", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amount1", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "feeAmount0", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "feeAmount1", "type": "uint256" } ], "name": "CollectSettled", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "recipient", "type": "address" }, { "indexed": true, "internalType": "uint256", "name": "recipientAccRefId", "type": "uint256" }, { "indexed": true, "internalType": "address", "name": "token", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" }, { "indexed": false, "internalType": "address", "name": "sender", "type": "address" } ], "name": "Deposit", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "governance", "type": "address" } ], "name": "GovernanceUpdated", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "uint256", "name": "positionRefId", "type": "uint256" }, { "indexed": false, "internalType": "uint8", "name": "tierId", "type": "uint8" }, { "indexed": false, "internalType": "int24", "name": "tickLower", "type": "int24" }, { "indexed": false, "internalType": "int24", "name": "tickUpper", "type": "int24" }, { "indexed": false, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "senderAccRefId", "type": "uint256" }, { "indexed": false, "internalType": "uint96", "name": "liquidityD8", "type": "uint96" }, { "indexed": false, "internalType": "uint256", "name": "amount0", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amount1", "type": "uint256" } ], "name": "Mint", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "token0", "type": "address" }, { "indexed": true, "internalType": "address", "name": "token1", "type": "address" }, { "indexed": true, "internalType": "bytes32", "name": "poolId", "type": "bytes32" } ], "name": "PoolCreated", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "uint256", "name": "positionRefId", "type": "uint256" }, { "indexed": false, "internalType": "uint8", "name": "tierId", "type": "uint8" }, { "indexed": false, "internalType": "int24", "name": "tickLower", "type": "int24" }, { "indexed": false, "internalType": "int24", "name": "tickUpper", "type": "int24" }, { "indexed": false, "internalType": "uint8", "name": "limitOrderType", "type": "uint8" } ], "name": "SetLimitOrderType", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, { "indexed": true, "internalType": "uint8", "name": "tierId", "type": "uint8" }, { "indexed": true, "internalType": "int24", "name": "tickEnd", "type": "int24" }, { "indexed": false, "internalType": "int24", "name": "tickStart", "type": "int24" }, { "indexed": false, "internalType": "uint96", "name": "liquidityD8", "type": "uint96" } ], "name": "Settle", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": true, "internalType": "address", "name": "recipient", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "senderAccRefId", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "recipientAccRefId", "type": "uint256" }, { "indexed": false, "internalType": "int256", "name": "amount0", "type": "int256" }, { "indexed": false, "internalType": "int256", "name": "amount1", "type": "int256" }, { "indexed": false, "internalType": "uint256", "name": "amountInDistribution", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amountOutDistribution", "type": "uint256" }, { "indexed": false, "internalType": "uint256[]", "name": "tierData", "type": "uint256[]" } ], "name": "Swap", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint8", "name": "tickSpacing", "type": "uint8" }, { "indexed": false, "internalType": "uint8", "name": "protocolFee", "type": "uint8" } ], "name": "UpdateDefaultParameters", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, { "indexed": false, "internalType": "uint8", "name": "tickSpacing", "type": "uint8" }, { "indexed": false, "internalType": "uint8", "name": "protocolFee", "type": "uint8" } ], "name": "UpdatePool", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, { "indexed": true, "internalType": "uint8", "name": "tierId", "type": "uint8" }, { "indexed": true, "internalType": "uint24", "name": "sqrtGamma", "type": "uint24" }, { "indexed": false, "internalType": "uint128", "name": "sqrtPrice", "type": "uint128" }, { "indexed": false, "internalType": "uint8", "name": "limitOrderTickSpacingMultiplier", "type": "uint8" } ], "name": "UpdateTier", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": true, "internalType": "uint256", "name": "senderAccRefId", "type": "uint256" }, { "indexed": true, "internalType": "address", "name": "token", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" }, { "indexed": false, "internalType": "address", "name": "recipient", "type": "address" } ], "name": "Withdraw", "type": "event" }, { "stateMutability": "nonpayable", "type": "fallback" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" }, { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "name": "accounts", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "token0", "type": "address" }, { "internalType": "address", "name": "token1", "type": "address" }, { "internalType": "uint24", "name": "sqrtGamma", "type": "uint24" }, { "internalType": "uint256", "name": "senderAccRefId", "type": "uint256" } ], "name": "addTier", "outputs": [ { "internalType": "uint8", "name": "tierId", "type": "uint8" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "token0", "type": "address" }, { "internalType": "address", "name": "token1", "type": "address" }, { "internalType": "uint24", "name": "sqrtGamma", "type": "uint24" }, { "internalType": "uint128", "name": "sqrtPrice", "type": "uint128" }, { "internalType": "uint256", "name": "senderAccRefId", "type": "uint256" } ], "name": "createPool", "outputs": [ { "internalType": "bytes32", "name": "poolId", "type": "bytes32" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256", "name": "recipientAccRefId", "type": "uint256" }, { "internalType": "address", "name": "token", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "deposit", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "getDefaultParameters", "outputs": [ { "internalType": "uint8", "name": "tickSpacing", "type": "uint8" }, { "internalType": "uint8", "name": "protocolFee", "type": "uint8" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "poolId", "type": "bytes32" } ], "name": "getPoolParameters", "outputs": [ { "internalType": "uint8", "name": "tickSpacing", "type": "uint8" }, { "internalType": "uint8", "name": "protocolFee", "type": "uint8" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "uint256", "name": "positionRefId", "type": "uint256" }, { "internalType": "uint8", "name": "tierId", "type": "uint8" }, { "internalType": "int24", "name": "tickLower", "type": "int24" }, { "internalType": "int24", "name": "tickUpper", "type": "int24" } ], "name": "getPosition", "outputs": [ { "components": [ { "internalType": "uint96", "name": "liquidityD8", "type": "uint96" }, { "internalType": "uint80", "name": "feeGrowthInside0Last", "type": "uint80" }, { "internalType": "uint80", "name": "feeGrowthInside1Last", "type": "uint80" }, { "internalType": "uint8", "name": "limitOrderType", "type": "uint8" }, { "internalType": "uint32", "name": "settlementSnapshotId", "type": "uint32" } ], "internalType": "struct Positions.Position", "name": "", "type": "tuple" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "slot", "type": "bytes32" } ], "name": "getStorageAt", "outputs": [ { "internalType": "bytes32", "name": "word", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, { "internalType": "uint8", "name": "tierId", "type": "uint8" }, { "internalType": "int24", "name": "tick", "type": "int24" } ], "name": "getTick", "outputs": [ { "components": [ { "internalType": "uint96", "name": "liquidityLowerD8", "type": "uint96" }, { "internalType": "uint96", "name": "liquidityUpperD8", "type": "uint96" }, { "internalType": "int24", "name": "nextBelow", "type": "int24" }, { "internalType": "int24", "name": "nextAbove", "type": "int24" }, { "internalType": "bool", "name": "needSettle0", "type": "bool" }, { "internalType": "bool", "name": "needSettle1", "type": "bool" }, { "internalType": "uint80", "name": "feeGrowthOutside0", "type": "uint80" }, { "internalType": "uint80", "name": "feeGrowthOutside1", "type": "uint80" } ], "internalType": "struct Ticks.Tick", "name": "", "type": "tuple" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, { "internalType": "uint8", "name": "tierId", "type": "uint8" } ], "name": "getTier", "outputs": [ { "components": [ { "internalType": "uint128", "name": "liquidity", "type": "uint128" }, { "internalType": "uint128", "name": "sqrtPrice", "type": "uint128" }, { "internalType": "uint24", "name": "sqrtGamma", "type": "uint24" }, { "internalType": "int24", "name": "tick", "type": "int24" }, { "internalType": "int24", "name": "nextTickBelow", "type": "int24" }, { "internalType": "int24", "name": "nextTickAbove", "type": "int24" }, { "internalType": "uint80", "name": "feeGrowthGlobal0", "type": "uint80" }, { "internalType": "uint80", "name": "feeGrowthGlobal1", "type": "uint80" } ], "internalType": "struct Tiers.Tier", "name": "", "type": "tuple" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "poolId", "type": "bytes32" } ], "name": "getTiersCount", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "governance", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, { "internalType": "uint24", "name": "sqrtGamma", "type": "uint24" } ], "name": "isSqrtGammaAllowed", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "maxNumOfTiers", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "pure", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "tokenIn", "type": "address" }, { "internalType": "address", "name": "tokenOut", "type": "address" }, { "internalType": "uint256", "name": "tierChoices", "type": "uint256" }, { "internalType": "int256", "name": "amountDesired", "type": "int256" }, { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256", "name": "recipientAccRefId", "type": "uint256" }, { "internalType": "uint256", "name": "senderAccRefId", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "swap", "outputs": [ { "internalType": "uint256", "name": "amountIn", "type": "uint256" }, { "internalType": "uint256", "name": "amountOut", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "components": [ { "internalType": "bytes", "name": "path", "type": "bytes" }, { "internalType": "int256", "name": "amountDesired", "type": "int256" }, { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256", "name": "recipientAccRefId", "type": "uint256" }, { "internalType": "uint256", "name": "senderAccRefId", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "internalType": "struct IMuffinHubActions.SwapMultiHopParams", "name": "p", "type": "tuple" } ], "name": "swapMultiHop", "outputs": [ { "internalType": "uint256", "name": "amountIn", "type": "uint256" }, { "internalType": "uint256", "name": "amountOut", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "tokens", "outputs": [ { "internalType": "uint8", "name": "locked", "type": "uint8" }, { "internalType": "uint248", "name": "protocolFeeAmt", "type": "uint248" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "name": "underlyings", "outputs": [ { "internalType": "address", "name": "token0", "type": "address" }, { "internalType": "address", "name": "token1", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256", "name": "senderAccRefId", "type": "uint256" }, { "internalType": "address", "name": "token", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "withdraw", "outputs": [], "stateMutability": "nonpayable", "type": "function" } ], "bytecode": "0x6000805461ffff60a01b1916601960a21b1790556101406040526201863c60a0908152620185d860c0526201857460e0526201851061010052620184ab6101205262000050906001906005620000a5565b503480156200005e57600080fd5b50604051620061203803806200612083398101604081905262000081916200016f565b6001600160a01b0316608052600080546001600160a01b03191633179055620001a1565b82805482825590600052602060002090600901600a90048101928215620001465791602002820160005b838211156200011357835183826101000a81548162ffffff021916908362ffffff1602179055509260200192600301602081600201049283019260010302620000cf565b8015620001445782816101000a81549062ffffff021916905560030160208160020104928301926001030262000113565b505b506200015492915062000158565b5090565b5b8082111562000154576000815560010162000159565b6000602082840312156200018257600080fd5b81516001600160a01b03811681146200019a57600080fd5b9392505050565b608051615f63620001bd60003960006101530152615f636000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c806384ec1e15116100cd578063c625e3c311610081578063dc65746511610066578063dc657465146105d7578063e3642509146105f7578063e48603391461061757610151565b8063c625e3c3146103f1578063c6883ec5146105c457610151565b8063aa5976c1116100b2578063aa5976c114610387578063aaa9acd2146103b9578063c349e769146103cc57610151565b806384ec1e15146102f65780639aca112e1461036457610151565b80634b2084e3116101245780637266a0e4116101095780637266a0e414610295578063775dfc82146102c05780637951532d146102d357610151565b80634b2084e31461023b5780635aa6e6751461025057610151565b806313fd4c80146101965780631ca0027a146101ac5780632ec31fbc146101be578063476cfd25146101e6575b7f00000000000000000000000000000000000000000000000000000000000000003660008037600080366000845af43d6000803e808015610191573d6000f35b3d6000fd5b60065b6040519081526020015b60405180910390f35b6101996101ba36600461550b565b5490565b6101d16101cc36600461558f565b61069b565b604080519283526020830191909152016101a3565b60005460ff74010000000000000000000000000000000000000000820481169175010000000000000000000000000000000000000000009004165b6040805160ff9384168152929091166020830152016101a3565b61024e61024936600461562e565b610736565b005b6000546102709073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a3565b6101996102a3366004615672565b600560209081526000928352604080842090915290825290205481565b6101996102ce3660046156af565b61084e565b6101996102e136600461550b565b60009081526004602052604090206001015490565b61033761030436600461550b565b6007602052600090815260409020805460019091015473ffffffffffffffffffffffffffffffffffffffff918216911682565b6040805173ffffffffffffffffffffffffffffffffffffffff9384168152929091166020830152016101a3565b610377610372366004615722565b610b98565b60405190151581526020016101a3565b61022161039536600461550b565b60009081526004602052604090205460ff6101008204811692620100009092041690565b61024e6103c736600461574e565b610ca3565b6103df6103da3660046157c6565b610ded565b60405160ff90911681526020016101a3565b6105596103ff366004615824565b6040805160a081018252600080825260208083018290528284018290526060808401839052608084018390528a8352600482528483208551918b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000168284015260f889901b7fff0000000000000000000000000000000000000000000000000000000000000016603483015260e888811b603584015287901b6038830152603b8083018b905286518084039091018152605b909201865281519183019190912083526005019052919091206040805160a08101825282546bffffffffffffffffffffffff811682526c01000000000000000000000000810469ffffffffffffffffffff9081166020840152760100000000000000000000000000000000000000000000909104169181019190915260019091015460ff81166060830152610100900463ffffffff166080820152979650505050505050565b6040516101a39190600060a0820190506bffffffffffffffffffffffff8351168252602083015169ffffffffffffffffffff8082166020850152806040860151166040850152505060ff606084015116606083015263ffffffff608084015116608083015292915050565b6101d16105d236600461588a565b610fcf565b6105ea6105e53660046158c5565b61135a565b6040516101a391906158e8565b61060a61060536600461599d565b6114a8565b6040516101a391906159d9565b610662610625366004615a3b565b60066020526000908152604090205460ff81169061010090047effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1682565b6040805160ff90931683527effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9091166020830152016101a3565b60008060006106dd8c8c8c8c60405180606001604052808c81526020018e73ffffffffffffffffffffffffffffffffffffffff1681526020018d81525061162a565b90955093509091506106f890508c8c85858c8c8c8c8c6117bf565b6107278180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b50995099975050505050505050565b6000610742338561199b565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600560209081526040808320848452909152902054909150828110156107b0576040517f99f874cd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84166000908152600560209081526040808320858452909152902083820390556107f08487856119ee565b6040805184815273ffffffffffffffffffffffffffffffffffffffff8881166020830152861691879133917fc5de321f20136e2f86609c5eab638083a3300f55766433c1243a6ea1610f7792910160405180910390a4505050505050565b60008473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1610158061089f575073ffffffffffffffffffffffffffffffffffffffff8616155b156108d6576040517f3f06bf8100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006108e460048888611a8b565b925090506108f28286610b98565b610928576040517f423d4ff700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526002602052604090205460ff168061095f575060005474010000000000000000000000000000000000000000900460ff165b6000805481906109929085908a908a9087907501000000000000000000000000000000000000000000900460ff16611b0d565b73ffffffffffffffffffffffffffffffffffffffff8c1660009081526005602052604081209294509092508391906109ca338a61199b565b815260200190815260200160002060008282546109e79190615a85565b909155505073ffffffffffffffffffffffffffffffffffffffff891660009081526005602052604081208291610a1d338a61199b565b81526020019081526020016000206000828254610a3a9190615a85565b9091555050604051859073ffffffffffffffffffffffffffffffffffffffff808c1691908d16907fec5dc6309c83a50f60f4a1fae9422b2c406da78c579b9b12b92d033db37c719490600090a4604080516fffffffffffffffffffffffffffffffff891681526001602082015262ffffff8a169160009188917f8ba9b3074e943a040d7cc32a0a69db4cada877568ff71021a69579a1f004e440910160405180910390a4610b0d8480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b505060408051808201825273ffffffffffffffffffffffffffffffffffffffff998a1681529789166020808a01918252600086815260079091529190912097518854908a167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161789559051600190980180549890991697169690961790965595945050505050565b6000828152600360205260408120548190610bb4576001610bc3565b60008481526003602052604090205b905060005b8154811015610c96578362ffffff16828281548110610be957610be9615a9c565b90600052602060002090600a91828204019190066003029054906101000a900462ffffff1662ffffff161415610c8e576000858152600460205260408120600101905b8154811015610c81578562ffffff16828281548110610c4d57610c4d615a9c565b600091825260209091206001600290920201015462ffffff161415610c79576000945050505050610c9d565b600101610c2c565b5060019350505050610c9d565b600101610bc8565b5060009150505b92915050565b6000610cae85611c2d565b6040517f641229d9000000000000000000000000000000000000000000000000000000008152909150339063641229d990610cf3908890889088908890600401615b14565b600060405180830381600087803b158015610d0d57600080fd5b505af1158015610d21573d6000803e3d6000fd5b50505050610d3a858583610d359190615b54565b611ccf565b73ffffffffffffffffffffffffffffffffffffffff851660009081526005602052604081208591610d6b8a8a61199b565b81526020019081526020016000206000828254610d889190615b54565b90915550506040805185815233602082015273ffffffffffffffffffffffffffffffffffffffff808816928992918b16917f0b6c6cb502d2da9ef6887b17afbeb0034852ce0a2394ac48028d6b0f7810b63c910160405180910390a450505050505050565b60008080610dfd60048888611a8b565b91509150610e0b8186610b98565b610e41576040517f423d4ff700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610e4e8488611d61565b73ffffffffffffffffffffffffffffffffffffffff8c1660009081526005602052604081209198509294509092508391610e88338a61199b565b81526020019081526020016000206000828254610ea59190615a85565b909155505073ffffffffffffffffffffffffffffffffffffffff881660009081526005602052604081208291610edb338a61199b565b81526020019081526020016000206000828254610ef89190615a85565b925050819055508662ffffff168560ff16847f8ba9b3074e943a040d7cc32a0a69db4cada877568ff71021a69579a1f004e440876001018960ff1681548110610f4357610f43615a9c565b6000918252602080832060029290920290910154604080517001000000000000000000000000000000009092046fffffffffffffffffffffffffffffffff168252918101929092520160405180910390a4610fc38480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b50505050949350505050565b60008080610fdd8480615b6c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293506110209250839150611de69050565b15611057576040517f3378279300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000602085013581129061106d83516016900490565b67ffffffffffffffff81111561108557611085615bd1565b6040519080825280602002602001820160405280156110ae578160200160208202803683370190505b509050602086013560008361110d576040518060600160405280896080013581526020018960400160208101906110e59190615a3b565b73ffffffffffffffffffffffffffffffffffffffff168152602001896060013581525061112d565b6040805160608101825260808a0135808252336020830152918101919091525b905060005b83518110156112805784156111885760018451038114156111835761115d60608a0160408b01615a3b565b73ffffffffffffffffffffffffffffffffffffffff166020830152606089013560408301525b6111a2565b80600114156111a257336020830152608089013560408301525b600080806111b189858a611e30565b9250925092506000806111df8585858d806111ca575089155b6111d75760648c036111d9565b8b5b8b61162a565b909192508b89815181106111f5576111f5615a9c565b602090810291909101019290925292509050891561121e578561121657819c505b80975061126f565b8561122b57809b50611268565b87600003811015611268576040517f4b5f1a1e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160000397505b505060019093019250611132915050565b50831561128f57819550611296565b8160000396505b5060009050806112a68585611e71565b90925090506112e1828289896112c260608e0160408f01615a3b565b8d606001358e608001358f8060a001906112dc9190615b6c565b6117bf565b60005b835181101561134f576113476004600086848151811061130657611306615a9c565b6020026020010151815260200190815260200160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6001016112e4565b505050505050915091565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101919091526000838152600460205260409020600101805460ff84169081106113c1576113c1615a9c565b60009182526020918290206040805161010081018252600293840290920180546fffffffffffffffffffffffffffffffff8082168552700100000000000000000000000000000000909104169483019490945260019093015462ffffff81169382019390935263010000008304820b606082015266010000000000008304820b60808201526901000000000000000000830490910b60a082015269ffffffffffffffffffff6c010000000000000000000000008304811660c083015276010000000000000000000000000000000000000000000090920490911660e0820152905092915050565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915250600083815260046020908152604080832060ff808716855260039091018352818420600286810b86529084529382902082516101008101845281546bffffffffffffffffffffffff80821683526c010000000000000000000000008204169582019590955278010000000000000000000000000000000000000000000000008504860b938101939093527b01000000000000000000000000000000000000000000000000000000840490940b60608301527e0100000000000000000000000000000000000000000000000000000000000083048116151560808301527f0100000000000000000000000000000000000000000000000000000000000000909204909116151560a082015260019091015469ffffffffffffffffffff80821660c08401526a01000000000000000000009091041660e08201525b9392505050565b600080808073ffffffffffffffffffffffffffffffffffffffff808916908a16108187138114816116665761166160048b8d611a8b565b611672565b61167260048c8c611a8b565b9096509450600061168687838b8d8a611e89565b9050876020015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16877f6d264ed3495dadcbb82f8e1bf8c4a8498812b3f0543f86b6513630e455dcfe178b600001518c6040015186600001518760200151886040015189606001518a608001516040516117129796959493929190615c00565b60405180910390a460a08101511561178b5760a081015173ffffffffffffffffffffffffffffffffffffffff8d16600090815260066020526040902080547effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010080830482169094011690920260ff9092169190911790555b8261179f57602081015181516000036117aa565b805160208201516000035b979d969c509a50959850939650505050505050565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161415611803576117fd8787612494565b90975095505b83611818576118138886886119ee565b61186c565b73ffffffffffffffffffffffffffffffffffffffff881660009081526005602052604081208791611849888861199b565b815260200190815260200160002060008282546118669190615b54565b90915550505b82156118f257600061187e338561199b565b73ffffffffffffffffffffffffffffffffffffffff8b1660009081526005602090815260408083208484529091529020549091506118bc9089612494565b73ffffffffffffffffffffffffffffffffffffffff8c166000908152600560209081526040808320958352949052929092205596505b86156119905760006119038a611c2d565b6040517ff1371dd5000000000000000000000000000000000000000000000000000000008152909150339063f1371dd59061194c908d908d908d908d908a908a90600401615c72565b600060405180830381600087803b15801561196657600080fd5b505af115801561197a573d6000803e3d6000fd5b5050505061198e8a8983610d359190615b54565b505b505050505050505050565b6000816119a757600080fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8516602082015290810183905260600160405160208183030381529060405280519060200120905092915050565b60006040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201528260248201526000806044836000895af1915050611a4f816124b0565b611a85576040517fbfa871c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000808383604051602001611ac392919073ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181528151602092830120600081815297909252909520959350505050565b84546000908190610100900460ff1615611b2657600080fd5b6fffffffffffffffffffffffffffffffff85166201000311801590611b6d57506ffffdd8371ce3ef742f98c78a4732240d6fffffffffffffffffffffffffffffffff861611155b611b7657600080fd5b60008460ff1611611b8657600080fd5b865460ff84811662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff91871661010002919091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff90921691909117178755611bf48787876124f5565b60069890980180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790559795505050505050565b600073ffffffffffffffffffffffffffffffffffffffff8216738dd5fbce2f6a956c3022ba3663759011dd51e73e1415611c6657600080fd5b73ffffffffffffffffffffffffffffffffffffffff82166000908152600660205260409020805460ff1660011415611c9d57600080fd5b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001178155611623836128ed565b80611cd9836128ed565b1015611d11576040517fde2cd50d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5073ffffffffffffffffffffffffffffffffffffffff16600090815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166002179055565b6000806000611d6f85612a26565b50600184015460ff8116611d8257600080fd5b611dd9858587600101600081548110611d9d57611d9d615a9c565b600091825260209091206002909102015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff166124f5565b9096909550909350915050565b80516000906116141080611dfc57506014825111155b80610c9d5750505160167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec90910106151590565b6000808060168502611e458782016014015190565b878201602a810151601690910151919550935061ffff16915084611e67579192915b5093509350939050565b6014820151825183015182611e8257905b9250929050565b611ec26040518060c001604052806000815260200160008152602001600081526020016000815260200160608152602001600081525090565b611ecb86612a26565b6060611ed5615489565b60018881015490811b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0195861695871580611f3057507f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff88145b15611f67576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b86611f9e576040517fd2a0a82900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808714156120c55789600101805480602002602001604051908101604052809291908181526020016000905b828210156120ba5760008481526020908190206040805161010081018252600280870290930180546fffffffffffffffffffffffffffffffff8082168452700100000000000000000000000000000000909104168286015260019081015462ffffff81169383019390935263010000008304840b606083015266010000000000008304840b60808301526901000000000000000000830490930b60a082015269ffffffffffffffffffff6c010000000000000000000000008304811660c083015276010000000000000000000000000000000000000000000090920490911660e082015283529092019101611fca565b5050505093506122a3565b8167ffffffffffffffff8111156120de576120de615bd1565b60405190808252806020026020018201604052801561216b57816020015b604080516101008101825260008082526020808301829052928201819052606082018190526080820181905260a0820181905260c0820181905260e082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816120fc5790505b50935060005b84518110156122a1576001811b881615612299578a600101818154811061219a5761219a615a9c565b60009182526020918290206040805161010081018252600293840290920180546fffffffffffffffffffffffffffffffff8082168552700100000000000000000000000000000000909104169483019490945260019093015462ffffff81169382019390935263010000008304820b606082015266010000000000008304820b60808201526901000000000000000000830490910b60a082015269ffffffffffffffffffff6c010000000000000000000000008304811660c083015276010000000000000000000000000000000000000000000090920490911660e0820152855186908390811061228d5761228d615a9c565b60200260200101819052505b600101612171565b505b5050604080516101008101825260008089138a1515811483526020808401919091528b5462010000900460ff168385015260608301829052608083018990528351808501909452627fffff8452830181905260a082019290925260c08101612309612a5c565b81526020018690529050866000805b836020015161233657612331868c8c8760800151612a67565b612346565b612346868c8c8760800151612d17565b60c085015260005b86518110156123be576000806123978f8f898b876006811061237257612372615a9c565b60200201518d888151811061238957612389615a9c565b602002602001015188613080565b90925090506123a68286615cf3565b94506123b28185615cf3565b9350505060010161234e565b506123c98284615d67565b995083602001516123fd577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c8a1215612403565b60648a13155b8061241057506080840151155b1561241a5761241f565b612318565b83606001518760a001818152505061245f8c868887602001516124425784612444565b855b88602001516124565786600003613602565b85600003613602565b60808a0152606089015260408801528a61247a57808261247d565b81815b6020890152875250949a9950505050505050505050565b6000808284106124a8578284039150611e82565b509291900390565b6000816124c1573d6000803e3d6000fd5b3d602081146124d95780156124ea57600091506124ef565b3d6000803e600051151591506124ef565b600191505b50919050565b600183015460009081906006811061250c57600080fd5b620186a062ffffff8616111561252157600080fd5b604080516101008101825261640081526fffffffffffffffffffffffffffffffff8616602082015262ffffff87169181019190915260009060608101612566876139c3565b60020b81527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff427556020820152620bd8ab6040820152600060