[ { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "Approval", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "user", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "Burn", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "increaseShares", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "totalShares", "type": "uint256" } ], "name": "BuyShares", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "borrower", "type": "address" }, { "indexed": false, "internalType": "address", "name": "assetTo", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "baseAmount", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "quoteAmount", "type": "uint256" } ], "name": "DODOFlashLoan", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "fromToken", "type": "address" }, { "indexed": false, "internalType": "address", "name": "toToken", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "fromAmount", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "toAmount", "type": "uint256" }, { "indexed": false, "internalType": "address", "name": "trader", "type": "address" }, { "indexed": false, "internalType": "address", "name": "receiver", "type": "address" } ], "name": "DODOSwap", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "user", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "Mint", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "payer", "type": "address" }, { "indexed": false, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "decreaseShares", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "totalShares", "type": "uint256" } ], "name": "SellShares", "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": "amount", "type": "uint256" } ], "name": "Transfer", "type": "event" }, { "inputs": [], "name": "DOMAIN_SEPARATOR", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "PERMIT_TYPEHASH", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "_BASE_PRICE_CUMULATIVE_LAST_", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "_BASE_RESERVE_", "outputs": [ { "internalType": "uint112", "name": "", "type": "uint112" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "_BASE_TOKEN_", "outputs": [ { "internalType": "contract IERC20", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "_BLOCK_TIMESTAMP_LAST_", "outputs": [ { "internalType": "uint32", "name": "", "type": "uint32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "_IS_OPEN_TWAP_", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "_I_", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "_K_", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "_LP_FEE_RATE_", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "_MAINTAINER_", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "_MT_FEE_RATE_MODEL_", "outputs": [ { "internalType": "contract IFeeRateModel", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "_QUOTE_RESERVE_", "outputs": [ { "internalType": "uint112", "name": "", "type": "uint112" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "_QUOTE_TOKEN_", "outputs": [ { "internalType": "contract IERC20", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_addr", "type": "address" } ], "name": "addressToShortString", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "pure", "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": "amount", "type": "uint256" } ], "name": "approve", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" } ], "name": "balanceOf", "outputs": [ { "internalType": "uint256", "name": "balance", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" } ], "name": "buyShares", "outputs": [ { "internalType": "uint256", "name": "shares", "type": "uint256" }, { "internalType": "uint256", "name": "baseInput", "type": "uint256" }, { "internalType": "uint256", "name": "quoteInput", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "decimals", "outputs": [ { "internalType": "uint8", "name": "", "type": "uint8" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "baseAmount", "type": "uint256" }, { "internalType": "uint256", "name": "quoteAmount", "type": "uint256" }, { "internalType": "address", "name": "assetTo", "type": "address" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "flashLoan", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "getBaseInput", "outputs": [ { "internalType": "uint256", "name": "input", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getMidPrice", "outputs": [ { "internalType": "uint256", "name": "midPrice", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getPMMState", "outputs": [ { "components": [ { "internalType": "uint256", "name": "i", "type": "uint256" }, { "internalType": "uint256", "name": "K", "type": "uint256" }, { "internalType": "uint256", "name": "B", "type": "uint256" }, { "internalType": "uint256", "name": "Q", "type": "uint256" }, { "internalType": "uint256", "name": "B0", "type": "uint256" }, { "internalType": "uint256", "name": "Q0", "type": "uint256" }, { "internalType": "enum PMMPricing.RState", "name": "R", "type": "uint8" } ], "internalType": "struct PMMPricing.PMMState", "name": "state", "type": "tuple" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getPMMStateForCall", "outputs": [ { "internalType": "uint256", "name": "i", "type": "uint256" }, { "internalType": "uint256", "name": "K", "type": "uint256" }, { "internalType": "uint256", "name": "B", "type": "uint256" }, { "internalType": "uint256", "name": "Q", "type": "uint256" }, { "internalType": "uint256", "name": "B0", "type": "uint256" }, { "internalType": "uint256", "name": "Q0", "type": "uint256" }, { "internalType": "uint256", "name": "R", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getQuoteInput", "outputs": [ { "internalType": "uint256", "name": "input", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "user", "type": "address" } ], "name": "getUserFeeRate", "outputs": [ { "internalType": "uint256", "name": "lpFeeRate", "type": "uint256" }, { "internalType": "uint256", "name": "mtFeeRate", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getVaultReserve", "outputs": [ { "internalType": "uint256", "name": "baseReserve", "type": "uint256" }, { "internalType": "uint256", "name": "quoteReserve", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "maintainer", "type": "address" }, { "internalType": "address", "name": "baseTokenAddress", "type": "address" }, { "internalType": "address", "name": "quoteTokenAddress", "type": "address" }, { "internalType": "uint256", "name": "lpFeeRate", "type": "uint256" }, { "internalType": "address", "name": "mtFeeRateModel", "type": "address" }, { "internalType": "uint256", "name": "i", "type": "uint256" }, { "internalType": "uint256", "name": "k", "type": "uint256" }, { "internalType": "bool", "name": "isOpenTWAP", "type": "bool" } ], "name": "init", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "name", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "nonces", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "uint256", "name": "deadline", "type": "uint256" }, { "internalType": "uint8", "name": "v", "type": "uint8" }, { "internalType": "bytes32", "name": "r", "type": "bytes32" }, { "internalType": "bytes32", "name": "s", "type": "bytes32" } ], "name": "permit", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "trader", "type": "address" }, { "internalType": "uint256", "name": "payBaseAmount", "type": "uint256" } ], "name": "querySellBase", "outputs": [ { "internalType": "uint256", "name": "receiveQuoteAmount", "type": "uint256" }, { "internalType": "uint256", "name": "mtFee", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "trader", "type": "address" }, { "internalType": "uint256", "name": "payQuoteAmount", "type": "uint256" } ], "name": "querySellQuote", "outputs": [ { "internalType": "uint256", "name": "receiveBaseAmount", "type": "uint256" }, { "internalType": "uint256", "name": "mtFee", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" } ], "name": "sellBase", "outputs": [ { "internalType": "uint256", "name": "receiveQuoteAmount", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" } ], "name": "sellQuote", "outputs": [ { "internalType": "uint256", "name": "receiveBaseAmount", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "shareAmount", "type": "uint256" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "baseMinAmount", "type": "uint256" }, { "internalType": "uint256", "name": "quoteMinAmount", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" }, { "internalType": "uint256", "name": "deadline", "type": "uint256" } ], "name": "sellShares", "outputs": [ { "internalType": "uint256", "name": "baseAmount", "type": "uint256" }, { "internalType": "uint256", "name": "quoteAmount", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "symbol", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "sync", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "totalSupply", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "transfer", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "transferFrom", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "version", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "pure", "type": "function" } ]
60806040526000805461ff001916905534801561001b57600080fd5b50613ec28061002b6000396000f3fe608060405234801561001057600080fd5b50600436106102695760003560e01c80637d72150411610151578063d4b97046116100c3578063ee27c68911610087578063ee27c689146104e1578063f6b06e70146104e9578063f811d692146104f1578063fd1ed7e9146104f9578063fe24cb7f14610514578063fff6cae91461051c57610269565b8063d4b9704614610498578063d505accf146104a0578063dd62ed3e146104b3578063dd93f59a146104c6578063ec2fd46d146104d957610269565b8063a9059cbb11610115578063a9059cbb1461043c578063ab44a7a31461044f578063b56ceaa614610457578063bbf5ce781461046a578063bd6015b414610472578063d0a494e41461048557610269565b80637d721504146103e25780637ecebe00146103f7578063880a4d871461040a57806395d89b411461041f578063a382d1b91461042757610269565b80634322ec83116101ea57806354fd4d50116101ae57806354fd4d501461039157806365f6fcbb1461039957806366410a21146103a157806370a08231146103b457806371f9100c146103c757806379a04876146103cf57610269565b80634322ec831461032a578063440966091461033f5780634a248d2a146103525780634c85b4251461035a5780635039972a1461037c57610269565b80632df6cb48116102315780632df6cb48146102e757806330adf81f146102ef578063313ce567146102f757806336223ce91461030c5780633644e5151461032257610269565b806306fdde031461026e578063095ea7b31461028c57806317101940146102ac57806318160ddd146102bf57806323b872dd146102d4575b600080fd5b610276610524565b6040516102839190613914565b60405180910390f35b61029f61029a3660046134e7565b6105b2565b6040516102839190613882565b6102766102ba366004613361565b6105c9565b6102c76106f3565b604051610283919061388d565b61029f6102e2366004613439565b6106f9565b61029f61087d565b6102c761088b565b6102ff6108af565b6040516102839190613de0565b6103146108b8565b604051610283929190613d7b565b6102c76108d3565b6103326108d9565b6040516102839190613758565b61031461034d366004613361565b6108ef565b61033261097a565b61036d610368366004613361565b610989565b60405161028393929190613d89565b61038f61038a3660046133b0565b610c66565b005b610276610fa4565b6102c7610fc8565b6103146103af3660046134e7565b61106f565b6102c76103c2366004613361565b611144565b6102c761115f565b6103146103dd3660046134e7565b6111ab565b6103ea6111bf565b6040516102839190613d67565b6102c7610405366004613361565b6111ce565b6104126111e0565b6040516102839190613dcf565b6102766111f3565b61042f61124e565b6040516102839190613d0d565b61029f61044a3660046134e7565b6112a2565b6102c7611371565b610314610465366004613545565b611377565b6103ea611670565b6102c7610480366004613361565b611686565b61038f6104933660046135bf565b611872565b610332611ca0565b61038f6104ae366004613479565b611caf565b6102c76104c136600461337c565b611e1e565b6102c76104d4366004613361565b611e49565b6102c7612019565b6102c761201f565b610332612031565b6102c7612040565b610501612046565b6040516102839796959493929190613d9f565b6102c76120a9565b61038f6120af565b6007805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156105aa5780601f1061057f576101008083540402835291602001916105aa565b820191906000526020600020905b81548152906001019060200180831161058d57829003601f168201915b505050505081565b60006105bf3384846120f3565b5060015b92915050565b604080518082018252601081526f181899199a1a9b1b9c1cb0b131b232b360811b6020820152815160088082528184019093526060926001600160a01b0385169291849160208201818036833701905050905060005b60048110156106e8578260048583600c016020811061063a57fe5b1a60f81b6001600160f81b031916901c60f81c60ff168151811061065a57fe5b602001015160f81c60f81b82826002028151811061067457fe5b60200101906001600160f81b031916908160001a905350828482600c016020811061069b57fe5b825191901a600f169081106106ac57fe5b602001015160f81c60f81b8282600202600101815181106106c957fe5b60200101906001600160f81b031916908160001a90535060010161061f565b50925050505b919050565b60085481565b6001600160a01b03831660009081526009602052604081205482111561073a5760405162461bcd60e51b815260040161073190613bd2565b60405180910390fd5b6001600160a01b0384166000908152600a6020908152604080832033845290915290205482111561077d5760405162461bcd60e51b815260040161073190613972565b6001600160a01b0384166000908152600960205260409020546107a6908363ffffffff61215b16565b6001600160a01b0380861660009081526009602052604080822093909355908516815220546107db908363ffffffff61218316565b6001600160a01b038085166000908152600960209081526040808320949094559187168152600a8252828120338252909152205461081f908363ffffffff61215b16565b6001600160a01b038086166000818152600a60209081526040808320338452909152908190209390935591519085169190600080516020613e4d8339815191529061086b90869061388d565b60405180910390a35060019392505050565b600054610100900460ff1681565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60065460ff1681565b6003546001600160701b0380821692600160701b9092041690565b600b5481565b600054630100000090046001600160a01b031681565b600d54600e54604051638198edbf60e01b81526000916001600160a01b031690638198edbf90610923908690600401613758565b60206040518083038186803b15801561093b57600080fd5b505afa15801561094f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610973919061352d565b9050915091565b6001546001600160a01b031681565b600080548190819060ff16156109b15760405162461bcd60e51b8152600401610731906139c8565b6000805460ff191660019081178255546040516370a0823160e01b81526001600160a01b03909116906370a08231906109ee903090600401613758565b60206040518083038186803b158015610a0657600080fd5b505afa158015610a1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3e919061352d565b6002546040516370a0823160e01b81529192506000916001600160a01b03909116906370a0823190610a74903090600401613758565b60206040518083038186803b158015610a8c57600080fd5b505afa158015610aa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac4919061352d565b6003549091506001600160701b0380821691600160701b900416610aee848363ffffffff61215b16565b9550610b00838263ffffffff61215b16565b945060008611610b225760405162461bcd60e51b815260040161073190613a57565b600854610b53576103e8841015610b4b5760405162461bcd60e51b815260040161073190613b9b565b839650610be8565b600082118015610b61575080155b15610b9257610b8b82610b7f600854896121af90919063ffffffff16565b9063ffffffff6121e916565b9650610be8565b600082118015610ba25750600081115b15610be8576000610bb3878461221b565b90506000610bc1878461221b565b90506000828210610bd25782610bd4565b815b9050610be260085482612239565b99505050505b610bf2888861225b565b610bfc8484612355565b6001600160a01b038816600090815260096020526040908190205490517f1c172440bdebb59cd92a7f08f4227903a3305ab6f880cb25f93eddb66843a10291610c48918b918b91613861565b60405180910390a150506000805460ff191690555092949193509150565b60005462010000900460ff1615610c8f5760405162461bcd60e51b815260040161073190613aa6565b6000805462ff00001916620100001790556001600160a01b038781169087161415610ccc5760405162461bcd60e51b8152600401610731906139eb565b600180546001600160a01b03808a166001600160a01b03199283161790925560028054928916929091169190911790558215801590610d1a57506ec097ce7bc90715b34b9f10000000008311155b610d2357600080fd5b6010839055670de0b6b3a7640000821115610d3d57600080fd5b600f829055600d859055600e80546001600160a01b038087166001600160a01b03199092169190911790915560008054831580156101000261ff0019948d166301000000026301000000600160b81b03199093169290921793909316179055610dbe57600380546001600160e01b03164263ffffffff16600160e01b021790555b60408051808201825260018152605f60f81b602080830191909152825180840190935260038352620444c560ec1b90830152908082610dfc306105c9565b604051602001610e0e939291906136f8565b60405160208183030381529060405260079080519060200190610e3292919061322b565b50604080518082019091526003808252620444c560ec1b6020909201918252610e5d9160059161322b565b50600160009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610eac57600080fd5b505afa158015610ec0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee49190613626565b6006805460ff191660ff9290921691909117905560405146907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90610f2b90600790613688565b60408051918290038220828201825260018352603160f81b6020938401529051610f7c93927fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc69186913091016138e8565b60408051601f198184030181529190528051602090910120600b555050505050505050505050565b604080518082019091526009815268222b2690189718171960b91b60208201525b90565b6003546001546040516370a0823160e01b815260009261106a926001600160701b03909116916001600160a01b03909116906370a082319061100e903090600401613758565b60206040518083038186803b15801561102657600080fd5b505afa15801561103a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105e919061352d565b9063ffffffff61215b16565b905090565b60008061108361107d61124e565b846123e4565b50600d54600e54604051638198edbf60e01b815292945090916000916001600160a01b031690638198edbf906110bd908990600401613758565b60206040518083038186803b1580156110d557600080fd5b505afa1580156110e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110d919061352d565b90506111198482612239565b92506111398361105e61112c8786612239565b879063ffffffff61215b16565b935050509250929050565b6001600160a01b031660009081526009602052604090205490565b6003546002546040516370a0823160e01b815260009261106a92600160701b9091046001600160701b0316916001600160a01b03909116906370a082319061100e903090600401613758565b6000806110836111b961124e565b846124ea565b6003546001600160701b031681565b600c6020526000908152604090205481565b600354600160e01b900463ffffffff1681565b6005805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156105aa5780601f1061057f576101008083540402835291602001916105aa565b6112566132a9565b6010548152600f5460208201526003546001600160701b038082166040840152600160701b90910416606082015260006080820181905260a0820152600160c0820152610fc5816125eb565b336000908152600960205260408120548211156112d15760405162461bcd60e51b815260040161073190613bd2565b336000908152600960205260409020546112f1908363ffffffff61215b16565b33600090815260096020526040808220929092556001600160a01b03851681522054611323908363ffffffff61218316565b6001600160a01b038416600081815260096020526040908190209290925590513390600080516020613e4d8339815191529061136090869061388d565b60405180910390a350600192915050565b600d5481565b60008054819060ff161561139d5760405162461bcd60e51b8152600401610731906139c8565b6000805460ff19166001179055428310156113ca5760405162461bcd60e51b815260040161073190613cc4565b336000908152600960205260409020548911156113f95760405162461bcd60e51b815260040161073190613b73565b6001546040516370a0823160e01b81526000916001600160a01b0316906370a082319061142a903090600401613758565b60206040518083038186803b15801561144257600080fd5b505afa158015611456573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147a919061352d565b6002546040516370a0823160e01b81529192506000916001600160a01b03909116906370a08231906114b0903090600401613758565b60206040518083038186803b1580156114c857600080fd5b505afa1580156114dc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611500919061352d565b60085490915061151a81610b7f858f63ffffffff6121af16565b945061153081610b7f848f63ffffffff6121af16565b93508985101580156115425750888410155b61155e5760405162461bcd60e51b815260040161073190613b46565b611568338d612695565b6115728b86612762565b61157c8b85612785565b6115846127a8565b86156115f3578a6001600160a01b0316632411d338338e88888d8d6040518763ffffffff1660e01b81526004016115c0969594939291906137ce565b600060405180830381600087803b1580156115da57600080fd5b505af11580156115ee573d6000803e3d6000fd5b505050505b7f55caccde83781f39bfc1296eff45655b6496729443a7d48958b18b3b685600a5338c8e60096000336001600160a01b03166001600160a01b031681526020019081526020016000205460405161164d949392919061376c565b60405180910390a150506000805460ff1916905550909890975095505050505050565b600354600160701b90046001600160701b031681565b6000805460ff16156116aa5760405162461bcd60e51b8152600401610731906139c8565b6000805460ff191660019081178255546040516370a0823160e01b81526001600160a01b03909116906370a08231906116e7903090600401613758565b60206040518083038186803b1580156116ff57600080fd5b505afa158015611713573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611737919061352d565b60035490915060009061175a9083906001600160701b031663ffffffff61215b16565b9050600061176832836111ab565b90945090506117778585612785565b60005461179490630100000090046001600160a01b031682612785565b6002546040516370a0823160e01b815261181f9185916001600160a01b03909116906370a08231906117ca903090600401613758565b60206040518083038186803b1580156117e257600080fd5b505afa1580156117f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181a919061352d565b612355565b600154600254604051600080516020613e6d83398151915292611858926001600160a01b03918216929116908690899033908c9061380e565b60405180910390a150506000805460ff1916905550919050565b60005460ff16156118955760405162461bcd60e51b8152600401610731906139c8565b6000805460ff191660011790556118ac8386612762565b6118b68385612785565b80156119235760405163eb2021c360e01b81526001600160a01b0384169063eb2021c3906118f09033908990899088908890600401613795565b600060405180830381600087803b15801561190a57600080fd5b505af115801561191e573d6000803e3d6000fd5b505050505b6001546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611954903090600401613758565b60206040518083038186803b15801561196c57600080fd5b505afa158015611980573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a4919061352d565b6002546040516370a0823160e01b81529192506000916001600160a01b03909116906370a08231906119da903090600401613758565b60206040518083038186803b1580156119f257600080fd5b505afa158015611a06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2a919061352d565b6003549091506001600160701b031682101580611a595750600354600160701b90046001600160701b03168110155b611a755760405162461bcd60e51b815260040161073190613947565b6003546001600160701b0316821015611b5b57600354600090611aa9908390600160701b90046001600160701b031661215b565b9050600080611ab8328461106f565b60035491935091508290611adb906001600160701b03168763ffffffff61215b16565b1115611af95760405162461bcd60e51b815260040161073190613947565b600054611b1690630100000090046001600160a01b031682612762565b600254600154604051600080516020613e6d83398151915292611b4f926001600160a01b03918216929116908790879033908f9061380e565b60405180910390a15050505b600354600160701b90046001600160701b0316811015611c4857600354600090611b959084906001600160701b031663ffffffff61215b16565b9050600080611ba432846111ab565b60035491935091508290611bc890600160701b90046001600160701b03168661215b565b1115611be65760405162461bcd60e51b815260040161073190613947565b600054611c0390630100000090046001600160a01b031682612785565b600154600254604051600080516020613e6d83398151915292611c3c926001600160a01b03918216929116908790879033908f9061380e565b60405180910390a15050505b611c506127a8565b7f0b82e93068db15abd9fbb2682c65462ea8a0a10582dce93a5664818e296f54eb33868989604051611c85949392919061376c565b60405180910390a150506000805460ff191690555050505050565b6002546001600160a01b031681565b42841015611ccf5760405162461bcd60e51b815260040161073190613b18565b600b546001600160a01b0388166000908152600c602090815260408083208054600181019091559051929392611d30927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9928d928d928d92918d9101613896565b60405160208183030381529060405280519060200120604051602001611d5792919061373d565b604051602081830303815290604052805190602001209050600060018286868660405160008152602001604052604051611d9494939291906138ca565b6020604051602081039080840390855afa158015611db6573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590611dec5750886001600160a01b0316816001600160a01b0316145b611e085760405162461bcd60e51b815260040161073190613c8d565b611e138989896120f3565b505050505050505050565b6001600160a01b039182166000908152600a6020908152604080832093909416825291909152205490565b6000805460ff1615611e6d5760405162461bcd60e51b8152600401610731906139c8565b6000805460ff191660011781556002546040516370a0823160e01b81526001600160a01b03909116906370a0823190611eaa903090600401613758565b60206040518083038186803b158015611ec257600080fd5b505afa158015611ed6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611efa919061352d565b600354909150600090611f1e908390600160701b90046001600160701b031661215b565b90506000611f2c328361106f565b9094509050611f3b8585612762565b600054611f5890630100000090046001600160a01b031682612762565b6001546040516370a0823160e01b8152611fe0916001600160a01b0316906370a0823190611f8a903090600401613758565b60206040518083038186803b158015611fa257600080fd5b505afa158015611fb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fda919061352d565b84612355565b600254600154604051600080516020613e6d83398151915292611858926001600160a01b03918216929116908690899033908c9061380e565b600f5481565b600061106a61202c61124e565b61296f565b600e546001600160a01b031681565b60105481565b60008060008060008060006120596132a9565b61206161124e565b905080600001519750806020015196508060400151955080606001519450806080015193508060a0015192508060c00151600281111561209d57fe5b91505090919293949596565b60045481565b60005460ff16156120d25760405162461bcd60e51b8152600401610731906139c8565b6000805460ff191660011790556120e76127a8565b6000805460ff19169055565b6001600160a01b038084166000818152600a602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061214e90859061388d565b60405180910390a3505050565b60008282111561217d5760405162461bcd60e51b815260040161073190613af5565b50900390565b6000828201838110156121a85760405162461bcd60e51b815260040161073190613c20565b9392505050565b6000826121be575060006105c3565b828202828482816121cb57fe5b04146121a85760405162461bcd60e51b815260040161073190613cea565b600080821161220a5760405162461bcd60e51b815260040161073190613a7e565b81838161221357fe5b049392505050565b60006121a882610b7f85670de0b6b3a764000063ffffffff6121af16565b6000670de0b6b3a7640000612254848463ffffffff6121af16565b8161221357fe5b6103e8811161227c5760405162461bcd60e51b815260040161073190613acf565b6001600160a01b0382166000908152600960205260409020546122a5908263ffffffff61218316565b6001600160a01b0383166000908152600960205260409020556008546122d1908263ffffffff61218316565b6008556040516001600160a01b038316907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968859061230f90849061388d565b60405180910390a2816001600160a01b031660006001600160a01b0316600080516020613e4d83398151915283604051612349919061388d565b60405180910390a35050565b6001600160701b03821180159061237357506001600160701b038111155b61238f5760405162461bcd60e51b815260040161073190613bfe565b600380546001600160701b03838116600160701b02600160701b600160e01b03199186166001600160701b0319909316929092171617905560005460ff61010090910416156123e0576123e0612a61565b5050565b600080808460c0015160028111156123f857fe5b1415612413576124088484612af6565b9150600190506124e3565b60018460c00151600281111561242557fe5b1415612435576124088484612b1d565b600061245285606001518660a0015161215b90919063ffffffff16565b905060006124718660800151876040015161215b90919063ffffffff16565b90508185101561249c576124858686612b3a565b93506002925080841115612497578093505b6124e0565b818514156124b057809350600092506124e0565b6124d96124cc876124c7888663ffffffff61215b16565b612af6565b829063ffffffff61218316565b9350600192505b50505b9250929050565b600080808460c0015160028111156124fe57fe5b14156125195761250e8484612b75565b9150600290506124e3565b60018460c00151600281111561252b57fe5b14156125d657600061254e8560400151866080015161215b90919063ffffffff16565b9050600061256d8660a00151876060015161215b90919063ffffffff16565b905081851015612598576125818686612b94565b93506001925080841115612593578093505b6125cf565b818514156125ac57809350600092506125cf565b6125c86124cc876125c3888663ffffffff61215b16565b612b75565b9350600292505b50506124e3565b6125e08484612bc6565b946002945092505050565b60028160c0015160028111156125fd57fe5b141561263c5761263281606001516126268360800151846040015161215b90919063ffffffff16565b83516020850151612be5565b60a0820152612692565b60018160c00151600281111561264e57fe5b14156126925761268c81604001516126778360a00151846060015161215b90919063ffffffff16565b835161268290612d0b565b8460200151612be5565b60808201525b50565b6001600160a01b0382166000908152600960205260409020546126be908263ffffffff61215b16565b6001600160a01b0383166000908152600960205260409020556008546126ea908263ffffffff61215b16565b6008556040516001600160a01b038316907fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59061272890849061388d565b60405180910390a260006001600160a01b0316826001600160a01b0316600080516020613e4d83398151915283604051612349919061388d565b80156123e0576001546123e0906001600160a01b0316838363ffffffff612d2c16565b80156123e0576002546123e0906001600160a01b0316838363ffffffff612d2c16565b6001546040516370a0823160e01b81526000916001600160a01b0316906370a08231906127d9903090600401613758565b60206040518083038186803b1580156127f157600080fd5b505afa158015612805573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612829919061352d565b6002546040516370a0823160e01b81529192506000916001600160a01b03909116906370a082319061285f903090600401613758565b60206040518083038186803b15801561287757600080fd5b505afa15801561288b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128af919061352d565b90506001600160701b0382118015906128cf57506001600160701b038111155b6128eb5760405162461bcd60e51b815260040161073190613bfe565b6003546001600160701b0316821461291957600380546001600160701b0319166001600160701b0384161790555b600354600160701b90046001600160701b031681146129575760038054600160701b600160e01b031916600160701b6001600160701b038416021790555b600054610100900460ff16156123e0576123e0612a61565b600060028260c00151600281111561298357fe5b1415612a0e57606082015160a08301516000916129b9916129af9190610b7f908063ffffffff6121af16565b846060015161221b565b90506129f66129cc846020015183612239565b60208501516129ea90670de0b6b3a76400009063ffffffff61215b16565b9063ffffffff61218316565b9050612a0683600001518261221b565b9150506106ee565b60408201516080830151600091612a3e91612a349190610b7f908063ffffffff6121af16565b846040015161221b565b9050612a516129cc846020015183612239565b9050612a06836000015182612239565b60035463ffffffff42811691600160e01b90048116820390811615801590612a9357506003546001600160701b031615155b8015612ab05750600354600160701b90046001600160701b031615155b15612ad0578063ffffffff16612ac461201f565b60048054919092020190555b506003805463ffffffff909216600160e01b026001600160e01b03909216919091179055565b60006121a88360800151846080015184612b138760000151612d0b565b8760200151612d87565b60006121a88360800151846040015184612b138760000151612d0b565b60006121a88360a00151612b5b84866060015161218390919063ffffffff16565b60608601518651612b6b90612d0b565b8760200151613007565b60006121a88360a001518460a001518486600001518760200151612d87565b60006121a88360800151612bb584866040015161218390919063ffffffff16565b604086015186516020880151613007565b60006121a88360a0015184606001518486600001518760200151612d87565b600081612c0d57612c06612bf98486612239565b869063ffffffff61218316565b9050612d03565b84612c1a57506000612d03565b600080612c30600485028663ffffffff6121af16565b905080612c4757670de0b6b3a76400009150612cc7565b858187830281612c5357fe5b041415612c8e57612c87612c826ec097ce7bc90715b34b9f10000000006129ea848a028b63ffffffff6121e916565b6130e0565b9150612cc7565b612cc4612c826ec097ce7bc90715b34b9f10000000006129ea89612cb8868d63ffffffff6121e916565b9063ffffffff6121af16565b91505b6000612cf1670de0b6b3a76400006129ea612ce8868363ffffffff61215b16565b8860020261221b565b9050612cfd8882612239565b93505050505b949350505050565b60006105c36ec097ce7bc90715b34b9f10000000008363ffffffff6121e916565b612d828363a9059cbb60e01b8484604051602401612d4b929190613848565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613117565b505050565b6000808611612da85760405162461bcd60e51b8152600401610731906139a0565b83612db557506000612ffe565b81612de25784612dc58486612239565b11612dd957612dd48385612239565b612ddb565b845b9050612ffe565b670de0b6b3a7640000821415612ea257600080612e05858763ffffffff6121af16565b905080612e155760009150612e6e565b868188830281612e2157fe5b041415612e5157612e4a612e3b898063ffffffff6121af16565b8289029063ffffffff6121e916565b9150612e6e565b612e6b88610b7f87612cb883838c8e63ffffffff6121af16565b91505b612e99612e8983670de0b6b3a764000063ffffffff61218316565b610b7f898563ffffffff6121af16565b92505050612ffe565b6000612ecf612eb7858763ffffffff6121af16565b6129ea89612cb88a610b7f898463ffffffff6121af16565b90506000612eef87612cb8670de0b6b3a76400008763ffffffff61215b16565b90506000828210612f0557508190036000612f0b565b50810360015b612f2382670de0b6b3a764000063ffffffff6121e916565b91506000612f5a612f476004612cb8670de0b6b3a76400008a63ffffffff61215b16565b612f558c612cb88a8f612239565b612239565b9050612f73612c82826129ea868063ffffffff6121af16565b90506000612f946002612cb8670de0b6b3a76400008a63ffffffff61215b16565b905060008315612fb557612fae838663ffffffff61215b16565b9050612fc8565b612fc5858463ffffffff61218316565b90505b6000612fd482846131d4565b90508b811115612fee576000975050505050505050612ffe565b8b039650612ffe95505050505050565b95945050505050565b60008086116130285760405162461bcd60e51b8152600401610731906139a0565b600061304a61303d878763ffffffff61215b16565b859063ffffffff6121af16565b9050826130715761306981670de0b6b3a764000063ffffffff6121e916565b915050612ffe565b600061309061308a88610b7f8b8063ffffffff6121af16565b8761221b565b9050600061309e8583612239565b90506130d36ec097ce7bc90715b34b9f1000000000610b7f85612cb8856129ea670de0b6b3a76400008c63ffffffff61215b16565b9998505050505050505050565b80600160028204015b818110156131115780915060028182858161310057fe5b04018161310957fe5b0490506130e9565b50919050565b60006060836001600160a01b031683604051613133919061366c565b6000604051808303816000865af19150503d8060008114613170576040519150601f19603f3d011682016040523d82523d6000602084013e613175565b606091505b5091509150816131975760405162461bcd60e51b815260040161073190613a22565b8051156131ce57808060200190518101906131b29190613511565b6131ce5760405162461bcd60e51b815260040161073190613c43565b50505050565b60006121a8826131f285670de0b6b3a764000063ffffffff6121af16565b9063ffffffff6131fe16565b60008061320b84846121e9565b905082810284038015613223575060010190506105c3565b5090506105c3565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061326c57805160ff1916838001178555613299565b82800160010185558215613299579182015b8281111561329957825182559160200191906001019061327e565b506132a59291506132f0565b5090565b6040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600060028111156132eb57fe5b905290565b610fc591905b808211156132a557600081556001016132f6565b80356001600160a01b03811681146105c357600080fd5b60008083601f840112613332578182fd5b50813567ffffffffffffffff811115613349578182fd5b6020830191508360208285010111156124e357600080fd5b600060208284031215613372578081fd5b6121a8838361330a565b6000806040838503121561338e578081fd5b613398848461330a565b91506133a7846020850161330a565b90509250929050565b600080600080600080600080610100898b0312156133cc578384fd5b6133d68a8a61330a565b97506133e58a60208b0161330a565b96506133f48a60408b0161330a565b95506060890135945061340a8a60808b0161330a565b935060a0890135925060c0890135915060e089013561342881613e2f565b809150509295985092959890939650565b60008060006060848603121561344d578283fd5b833561345881613e1a565b9250602084013561346881613e1a565b929592945050506040919091013590565b600080600080600080600060e0888a031215613493578283fd5b61349d898961330a565b96506134ac8960208a0161330a565b9550604088013594506060880135935060808801356134ca81613e3d565b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156134f9578182fd5b613503848461330a565b946020939093013593505050565b600060208284031215613522578081fd5b81516121a881613e2f565b60006020828403121561353e578081fd5b5051919050565b600080600080600080600060c0888a03121561355f578283fd5b87359650602088013561357181613e1a565b95506040880135945060608801359350608088013567ffffffffffffffff81111561359a578384fd5b6135a68a828b01613321565b989b979a5095989497959660a090950135949350505050565b6000806000806000608086880312156135d6578081fd5b85359450602086013593506135ee876040880161330a565b9250606086013567ffffffffffffffff811115613609578182fd5b61361588828901613321565b969995985093965092949392505050565b600060208284031215613637578081fd5b81516121a881613e3d565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b6000825161367e818460208701613dee565b9190910192915050565b60008083546001808216600081146136a757600181146136be576136ed565b60ff198316865260028304607f16860193506136ed565b600283048786526020808720875b838110156136e55781548a8201529085019082016136cc565b505050860193505b509195945050505050565b6000845161370a818460208901613dee565b845190830161371d828260208901613dee565b8451918101613730838260208901613dee565b9091019695505050505050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b600060018060a01b0387168252856020830152846040830152608060608301526137c3608083018486613642565b979650505050505050565b600060018060a01b038816825286602083015285604083015284606083015260a0608083015261380260a083018486613642565b98975050505050505050565b6001600160a01b0396871681529486166020860152604085019390935260608401919091528316608083015290911660a082015260c00190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b901515815260200190565b90815260200190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b93845260ff9290921660208401526040830152606082015260800190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b6000602082528251806020840152613933816040850160208701613dee565b601f01601f19169190910160400192915050565b60208082526011908201527011931054d217d313d05397d19052531151607a1b604082015260600190565b60208082526014908201527308298989eae829c868abe9c9ea8be8a9c9eaa8e960631b604082015260600190565b6020808252600e908201526d5441524745545f49535f5a45524f60901b604082015260600190565b60208082526009908201526814915153951490539560ba1b604082015260600190565b6020808252601a908201527f424153455f51554f54455f43414e5f4e4f545f42455f53414d45000000000000604082015260600190565b6020808252818101527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604082015260600190565b6020808252600d908201526c1393d7d09054d157d253941555609a1b604082015260600190565b6020808252600e908201526d2224ab24a224a723afa2a92927a960911b604082015260600190565b6020808252600f908201526e11159357d253925512505312569151608a1b604082015260600190565b6020808252600c908201526b1352539517d253959053125160a21b604082015260600190565b60208082526009908201526829aaa12fa2a92927a960b91b604082015260600190565b6020808252601490820152731113d113d7d1159357d3140e881156141254915160621b604082015260600190565b6020808252601390820152720ae92a89088a482aebe9c9ea8be8a9c9eaa8e9606b1b604082015260600190565b6020808252600e908201526d08898a0be9c9ea8be8a9c9eaa8e960931b604082015260600190565b6020808252601c908201527f494e53554646494349454e545f4c49515549444954595f4d494e454400000000604082015260600190565b6020808252601290820152710848298829c868abe9c9ea8be8a9c9eaa8e960731b604082015260600190565b6020808252600890820152674f564552464c4f5760c01b604082015260600190565b60208082526009908201526820a2222fa2a92927a960b91b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601e908201527f444f444f5f44564d5f4c503a20494e56414c49445f5349474e41545552450000604082015260600190565b6020808252600c908201526b1512535157d156141254915160a21b604082015260600190565b60208082526009908201526826aaa62fa2a92927a960b91b604082015260600190565b600060e082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160038110613d5a57fe5b8060c08401525092915050565b6001600160701b0391909116815260200190565b918252602082015260400190565b9283526020830191909152604082015260600190565b968752602087019590955260408601939093526060850191909152608084015260a083015260c082015260e00190565b63ffffffff91909116815260200190565b60ff91909116815260200190565b60005b83811015613e09578181015183820152602001613df1565b838111156131ce5750506000910152565b6001600160a01b038116811461269257600080fd5b801515811461269257600080fd5b60ff8116811461269257600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efc2c0245e056d5fb095f04cd6373bc770802ebd1e6c918eb78fdef843cdb37b0fa264697066735822122067ef193f677e7c93cc080187cd0e2df07be3617724211497f53c6827beb19a7464736f6c63430006090033