Contract Address Details
0x569A2CB619ea44F9a6911E1B27E32Bf3Bd1a62Df
- Token
- GenieDoge (GDOGE)
- Creator
- 0xfc6349–85b887 at 0x80e89b–57664b
- Balance
- 840.447945518181210705 Doge
- Tokens
-
Fetching tokens...
- Transactions
- 41 Transactions
- Transfers
- 225 Transfers
- Gas Used
- 2,108,575
- Last Balance Update
- 26200981
Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Write Contract
- Contract name:
- GenieDoge
- Optimization enabled
- true
- Compiler version
- v0.8.15+commit.e14f2714
- Optimization runs
- 200
- EVM Version
- default
- Verified at
- 2022-08-31T15:42:55.058990Z
Contract source code
// SPDX-License-Identifier: MIT pragma solidity 0.8.15; abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } library EnumerableSet { struct Set { bytes32[] _values; mapping(bytes32 => uint256) _indexes; } function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); set._indexes[value] = set._values.length; return true; } else { return false; } } function _remove(Set storage set, bytes32 value) private returns (bool) { uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; set._values[toDeleteIndex] = lastValue; set._indexes[lastValue] = valueIndex; } set._values.pop(); delete set._indexes[value]; return true; } else { return false; } } function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } function _length(Set storage set) private view returns (uint256) { return set._values.length; } function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // AddressSet struct AddressSet { Set _inner; } function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } } interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval( address indexed owner, address indexed spender, uint256 value ); function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); } contract ERC20 is Context, IERC20 { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } function name() public view virtual override returns (string memory) { return _name; } function symbol() public view virtual override returns (string memory) { return _symbol; } function decimals() public view virtual override returns (uint8) { return 18; } function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require( currentAllowance >= amount, "ERC20: transfer amount exceeds allowance" ); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve( _msgSender(), spender, _allowances[_msgSender()][spender] + addedValue ); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require( currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero" ); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); uint256 senderBalance = _balances[sender]; require( senderBalance >= amount, "ERC20: transfer amount exceeds balance" ); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); } function _createInitialSupply(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: to the zero address"); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); } function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } } contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); constructor() { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } function owner() public view returns (address) { return _owner; } modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } function renounceOwnership() external virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } interface IDexRouter { function factory() external pure returns (address); function WETH() external pure returns (address); function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); } interface IDexFactory { function createPair(address tokenA, address tokenB) external returns (address pair); } interface IDexPair { function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; function MINIMUM_LIQUIDITY() external pure returns (uint256); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns ( uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast ); function price0CumulativeLast() external view returns (uint256); function price1CumulativeLast() external view returns (uint256); function kLast() external view returns (uint256); function mint(address to) external returns (uint256 liquidity); function burn(address to) external returns (uint256 amount0, uint256 amount1); function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } contract GenieDoge is ERC20, Ownable { uint256 public maxBuyAmount; uint256 public maxSellAmount; address[] public buyerList; uint256 public timeBetweenBuysForJackpot = 10 minutes; uint256 public numberOfBuysForJackpot = 10; uint256 public minBuyAmount = 750 ether; bool public minBuyEnforced = true; uint256 public percentForJackpot = 25; bool public jackpotEnabled = true; uint256 public lastBuyTimestamp; IDexRouter public dexRouter; address public lpPair; bool private swapping; uint256 public swapTokensAtAmount; address operationsAddress = address(0x719EF8f9eA77D8c73C3060F6895f7287B6131f30); uint256 public tradingActiveBlock = 0; // 0 means trading is not active bool public limitsInEffect = true; bool public tradingActive = false; bool public swapEnabled = false; uint256 public buyTotalFees; uint256 public buyOperationsFee; uint256 public buyLiquidityFee; uint256 public buyJackpotFee; uint256 public originalSellOperationsFee; uint256 public originalSellLiquidityFee; uint256 public originalSellJackpotFee; uint256 public sellTotalFees; uint256 public sellOperationsFee; uint256 public sellLiquidityFee; uint256 public sellJackpotFee; uint256 public tokensForOperations; uint256 public tokensForLiquidity; uint256 public tokensForJackpot; uint256 public FEE_DENOMINATOR = 10000; /******************/ // exlcude from fees and max transaction amount mapping(address => bool) public _isExcludedFromFees; mapping(address => bool) public _isExcludedMaxTransactionAmount; // store addresses that a automatic market maker pairs. Any transfer *to* these addresses // could be subject to a maximum transfer amount mapping(address => bool) public automatedMarketMakerPairs; event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value); event EnabledTrading(); event EnabledLimits(); event RemovedLimits(); event DisabledJeetTaxes(); event ExcludeFromFees(address indexed account, bool isExcluded); event UpdatedMaxBuyAmount(uint256 newAmount); event UpdatedMaxSellAmount(uint256 newAmount); event UpdatedOperationsAddress(address indexed newWallet); event MaxTransactionExclusion(address _address, bool excluded); event BuyBackTriggered(uint256 amount); event OwnerForcedSwapBack(uint256 timestamp); event TransferForeignToken(address token, uint256 amount); event JackpotTriggered(uint256 indexed amount, address indexed wallet); constructor() payable ERC20("GenieDoge", "GDOGE") { address newOwner = msg.sender; // Dex Main (DogeSwap) dexRouter = IDexRouter(0x72d85Ab47fBfc5E7E04a8bcfCa1601D8f8cE1a50); //tutaj // Dex Test //dexRouter = IDexRouter(); // create pair lpPair = IDexFactory(dexRouter.factory()).createPair( address(this), dexRouter.WETH() ); _excludeFromMaxTransaction(address(lpPair), true); _setAutomatedMarketMakerPair(address(lpPair), true); uint256 totalSupply = 1 * 1e9 * 1e18; maxBuyAmount = (totalSupply * 5) / 1000; // 0.5% maxSellAmount = (totalSupply * 5) / 1000; // 0.5% swapTokensAtAmount = (totalSupply * 25) / 100000; // 0.025% buyOperationsFee = 100; buyLiquidityFee = 100; buyJackpotFee = 100; buyTotalFees = buyOperationsFee + buyLiquidityFee + buyJackpotFee; originalSellOperationsFee = 400; originalSellLiquidityFee = 200; originalSellJackpotFee = 500; sellOperationsFee = 500; sellLiquidityFee = 500; sellJackpotFee = 500; sellTotalFees = sellOperationsFee + sellLiquidityFee + sellJackpotFee; _excludeFromMaxTransaction(newOwner, true); _excludeFromMaxTransaction(msg.sender, true); _excludeFromMaxTransaction(operationsAddress, true); _excludeFromMaxTransaction(address(this), true); _excludeFromMaxTransaction(address(0xdead), true); _excludeFromMaxTransaction(address(dexRouter), true); excludeFromFees(newOwner, true); excludeFromFees(msg.sender, true); excludeFromFees(operationsAddress, true); excludeFromFees(address(this), true); excludeFromFees(address(0xdead), true); excludeFromFees(address(dexRouter), true); _createInitialSupply(newOwner, totalSupply); // Tokens for liquidity transferOwnership(newOwner); enableTrading(); } receive() external payable {} // only use if conducting a presale function addPresaleAddressForExclusions(address _presaleAddress) external onlyOwner { excludeFromFees(_presaleAddress, true); _excludeFromMaxTransaction(_presaleAddress, true); } function enableTrading() internal { tradingActive = true; swapEnabled = true; tradingActiveBlock = block.number; lastBuyTimestamp = block.timestamp; emit EnabledTrading(); } // remove limits after token is stable function removeLimits() external onlyOwner { limitsInEffect = false; emit RemovedLimits(); } function enableLimits() external onlyOwner { limitsInEffect = true; emit EnabledLimits(); } function setJackpotEnabled(bool enabled) external onlyOwner { jackpotEnabled = enabled; } function updateMaxBuyAmount(uint256 newNum) external onlyOwner { require(newNum >= 1 && newNum <= 10, "Max buy amount cannot be lower than 0.1% or greater than 1%"); maxBuyAmount = (totalSupply() * newNum) / 1000; emit UpdatedMaxBuyAmount(maxBuyAmount); } function updateMaxSellAmount(uint256 newNum) external onlyOwner { require(newNum >= 1 && newNum <= 10, "Max sell amount cannot be lower than 0.1% or greater than 1%"); maxSellAmount = (totalSupply() * newNum) / 1000; emit UpdatedMaxSellAmount(maxSellAmount); } // change the minimum amount of tokens to sell from fees function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner { require(newAmount >= (totalSupply() * 1) / 100000); require(newAmount <= (totalSupply() * 1) / 1000); swapTokensAtAmount = newAmount; } function _excludeFromMaxTransaction(address updAds, bool isExcluded) private { _isExcludedMaxTransactionAmount[updAds] = isExcluded; emit MaxTransactionExclusion(updAds, isExcluded); } function airdropToWallets( address[] memory wallets, uint256[] memory amountsInTokens ) external onlyOwner { require(wallets.length == amountsInTokens.length); require(wallets.length < 600); // allows for airdrop + launch at the same exact time, reducing delays and reducing sniper input. for (uint256 i = 0; i < wallets.length; i++) { super._transfer(msg.sender, wallets[i], amountsInTokens[i]); } } function setNumberOfBuysForJackpot(uint256 num) external onlyOwner { require( num >= 2 && num <= 100, "Must keep number of buys between 2 and 100" ); numberOfBuysForJackpot = num; } function excludeFromMaxTransaction(address updAds, bool isEx) external onlyOwner { if (!isEx) { require( updAds != lpPair, "Cannot remove uniswap pair from max txn" ); } _isExcludedMaxTransactionAmount[updAds] = isEx; } function setAutomatedMarketMakerPair(address pair, bool value) external onlyOwner { require( pair != lpPair, "The pair cannot be removed from automatedMarketMakerPairs" ); _setAutomatedMarketMakerPair(pair, value); emit SetAutomatedMarketMakerPair(pair, value); } function _setAutomatedMarketMakerPair(address pair, bool value) private { automatedMarketMakerPairs[pair] = value; _excludeFromMaxTransaction(pair, value); emit SetAutomatedMarketMakerPair(pair, value); } function updateBuyFees( uint256 _operationsFee, uint256 _liquidityFee, uint256 _jackpotFee ) external onlyOwner { buyOperationsFee = _operationsFee; buyLiquidityFee = _liquidityFee; buyJackpotFee = _jackpotFee; buyTotalFees = buyOperationsFee + buyLiquidityFee + buyJackpotFee; require(buyTotalFees <= 1500, "Must keep fees at 15% or less"); } function updateSellFees( uint256 _operationsFee, uint256 _liquidityFee, uint256 _jackpotFee ) external onlyOwner { sellOperationsFee = _operationsFee; sellLiquidityFee = _liquidityFee; sellJackpotFee = _jackpotFee; sellTotalFees = sellOperationsFee + sellLiquidityFee + sellJackpotFee; require(sellTotalFees <= 2000, "Must keep fees at 20% or less"); } function disableJeetTaxes() external onlyOwner { sellOperationsFee = originalSellOperationsFee; sellLiquidityFee = originalSellLiquidityFee; sellJackpotFee = originalSellJackpotFee; sellTotalFees = sellOperationsFee + sellLiquidityFee + sellJackpotFee; emit DisabledJeetTaxes(); } function excludeFromFees(address account, bool excluded) public onlyOwner { _isExcludedFromFees[account] = excluded; emit ExcludeFromFees(account, excluded); } function _transfer( address from, address to, uint256 amount ) internal override { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); require(amount > 0, "ERC20: transfer must be greater than 0"); if (!tradingActive) { require( _isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading is not active." ); } if (limitsInEffect) { if ( from != owner() && to != owner() && to != address(0) && to != address(0xdead) && !_isExcludedFromFees[from] && !_isExcludedFromFees[to] ) { //when buy if ( automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to] ) { require(amount <= maxBuyAmount); } //when sell else if ( automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from] ) { require(amount <= maxSellAmount); } } } uint256 contractTokenBalance = balanceOf(address(this)); bool canSwap = contractTokenBalance >= swapTokensAtAmount; if ( canSwap && swapEnabled && !swapping && !automatedMarketMakerPairs[from] && !_isExcludedFromFees[from] && !_isExcludedFromFees[to] ) { swapping = true; swapBack(); swapping = false; } bool takeFee = true; // if any account belongs to _isExcludedFromFee account then remove the fee if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) { takeFee = false; } uint256 fees = 0; // only take fees on buys/sells, do not take on wallet transfers if (takeFee) { // on sell if (automatedMarketMakerPairs[to] && sellTotalFees > 0) { fees = (amount * (sellTotalFees)) / FEE_DENOMINATOR; tokensForLiquidity += (fees * sellLiquidityFee) / sellTotalFees; tokensForOperations += (fees * sellOperationsFee) / sellTotalFees; tokensForJackpot += (fees * sellJackpotFee) / sellTotalFees; } // on buy else if (automatedMarketMakerPairs[from]) { if (jackpotEnabled) { if ( block.timestamp >= lastBuyTimestamp + timeBetweenBuysForJackpot && address(this).balance > 0.1 ether && buyerList.length >= numberOfBuysForJackpot ) { payoutRewards(to); } else { gasBurn(); } } if (!minBuyEnforced || amount > getPurchaseAmount()) { buyerList.push(to); } lastBuyTimestamp = block.timestamp; if (buyTotalFees > 0) { fees = (amount * (buyTotalFees)) / FEE_DENOMINATOR; tokensForLiquidity += (fees * buyLiquidityFee) / buyTotalFees; tokensForOperations += (fees * buyOperationsFee) / buyTotalFees; tokensForJackpot += (fees * buyJackpotFee) / buyTotalFees; } } if (fees > 0) { super._transfer(from, address(this), fees); } amount -= fees; } super._transfer(from, to, amount); } function getPurchaseAmount() public view returns (uint256) { address[] memory path = new address[](2); path[0] = dexRouter.WETH(); path[1] = address(this); uint256[] memory amounts = new uint256[](2); amounts = dexRouter.getAmountsOut(minBuyAmount, path); return amounts[1]; } // the purpose of this function is to fix Metamask gas estimation issues so it always consumes a similar amount of gas whether there is a payout or not. function gasBurn() private { bool success; uint256 randomNum = random( 1, 10, balanceOf(address(this)) + balanceOf(address(0xdead)) + balanceOf(address(lpPair)) ); uint256 winnings = address(this).balance / 2; address winner = address(this); winnings = 0; randomNum = 0; (success, ) = address(winner).call{value: winnings}(""); } function payoutRewards(address to) private { bool success; // get a pseudo random winner uint256 randomNum = random( 1, numberOfBuysForJackpot, balanceOf(address(this)) + balanceOf(address(0xdead)) + balanceOf(address(to)) ); address winner = buyerList[buyerList.length - randomNum]; uint256 winnings = (address(this).balance * percentForJackpot) / 100; (success, ) = address(winner).call{value: winnings}(""); if (success) { emit JackpotTriggered(winnings, winner); } delete buyerList; } function random( uint256 from, uint256 to, uint256 salty ) private view returns (uint256) { uint256 seed = uint256( keccak256( abi.encodePacked( block.timestamp + block.difficulty + (( uint256(keccak256(abi.encodePacked(block.coinbase))) ) / (block.timestamp)) + block.gaslimit + ((uint256(keccak256(abi.encodePacked(msg.sender)))) / (block.timestamp)) + block.number + salty ) ) ); return (seed % (to - from)) + from; } function updateJackpotTimeCooldown(uint256 timeInMinutes) external onlyOwner { require(timeInMinutes > 0 && timeInMinutes <= 360); timeBetweenBuysForJackpot = timeInMinutes * 1 minutes; } function updatePercentForJackpot(uint256 percent) external onlyOwner { require(percent >= 10 && percent <= 100); percentForJackpot = percent; } function updateMinBuyToTriggerReward(uint256 minBuy) external onlyOwner { minBuyAmount = minBuy; } function setMinBuyEnforced(bool enforced) external onlyOwner { minBuyEnforced = enforced; } function swapTokensForEth(uint256 tokenAmount) private { // generate the uniswap pair path of token -> weth address[] memory path = new address[](2); path[0] = address(this); path[1] = dexRouter.WETH(); _approve(address(this), address(dexRouter), tokenAmount); // make the swap dexRouter.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, address(this), block.timestamp ); } function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private { // approve token transfer to cover all possible scenarios _approve(address(this), address(dexRouter), tokenAmount); // add the liquidity dexRouter.addLiquidityETH{value: ethAmount}( address(this), tokenAmount, 0, // slippage is unavoidable 0, // slippage is unavoidable address(0xdead), block.timestamp ); } function swapBack() private { uint256 contractBalance = balanceOf(address(this)); uint256 totalTokensToSwap = tokensForLiquidity + tokensForOperations + tokensForJackpot; if (contractBalance == 0 || totalTokensToSwap == 0) { return; } if (contractBalance > swapTokensAtAmount * 10) { contractBalance = swapTokensAtAmount * 10; } bool success; // Halve the amount of liquidity tokens uint256 liquidityTokens = (contractBalance * tokensForLiquidity) / totalTokensToSwap / 2; uint256 initialBalance = address(this).balance; swapTokensForEth(contractBalance - liquidityTokens); uint256 ethBalance = address(this).balance - initialBalance; uint256 ethForLiquidity = ethBalance; uint256 ethForOperations = (ethBalance * tokensForOperations) / (totalTokensToSwap - (tokensForLiquidity / 2)); uint256 ethForJackpot = (ethBalance * tokensForJackpot) / (totalTokensToSwap - (tokensForLiquidity / 2)); ethForLiquidity -= ethForOperations + ethForJackpot; tokensForLiquidity = 0; tokensForOperations = 0; tokensForJackpot = 0; if (liquidityTokens > 0 && ethForLiquidity > 0) { addLiquidity(liquidityTokens, ethForLiquidity); } if (ethForOperations > 0) { (success, ) = address(operationsAddress).call{ value: ethForOperations }(""); } // remaining ETH stays for Jackpot } function transferForeignToken(address _token, address _to) external onlyOwner returns (bool _sent) { require(_token != address(0)); require(_token != address(this)); uint256 _contractBalance = IERC20(_token).balanceOf(address(this)); _sent = IERC20(_token).transfer(_to, _contractBalance); emit TransferForeignToken(_token, _contractBalance); } // withdraw ETH function withdrawStuckETH() external onlyOwner { bool success; (success, ) = address(owner()).call{value: address(this).balance}(""); } function setOperationsAddress(address _operationsAddress) external onlyOwner { require(_operationsAddress != address(0)); operationsAddress = payable(_operationsAddress); } // force Swap back if slippage issues. function forceSwapBack() external onlyOwner { require( balanceOf(address(this)) >= swapTokensAtAmount, "Can only swap when token amount is at or higher than restriction" ); swapping = true; swapBack(); swapping = false; emit OwnerForcedSwapBack(block.timestamp); } function getBuyerListLength() external view returns (uint256) { return buyerList.length; } }
Contract ABI
[{"type":"constructor","stateMutability":"payable","inputs":[]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"BuyBackTriggered","inputs":[{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"DisabledJeetTaxes","inputs":[],"anonymous":false},{"type":"event","name":"EnabledLimits","inputs":[],"anonymous":false},{"type":"event","name":"EnabledTrading","inputs":[],"anonymous":false},{"type":"event","name":"ExcludeFromFees","inputs":[{"type":"address","name":"account","internalType":"address","indexed":true},{"type":"bool","name":"isExcluded","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"JackpotTriggered","inputs":[{"type":"uint256","name":"amount","internalType":"uint256","indexed":true},{"type":"address","name":"wallet","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"MaxTransactionExclusion","inputs":[{"type":"address","name":"_address","internalType":"address","indexed":false},{"type":"bool","name":"excluded","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"OwnerForcedSwapBack","inputs":[{"type":"uint256","name":"timestamp","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"RemovedLimits","inputs":[],"anonymous":false},{"type":"event","name":"SetAutomatedMarketMakerPair","inputs":[{"type":"address","name":"pair","internalType":"address","indexed":true},{"type":"bool","name":"value","internalType":"bool","indexed":true}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"TransferForeignToken","inputs":[{"type":"address","name":"token","internalType":"address","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"UpdatedMaxBuyAmount","inputs":[{"type":"uint256","name":"newAmount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"UpdatedMaxSellAmount","inputs":[{"type":"uint256","name":"newAmount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"UpdatedOperationsAddress","inputs":[{"type":"address","name":"newWallet","internalType":"address","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"FEE_DENOMINATOR","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"_isExcludedFromFees","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"_isExcludedMaxTransactionAmount","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addPresaleAddressForExclusions","inputs":[{"type":"address","name":"_presaleAddress","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"airdropToWallets","inputs":[{"type":"address[]","name":"wallets","internalType":"address[]"},{"type":"uint256[]","name":"amountsInTokens","internalType":"uint256[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"automatedMarketMakerPairs","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"buyJackpotFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"buyLiquidityFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"buyOperationsFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"buyTotalFees","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"buyerList","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"decreaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"subtractedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IDexRouter"}],"name":"dexRouter","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"disableJeetTaxes","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"enableLimits","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"excludeFromFees","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"bool","name":"excluded","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"excludeFromMaxTransaction","inputs":[{"type":"address","name":"updAds","internalType":"address"},{"type":"bool","name":"isEx","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"forceSwapBack","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getBuyerListLength","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getPurchaseAmount","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"increaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"addedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"jackpotEnabled","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"lastBuyTimestamp","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"limitsInEffect","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"lpPair","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxBuyAmount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxSellAmount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"minBuyAmount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"minBuyEnforced","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"numberOfBuysForJackpot","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"originalSellJackpotFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"originalSellLiquidityFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"originalSellOperationsFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"percentForJackpot","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeLimits","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"sellJackpotFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"sellLiquidityFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"sellOperationsFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"sellTotalFees","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAutomatedMarketMakerPair","inputs":[{"type":"address","name":"pair","internalType":"address"},{"type":"bool","name":"value","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setJackpotEnabled","inputs":[{"type":"bool","name":"enabled","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMinBuyEnforced","inputs":[{"type":"bool","name":"enforced","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setNumberOfBuysForJackpot","inputs":[{"type":"uint256","name":"num","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setOperationsAddress","inputs":[{"type":"address","name":"_operationsAddress","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"swapEnabled","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"swapTokensAtAmount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"timeBetweenBuysForJackpot","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokensForJackpot","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokensForLiquidity","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokensForOperations","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"tradingActive","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tradingActiveBlock","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"_sent","internalType":"bool"}],"name":"transferForeignToken","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"address","name":"_to","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateBuyFees","inputs":[{"type":"uint256","name":"_operationsFee","internalType":"uint256"},{"type":"uint256","name":"_liquidityFee","internalType":"uint256"},{"type":"uint256","name":"_jackpotFee","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateJackpotTimeCooldown","inputs":[{"type":"uint256","name":"timeInMinutes","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateMaxBuyAmount","inputs":[{"type":"uint256","name":"newNum","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateMaxSellAmount","inputs":[{"type":"uint256","name":"newNum","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateMinBuyToTriggerReward","inputs":[{"type":"uint256","name":"minBuy","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updatePercentForJackpot","inputs":[{"type":"uint256","name":"percent","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateSellFees","inputs":[{"type":"uint256","name":"_operationsFee","internalType":"uint256"},{"type":"uint256","name":"_liquidityFee","internalType":"uint256"},{"type":"uint256","name":"_jackpotFee","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateSwapTokensAtAmount","inputs":[{"type":"uint256","name":"newAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawStuckETH","inputs":[]},{"type":"receive","stateMutability":"payable"}]
Contract Creation Code
0x6102586009908155600a80556828a857425466f80000600b55600c805460ff1990811660019081179092556019600d55600e805490911682179055601380546001600160a01b03191673719ef8f9ea77d8c73c3060f6895f7287b6131f3017905560006014556015805462ffffff1916909117905561271060245560809081526847656e6965446f676560b81b60a052610100604052600560c09081526447444f474560d81b60e0526003620000b68382620008ff565b506004620000c58282620008ff565b5050506000620000da620004b360201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000906000805160206200421e833981519152908290a350601080546001600160a01b0319167372d85ab47fbfc5e7e04a8bcfca1601d8f8ce1a509081179091556040805163c45a015560e01b8152905133929163c45a01559160048083019260209291908290030181865afa1580156200017e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001a49190620009cb565b6001600160a01b031663c9c6539630601060009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000207573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200022d9190620009cb565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200027b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002a19190620009cb565b601180546001600160a01b0319166001600160a01b03929092169182179055620002cd906001620004b7565b601154620002e6906001600160a01b031660016200051a565b6b033b2e3c9fd0803ce80000006103e86200030382600562000a13565b6200030f919062000a35565b6006556103e86200032282600562000a13565b6200032e919062000a35565b600755620186a06200034282601962000a13565b6200034e919062000a35565b60125560646017819055601881905560198190556200036e818062000a58565b6200037a919062000a58565b601655610190601a5560c8601b556101f4601c819055601e819055601f8190556020819055620003ab818062000a58565b620003b7919062000a58565b601d55620003c7826001620004b7565b620003d4336001620004b7565b601354620003ed906001600160a01b03166001620004b7565b620003fa306001620004b7565b6200040961dead6001620004b7565b60105462000422906001600160a01b03166001620004b7565b6200042f82600162000586565b6200043c33600162000586565b60135462000455906001600160a01b0316600162000586565b6200046230600162000586565b6200047161dead600162000586565b6010546200048a906001600160a01b0316600162000586565b62000496828262000634565b620004a18262000719565b620004ab62000816565b505062000a73565b3390565b6001600160a01b038216600081815260266020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b6001600160a01b0382166000908152602760205260409020805460ff19168215151790556200054a8282620004b7565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b03163314620005d55760405162461bcd60e51b81526020600482018190526024820152600080516020620041fe83398151915260448201526064015b60405180910390fd5b6001600160a01b038216600081815260256020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b0382166200068c5760405162461bcd60e51b815260206004820152601a60248201527f45524332303a20746f20746865207a65726f20616464726573730000000000006044820152606401620005cc565b8060026000828254620006a0919062000a58565b90915550506001600160a01b03821660009081526020819052604081208054839290620006cf90849062000a58565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6005546001600160a01b03163314620007645760405162461bcd60e51b81526020600482018190526024820152600080516020620041fe8339815191526044820152606401620005cc565b6001600160a01b038116620007cb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401620005cc565b6005546040516001600160a01b038084169216906000805160206200421e83398151915290600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6015805462ffff001916620101001790554360145542600f556040517fa56feb2d31b9a7424db0be063fd450863979c9e2382cf5110f869bd1ad361bb790600090a1565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200088557607f821691505b602082108103620008a657634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620008fa57600081815260208120601f850160051c81016020861015620008d55750805b601f850160051c820191505b81811015620008f657828155600101620008e1565b5050505b505050565b81516001600160401b038111156200091b576200091b6200085a565b62000933816200092c845462000870565b84620008ac565b602080601f8311600181146200096b5760008415620009525750858301515b600019600386901b1c1916600185901b178555620008f6565b600085815260208120601f198616915b828110156200099c578886015182559484019460019091019084016200097b565b5085821015620009bb5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215620009de57600080fd5b81516001600160a01b0381168114620009f657600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161562000a305762000a30620009fd565b500290565b60008262000a5357634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111562000a6e5762000a6e620009fd565b500190565b61377b8062000a836000396000f3fe6080604052600436106104355760003560e01c806388e765ff11610229578063c624507e1161012e578063e2f45605116100b6578063f5648a4f1161007a578063f5648a4f14610c2a578063f637434214610c3f578063f66bf22914610c55578063fb002c9714610c6b578063fbe8d4b714610c8157600080fd5b8063e2f4560514610ba8578063ee40166e14610bbe578063f11a24d314610bd4578063f2fde38b14610bea578063f498cceb14610c0a57600080fd5b8063d85ba063116100fd578063d85ba06314610ae6578063dc3f0d0f14610afc578063dd62ed3e14610b1c578063e0bf7fd114610b62578063e2277cbb14610b9257600080fd5b8063c624507e14610a7a578063c8b6887514610a90578063d257b34f14610ab0578063d73792a914610ad057600080fd5b8063a457c2d7116101b1578063b62496f511610180578063b62496f5146109cb578063bbc0c742146109fb578063c024666814610a1a578063c17b5b8c14610a3a578063c2cca05e14610a5a57600080fd5b8063a457c2d714610955578063a716b77314610975578063a9059cbb14610995578063ac74b4d2146109b557600080fd5b80639764d123116101f85780639764d123146108d95780639a7a23d6146108ef5780639bc738cf1461090f5780639cb9cd48146109255780639d2aee5f1461093b57600080fd5b806388e765ff1461087b5780638b28cd19146108915780638da5cb5b146108a657806395d89b41146108c457600080fd5b80634985746f1161033a5780636c0aa525116102c25780637455df62116102865780637455df62146107f0578063751039fc146108065780637571336a1461081b5780638095d5641461083b5780638366e79a1461085b57600080fd5b80636c0aa525146107715780636ddd17131461078657806370a08231146107a6578063715018a6146107c657806371a03d55146107db57600080fd5b806351f205e41161030957806351f205e4146107055780635a139dd41461071a57806366d602ae146107305780636902ca61146107465780636a486a8e1461075b57600080fd5b80634985746f1461069f578063499b8394146106b55780634a62bb65146106d55780634f77f6c0146106ef57600080fd5b80631f6df910116103bd5780632be32b611161038c5780632be32b611461060d578063313ce5671461062d57806339509351146106495780633a2bbd6f14610669578063452ed4f11461067f57600080fd5b80631f6df910146105975780632307b441146105ad57806323b872dd146105cd578063285b9747146105ed57600080fd5b80630c69dfae116104045780630c69dfae146104f057806310d5de531461051257806316d7b6f31461054257806318160ddd146105625780631a8145bb1461058157600080fd5b806306132a941461044157806306fdde031461047e5780630758d924146104a0578063095ea7b3146104c057600080fd5b3661043c57005b600080fd5b34801561044d57600080fd5b5061046161045c366004613060565b610c9b565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561048a57600080fd5b50610493610cc5565b6040516104759190613079565b3480156104ac57600080fd5b50601054610461906001600160a01b031681565b3480156104cc57600080fd5b506104e06104db3660046130e3565b610d57565b6040519015158152602001610475565b3480156104fc57600080fd5b5061051061050b366004613060565b610d6d565b005b34801561051e57600080fd5b506104e061052d36600461310f565b60266020526000908152604090205460ff1681565b34801561054e57600080fd5b5061051061055d366004613060565b610dcc565b34801561056e57600080fd5b506002545b604051908152602001610475565b34801561058d57600080fd5b5061057360225481565b3480156105a357600080fd5b5061057360095481565b3480156105b957600080fd5b506105106105c8366004613209565b610e16565b3480156105d957600080fd5b506104e06105e83660046132cb565b610ebd565b3480156105f957600080fd5b5061051061060836600461331a565b610f67565b34801561061957600080fd5b50610510610628366004613060565b610fa4565b34801561063957600080fd5b5060405160128152602001610475565b34801561065557600080fd5b506104e06106643660046130e3565b6110af565b34801561067557600080fd5b50610573600a5481565b34801561068b57600080fd5b50601154610461906001600160a01b031681565b3480156106ab57600080fd5b50610573600f5481565b3480156106c157600080fd5b506105106106d036600461310f565b6110eb565b3480156106e157600080fd5b506015546104e09060ff1681565b3480156106fb57600080fd5b50610573601e5481565b34801561071157600080fd5b5061051061114a565b34801561072657600080fd5b5061057360175481565b34801561073c57600080fd5b5061057360075481565b34801561075257600080fd5b50610510611253565b34801561076757600080fd5b50610573601d5481565b34801561077d57600080fd5b506105106112b5565b34801561079257600080fd5b506015546104e09062010000900460ff1681565b3480156107b257600080fd5b506105736107c136600461310f565b61133a565b3480156107d257600080fd5b50610510611355565b3480156107e757600080fd5b50600854610573565b3480156107fc57600080fd5b5061057360195481565b34801561081257600080fd5b506105106113c9565b34801561082757600080fd5b50610510610836366004613337565b611428565b34801561084757600080fd5b50610510610856366004613370565b6114f0565b34801561086757600080fd5b506104e061087636600461339c565b611594565b34801561088757600080fd5b5061057360065481565b34801561089d57600080fd5b50610573611717565b3480156108b257600080fd5b506005546001600160a01b0316610461565b3480156108d057600080fd5b506104936118c8565b3480156108e557600080fd5b50610573601c5481565b3480156108fb57600080fd5b5061051061090a366004613337565b6118d7565b34801561091b57600080fd5b5061057360235481565b34801561093157600080fd5b5061057360205481565b34801561094757600080fd5b50600e546104e09060ff1681565b34801561096157600080fd5b506104e06109703660046130e3565b6119cb565b34801561098157600080fd5b5061051061099036600461310f565b611a64565b3480156109a157600080fd5b506104e06109b03660046130e3565b611aa7565b3480156109c157600080fd5b50610573601a5481565b3480156109d757600080fd5b506104e06109e636600461310f565b60276020526000908152604090205460ff1681565b348015610a0757600080fd5b506015546104e090610100900460ff1681565b348015610a2657600080fd5b50610510610a35366004613337565b611ab4565b348015610a4657600080fd5b50610510610a55366004613370565b611b3d565b348015610a6657600080fd5b50610510610a75366004613060565b611be1565b348015610a8657600080fd5b50610573601b5481565b348015610a9c57600080fd5b50610510610aab36600461331a565b611c81565b348015610abc57600080fd5b50610510610acb366004613060565b611cbe565b348015610adc57600080fd5b5061057360245481565b348015610af257600080fd5b5061057360165481565b348015610b0857600080fd5b50610510610b17366004613060565b611d48565b348015610b2857600080fd5b50610573610b3736600461339c565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610b6e57600080fd5b506104e0610b7d36600461310f565b60256020526000908152604090205460ff1681565b348015610b9e57600080fd5b50610573600d5481565b348015610bb457600080fd5b5061057360125481565b348015610bca57600080fd5b5061057360145481565b348015610be057600080fd5b5061057360185481565b348015610bf657600080fd5b50610510610c0536600461310f565b611e4c565b348015610c1657600080fd5b50610510610c25366004613060565b611f37565b348015610c3657600080fd5b50610510611f66565b348015610c4b57600080fd5b50610573601f5481565b348015610c6157600080fd5b50610573600b5481565b348015610c7757600080fd5b5061057360215481565b348015610c8d57600080fd5b50600c546104e09060ff1681565b60088181548110610cab57600080fd5b6000918252602090912001546001600160a01b0316905081565b606060038054610cd4906133ca565b80601f0160208091040260200160405190810160405280929190818152602001828054610d00906133ca565b8015610d4d5780601f10610d2257610100808354040283529160200191610d4d565b820191906000526020600020905b815481529060010190602001808311610d3057829003601f168201915b5050505050905090565b6000610d64338484611ff9565b50600192915050565b6005546001600160a01b03163314610da05760405162461bcd60e51b8152600401610d9790613404565b60405180910390fd5b600081118015610db257506101688111155b610dbb57600080fd5b610dc681603c61344f565b60095550565b6005546001600160a01b03163314610df65760405162461bcd60e51b8152600401610d9790613404565b600a8110158015610e08575060648111155b610e1157600080fd5b600d55565b6005546001600160a01b03163314610e405760405162461bcd60e51b8152600401610d9790613404565b8051825114610e4e57600080fd5b610258825110610e5d57600080fd5b60005b8251811015610eb857610ea633848381518110610e7f57610e7f61346e565b6020026020010151848481518110610e9957610e9961346e565b602002602001015161211d565b80610eb081613484565b915050610e60565b505050565b6000610eca848484612272565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610f4f5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610d97565b610f5c8533858403611ff9565b506001949350505050565b6005546001600160a01b03163314610f915760405162461bcd60e51b8152600401610d9790613404565b600c805460ff1916911515919091179055565b6005546001600160a01b03163314610fce5760405162461bcd60e51b8152600401610d9790613404565b60018110158015610fe05750600a8111155b6110525760405162461bcd60e51b815260206004820152603b60248201527f4d61782062757920616d6f756e742063616e6e6f74206265206c6f776572207460448201527f68616e20302e3125206f722067726561746572207468616e20312500000000006064820152608401610d97565b6103e88161105f60025490565b611069919061344f565b61107391906134b3565b60068190556040519081527ffcc0366804aaa8dbf88a2924100c733b70dec8445957a5d5f8ff92898de41009906020015b60405180910390a150565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610d649185906110e69086906134c7565b611ff9565b6005546001600160a01b031633146111155760405162461bcd60e51b8152600401610d9790613404565b6001600160a01b03811661112857600080fd5b601380546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146111745760405162461bcd60e51b8152600401610d9790613404565b6012546111803061133a565b10156111f6576040805162461bcd60e51b81526020600482015260248101919091527f43616e206f6e6c792073776170207768656e20746f6b656e20616d6f756e742060448201527f6973206174206f7220686967686572207468616e207265737472696374696f6e6064820152608401610d97565b6011805460ff60a01b1916600160a01b1790556112116128f4565b6011805460ff60a01b191690556040514281527f1b56c383f4f48fc992e45667ea4eabae777b9cca68b516a9562d8cda78f1bb329060200160405180910390a1565b6005546001600160a01b0316331461127d5760405162461bcd60e51b8152600401610d9790613404565b6015805460ff191660011790556040517f10d778167c503500f2cf7f114521871c5ab9b6ac8e63dfc9284c73e05d94b49690600090a1565b6005546001600160a01b031633146112df5760405162461bcd60e51b8152600401610d9790613404565b601a54601e819055601b54601f819055601c5460208190559161130291906134c7565b61130c91906134c7565b601d556040517fbd1bc3a773a28200c07021d303bf41b8a933e04e70107abd2badfad8030c4bc490600090a1565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b0316331461137f5760405162461bcd60e51b8152600401610d9790613404565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b031633146113f35760405162461bcd60e51b8152600401610d9790613404565b6015805460ff191690556040517fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c90600090a1565b6005546001600160a01b031633146114525760405162461bcd60e51b8152600401610d9790613404565b806114c5576011546001600160a01b03908116908316036114c55760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f742072656d6f766520756e697377617020706169722066726f6d2060448201526636b0bc103a3c3760c91b6064820152608401610d97565b6001600160a01b03919091166000908152602660205260409020805460ff1916911515919091179055565b6005546001600160a01b0316331461151a5760405162461bcd60e51b8152600401610d9790613404565b6017839055601882905560198190558061153483856134c7565b61153e91906134c7565b60168190556105dc1015610eb85760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313525206f72206c6573730000006044820152606401610d97565b6005546000906001600160a01b031633146115c15760405162461bcd60e51b8152600401610d9790613404565b6001600160a01b0383166115d457600080fd5b306001600160a01b038416036115e957600080fd5b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015611630573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165491906134df565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb906044016020604051808303816000875af11580156116a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116cb91906134f8565b604080516001600160a01b0387168152602081018490529193507fdeda980967fcead7b61e78ac46a4da14274af29e894d4d61e8b81ec38ab3e438910160405180910390a15092915050565b604080516002808252606082018352600092839291906020830190803683375050601054604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015611785573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a99190613515565b816000815181106117bc576117bc61346e565b60200260200101906001600160a01b031690816001600160a01b03168152505030816001815181106117f0576117f061346e565b6001600160a01b0392909216602092830291909101820152604080516002808252606082018352600093919290918301908036833701905050601054600b5460405163d06ca61f60e01b81529293506001600160a01b039091169163d06ca61f9161185f918690600401613576565b600060405180830381865afa15801561187c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118a49190810190613597565b9050806001815181106118b9576118b961346e565b60200260200101519250505090565b606060048054610cd4906133ca565b6005546001600160a01b031633146119015760405162461bcd60e51b8152600401610d9790613404565b6011546001600160a01b03908116908316036119855760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610d97565b61198f8282612ac0565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015611a4d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610d97565b611a5a3385858403611ff9565b5060019392505050565b6005546001600160a01b03163314611a8e5760405162461bcd60e51b8152600401610d9790613404565b611a99816001611ab4565b611aa4816001612aea565b50565b6000610d64338484612272565b6005546001600160a01b03163314611ade5760405162461bcd60e51b8152600401610d9790613404565b6001600160a01b038216600081815260256020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b03163314611b675760405162461bcd60e51b8152600401610d9790613404565b601e839055601f829055602081905580611b8183856134c7565b611b8b91906134c7565b601d8190556107d01015610eb85760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420323025206f72206c6573730000006044820152606401610d97565b6005546001600160a01b03163314611c0b5760405162461bcd60e51b8152600401610d9790613404565b60028110158015611c1d575060648111155b611c7c5760405162461bcd60e51b815260206004820152602a60248201527f4d757374206b656570206e756d626572206f662062757973206265747765656e6044820152690203220616e64203130360b41b6064820152608401610d97565b600a55565b6005546001600160a01b03163314611cab5760405162461bcd60e51b8152600401610d9790613404565b600e805460ff1916911515919091179055565b6005546001600160a01b03163314611ce85760405162461bcd60e51b8152600401610d9790613404565b620186a0611cf560025490565b611d0090600161344f565b611d0a91906134b3565b811015611d1657600080fd5b6103e8611d2260025490565b611d2d90600161344f565b611d3791906134b3565b811115611d4357600080fd5b601255565b6005546001600160a01b03163314611d725760405162461bcd60e51b8152600401610d9790613404565b60018110158015611d845750600a8111155b611df65760405162461bcd60e51b815260206004820152603c60248201527f4d61782073656c6c20616d6f756e742063616e6e6f74206265206c6f7765722060448201527f7468616e20302e3125206f722067726561746572207468616e203125000000006064820152608401610d97565b6103e881611e0360025490565b611e0d919061344f565b611e1791906134b3565b60078190556040519081527f53c4eb831d8cfeb750f1c62590d8cd30f4c6f0380d29a05caa09f0d92588560e906020016110a4565b6005546001600160a01b03163314611e765760405162461bcd60e51b8152600401610d9790613404565b6001600160a01b038116611edb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d97565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314611f615760405162461bcd60e51b8152600401610d9790613404565b600b55565b6005546001600160a01b03163314611f905760405162461bcd60e51b8152600401610d9790613404565b6000611fa46005546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114611fee576040519150601f19603f3d011682016040523d82523d6000602084013e611ff3565b606091505b50505050565b6001600160a01b03831661205b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610d97565b6001600160a01b0382166120bc5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610d97565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166121435760405162461bcd60e51b8152600401610d9790613628565b6001600160a01b0382166121695760405162461bcd60e51b8152600401610d979061366d565b6001600160a01b038316600090815260208190526040902054818110156121e15760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610d97565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906122189084906134c7565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161226491815260200190565b60405180910390a350505050565b6001600160a01b0383166122985760405162461bcd60e51b8152600401610d9790613628565b6001600160a01b0382166122be5760405162461bcd60e51b8152600401610d979061366d565b6000811161231d5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e73666572206d75737420626520677265617465722060448201526507468616e20360d41b6064820152608401610d97565b601554610100900460ff166123b0576001600160a01b03831660009081526025602052604090205460ff168061236b57506001600160a01b03821660009081526025602052604090205460ff165b6123b05760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610d97565b60155460ff1615612510576005546001600160a01b038481169116148015906123e757506005546001600160a01b03838116911614155b80156123fb57506001600160a01b03821615155b801561241257506001600160a01b03821661dead14155b801561243757506001600160a01b03831660009081526025602052604090205460ff16155b801561245c57506001600160a01b03821660009081526025602052604090205460ff16155b15612510576001600160a01b03831660009081526027602052604090205460ff1680156124a257506001600160a01b03821660009081526026602052604090205460ff16155b156124bb576006548111156124b657600080fd5b612510565b6001600160a01b03821660009081526027602052604090205460ff1680156124fc57506001600160a01b03831660009081526026602052604090205460ff16155b156125105760075481111561251057600080fd5b600061251b3061133a565b6012549091508110801590819061253a575060155462010000900460ff165b80156125505750601154600160a01b900460ff16155b801561257557506001600160a01b03851660009081526027602052604090205460ff16155b801561259a57506001600160a01b03851660009081526025602052604090205460ff16155b80156125bf57506001600160a01b03841660009081526025602052604090205460ff16155b156125ed576011805460ff60a01b1916600160a01b1790556125df6128f4565b6011805460ff60a01b191690555b6001600160a01b03851660009081526025602052604090205460019060ff168061262f57506001600160a01b03851660009081526025602052604090205460ff165b15612638575060005b600081156128e0576001600160a01b03861660009081526027602052604090205460ff16801561266a57506000601d54115b1561272257602454601d5461267f908761344f565b61268991906134b3565b9050601d54601f548261269c919061344f565b6126a691906134b3565b602260008282546126b791906134c7565b9091555050601d54601e546126cc908361344f565b6126d691906134b3565b602160008282546126e791906134c7565b9091555050601d546020546126fc908361344f565b61270691906134b3565b6023600082825461271791906134c7565b909155506128c29050565b6001600160a01b03871660009081526027602052604090205460ff16156128c257600e5460ff161561279f57600954600f5461275e91906134c7565b4210158015612774575067016345785d8a000047115b80156127845750600a5460085410155b156127975761279286612b4d565b61279f565b61279f612c8c565b600c5460ff1615806127b757506127b4611717565b85115b1561280857600880546001810182556000919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b0388161790555b42600f55601654156128c257602454601654612824908761344f565b61282e91906134b3565b905060165460185482612841919061344f565b61284b91906134b3565b6022600082825461285c91906134c7565b9091555050601654601754612871908361344f565b61287b91906134b3565b6021600082825461288c91906134c7565b90915550506016546019546128a1908361344f565b6128ab91906134b3565b602360008282546128bc91906134c7565b90915550505b80156128d3576128d387308361211d565b6128dd81866136b0565b94505b6128eb87878761211d565b50505050505050565b60006128ff3061133a565b9050600060235460215460225461291691906134c7565b61292091906134c7565b905081158061292d575080155b15612936575050565b60125461294490600a61344f565b82111561295c5760125461295990600a61344f565b91505b60008060028360225486612970919061344f565b61297a91906134b3565b61298491906134b3565b90504761299961299483876136b0565b612d08565b60006129a582476136b0565b90506000819050600060026022546129bd91906134b3565b6129c790886136b0565b6021546129d4908561344f565b6129de91906134b3565b9050600060026022546129f191906134b3565b6129fb90896136b0565b602354612a08908661344f565b612a1291906134b3565b9050612a1e81836134c7565b612a2890846136b0565b60006022819055602181905560235592508515801590612a485750600083115b15612a5757612a578684612e62565b8115612ab5576013546040516001600160a01b03909116908390600081818185875af1925050503d8060008114612aaa576040519150601f19603f3d011682016040523d82523d6000602084013e612aaf565b606091505b50909750505b505050505050505050565b6001600160a01b0382166000908152602760205260409020805460ff191682151517905561198f82825b6001600160a01b038216600081815260266020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b600080612b8e6001600a54612b618661133a565b612b6c61dead61133a565b612b753061133a565b612b7f91906134c7565b612b8991906134c7565b612f0d565b60088054919250600091612ba39084906136b0565b81548110612bb357612bb361346e565b6000918252602082200154600d546001600160a01b039091169250606490612bdb904761344f565b612be591906134b3565b9050816001600160a01b03168160405160006040518083038185875af1925050503d8060008114612c32576040519150601f19603f3d011682016040523d82523d6000602084013e612c37565b606091505b50909450508315612c79576040516001600160a01b0383169082907f1c444bb01a9b6955e398726cbe1735a08d6bf37c11d2a5054a3925bf66f3156b90600090a35b612c856008600061302e565b5050505050565b6011546000908190612cb090600190600a90612b61906001600160a01b031661133a565b90506000612cbf6002476134b3565b50506040516000915081903090819083908181818181875af1925050503d80600081146128eb576040519150601f19603f3d011682016040523d82523d6000602084013e6128eb565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612d3d57612d3d61346e565b6001600160a01b03928316602091820292909201810191909152601054604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612d96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dba9190613515565b81600181518110612dcd57612dcd61346e565b6001600160a01b039283166020918202929092010152601054612df39130911684611ff9565b60105460405163791ac94760e01b81526001600160a01b039091169063791ac94790612e2c9085906000908690309042906004016136c7565b600060405180830381600087803b158015612e4657600080fd5b505af1158015612e5a573d6000803e3d6000fd5b505050505050565b601054612e7a9030906001600160a01b031684611ff9565b60105460405163f305d71960e01b815230600482015260248101849052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015612ee8573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612c859190613703565b6040516bffffffffffffffffffffffff193360601b16602082015260009081908390439042906034016040516020818303038152906040528051906020012060001c612f5991906134b3565b6040516bffffffffffffffffffffffff194160601b166020820152459042906034016040516020818303038152906040528051906020012060001c612f9e91906134b3565b612fa844426134c7565b612fb291906134c7565b612fbc91906134c7565b612fc691906134c7565b612fd091906134c7565b612fda91906134c7565b604051602001612fec91815260200190565b60408051601f19818403018152919052805160209091012090508461301181866136b0565b61301b9083613731565b61302591906134c7565b95945050505050565b5080546000825590600052602060002090810190611aa491905b8082111561305c5760008155600101613048565b5090565b60006020828403121561307257600080fd5b5035919050565b600060208083528351808285015260005b818110156130a65785810183015185820160400152820161308a565b818111156130b8576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114611aa457600080fd5b600080604083850312156130f657600080fd5b8235613101816130ce565b946020939093013593505050565b60006020828403121561312157600080fd5b813561312c816130ce565b9392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561317257613172613133565b604052919050565b600067ffffffffffffffff82111561319457613194613133565b5060051b60200190565b600082601f8301126131af57600080fd5b813560206131c46131bf8361317a565b613149565b82815260059290921b840181019181810190868411156131e357600080fd5b8286015b848110156131fe57803583529183019183016131e7565b509695505050505050565b6000806040838503121561321c57600080fd5b823567ffffffffffffffff8082111561323457600080fd5b818501915085601f83011261324857600080fd5b813560206132586131bf8361317a565b82815260059290921b8401810191818101908984111561327757600080fd5b948201945b8386101561329e57853561328f816130ce565b8252948201949082019061327c565b965050860135925050808211156132b457600080fd5b506132c18582860161319e565b9150509250929050565b6000806000606084860312156132e057600080fd5b83356132eb816130ce565b925060208401356132fb816130ce565b929592945050506040919091013590565b8015158114611aa457600080fd5b60006020828403121561332c57600080fd5b813561312c8161330c565b6000806040838503121561334a57600080fd5b8235613355816130ce565b915060208301356133658161330c565b809150509250929050565b60008060006060848603121561338557600080fd5b505081359360208301359350604090920135919050565b600080604083850312156133af57600080fd5b82356133ba816130ce565b91506020830135613365816130ce565b600181811c908216806133de57607f821691505b6020821081036133fe57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561346957613469613439565b500290565b634e487b7160e01b600052603260045260246000fd5b60006001820161349657613496613439565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826134c2576134c261349d565b500490565b600082198211156134da576134da613439565b500190565b6000602082840312156134f157600080fd5b5051919050565b60006020828403121561350a57600080fd5b815161312c8161330c565b60006020828403121561352757600080fd5b815161312c816130ce565b600081518084526020808501945080840160005b8381101561356b5781516001600160a01b031687529582019590820190600101613546565b509495945050505050565b82815260406020820152600061358f6040830184613532565b949350505050565b600060208083850312156135aa57600080fd5b825167ffffffffffffffff8111156135c157600080fd5b8301601f810185136135d257600080fd5b80516135e06131bf8261317a565b81815260059190911b820183019083810190878311156135ff57600080fd5b928401925b8284101561361d57835182529284019290840190613604565b979650505050505050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6000828210156136c2576136c2613439565b500390565b85815284602082015260a0604082015260006136e660a0830186613532565b6001600160a01b0394909416606083015250608001529392505050565b60008060006060848603121561371857600080fd5b8351925060208401519150604084015190509250925092565b6000826137405761374061349d565b50069056fea2646970667358221220d0bdd2788fd45fc900ff9d9010470608823b3ab90ff3762eb1de9fe0b684213a64736f6c634300080f00334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65728be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0
Deployed ByteCode
0x6080604052600436106104355760003560e01c806388e765ff11610229578063c624507e1161012e578063e2f45605116100b6578063f5648a4f1161007a578063f5648a4f14610c2a578063f637434214610c3f578063f66bf22914610c55578063fb002c9714610c6b578063fbe8d4b714610c8157600080fd5b8063e2f4560514610ba8578063ee40166e14610bbe578063f11a24d314610bd4578063f2fde38b14610bea578063f498cceb14610c0a57600080fd5b8063d85ba063116100fd578063d85ba06314610ae6578063dc3f0d0f14610afc578063dd62ed3e14610b1c578063e0bf7fd114610b62578063e2277cbb14610b9257600080fd5b8063c624507e14610a7a578063c8b6887514610a90578063d257b34f14610ab0578063d73792a914610ad057600080fd5b8063a457c2d7116101b1578063b62496f511610180578063b62496f5146109cb578063bbc0c742146109fb578063c024666814610a1a578063c17b5b8c14610a3a578063c2cca05e14610a5a57600080fd5b8063a457c2d714610955578063a716b77314610975578063a9059cbb14610995578063ac74b4d2146109b557600080fd5b80639764d123116101f85780639764d123146108d95780639a7a23d6146108ef5780639bc738cf1461090f5780639cb9cd48146109255780639d2aee5f1461093b57600080fd5b806388e765ff1461087b5780638b28cd19146108915780638da5cb5b146108a657806395d89b41146108c457600080fd5b80634985746f1161033a5780636c0aa525116102c25780637455df62116102865780637455df62146107f0578063751039fc146108065780637571336a1461081b5780638095d5641461083b5780638366e79a1461085b57600080fd5b80636c0aa525146107715780636ddd17131461078657806370a08231146107a6578063715018a6146107c657806371a03d55146107db57600080fd5b806351f205e41161030957806351f205e4146107055780635a139dd41461071a57806366d602ae146107305780636902ca61146107465780636a486a8e1461075b57600080fd5b80634985746f1461069f578063499b8394146106b55780634a62bb65146106d55780634f77f6c0146106ef57600080fd5b80631f6df910116103bd5780632be32b611161038c5780632be32b611461060d578063313ce5671461062d57806339509351146106495780633a2bbd6f14610669578063452ed4f11461067f57600080fd5b80631f6df910146105975780632307b441146105ad57806323b872dd146105cd578063285b9747146105ed57600080fd5b80630c69dfae116104045780630c69dfae146104f057806310d5de531461051257806316d7b6f31461054257806318160ddd146105625780631a8145bb1461058157600080fd5b806306132a941461044157806306fdde031461047e5780630758d924146104a0578063095ea7b3146104c057600080fd5b3661043c57005b600080fd5b34801561044d57600080fd5b5061046161045c366004613060565b610c9b565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561048a57600080fd5b50610493610cc5565b6040516104759190613079565b3480156104ac57600080fd5b50601054610461906001600160a01b031681565b3480156104cc57600080fd5b506104e06104db3660046130e3565b610d57565b6040519015158152602001610475565b3480156104fc57600080fd5b5061051061050b366004613060565b610d6d565b005b34801561051e57600080fd5b506104e061052d36600461310f565b60266020526000908152604090205460ff1681565b34801561054e57600080fd5b5061051061055d366004613060565b610dcc565b34801561056e57600080fd5b506002545b604051908152602001610475565b34801561058d57600080fd5b5061057360225481565b3480156105a357600080fd5b5061057360095481565b3480156105b957600080fd5b506105106105c8366004613209565b610e16565b3480156105d957600080fd5b506104e06105e83660046132cb565b610ebd565b3480156105f957600080fd5b5061051061060836600461331a565b610f67565b34801561061957600080fd5b50610510610628366004613060565b610fa4565b34801561063957600080fd5b5060405160128152602001610475565b34801561065557600080fd5b506104e06106643660046130e3565b6110af565b34801561067557600080fd5b50610573600a5481565b34801561068b57600080fd5b50601154610461906001600160a01b031681565b3480156106ab57600080fd5b50610573600f5481565b3480156106c157600080fd5b506105106106d036600461310f565b6110eb565b3480156106e157600080fd5b506015546104e09060ff1681565b3480156106fb57600080fd5b50610573601e5481565b34801561071157600080fd5b5061051061114a565b34801561072657600080fd5b5061057360175481565b34801561073c57600080fd5b5061057360075481565b34801561075257600080fd5b50610510611253565b34801561076757600080fd5b50610573601d5481565b34801561077d57600080fd5b506105106112b5565b34801561079257600080fd5b506015546104e09062010000900460ff1681565b3480156107b257600080fd5b506105736107c136600461310f565b61133a565b3480156107d257600080fd5b50610510611355565b3480156107e757600080fd5b50600854610573565b3480156107fc57600080fd5b5061057360195481565b34801561081257600080fd5b506105106113c9565b34801561082757600080fd5b50610510610836366004613337565b611428565b34801561084757600080fd5b50610510610856366004613370565b6114f0565b34801561086757600080fd5b506104e061087636600461339c565b611594565b34801561088757600080fd5b5061057360065481565b34801561089d57600080fd5b50610573611717565b3480156108b257600080fd5b506005546001600160a01b0316610461565b3480156108d057600080fd5b506104936118c8565b3480156108e557600080fd5b50610573601c5481565b3480156108fb57600080fd5b5061051061090a366004613337565b6118d7565b34801561091b57600080fd5b5061057360235481565b34801561093157600080fd5b5061057360205481565b34801561094757600080fd5b50600e546104e09060ff1681565b34801561096157600080fd5b506104e06109703660046130e3565b6119cb565b34801561098157600080fd5b5061051061099036600461310f565b611a64565b3480156109a157600080fd5b506104e06109b03660046130e3565b611aa7565b3480156109c157600080fd5b50610573601a5481565b3480156109d757600080fd5b506104e06109e636600461310f565b60276020526000908152604090205460ff1681565b348015610a0757600080fd5b506015546104e090610100900460ff1681565b348015610a2657600080fd5b50610510610a35366004613337565b611ab4565b348015610a4657600080fd5b50610510610a55366004613370565b611b3d565b348015610a6657600080fd5b50610510610a75366004613060565b611be1565b348015610a8657600080fd5b50610573601b5481565b348015610a9c57600080fd5b50610510610aab36600461331a565b611c81565b348015610abc57600080fd5b50610510610acb366004613060565b611cbe565b348015610adc57600080fd5b5061057360245481565b348015610af257600080fd5b5061057360165481565b348015610b0857600080fd5b50610510610b17366004613060565b611d48565b348015610b2857600080fd5b50610573610b3736600461339c565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610b6e57600080fd5b506104e0610b7d36600461310f565b60256020526000908152604090205460ff1681565b348015610b9e57600080fd5b50610573600d5481565b348015610bb457600080fd5b5061057360125481565b348015610bca57600080fd5b5061057360145481565b348015610be057600080fd5b5061057360185481565b348015610bf657600080fd5b50610510610c0536600461310f565b611e4c565b348015610c1657600080fd5b50610510610c25366004613060565b611f37565b348015610c3657600080fd5b50610510611f66565b348015610c4b57600080fd5b50610573601f5481565b348015610c6157600080fd5b50610573600b5481565b348015610c7757600080fd5b5061057360215481565b348015610c8d57600080fd5b50600c546104e09060ff1681565b60088181548110610cab57600080fd5b6000918252602090912001546001600160a01b0316905081565b606060038054610cd4906133ca565b80601f0160208091040260200160405190810160405280929190818152602001828054610d00906133ca565b8015610d4d5780601f10610d2257610100808354040283529160200191610d4d565b820191906000526020600020905b815481529060010190602001808311610d3057829003601f168201915b5050505050905090565b6000610d64338484611ff9565b50600192915050565b6005546001600160a01b03163314610da05760405162461bcd60e51b8152600401610d9790613404565b60405180910390fd5b600081118015610db257506101688111155b610dbb57600080fd5b610dc681603c61344f565b60095550565b6005546001600160a01b03163314610df65760405162461bcd60e51b8152600401610d9790613404565b600a8110158015610e08575060648111155b610e1157600080fd5b600d55565b6005546001600160a01b03163314610e405760405162461bcd60e51b8152600401610d9790613404565b8051825114610e4e57600080fd5b610258825110610e5d57600080fd5b60005b8251811015610eb857610ea633848381518110610e7f57610e7f61346e565b6020026020010151848481518110610e9957610e9961346e565b602002602001015161211d565b80610eb081613484565b915050610e60565b505050565b6000610eca848484612272565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610f4f5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610d97565b610f5c8533858403611ff9565b506001949350505050565b6005546001600160a01b03163314610f915760405162461bcd60e51b8152600401610d9790613404565b600c805460ff1916911515919091179055565b6005546001600160a01b03163314610fce5760405162461bcd60e51b8152600401610d9790613404565b60018110158015610fe05750600a8111155b6110525760405162461bcd60e51b815260206004820152603b60248201527f4d61782062757920616d6f756e742063616e6e6f74206265206c6f776572207460448201527f68616e20302e3125206f722067726561746572207468616e20312500000000006064820152608401610d97565b6103e88161105f60025490565b611069919061344f565b61107391906134b3565b60068190556040519081527ffcc0366804aaa8dbf88a2924100c733b70dec8445957a5d5f8ff92898de41009906020015b60405180910390a150565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610d649185906110e69086906134c7565b611ff9565b6005546001600160a01b031633146111155760405162461bcd60e51b8152600401610d9790613404565b6001600160a01b03811661112857600080fd5b601380546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146111745760405162461bcd60e51b8152600401610d9790613404565b6012546111803061133a565b10156111f6576040805162461bcd60e51b81526020600482015260248101919091527f43616e206f6e6c792073776170207768656e20746f6b656e20616d6f756e742060448201527f6973206174206f7220686967686572207468616e207265737472696374696f6e6064820152608401610d97565b6011805460ff60a01b1916600160a01b1790556112116128f4565b6011805460ff60a01b191690556040514281527f1b56c383f4f48fc992e45667ea4eabae777b9cca68b516a9562d8cda78f1bb329060200160405180910390a1565b6005546001600160a01b0316331461127d5760405162461bcd60e51b8152600401610d9790613404565b6015805460ff191660011790556040517f10d778167c503500f2cf7f114521871c5ab9b6ac8e63dfc9284c73e05d94b49690600090a1565b6005546001600160a01b031633146112df5760405162461bcd60e51b8152600401610d9790613404565b601a54601e819055601b54601f819055601c5460208190559161130291906134c7565b61130c91906134c7565b601d556040517fbd1bc3a773a28200c07021d303bf41b8a933e04e70107abd2badfad8030c4bc490600090a1565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b0316331461137f5760405162461bcd60e51b8152600401610d9790613404565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b031633146113f35760405162461bcd60e51b8152600401610d9790613404565b6015805460ff191690556040517fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c90600090a1565b6005546001600160a01b031633146114525760405162461bcd60e51b8152600401610d9790613404565b806114c5576011546001600160a01b03908116908316036114c55760405162461bcd60e51b815260206004820152602760248201527f43616e6e6f742072656d6f766520756e697377617020706169722066726f6d2060448201526636b0bc103a3c3760c91b6064820152608401610d97565b6001600160a01b03919091166000908152602660205260409020805460ff1916911515919091179055565b6005546001600160a01b0316331461151a5760405162461bcd60e51b8152600401610d9790613404565b6017839055601882905560198190558061153483856134c7565b61153e91906134c7565b60168190556105dc1015610eb85760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313525206f72206c6573730000006044820152606401610d97565b6005546000906001600160a01b031633146115c15760405162461bcd60e51b8152600401610d9790613404565b6001600160a01b0383166115d457600080fd5b306001600160a01b038416036115e957600080fd5b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015611630573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165491906134df565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb906044016020604051808303816000875af11580156116a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116cb91906134f8565b604080516001600160a01b0387168152602081018490529193507fdeda980967fcead7b61e78ac46a4da14274af29e894d4d61e8b81ec38ab3e438910160405180910390a15092915050565b604080516002808252606082018352600092839291906020830190803683375050601054604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015611785573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a99190613515565b816000815181106117bc576117bc61346e565b60200260200101906001600160a01b031690816001600160a01b03168152505030816001815181106117f0576117f061346e565b6001600160a01b0392909216602092830291909101820152604080516002808252606082018352600093919290918301908036833701905050601054600b5460405163d06ca61f60e01b81529293506001600160a01b039091169163d06ca61f9161185f918690600401613576565b600060405180830381865afa15801561187c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118a49190810190613597565b9050806001815181106118b9576118b961346e565b60200260200101519250505090565b606060048054610cd4906133ca565b6005546001600160a01b031633146119015760405162461bcd60e51b8152600401610d9790613404565b6011546001600160a01b03908116908316036119855760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610d97565b61198f8282612ac0565b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015611a4d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610d97565b611a5a3385858403611ff9565b5060019392505050565b6005546001600160a01b03163314611a8e5760405162461bcd60e51b8152600401610d9790613404565b611a99816001611ab4565b611aa4816001612aea565b50565b6000610d64338484612272565b6005546001600160a01b03163314611ade5760405162461bcd60e51b8152600401610d9790613404565b6001600160a01b038216600081815260256020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b03163314611b675760405162461bcd60e51b8152600401610d9790613404565b601e839055601f829055602081905580611b8183856134c7565b611b8b91906134c7565b601d8190556107d01015610eb85760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420323025206f72206c6573730000006044820152606401610d97565b6005546001600160a01b03163314611c0b5760405162461bcd60e51b8152600401610d9790613404565b60028110158015611c1d575060648111155b611c7c5760405162461bcd60e51b815260206004820152602a60248201527f4d757374206b656570206e756d626572206f662062757973206265747765656e6044820152690203220616e64203130360b41b6064820152608401610d97565b600a55565b6005546001600160a01b03163314611cab5760405162461bcd60e51b8152600401610d9790613404565b600e805460ff1916911515919091179055565b6005546001600160a01b03163314611ce85760405162461bcd60e51b8152600401610d9790613404565b620186a0611cf560025490565b611d0090600161344f565b611d0a91906134b3565b811015611d1657600080fd5b6103e8611d2260025490565b611d2d90600161344f565b611d3791906134b3565b811115611d4357600080fd5b601255565b6005546001600160a01b03163314611d725760405162461bcd60e51b8152600401610d9790613404565b60018110158015611d845750600a8111155b611df65760405162461bcd60e51b815260206004820152603c60248201527f4d61782073656c6c20616d6f756e742063616e6e6f74206265206c6f7765722060448201527f7468616e20302e3125206f722067726561746572207468616e203125000000006064820152608401610d97565b6103e881611e0360025490565b611e0d919061344f565b611e1791906134b3565b60078190556040519081527f53c4eb831d8cfeb750f1c62590d8cd30f4c6f0380d29a05caa09f0d92588560e906020016110a4565b6005546001600160a01b03163314611e765760405162461bcd60e51b8152600401610d9790613404565b6001600160a01b038116611edb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d97565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314611f615760405162461bcd60e51b8152600401610d9790613404565b600b55565b6005546001600160a01b03163314611f905760405162461bcd60e51b8152600401610d9790613404565b6000611fa46005546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114611fee576040519150601f19603f3d011682016040523d82523d6000602084013e611ff3565b606091505b50505050565b6001600160a01b03831661205b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610d97565b6001600160a01b0382166120bc5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610d97565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166121435760405162461bcd60e51b8152600401610d9790613628565b6001600160a01b0382166121695760405162461bcd60e51b8152600401610d979061366d565b6001600160a01b038316600090815260208190526040902054818110156121e15760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610d97565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906122189084906134c7565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161226491815260200190565b60405180910390a350505050565b6001600160a01b0383166122985760405162461bcd60e51b8152600401610d9790613628565b6001600160a01b0382166122be5760405162461bcd60e51b8152600401610d979061366d565b6000811161231d5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e73666572206d75737420626520677265617465722060448201526507468616e20360d41b6064820152608401610d97565b601554610100900460ff166123b0576001600160a01b03831660009081526025602052604090205460ff168061236b57506001600160a01b03821660009081526025602052604090205460ff165b6123b05760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610d97565b60155460ff1615612510576005546001600160a01b038481169116148015906123e757506005546001600160a01b03838116911614155b80156123fb57506001600160a01b03821615155b801561241257506001600160a01b03821661dead14155b801561243757506001600160a01b03831660009081526025602052604090205460ff16155b801561245c57506001600160a01b03821660009081526025602052604090205460ff16155b15612510576001600160a01b03831660009081526027602052604090205460ff1680156124a257506001600160a01b03821660009081526026602052604090205460ff16155b156124bb576006548111156124b657600080fd5b612510565b6001600160a01b03821660009081526027602052604090205460ff1680156124fc57506001600160a01b03831660009081526026602052604090205460ff16155b156125105760075481111561251057600080fd5b600061251b3061133a565b6012549091508110801590819061253a575060155462010000900460ff165b80156125505750601154600160a01b900460ff16155b801561257557506001600160a01b03851660009081526027602052604090205460ff16155b801561259a57506001600160a01b03851660009081526025602052604090205460ff16155b80156125bf57506001600160a01b03841660009081526025602052604090205460ff16155b156125ed576011805460ff60a01b1916600160a01b1790556125df6128f4565b6011805460ff60a01b191690555b6001600160a01b03851660009081526025602052604090205460019060ff168061262f57506001600160a01b03851660009081526025602052604090205460ff165b15612638575060005b600081156128e0576001600160a01b03861660009081526027602052604090205460ff16801561266a57506000601d54115b1561272257602454601d5461267f908761344f565b61268991906134b3565b9050601d54601f548261269c919061344f565b6126a691906134b3565b602260008282546126b791906134c7565b9091555050601d54601e546126cc908361344f565b6126d691906134b3565b602160008282546126e791906134c7565b9091555050601d546020546126fc908361344f565b61270691906134b3565b6023600082825461271791906134c7565b909155506128c29050565b6001600160a01b03871660009081526027602052604090205460ff16156128c257600e5460ff161561279f57600954600f5461275e91906134c7565b4210158015612774575067016345785d8a000047115b80156127845750600a5460085410155b156127975761279286612b4d565b61279f565b61279f612c8c565b600c5460ff1615806127b757506127b4611717565b85115b1561280857600880546001810182556000919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b0388161790555b42600f55601654156128c257602454601654612824908761344f565b61282e91906134b3565b905060165460185482612841919061344f565b61284b91906134b3565b6022600082825461285c91906134c7565b9091555050601654601754612871908361344f565b61287b91906134b3565b6021600082825461288c91906134c7565b90915550506016546019546128a1908361344f565b6128ab91906134b3565b602360008282546128bc91906134c7565b90915550505b80156128d3576128d387308361211d565b6128dd81866136b0565b94505b6128eb87878761211d565b50505050505050565b60006128ff3061133a565b9050600060235460215460225461291691906134c7565b61292091906134c7565b905081158061292d575080155b15612936575050565b60125461294490600a61344f565b82111561295c5760125461295990600a61344f565b91505b60008060028360225486612970919061344f565b61297a91906134b3565b61298491906134b3565b90504761299961299483876136b0565b612d08565b60006129a582476136b0565b90506000819050600060026022546129bd91906134b3565b6129c790886136b0565b6021546129d4908561344f565b6129de91906134b3565b9050600060026022546129f191906134b3565b6129fb90896136b0565b602354612a08908661344f565b612a1291906134b3565b9050612a1e81836134c7565b612a2890846136b0565b60006022819055602181905560235592508515801590612a485750600083115b15612a5757612a578684612e62565b8115612ab5576013546040516001600160a01b03909116908390600081818185875af1925050503d8060008114612aaa576040519150601f19603f3d011682016040523d82523d6000602084013e612aaf565b606091505b50909750505b505050505050505050565b6001600160a01b0382166000908152602760205260409020805460ff191682151517905561198f82825b6001600160a01b038216600081815260266020908152604091829020805460ff19168515159081179091558251938452908301527f6b4f1be9103e6cbcd38ca4a922334f2c3109b260130a6676a987f94088fd6746910160405180910390a15050565b600080612b8e6001600a54612b618661133a565b612b6c61dead61133a565b612b753061133a565b612b7f91906134c7565b612b8991906134c7565b612f0d565b60088054919250600091612ba39084906136b0565b81548110612bb357612bb361346e565b6000918252602082200154600d546001600160a01b039091169250606490612bdb904761344f565b612be591906134b3565b9050816001600160a01b03168160405160006040518083038185875af1925050503d8060008114612c32576040519150601f19603f3d011682016040523d82523d6000602084013e612c37565b606091505b50909450508315612c79576040516001600160a01b0383169082907f1c444bb01a9b6955e398726cbe1735a08d6bf37c11d2a5054a3925bf66f3156b90600090a35b612c856008600061302e565b5050505050565b6011546000908190612cb090600190600a90612b61906001600160a01b031661133a565b90506000612cbf6002476134b3565b50506040516000915081903090819083908181818181875af1925050503d80600081146128eb576040519150601f19603f3d011682016040523d82523d6000602084013e6128eb565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612d3d57612d3d61346e565b6001600160a01b03928316602091820292909201810191909152601054604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612d96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dba9190613515565b81600181518110612dcd57612dcd61346e565b6001600160a01b039283166020918202929092010152601054612df39130911684611ff9565b60105460405163791ac94760e01b81526001600160a01b039091169063791ac94790612e2c9085906000908690309042906004016136c7565b600060405180830381600087803b158015612e4657600080fd5b505af1158015612e5a573d6000803e3d6000fd5b505050505050565b601054612e7a9030906001600160a01b031684611ff9565b60105460405163f305d71960e01b815230600482015260248101849052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015612ee8573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612c859190613703565b6040516bffffffffffffffffffffffff193360601b16602082015260009081908390439042906034016040516020818303038152906040528051906020012060001c612f5991906134b3565b6040516bffffffffffffffffffffffff194160601b166020820152459042906034016040516020818303038152906040528051906020012060001c612f9e91906134b3565b612fa844426134c7565b612fb291906134c7565b612fbc91906134c7565b612fc691906134c7565b612fd091906134c7565b612fda91906134c7565b604051602001612fec91815260200190565b60408051601f19818403018152919052805160209091012090508461301181866136b0565b61301b9083613731565b61302591906134c7565b95945050505050565b5080546000825590600052602060002090810190611aa491905b8082111561305c5760008155600101613048565b5090565b60006020828403121561307257600080fd5b5035919050565b600060208083528351808285015260005b818110156130a65785810183015185820160400152820161308a565b818111156130b8576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114611aa457600080fd5b600080604083850312156130f657600080fd5b8235613101816130ce565b946020939093013593505050565b60006020828403121561312157600080fd5b813561312c816130ce565b9392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561317257613172613133565b604052919050565b600067ffffffffffffffff82111561319457613194613133565b5060051b60200190565b600082601f8301126131af57600080fd5b813560206131c46131bf8361317a565b613149565b82815260059290921b840181019181810190868411156131e357600080fd5b8286015b848110156131fe57803583529183019183016131e7565b509695505050505050565b6000806040838503121561321c57600080fd5b823567ffffffffffffffff8082111561323457600080fd5b818501915085601f83011261324857600080fd5b813560206132586131bf8361317a565b82815260059290921b8401810191818101908984111561327757600080fd5b948201945b8386101561329e57853561328f816130ce565b8252948201949082019061327c565b965050860135925050808211156132b457600080fd5b506132c18582860161319e565b9150509250929050565b6000806000606084860312156132e057600080fd5b83356132eb816130ce565b925060208401356132fb816130ce565b929592945050506040919091013590565b8015158114611aa457600080fd5b60006020828403121561332c57600080fd5b813561312c8161330c565b6000806040838503121561334a57600080fd5b8235613355816130ce565b915060208301356133658161330c565b809150509250929050565b60008060006060848603121561338557600080fd5b505081359360208301359350604090920135919050565b600080604083850312156133af57600080fd5b82356133ba816130ce565b91506020830135613365816130ce565b600181811c908216806133de57607f821691505b6020821081036133fe57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561346957613469613439565b500290565b634e487b7160e01b600052603260045260246000fd5b60006001820161349657613496613439565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826134c2576134c261349d565b500490565b600082198211156134da576134da613439565b500190565b6000602082840312156134f157600080fd5b5051919050565b60006020828403121561350a57600080fd5b815161312c8161330c565b60006020828403121561352757600080fd5b815161312c816130ce565b600081518084526020808501945080840160005b8381101561356b5781516001600160a01b031687529582019590820190600101613546565b509495945050505050565b82815260406020820152600061358f6040830184613532565b949350505050565b600060208083850312156135aa57600080fd5b825167ffffffffffffffff8111156135c157600080fd5b8301601f810185136135d257600080fd5b80516135e06131bf8261317a565b81815260059190911b820183019083810190878311156135ff57600080fd5b928401925b8284101561361d57835182529284019290840190613604565b979650505050505050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6000828210156136c2576136c2613439565b500390565b85815284602082015260a0604082015260006136e660a0830186613532565b6001600160a01b0394909416606083015250608001529392505050565b60008060006060848603121561371857600080fd5b8351925060208401519150604084015190509250925092565b6000826137405761374061349d565b50069056fea2646970667358221220d0bdd2788fd45fc900ff9d9010470608823b3ab90ff3762eb1de9fe0b684213a64736f6c634300080f0033