[ { "inputs": [ { "internalType": "address", "name": "_asset", "type": "address" }, { "internalType": "address", "name": "_slippageCurve", "type": "address" }, { "internalType": "address", "name": "_router", "type": "address" }, { "internalType": "address", "name": "_backstop", "type": "address" }, { "internalType": "address", "name": "_protocolTreasury", "type": "address" }, { "internalType": "string", "name": "_name", "type": "string" }, { "internalType": "string", "name": "_symbol", "type": "string" } ], "stateMutability": "nonpayable", "type": "constructor" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "Approval", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "recipient", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amountSwapTokens", "type": "uint256" } ], "name": "BackstopDrain", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "poolSharesBurned", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amountPrincipleWithdrawn", "type": "uint256" } ], "name": "Burn", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "lpFees", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "backstopFees", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "protocolFees", "type": "uint256" } ], "name": "ChargedSwapFees", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "poolSharesMinted", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amountPrincipleDeposited", "type": "uint256" } ], "name": "Mint", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "OwnershipTransferred", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "account", "type": "address" } ], "name": "Paused", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "Transfer", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "account", "type": "address" } ], "name": "Unpaused", "type": "event" }, { "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": "amount", "type": "uint256" } ], "name": "approve", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "asset", "outputs": [ { "internalType": "address", "name": "_token", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "assetDecimals", "outputs": [ { "internalType": "uint8", "name": "_decimals", "type": "uint8" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "backstop", "outputs": [ { "internalType": "contract IBackstopPool", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_owner", "type": "address" }, { "internalType": "uint256", "name": "_sharesToBurn", "type": "uint256" } ], "name": "backstopBurn", "outputs": [ { "internalType": "uint256", "name": "_amount", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_amount", "type": "uint256" }, { "internalType": "address", "name": "_recipient", "type": "address" } ], "name": "backstopDrain", "outputs": [ { "internalType": "uint256", "name": "_swapAmount", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "balanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "coverage", "outputs": [ { "internalType": "uint256", "name": "_reserves", "type": "uint256" }, { "internalType": "uint256", "name": "_liabilities", "type": "uint256" } ], "stateMutability": "view", "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": "subtractedValue", "type": "uint256" } ], "name": "decreaseAllowance", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_depositAmount", "type": "uint256" } ], "name": "deposit", "outputs": [ { "internalType": "uint256", "name": "_sharesToMint", "type": "uint256" }, { "internalType": "int256", "name": "_fee", "type": "int256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "getExcessLiquidity", "outputs": [ { "internalType": "int256", "name": "_excessLiquidity", "type": "int256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "addedValue", "type": "uint256" } ], "name": "increaseAllowance", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "insuranceWithdrawalTimelock", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_liquidityProvider", "type": "address" } ], "name": "insuranceWithdrawalUnlock", "outputs": [ { "internalType": "uint256", "name": "_unlockedOnBlockNo", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "maxCoverageRatioForSwapIn", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "name", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "owner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "pause", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "paused", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "poolCap", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "protocolTreasury", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_depositAmount", "type": "uint256" } ], "name": "quoteDeposit", "outputs": [ { "internalType": "uint256", "name": "_sharesToMint", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_amount", "type": "uint256" } ], "name": "quoteSwapInto", "outputs": [ { "internalType": "uint256", "name": "_effectiveAmount", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_amount", "type": "uint256" } ], "name": "quoteSwapOut", "outputs": [ { "internalType": "uint256", "name": "_effectiveAmount", "type": "uint256" }, { "internalType": "uint256", "name": "_protocolFeeWithSlippage", "type": "uint256" }, { "internalType": "uint256", "name": "_effectiveLpFee", "type": "uint256" }, { "internalType": "uint256", "name": "_backstopFee", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_sharesToBurn", "type": "uint256" } ], "name": "quoteWithdraw", "outputs": [ { "internalType": "uint256", "name": "_payoutAmount", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "reserve", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "reserveWithSlippage", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "router", "outputs": [ { "internalType": "contract IRouter", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_durationInBlocks", "type": "uint256" } ], "name": "setInsuranceWithdrawalTimelock", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_maxCoverageRatio", "type": "uint256" } ], "name": "setMaxCoverageRatioForSwapIn", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_maxTokens", "type": "uint256" } ], "name": "setPoolCap", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_lpFee", "type": "uint256" }, { "internalType": "uint256", "name": "_backstopFee", "type": "uint256" }, { "internalType": "uint256", "name": "_protocolFee", "type": "uint256" } ], "name": "setSwapFees", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_sharesToBurn", "type": "uint256" } ], "name": "sharesTargetWorth", "outputs": [ { "internalType": "uint256", "name": "_amount", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "slippageCurve", "outputs": [ { "internalType": "contract ISlippageCurve", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "swapFees", "outputs": [ { "internalType": "uint256", "name": "_lpFee", "type": "uint256" }, { "internalType": "uint256", "name": "_backstopFee", "type": "uint256" }, { "internalType": "uint256", "name": "_protocolFee", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_amount", "type": "uint256" } ], "name": "swapIntoFromRouter", "outputs": [ { "internalType": "uint256", "name": "_effectiveAmount", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_amount", "type": "uint256" } ], "name": "swapOutFromRouter", "outputs": [ { "internalType": "uint256", "name": "_effectiveAmount", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "symbol", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalLiabilities", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalSupply", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "transfer", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "transferFrom", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "unpause", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_sharesToBurn", "type": "uint256" }, { "internalType": "uint256", "name": "_minimumAmount", "type": "uint256" } ], "name": "withdraw", "outputs": [ { "internalType": "uint256", "name": "_payoutAmount", "type": "uint256" }, { "internalType": "int256", "name": "_fee", "type": "int256" } ], "stateMutability": "nonpayable", "type": "function" } ]
61014060405260001960055560006009556000600a556000600b556103e8600c5560c8600f553480156200003257600080fd5b50604051620036403803806200364083398101604081905262000055916200040f565b868282818181600390805190602001906200007292919062000283565b5080516200008890600490602084019062000283565b5050506001600160a01b03831660808190526040805163313ce56760e01b8152905163313ce567916004808201926020929091908290030181865afa158015620000d6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000fc9190620004e5565b60ff1660a05250506006805460ff191690555060016007556200011f3362000231565b6001600160a01b0380851660e08190528682166101005284821660c0529087166101205215620002245760e0516001600160a01b031663f887ea406040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200018a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001b0919062000511565b6001600160a01b0316856001600160a01b031614620002245760405162461bcd60e51b815260206004820152602660248201527f636f6e7374727563746f7228293a4241434b53544f505f524f555445525f4d496044820152650a69a82a886960d31b606482015260840160405180910390fd5b505050505050506200056d565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620002919062000531565b90600052602060002090601f016020900481019282620002b5576000855562000300565b82601f10620002d057805160ff191683800117855562000300565b8280016001018555821562000300579182015b8281111562000300578251825591602001919060010190620002e3565b506200030e92915062000312565b5090565b5b808211156200030e576000815560010162000313565b6001600160a01b03811681146200033f57600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200036a57600080fd5b81516001600160401b038082111562000387576200038762000342565b604051601f8301601f19908116603f01168101908282118183101715620003b257620003b262000342565b81604052838152602092508683858801011115620003cf57600080fd5b600091505b83821015620003f35785820183015181830184015290820190620003d4565b83821115620004055760008385830101525b9695505050505050565b600080600080600080600060e0888a0312156200042b57600080fd5b8751620004388162000329565b60208901519097506200044b8162000329565b60408901519096506200045e8162000329565b6060890151909550620004718162000329565b6080890151909450620004848162000329565b60a08901519093506001600160401b0380821115620004a257600080fd5b620004b08b838c0162000358565b935060c08a0151915080821115620004c757600080fd5b50620004d68a828b0162000358565b91505092959891949750929550565b600060208284031215620004f857600080fd5b815160ff811681146200050a57600080fd5b9392505050565b6000602082840312156200052457600080fd5b81516200050a8162000329565b600181811c908216806200054657607f821691505b6020821081036200056757634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e0516101005161012051612fb16200068f60003960008181610663015281816107e90152818161124a015281816116b001528181611d280152818161212f015281816121bc015281816122c3015261247e0152600081816106c401528181610a8d0152610bb101526000818161045501528181611100015261145901526000818161047c0152610e1f0152600081816105ac01528181610857015281816112200152818161168601528181611d96015281816121050152818161221e0152818161232401526124ec01526000818161034d01528181610b4b01528181610c5701528181610dc301528181610dfd01528181610f5d015281816112e601528181611ec4015281816125c701526126e10152612fb16000f3fe608060405234801561001057600080fd5b50600436106102a05760003560e01c806395d89b4111610167578063cfcc238d116100ce578063ebe26b9e11610087578063ebe26b9e1461065e578063ec21184014610685578063ee8f6a0e14610698578063f2fde38b146106a3578063f73579a9146106b6578063f887ea40146106bf57600080fd5b8063cfcc238d146105ec578063d835f535146105ff578063db431f0614610612578063dd62ed3e14610625578063e45f37bd14610638578063eb43434e1461064b57600080fd5b8063b954dc5711610120578063b954dc571461053c578063b9ccf21d14610545578063c2cb15de14610597578063c2d41601146105aa578063cc045745146105d0578063cd3293de146105e357600080fd5b806395d89b41146104ea578063a457c2d7146104f2578063a9059cbb14610505578063ace0f0d514610518578063b2f3447a14610520578063b6b55f251461052957600080fd5b8063441a3e701161020b578063715018a6116101c4578063715018a6146104485780637dea181714610450578063803db96d146104775780638456cb591461049e5780638735c246146104a65780638da5cb5b146104d957600080fd5b8063441a3e70146103b35780634d8ea83f146103db5780635c6f4279146103ee5780635c975abb146104015780635f79d44f1461040c57806370a082311461041f57600080fd5b806323b872dd1161025d57806323b872dd14610323578063313ce5671461033657806338d52e0f1461034b57806339509351146103855780633c945248146103985780633f4ba83a146103ab57600080fd5b80630668d07c146102a557806306fdde03146102ba578063095ea7b3146102d85780630b09d91e146102fb5780630d3a7fd41461031257806318160ddd1461031b575b600080fd5b6102b86102b3366004612c0d565b6106e6565b005b6102c26106f3565b6040516102cf9190612c52565b60405180910390f35b6102eb6102e6366004612c9c565b610785565b60405190151581526020016102cf565b610304600b5481565b6040519081526020016102cf565b610304600c5481565b600254610304565b6102eb610331366004612cc6565b61079f565b60125b60405160ff90911681526020016102cf565b7f00000000000000000000000000000000000000000000000000000000000000005b6040516001600160a01b0390911681526020016102cf565b6102eb610393366004612c9c565b6107c3565b6103046103a6366004612c0d565b6107e5565b6102b8610950565b6103c66103c1366004612d02565b610962565b604080519283526020830191909152016102cf565b6103046103e9366004612c0d565b610a80565b6103046103fc366004612d24565b610b7d565b60065460ff166102eb565b61030461041a366004612c0d565b610ba4565b61030461042d366004612d24565b6001600160a01b031660009081526020819052604090205490565b6102b8610e52565b61036d7f000000000000000000000000000000000000000000000000000000000000000081565b61036d7f000000000000000000000000000000000000000000000000000000000000000081565b6102b8610e64565b6104b96104b4366004612c0d565b610e74565b6040805194855260208501939093529183015260608201526080016102cf565b6008546001600160a01b031661036d565b6102c2610e94565b6102eb610500366004612c9c565b610ea3565b6102eb610513366004612c9c565b610f1e565b610304610f2c565b610304600f5481565b6103c6610537366004612c0d565b611003565b61030460055481565b6040805160608082018352600e5463ffffffff808216808552640100000000830482166020808701829052600160401b90940490921694860185905285519081529182015292830191909152016102cf565b6103046105a5366004612d46565b6110f3565b7f0000000000000000000000000000000000000000000000000000000000000000610339565b6103046105de366004612c0d565b611369565b610304600a5481565b6102b86105fa366004612c0d565b61138b565b6102b861060d366004612c0d565b611401565b610304610620366004612c0d565b61140e565b610304610633366004612d72565b611421565b610304610646366004612c9c565b61144c565b6102b8610659366004612d9c565b611740565b61036d7f000000000000000000000000000000000000000000000000000000000000000081565b610304610693366004612c0d565b611849565b600a546009546103c6565b6102b86106b1366004612d24565b611854565b61030460095481565b61036d7f000000000000000000000000000000000000000000000000000000000000000081565b6106ee6118cd565b600f55565b60606003805461070290612dc8565b80601f016020809104026020016040519081016040528092919081815260200182805461072e90612dc8565b801561077b5780601f106107505761010080835404028352916020019161077b565b820191906000526020600020905b81548152906001019060200180831161075e57829003601f168201915b5050505050905090565b600033610793818585611927565b60019150505b92915050565b6000336107ad858285611a4b565b6107b8858585611ac5565b506001949350505050565b6000336107938185856107d68383611421565b6107e09190612e18565b611927565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e67b3643600a5460095485600b5461082a9190612e18565b6040516001600160e01b031960e086901b16815260048101939093526024830191909152604482015260ff7f0000000000000000000000000000000000000000000000000000000000000000166064820152608401602060405180830381865afa15801561089c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c09190612e30565b90506064600954600f546108d49190612e49565b6108de9190612e68565b81600a546108ec9190612e18565b111561094b5760405162461bcd60e51b8152602060048201526024808201527f53776170506f6f6c3a20455843454544535f4d41585f434f5645524147455f526044820152634154494f60e01b60648201526084015b60405180910390fd5b919050565b6109586118cd565b610960611c69565b565b60008061096d611cbb565b60008061097986611d14565b9095509092509050848410156109d15760405162461bcd60e51b815260206004820152601860248201527f77697468647261773a204d494e494d554d5f414d4f554e5400000000000000006044820152606401610942565b81600960008282546109e39190612e8a565b9250508190555081600a60008282546109fc9190612e8a565b9250508190555083600b6000828254610a159190612e8a565b90915550610a269050338786611e3f565b610a2f81611ef0565b604080518881526020810187905291945033917f49995e5dd6158cf69ad3e9777c46755a1a826a446c6416992167462dad033b2a910160405180910390a25050610a796001600755565b9250929050565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610af25760405162461bcd60e51b815260206004820152601560248201527429bbb0b82837b7b61d1027a7262cafa927aaaa22a960591b6044820152606401610942565b610afa611f5e565b610b02611cbb565b610b0b826107e5565b905080600a6000828254610b1f9190612e18565b9250508190555081600b6000828254610b389190612e18565b90915550610b7390506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333085611fa4565b61094b6001600755565b600c546001600160a01b0382166000908152600d6020526040812054909161079991612e18565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c165760405162461bcd60e51b815260206004820152601560248201527429bbb0b82837b7b61d1027a7262cafa927aaaa22a960591b6044820152606401610942565b610c1e611f5e565b610c26611cbb565b600080600080610c358661200f565b6040516370a0823160e01b8152306004820152949950929750909550935091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610ca6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cca9190612e30565b610cd48587612e18565b1115610d335760405162461bcd60e51b815260206004820152602860248201527f53776170506f6f6c23737761704f757446726f6d526f757465723a204f55545f6044820152674f465f46554e445360c01b6064820152608401610942565b8260096000828254610d459190612e18565b9091555050600a829055610d598486612e18565b600b6000828254610d6a9190612e8a565b909155505060408051848152602081018390529081018590527f3eb07265dc949e6776beb7b2e85d9e292a8a411eabd500cbe06b6bec16d877219060600160405180910390a18415610dea57610dea6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633876123b8565b8315610e4457610e446001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000167f0000000000000000000000000000000000000000000000000000000000000000866123b8565b5050505061094b6001600755565b610e5a6118cd565b61096060006123e8565b610e6c6118cd565b61096061243a565b600080600080610e838561200f565b939992985090965091945092505050565b60606004805461070290612dc8565b60003381610eb18286611421565b905083811015610f115760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610942565b6107b88286868403611927565b600033610793818585611ac5565b6000610f39600954611ef0565b610f44600b54611ef0565b6040516370a0823160e01b8152306004820152610fd5907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610fac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd09190612e30565b611ef0565b610fe0600a54611ef0565b610fea9190612ea1565b610ff49190612ee2565b610ffe9190612ee2565b905090565b60008061100e611f5e565b611016611cbb565b336000908152600d602052604081204390558061103285612477565b600b8054929750929450925086919060009061104f908490612e18565b9250508190555081600a60008282546110689190612e18565b9250508190555081600960008282546110819190612e18565b9091555061109290503386866125a2565b61109b81611ef0565b6110a490612f21565b604080518681526020810188905291945033917f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f910160405180910390a250506110ee6001600755565b915091565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111675760405162461bcd60e51b8152602060048201526017602482015276053776170506f6f6c3a204f4e4c595f4241434b53544f5604c1b6044820152606401610942565b61116f611cbb565b8260095461117d9190612e18565b600a5410156111e55760405162461bcd60e51b815260206004820152602e60248201527f53776170506f6f6c236261636b73746f70447261696e28293a494e535546464960448201526d4349454e545f434f56455241474560901b6064820152608401610942565b82600a60008282546111f79190612e8a565b9091555050600a5460095460405163113fe09360e21b81526004810192909252602482015260ff7f00000000000000000000000000000000000000000000000000000000000000001660448201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906344ff824c90606401602060405180830381865afa158015611299573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112bd9190612e30565b9050600b548110156113175780600b546112d79190612e8a565b915061130d6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001684846123b8565b600b81905561131c565b600091505b604080516001600160a01b0385168152602081018490527f439c15c5ffd384d65af60124e574f5642b7e5d6750b762ddeef70abac573ab27910160405180910390a1506107996001600755565b600061137460025490565b6009546113819084612e49565b6107999190612e68565b6113936118cd565b600081116113fc5760405162461bcd60e51b815260206004820152603060248201527f736574496e737572616e63655769746864726177616c54696d656c6f636b3a2060448201526f24a72b20a624a22fa22aa920aa24a7a760811b6064820152608401610942565b600c55565b6114096118cd565b600555565b600061141982612477565b509392505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146114c05760405162461bcd60e51b8152602060048201526017602482015276053776170506f6f6c3a204f4e4c595f4241434b53544f5604c1b6044820152606401610942565b6114c8611cbb565b6114d0611f5e565b816114f0846001600160a01b031660009081526020819052604090205490565b101561154d5760405162461bcd60e51b815260206004820152602660248201527f53776170506f6f6c236261636b73746f704275726e3a2042414c414e43455f546044820152654f4f5f4c4f5760d01b6064820152608401610942565b600c546001600160a01b0384166000908152600d60205260409020546115739043612e8a565b10156115c15760405162461bcd60e51b815260206004820152601f60248201527f53776170506f6f6c236261636b73746f704275726e3a2054494d454c4f434b006044820152606401610942565b6115ca82611369565b905060095481600a546115dd9190612e18565b11156116415760405162461bcd60e51b815260206004820152602d60248201527f53776170506f6f6c236261636b73746f704275726e28293a494e53554646494360448201526c49454e545f434f56455241474560981b6064820152608401610942565b61164b8383612709565b806009600082825461165d9190612e8a565b9091555050600a5460095460405163113fe09360e21b81526004810192909252602482015260ff7f00000000000000000000000000000000000000000000000000000000000000001660448201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906344ff824c90606401602060405180830381865afa1580156116ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117239190612e30565b9050600b5481101561173557600b8190555b506107996001600755565b6117486118cd565b620493e0816117578486612e18565b6117619190612e18565b106117ae5760405162461bcd60e51b815260206004820152601a60248201527f73657453776170466565733a20464545535f544f4f5f484947480000000000006044820152606401610942565b60405180606001604052806117c28561283b565b63ffffffff1681526020016117d68461283b565b63ffffffff1681526020016117ea8361283b565b63ffffffff9081169091528151600e8054602085015160409095015192841667ffffffffffffffff199091161764010000000094841694909402939093176bffffffff00000000000000001916600160401b9190921602179055505050565b600061141982611d14565b61185c6118cd565b6001600160a01b0381166118c15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610942565b6118ca816123e8565b50565b6008546001600160a01b031633146109605760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610942565b6001600160a01b0383166119895760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610942565b6001600160a01b0382166119ea5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610942565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000611a578484611421565b90506000198114611abf5781811015611ab25760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610942565b611abf8484848403611927565b50505050565b6001600160a01b038316611b295760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610942565b6001600160a01b038216611b8b5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610942565b6001600160a01b03831660009081526020819052604090205481811015611c035760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610942565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611abf565b611c716128a0565b6006805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600260075403611d0d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610942565b6002600755565b6000806000611d2284611369565b925060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166344ff824c85600a54611d639190612e8a565b86600954611d719190612e8a565b6040516001600160e01b031960e085901b1681526004810192909252602482015260ff7f0000000000000000000000000000000000000000000000000000000000000000166044820152606401602060405180830381865afa158015611ddb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dff9190612e30565b9050600b54811115611e105750600b545b80600b54611e1e9190612e8a565b925083831115611e2c578392505b611e368385612e8a565b93959294505050565b81611e5f846001600160a01b031660009081526020819052604090205490565b1015611ead5760405162461bcd60e51b815260206004820152601e60248201527f77697468647261773a20494e53554646494349454e545f42414c414e434500006044820152606401610942565b611eb78383612709565b611eeb6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001684836123b8565b505050565b60006001600160ff1b03821115611f5a5760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b6064820152608401610942565b5090565b60065460ff16156109605760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610942565b6040516001600160a01b0380851660248301528316604482015260648101829052611abf9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526128e9565b600e5460009081908190819081908190620f4240906120349063ffffffff1689612e49565b61203e9190612e68565b600e54909150620f42409061206190640100000000900463ffffffff1689612e49565b61206b9190612e68565b600e54909250600090620f42409061209090600160401b900463ffffffff168a612e49565b61209a9190612e68565b90506000886120a98386612e18565b106120b657600a546120da565b888285600a546120c69190612e18565b6120d09190612e18565b6120da9190612e8a565b600954600b54604051633cf1eef960e11b8152600481018490526024810192909252604482015260ff7f00000000000000000000000000000000000000000000000000000000000000001660648201529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906379e3ddf290608401602060405180830381865afa15801561217e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a29190612e30565b9550828611156121b0578295505b60006001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166344ff824c6121eb8985612e18565b896009546121f99190612e18565b6040516001600160e01b031960e085901b1681526004810192909252602482015260ff7f0000000000000000000000000000000000000000000000000000000000000000166044820152606401602060405180830381865afa158015612263573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122879190612e30565b9050600b548111156122985750600b545b80600b546122a69190612e8a565b9850826122b38884612e18565b6122bd9190612e8a565b955060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166344ff824c888a6009546122ff9190612e18565b6040516001600160e01b031960e085901b1681526004810192909252602482015260ff7f0000000000000000000000000000000000000000000000000000000000000000166044820152606401602060405180830381865afa158015612369573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061238d9190612e30565b90508181116123a5576123a08183612e8a565b6123a8565b60005b9850505050505091939590929450565b6040516001600160a01b038316602482015260448101829052611eeb90849063a9059cbb60e01b90606401611fd8565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b612442611f5e565b6006805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611c9e3390565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379e3ddf2600a5460095487600b546124bf9190612e18565b6040516001600160e01b031960e086901b16815260048101939093526024830191909152604482015260ff7f0000000000000000000000000000000000000000000000000000000000000000166064820152608401602060405180830381865afa158015612531573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125559190612e30565b925083831015612563578392505b61256d8484612e8a565b905060006009541161257f5782612599565b60095460025461258f9085612e49565b6125999190612e68565b91509193909250565b6005546040516370a0823160e01b815230600482015283919082906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561260e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126329190612e30565b61263c9190612e18565b11156126825760405162461bcd60e51b815260206004820152601560248201527419195c1bdcda5d0e8810d05417d15610d151511151605a1b6044820152606401610942565b600082116126ca5760405162461bcd60e51b815260206004820152601560248201527419195c1bdcda5d0e8816915493d7d1115413d4d255605a1b6044820152606401610942565b6126d484836129be565b611abf6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016853086611fa4565b6001600160a01b0382166127695760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610942565b6001600160a01b038216600090815260208190526040902054818110156127dd5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610942565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b600063ffffffff821115611f5a5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610942565b60065460ff166109605760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610942565b600061293e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612a7d9092919063ffffffff16565b905080516000148061295f57508080602001905181019061295f9190612f3d565b611eeb5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610942565b6001600160a01b038216612a145760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610942565b8060026000828254612a269190612e18565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6060612a8c8484600085612a94565b949350505050565b606082471015612af55760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610942565b600080866001600160a01b03168587604051612b119190612f5f565b60006040518083038185875af1925050503d8060008114612b4e576040519150601f19603f3d011682016040523d82523d6000602084013e612b53565b606091505b5091509150612b6487838387612b6f565b979650505050505050565b60608315612bde578251600003612bd7576001600160a01b0385163b612bd75760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610942565b5081612a8c565b612a8c8383815115612bf35781518083602001fd5b8060405162461bcd60e51b81526004016109429190612c52565b600060208284031215612c1f57600080fd5b5035919050565b60005b83811015612c41578181015183820152602001612c29565b83811115611abf5750506000910152565b6020815260008251806020840152612c71816040850160208701612c26565b601f01601f19169190910160400192915050565b80356001600160a01b038116811461094b57600080fd5b60008060408385031215612caf57600080fd5b612cb883612c85565b946020939093013593505050565b600080600060608486031215612cdb57600080fd5b612ce484612c85565b9250612cf260208501612c85565b9150604084013590509250925092565b60008060408385031215612d1557600080fd5b50508035926020909101359150565b600060208284031215612d3657600080fd5b612d3f82612c85565b9392505050565b60008060408385031215612d5957600080fd5b82359150612d6960208401612c85565b90509250929050565b60008060408385031215612d8557600080fd5b612d8e83612c85565b9150612d6960208401612c85565b600080600060608486031215612db157600080fd5b505081359360208301359350604090920135919050565b600181811c90821680612ddc57607f821691505b602082108103612dfc57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60008219821115612e2b57612e2b612e02565b500190565b600060208284031215612e4257600080fd5b5051919050565b6000816000190483118215151615612e6357612e63612e02565b500290565b600082612e8557634e487b7160e01b600052601260045260246000fd5b500490565b600082821015612e9c57612e9c612e02565b500390565b600080821280156001600160ff1b0384900385131615612ec357612ec3612e02565b600160ff1b8390038412811615612edc57612edc612e02565b50500190565b60008083128015600160ff1b850184121615612f0057612f00612e02565b6001600160ff1b0384018313811615612f1b57612f1b612e02565b50500390565b6000600160ff1b8201612f3657612f36612e02565b5060000390565b600060208284031215612f4f57600080fd5b81518015158114612d3f57600080fd5b60008251612f71818460208701612c26565b919091019291505056fea264697066735822122091113ce4e6cd426e5f38bfea66bce0f26b725ceb010f94a5c8548474a9e9eb4164736f6c634300080d0033000000000000000000000000ab03d94bf249260f3d8c71ae2baf148a10442a87000000000000000000000000ce59898440719b64ff2e5cb1e9da33635c3b5e7600000000000000000000000027a53033d6e5ecb43d8c0a31e258f7264384a9030000000000000000000000005cd4d6b7bc0c21ee50b3deac62c58f47d844a4100000000000000000000000007b413a024c2c4a2b4f2c249ef11f1c45adebf4a400000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000124e61626c6120574554482053776170204c50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066e61574554480000000000000000000000000000000000000000000000000000