[ { "inputs": [], "stateMutability": "nonpayable", "type": "constructor" }, { "inputs": [], "name": "AmountMustBeGreaterThanZero", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint256", "name": "minimumAmount", "type": "uint256" } ], "name": "AmountOfTokensLessThanMinimumRequired", "type": "error" }, { "inputs": [], "name": "AutoSwapPrevented", "type": "error" }, { "inputs": [], "name": "BoughtAmountTooLow", "type": "error" }, { "inputs": [], "name": "ContractIsNotInitialized", "type": "error" }, { "inputs": [], "name": "DecreasesK", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "allowance", "type": "uint256" }, { "internalType": "uint256", "name": "needed", "type": "uint256" } ], "name": "ERC20InsufficientAllowance", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "sender", "type": "address" }, { "internalType": "uint256", "name": "balance", "type": "uint256" }, { "internalType": "uint256", "name": "needed", "type": "uint256" } ], "name": "ERC20InsufficientBalance", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "approver", "type": "address" } ], "name": "ERC20InvalidApprover", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "receiver", "type": "address" } ], "name": "ERC20InvalidReceiver", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "sender", "type": "address" } ], "name": "ERC20InvalidSender", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" } ], "name": "ERC20InvalidSpender", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "deadline", "type": "uint256" } ], "name": "ERC2612ExpiredSignature", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "signer", "type": "address" }, { "internalType": "address", "name": "owner", "type": "address" } ], "name": "ERC2612InvalidSigner", "type": "error" }, { "inputs": [], "name": "FailedToSendNativeCurrency", "type": "error" }, { "inputs": [], "name": "InsufficientLiquidity", "type": "error" }, { "inputs": [], "name": "InsufficientLiquidityMinted", "type": "error" }, { "inputs": [], "name": "InvalidAddress", "type": "error" }, { "inputs": [], "name": "InvalidFeeRate", "type": "error" }, { "inputs": [], "name": "InvalidMaxWalletPercent", "type": "error" }, { "inputs": [], "name": "InvalidOwner", "type": "error" }, { "inputs": [], "name": "InvalidRecipient", "type": "error" }, { "inputs": [], "name": "InvalidReserves", "type": "error" }, { "inputs": [], "name": "MaxWalletAmountExceeded", "type": "error" }, { "inputs": [], "name": "NameAndSymbolAlreadySet", "type": "error" }, { "inputs": [], "name": "NameAndSymbolMustNotBeEmpty", "type": "error" }, { "inputs": [], "name": "NativeRepaymentFailed", "type": "error" }, { "inputs": [], "name": "NoFeesToClaim", "type": "error" }, { "inputs": [], "name": "OwnerAlreadyInitialized", "type": "error" }, { "inputs": [], "name": "ReentrancyGuardReentrantCall", "type": "error" }, { "inputs": [], "name": "SlippageToleranceExceeded", "type": "error" }, { "inputs": [], "name": "SupplyAlreadyMinted", "type": "error" }, { "inputs": [], "name": "SwapNotEnabled", "type": "error" }, { "inputs": [], "name": "TokenRepaymentFailed", "type": "error" }, { "inputs": [], "name": "TransactionExpired", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "sender", "type": "address" } ], "name": "Unauthorized", "type": "error" }, { "inputs": [], "name": "YouHaveNoLiquidity", "type": "error" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "provider", "type": "address" }, { "indexed": true, "internalType": "address", "name": "toAddress", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "liquidityMinted", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "nativeAmount", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "tokenAmount", "type": "uint256" } ], "name": "AddLiquidity", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "Approval", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "recipient", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amountNative", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amountToken", "type": "uint256" } ], "name": "FeesCollected", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "feeTo", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "nativeAmount", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "tokenAmount", "type": "uint256" } ], "name": "FeesDistributed", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "OwnershipTransferred", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "tokenPriceInNative", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "nativePriceInToken", "type": "uint256" }, { "indexed": false, "internalType": "uint32", "name": "blockTimestampLast", "type": "uint32" } ], "name": "PricesUpdated", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "provider", "type": "address" }, { "indexed": true, "internalType": "address", "name": "toAddress", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "liquidityBurned", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "nativeAmount", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "tokenAmount", "type": "uint256" } ], "name": "RemoveLiquidity", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amountTokenIn", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amountNativeIn", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amountTokenOut", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amountNativeOut", "type": "uint256" }, { "indexed": false, "internalType": "bool", "name": "flashSwap", "type": "bool" } ], "name": "Swap", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "Transfer", "type": "event" }, { "inputs": [], "name": "BASE_SWAP_RATE", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "DOMAIN_SEPARATOR", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "FLASHSWAP_FEE_RATE", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "MAX_FEE_RATE", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "MINIMUM_LIQUIDITY", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "PERMIT_TYPEHASH", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "SCALE_FACTOR", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "accruedNativeFactoryFees", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "accruedNativeTradingFees", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "accruedTokenFactoryFees", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "accruedTokenTradingFees", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "amountToken_", "type": "uint256" }, { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256", "name": "deadline", "type": "uint256" } ], "name": "addLiquidity", "outputs": [ { "internalType": "uint256", "name": "liquidity", "type": "uint256" } ], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "spender", "type": "address" } ], "name": "allowance", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "approve", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "balanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "blockTimestampLast", "outputs": [ { "internalType": "uint32", "name": "", "type": "uint32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "burn", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "burnFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "claimFees", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "decimals", "outputs": [ { "internalType": "uint8", "name": "", "type": "uint8" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "factory", "outputs": [ { "internalType": "contract IBIFKN314Factory", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "factoryInitialized", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "feeCollector", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256", "name": "amountNativeOut", "type": "uint256" }, { "internalType": "uint256", "name": "amountTokenOut", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "flashSwap", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "outputAmount", "type": "uint256" }, { "internalType": "uint256", "name": "inputReserve", "type": "uint256" }, { "internalType": "uint256", "name": "outputReserve", "type": "uint256" } ], "name": "getAmountIn", "outputs": [ { "internalType": "uint256", "name": "inputAmount", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "inputAmount", "type": "uint256" }, { "internalType": "uint256", "name": "inputReserve", "type": "uint256" }, { "internalType": "uint256", "name": "outputReserve", "type": "uint256" } ], "name": "getAmountOut", "outputs": [ { "internalType": "uint256", "name": "outputAmount", "type": "uint256" }, { "internalType": "uint256", "name": "factoryFee", "type": "uint256" }, { "internalType": "uint256", "name": "tradingFee", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "getAmountsForLP", "outputs": [ { "internalType": "uint256", "name": "nativeAmount", "type": "uint256" }, { "internalType": "uint256", "name": "tokenAmount", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getReserves", "outputs": [ { "internalType": "uint256", "name": "amountNative", "type": "uint256" }, { "internalType": "uint256", "name": "amountToken", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getTokensInContract", "outputs": [ { "internalType": "uint256", "name": "tokenBalance", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "string", "name": "tokenName", "type": "string" }, { "internalType": "string", "name": "tokenSymbol", "type": "string" } ], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "initializeFactory", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "isInitialized", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "isMaxWalletExempt", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "liquidityToken", "outputs": [ { "internalType": "contract BIFKN314LP", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "maxWalletEnabled", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "maxWalletPercent", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "metadataURI", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "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": [], "name": "owner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "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": [], "name": "price0CumulativeLast", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "price1CumulativeLast", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256", "name": "deadline", "type": "uint256" } ], "name": "removeLiquidity", "outputs": [ { "internalType": "uint256", "name": "nativeAmount", "type": "uint256" }, { "internalType": "uint256", "name": "tokenAmount", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "feeCollector_", "type": "address" } ], "name": "setFeeCollector", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bool", "name": "enabled", "type": "bool" } ], "name": "setMaxWalletEnabled", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "addressToChange", "type": "address" }, { "internalType": "bool", "name": "isExempt", "type": "bool" } ], "name": "setMaxWalletExempt", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "maxWalletPercent_", "type": "uint256" } ], "name": "setMaxWalletPercent", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "string", "name": "newURI", "type": "string" } ], "name": "setMetadataURI", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "totalSupply_", "type": "uint256" }, { "internalType": "address", "name": "owner_", "type": "address" }, { "internalType": "uint256", "name": "feeRate_", "type": "uint256" }, { "internalType": "uint256", "name": "maxWalletPercent_", "type": "uint256" }, { "internalType": "string", "name": "metadataURI_", "type": "string" } ], "name": "setSupplyAndMint", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "setTradingEnabled", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "feeRate", "type": "uint256" } ], "name": "setTradingFeeRate", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "minimumTokensOut", "type": "uint256" }, { "internalType": "uint256", "name": "deadline", "type": "uint256" } ], "name": "swapNativeToToken", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokensSold", "type": "uint256" }, { "internalType": "uint256", "name": "minimumNativeOut", "type": "uint256" }, { "internalType": "uint256", "name": "deadline", "type": "uint256" } ], "name": "swapTokenToNative", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "symbol", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalSupply", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "tradingEnabled", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "tradingFeeRate", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "transfer", "outputs": [ { "internalType": "bool", "name": "success", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "sender", "type": "address" }, { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "transferFrom", "outputs": [ { "internalType": "bool", "name": "success", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "stateMutability": "payable", "type": "receive" } ]
60806040523480156200001157600080fd5b5060016007553362000023816200002a565b506200007c565b601780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b614d2b806200008c6000396000f3fe6080604052600436106103105760003560e01c8063750521f511610197578063a9059cbb116100ed578063d294f09311610090578063d294f093146109bb578063d505accf146109d0578063dd62ed3e146109f0578063e01df1a814610a10578063e156afd514610a26578063e6cb316614610a3b578063f05dcfc514610a5b578063f2fde38b14610a7c57600080fd5b8063a9059cbb146108bc578063ba9a7a56146108dc578063c415b95c146108f2578063c45a015514610912578063c4ccdeea14610939578063c5700a0214610959578063ce4b5bbe1461098b578063d045a329146109a157600080fd5b8063750521f5146106fb5780637537ccb61461071b57806379cc67901461073b5780637ecebe001461075b57806382bf293c1461078857806385f8c259146107a85780638b19d6cf146107c85780638da5cb5b146107e85780638f017f921461080857806392f6576e1461081e57806395d89b41146108345780639aa5d46214610849578063a10d2e3d1461085c578063a42dce801461087c578063a614ff751461089c57600080fd5b80633644e515116102675780634b2245831161020a5780634b224583146106245780634cd88b7614610644578063538a3f0e146106645780635909c0d5146106845780635a2b6c071461069a5780635a3d5493146106b057806370a08231146106c6578063715018a6146106e657600080fd5b80633644e5151461053e578063392e53cd146105545780633c2f1806146105755780633d9a3d191461058a57806340ed04c7146105a057806342966c68146105b657806343cd8f7e146105d65780634ada218b1461060357600080fd5b80628133711461035157806303ee438c14610379578063054d50d41461039b57806306fdde03146103d65780630902f1ac146103eb578063095ea7b3146104155780630b52820a146104455780630bd11f8a146104535780631091f67c1461048357806318160ddd146104a35780631ab52a6c146104b857806323b872dd146104ce57806330adf81f146104ee578063313ce56714610522578063355cf34b1461035157600080fd5b3661034c573360009081526008602052604090205460ff1661034a5761034a61033a346001610a9c565b6103454260b461332a565b610af6565b005b600080fd5b34801561035d57600080fd5b50610366601e81565b6040519081526020015b60405180910390f35b34801561038557600080fd5b5061038e610be3565b604051610370919061338d565b3480156103a757600080fd5b506103bb6103b63660046133a0565b610c71565b60408051938452602084019290925290820152606001610370565b3480156103e257600080fd5b5061038e610d6b565b3480156103f757600080fd5b50610400610dfd565b60408051928352602083019190915201610370565b34801561042157600080fd5b506104356104303660046133e1565b610e77565b6040519015158152602001610370565b61034a61034536600461340d565b34801561045f57600080fd5b5061043561046e36600461342f565b600b6020526000908152604090205460ff1681565b34801561048f57600080fd5b5061034a61049e36600461344c565b610e91565b3480156104af57600080fd5b50600254610366565b3480156104c457600080fd5b5061036660115481565b3480156104da57600080fd5b506104356104e9366004613465565b610ef9565b3480156104fa57600080fd5b506103667f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b34801561052e57600080fd5b5060405160128152602001610370565b34801561054a57600080fd5b5061036660055481565b34801561056057600080fd5b50600a5461043590600160a01b900460ff1681565b34801561058157600080fd5b50610366610f31565b34801561059657600080fd5b50610366600f5481565b3480156105ac57600080fd5b5061036660125481565b3480156105c257600080fd5b5061034a6105d136600461344c565b610f41565b3480156105e257600080fd5b50600a546105f6906001600160a01b031681565b60405161037091906134a6565b34801561060f57600080fd5b50600a5461043590600160b01b900460ff1681565b34801561063057600080fd5b5061034a61063f3660046133a0565b610f4e565b34801561065057600080fd5b5061034a61065f36600461355c565b611037565b34801561067057600080fd5b5061034a61067f36600461342f565b611139565b34801561069057600080fd5b50610366600c5481565b3480156106a657600080fd5b5061036660145481565b3480156106bc57600080fd5b50610366600d5481565b3480156106d257600080fd5b506103666106e136600461342f565b6111b0565b3480156106f257600080fd5b5061034a6111cb565b34801561070757600080fd5b5061034a6107163660046135bf565b6111f8565b34801561072757600080fd5b5061034a61073636600461360b565b611225565b34801561074757600080fd5b5061034a6107563660046133e1565b6112c2565b34801561076757600080fd5b5061036661077636600461342f565b60066020526000908152604090205481565b34801561079457600080fd5b5061034a6107a336600461344c565b6112d7565b3480156107b457600080fd5b506103666107c33660046133a0565b61134e565b3480156107d457600080fd5b5061034a6107e3366004613640565b6113f3565b3480156107f457600080fd5b506017546105f6906001600160a01b031681565b34801561081457600080fd5b5061036660155481565b34801561082a57600080fd5b506103666101f481565b34801561084057600080fd5b5061038e6114ed565b6103666108573660046136ac565b6114fc565b34801561086857600080fd5b5061040061087736600461344c565b6118d4565b34801561088857600080fd5b5061034a61089736600461342f565b611a22565b3480156108a857600080fd5b5061034a6108b73660046136d3565b611a8c565b3480156108c857600080fd5b506104356108d73660046133e1565b611aeb565b3480156108e857600080fd5b506103666103e881565b3480156108fe57600080fd5b506016546105f6906001600160a01b031681565b34801561091e57600080fd5b50600e546105f690600160201b90046001600160a01b031681565b34801561094557600080fd5b506104006109543660046136ac565b611b18565b34801561096557600080fd5b50600e546109769063ffffffff1681565b60405163ffffffff9091168152602001610370565b34801561099757600080fd5b5061036661271081565b3480156109ad57600080fd5b506010546104359060ff1681565b3480156109c757600080fd5b5061034a611d1a565b3480156109dc57600080fd5b5061034a6109eb3660046136ee565b611dee565b3480156109fc57600080fd5b50610366610a0b366004613765565b611fc5565b348015610a1c57600080fd5b5061036660135481565b348015610a3257600080fd5b5061034a611ff0565b348015610a4757600080fd5b5061034a610a5636600461379e565b612026565b348015610a6757600080fd5b50600a5461043590600160a81b900460ff1681565b348015610a8857600080fd5b5061034a610a9736600461342f565b6123a7565b6000806000610aa9610dfd565b915091506000610ad18686610abe5783610ac0565b845b87610acb5785610c71565b84610c71565b50509050601481610ae29190613849565b610aec908261385d565b9695505050505050565b610afe6123f8565b80804210610b1f576040516338e5e54b60e21b815260040160405180910390fd5b600080610b2a610dfd565b90925090503433610b3b828561385d565b93506000806000610b4e858b8989612422565b9250925092508060146000828254610b66919061332a565b90915550610b7790508260016124fc565b610b818484612664565b610b8c30858561272c565b610b9461278b565b836001600160a01b0316600080516020614cd683398151915260008786600080604051610bc5959493929190613870565b60405180910390a25050505050505050610bdf6001600755565b5050565b60098054610bf090613895565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1c90613895565b8015610c695780601f10610c3e57610100808354040283529160200191610c69565b820191906000526020600020905b815481529060010190602001808311610c4c57829003601f168201915b505050505081565b60008060008061271090506000601354601e610c8d919061332a565b610c999061271061385d565b90506000610ca7838a6138cf565b9050600088118015610cb95750600087115b15610d465782610cc882612905565b610cd29190613849565b945082610cde826129bd565b610ce89190613849565b93506000610cf683836138cf565b90506000610d0489836138cf565b905060008286610d166127108e6138cf565b610d2091906138cf565b610d2a919061332a565b9050808281610d3b57610d3b613833565b049850505050610d5f565b604051633dce448b60e11b815260040160405180910390fd5b50505093509350939050565b606060038054610d7a90613895565b80601f0160208091040260200160405190810160405280929190818152602001828054610da690613895565b8015610df35780601f10610dc857610100808354040283529160200191610df3565b820191906000526020600020905b815481529060010190602001808311610dd657829003601f168201915b5050505050905090565b60008060004790506000601154601454610e17919061332a565b90506000610e23610f31565b90506000601254601554610e37919061332a565b905082841015610e48576000610e52565b610e52838561385d565b955080821015610e63576000610e6d565b610e6d818361385d565b9450505050509091565b600033610e858185856129e2565b60019150505b92915050565b6017546001600160a01b0316336001600160a01b031614610ed157335b60405163472511eb60e11b8152600401610ec891906134a6565b60405180910390fd5b6101f4811115610ef457604051630adad23360e31b815260040160405180910390fd5b601355565b6000610f0583836129ef565b15610f1257506001610f2a565b610f1c8383612664565b610f27848484612a41565b90505b9392505050565b6000610f3c306111b0565b905090565b610f4b3382612a65565b50565b610f566123f8565b80804210610f77576040516338e5e54b60e21b815260040160405180910390fd5b600080610f82610dfd565b915091506000610f8f3390565b90506000806000610fa28a8a8789612422565b9250925092508060156000828254610fba919061332a565b90915550610fcb90508260006124fc565b610fd684308c612a9b565b610fe08484612aa6565b610fe861278b565b836001600160a01b0316600080516020614cd68339815191528b600080876000604051611019959493929190613870565b60405180910390a2505050505050506110326001600755565b505050565b6017546001600160a01b0316336001600160a01b0316146110585733610eae565b6110628282612b58565b60405161106e90613307565b604051809103906000f08015801561108a573d6000803e3d6000fd5b50600a80546001600160a01b0319166001600160a01b03929092169182179055604051634cd88b76906110c19085906020016138e6565b60408051601f19818403018152828201825260038352620424c560ec1b602084015290516001600160e01b031960e085901b1681526111039290600401613913565b600060405180830381600087803b15801561111d57600080fd5b505af1158015611131573d6000803e3d6000fd5b505050505050565b600a54600160a81b900460ff161561116457604051631360e86560e31b815260040160405180910390fd5b600a8054600160a81b60ff60a81b19909116179055600e8054640100000000600160c01b031916600160201b6001600160a01b0384811682029290921792839055610f4b920416612c95565b6001600160a01b031660009081526020819052604090205490565b6017546001600160a01b0316336001600160a01b0316146111ec5733610eae565b6111f66000612c95565b565b6017546001600160a01b0316336001600160a01b0316146112195733610eae565b6009610bdf8282613987565b6017546001600160a01b0316336001600160a01b0316146112465733610eae565b6001600160a01b038216158061126457506001600160a01b03821630145b8061127957506001600160a01b03821661dead145b156112975760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b03919091166000908152600b60205260409020805460ff1916911515919091179055565b6112cd823383612ce7565b610bdf8282612a65565b6017546001600160a01b0316336001600160a01b0316146112f85733610eae565b61271081111561131b576040516326dd075560e01b815260040160405180910390fd5b60105460ff16801561132b575080155b15611349576040516326dd075560e01b815260040160405180910390fd5b600f55565b60135460009061271090829061136590601e61332a565b6113719061271061385d565b905061137d82826138cf565b905060008411801561138f5750600085115b15610d46576000826127106113a489896138cf565b6113ae91906138cf565b6113b891906138cf565b90506000826113c7898861385d565b6113d191906138cf565b90508082816113e2576113e2613833565b046001019450505050509392505050565b6017546001600160a01b0316336001600160a01b0316146114145733610eae565b8460000361143557604051635e85ae7360e01b815260040160405180910390fd5b600061144060025490565b111561145f57604051630a87463f60e21b815260040160405180910390fd5b6001600160a01b038416611486576040516349e27cff60e01b815260040160405180910390fd5b81156114a2576010805460ff191660011790556114a2826112d7565b60096114ae8282613987565b506114b883610e91565b6114c184612c95565b601680546001600160a01b0319166001600160a01b0386161790556114e68486612d34565b5050505050565b606060048054610d7a90613895565b60006115066123f8565b81804210611527576040516338e5e54b60e21b815260040160405180910390fd5b600a543390600160a01b900460ff1615801561155157506017546001600160a01b03828116911614155b1561156f5760405163aae677e160e01b815260040160405180910390fd5b85158061157a575034155b1561159857604051635e85ae7360e01b815260040160405180910390fd5b6000806115a3610dfd565b90925090506115b2348361385d565b91506000600a60009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611609573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162d9190613a46565b9050348960008390036116df57600061164e61164983856138cf565b612d6a565b905061165c6103e88261385d565b600a546040516340c10f1960e01b8152919a506001600160a01b0316906340c10f19906116939061dead906103e890600401613a5f565b600060405180830381600087803b1580156116ad57600080fd5b505af11580156116c1573d6000803e3d6000fd5b5050600a805460ff60a01b1916600160a01b179055506117db915050565b8415806116ea575083155b1561170857604051633dce448b60e11b815260040160405180910390fd5b8461171385846138cf565b61171d9190613849565b9050600061172b8686612e52565b9050818c101561175857604051633885308960e21b8152600481018d905260248101839052604401610ec8565b61178a8661176686866138cf565b6117709190613849565b8661177b87866138cf565b6117859190613849565b612e5e565b98506000611798848861332a565b905060006117a6848861332a565b905060006117b483836138cf565b9050838110156117d65760405162bfbd3d60e31b815260040160405180910390fd5b505050505b876000036117fc57604051633489be7560e21b815260040160405180910390fd5b600a546040516340c10f1960e01b81526001600160a01b03909116906340c10f199061182e908d908c90600401613a5f565b600060405180830381600087803b15801561184857600080fd5b505af115801561185c573d6000803e3d6000fd5b5050505061186b863083612a9b565b61187361278b565b604080518981523460208201529081018290526001600160a01b03808c1691908816907f2f3289d16dbc3007471d28c4936df3a95222bc938112449400d049637e3309ce9060600160405180910390a350505050505050610f2a6001600755565b600080826000036118f857604051635e85ae7360e01b815260040160405180910390fd5b600080611903610dfd565b915091508160001480611914575080155b1561193257604051633dce448b60e11b815260040160405180910390fd5b600a54604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd9160048083019260209291908290030181865afa15801561197c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a09190613a46565b9050806000036119c35760405163bb55fd2760e01b815260040160405180910390fd5b806119ce84886138cf565b6119d89190613849565b9450806119e583886138cf565b6119ef9190613849565b93508415806119fc575083155b15611a1a5760405163bb55fd2760e01b815260040160405180910390fd5b505050915091565b6017546001600160a01b0316336001600160a01b031614611a435733610eae565b6001600160a01b038116611a6a5760405163e6c4247b60e01b815260040160405180910390fd5b601680546001600160a01b0319166001600160a01b0392909216919091179055565b6017546001600160a01b0316336001600160a01b031614611aad5733610eae565b808015611aba5750600f54155b15611ad8576040516326dd075560e01b815260040160405180910390fd5b6010805460ff1916911515919091179055565b6000611af783836129ef565b15611b0457506001610e8b565b611b0e8383612664565b610f2a8383612e74565b600080611b236123f8565b82804210611b44576040516338e5e54b60e21b815260040160405180910390fd5b600a543390600160a01b900460ff16611b705760405163aae677e160e01b815260040160405180910390fd5b600a546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611ba19085906004016134a6565b602060405180830381865afa158015611bbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be29190613a46565b905080600003611c0557604051635a5ec44f60e01b815260040160405180910390fd5b80881115611c265760405163bb55fd2760e01b815260040160405180910390fd5b611c2f886118d4565b600a5460405163079cc67960e41b81529297509095506001600160a01b0316906379cc679090611c659085908c90600401613a5f565b600060405180830381600087803b158015611c7f57600080fd5b505af1158015611c93573d6000803e3d6000fd5b50505050611ca18786612aa6565b611cac30888661272c565b60408051898152602081018790529081018590526001600160a01b0380891691908416907feb755d537a0caac69ccb1ac1dc2b7397a32bb19f93bd06013c57ac0b2e5dd69c9060600160405180910390a3611d0561278b565b505050611d126001600755565b935093915050565b6016546001600160a01b0316336001600160a01b031614611d3b5733610eae565b6014546015543382158015611d4e575081155b15611d6c5760405163211b631760e21b815260040160405180910390fd5b6000601455611d79610f31565b821115611d8b57611d88610f31565b91505b6000601555611d9a8184612aa6565b611da530828461272c565b60408051848152602081018490526001600160a01b038316917f2e4fb6077d4acf86e12bb7411fb82b2b3eaa6a49787f4b1e17b423e7ea841169910160405180910390a2505050565b42841015611e125760405163313c898160e11b815260048101859052602401610ec8565b6005546001600160a01b038816600090815260066020526040812080549192917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b919087611e6583613a78565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120604051602001611ede92919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015611f49573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381161580611f7e5750886001600160a01b0316816001600160a01b031614155b15611faf576040516325c0072360e11b81526001600160a01b0380831660048301528a166024820152604401610ec8565b611fba8989896129e2565b505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6017546001600160a01b0316336001600160a01b0316146120115733610eae565b600a805460ff60b01b1916600160b01b179055565b61202e6123f8565b612036612e82565b600a54600160a01b900460ff166120605760405163aae677e160e01b815260040160405180910390fd5b600a54600160b01b900460ff1661208a57604051637e99d8bb60e01b815260040160405180910390fd5b83158015612096575082155b156120b457604051635e85ae7360e01b815260040160405180910390fd5b6001600160a01b03851615806120d257506001600160a01b03851630145b156120f057604051634e46966960e11b815260040160405180910390fd5b6000806120fb610dfd565b915091508186118061210c57508085115b1561212a5760405163bb55fd2760e01b815260040160405180910390fd5b33861561213b5761213b8888612aa6565b85156121565761214b8887612664565b61215630898861272c565b60405163f3438c1760e01b81526001600160a01b0389169063f3438c179061218a9084908b908b908b908b90600401613a91565b600060405180830381600087803b1580156121a457600080fd5b505af11580156121b8573d6000803e3d6000fd5b505050506000806121c7610dfd565b9150915060008583116121db5760006121e5565b6121e5868461385d565b905060008583116121f7576000612201565b612201868461385d565b90508115801561220f575080155b1561222d5760405163e2ddc74960e01b815260040160405180910390fd5b6000601354601e61223e919061332a565b9050600061224c82856138cf565b612258612710886138cf565b612262919061385d565b9050600061227083856138cf565b61227c612710886138cf565b612286919061385d565b90506122956002612710613bc1565b61229f8a8c6138cf565b6122a991906138cf565b6122b382846138cf565b10156122d15760405162bfbd3d60e31b815260040160405180910390fd5b5050506122dd826129bd565b601460008282546122ee919061332a565b909155506122fd9050816129bd565b6015600082825461230e919061332a565b90915550612327905061232083612905565b60016124fc565b61233a61233382612905565b60006124fc565b61234261278b565b846001600160a01b0316600080516020614cd683398151915282848d8f6001604051612372959493929190613870565b60405180910390a25050505050505061239d336000908152600860205260409020805460ff19169055565b6114e66001600755565b6017546001600160a01b0316336001600160a01b0316146123c85733610eae565b6001600160a01b0381166123ef576040516349e27cff60e01b815260040160405180910390fd5b610f4b81612c95565b60026007540361241b57604051633ee5aeb560e01b815260040160405180910390fd5b6002600755565b6000806000612432878686612ecf565b600061243e8686612e52565b905061244b888787610c71565b9195509350915060008490036124745760405163271a700960e01b815260040160405180910390fd5b868410156124955760405163339454fb60e11b815260040160405180910390fd5b6000836124a2848b61385d565b6124ac919061385d565b6124b6908861332a565b905060006124c4868861385d565b9050826124d18383612e52565b10156124ef5760405162bfbd3d60e31b815260040160405180910390fd5b5050509450945094915050565b600e54600160201b90046001600160a01b031615610bdf576000600e60049054906101000a90046001600160a01b03166001600160a01b031663017e7e586040518163ffffffff1660e01b8152600401602060405180830381865afa158015612569573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061258d9190613bd0565b90506000600e60049054906101000a90046001600160a01b03166001600160a01b031663ef973d476040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126089190613a46565b90506001600160a01b0382161561265e57821561263c578360116000828254612631919061332a565b909155506126549050565b836012600082825461264e919061332a565b90915550505b61265e8282612f6d565b50505050565b60105460ff16612672575050565b6001600160a01b03821630148061269057506001600160a01b038216155b806126a557506001600160a01b03821661dead145b806126c857506001600160a01b0382166000908152600b602052604090205460ff165b156126d1575050565b6000612710600f546126e260025490565b6126ec91906138cf565b6126f69190613849565b90508082612703856111b0565b61270d919061332a565b11156110325760405163a9a44dff60e01b815260040160405180910390fd5b6001600160a01b038316612756576000604051634b637e8f60e11b8152600401610ec891906134a6565b6001600160a01b03821661278057600060405163ec442f0560e01b8152600401610ec891906134a6565b611032838383613087565b600080612796610dfd565b9150915081600014806127a7575080155b156127c557604051633dce448b60e11b815260040160405180910390fd5b60006127d5600160201b42613bed565b600e549091506000906127ee9063ffffffff1683613c01565b905060008163ffffffff1611801561280557508315155b801561281057508215155b156128b257600160701b60008461282783886138cf565b6128319190613849565b905060008661284084886138cf565b61284a9190613849565b905061285c63ffffffff8516836138cf565b600c600082825461286d919061332a565b90915550612883905063ffffffff8516826138cf565b600d6000828254612894919061332a565b9091555050600e805463ffffffff191663ffffffff87161790555050505b600c54600d54600e5460408051938452602084019290925263ffffffff1682820152517f1d0b407d784b19534f95cb221efeda97b16fcb4171eb57280723bad5ccfce40d9181900360600190a150505050565b600e54600090600160201b90046001600160a01b031661292757506000919050565b612710600e60049054906101000a90046001600160a01b03166001600160a01b031663978bbdb96040518163ffffffff1660e01b8152600401602060405180830381865afa15801561297d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129a19190613a46565b6129ab90846138cf565b6129b59190613849565b90505b919050565b60006013546000036129d157506000919050565b612710601354836129ab91906138cf565b611032838383600161319e565b60006001600160a01b03831630148015612a1957503360009081526008602052604090205460ff16155b15610e8b57612a3882612a2d846000610a9c565b61063f4260b461332a565b50600192915050565b600033612a4f858285612ce7565b612a5a85858561272c565b506001949350505050565b6001600160a01b038216612a8f576000604051634b637e8f60e11b8152600401610ec891906134a6565b610bdf82600083613087565b61103283838361272c565b80600003612ab2575050565b6001600160a01b038216612ad95760405163e6c4247b60e01b815260040160405180910390fd5b47811115612ae45750475b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612b31576040519150601f19603f3d011682016040523d82523d6000602084013e612b36565b606091505b505090508061103257604051634173d3a560e11b815260040160405180910390fd5b81511580612b6557508051155b15612b83576040516379db2df160e11b815260040160405180910390fd5b60038054612b9090613895565b1515905080612bac575060048054612ba790613895565b151590505b15612bca57604051634a8cdeb560e01b815260040160405180910390fd5b6003612bd68382613987565b506004612be38282613987565b507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6003604051612c149190613c25565b60408051918290038220828201825260018352603160f81b6020938401528151928301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160408051601f1981840301815291905280516020909101206005555050565b601780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000612cf38484611fc5565b9050600019811461265e5781811015612d2557828183604051637dc7a0d960e11b8152600401610ec893929190613c9b565b61265e8484848403600061319e565b6001600160a01b038216612d5e57600060405163ec442f0560e01b8152600401610ec891906134a6565b610bdf60008383613087565b600081600003612d7c57506000919050565b60006001612d8984613273565b901c6001901b90506001818481612da257612da2613833565b048201901c90506001818481612dba57612dba613833565b048201901c90506001818481612dd257612dd2613833565b048201901c90506001818481612dea57612dea613833565b048201901c90506001818481612e0257612e02613833565b048201901c90506001818481612e1a57612e1a613833565b048201901c90506001818481612e3257612e32613833565b048201901c9050610f2a81828581612e4c57612e4c613833565b04612e5e565b6000610f2a82846138cf565b6000818310612e6d5781610f2a565b5090919050565b600033610e8581858561272c565b3360009081526008602052604090205460ff1615612eb357604051631584469560e11b815260040160405180910390fd5b336000908152600860205260409020805460ff19166001179055565b600a54600160a01b900460ff16612ef95760405163aae677e160e01b815260040160405180910390fd5b600a54600160b01b900460ff16612f2357604051637e99d8bb60e01b815260040160405180910390fd5b82600003612f4457604051635e85ae7360e01b815260040160405180910390fd5b811580612f4f575080155b1561103257604051633dce448b60e11b815260040160405180910390fd5b60115460125460008083158015612f82575082155b15612f8f57505050505050565b600084118015612f9f5750848410155b15612fae576000601155600191505b821561300c57600080612fbf610dfd565b9092509050600081612fd184886138cf565b612fdb9190613849565b905087811061300857612fec610f31565b861115612ffe57612ffb610f31565b95505b6000601255600193505b5050505b811561301c5761301c8685612aa6565b801561302d5761302d30878561272c565b81806130365750805b156111315760408051858152602081018590526001600160a01b038816917f85da6ab72d2b48932522aea80adb8ca4fab6cdeb87bc2e7f6c03fd78d3b2100e910160405180910390a2505050505050565b6001600160a01b0383166130b25780600260008282546130a7919061332a565b909155506131119050565b6001600160a01b038316600090815260208190526040902054818110156130f25783818360405163391434e360e21b8152600401610ec893929190613c9b565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661312d5760028054829003905561314c565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161319191815260200190565b60405180910390a3505050565b6001600160a01b0384166131c857600060405163e602df0560e01b8152600401610ec891906134a6565b6001600160a01b0383166131f2576000604051634a1406b160e11b8152600401610ec891906134a6565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561265e57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161326591815260200190565b60405180910390a350505050565b600080608083901c1561328857608092831c92015b604083901c1561329a57604092831c92015b602083901c156132ac57602092831c92015b601083901c156132be57601092831c92015b600883901c156132d057600892831c92015b600483901c156132e257600492831c92015b600283901c156132f457600292831c92015b600183901c15610e8b5760010192915050565b61101980613cbd83390190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610e8b57610e8b613314565b60005b83811015613358578181015183820152602001613340565b50506000910152565b6000815180845261337981602086016020860161333d565b601f01601f19169290920160200192915050565b602081526000610f2a6020830184613361565b6000806000606084860312156133b557600080fd5b505081359360208301359350604090920135919050565b6001600160a01b0381168114610f4b57600080fd5b600080604083850312156133f457600080fd5b82356133ff816133cc565b946020939093013593505050565b6000806040838503121561342057600080fd5b50508035926020909101359150565b60006020828403121561344157600080fd5b8135610f2a816133cc565b60006020828403121561345e57600080fd5b5035919050565b60008060006060848603121561347a57600080fd5b8335613485816133cc565b92506020840135613495816133cc565b929592945050506040919091013590565b6001600160a01b0391909116815260200190565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126134e157600080fd5b81356001600160401b03808211156134fb576134fb6134ba565b604051601f8301601f19908116603f01168101908282118183101715613523576135236134ba565b8160405283815286602085880101111561353c57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806040838503121561356f57600080fd5b82356001600160401b038082111561358657600080fd5b613592868387016134d0565b935060208501359150808211156135a857600080fd5b506135b5858286016134d0565b9150509250929050565b6000602082840312156135d157600080fd5b81356001600160401b038111156135e757600080fd5b6135f3848285016134d0565b949350505050565b803580151581146129b857600080fd5b6000806040838503121561361e57600080fd5b8235613629816133cc565b9150613637602084016135fb565b90509250929050565b600080600080600060a0868803121561365857600080fd5b85359450602086013561366a816133cc565b9350604086013592506060860135915060808601356001600160401b0381111561369357600080fd5b61369f888289016134d0565b9150509295509295909350565b6000806000606084860312156136c157600080fd5b833592506020840135613495816133cc565b6000602082840312156136e557600080fd5b610f2a826135fb565b600080600080600080600060e0888a03121561370957600080fd5b8735613714816133cc565b96506020880135613724816133cc565b95506040880135945060608801359350608088013560ff8116811461374857600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561377857600080fd5b8235613783816133cc565b91506020830135613793816133cc565b809150509250929050565b6000806000806000608086880312156137b657600080fd5b85356137c1816133cc565b9450602086013593506040860135925060608601356001600160401b03808211156137eb57600080fd5b818801915088601f8301126137ff57600080fd5b81358181111561380e57600080fd5b89602082850101111561382057600080fd5b9699959850939650602001949392505050565b634e487b7160e01b600052601260045260246000fd5b60008261385857613858613833565b500490565b81810381811115610e8b57610e8b613314565b9485526020850193909352604084019190915260608301521515608082015260a00190565b600181811c908216806138a957607f821691505b6020821081036138c957634e487b7160e01b600052602260045260246000fd5b50919050565b8082028115828204841417610e8b57610e8b613314565b600082516138f881846020870161333d565b68102628102a37b5b2b760b91b920191825250600901919050565b6040815260006139266040830185613361565b82810360208401526139388185613361565b95945050505050565b601f82111561103257600081815260208120601f850160051c810160208610156139685750805b601f850160051c820191505b8181101561113157828155600101613974565b81516001600160401b038111156139a0576139a06134ba565b6139b4816139ae8454613895565b84613941565b602080601f8311600181146139e957600084156139d15750858301515b600019600386901b1c1916600185901b178555611131565b600085815260208120601f198616915b82811015613a18578886015182559484019460019091019084016139f9565b5085821015613a365787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215613a5857600080fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b600060018201613a8a57613a8a613314565b5060010190565b60018060a01b038616815284602082015283604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f909201601f19160101949350505050565b600181815b80851115613b18578160001904821115613afe57613afe613314565b80851615613b0b57918102915b93841c9390800290613ae2565b509250929050565b600082613b2f57506001610e8b565b81613b3c57506000610e8b565b8160018114613b525760028114613b5c57613b78565b6001915050610e8b565b60ff841115613b6d57613b6d613314565b50506001821b610e8b565b5060208310610133831016604e8410600b8410161715613b9b575081810a610e8b565b613ba58383613add565b8060001904821115613bb957613bb9613314565b029392505050565b6000610f2a60ff841683613b20565b600060208284031215613be257600080fd5b8151610f2a816133cc565b600082613bfc57613bfc613833565b500690565b63ffffffff828116828216039080821115613c1e57613c1e613314565b5092915050565b6000808354613c3381613895565b60018281168015613c4b5760018114613c6057613c8f565b60ff1984168752821515830287019450613c8f565b8760005260208060002060005b85811015613c865781548a820152908401908201613c6d565b50505082870194505b50929695505050505050565b6001600160a01b03939093168352602083019190915260408201526060019056fe60a060405234801561001057600080fd5b50336080819052610fdc61003d600039600081816101cd0152818161037f01526103ef0152610fdc6000f3fe608060405234801561001057600080fd5b50600436106100f65760003560e01c80634837e204116100925780634837e204146101c85780634cd88b76146101fc57806370a082311461020f57806379cc6790146102385780637ecebe001461024b57806395d89b411461026b578063a9059cbb14610273578063d505accf14610286578063dd62ed3e1461029957600080fd5b806306fdde03146100fb578063095ea7b31461011957806318160ddd1461013c57806323b872dd1461014e57806330adf81f14610161578063313ce567146101885780633644e5151461019757806340c10f19146101a057806342966c68146101b5575b600080fd5b6101036102ac565b6040516101109190610ab9565b60405180910390f35b61012c610127366004610b23565b61033e565b6040519015158152602001610110565b6002545b604051908152602001610110565b61012c61015c366004610b4d565b610358565b6101407f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160128152602001610110565b61014060055481565b6101b36101ae366004610b23565b61037c565b005b6101b36101c3366004610b89565b6103df565b6101ef7f000000000000000000000000000000000000000000000000000000000000000081565b6040516101109190610ba2565b6101b361020a366004610c59565b6103ec565b61014061021d366004610cbd565b6001600160a01b031660009081526020819052604090205490565b6101b3610246366004610b23565b61042c565b610140610259366004610cbd565b60066020526000908152604090205481565b610103610441565b61012c610281366004610b23565b610450565b6101b3610294366004610cdf565b61045e565b6101406102a7366004610d52565b610635565b6060600380546102bb90610d85565b80601f01602080910402602001604051908101604052809291908181526020018280546102e790610d85565b80156103345780601f1061030957610100808354040283529160200191610334565b820191906000526020600020905b81548152906001019060200180831161031757829003601f168201915b5050505050905090565b60003361034c818585610660565b60019150505b92915050565b600033610366858285610672565b6103718585856106c5565b506001949350505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146103d157335b60405163472511eb60e11b81526004016103c89190610ba2565b60405180910390fd5b6103db8282610724565b5050565b6103e9338261075a565b50565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461042257336103ae565b6103db8282610790565b610437823383610672565b6103db828261075a565b6060600480546102bb90610d85565b60003361034c8185856106c5565b428410156104825760405163313c898160e11b8152600481018590526024016103c8565b6005546001600160a01b038816600090815260066020526040812080549192917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b9190876104d583610dd5565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e0016040516020818303038152906040528051906020012060405160200161054e92919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa1580156105b9573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615806105ee5750886001600160a01b0316816001600160a01b031614155b1561061f576040516325c0072360e11b81526001600160a01b0380831660048301528a1660248201526044016103c8565b61062a898989610660565b505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61066d83838360016108cd565b505050565b600061067e8484610635565b905060001981146106bf57818110156106b057828183604051637dc7a0d960e11b81526004016103c893929190610dee565b6106bf848484840360006108cd565b50505050565b6001600160a01b0383166106ef576000604051634b637e8f60e11b81526004016103c89190610ba2565b6001600160a01b03821661071957600060405163ec442f0560e01b81526004016103c89190610ba2565b61066d8383836109a2565b6001600160a01b03821661074e57600060405163ec442f0560e01b81526004016103c89190610ba2565b6103db600083836109a2565b6001600160a01b038216610784576000604051634b637e8f60e11b81526004016103c89190610ba2565b6103db826000836109a2565b8151158061079d57508051155b156107bb576040516379db2df160e11b815260040160405180910390fd5b600380546107c890610d85565b15159050806107e45750600480546107df90610d85565b151590505b1561080257604051634a8cdeb560e01b815260040160405180910390fd5b600361080e8382610e5d565b50600461081b8282610e5d565b507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f600360405161084c9190610f1d565b60408051918290038220828201825260018352603160f81b6020938401528151928301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160408051601f1981840301815291905280516020909101206005555050565b6001600160a01b0384166108f757600060405163e602df0560e01b81526004016103c89190610ba2565b6001600160a01b038316610921576000604051634a1406b160e11b81526004016103c89190610ba2565b6001600160a01b03808516600090815260016020908152604080832093871683529290522082905580156106bf57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161099491815260200190565b60405180910390a350505050565b6001600160a01b0383166109cd5780600260008282546109c29190610f93565b90915550610a2c9050565b6001600160a01b03831660009081526020819052604090205481811015610a0d5783818360405163391434e360e21b81526004016103c893929190610dee565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216610a4857600280548290039055610a67565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610aac91815260200190565b60405180910390a3505050565b600060208083528351808285015260005b81811015610ae657858101830151858201604001528201610aca565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610b1e57600080fd5b919050565b60008060408385031215610b3657600080fd5b610b3f83610b07565b946020939093013593505050565b600080600060608486031215610b6257600080fd5b610b6b84610b07565b9250610b7960208501610b07565b9150604084013590509250925092565b600060208284031215610b9b57600080fd5b5035919050565b6001600160a01b0391909116815260200190565b634e487b7160e01b600052604160045260246000fd5b600082601f830112610bdd57600080fd5b813567ffffffffffffffff80821115610bf857610bf8610bb6565b604051601f8301601f19908116603f01168101908282118183101715610c2057610c20610bb6565b81604052838152866020858801011115610c3957600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060408385031215610c6c57600080fd5b823567ffffffffffffffff80821115610c8457600080fd5b610c9086838701610bcc565b93506020850135915080821115610ca657600080fd5b50610cb385828601610bcc565b9150509250929050565b600060208284031215610ccf57600080fd5b610cd882610b07565b9392505050565b600080600080600080600060e0888a031215610cfa57600080fd5b610d0388610b07565b9650610d1160208901610b07565b95506040880135945060608801359350608088013560ff81168114610d3557600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610d6557600080fd5b610d6e83610b07565b9150610d7c60208401610b07565b90509250929050565b600181811c90821680610d9957607f821691505b602082108103610db957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600060018201610de757610de7610dbf565b5060010190565b6001600160a01b039390931683526020830191909152604082015260600190565b601f82111561066d57600081815260208120601f850160051c81016020861015610e365750805b601f850160051c820191505b81811015610e5557828155600101610e42565b505050505050565b815167ffffffffffffffff811115610e7757610e77610bb6565b610e8b81610e858454610d85565b84610e0f565b602080601f831160018114610ec05760008415610ea85750858301515b600019600386901b1c1916600185901b178555610e55565b600085815260208120601f198616915b82811015610eef57888601518255948401946001909101908401610ed0565b5085821015610f0d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000808354610f2b81610d85565b60018281168015610f435760018114610f5857610f87565b60ff1984168752821515830287019450610f87565b8760005260208060002060005b85811015610f7e5781548a820152908401908201610f65565b50505082870194505b50929695505050505050565b8082018082111561035257610352610dbf56fea2646970667358221220926f32d9ccd0b0e0016b302e43ae94cf0d0bc86d8bb2a06238ff8affbe7ed29964736f6c63430008140033d44b536c8222cd875ef4b7f421435c474a3e1035e29c64e5f039af6944de4beaa26469706673582212200acb0cb9ddcb288fe82801fc682ce29dd4ce84934e9598988abdbf36b2ab05c264736f6c63430008140033