[ { "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": false, "internalType": "uint256", "name": "newI", "type": "uint256" } ], "name": "IChange", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "newK", "type": "uint256" } ], "name": "KChange", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "newLpFee", "type": "uint256" } ], "name": "LpFeeRateChange", "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": "uint256", "name": "newMtFee", "type": "uint256" } ], "name": "MtFeeRateChange", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "enum PMMPricing.RState", "name": "newRState", "type": "uint8" } ], "name": "RChange", "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" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "token", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "WithdrawMtFee", "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": "_ADMIN_", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "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_TARGET_", "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_BASE_", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "_MT_FEE_QUOTE_", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "_MT_FEE_RATE_", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "_MT_FEE_RATE_MODEL_", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "_PRICE_LIMIT_", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "_QUOTE_RESERVE_", "outputs": [ { "internalType": "uint112", "name": "", "type": "uint112" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "_QUOTE_TARGET_", "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": [], "name": "_RState_", "outputs": [ { "internalType": "uint32", "name": "", "type": "uint32" } ], "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": "uint256", "name": "k", "type": "uint256" } ], "name": "adjustK", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "lpFeeRate", "type": "uint256" } ], "name": "adjustLpFeeRate", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "mtFeeRate", "type": "uint256" } ], "name": "adjustMtFeeRate", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "i", "type": "uint256" } ], "name": "adjustPrice", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "priceLimit", "type": "uint256" } ], "name": "adjustPriceLimit", "outputs": [], "stateMutability": "nonpayable", "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": [], "name": "buildDomainSeparator", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "nonpayable", "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": "correctRState", "outputs": [], "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": "getMtFeeTotal", "outputs": [ { "internalType": "uint256", "name": "mtFeeBase", "type": "uint256" }, { "internalType": "uint256", "name": "mtFeeQuote", "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": "admin", "type": "address" }, { "internalType": "address", "name": "baseTokenAddress", "type": "address" }, { "internalType": "address", "name": "quoteTokenAddress", "type": "address" }, { "internalType": "uint256", "name": "lpFeeRate", "type": "uint256" }, { "internalType": "uint256", "name": "mtFeeRate", "type": "uint256" }, { "internalType": "uint256", "name": "i", "type": "uint256" }, { "internalType": "uint256", "name": "k", "type": "uint256" }, { "internalType": "uint256", "name": "priceLimit", "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" }, { "internalType": "enum PMMPricing.RState", "name": "newRState", "type": "uint8" }, { "internalType": "uint256", "name": "newBaseTarget", "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" }, { "internalType": "enum PMMPricing.RState", "name": "newRState", "type": "uint8" }, { "internalType": "uint256", "name": "newQuoteTarget", "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" }, { "inputs": [], "name": "withdrawMtFeeTotal", "outputs": [], "stateMutability": "nonpayable", "type": "function" } ]
60806040526001805461ff0019169055601780546001600160a01b031916905534801561002b57600080fd5b506001600055614b35806100406000396000f3fe608060405234801561001057600080fd5b50600436106103a45760003560e01c806395d89b41116101e9578063d505accf1161010f578063ee27c689116100ad578063fcf709f71161007c578063fcf709f71461087d578063fd1ed7e914610888578063fe24cb7f146108c5578063fff6cae9146108ce57600080fd5b8063ee27c68914610851578063f5346aea14610859578063f6b06e7014610861578063f811d6921461087457600080fd5b8063e539ef49116100e9578063e539ef491461081a578063e6485c8e1461082d578063eb99da6a14610840578063ec2fd46d1461084857600080fd5b8063d505accf146107bb578063dd62ed3e146107ce578063dd93f59a1461080757600080fd5b8063bbf5ce7811610187578063c0ffa17811610156578063c0ffa17814610779578063c61e256714610782578063d0a494e414610795578063d4b97046146107a857600080fd5b8063bbf5ce781461072c578063bd6015b414610746578063bf357dae14610759578063bfdbd7231461077057600080fd5b8063a9059cbb116101c3578063a9059cbb146106ea578063ab44a7a3146106fd578063b56ceaa614610706578063b59b85551461071957600080fd5b806395d89b41146106ba578063996cd0c8146106c2578063a382d1b9146106d557600080fd5b80634a248d2a116102ce57806371f9100c1161026c57806379a048761161023b57806379a04876146106485780637d7215041461065b5780637ecebe001461066e578063880a4d871461068e57600080fd5b806371f9100c146105f357806372bf079e146105fb57806373d74cf81461060e57806377f586571461061657600080fd5b806363ab5993116102a857806363ab59931461058c57806365f6fcbb1461059f57806366410a21146105a757806370a08231146105ca57600080fd5b80634a248d2a146105265780634c85b4251461053957806354fd4d501461056757600080fd5b806330adf81f116103465780633afdfeba116103155780633afdfeba146104ca5780634322ec83146104d3578063440966091461050457806347bbad2e1461051d57600080fd5b806330adf81f1461044e578063313ce5671461047557806336223ce9146104945780633644e515146104c157600080fd5b8063171019401161038257806317101940146103ff57806318160ddd1461041257806323b872dd146104295780632df6cb481461043c57600080fd5b8063039658d1146103a957806306fdde03146103be578063095ea7b3146103dc575b600080fd5b6103bc6103b7366004614262565b6108d6565b005b6103c6610b70565b6040516103d39190614321565b60405180910390f35b6103ef6103ea366004614354565b610bfe565b60405190151581526020016103d3565b6103c661040d36600461437e565b610c15565b61041b600b5481565b6040519081526020016103d3565b6103ef610437366004614399565b610d98565b6001546103ef90610100900460ff1681565b61041b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b6009546104829060ff1681565b60405160ff90911681526020016103d3565b6005546001600160701b0380821691600160701b9004165b604080519283526020830191909152016103d3565b61041b600e5481565b61041b60145481565b6001546104ec906201000090046001600160a01b031681565b6040516001600160a01b0390911681526020016103d3565b6104ac61051236600461437e565b506011546010549091565b61041b60165481565b6003546104ec906001600160a01b031681565b61054c61054736600461437e565b610f48565b604080519384526020840192909252908201526060016103d3565b60408051808201909152600981526847535020312e302e3160b81b60208201526103c6565b6002546104ec906001600160a01b031681565b61041b6113b2565b6105ba6105b5366004614354565b61144a565b6040516103d3949392919061440d565b61041b6105d836600461437e565b6001600160a01b03166000908152600c602052604090205490565b61041b6114b3565b6103bc610609366004614437565b611501565b6103bc61161c565b60075461063090600160701b90046001600160701b031681565b6040516001600160701b0390911681526020016103d3565b6105ba610656366004614354565b6116d3565b600554610630906001600160701b031681565b61041b61067c36600461437e565b600f6020526000908152604090205481565b6005546106a590600160e01b900463ffffffff1681565b60405163ffffffff90911681526020016103d3565b6103c661173c565b6103bc6106d0366004614437565b611749565b6106dd611803565b6040516103d39190614450565b6103ef6106f8366004614354565b6118a5565b61041b60115481565b6104ac6107143660046144e9565b611991565b6103bc610727366004614437565b611d6b565b60055461063090600160701b90046001600160701b031681565b61041b61075436600461437e565b611e1e565b6007546106a590600160e01b900463ffffffff1681565b61041b60155481565b61041b60105481565b6103bc610790366004614437565b612097565b6103bc6107a3366004614563565b612140565b6004546104ec906001600160a01b031681565b6103bc6107c93660046145da565b612700565b61041b6107dc366004614647565b6001600160a01b039182166000908152600d6020908152604080832093909416825291909152205490565b61041b61081536600461437e565b612916565b600754610630906001600160701b031681565b6103bc61083b366004614437565b612b83565b6103bc612c21565b61041b60125481565b61041b612d35565b61041b612d47565b6017546104ec906001600160a01b031681565b61041b60135481565b6015546016546104ac565b610890612e4f565b604080519788526020880196909652948601939093526060850191909152608084015260a083015260c082015260e0016103d3565b61041b60065481565b6103bc612eb1565b60015460ff16156109205760405162461bcd60e51b815260206004820152600f60248201526e11d4d417d253925512505312569151608a1b60448201526064015b60405180910390fd5b6001805460ff1916811790556001600160a01b03808816908916036109875760405162461bcd60e51b815260206004820152601a60248201527f424153455f51554f54455f43414e5f4e4f545f42455f53414d450000000000006044820152606401610917565b600380546001600160a01b03808b166001600160a01b03199283161790925560048054928a169290911691909117905583158015906109d557506ec097ce7bc90715b34b9f10000000008411155b6109de57600080fd5b6013849055670de0b6b3a76400008311156109f857600080fd5b60128390556011869055601085905560018054600280546001600160a01b038d81166001600160a01b031990921691909117909155601485905561ff0019908d16620100000216610100600160b01b0319909116178155604080518082018252918252605f60f81b6020808401919091528151808301909252600382526204753560ec1b908201528082610a8b30610c15565b604051602001610a9d9392919061467a565b604051602081830303815290604052600a9081610aba919061475b565b506040805180820190915260038152620474c560ec1b6020820152600890610ae2908261475b565b50896001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b45919061481b565b6009805460ff191660ff92909216919091179055610b61612d47565b50505050505050505050505050565b600a8054610b7d906146d3565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba9906146d3565b8015610bf65780601f10610bcb57610100808354040283529160200191610bf6565b820191906000526020600020905b815481529060010190602001808311610bd957829003601f168201915b505050505081565b6000610c0b338484612ecb565b5060015b92915050565b604080518082018252601081526f181899199a1a9b1b9c1cb0b131b232b360811b6020820152815160088082528184019093526060926001600160a01b038516929160009160208201818036833701905050905060005b6004811015610d8f5782600485610c8484600c61484e565b60208110610c9457610c94614861565b1a60f81b6001600160f81b031916901c60f81c60ff1681518110610cba57610cba614861565b01602001516001600160f81b03191682610cd5836002614877565b81518110610ce557610ce5614861565b60200101906001600160f81b031916908160001a9053508284610d0983600c61484e565b60208110610d1957610d19614861565b825191901a600f16908110610d3057610d30614861565b01602001516001600160f81b03191682610d4b836002614877565b610d5690600161484e565b81518110610d6657610d66614861565b60200101906001600160f81b031916908160001a90535080610d8781614896565b915050610c6c565b50949350505050565b6001600160a01b0383166000908152600c6020526040812054821115610df55760405162461bcd60e51b81526020600482015260126024820152710848298829c868abe9c9ea8be8a9c9eaa8e960731b6044820152606401610917565b6001600160a01b0384166000908152600d60209081526040808320338452909152902054821115610e5f5760405162461bcd60e51b815260206004820152601460248201527308298989eae829c868abe9c9ea8be8a9c9eaa8e960631b6044820152606401610917565b6001600160a01b0384166000908152600c6020526040902054610e839083906148af565b6001600160a01b038086166000908152600c60205260408082209390935590851681522054610eb390839061484e565b6001600160a01b038085166000908152600c60209081526040808320949094559187168152600d82528281203382529091522054610ef29083906148af565b6001600160a01b038581166000818152600d602090815260408083203384528252918290209490945551858152918616929091600080516020614aa0833981519152910160405180910390a35060019392505050565b6000806000610f55612f2c565b6015546003546040516370a0823160e01b8152306004820152600092916001600160a01b0316906370a0823190602401602060405180830381865afa158015610fa2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc691906148c2565b610fd091906148af565b601654600480546040516370a0823160e01b815230928101929092529293506000926001600160a01b0316906370a0823190602401602060405180830381865afa158015611022573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104691906148c2565b61105091906148af565b6005549091506001600160701b0380821691600160701b90041661107482856148af565b955061108081846148af565b9450600086116110c25760405162461bcd60e51b815260206004820152600d60248201526c1393d7d09054d157d253941555609a1b6044820152606401610917565b600b5460000361123b57600083116111105760405162461bcd60e51b815260206004820152601160248201527016915493d7d45553d51157d05353d55395607a1b6044820152606401610917565b61111c84601354612f85565b83106111285783611134565b61113483601354612fab565b600780546001600160701b0319166001600160701b038316179055601354909750611160908890612f85565b60078054600160701b600160e01b031916600160701b6001600160701b03938416810291909117918290559004166111d15760405162461bcd60e51b815260206004820152601460248201527351554f54455f5441524745545f49535f5a45524f60601b6044820152606401610917565b6107d1871161121b5760405162461bcd60e51b815260206004820152601660248201527509a929ca8be829a9eaa9ca8be9c9ea8be8a9c9eaa8e960531b6044820152606401610917565b61122860006103e9612fc0565b6112346103e9886148af565b9650611332565b60008211801561124b5750600081115b1561133257600061125c8784612fab565b9050600061126a8784612fab565b9050600082821061127b578261127d565b815b905061128b600b5482612f85565b600754909a506112a4906001600160701b031682612f85565b6007546112ba91906001600160701b031661484e565b600780546001600160701b0319166001600160701b0392831617908190556112eb91600160701b9091041682612f85565b6007546113089190600160701b90046001600160701b031661484e565b6007600e6101000a8154816001600160701b0302191690836001600160701b031602179055505050505b61133c8888612fc0565b61134684846130ca565b6001600160a01b0388166000818152600c60209081526040918290205482519384529083018a905282820152517f1c172440bdebb59cd92a7f08f4227903a3305ab6f880cb25f93eddb66843a1029181900360600190a1505050506113ab6001600055565b9193909250565b6015546005546003546040516370a0823160e01b8152306004820152600093926001600160701b0316916001600160a01b0316906370a08231906024015b602060405180830381865afa15801561140d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143191906148c2565b61143b91906148af565b61144591906148af565b905090565b600080600080600061145a611803565b90506114668187613135565b6011546010549297509094509061147d8782612f85565b95508561148a8884612f85565b61149490896148af565b61149e91906148af565b96508260a00151935050505092959194509250565b601654600554600480546040516370a0823160e01b8152309281019290925260009392600160701b90046001600160701b0316916001600160a01b03909116906370a08231906024016113f0565b6002546001600160a01b031633146115515760405162461bcd60e51b8152602060048201526013602482015272105113525397d050d0d154d4d7d11153925151606a1b6044820152606401610917565b6000601354821161156f578160135461156a91906148af565b61157c565b60135461157c90836148af565b905060145460135482620f42406115939190614877565b61159d91906148f1565b11156115e05760405162461bcd60e51b8152602060048201526012602482015271115610d1515117d4149250d157d31253525560721b6044820152606401610917565b60138290556040518281527f0caf6249df528dcb5afe9adf7a20744e990b338c3d1ca3adedd6362d2db048449060200160405180910390a15050565b60075463ffffffff600160e01b90910416600214801561164c57506007546005546001600160701b039182169116105b1561167157600554600160701b8082046001600160701b039081169091029116176007555b60075463ffffffff600160e01b9091041660011480156116ac57506007546005546001600160701b03600160701b9283900481169290910416105b156116d157600554600160701b8082046001600160701b039081169091029116176007555b565b60008060008060006116e3611803565b90506116ef818761322a565b601154601054929750909450906117068782612f85565b9550856117138884612f85565b61171d90896148af565b61172791906148af565b96508260800151935050505092959194509250565b60088054610b7d906146d3565b6001546201000090046001600160a01b031633146117795760405162461bcd60e51b815260040161091790614913565b670de0b6b3a76400008111156117c75760405162461bcd60e51b8152602060048201526013602482015272494e56414c49445f4c505f4645455f5241544560681b6044820152606401610917565b60118190556040518181527f9950d5a2f2c7264863d40100bf993f0cdbc4711806caba6284d07e80fd500879906020015b60405180910390a150565b61180b6141f0565b601354815260125460208201526005546001600160701b038082166040840152600160701b918290048116606084015260075480821660808501529182041660a0830152600160e01b900463ffffffff16600281111561186d5761186d6143d5565b8160c001906002811115611883576118836143d5565b90816002811115611896576118966143d5565b9052506118a281613327565b90565b336000908152600c60205260408120548211156118f95760405162461bcd60e51b81526020600482015260126024820152710848298829c868abe9c9ea8be8a9c9eaa8e960731b6044820152606401610917565b336000908152600c60205260409020546119149083906148af565b336000908152600c6020526040808220929092556001600160a01b0385168152205461194190839061484e565b6001600160a01b0384166000818152600c6020526040908190209290925590513390600080516020614aa0833981519152906119809086815260200190565b60405180910390a350600192915050565b60008061199c612f2c565b428310156119db5760405162461bcd60e51b815260206004820152600c60248201526b1512535157d156141254915160a21b6044820152606401610917565b336000908152600c6020526040902054891115611a2b5760405162461bcd60e51b815260206004820152600e60248201526d08e98a0be9c9ea8be8a9c9eaa8e960931b6044820152606401610917565b6015546003546040516370a0823160e01b8152306004820152600092916001600160a01b0316906370a0823190602401602060405180830381865afa158015611a78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9c91906148c2565b611aa691906148af565b601654600480546040516370a0823160e01b815230928101929092529293506000926001600160a01b0316906370a0823190602401602060405180830381865afa158015611af8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b1c91906148c2565b611b2691906148af565b600b5490915080611b378d85614877565b611b4191906148f1565b945080611b4e8d84614877565b611b5891906148f1565b600754909450611b7c90611b76908e906001600160701b0316614877565b826133cb565b600754611b9291906001600160701b03166148af565b600780546001600160701b0319166001600160701b039283161790819055611bc891611b76918f91600160701b90910416614877565b600754611be59190600160701b90046001600160701b03166148af565b6007600e6101000a8154816001600160701b0302191690836001600160701b03160217905550898510158015611c1b5750888410155b611c5d5760405162461bcd60e51b81526020600482015260136024820152720ae92a89088a482aebe9c9ea8be8a9c9eaa8e9606b1b6044820152606401610917565b611c67338d613414565b611c718b866134cc565b611c7b8b856134ed565b611c8361350a565b8615611cf2578a6001600160a01b0316632411d338338e88888d8d6040518763ffffffff1660e01b8152600401611cbf96959493929190614963565b600060405180830381600087803b158015611cd957600080fd5b505af1158015611ced573d6000803e3d6000fd5b505050505b336000818152600c60209081526040918290205482519384526001600160a01b038f16918401919091528282018f90526060830152517f55caccde83781f39bfc1296eff45655b6496729443a7d48958b18b3b685600a59181900360800190a1505050611d5f6001600055565b97509795505050505050565b6001546201000090046001600160a01b03163314611d9b5760405162461bcd60e51b815260040161091790614913565b670de0b6b3a7640000811115611de95760405162461bcd60e51b8152602060048201526013602482015272494e56414c49445f4d545f4645455f5241544560681b6044820152606401610917565b60108190556040518181527fc9ec0c7a5c9e8424f73dce9c8a6ad565757953517e4f472e243c0955aa11322e906020016117f8565b6000611e28612f2c565b6015546003546040516370a0823160e01b8152306004820152600092916001600160a01b0316906370a0823190602401602060405180830381865afa158015611e75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9991906148c2565b611ea391906148af565b600554909150600090611ebf906001600160701b0316836148af565b90506000806000611ed032856116d3565b9298509094509092509050611ee587876134ed565b82601654611ef3919061484e565b601655806002811115611f0857611f086143d5565b600754600160e01b900463ffffffff908116911614611fbb576001600160701b03821115611f485760405162461bcd60e51b8152600401610917906149a3565b600780546001600160701b0319166001600160701b038416179055806002811115611f7557611f756143d5565b6007601c6101000a81548163ffffffff021916908363ffffffff160217905550600080516020614ac083398151915281604051611fb291906149c5565b60405180910390a15b601654600480546040516370a0823160e01b8152309281019290925261204292889290916001600160a01b0316906370a0823190602401602060405180830381865afa15801561200f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203391906148c2565b61203d91906148af565b6130ca565b600354600454604051600080516020614ae08339815191529261207b926001600160a01b039182169291169088908b9033908e906149d3565b60405180910390a150505050506120926001600055565b919050565b6001546201000090046001600160a01b031633146120c75760405162461bcd60e51b815260040161091790614913565b670de0b6b3a764000081111561210b5760405162461bcd60e51b8152602060048201526009602482015268494e56414c49445f4b60b81b6044820152606401610917565b60128190556040518181527f92827143f5edde333105d346d127d03b2dfb4a45884d5a88f085654ca3d866d2906020016117f8565b612148612f2c565b61215283866134cc565b61215c83856134ed565b80156121c95760405163d5b9979760e01b81526001600160a01b0384169063d5b99797906121969033908990899088908890600401614a0d565b600060405180830381600087803b1580156121b057600080fd5b505af11580156121c4573d6000803e3d6000fd5b505050505b6015546003546040516370a0823160e01b8152306004820152600092916001600160a01b0316906370a0823190602401602060405180830381865afa158015612216573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061223a91906148c2565b61224491906148af565b601654600480546040516370a0823160e01b815230928101929092529293506000926001600160a01b0316906370a0823190602401602060405180830381865afa158015612296573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ba91906148c2565b6122c491906148af565b6005549091506001600160701b0316821015806122f35750600554600160701b90046001600160701b03168110155b61230f5760405162461bcd60e51b815260040161091790614a3b565b6005546001600160701b03168210156124d35760055460009061234290600160701b90046001600160701b0316836148af565b9050600080600080612354328661144a565b6005549397509195509350915084906123779089906001600160701b03166148af565b11156123955760405162461bcd60e51b815260040161091790614a3b565b826015546123a3919061484e565b6015558160028111156123b8576123b86143d5565b600754600160e01b900463ffffffff908116911614612474576001600160701b038111156123f85760405162461bcd60e51b8152600401610917906149a3565b60078054600160701b600160e01b031916600160701b6001600160701b0384160217905581600281111561242e5761242e6143d5565b6007601c6101000a81548163ffffffff021916908363ffffffff160217905550600080516020614ac08339815191528260405161246b91906149c5565b60405180910390a15b600080516020614ae0833981519152600460009054906101000a90046001600160a01b0316600360009054906101000a90046001600160a01b03168787338f6040516124c5969594939291906149d3565b60405180910390a150505050505b600554600160701b90046001600160701b031681101561269557600554600090612506906001600160701b0316846148af565b905060008060008061251832866116d3565b600554939750919550935091508490612542908890600160701b90046001600160701b03166148af565b11156125605760405162461bcd60e51b815260040161091790614a3b565b8260165461256e919061484e565b601655816002811115612583576125836143d5565b600754600160e01b900463ffffffff908116911614612636576001600160701b038111156125c35760405162461bcd60e51b8152600401610917906149a3565b600780546001600160701b0319166001600160701b0383161790558160028111156125f0576125f06143d5565b6007601c6101000a81548163ffffffff021916908363ffffffff160217905550600080516020614ac08339815191528260405161262d91906149c5565b60405180910390a15b600080516020614ae0833981519152600360009054906101000a90046001600160a01b0316600460009054906101000a90046001600160a01b03168787338f604051612687969594939291906149d3565b60405180910390a150505050505b61269d61350a565b604080513381526001600160a01b0387166020820152908101889052606081018790527f0b82e93068db15abd9fbb2682c65462ea8a0a10582dce93a5664818e296f54eb9060800160405180910390a150506126f96001600055565b5050505050565b428410156127475760405162461bcd60e51b81526020600482015260146024820152731113d113d7d1d4d417d3140e881156141254915160621b6044820152606401610917565b600e546001600160a01b0388166000908152600f6020526040812080549192917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b91908761279a83614896565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e0016040516020818303038152906040528051906020012060405160200161281392919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa15801561287e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906128b45750886001600160a01b0316816001600160a01b0316145b6129005760405162461bcd60e51b815260206004820152601e60248201527f444f444f5f4753505f4c503a20494e56414c49445f5349474e415455524500006044820152606401610917565b61290b898989612ecb565b505050505050505050565b6000612920612f2c565b601654600480546040516370a0823160e01b81523092810192909252600092916001600160a01b03909116906370a0823190602401602060405180830381865afa158015612972573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061299691906148c2565b6129a091906148af565b6005549091506000906129c390600160701b90046001600160701b0316836148af565b905060008060006129d4328561144a565b92985090945090925090506129e987876134cc565b826015546129f7919061484e565b601555806002811115612a0c57612a0c6143d5565b600754600160e01b900463ffffffff908116911614612ac8576001600160701b03821115612a4c5760405162461bcd60e51b8152600401610917906149a3565b60078054600160701b600160e01b031916600160701b6001600160701b03851602179055806002811115612a8257612a826143d5565b6007601c6101000a81548163ffffffff021916908363ffffffff160217905550600080516020614ac083398151915281604051612abf91906149c5565b60405180910390a15b6015546003546040516370a0823160e01b8152306004820152612b4a92916001600160a01b0316906370a0823190602401602060405180830381865afa158015612b16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b3a91906148c2565b612b4491906148af565b866130ca565b600454600354604051600080516020614ae08339815191529261207b926001600160a01b039182169291169088908b9033908e906149d3565b6002546001600160a01b03163314612bd35760405162461bcd60e51b8152602060048201526013602482015272105113525397d050d0d154d4d7d11153925151606a1b6044820152606401610917565b620f4240811115612c1c5760405162461bcd60e51b81526020600482015260136024820152721253959053125117d4149250d157d312535255606a1b6044820152606401610917565b601455565b612c29612f2c565b6001546201000090046001600160a01b03163314612c595760405162461bcd60e51b815260040161091790614913565b601680546015546000909255600154909190612c84906201000090046001600160a01b0316836134ed565b6000601555600154612ca5906201000090046001600160a01b0316826134cc565b6004546040518381526001600160a01b03909116907fe9b6b9af52fdb56b6ac34a0639bcf8e407008374741c7a0e187da490755b6bfc9060200160405180910390a26003546040518281526001600160a01b03909116907fe9b6b9af52fdb56b6ac34a0639bcf8e407008374741c7a0e187da490755b6bfc9060200160405180910390a250506116d16001600055565b6000611445612d42611803565b6136b2565b60408051808201825260018152605f60f81b6020808301919091528251808401909352600383526204753560ec1b90830152600091828183612d8830610c15565b604051602001612d9a9392919061467a565b60408051601f198184030181528282528051602091820120838301835260018452603160f81b9382019390935281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81830152808301939093527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608401524660808401523060a0808501919091528251808503909101815260c09093019091528151910120600e819055949350505050565b600080600080600080600080612e63611803565b905080600001519750806020015196508060400151955080606001519450806080015193508060a0015192508060c001516002811115612ea557612ea56143d5565b91505090919293949596565b612eb9612f2c565b612ec161350a565b6116d16001600055565b6001600160a01b038381166000818152600d602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600260005403612f7e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610917565b6002600055565b6000670de0b6b3a7640000612f9a8385614877565b612fa491906148f1565b9392505050565b600081612f9a84670de0b6b3a7640000614877565b6103e8811161300a5760405162461bcd60e51b815260206004820152601660248201527509a929ca8be829a9eaa9ca8be9c9ea8be8a9c9eaa8e960531b6044820152606401610917565b6001600160a01b0382166000908152600c602052604090205461302e90829061484e565b6001600160a01b0383166000908152600c6020526040902055600b5461305590829061484e565b600b556040518181526001600160a01b038316907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968859060200160405180910390a26040518181526001600160a01b03831690600090600080516020614aa0833981519152906020015b60405180910390a35050565b6001600160701b0382118015906130e857506001600160701b038111155b6131045760405162461bcd60e51b8152600401610917906149a3565b600580546001600160701b03928316600160701b026001600160e01b03199091169290931691909117919091179055565b600080808460c00151600281111561314f5761314f6143d5565b036131695761315e84846137b1565b915060019050613223565b60018460c001516002811115613181576131816143d5565b036131905761315e84846137d8565b600084606001518560a001516131a691906148af565b90506000856080015186604001516131be91906148af565b9050818510156131e9576131d286866137f5565b935060029250808411156131e4578093505b613220565b8185036131fc5780935060009250613220565b61320f8661320a84886148af565b6137b1565b613219908261484e565b9350600192505b50505b9250929050565b600080808460c001516002811115613244576132446143d5565b0361325e576132538484613829565b915060029050613223565b60018460c001516002811115613276576132766143d5565b036133125760008460400151856080015161329191906148af565b905060008560a0015186606001516132a991906148af565b9050818510156132d4576132bd8686613848565b935060019250808411156132cf578093505b61330b565b8185036132e7578093506000925061330b565b6132fa866132f584886148af565b613829565b613304908261484e565b9350600292505b5050613223565b61331c8484613873565b946002945092505050565b60028160c00151600281111561333f5761333f6143d5565b036133745761336c81606001518260800151836040015161336091906148af565b83516020850151613892565b60a082015250565b60018160c00151600281111561338c5761338c6143d5565b036133c8576133c281604001518260a0015183606001516133ad91906148af565b83516133b8906139ca565b8460200151613892565b60808201525b50565b6000806133d883856148f1565b905060006133e68483614877565b6133f090866148af565b9050801561340c5761340382600161484e565b92505050610c0f565b509050610c0f565b6001600160a01b0382166000908152600c60205260409020546134389082906148af565b6001600160a01b0383166000908152600c6020526040902055600b5461345f9082906148af565b600b556040518181526001600160a01b038316907fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59060200160405180910390a26040518181526000906001600160a01b03841690600080516020614aa0833981519152906020016130be565b80156134e9576003546134e9906001600160a01b031683836139e5565b5050565b80156134e9576004546134e9906001600160a01b031683836139e5565b6015546003546040516370a0823160e01b8152306004820152600092916001600160a01b0316906370a0823190602401602060405180830381865afa158015613557573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061357b91906148c2565b61358591906148af565b601654600480546040516370a0823160e01b815230928101929092529293506000926001600160a01b0316906370a0823190602401602060405180830381865afa1580156135d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135fb91906148c2565b61360591906148af565b90506001600160701b03821180159061362557506001600160701b038111155b6136415760405162461bcd60e51b8152600401610917906149a3565b6005546001600160701b0316821461366f57600580546001600160701b0319166001600160701b0384161790555b600554600160701b90046001600160701b031681146134e957600580546001600160701b038316600160701b02600160701b600160e01b03199091161790555050565b600060028260c0015160028111156136cc576136cc6143d5565b0361374157606082015160a0830151600091613700916136ec9080614877565b6136f691906148f1565b8460600151612fab565b9050613710836020015182612f85565b602084015161372790670de0b6b3a76400006148af565b613731919061484e565b9050612fa4836000015182612fab565b604082015160808301516000916137709161375c9080614877565b61376691906148f1565b8460400151612fab565b9050613780836020015182612f85565b602084015161379790670de0b6b3a76400006148af565b6137a1919061484e565b9050612fa4836000015182612f85565b6000612fa483608001518460800151846137ce87600001516139ca565b8760200151613a3c565b6000612fa483608001518460400151846137ce87600001516139ca565b6000612fa48360a0015183856060015161380f919061484e565b6060860151865161381f906139ca565b8760200151613d4e565b6000612fa48360a001518460a001518486600001518760200151613a3c565b6000612fa48360800151838560400151613862919061484e565b604086015186516020880151613d4e565b6000612fa48360a0015184606001518486600001518760200151613a3c565b6000816000036138b7576138a68385612f85565b6138b0908661484e565b90506139c2565b846000036138c7575060006139c2565b600080846138d6856004614877565b6138e09190614877565b9050806000036138fa57670de0b6b3a7640000915061397e565b85816139068282614877565b61391091906148f1565b036139535761394c6ec097ce7bc90715b34b9f1000000000886139338985614877565b61393d91906148f1565b613947919061484e565b613e49565b915061397e565b61397b6ec097ce7bc90715b34b9f1000000000876139718a856148f1565b61393d9190614877565b91505b6000670de0b6b3a76400006139a661399682866148af565b6139a1886002614877565b612fab565b6139b0919061484e565b90506139bc8882612f85565b93505050505b949350505050565b6000610c0f826ec097ce7bc90715b34b9f10000000006148f1565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052613a37908490613f31565b505050565b6000808611613a7e5760405162461bcd60e51b815260206004820152600e60248201526d5441524745545f49535f5a45524f60901b6044820152606401610917565b83600003613a8e57506000613d45565b81600003613abe5784613aa18486612f85565b11613ab557613ab08385612f85565b613ab7565b845b9050613d45565b670de0b6b3a76400008203613b8a57600080613ada8686614877565b905080600003613aed5760009150613b5b565b8681613af98282614877565b613b0391906148f1565b03613b2d57613b128880614877565b613b1c8883614877565b613b2691906148f1565b9150613b5b565b878581613b3a8a8a614877565b613b4491906148f1565b613b4e9190614877565b613b5891906148f1565b91505b613b6d670de0b6b3a76400008361484e565b613b778389614877565b613b8191906148f1565b92505050613d45565b6000613b968585614877565b8787613ba28287614877565b613bac91906148f1565b613bb69190614877565b613bc0919061484e565b9050600086613bd785670de0b6b3a76400006148af565b613be19190614877565b90506000828210613c0157613bf683836148af565b915060009050613c12565b613c0b82846148af565b9150600190505b613c24670de0b6b3a7640000836148f1565b91506000613c62613c3d87670de0b6b3a76400006148af565b613c48906004614877565b8b613c53898e612f85565b613c5d9190614877565b612f85565b9050613c728161393d8580614877565b90506000613c8887670de0b6b3a76400006148af565b613c93906002614877565b905060008315613cfe57613ca785846148af565b905080600003613cf95760405162461bcd60e51b815260206004820152601960248201527f444f444f4d6174683a2073686f756c64206e6f742062652030000000000000006044820152606401610917565b613d0b565b613d08838661484e565b90505b6000613d178284614006565b90508b811115613d31576000975050505050505050613d45565b613d3b818d6148af565b9750505050505050505b95945050505050565b6000808611613d905760405162461bcd60e51b815260206004820152600e60248201526d5441524745545f49535f5a45524f60901b6044820152606401610917565b6000613d9c85876148af565b613da69085614877565b905082600003613dca57613dc2670de0b6b3a7640000826148f1565b915050613d45565b6000613dea87613dda8a80614877565b613de491906148f1565b87612fab565b90506000613df88583612f85565b90506ec097ce7bc90715b34b9f10000000008382613e1e88670de0b6b3a76400006148af565b613e28919061484e565b613e329190614877565b613e3c91906148f1565b9998505050505050505050565b600081600003613e5b57506000919050565b60006001613e6884614023565b901c6001901b90506001818481613e8157613e816148db565b048201901c90506001818481613e9957613e996148db565b048201901c90506001818481613eb157613eb16148db565b048201901c90506001818481613ec957613ec96148db565b048201901c90506001818481613ee157613ee16148db565b048201901c90506001818481613ef957613ef96148db565b048201901c90506001818481613f1157613f116148db565b048201901c9050612fa481828581613f2b57613f2b6148db565b046140b7565b6000613f86826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166140cd9092919063ffffffff16565b9050805160001480613fa7575080806020019051810190613fa79190614a66565b613a375760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610917565b6000612fa461401d84670de0b6b3a7640000614877565b836133cb565b600080608083901c1561403857608092831c92015b604083901c1561404a57604092831c92015b602083901c1561405c57602092831c92015b601083901c1561406e57601092831c92015b600883901c1561408057600892831c92015b600483901c1561409257600492831c92015b600283901c156140a457600292831c92015b600183901c15610c0f5760010192915050565b60008183106140c65781612fa4565b5090919050565b60606139c2848460008585600080866001600160a01b031685876040516140f49190614a83565b60006040518083038185875af1925050503d8060008114614131576040519150601f19603f3d011682016040523d82523d6000602084013e614136565b606091505b509150915061414787838387614152565b979650505050505050565b606083156141c15782516000036141ba576001600160a01b0385163b6141ba5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610917565b50816139c2565b6139c283838151156141d65781518083602001fd5b8060405162461bcd60e51b81526004016109179190614321565b6040518060e0016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160006002811115614238576142386143d5565b905290565b80356001600160a01b038116811461209257600080fd5b80151581146133c857600080fd5b6000806000806000806000806000806101408b8d03121561428257600080fd5b61428b8b61423d565b995061429960208c0161423d565b98506142a760408c0161423d565b97506142b560608c0161423d565b965060808b0135955060a08b0135945060c08b0135935060e08b013592506101008b013591506101208b01356142ea81614254565b809150509295989b9194979a5092959850565b60005b83811015614318578181015183820152602001614300565b50506000910152565b60208152600082518060208401526143408160408501602087016142fd565b601f01601f19169190910160400192915050565b6000806040838503121561436757600080fd5b6143708361423d565b946020939093013593505050565b60006020828403121561439057600080fd5b612fa48261423d565b6000806000606084860312156143ae57600080fd5b6143b78461423d565b92506143c56020850161423d565b9150604084013590509250925092565b634e487b7160e01b600052602160045260246000fd5b6003811061440957634e487b7160e01b600052602160045260246000fd5b9052565b848152602081018490526080810161442860408301856143eb565b82606083015295945050505050565b60006020828403121561444957600080fd5b5035919050565b600060e082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c08301516144a060c08401826143eb565b5092915050565b60008083601f8401126144b957600080fd5b50813567ffffffffffffffff8111156144d157600080fd5b60208301915083602082850101111561322357600080fd5b600080600080600080600060c0888a03121561450457600080fd5b873596506145146020890161423d565b95506040880135945060608801359350608088013567ffffffffffffffff81111561453e57600080fd5b61454a8a828b016144a7565b989b979a5095989497959660a090950135949350505050565b60008060008060006080868803121561457b57600080fd5b85359450602086013593506145926040870161423d565b9250606086013567ffffffffffffffff8111156145ae57600080fd5b6145ba888289016144a7565b969995985093965092949392505050565b60ff811681146133c857600080fd5b600080600080600080600060e0888a0312156145f557600080fd5b6145fe8861423d565b965061460c6020890161423d565b95506040880135945060608801359350608088013561462a816145cb565b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561465a57600080fd5b6146638361423d565b91506146716020840161423d565b90509250929050565b6000845161468c8184602089016142fd565b8451908301906146a08183602089016142fd565b84519101906146b38183602088016142fd565b0195945050505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806146e757607f821691505b60208210810361470757634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115613a3757600081815260208120601f850160051c810160208610156147345750805b601f850160051c820191505b8181101561475357828155600101614740565b505050505050565b815167ffffffffffffffff811115614775576147756146bd565b6147898161478384546146d3565b8461470d565b602080601f8311600181146147be57600084156147a65750858301515b600019600386901b1c1916600185901b178555614753565b600085815260208120601f198616915b828110156147ed578886015182559484019460019091019084016147ce565b508582101561480b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121561482d57600080fd5b8151612fa4816145cb565b634e487b7160e01b600052601160045260246000fd5b80820180821115610c0f57610c0f614838565b634e487b7160e01b600052603260045260246000fd5b600081600019048311821515161561489157614891614838565b500290565b6000600182016148a8576148a8614838565b5060010190565b81810381811115610c0f57610c0f614838565b6000602082840312156148d457600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b60008261490e57634e487b7160e01b600052601260045260246000fd5b500490565b6020808252600d908201526c1050d0d154d4d7d11153925151609a1b604082015260600190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60018060a01b038716815285602082015284604082015283606082015260a06080820152600061499760a08301848661493a565b98975050505050505050565b6020808252600890820152674f564552464c4f5760c01b604082015260600190565b60208101610c0f82846143eb565b6001600160a01b0396871681529486166020860152604085019390935260608401919091528316608083015290911660a082015260c00190565b60018060a01b038616815284602082015283604082015260806060820152600061414760808301848661493a565b60208082526011908201527011931054d217d313d05397d19052531151607a1b604082015260600190565b600060208284031215614a7857600080fd5b8151612fa481614254565b60008251614a958184602087016142fd565b919091019291505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efdf176ad18be4f9f32efaa32f06e9d1175476504739a745f1399a6d3fa4b75917c2c0245e056d5fb095f04cd6373bc770802ebd1e6c918eb78fdef843cdb37b0fa2646970667358221220ec2b930d6a11b6f380471fd238e816d2ffa539759f65cd30e4922d204396519f64736f6c63430008100033