Contract Information

Explore the source code, ABI, and bytecode for the NeuroniAI smart contract.
More Info

NeuroniAI Source Code

{"AntiSniper.sol":{"content":"//SPDX-License-Identifier: UNLICENSED\r\n\r\npragma solidity 0.8.7;\r\n\r\nimport \"./Libraries.sol\";\r\nimport \"./Interfaces.sol\";\r\nimport \"./BaseErc20.sol\";\r\n\r\ninterface IPinkAntiBot {\r\n function setTokenOwner(address owner) external;\r\n function onPreTransferCheck(address from, address to, uint256 amount) external;\r\n}\r\n\r\nabstract contract AntiSniper is BaseErc20 {\r\n \r\n IPinkAntiBot public pinkAntiBot;\r\n bool private pinkAntiBotConfigured;\r\n\r\n bool public enableSniperBlocking;\r\n bool public enableBlockLogProtection;\r\n bool public enableHighTaxCountdown;\r\n bool public enablePinkAntiBot;\r\n \r\n uint256 public msPercentage;\r\n uint256 public mhPercentage;\r\n uint256 public maxGasLimit;\r\n\r\n uint256 public launchTime;\r\n uint256 public launchBlock;\r\n uint256 public snipersCaught;\r\n \r\n mapping (address =\u003e bool) public isSniper;\r\n mapping (address =\u003e bool) public isNeverSniper;\r\n mapping (address =\u003e uint256) public transactionBlockLog;\r\n \r\n // Overrides\r\n \r\n function configure(address _owner) internal virtual override {\r\n isNeverSniper[_owner] = true;\r\n super.configure(_owner);\r\n }\r\n \r\n function launch() override virtual public onlyOwner {\r\n super.launch();\r\n launchTime = block.timestamp;\r\n launchBlock = block.number;\r\n }\r\n \r\n function preTransfer(address from, address to, uint256 value) override virtual internal {\r\n require(enableSniperBlocking == false || isSniper[msg.sender] == false, \"sniper rejected\");\r\n \r\n if (launched \u0026\u0026 from != owner \u0026\u0026 isNeverSniper[from] == false \u0026\u0026 isNeverSniper[to] == false) {\r\n \r\n if (maxGasLimit \u003e 0) {\r\n require(gasleft() \u003c= maxGasLimit, \"this is over the max gas limit\");\r\n }\r\n \r\n if (mhPercentage \u003e 0 \u0026\u0026 exchanges[to] == false) {\r\n require (_balances[to] + value \u003c= mhAmount(), \"this is over the max hold amount\");\r\n }\r\n \r\n if (msPercentage \u003e 0 \u0026\u0026 exchanges[to]) {\r\n require (value \u003c= msAmount(), \"this is over the max sell amount\");\r\n }\r\n \r\n if(enableBlockLogProtection) {\r\n if (transactionBlockLog[to] == block.number) {\r\n isSniper[to] = true;\r\n snipersCaught ++;\r\n }\r\n if (transactionBlockLog[from] == block.number) {\r\n isSniper[from] = true;\r\n snipersCaught ++;\r\n }\r\n if (exchanges[to] == false) {\r\n transactionBlockLog[to] = block.number;\r\n }\r\n if (exchanges[from] == false) {\r\n transactionBlockLog[from] = block.number;\r\n }\r\n }\r\n \r\n if (enablePinkAntiBot) {\r\n pinkAntiBot.onPreTransferCheck(from, to, value);\r\n }\r\n }\r\n \r\n super.preTransfer(from, to, value);\r\n }\r\n \r\n function calculateTransferAmount(address from, address to, uint256 value) internal virtual override returns (uint256) {\r\n uint256 amountAfterTax = value;\r\n if (launched \u0026\u0026 enableHighTaxCountdown) {\r\n if (from != owner \u0026\u0026 sniperTax() \u003e 0 \u0026\u0026 isNeverSniper[from] == false \u0026\u0026 isNeverSniper[to] == false) {\r\n uint256 taxAmount = (value * sniperTax()) / 10000;\r\n amountAfterTax = amountAfterTax - taxAmount;\r\n }\r\n }\r\n return super.calculateTransferAmount(from, to, amountAfterTax);\r\n }\r\n \r\n // Public methods\r\n \r\n function mhAmount() public view returns (uint256) {\r\n return (_totalSupply * mhPercentage) / 10000;\r\n }\r\n \r\n function msAmount() public view returns (uint256) {\r\n return (_totalSupply * msPercentage) / 10000;\r\n }\r\n \r\n function sniperTax() public virtual view returns (uint256) {\r\n if(launched) {\r\n if (block.number - launchBlock \u003c 3) {\r\n return 9900;\r\n }\r\n }\r\n return 0;\r\n }\r\n \r\n // Admin methods\r\n \r\n function configurePinkAntiBot(address antiBot) external onlyOwner {\r\n pinkAntiBot = IPinkAntiBot(antiBot);\r\n pinkAntiBot.setTokenOwner(owner);\r\n pinkAntiBotConfigured = true;\r\n enablePinkAntiBot = true;\r\n }\r\n \r\n function setSniperBlocking(bool enabled) external onlyOwner {\r\n enableSniperBlocking = enabled;\r\n }\r\n \r\n function setBlockLogProtection(bool enabled) external onlyOwner {\r\n enableBlockLogProtection = enabled;\r\n }\r\n \r\n function setHighTaxCountdown(bool enabled) external onlyOwner {\r\n enableHighTaxCountdown = enabled;\r\n }\r\n \r\n function setPinkAntiBot(bool enabled) external onlyOwner {\r\n require(pinkAntiBotConfigured, \"pink anti bot is not configured\");\r\n enablePinkAntiBot = enabled;\r\n }\r\n \r\n function setMsPercentage(uint256 amount) external onlyOwner {\r\n msPercentage = amount;\r\n }\r\n \r\n function setMhPercentage(uint256 amount) external onlyOwner {\r\n mhPercentage = amount;\r\n }\r\n \r\n function setMaxGasLimit(uint256 amount) external onlyOwner {\r\n maxGasLimit = amount;\r\n }\r\n \r\n function setIsSniper(address who, bool enabled) external onlyOwner {\r\n isSniper[who] = enabled;\r\n }\r\n\r\n function setNeverSniper(address who, bool enabled) external onlyOwner {\r\n isNeverSniper[who] = enabled;\r\n }\r\n\r\n // private methods\r\n}"},"BaseErc20.sol":{"content":"//SPDX-License-Identifier: UNLICENSED\r\n\r\npragma solidity 0.8.7;\r\n\r\nimport \"./Interfaces.sol\";\r\nimport \"./Libraries.sol\";\r\n\r\nabstract contract BaseErc20 is IERC20, IOwnable {\r\n\r\n mapping (address =\u003e uint256) internal _balances;\r\n mapping (address =\u003e mapping (address =\u003e uint256)) internal _allowed;\r\n uint256 internal _totalSupply;\r\n bool internal _useSafeTransfer;\r\n \r\n string public symbol;\r\n string public name;\r\n uint8 public decimals;\r\n \r\n address public override owner;\r\n bool public isTradingEnabled = true;\r\n bool public launched;\r\n \r\n mapping (address =\u003e bool) public canAlwaysTrade;\r\n mapping (address =\u003e bool) public excludedFromSelling;\r\n mapping (address =\u003e bool) public exchanges;\r\n \r\n modifier onlyOwner() {\r\n require(msg.sender == owner, \"can only be called by the contract owner\");\r\n _;\r\n }\r\n \r\n modifier isLaunched() {\r\n require(launched, \"can only be called once token is launched\");\r\n _;\r\n }\r\n\r\n // @dev Trading is allowed before launch if the sender is the owner, we are transferring from the owner, or in canAlwaysTrade list\r\n modifier tradingEnabled(address from) {\r\n require((isTradingEnabled \u0026\u0026 launched) || from == owner || canAlwaysTrade[msg.sender], \"trading not enabled\");\r\n _;\r\n }\r\n \r\n\r\n function configure(address _owner) internal virtual {\r\n owner = _owner;\r\n canAlwaysTrade[owner] = true;\r\n }\r\n\r\n /**\r\n * @dev Total number of tokens in existence\r\n */\r\n function totalSupply() external override view returns (uint256) {\r\n return _totalSupply;\r\n }\r\n\r\n /**\r\n * @dev Gets the balance of the specified address.\r\n * @param _owner The address to query the balance of.\r\n * @return An uint256 representing the amount owned by the passed address.\r\n */\r\n function balanceOf(address _owner) external override view returns (uint256) {\r\n return _balances[_owner];\r\n }\r\n\r\n /**\r\n * @dev Function to check the amount of tokens that an owner allowed to a spender.\r\n * @param _owner address The address which owns the funds.\r\n * @param spender address The address which will spend the funds.\r\n * @return A uint256 specifying the amount of tokens still available for the spender.\r\n */\r\n function allowance(address _owner, address spender) external override view returns (uint256) {\r\n return _allowed[_owner][spender];\r\n }\r\n\r\n /**\r\n * @dev Transfer token for a specified address\r\n * @param to The address to transfer to.\r\n * @param value The amount to be transferred.\r\n */\r\n function transfer(address to, uint256 value) external override tradingEnabled(msg.sender) returns (bool) {\r\n _transfer(msg.sender, to, value);\r\n return true;\r\n }\r\n\r\n /**\r\n * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.\r\n * Beware that changing an allowance with this method brings the risk that someone may use both the old\r\n * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this\r\n * race condition is to first reduce the spender\u0027s allowance to 0 and set the desired value afterwards:\r\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\r\n * @param spender The address which will spend the funds.\r\n * @param value The amount of tokens to be spent.\r\n */\r\n function approve(address spender, uint256 value) external override tradingEnabled(msg.sender) returns (bool) {\r\n require(spender != address(0), \"cannot approve the 0 address\");\r\n\r\n _allowed[msg.sender][spender] = value;\r\n emit Approval(msg.sender, spender, value);\r\n return true;\r\n }\r\n\r\n /**\r\n * @dev Transfer tokens from one address to another.\r\n * Note that while this function emits an Approval event, this is not required as per the specification,\r\n * and other compliant implementations may not emit the event.\r\n * @param from address The address which you want to send tokens from\r\n * @param to address The address which you want to transfer to\r\n * @param value uint256 the amount of tokens to be transferred\r\n */\r\n function transferFrom(address from, address to, uint256 value) external override tradingEnabled(from) returns (bool) {\r\n _allowed[from][msg.sender] = _allowed[from][msg.sender] - value;\r\n _transfer(from, to, value);\r\n emit Approval(from, msg.sender, _allowed[from][msg.sender]);\r\n return true;\r\n }\r\n\r\n /**\r\n * @dev Increase the amount of tokens that an owner allowed to a spender.\r\n * approve should be called when allowed_[_spender] == 0. To increment\r\n * allowed value is better to use this function to avoid 2 calls (and wait until\r\n * the first transaction is mined)\r\n * From MonolithDAO Token.sol\r\n * Emits an Approval event.\r\n * @param spender The address which will spend the funds.\r\n * @param addedValue The amount of tokens to increase the allowance by.\r\n */\r\n function increaseAllowance(address spender, uint256 addedValue) external tradingEnabled(msg.sender) returns (bool) {\r\n require(spender != address(0), \"cannot approve the 0 address\");\r\n\r\n _allowed[msg.sender][spender] = _allowed[msg.sender][spender] + addedValue;\r\n emit Approval(msg.sender, spender, _allowed[msg.sender][spender]);\r\n return true;\r\n }\r\n\r\n /**\r\n * @dev Decrease the amount of tokens that an owner allowed to a spender.\r\n * approve should be called when allowed_[_spender] == 0. To decrement\r\n * allowed value is better to use this function to avoid 2 calls (and wait until\r\n * the first transaction is mined)\r\n * From MonolithDAO Token.sol\r\n * Emits an Approval event.\r\n * @param spender The address which will spend the funds.\r\n * @param subtractedValue The amount of tokens to decrease the allowance by.\r\n */\r\n function decreaseAllowance(address spender, uint256 subtractedValue) external tradingEnabled(msg.sender) returns (bool) {\r\n require(spender != address(0), \"cannot approve the 0 address\");\r\n\r\n _allowed[msg.sender][spender] = _allowed[msg.sender][spender] - subtractedValue;\r\n emit Approval(msg.sender, spender, _allowed[msg.sender][spender]);\r\n return true;\r\n }\r\n\r\n \r\n \r\n // Virtual methods\r\n function launch() virtual public onlyOwner {\r\n launched = true;\r\n }\r\n \r\n function preTransfer(address from, address to, uint256 value) virtual internal { }\r\n\r\n function calculateTransferAmount(address from, address to, uint256 value) virtual internal returns (uint256) {\r\n require(from != to, \"you cannot transfer to yourself\");\r\n return value;\r\n }\r\n \r\n function postTransfer(address from, address to) virtual internal { }\r\n \r\n\r\n\r\n // Admin methods\r\n function changeOwner(address who) external onlyOwner {\r\n require(who != address(0), \"cannot be zero address\");\r\n owner = who;\r\n }\r\n\r\n function removeBnb() external onlyOwner {\r\n uint256 balance = address(this).balance;\r\n payable(owner).transfer(balance);\r\n }\r\n\r\n function transferTokens(address token, address to) external onlyOwner returns(bool){\r\n uint256 balance = IERC20(token).balanceOf(address(this));\r\n return IERC20(token).transfer(to, balance);\r\n }\r\n \r\n function setCanAlwaysTrade(address who, bool enabled) external onlyOwner {\r\n canAlwaysTrade[who] = enabled;\r\n }\r\n \r\n function setExchange(address who, bool isExchange) external onlyOwner {\r\n exchanges[who] = isExchange;\r\n }\r\n \r\n \r\n // Private methods\r\n\r\n function getRouterAddress() internal view returns (address routerAddress) {\r\n if (block.chainid == 1 || block.chainid == 3 || block.chainid == 4 || block.chainid == 5) {\r\n routerAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D ; // ETHEREUM\r\n \r\n } else if (block.chainid == 56) {\r\n routerAddress = 0x10ED43C718714eb63d5aA57B78B54704E256024E; // BSC MAINNET\r\n } else if (block.chainid == 97) {\r\n routerAddress = 0xc99f3718dB7c90b020cBBbb47eD26b0BA0C6512B; // BSC TESTNET - https://pancakeswap.rainbit.me/\r\n } else {\r\n revert(\"Unknown Chain ID\");\r\n }\r\n }\r\n\r\n /**\r\n * @dev Transfer token for a specified addresses\r\n * @param from The address to transfer from.\r\n * @param to The address to transfer to.\r\n * @param value The amount to be transferred.\r\n */\r\n function _transfer(address from, address to, uint256 value) private {\r\n require(to != address(0), \"cannot be zero address\");\r\n require(excludedFromSelling[from] == false, \"address is not allowed to sell\");\r\n \r\n if (_useSafeTransfer) {\r\n\r\n _balances[from] = _balances[from] - value;\r\n _balances[to] = _balances[to] + value;\r\n emit Transfer(from, to, value);\r\n\r\n } else {\r\n preTransfer(from, to, value);\r\n\r\n uint256 modifiedAmount = calculateTransferAmount(from, to, value);\r\n _balances[from] = _balances[from] - value;\r\n _balances[to] = _balances[to] + modifiedAmount;\r\n\r\n emit Transfer(from, to, modifiedAmount);\r\n\r\n postTransfer(from, to);\r\n }\r\n }\r\n}"},"Burnable.sol":{"content":"//SPDX-License-Identifier: UNLICENSED\r\n\r\npragma solidity 0.8.7;\r\n\r\nimport \"./Libraries.sol\";\r\nimport \"./Interfaces.sol\";\r\nimport \"./BaseErc20.sol\";\r\n\r\nabstract contract Burnable is BaseErc20, IBurnable {\r\n \r\n mapping (address =\u003e bool) public ableToBurn;\r\n\r\n modifier onlyBurner() {\r\n require(ableToBurn[msg.sender], \"no burn permissions\");\r\n _;\r\n }\r\n\r\n // Overrides\r\n \r\n function configure(address _owner) internal virtual override {\r\n ableToBurn[_owner] = true;\r\n super.configure(_owner);\r\n }\r\n \r\n \r\n // Admin methods\r\n\r\n function setAbleToBurn(address who, bool enabled) external onlyOwner {\r\n ableToBurn[who] = enabled;\r\n }\r\n\r\n /**\r\n * @dev Internal function that burns an amount of the token of a given\r\n * account.\r\n * @param value The amount that will be burnt.\r\n */\r\n function burn(uint256 value) external override onlyBurner {\r\n _burn(msg.sender, value);\r\n }\r\n\r\n /**\r\n * @dev Internal function that burns an amount of the token of a given\r\n * account, deducting from the sender\u0027s allowance for said account. Uses the\r\n * internal burn function.\r\n * Emits an Approval event (reflecting the reduced allowance).\r\n * @param account The account whose tokens will be burnt.\r\n * @param value The amount that will be burnt.\r\n */\r\n function burnFrom(address account, uint256 value) external override onlyBurner {\r\n _allowed[account][msg.sender] = _allowed[account][msg.sender] - value;\r\n _burn(account, value);\r\n emit Approval(account, msg.sender, _allowed[account][msg.sender]);\r\n }\r\n\r\n\r\n // Private methods\r\n\r\n function _burn(address account, uint256 value) internal {\r\n require(account != address(0));\r\n\r\n _totalSupply = _totalSupply - value;\r\n _balances[account] = _balances[account] - value;\r\n emit Transfer(account, address(0), value);\r\n }\r\n}"},"Interfaces.sol":{"content":"//SPDX-License-Identifier: UNLICENSED\r\n\r\npragma solidity 0.8.7;\r\n\r\ninterface IOwnable {\r\n function owner() external view returns (address);\r\n}\r\n\r\ninterface IERC20 {\r\n function totalSupply() external view returns (uint256);\r\n function balanceOf(address who) external view returns (uint256);\r\n function allowance(address _owner, address spender) external view returns (uint256);\r\n function transfer(address to, uint256 value) external returns (bool);\r\n function approve(address spender, uint256 value) external returns (bool);\r\n function transferFrom(address from, address to, uint256 value) external returns (bool);\r\n\r\n event Transfer(address indexed from, address indexed to, uint256 value);\r\n event Approval(address indexed owner, address indexed spender, uint256 value);\r\n}\r\n\r\ninterface IBurnable {\r\n function burn(uint256 value) external;\r\n function burnFrom(address account, uint256 value) external;\r\n}\r\n\r\ninterface IDEXFactory {\r\n function createPair(address tokenA, address tokenB) external returns (address pair);\r\n}\r\n\r\ninterface IDEXRouter {\r\n function factory() external pure returns (address);\r\n function WETH() external pure returns (address);\r\n function addLiquidityETH(address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline) external payable returns (uint amountToken, uint amountETH, uint liquidity);\r\n function addLiquidity(address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline) external returns (uint amountA, uint amountB, uint liquidity); \r\n function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);\r\n function swapExactTokensForTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);\r\n function swapExactTokensForETHSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);\r\n}\r\n\r\ninterface IDividendDistributor {\r\n function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external;\r\n function setShare(address shareholder, uint256 amount) external;\r\n function depositNative() external payable;\r\n function depositToken(address from, uint256 amount) external;\r\n function process(uint256 gas) external;\r\n function inSwap() external view returns (bool);\r\n}\r\n\r\n\r\ninterface ITaxDistributor {\r\n receive() external payable;\r\n function lastSwapTime() external view returns (uint256);\r\n function inSwap() external view returns (bool);\r\n function createWalletTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external;\r\n function createDistributorTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external;\r\n function createDividendTax(string memory name, uint256 buyTax, uint256 sellTax, address dividendDistributor, bool convertToNative) external;\r\n function createBurnTax(string memory name, uint256 buyTax, uint256 sellTax) external;\r\n function createLiquidityTax(string memory name, uint256 buyTax, uint256 sellTax, address holder) external;\r\n function distribute() external payable;\r\n function getSellTax() external view returns (uint256);\r\n function getBuyTax() external view returns (uint256);\r\n function setTaxWallet(string memory taxName, address wallet) external;\r\n function setSellTax(string memory taxName, uint256 taxPercentage) external;\r\n function setBuyTax(string memory taxName, uint256 taxPercentage) external;\r\n function takeSellTax(uint256 value) external returns (uint256);\r\n function takeBuyTax(uint256 value) external returns (uint256);\r\n}\r\n\r\ninterface IWalletDistributor {\r\n function receiveToken(address token, address from, uint256 amount) external;\r\n}\r\n"},"Libraries.sol":{"content":"//SPDX-License-Identifier: UNLICENSED\r\n\r\npragma solidity 0.8.7;\r\n\r\n/**\r\n * @title SafeMath\r\n * @dev Math operations with safety checks that revert on error\r\n */\r\nlibrary SafeMath {\r\n\r\n int256 constant private INT256_MIN = -2**255;\r\n\r\n /**\r\n * @dev Multiplies two unsigned integers, reverts on overflow.\r\n */\r\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\r\n // Gas optimization: this is cheaper than requiring \u0027a\u0027 not being zero, but the\r\n // benefit is lost if \u0027b\u0027 is also tested.\r\n // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522\r\n if (a == 0) {\r\n return 0;\r\n }\r\n\r\n uint256 c = a * b;\r\n require(c / a == b);\r\n\r\n return c;\r\n }\r\n\r\n /**\r\n * @dev Multiplies two signed integers, reverts on overflow.\r\n */\r\n function mul(int256 a, int256 b) internal pure returns (int256) {\r\n // Gas optimization: this is cheaper than requiring \u0027a\u0027 not being zero, but the\r\n // benefit is lost if \u0027b\u0027 is also tested.\r\n // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522\r\n if (a == 0) {\r\n return 0;\r\n }\r\n\r\n require(!(a == -1 \u0026\u0026 b == INT256_MIN)); // This is the only case of overflow not detected by the check below\r\n\r\n int256 c = a * b;\r\n require(c / a == b);\r\n\r\n return c;\r\n }\r\n\r\n /**\r\n * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero.\r\n */\r\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\r\n // Solidity only automatically asserts when dividing by 0\r\n require(b \u003e 0);\r\n uint256 c = a / b;\r\n // assert(a == b * c + a % b); // There is no case in which this doesn\u0027t hold\r\n\r\n return c;\r\n }\r\n\r\n /**\r\n * @dev Integer division of two signed integers truncating the quotient, reverts on division by zero.\r\n */\r\n function div(int256 a, int256 b) internal pure returns (int256) {\r\n require(b != 0); // Solidity only automatically asserts when dividing by 0\r\n require(!(b == -1 \u0026\u0026 a == INT256_MIN)); // This is the only case of overflow\r\n\r\n int256 c = a / b;\r\n\r\n return c;\r\n }\r\n\r\n /**\r\n * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend).\r\n */\r\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\r\n require(b \u003c= a);\r\n uint256 c = a - b;\r\n\r\n return c;\r\n }\r\n\r\n /**\r\n * @dev Subtracts two signed integers, reverts on overflow.\r\n */\r\n function sub(int256 a, int256 b) internal pure returns (int256) {\r\n int256 c = a - b;\r\n require((b \u003e= 0 \u0026\u0026 c \u003c= a) || (b \u003c 0 \u0026\u0026 c \u003e a));\r\n\r\n return c;\r\n }\r\n\r\n /**\r\n * @dev Adds two unsigned integers, reverts on overflow.\r\n */\r\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\r\n uint256 c = a + b;\r\n require(c \u003e= a);\r\n\r\n return c;\r\n }\r\n\r\n /**\r\n * @dev Adds two signed integers, reverts on overflow.\r\n */\r\n function add(int256 a, int256 b) internal pure returns (int256) {\r\n int256 c = a + b;\r\n require((b \u003e= 0 \u0026\u0026 c \u003e= a) || (b \u003c 0 \u0026\u0026 c \u003c a));\r\n\r\n return c;\r\n }\r\n\r\n /**\r\n * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo),\r\n * reverts when dividing by zero.\r\n */\r\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\r\n require(b != 0);\r\n return a % b;\r\n }\r\n}"},"Taxable.sol":{"content":"//SPDX-License-Identifier: UNLICENSED\r\n\r\npragma solidity 0.8.7;\r\n\r\nimport \"./Libraries.sol\";\r\nimport \"./Interfaces.sol\";\r\nimport \"./BaseErc20.sol\";\r\n\r\nabstract contract Taxable is BaseErc20 {\r\n \r\n ITaxDistributor taxDistributor;\r\n\r\n bool public autoSwapTax;\r\n uint256 public minimumTimeBetweenSwaps;\r\n uint256 public minimumTokensBeforeSwap;\r\n mapping (address =\u003e bool) public excludedFromTax;\r\n uint256 swapStartTime;\r\n \r\n // Overrides\r\n \r\n function configure(address _owner) internal virtual override {\r\n excludedFromTax[_owner] = true;\r\n super.configure(_owner);\r\n }\r\n \r\n \r\n function calculateTransferAmount(address from, address to, uint256 value) internal virtual override returns (uint256) {\r\n \r\n uint256 amountAfterTax = value;\r\n\r\n if (excludedFromTax[from] == false \u0026\u0026 excludedFromTax[to] == false \u0026\u0026 launched) {\r\n if (exchanges[from]) {\r\n // we are BUYING\r\n amountAfterTax = taxDistributor.takeBuyTax(value);\r\n } else if (exchanges[to]) {\r\n // we are SELLING\r\n amountAfterTax = taxDistributor.takeSellTax(value);\r\n }\r\n }\r\n\r\n uint256 taxAmount = value - amountAfterTax;\r\n if (taxAmount \u003e 0) {\r\n _balances[address(taxDistributor)] = _balances[address(taxDistributor)] + taxAmount;\r\n emit Transfer(from, address(taxDistributor), taxAmount);\r\n }\r\n return super.calculateTransferAmount(from, to, amountAfterTax);\r\n }\r\n\r\n\r\n function preTransfer(address from, address to, uint256 value) override virtual internal {\r\n uint256 timeSinceLastSwap = block.timestamp - taxDistributor.lastSwapTime();\r\n if (\r\n launched \u0026\u0026 \r\n autoSwapTax \u0026\u0026 \r\n exchanges[to] \u0026\u0026 \r\n swapStartTime + 60 \u003c= block.timestamp \u0026\u0026\r\n timeSinceLastSwap \u003e= minimumTimeBetweenSwaps \u0026\u0026\r\n _balances[address(taxDistributor)] \u003e= minimumTokensBeforeSwap \u0026\u0026\r\n taxDistributor.inSwap() == false\r\n ) {\r\n swapStartTime = block.timestamp;\r\n try taxDistributor.distribute() {} catch {}\r\n }\r\n super.preTransfer(from, to, value);\r\n }\r\n \r\n \r\n // Public methods\r\n \r\n /**\r\n * @dev Return the current total sell tax from the tax distributor\r\n */\r\n function sellTax() external view returns (uint256) {\r\n return taxDistributor.getSellTax();\r\n }\r\n\r\n /**\r\n * @dev Return the current total sell tax from the tax distributor\r\n */\r\n function buyTax() external view returns (uint256) {\r\n return taxDistributor.getBuyTax();\r\n }\r\n\r\n /**\r\n * @dev Return the address of the tax distributor contract\r\n */\r\n function taxDistributorAddress() external view returns (address) {\r\n return address(taxDistributor);\r\n } \r\n \r\n \r\n // Admin methods\r\n\r\n function setAutoSwaptax(bool enabled) external onlyOwner {\r\n autoSwapTax = enabled;\r\n }\r\n\r\n function setExcludedFromTax(address who, bool enabled) external onlyOwner {\r\n require(exchanges[who] == false || enabled == false, \"Cannot exclude an exchange from tax\");\r\n excludedFromTax[who] = enabled;\r\n }\r\n\r\n function setTaxDistributionThresholds(uint256 minAmount, uint256 minTime) external onlyOwner {\r\n minimumTokensBeforeSwap = minAmount;\r\n minimumTimeBetweenSwaps = minTime;\r\n }\r\n \r\n function setSellTax(string memory taxName, uint256 taxAmount) external onlyOwner {\r\n taxDistributor.setSellTax(taxName, taxAmount);\r\n }\r\n\r\n function setBuyTax(string memory taxName, uint256 taxAmount) external onlyOwner {\r\n taxDistributor.setBuyTax(taxName, taxAmount);\r\n }\r\n \r\n function setTaxWallet(string memory taxName, address wallet) external onlyOwner {\r\n taxDistributor.setTaxWallet(taxName, wallet);\r\n }\r\n \r\n function runSwapManually() external isLaunched {\r\n taxDistributor.distribute();\r\n }\r\n}"},"TaxDistributor.sol":{"content":"//SPDX-License-Identifier: UNLICENSED\r\n\r\npragma solidity 0.8.7;\r\n\r\nimport \"./Interfaces.sol\";\r\nimport \"./Libraries.sol\";\r\n\r\ncontract TaxDistributor is ITaxDistributor {\r\n\r\n address immutable public tokenPair;\r\n address immutable public routerAddress;\r\n address immutable private _token;\r\n address immutable private _wbnb;\r\n\r\n IDEXRouter private _router;\r\n\r\n bool public override inSwap;\r\n uint256 public override lastSwapTime;\r\n\r\n uint256 immutable public maxSellTax;\r\n uint256 immutable public maxBuyTax;\r\n\r\n enum TaxType { WALLET, DIVIDEND, LIQUIDITY, DISTRIBUTOR, BURN }\r\n struct Tax {\r\n string taxName;\r\n uint256 buyTaxPercentage;\r\n uint256 sellTaxPercentage;\r\n uint256 taxPool;\r\n TaxType taxType;\r\n address location;\r\n uint256 share;\r\n bool convertToNative;\r\n }\r\n Tax[] public taxes;\r\n\r\n event TaxesDistributed(uint256 tokensSwapped, uint256 ethReceived);\r\n event DistributionError(string text);\r\n\r\n modifier onlyToken() {\r\n require(msg.sender == _token, \"no permissions\");\r\n _;\r\n }\r\n\r\n modifier swapLock() {\r\n require(inSwap == false, \"already swapping\");\r\n inSwap = true;\r\n _;\r\n inSwap = false;\r\n }\r\n\r\n constructor (address router, address pair, address wbnb, uint256 _maxSellTax, uint256 _maxBuyTax) {\r\n require(wbnb != address(0), \"pairedToken cannot be 0 address\");\r\n require(pair != address(0), \"pair cannot be 0 address\");\r\n require(router != address(0), \"router cannot be 0 address\");\r\n _token = msg.sender;\r\n _wbnb = wbnb;\r\n _router = IDEXRouter(router);\r\n maxSellTax = _maxSellTax;\r\n maxBuyTax = _maxBuyTax;\r\n tokenPair = pair;\r\n routerAddress = router;\r\n }\r\n\r\n receive() external override payable {}\r\n\r\n function createWalletTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external override onlyToken {\r\n taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.WALLET, wallet, 0, convertToNative));\r\n }\r\n\r\n function createDistributorTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external override onlyToken {\r\n taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.DISTRIBUTOR, wallet, 0, convertToNative));\r\n }\r\n \r\n function createDividendTax(string memory name, uint256 buyTax, uint256 sellTax, address dividendDistributor, bool convertToNative) external override onlyToken {\r\n taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.DIVIDEND, dividendDistributor, 0, convertToNative));\r\n }\r\n \r\n function createBurnTax(string memory name, uint256 buyTax, uint256 sellTax) external override onlyToken {\r\n taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.BURN, address(0), 0, false));\r\n }\r\n\r\n function createLiquidityTax(string memory name, uint256 buyTax, uint256 sellTax, address holder) external override onlyToken {\r\n taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.LIQUIDITY, holder, 0, false));\r\n }\r\n\r\n function distribute() external payable override onlyToken swapLock {\r\n address[] memory path = new address[](2);\r\n path[0] = _token;\r\n path[1] = _wbnb;\r\n IERC20 token = IERC20(_token);\r\n\r\n uint256 totalTokens;\r\n for (uint256 i = 0; i \u003c taxes.length; i++) {\r\n if (taxes[i].taxType == TaxType.LIQUIDITY) {\r\n uint256 half = taxes[i].taxPool / 2;\r\n totalTokens += taxes[i].taxPool - half;\r\n } else if (taxes[i].convertToNative) {\r\n totalTokens += taxes[i].taxPool;\r\n }\r\n }\r\n totalTokens = checkTokenAmount(token, totalTokens);\r\n if (checkTokenAmount(token, totalTokens) != totalTokens) {\r\n emit DistributionError(\"Insufficient tokens to swap. Please add more tokens\");\r\n return;\r\n }\r\n\r\n uint256[] memory amts = _router.swapExactTokensForETH(\r\n totalTokens,\r\n 0,\r\n path,\r\n address(this),\r\n block.timestamp + 300\r\n );\r\n uint256 amountBNB = address(this).balance;\r\n\r\n if (totalTokens != amts[0] || amountBNB != amts[1] ) {\r\n emit DistributionError(\"Unexpected amounts returned from swap\");\r\n }\r\n\r\n // Calculate the distribution\r\n uint256 toDistribute = amountBNB;\r\n for (uint256 i = 0; i \u003c taxes.length; i++) {\r\n\r\n if (taxes[i].convertToNative || taxes[i].taxType == TaxType.LIQUIDITY) {\r\n if (i == taxes.length - 1) {\r\n taxes[i].share = toDistribute;\r\n } else if (taxes[i].taxType == TaxType.LIQUIDITY) {\r\n uint256 half = taxes[i].taxPool / 2;\r\n uint256 share = (amountBNB * (taxes[i].taxPool - half)) / totalTokens;\r\n taxes[i].share = share;\r\n toDistribute = toDistribute - share;\r\n } else {\r\n uint256 share = (amountBNB * taxes[i].taxPool) / totalTokens;\r\n taxes[i].share = share;\r\n toDistribute = toDistribute - share;\r\n }\r\n }\r\n }\r\n\r\n // Distribute the coins\r\n for (uint256 i = 0; i \u003c taxes.length; i++) {\r\n \r\n if (taxes[i].taxType == TaxType.WALLET) {\r\n if (taxes[i].convertToNative) {\r\n payable(taxes[i].location).transfer(taxes[i].share);\r\n } else {\r\n token.transfer(taxes[i].location, checkTokenAmount(token, taxes[i].taxPool));\r\n }\r\n }\r\n else if (taxes[i].taxType == TaxType.DISTRIBUTOR) {\r\n if (taxes[i].convertToNative) {\r\n payable(taxes[i].location).transfer(taxes[i].share);\r\n } else {\r\n token.approve(taxes[i].location, taxes[i].taxPool);\r\n IWalletDistributor(taxes[i].location).receiveToken(_token, address(this), checkTokenAmount(token, taxes[i].taxPool));\r\n }\r\n }\r\n else if (taxes[i].taxType == TaxType.DIVIDEND) {\r\n if (taxes[i].convertToNative) {\r\n IDividendDistributor(taxes[i].location).depositNative{value: taxes[i].share}();\r\n } else {\r\n IDividendDistributor(taxes[i].location).depositToken(address(this), checkTokenAmount(token, taxes[i].taxPool));\r\n }\r\n }\r\n else if (taxes[i].taxType == TaxType.BURN) {\r\n IBurnable(_token).burn(checkTokenAmount(token, taxes[i].taxPool));\r\n }\r\n else if (taxes[i].taxType == TaxType.LIQUIDITY) {\r\n if(taxes[i].share \u003e 0){\r\n uint256 half = checkTokenAmount(token, taxes[i].taxPool / 2);\r\n _router.addLiquidityETH{value: taxes[i].share}(\r\n _token,\r\n half,\r\n 0,\r\n 0,\r\n taxes[i].location,\r\n block.timestamp + 300\r\n );\r\n }\r\n }\r\n \r\n taxes[i].taxPool = 0;\r\n taxes[i].share = 0;\r\n }\r\n\r\n emit TaxesDistributed(totalTokens, amountBNB);\r\n\r\n lastSwapTime = block.timestamp;\r\n }\r\n\r\n function getSellTax() public override onlyToken view returns (uint256) {\r\n uint256 taxAmount;\r\n for (uint256 i = 0; i \u003c taxes.length; i++) {\r\n taxAmount += taxes[i].sellTaxPercentage;\r\n }\r\n return taxAmount;\r\n }\r\n\r\n function getBuyTax() public override onlyToken view returns (uint256) {\r\n uint256 taxAmount;\r\n for (uint256 i = 0; i \u003c taxes.length; i++) {\r\n taxAmount += taxes[i].buyTaxPercentage;\r\n }\r\n return taxAmount;\r\n }\r\n \r\n function setTaxWallet(string memory taxName, address wallet) external override onlyToken {\r\n bool updated;\r\n for (uint256 i = 0; i \u003c taxes.length; i++) {\r\n if (taxes[i].taxType == TaxType.WALLET \u0026\u0026 compareStrings(taxes[i].taxName, taxName)) {\r\n taxes[i].location = wallet;\r\n updated = true;\r\n }\r\n }\r\n require(updated, \"could not find tax to update\");\r\n }\r\n\r\n function setSellTax(string memory taxName, uint256 taxPercentage) external override onlyToken {\r\n bool updated;\r\n for (uint256 i = 0; i \u003c taxes.length; i++) {\r\n if (compareStrings(taxes[i].taxName, taxName)) {\r\n taxes[i].sellTaxPercentage = taxPercentage;\r\n updated = true;\r\n }\r\n }\r\n require(updated, \"could not find tax to update\");\r\n require(getSellTax() \u003c= maxSellTax, \"tax cannot be set this high\");\r\n }\r\n\r\n function setBuyTax(string memory taxName, uint256 taxPercentage) external override onlyToken {\r\n bool updated;\r\n for (uint256 i = 0; i \u003c taxes.length; i++) {\r\n //if (taxes[i].taxName == taxName) {\r\n if (compareStrings(taxes[i].taxName, taxName)) {\r\n taxes[i].buyTaxPercentage = taxPercentage;\r\n updated = true;\r\n }\r\n }\r\n require(updated, \"could not find tax to update\");\r\n require(getBuyTax() \u003c= maxBuyTax, \"tax cannot be set this high\");\r\n }\r\n\r\n function takeSellTax(uint256 value) external override onlyToken returns (uint256) {\r\n for (uint256 i = 0; i \u003c taxes.length; i++) {\r\n if (taxes[i].sellTaxPercentage \u003e 0) {\r\n uint256 taxAmount = (value * taxes[i].sellTaxPercentage) / 10000;\r\n taxes[i].taxPool += taxAmount;\r\n value = value - taxAmount;\r\n }\r\n }\r\n return value;\r\n }\r\n\r\n function takeBuyTax(uint256 value) external override onlyToken returns (uint256) {\r\n for (uint256 i = 0; i \u003c taxes.length; i++) {\r\n if (taxes[i].buyTaxPercentage \u003e 0) {\r\n uint256 taxAmount = (value * taxes[i].buyTaxPercentage) / 10000;\r\n taxes[i].taxPool += taxAmount;\r\n value = value - taxAmount;\r\n }\r\n }\r\n return value;\r\n }\r\n \r\n \r\n \r\n // Private methods\r\n function compareStrings(string memory a, string memory b) private pure returns (bool) {\r\n return (keccak256(abi.encodePacked((a))) == keccak256(abi.encodePacked((b))));\r\n }\r\n\r\n function checkTokenAmount(IERC20 token, uint256 amount) private view returns (uint256) {\r\n uint256 balance = token.balanceOf(address(this));\r\n if (balance \u003e amount) {\r\n return amount;\r\n }\r\n return balance;\r\n }\r\n}\r\n"},"_Neuroni.sol":{"content":"//SPDX-License-Identifier: UNLICENSED\r\n\r\npragma solidity ^0.8.7;\r\n\r\nimport \"./Interfaces.sol\";\r\nimport \"./Libraries.sol\";\r\nimport \"./BaseErc20.sol\";\r\nimport \"./Burnable.sol\";\r\nimport \"./Taxable.sol\";\r\nimport \"./TaxDistributor.sol\";\r\nimport \"./AntiSniper.sol\";\r\n\r\ncontract NeuroniAI is BaseErc20, AntiSniper, Burnable, Taxable {\r\n\r\n mapping(address =\u003e bool) public zkManualEnable;\r\n uint256 public zkTokenThreshold;\r\n\r\n constructor () {\r\n configure(0xA281151C22a70d6743F5b31Bc4E3958ce3681985);\r\n\r\n symbol = \"NEURONI\";\r\n name = \"Neuroni.AI\";\r\n decimals = 18;\r\n\r\n // Swap\r\n address routerAddress = getRouterAddress();\r\n IDEXRouter router = IDEXRouter(routerAddress);\r\n address WBNB = router.WETH();\r\n address pair = IDEXFactory(router.factory()).createPair(WBNB, address(this));\r\n exchanges[pair] = true;\r\n taxDistributor = new TaxDistributor(routerAddress, pair, WBNB, 1300, 1300);\r\n\r\n // Anti Sniper\r\n enableSniperBlocking = true;\r\n isNeverSniper[address(taxDistributor)] = true;\r\n mhPercentage = 300;\r\n enableHighTaxCountdown = true;\r\n\r\n // Tax\r\n minimumTimeBetweenSwaps = 30 seconds;\r\n minimumTokensBeforeSwap = 10000 * 10 ** decimals;\r\n excludedFromTax[address(taxDistributor)] = true;\r\n taxDistributor.createWalletTax(\"Insight\", 190, 456, 0xC6467b4F00cA55c5548fb7bd872c872B63841eB9, true);\r\n taxDistributor.createWalletTax(\"Marketing\", 185, 444, 0xE53820cAdD647D99B1BD98a29Af7Be87E497Cf0f, true);\r\n taxDistributor.createWalletTax(\"Dev\", 125, 300, 0x08a3351E0C1eb65C5D80D568AdbE97810820d7E3, true);\r\n autoSwapTax = false;\r\n\r\n // Burnable\r\n ableToBurn[address(taxDistributor)] = true;\r\n\r\n // ZK\r\n zkManualEnable[owner] = true;\r\n zkTokenThreshold = 100_000 * 10 ** decimals;\r\n\r\n // Finalise\r\n _allowed[address(taxDistributor)][routerAddress] = 2**256 - 1;\r\n _totalSupply = _totalSupply + (10_000_000 * 10 ** decimals);\r\n _balances[owner] = _balances[owner] + _totalSupply;\r\n emit Transfer(address(0), owner, _totalSupply);\r\n }\r\n\r\n\r\n // Overrides\r\n \r\n function launch() public override(AntiSniper, BaseErc20) onlyOwner {\r\n super.launch();\r\n }\r\n\r\n function configure(address _owner) internal override(AntiSniper, Burnable, Taxable, BaseErc20) {\r\n super.configure(_owner);\r\n }\r\n \r\n function preTransfer(address from, address to, uint256 value) override(AntiSniper, Taxable, BaseErc20) internal {\r\n super.preTransfer(from, to, value);\r\n }\r\n \r\n function calculateTransferAmount(address from, address to, uint256 value) override(AntiSniper, Taxable, BaseErc20) internal returns (uint256) {\r\n return super.calculateTransferAmount(from, to, value);\r\n }\r\n \r\n function postTransfer(address from, address to) override(BaseErc20) internal {\r\n super.postTransfer(from, to);\r\n }\r\n\r\n // Public Functions\r\n\r\n function allowZk(address who) external view returns(bool) {\r\n return zkManualEnable[who] || _balances[who] \u003e= zkTokenThreshold;\r\n }\r\n\r\n // Admin Functions\r\n function setManualZK(address who, bool on) external onlyOwner {\r\n zkManualEnable[who] = on;\r\n }\r\n\r\n function setZkTokenThreshold(uint256 amount) external onlyOwner {\r\n zkTokenThreshold = amount;\r\n }\r\n} "}}
< {"AntiSniper.sol":{"content":"//SPDX-License-Identifier: UNLICENSED\r\n\r\npragma solidity 0.8.7;\r\n\r\nimport \"./Libraries.sol\";\r\nimport \"./Interfaces.sol\";\r\nimport \"./BaseErc20.sol\";\r\n\r\ninterface IPinkAntiBot {\r\n  function setTokenOwner(address owner) external;\r\n  function onPreTransferCheck(address from, address to, uint256 amount) external;\r\n}\r\n\r\nabstract contract AntiSniper is BaseErc20 {\r\n    \r\n    IPinkAntiBot public pinkAntiBot;\r\n    bool private pinkAntiBotConfigured;\r\n\r\n    bool public enableSniperBlocking;\r\n    bool public enableBlockLogProtection;\r\n    bool public enableHighTaxCountdown;\r\n    bool public enablePinkAntiBot;\r\n    \r\n    uint256 public msPercentage;\r\n    uint256 public mhPercentage;\r\n    uint256 public maxGasLimit;\r\n\r\n    uint256 public launchTime;\r\n    uint256 public launchBlock;\r\n    uint256 public snipersCaught;\r\n    \r\n    mapping (address =\u003e bool) public isSniper;\r\n    mapping (address =\u003e bool) public isNeverSniper;\r\n    mapping (address =\u003e uint256) public transactionBlockLog;\r\n    \r\n    // Overrides\r\n    \r\n    function configure(address _owner) internal virtual override {\r\n        isNeverSniper[_owner] = true;\r\n        super.configure(_owner);\r\n    }\r\n    \r\n    function launch() override virtual public onlyOwner {\r\n        super.launch();\r\n        launchTime = block.timestamp;\r\n        launchBlock = block.number;\r\n    }\r\n    \r\n    function preTransfer(address from, address to, uint256 value) override virtual internal {\r\n        require(enableSniperBlocking == false || isSniper[msg.sender] == false, \"sniper rejected\");\r\n        \r\n        if (launched \u0026\u0026 from != owner \u0026\u0026 isNeverSniper[from] == false \u0026\u0026 isNeverSniper[to] == false) {\r\n            \r\n            if (maxGasLimit \u003e 0) {\r\n               require(gasleft() \u003c= maxGasLimit, \"this is over the max gas limit\");\r\n            }\r\n            \r\n            if (mhPercentage \u003e 0 \u0026\u0026 exchanges[to] == false) {\r\n                require (_balances[to] + value \u003c= mhAmount(), \"this is over the max hold amount\");\r\n            }\r\n            \r\n            if (msPercentage \u003e 0 \u0026\u0026 exchanges[to]) {\r\n                require (value \u003c= msAmount(), \"this is over the max sell amount\");\r\n            }\r\n            \r\n            if(enableBlockLogProtection) {\r\n                if (transactionBlockLog[to] == block.number) {\r\n                    isSniper[to] = true;\r\n                    snipersCaught ++;\r\n                }\r\n                if (transactionBlockLog[from] == block.number) {\r\n                    isSniper[from] = true;\r\n                    snipersCaught ++;\r\n                }\r\n                if (exchanges[to] == false) {\r\n                    transactionBlockLog[to] = block.number;\r\n                }\r\n                if (exchanges[from] == false) {\r\n                    transactionBlockLog[from] = block.number;\r\n                }\r\n            }\r\n            \r\n            if (enablePinkAntiBot) {\r\n                pinkAntiBot.onPreTransferCheck(from, to, value);\r\n            }\r\n        }\r\n        \r\n        super.preTransfer(from, to, value);\r\n    }\r\n    \r\n    function calculateTransferAmount(address from, address to, uint256 value) internal virtual override returns (uint256) {\r\n        uint256 amountAfterTax = value;\r\n        if (launched \u0026\u0026 enableHighTaxCountdown) {\r\n            if (from != owner \u0026\u0026 sniperTax() \u003e 0 \u0026\u0026 isNeverSniper[from] == false \u0026\u0026 isNeverSniper[to] == false) {\r\n                uint256 taxAmount = (value * sniperTax()) / 10000;\r\n                amountAfterTax = amountAfterTax - taxAmount;\r\n            }\r\n        }\r\n        return super.calculateTransferAmount(from, to, amountAfterTax);\r\n    }\r\n    \r\n    // Public methods\r\n    \r\n    function mhAmount() public view returns (uint256) {\r\n        return (_totalSupply * mhPercentage) / 10000;\r\n    }\r\n    \r\n    function msAmount() public view returns (uint256) {\r\n         return (_totalSupply * msPercentage) / 10000;\r\n    }\r\n    \r\n   function sniperTax() public virtual view returns (uint256) {\r\n        if(launched) {\r\n            if (block.number - launchBlock \u003c 3) {\r\n                return 9900;\r\n            }\r\n        }\r\n        return 0;\r\n    }\r\n    \r\n    // Admin methods\r\n    \r\n    function configurePinkAntiBot(address antiBot) external onlyOwner {\r\n        pinkAntiBot = IPinkAntiBot(antiBot);\r\n        pinkAntiBot.setTokenOwner(owner);\r\n        pinkAntiBotConfigured = true;\r\n        enablePinkAntiBot = true;\r\n    }\r\n    \r\n    function setSniperBlocking(bool enabled) external onlyOwner {\r\n        enableSniperBlocking = enabled;\r\n    }\r\n    \r\n    function setBlockLogProtection(bool enabled) external onlyOwner {\r\n        enableBlockLogProtection = enabled;\r\n    }\r\n    \r\n    function setHighTaxCountdown(bool enabled) external onlyOwner {\r\n        enableHighTaxCountdown = enabled;\r\n    }\r\n    \r\n    function setPinkAntiBot(bool enabled) external onlyOwner {\r\n        require(pinkAntiBotConfigured, \"pink anti bot is not configured\");\r\n        enablePinkAntiBot = enabled;\r\n    }\r\n    \r\n    function setMsPercentage(uint256 amount) external onlyOwner {\r\n        msPercentage = amount;\r\n    }\r\n    \r\n    function setMhPercentage(uint256 amount) external onlyOwner {\r\n        mhPercentage = amount;\r\n    }\r\n    \r\n    function setMaxGasLimit(uint256 amount) external onlyOwner {\r\n        maxGasLimit = amount;\r\n    }\r\n    \r\n    function setIsSniper(address who, bool enabled) external onlyOwner {\r\n        isSniper[who] = enabled;\r\n    }\r\n\r\n    function setNeverSniper(address who, bool enabled) external onlyOwner {\r\n        isNeverSniper[who] = enabled;\r\n    }\r\n\r\n    // private methods\r\n}"},"BaseErc20.sol":{"content":"//SPDX-License-Identifier: UNLICENSED\r\n\r\npragma solidity 0.8.7;\r\n\r\nimport \"./Interfaces.sol\";\r\nimport \"./Libraries.sol\";\r\n\r\nabstract contract BaseErc20 is IERC20, IOwnable {\r\n\r\n    mapping (address =\u003e uint256) internal _balances;\r\n    mapping (address =\u003e mapping (address =\u003e uint256)) internal _allowed;\r\n    uint256 internal _totalSupply;\r\n    bool internal _useSafeTransfer;\r\n    \r\n    string public symbol;\r\n    string public  name;\r\n    uint8 public decimals;\r\n    \r\n    address public override owner;\r\n    bool public isTradingEnabled = true;\r\n    bool public launched;\r\n    \r\n    mapping (address =\u003e bool) public canAlwaysTrade;\r\n    mapping (address =\u003e bool) public excludedFromSelling;\r\n    mapping (address =\u003e bool) public exchanges;\r\n    \r\n    modifier onlyOwner() {\r\n        require(msg.sender == owner, \"can only be called by the contract owner\");\r\n        _;\r\n    }\r\n    \r\n    modifier isLaunched() {\r\n        require(launched, \"can only be called once token is launched\");\r\n        _;\r\n    }\r\n\r\n    // @dev Trading is allowed before launch if the sender is the owner, we are transferring from the owner, or in canAlwaysTrade list\r\n    modifier tradingEnabled(address from) {\r\n        require((isTradingEnabled \u0026\u0026 launched) || from == owner || canAlwaysTrade[msg.sender], \"trading not enabled\");\r\n        _;\r\n    }\r\n    \r\n\r\n    function configure(address _owner) internal virtual {\r\n        owner = _owner;\r\n        canAlwaysTrade[owner] = true;\r\n    }\r\n\r\n    /**\r\n    * @dev Total number of tokens in existence\r\n    */\r\n    function totalSupply() external override view returns (uint256) {\r\n        return _totalSupply;\r\n    }\r\n\r\n    /**\r\n    * @dev Gets the balance of the specified address.\r\n    * @param _owner The address to query the balance of.\r\n    * @return An uint256 representing the amount owned by the passed address.\r\n    */\r\n    function balanceOf(address _owner) external override view returns (uint256) {\r\n        return _balances[_owner];\r\n    }\r\n\r\n    /**\r\n     * @dev Function to check the amount of tokens that an owner allowed to a spender.\r\n     * @param _owner address The address which owns the funds.\r\n     * @param spender address The address which will spend the funds.\r\n     * @return A uint256 specifying the amount of tokens still available for the spender.\r\n     */\r\n    function allowance(address _owner, address spender) external override view returns (uint256) {\r\n        return _allowed[_owner][spender];\r\n    }\r\n\r\n    /**\r\n    * @dev Transfer token for a specified address\r\n    * @param to The address to transfer to.\r\n    * @param value The amount to be transferred.\r\n    */\r\n    function transfer(address to, uint256 value) external override tradingEnabled(msg.sender) returns (bool) {\r\n        _transfer(msg.sender, to, value);\r\n        return true;\r\n    }\r\n\r\n    /**\r\n     * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.\r\n     * Beware that changing an allowance with this method brings the risk that someone may use both the old\r\n     * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this\r\n     * race condition is to first reduce the spender\u0027s allowance to 0 and set the desired value afterwards:\r\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\r\n     * @param spender The address which will spend the funds.\r\n     * @param value The amount of tokens to be spent.\r\n     */\r\n    function approve(address spender, uint256 value) external override tradingEnabled(msg.sender) returns (bool) {\r\n        require(spender != address(0), \"cannot approve the 0 address\");\r\n\r\n        _allowed[msg.sender][spender] = value;\r\n        emit Approval(msg.sender, spender, value);\r\n        return true;\r\n    }\r\n\r\n    /**\r\n     * @dev Transfer tokens from one address to another.\r\n     * Note that while this function emits an Approval event, this is not required as per the specification,\r\n     * and other compliant implementations may not emit the event.\r\n     * @param from address The address which you want to send tokens from\r\n     * @param to address The address which you want to transfer to\r\n     * @param value uint256 the amount of tokens to be transferred\r\n     */\r\n    function transferFrom(address from, address to, uint256 value) external override tradingEnabled(from) returns (bool) {\r\n        _allowed[from][msg.sender] = _allowed[from][msg.sender] - value;\r\n        _transfer(from, to, value);\r\n        emit Approval(from, msg.sender, _allowed[from][msg.sender]);\r\n        return true;\r\n    }\r\n\r\n    /**\r\n     * @dev Increase the amount of tokens that an owner allowed to a spender.\r\n     * approve should be called when allowed_[_spender] == 0. To increment\r\n     * allowed value is better to use this function to avoid 2 calls (and wait until\r\n     * the first transaction is mined)\r\n     * From MonolithDAO Token.sol\r\n     * Emits an Approval event.\r\n     * @param spender The address which will spend the funds.\r\n     * @param addedValue The amount of tokens to increase the allowance by.\r\n     */\r\n    function increaseAllowance(address spender, uint256 addedValue) external tradingEnabled(msg.sender) returns (bool) {\r\n        require(spender != address(0), \"cannot approve the 0 address\");\r\n\r\n        _allowed[msg.sender][spender] = _allowed[msg.sender][spender] + addedValue;\r\n        emit Approval(msg.sender, spender, _allowed[msg.sender][spender]);\r\n        return true;\r\n    }\r\n\r\n    /**\r\n     * @dev Decrease the amount of tokens that an owner allowed to a spender.\r\n     * approve should be called when allowed_[_spender] == 0. To decrement\r\n     * allowed value is better to use this function to avoid 2 calls (and wait until\r\n     * the first transaction is mined)\r\n     * From MonolithDAO Token.sol\r\n     * Emits an Approval event.\r\n     * @param spender The address which will spend the funds.\r\n     * @param subtractedValue The amount of tokens to decrease the allowance by.\r\n     */\r\n    function decreaseAllowance(address spender, uint256 subtractedValue) external tradingEnabled(msg.sender) returns (bool) {\r\n        require(spender != address(0), \"cannot approve the 0 address\");\r\n\r\n        _allowed[msg.sender][spender] = _allowed[msg.sender][spender] - subtractedValue;\r\n        emit Approval(msg.sender, spender, _allowed[msg.sender][spender]);\r\n        return true;\r\n    }\r\n\r\n    \r\n    \r\n    // Virtual methods\r\n    function launch() virtual public onlyOwner {\r\n        launched = true;\r\n    }\r\n    \r\n    function preTransfer(address from, address to, uint256 value) virtual internal { }\r\n\r\n    function calculateTransferAmount(address from, address to, uint256 value) virtual internal returns (uint256) {\r\n        require(from != to, \"you cannot transfer to yourself\");\r\n        return value;\r\n    }\r\n    \r\n    function postTransfer(address from, address to) virtual internal { }\r\n    \r\n\r\n\r\n    // Admin methods\r\n    function changeOwner(address who) external onlyOwner {\r\n        require(who != address(0), \"cannot be zero address\");\r\n        owner = who;\r\n    }\r\n\r\n    function removeBnb() external onlyOwner {\r\n        uint256 balance = address(this).balance;\r\n        payable(owner).transfer(balance);\r\n    }\r\n\r\n    function transferTokens(address token, address to) external onlyOwner returns(bool){\r\n        uint256 balance = IERC20(token).balanceOf(address(this));\r\n        return IERC20(token).transfer(to, balance);\r\n    }\r\n    \r\n    function setCanAlwaysTrade(address who, bool enabled) external onlyOwner {\r\n        canAlwaysTrade[who] = enabled;\r\n    }\r\n    \r\n    function setExchange(address who, bool isExchange) external onlyOwner {\r\n        exchanges[who] = isExchange;\r\n    }\r\n    \r\n   \r\n    // Private methods\r\n\r\n    function getRouterAddress() internal view returns (address routerAddress) {\r\n        if (block.chainid == 1 || block.chainid == 3 || block.chainid == 4  || block.chainid == 5) {\r\n            routerAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D ; // ETHEREUM\r\n            \r\n        } else if (block.chainid == 56) {\r\n            routerAddress = 0x10ED43C718714eb63d5aA57B78B54704E256024E; // BSC MAINNET\r\n        } else if (block.chainid == 97) {\r\n            routerAddress = 0xc99f3718dB7c90b020cBBbb47eD26b0BA0C6512B; // BSC TESTNET - https://pancakeswap.rainbit.me/\r\n        } else {\r\n            revert(\"Unknown Chain ID\");\r\n        }\r\n    }\r\n\r\n    /**\r\n    * @dev Transfer token for a specified addresses\r\n    * @param from The address to transfer from.\r\n    * @param to The address to transfer to.\r\n    * @param value The amount to be transferred.\r\n    */\r\n    function _transfer(address from, address to, uint256 value) private {\r\n        require(to != address(0), \"cannot be zero address\");\r\n        require(excludedFromSelling[from] == false, \"address is not allowed to sell\");\r\n        \r\n        if (_useSafeTransfer) {\r\n\r\n            _balances[from] = _balances[from] - value;\r\n            _balances[to] = _balances[to] + value;\r\n            emit Transfer(from, to, value);\r\n\r\n        } else {\r\n            preTransfer(from, to, value);\r\n\r\n            uint256 modifiedAmount = calculateTransferAmount(from, to, value);\r\n            _balances[from] = _balances[from] - value;\r\n            _balances[to] = _balances[to] + modifiedAmount;\r\n\r\n            emit Transfer(from, to, modifiedAmount);\r\n\r\n            postTransfer(from, to);\r\n        }\r\n    }\r\n}"},"Burnable.sol":{"content":"//SPDX-License-Identifier: UNLICENSED\r\n\r\npragma solidity 0.8.7;\r\n\r\nimport \"./Libraries.sol\";\r\nimport \"./Interfaces.sol\";\r\nimport \"./BaseErc20.sol\";\r\n\r\nabstract contract Burnable is BaseErc20, IBurnable {\r\n    \r\n    mapping (address =\u003e bool) public ableToBurn;\r\n\r\n    modifier onlyBurner() {\r\n        require(ableToBurn[msg.sender], \"no burn permissions\");\r\n        _;\r\n    }\r\n\r\n    // Overrides\r\n    \r\n    function configure(address _owner) internal virtual override {\r\n        ableToBurn[_owner] = true;\r\n        super.configure(_owner);\r\n    }\r\n    \r\n    \r\n    // Admin methods\r\n\r\n    function setAbleToBurn(address who, bool enabled) external onlyOwner {\r\n        ableToBurn[who] = enabled;\r\n    }\r\n\r\n    /**\r\n     * @dev Internal function that burns an amount of the token of a given\r\n     * account.\r\n     * @param value The amount that will be burnt.\r\n     */\r\n    function burn(uint256 value) external override onlyBurner {\r\n        _burn(msg.sender, value);\r\n    }\r\n\r\n    /**\r\n     * @dev Internal function that burns an amount of the token of a given\r\n     * account, deducting from the sender\u0027s allowance for said account. Uses the\r\n     * internal burn function.\r\n     * Emits an Approval event (reflecting the reduced allowance).\r\n     * @param account The account whose tokens will be burnt.\r\n     * @param value The amount that will be burnt.\r\n     */\r\n    function burnFrom(address account, uint256 value) external override onlyBurner {\r\n        _allowed[account][msg.sender] = _allowed[account][msg.sender] - value;\r\n        _burn(account, value);\r\n        emit Approval(account, msg.sender, _allowed[account][msg.sender]);\r\n    }\r\n\r\n\r\n    // Private methods\r\n\r\n    function _burn(address account, uint256 value) internal {\r\n        require(account != address(0));\r\n\r\n        _totalSupply = _totalSupply - value;\r\n        _balances[account] = _balances[account] - value;\r\n        emit Transfer(account, address(0), value);\r\n    }\r\n}"},"Interfaces.sol":{"content":"//SPDX-License-Identifier: UNLICENSED\r\n\r\npragma solidity 0.8.7;\r\n\r\ninterface IOwnable {\r\n    function owner() external view returns (address);\r\n}\r\n\r\ninterface IERC20 {\r\n    function totalSupply() external view returns (uint256);\r\n    function balanceOf(address who) external view returns (uint256);\r\n    function allowance(address _owner, address spender) external view returns (uint256);\r\n    function transfer(address to, uint256 value) external returns (bool);\r\n    function approve(address spender, uint256 value) external returns (bool);\r\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\r\n\r\n    event Transfer(address indexed from, address indexed to, uint256 value);\r\n    event Approval(address indexed owner, address indexed spender, uint256 value);\r\n}\r\n\r\ninterface IBurnable {\r\n    function burn(uint256 value) external;\r\n    function burnFrom(address account, uint256 value) external;\r\n}\r\n\r\ninterface IDEXFactory {\r\n    function createPair(address tokenA, address tokenB) external returns (address pair);\r\n}\r\n\r\ninterface IDEXRouter {\r\n    function factory() external pure returns (address);\r\n    function WETH() external pure returns (address);\r\n    function addLiquidityETH(address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline) external payable returns (uint amountToken, uint amountETH, uint liquidity);\r\n    function addLiquidity(address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline) external returns (uint amountA, uint amountB, uint liquidity);    \r\n    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);\r\n    function swapExactTokensForTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);\r\n    function swapExactTokensForETHSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);\r\n}\r\n\r\ninterface IDividendDistributor {\r\n    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external;\r\n    function setShare(address shareholder, uint256 amount) external;\r\n    function depositNative() external payable;\r\n    function depositToken(address from, uint256 amount) external;\r\n    function process(uint256 gas) external;\r\n    function inSwap() external view returns (bool);\r\n}\r\n\r\n\r\ninterface ITaxDistributor {\r\n    receive() external payable;\r\n    function lastSwapTime() external view returns (uint256);\r\n    function inSwap() external view returns (bool);\r\n    function createWalletTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external;\r\n    function createDistributorTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external;\r\n    function createDividendTax(string memory name, uint256 buyTax, uint256 sellTax, address dividendDistributor, bool convertToNative) external;\r\n    function createBurnTax(string memory name, uint256 buyTax, uint256 sellTax) external;\r\n    function createLiquidityTax(string memory name, uint256 buyTax, uint256 sellTax, address holder) external;\r\n    function distribute() external payable;\r\n    function getSellTax() external view returns (uint256);\r\n    function getBuyTax() external view returns (uint256);\r\n    function setTaxWallet(string memory taxName, address wallet) external;\r\n    function setSellTax(string memory taxName, uint256 taxPercentage) external;\r\n    function setBuyTax(string memory taxName, uint256 taxPercentage) external;\r\n    function takeSellTax(uint256 value) external returns (uint256);\r\n    function takeBuyTax(uint256 value) external returns (uint256);\r\n}\r\n\r\ninterface IWalletDistributor {\r\n    function receiveToken(address token, address from, uint256 amount) external;\r\n}\r\n"},"Libraries.sol":{"content":"//SPDX-License-Identifier: UNLICENSED\r\n\r\npragma solidity 0.8.7;\r\n\r\n/**\r\n * @title SafeMath\r\n * @dev Math operations with safety checks that revert on error\r\n */\r\nlibrary SafeMath {\r\n\r\n    int256 constant private INT256_MIN = -2**255;\r\n\r\n    /**\r\n    * @dev Multiplies two unsigned integers, reverts on overflow.\r\n    */\r\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\r\n        // Gas optimization: this is cheaper than requiring \u0027a\u0027 not being zero, but the\r\n        // benefit is lost if \u0027b\u0027 is also tested.\r\n        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522\r\n        if (a == 0) {\r\n            return 0;\r\n        }\r\n\r\n        uint256 c = a * b;\r\n        require(c / a == b);\r\n\r\n        return c;\r\n    }\r\n\r\n    /**\r\n    * @dev Multiplies two signed integers, reverts on overflow.\r\n    */\r\n    function mul(int256 a, int256 b) internal pure returns (int256) {\r\n        // Gas optimization: this is cheaper than requiring \u0027a\u0027 not being zero, but the\r\n        // benefit is lost if \u0027b\u0027 is also tested.\r\n        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522\r\n        if (a == 0) {\r\n            return 0;\r\n        }\r\n\r\n        require(!(a == -1 \u0026\u0026 b == INT256_MIN)); // This is the only case of overflow not detected by the check below\r\n\r\n        int256 c = a * b;\r\n        require(c / a == b);\r\n\r\n        return c;\r\n    }\r\n\r\n    /**\r\n    * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero.\r\n    */\r\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\r\n        // Solidity only automatically asserts when dividing by 0\r\n        require(b \u003e 0);\r\n        uint256 c = a / b;\r\n        // assert(a == b * c + a % b); // There is no case in which this doesn\u0027t hold\r\n\r\n        return c;\r\n    }\r\n\r\n    /**\r\n    * @dev Integer division of two signed integers truncating the quotient, reverts on division by zero.\r\n    */\r\n    function div(int256 a, int256 b) internal pure returns (int256) {\r\n        require(b != 0); // Solidity only automatically asserts when dividing by 0\r\n        require(!(b == -1 \u0026\u0026 a == INT256_MIN)); // This is the only case of overflow\r\n\r\n        int256 c = a / b;\r\n\r\n        return c;\r\n    }\r\n\r\n    /**\r\n    * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend).\r\n    */\r\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\r\n        require(b \u003c= a);\r\n        uint256 c = a - b;\r\n\r\n        return c;\r\n    }\r\n\r\n    /**\r\n    * @dev Subtracts two signed integers, reverts on overflow.\r\n    */\r\n    function sub(int256 a, int256 b) internal pure returns (int256) {\r\n        int256 c = a - b;\r\n        require((b \u003e= 0 \u0026\u0026 c \u003c= a) || (b \u003c 0 \u0026\u0026 c \u003e a));\r\n\r\n        return c;\r\n    }\r\n\r\n    /**\r\n    * @dev Adds two unsigned integers, reverts on overflow.\r\n    */\r\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\r\n        uint256 c = a + b;\r\n        require(c \u003e= a);\r\n\r\n        return c;\r\n    }\r\n\r\n    /**\r\n    * @dev Adds two signed integers, reverts on overflow.\r\n    */\r\n    function add(int256 a, int256 b) internal pure returns (int256) {\r\n        int256 c = a + b;\r\n        require((b \u003e= 0 \u0026\u0026 c \u003e= a) || (b \u003c 0 \u0026\u0026 c \u003c a));\r\n\r\n        return c;\r\n    }\r\n\r\n    /**\r\n    * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo),\r\n    * reverts when dividing by zero.\r\n    */\r\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\r\n        require(b != 0);\r\n        return a % b;\r\n    }\r\n}"},"Taxable.sol":{"content":"//SPDX-License-Identifier: UNLICENSED\r\n\r\npragma solidity 0.8.7;\r\n\r\nimport \"./Libraries.sol\";\r\nimport \"./Interfaces.sol\";\r\nimport \"./BaseErc20.sol\";\r\n\r\nabstract contract Taxable is BaseErc20 {\r\n    \r\n    ITaxDistributor taxDistributor;\r\n\r\n    bool public autoSwapTax;\r\n    uint256 public minimumTimeBetweenSwaps;\r\n    uint256 public minimumTokensBeforeSwap;\r\n    mapping (address =\u003e bool) public excludedFromTax;\r\n    uint256 swapStartTime;\r\n    \r\n    // Overrides\r\n    \r\n    function configure(address _owner) internal virtual override {\r\n        excludedFromTax[_owner] = true;\r\n        super.configure(_owner);\r\n    }\r\n    \r\n    \r\n    function calculateTransferAmount(address from, address to, uint256 value) internal virtual override returns (uint256) {\r\n        \r\n        uint256 amountAfterTax = value;\r\n\r\n        if (excludedFromTax[from] == false \u0026\u0026 excludedFromTax[to] == false \u0026\u0026 launched) {\r\n            if (exchanges[from]) {\r\n                // we are BUYING\r\n                amountAfterTax = taxDistributor.takeBuyTax(value);\r\n            } else if (exchanges[to]) {\r\n                // we are SELLING\r\n                amountAfterTax = taxDistributor.takeSellTax(value);\r\n            }\r\n        }\r\n\r\n        uint256 taxAmount = value - amountAfterTax;\r\n        if (taxAmount \u003e 0) {\r\n            _balances[address(taxDistributor)] = _balances[address(taxDistributor)] + taxAmount;\r\n            emit Transfer(from, address(taxDistributor), taxAmount);\r\n        }\r\n        return super.calculateTransferAmount(from, to, amountAfterTax);\r\n    }\r\n\r\n\r\n    function preTransfer(address from, address to, uint256 value) override virtual internal {\r\n        uint256 timeSinceLastSwap = block.timestamp - taxDistributor.lastSwapTime();\r\n        if (\r\n            launched \u0026\u0026 \r\n            autoSwapTax \u0026\u0026 \r\n            exchanges[to] \u0026\u0026 \r\n            swapStartTime + 60 \u003c= block.timestamp \u0026\u0026\r\n            timeSinceLastSwap \u003e= minimumTimeBetweenSwaps \u0026\u0026\r\n            _balances[address(taxDistributor)] \u003e= minimumTokensBeforeSwap \u0026\u0026\r\n            taxDistributor.inSwap() == false\r\n        ) {\r\n            swapStartTime = block.timestamp;\r\n            try taxDistributor.distribute() {} catch {}\r\n        }\r\n        super.preTransfer(from, to, value);\r\n    }\r\n    \r\n    \r\n    // Public methods\r\n    \r\n    /**\r\n     * @dev Return the current total sell tax from the tax distributor\r\n     */\r\n    function sellTax() external view returns (uint256) {\r\n        return taxDistributor.getSellTax();\r\n    }\r\n\r\n    /**\r\n     * @dev Return the current total sell tax from the tax distributor\r\n     */\r\n    function buyTax() external view returns (uint256) {\r\n        return taxDistributor.getBuyTax();\r\n    }\r\n\r\n    /**\r\n     * @dev Return the address of the tax distributor contract\r\n     */\r\n    function taxDistributorAddress() external view returns (address) {\r\n        return address(taxDistributor);\r\n    }    \r\n    \r\n    \r\n    // Admin methods\r\n\r\n    function setAutoSwaptax(bool enabled) external onlyOwner {\r\n        autoSwapTax = enabled;\r\n    }\r\n\r\n    function setExcludedFromTax(address who, bool enabled) external onlyOwner {\r\n        require(exchanges[who] == false || enabled == false, \"Cannot exclude an exchange from tax\");\r\n        excludedFromTax[who] = enabled;\r\n    }\r\n\r\n    function setTaxDistributionThresholds(uint256 minAmount, uint256 minTime) external onlyOwner {\r\n        minimumTokensBeforeSwap = minAmount;\r\n        minimumTimeBetweenSwaps = minTime;\r\n    }\r\n    \r\n    function setSellTax(string memory taxName, uint256 taxAmount) external onlyOwner {\r\n        taxDistributor.setSellTax(taxName, taxAmount);\r\n    }\r\n\r\n    function setBuyTax(string memory taxName, uint256 taxAmount) external onlyOwner {\r\n        taxDistributor.setBuyTax(taxName, taxAmount);\r\n    }\r\n    \r\n    function setTaxWallet(string memory taxName, address wallet) external onlyOwner {\r\n        taxDistributor.setTaxWallet(taxName, wallet);\r\n    }\r\n    \r\n    function runSwapManually() external isLaunched {\r\n        taxDistributor.distribute();\r\n    }\r\n}"},"TaxDistributor.sol":{"content":"//SPDX-License-Identifier: UNLICENSED\r\n\r\npragma solidity 0.8.7;\r\n\r\nimport \"./Interfaces.sol\";\r\nimport \"./Libraries.sol\";\r\n\r\ncontract TaxDistributor is ITaxDistributor {\r\n\r\n    address immutable public tokenPair;\r\n    address immutable public routerAddress;\r\n    address immutable private _token;\r\n    address immutable private _wbnb;\r\n\r\n    IDEXRouter private _router;\r\n\r\n    bool public override inSwap;\r\n    uint256 public override lastSwapTime;\r\n\r\n    uint256 immutable public maxSellTax;\r\n    uint256 immutable public maxBuyTax;\r\n\r\n    enum TaxType { WALLET, DIVIDEND, LIQUIDITY, DISTRIBUTOR, BURN }\r\n    struct Tax {\r\n        string taxName;\r\n        uint256 buyTaxPercentage;\r\n        uint256 sellTaxPercentage;\r\n        uint256 taxPool;\r\n        TaxType taxType;\r\n        address location;\r\n        uint256 share;\r\n        bool convertToNative;\r\n    }\r\n    Tax[] public taxes;\r\n\r\n    event TaxesDistributed(uint256 tokensSwapped, uint256 ethReceived);\r\n    event DistributionError(string text);\r\n\r\n    modifier onlyToken() {\r\n        require(msg.sender == _token, \"no permissions\");\r\n        _;\r\n    }\r\n\r\n    modifier swapLock() {\r\n        require(inSwap == false, \"already swapping\");\r\n        inSwap = true;\r\n        _;\r\n        inSwap = false;\r\n    }\r\n\r\n    constructor (address router, address pair, address wbnb, uint256 _maxSellTax, uint256 _maxBuyTax) {\r\n        require(wbnb != address(0), \"pairedToken cannot be 0 address\");\r\n        require(pair != address(0), \"pair cannot be 0 address\");\r\n        require(router != address(0), \"router cannot be 0 address\");\r\n        _token = msg.sender;\r\n        _wbnb = wbnb;\r\n        _router = IDEXRouter(router);\r\n        maxSellTax = _maxSellTax;\r\n        maxBuyTax = _maxBuyTax;\r\n        tokenPair = pair;\r\n        routerAddress = router;\r\n    }\r\n\r\n    receive() external override payable {}\r\n\r\n    function createWalletTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external override onlyToken {\r\n        taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.WALLET, wallet, 0, convertToNative));\r\n    }\r\n\r\n    function createDistributorTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external override onlyToken {\r\n        taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.DISTRIBUTOR, wallet, 0, convertToNative));\r\n    }\r\n    \r\n    function createDividendTax(string memory name, uint256 buyTax, uint256 sellTax, address dividendDistributor, bool convertToNative) external override onlyToken {\r\n        taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.DIVIDEND, dividendDistributor, 0, convertToNative));\r\n    }\r\n    \r\n    function createBurnTax(string memory name, uint256 buyTax, uint256 sellTax) external override onlyToken {\r\n        taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.BURN, address(0), 0, false));\r\n    }\r\n\r\n    function createLiquidityTax(string memory name, uint256 buyTax, uint256 sellTax, address holder) external override onlyToken {\r\n        taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.LIQUIDITY, holder, 0, false));\r\n    }\r\n\r\n    function distribute() external payable override onlyToken swapLock {\r\n        address[] memory path = new address[](2);\r\n        path[0] = _token;\r\n        path[1] = _wbnb;\r\n        IERC20 token = IERC20(_token);\r\n\r\n        uint256 totalTokens;\r\n        for (uint256 i = 0; i \u003c taxes.length; i++) {\r\n            if (taxes[i].taxType == TaxType.LIQUIDITY) {\r\n                uint256 half = taxes[i].taxPool / 2;\r\n                totalTokens += taxes[i].taxPool - half;\r\n            } else if (taxes[i].convertToNative) {\r\n                totalTokens += taxes[i].taxPool;\r\n            }\r\n        }\r\n        totalTokens = checkTokenAmount(token, totalTokens);\r\n        if (checkTokenAmount(token, totalTokens) != totalTokens) {\r\n            emit DistributionError(\"Insufficient tokens to swap. Please add more tokens\");\r\n            return;\r\n        }\r\n\r\n        uint256[] memory amts = _router.swapExactTokensForETH(\r\n            totalTokens,\r\n            0,\r\n            path,\r\n            address(this),\r\n            block.timestamp + 300\r\n        );\r\n        uint256 amountBNB = address(this).balance;\r\n\r\n        if (totalTokens != amts[0] || amountBNB != amts[1] ) {\r\n            emit DistributionError(\"Unexpected amounts returned from swap\");\r\n        }\r\n\r\n        // Calculate the distribution\r\n        uint256 toDistribute = amountBNB;\r\n        for (uint256 i = 0; i \u003c taxes.length; i++) {\r\n\r\n            if (taxes[i].convertToNative || taxes[i].taxType == TaxType.LIQUIDITY) {\r\n                if (i == taxes.length - 1) {\r\n                    taxes[i].share = toDistribute;\r\n                } else if (taxes[i].taxType == TaxType.LIQUIDITY) {\r\n                    uint256 half = taxes[i].taxPool / 2;\r\n                    uint256 share = (amountBNB * (taxes[i].taxPool - half)) / totalTokens;\r\n                    taxes[i].share = share;\r\n                    toDistribute = toDistribute - share;\r\n                } else {\r\n                    uint256 share = (amountBNB * taxes[i].taxPool) / totalTokens;\r\n                    taxes[i].share = share;\r\n                    toDistribute = toDistribute - share;\r\n                }\r\n            }\r\n        }\r\n\r\n        // Distribute the coins\r\n        for (uint256 i = 0; i \u003c taxes.length; i++) {\r\n            \r\n            if (taxes[i].taxType == TaxType.WALLET) {\r\n                if (taxes[i].convertToNative) {\r\n                    payable(taxes[i].location).transfer(taxes[i].share);\r\n                } else {\r\n                    token.transfer(taxes[i].location, checkTokenAmount(token, taxes[i].taxPool));\r\n                }\r\n            }\r\n            else if (taxes[i].taxType == TaxType.DISTRIBUTOR) {\r\n                if (taxes[i].convertToNative) {\r\n                    payable(taxes[i].location).transfer(taxes[i].share);\r\n                } else {\r\n                    token.approve(taxes[i].location, taxes[i].taxPool);\r\n                    IWalletDistributor(taxes[i].location).receiveToken(_token, address(this), checkTokenAmount(token, taxes[i].taxPool));\r\n                }\r\n            }\r\n            else if (taxes[i].taxType == TaxType.DIVIDEND) {\r\n               if (taxes[i].convertToNative) {\r\n                    IDividendDistributor(taxes[i].location).depositNative{value: taxes[i].share}();\r\n                } else {\r\n                    IDividendDistributor(taxes[i].location).depositToken(address(this), checkTokenAmount(token, taxes[i].taxPool));\r\n                }\r\n            }\r\n            else if (taxes[i].taxType == TaxType.BURN) {\r\n                IBurnable(_token).burn(checkTokenAmount(token, taxes[i].taxPool));\r\n            }\r\n            else if (taxes[i].taxType == TaxType.LIQUIDITY) {\r\n                if(taxes[i].share \u003e 0){\r\n                    uint256 half = checkTokenAmount(token, taxes[i].taxPool / 2);\r\n                    _router.addLiquidityETH{value: taxes[i].share}(\r\n                        _token,\r\n                        half,\r\n                        0,\r\n                        0,\r\n                        taxes[i].location,\r\n                        block.timestamp + 300\r\n                    );\r\n                }\r\n            }\r\n            \r\n            taxes[i].taxPool = 0;\r\n            taxes[i].share = 0;\r\n        }\r\n\r\n        emit TaxesDistributed(totalTokens, amountBNB);\r\n\r\n        lastSwapTime = block.timestamp;\r\n    }\r\n\r\n    function getSellTax() public override onlyToken view returns (uint256) {\r\n        uint256 taxAmount;\r\n        for (uint256 i = 0; i \u003c taxes.length; i++) {\r\n            taxAmount += taxes[i].sellTaxPercentage;\r\n        }\r\n        return taxAmount;\r\n    }\r\n\r\n    function getBuyTax() public override onlyToken view returns (uint256) {\r\n        uint256 taxAmount;\r\n        for (uint256 i = 0; i \u003c taxes.length; i++) {\r\n            taxAmount += taxes[i].buyTaxPercentage;\r\n        }\r\n        return taxAmount;\r\n    }\r\n    \r\n    function setTaxWallet(string memory taxName, address wallet) external override onlyToken {\r\n        bool updated;\r\n        for (uint256 i = 0; i \u003c taxes.length; i++) {\r\n            if (taxes[i].taxType == TaxType.WALLET \u0026\u0026 compareStrings(taxes[i].taxName, taxName)) {\r\n                taxes[i].location = wallet;\r\n                updated = true;\r\n            }\r\n        }\r\n        require(updated, \"could not find tax to update\");\r\n    }\r\n\r\n    function setSellTax(string memory taxName, uint256 taxPercentage) external override onlyToken {\r\n        bool updated;\r\n        for (uint256 i = 0; i \u003c taxes.length; i++) {\r\n            if (compareStrings(taxes[i].taxName, taxName)) {\r\n                taxes[i].sellTaxPercentage = taxPercentage;\r\n                updated = true;\r\n            }\r\n        }\r\n        require(updated, \"could not find tax to update\");\r\n        require(getSellTax() \u003c= maxSellTax, \"tax cannot be set this high\");\r\n    }\r\n\r\n    function setBuyTax(string memory taxName, uint256 taxPercentage) external override onlyToken {\r\n        bool updated;\r\n        for (uint256 i = 0; i \u003c taxes.length; i++) {\r\n            //if (taxes[i].taxName == taxName) {\r\n            if (compareStrings(taxes[i].taxName, taxName)) {\r\n                taxes[i].buyTaxPercentage = taxPercentage;\r\n                updated = true;\r\n            }\r\n        }\r\n        require(updated, \"could not find tax to update\");\r\n        require(getBuyTax() \u003c= maxBuyTax, \"tax cannot be set this high\");\r\n    }\r\n\r\n    function takeSellTax(uint256 value) external override onlyToken returns (uint256) {\r\n        for (uint256 i = 0; i \u003c taxes.length; i++) {\r\n            if (taxes[i].sellTaxPercentage \u003e 0) {\r\n                uint256 taxAmount = (value * taxes[i].sellTaxPercentage) / 10000;\r\n                taxes[i].taxPool += taxAmount;\r\n                value = value - taxAmount;\r\n            }\r\n        }\r\n        return value;\r\n    }\r\n\r\n    function takeBuyTax(uint256 value) external override onlyToken returns (uint256) {\r\n        for (uint256 i = 0; i \u003c taxes.length; i++) {\r\n            if (taxes[i].buyTaxPercentage \u003e 0) {\r\n                uint256 taxAmount = (value * taxes[i].buyTaxPercentage) / 10000;\r\n                taxes[i].taxPool += taxAmount;\r\n                value = value - taxAmount;\r\n            }\r\n        }\r\n        return value;\r\n    }\r\n    \r\n    \r\n    \r\n    // Private methods\r\n    function compareStrings(string memory a, string memory b) private pure returns (bool) {\r\n        return (keccak256(abi.encodePacked((a))) == keccak256(abi.encodePacked((b))));\r\n    }\r\n\r\n    function checkTokenAmount(IERC20 token, uint256 amount) private view returns (uint256) {\r\n        uint256 balance = token.balanceOf(address(this));\r\n        if (balance \u003e amount) {\r\n            return amount;\r\n        }\r\n        return balance;\r\n    }\r\n}\r\n"},"_Neuroni.sol":{"content":"//SPDX-License-Identifier: UNLICENSED\r\n\r\npragma solidity ^0.8.7;\r\n\r\nimport \"./Interfaces.sol\";\r\nimport \"./Libraries.sol\";\r\nimport \"./BaseErc20.sol\";\r\nimport \"./Burnable.sol\";\r\nimport \"./Taxable.sol\";\r\nimport \"./TaxDistributor.sol\";\r\nimport \"./AntiSniper.sol\";\r\n\r\ncontract NeuroniAI is BaseErc20, AntiSniper, Burnable, Taxable {\r\n\r\n    mapping(address =\u003e bool) public zkManualEnable;\r\n    uint256 public zkTokenThreshold;\r\n\r\n    constructor () {\r\n        configure(0xA281151C22a70d6743F5b31Bc4E3958ce3681985);\r\n\r\n        symbol = \"NEURONI\";\r\n        name = \"Neuroni.AI\";\r\n        decimals = 18;\r\n\r\n        // Swap\r\n        address routerAddress = getRouterAddress();\r\n        IDEXRouter router = IDEXRouter(routerAddress);\r\n        address WBNB = router.WETH();\r\n        address pair = IDEXFactory(router.factory()).createPair(WBNB, address(this));\r\n        exchanges[pair] = true;\r\n        taxDistributor = new TaxDistributor(routerAddress, pair, WBNB, 1300, 1300);\r\n\r\n        // Anti Sniper\r\n        enableSniperBlocking = true;\r\n        isNeverSniper[address(taxDistributor)] = true;\r\n        mhPercentage = 300;\r\n        enableHighTaxCountdown = true;\r\n\r\n        // Tax\r\n        minimumTimeBetweenSwaps = 30 seconds;\r\n        minimumTokensBeforeSwap = 10000 * 10 ** decimals;\r\n        excludedFromTax[address(taxDistributor)] = true;\r\n        taxDistributor.createWalletTax(\"Insight\", 190, 456, 0xC6467b4F00cA55c5548fb7bd872c872B63841eB9, true);\r\n        taxDistributor.createWalletTax(\"Marketing\", 185, 444, 0xE53820cAdD647D99B1BD98a29Af7Be87E497Cf0f, true);\r\n        taxDistributor.createWalletTax(\"Dev\", 125, 300, 0x08a3351E0C1eb65C5D80D568AdbE97810820d7E3, true);\r\n        autoSwapTax = false;\r\n\r\n        // Burnable\r\n        ableToBurn[address(taxDistributor)] = true;\r\n\r\n        // ZK\r\n        zkManualEnable[owner] = true;\r\n        zkTokenThreshold = 100_000 * 10 ** decimals;\r\n\r\n        // Finalise\r\n        _allowed[address(taxDistributor)][routerAddress] = 2**256 - 1;\r\n        _totalSupply = _totalSupply + (10_000_000 * 10 ** decimals);\r\n        _balances[owner] = _balances[owner] + _totalSupply;\r\n        emit Transfer(address(0), owner, _totalSupply);\r\n    }\r\n\r\n\r\n    // Overrides\r\n    \r\n    function launch() public override(AntiSniper, BaseErc20) onlyOwner {\r\n        super.launch();\r\n    }\r\n\r\n    function configure(address _owner) internal override(AntiSniper, Burnable, Taxable, BaseErc20) {\r\n        super.configure(_owner);\r\n    }\r\n    \r\n    function preTransfer(address from, address to, uint256 value) override(AntiSniper, Taxable, BaseErc20) internal {\r\n        super.preTransfer(from, to, value);\r\n    }\r\n    \r\n    function calculateTransferAmount(address from, address to, uint256 value) override(AntiSniper, Taxable, BaseErc20) internal returns (uint256) {\r\n        return super.calculateTransferAmount(from, to, value);\r\n    }\r\n    \r\n    function postTransfer(address from, address to) override(BaseErc20) internal {\r\n        super.postTransfer(from, to);\r\n    }\r\n\r\n    // Public Functions\r\n\r\n    function allowZk(address who) external view returns(bool) {\r\n        return zkManualEnable[who] || _balances[who] \u003e= zkTokenThreshold;\r\n    }\r\n\r\n    // Admin Functions\r\n    function setManualZK(address who, bool on) external onlyOwner {\r\n        zkManualEnable[who] = on;\r\n    }\r\n\r\n    function setZkTokenThreshold(uint256 amount) external onlyOwner {\r\n        zkTokenThreshold = amount;\r\n    }\r\n} "}} < 

NeuroniAI ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ableToBurn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"allowZk","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoSwapTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"canAlwaysTrade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"antiBot","type":"address"}],"name":"configurePinkAntiBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableBlockLogProtection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableHighTaxCountdown","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enablePinkAntiBot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableSniperBlocking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"exchanges","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedFromSelling","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedFromTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isNeverSniper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isSniper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"launchBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxGasLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mhAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mhPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTimeBetweenSwaps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokensBeforeSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"msAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"msPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pinkAntiBot","outputs":[{"internalType":"contract IPinkAntiBot","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeBnb","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"runSwapManually","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setAbleToBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setAutoSwaptax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setBlockLogProtection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"taxName","type":"string"},{"internalType":"uint256","name":"taxAmount","type":"uint256"}],"name":"setBuyTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setCanAlwaysTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"isExchange","type":"bool"}],"name":"setExchange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setExcludedFromTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setHighTaxCountdown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setIsSniper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"on","type":"bool"}],"name":"setManualZK","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxGasLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMhPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMsPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setNeverSniper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setPinkAntiBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"taxName","type":"string"},{"internalType":"uint256","name":"taxAmount","type":"uint256"}],"name":"setSellTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setSniperBlocking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"uint256","name":"minTime","type":"uint256"}],"name":"setTaxDistributionThresholds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"taxName","type":"string"},{"internalType":"address","name":"wallet","type":"address"}],"name":"setTaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setZkTokenThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sniperTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"snipersCaught","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxDistributorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"transactionBlockLog","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"transferTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"zkManualEnable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"zkTokenThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ableToBurn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"allowZk","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoSwapTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"canAlwaysTrade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"antiBot","type":"address"}],"name":"configurePinkAntiBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableBlockLogProtection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableHighTaxCountdown","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enablePinkAntiBot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableSniperBlocking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"exchanges","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedFromSelling","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedFromTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isNeverSniper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isSniper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"launchBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxGasLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mhAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mhPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTimeBetweenSwaps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokensBeforeSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"msAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"msPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pinkAntiBot","outputs":[{"internalType":"contract IPinkAntiBot","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeBnb","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"runSwapManually","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setAbleToBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setAutoSwaptax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setBlockLogProtection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"taxName","type":"string"},{"internalType":"uint256","name":"taxAmount","type":"uint256"}],"name":"setBuyTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setCanAlwaysTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"isExchange","type":"bool"}],"name":"setExchange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setExcludedFromTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setHighTaxCountdown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setIsSniper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"on","type":"bool"}],"name":"setManualZK","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxGasLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMhPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMsPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setNeverSniper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setPinkAntiBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"taxName","type":"string"},{"internalType":"uint256","name":"taxAmount","type":"uint256"}],"name":"setSellTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setSniperBlocking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"uint256","name":"minTime","type":"uint256"}],"name":"setTaxDistributionThresholds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"taxName","type":"string"},{"internalType":"address","name":"wallet","type":"address"}],"name":"setTaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setZkTokenThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sniperTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"snipersCaught","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxDistributorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"transactionBlockLog","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"transferTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"zkManualEnable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"zkTokenThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

NeuroniAI Bytecode

60806040526006805460ff60a81b1916600160a81b1790553480156200002457600080fd5b506200004473a281151c22a70d6743f5b31bc4e3958ce3681985620006f2565b604080518082019091526007808252664e4555524f4e4960c81b60209092019182526200007491600491620008d2565b5060408051808201909152600a808252694e6575726f6e692e414960b01b6020909201918252620000a891600591620008d2565b506006805460ff191660121790556000620000c26200070b565b905060008190506000816001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200010557600080fd5b505afa1580156200011a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000140919062000986565b90506000826001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200017e57600080fd5b505afa15801562000193573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001b9919062000986565b6040516364e329cb60e11b81526001600160a01b038481166004830152306024830152919091169063c9c6539690604401602060405180830381600087803b1580156200020557600080fd5b505af11580156200021a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000240919062000986565b6001600160a01b03811660009081526009602052604090819020805460ff1916600117905551909150849082908490610514908190620002809062000961565b6001600160a01b03958616815293851660208501529390911660408301526060820152608081019190915260a001604051809103906000f080158015620002cb573d6000803e3d6000fd5b50601580546001600160a01b03929092166001600160a01b031990921682179055600a805460ff60a81b1916600160a81b178155600091825260126020526040909120805460ff1916600117905561012c600c55805460ff60b81b1916600160b81b178155601e6016556006546200034a9160ff919091169062000a1c565b620003589061271062000add565b601755601580546001600160a01b0390811660009081526018602052604090819020805460ff1916600190811790915592549051634693167f60e11b815260a06004820152600760a482015266125b9cda59da1d60ca1b60c482015260be60248201526101c8604482015273c6467b4f00ca55c5548fb7bd872c872b63841eb9606482015260848101939093521690638d262cfe9060e401600060405180830381600087803b1580156200040b57600080fd5b505af115801562000420573d6000803e3d6000fd5b5050601554604051634693167f60e11b815260a06004820152600960a4820152684d61726b6574696e6760b81b60c482015260b960248201526101bc604482015273e53820cadd647d99b1bd98a29af7be87e497cf0f6064820152600160848201526001600160a01b039091169250638d262cfe915060e401600060405180830381600087803b158015620004b457600080fd5b505af1158015620004c9573d6000803e3d6000fd5b5050601554604051634693167f60e11b815260a06004820152600360a4820152622232bb60e91b60c4820152607d602482015261012c60448201527308a3351e0c1eb65c5d80d568adbe97810820d7e36064820152600160848201526001600160a01b039091169250638d262cfe915060e401600060405180830381600087803b1580156200055757600080fd5b505af11580156200056c573d6000803e3d6000fd5b50506015805460ff60a01b1981169091556001600160a01b039081166000908152601460209081526040808320805460ff1990811660019081179092556006805461010090049096168552601a90935292208054909116909117905554620005dc925060ff169050600a62000a1c565b620005eb90620186a062000add565b601b556015546001600160a01b03908116600090815260016020908152604080832093881683529290522060001990556006546200062e9060ff16600a62000a1c565b6200063d906298968062000add565b6002546200064c9190620009b8565b600281905560065461010090046001600160a01b03166000908152602081905260409020546200067d9190620009b8565b600680546001600160a01b03610100918290048116600090815260208190526040808220959095559254600254945192900416927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91620006e091815260200190565b60405180910390a35050505062000b52565b6200070881620007d960201b62001d581760201c565b50565b600046600114806200071d5750466003145b80620007295750466004145b80620007355750466005145b15620007545750737a250d5630b4cf539739df2c5dacb4c659f2488d90565b46603814156200077757507310ed43c718714eb63d5aa57b78b54704e256024e90565b46606114156200079a575073c99f3718db7c90b020cbbbb47ed26b0ba0c6512b90565b60405162461bcd60e51b815260206004820152601060248201526f155b9adb9bdddb8810da185a5b88125160821b604482015260640160405180910390fd5b6001600160a01b0381166000908152601860209081526040909120805460ff191660011790556200070890829062001d8062000815821b17901c565b6001600160a01b0381166000908152601460209081526040909120805460ff191660011790556200070890829062001da862000851821b17901c565b6001600160a01b0381166000908152601260209081526040909120805460ff191660011790556200070890829062001dd06200088d821b17901c565b60068054610100600160a81b0319166101006001600160a01b03938416810291909117918290559004166000908152600760205260409020805460ff19166001179055565b828054620008e09062000aff565b90600052602060002090601f0160209004810192826200090457600085556200094f565b82601f106200091f57805160ff19168380011785556200094f565b828001600101855582156200094f579182015b828111156200094f57825182559160200191906001019062000932565b506200095d9291506200096f565b5090565b612dca8062003c0b83390190565b5b808211156200095d576000815560010162000970565b6000602082840312156200099957600080fd5b81516001600160a01b0381168114620009b157600080fd5b9392505050565b60008219821115620009ce57620009ce62000b3c565b500190565b600181815b8085111562000a14578160001904821115620009f857620009f862000b3c565b8085161562000a0657918102915b93841c9390800290620009d8565b509250929050565b6000620009b160ff84168360008262000a385750600162000ad7565b8162000a475750600062000ad7565b816001811462000a60576002811462000a6b5762000a8b565b600191505062000ad7565b60ff84111562000a7f5762000a7f62000b3c565b50506001821b62000ad7565b5060208310610133831016604e8410600b841016171562000ab0575081810a62000ad7565b62000abc8383620009d3565b806000190482111562000ad35762000ad362000b3c565b0290505b92915050565b600081600019048311821515161562000afa5762000afa62000b3c565b500290565b600181811c9082168062000b1457607f821691505b6020821081141562000b3657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6130a98062000b626000396000f3fe608060405234801561001057600080fd5b50600436106104335760003560e01c80636a092e7911610236578063c20c5caf1161013b578063db38a41d116100c3578063e79d416011610087578063e79d416014610995578063e948474b1461099e578063ede49a19146109c1578063f19fffcb146109d5578063f1f5cd91146109e957600080fd5b8063db38a41d14610918578063dba61c5814610938578063dd62ed3e14610941578063e53be8d11461097a578063e5a829791461098257600080fd5b8063cc1776d31161010a578063cc1776d3146108d8578063d00efb2f146108e0578063d2d7ad83146108e9578063d31acb28146108f2578063d3b0066f1461090557600080fd5b8063c20c5caf14610896578063c2ed286b146108a9578063c4a5abcd146108bc578063c552f4c5146108c557600080fd5b8063870333e0116101be578063989763ef1161018d578063989763ef14610817578063a457c2d71461083a578063a6f9dae11461084d578063a9059cbb14610860578063b0ad3ebf1461087357600080fd5b8063870333e0146107c157806389d53c01146107e45780638da5cb5b146107f757806395d89b411461080f57600080fd5b80637412dbb3116102055780637412dbb31461075b578063790ca4131461077e57806379cc6790146107875780638091f3bf1461079a57806381045345146107ae57600080fd5b80636a092e79146107035780636b8f2f3b146107165780636f8645521461072a57806370a082311461073257600080fd5b8063368274991161033c5780634fbc2775116102c45780635d90bbaf116102935780635d90bbaf146106b95780635d9d7d43146106cc5780635e45da23146106df5780636331bf65146106e85780636508c57e146106f057600080fd5b80634fbc27751461066c57806352c6dbc41461067f5780635543379a14610693578063583dd79d146106a657600080fd5b8063442ef7d21161030b578063442ef7d21461062d57806345541cba146106355780634cf49dd71461063e5780634f7041a5146106515780634f72e2a21461065957600080fd5b806336827499146105e157806339509351146105f4578063407133d21461060757806342966c681461061a57600080fd5b806318551108116103bf5780632b7506271161038e5780632b7506271461055f5780632dcb51991461058257806330bd85c51461058b578063313ce5671461059f5780633164df8b146105be57600080fd5b806318551108146105015780631e19ae771461052657806323b872dd1461053957806328be90381461054c57600080fd5b8063095ea7b311610406578063095ea7b3146104935780630ab9e6a0146104a65780630f3a325f146104b95780631776834a146104dc57806318160ddd146104ef57600080fd5b806301339c2114610438578063064a59d01461044257806306fdde031461046b57806307a1cfbd14610480575b600080fd5b6104406109f1565b005b60065461045690600160a81b900460ff1681565b60405190151581526020015b60405180910390f35b610473610a33565b6040516104629190612e28565b61044061048e366004612d42565b610ac1565b6104566104a1366004612c99565b610b58565b6104406104b4366004612d87565b610c4c565b6104566104c7366004612bd1565b60116020526000908152604090205460ff1681565b6104406104ea366004612d87565b610c80565b6002545b604051908152602001610462565b6015546001600160a01b03165b6040516001600160a01b039091168152602001610462565b610440610534366004612c62565b610cb4565b610456610547366004612c26565b610d0e565b61044061055a366004612c62565b610e39565b61045661056d366004612bd1565b60126020526000908152604090205460ff1681565b6104f3601b5481565b600a5461045690600160c01b900460ff1681565b6006546105ac9060ff1681565b60405160ff9091168152602001610462565b6104566105cc366004612bd1565b60146020526000908152604090205460ff1681565b6104406105ef366004612cc3565b610e93565b610456610602366004612c99565b610ee0565b600a5461050e906001600160a01b031681565b610440610628366004612d87565b610ff4565b610440611056565b6104f3600b5481565b61045661064c366004612bd1565b61112b565b6104f3611172565b610440610667366004612cc3565b6111f4565b61044061067a366004612c62565b611241565b600a5461045690600160b01b900460ff1681565b6104406106a1366004612cc3565b61129b565b6104406106b4366004612cfd565b6112e8565b6104406106c7366004612c62565b611349565b6104406106da366004612c62565b6113a3565b6104f3600d5481565b6104f36113fd565b6104406106fe366004612d42565b61141c565b610456610711366004612bf3565b61147d565b60155461045690600160a01b900460ff1681565b6104f36115b7565b6104f3610740366004612bd1565b6001600160a01b031660009081526020819052604090205490565b610456610769366004612bd1565b60096020526000908152604090205460ff1681565b6104f3600e5481565b610440610795366004612c99565b6115cc565b60065461045690600160b01b900460ff1681565b6104406107bc366004612d87565b6116cb565b6104566107cf366004612bd1565b601a6020526000908152604090205460ff1681565b6104406107f2366004612cc3565b6116ff565b60065461050e9061010090046001600160a01b031681565b6104736117a5565b610456610825366004612bd1565b60186020526000908152604090205460ff1681565b610456610848366004612c99565b6117b2565b61044061085b366004612bd1565b611881565b61045661086e366004612c99565b611927565b610456610881366004612bd1565b60076020526000908152604090205460ff1681565b6104406108a4366004612d87565b6119b6565b6104406108b7366004612c62565b6119ea565b6104f3600c5481565b6104406108d3366004612cc3565b611ac2565b6104f3611b0f565b6104f3600f5481565b6104f360175481565b610440610900366004612db9565b611b54565b610440610913366004612bd1565b611b8e565b6104f3610926366004612bd1565b60136020526000908152604090205481565b6104f360165481565b6104f361094f366004612bf3565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610440611c54565b610440610990366004612c62565b611cc6565b6104f360105481565b6104566109ac366004612bd1565b60086020526000908152604090205460ff1681565b600a5461045690600160a81b900460ff1681565b600a5461045690600160b81b900460ff1681565b6104f3611d20565b60065461010090046001600160a01b03163314610a295760405162461bcd60e51b8152600401610a2090612eeb565b60405180910390fd5b610a31611e15565b565b60058054610a4090612fa3565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6c90612fa3565b8015610ab95780601f10610a8e57610100808354040283529160200191610ab9565b820191906000526020600020905b815481529060010190602001808311610a9c57829003601f168201915b505050505081565b60065461010090046001600160a01b03163314610af05760405162461bcd60e51b8152600401610a2090612eeb565b6015546040516307a1cfbd60e01b81526001600160a01b03909116906307a1cfbd90610b229085908590600401612e65565b600060405180830381600087803b158015610b3c57600080fd5b505af1158015610b50573d6000803e3d6000fd5b505050505050565b6006546000903390600160a81b900460ff168015610b7f5750600654600160b01b900460ff165b80610b9c57506006546001600160a01b0382811661010090920416145b80610bb657503360009081526007602052604090205460ff165b610bd25760405162461bcd60e51b8152600401610a2090612ebe565b6001600160a01b038416610bf85760405162461bcd60e51b8152600401610a2090612e87565b3360008181526001602090815260408083206001600160a01b038916808552908352928190208790555186815291929160008051602061305483398151915291015b60405180910390a35060019392505050565b60065461010090046001600160a01b03163314610c7b5760405162461bcd60e51b8152600401610a2090612eeb565b601b55565b60065461010090046001600160a01b03163314610caf5760405162461bcd60e51b8152600401610a2090612eeb565b600d55565b60065461010090046001600160a01b03163314610ce35760405162461bcd60e51b8152600401610a2090612eeb565b6001600160a01b03919091166000908152601460205260409020805460ff1916911515919091179055565b6006546000908490600160a81b900460ff168015610d355750600654600160b01b900460ff165b80610d5257506006546001600160a01b0382811661010090920416145b80610d6c57503360009081526007602052604090205460ff165b610d885760405162461bcd60e51b8152600401610a2090612ebe565b6001600160a01b0385166000908152600160209081526040808320338452909152902054610db7908490612f8c565b6001600160a01b0386166000908152600160209081526040808320338452909152902055610de6858585611e56565b6001600160a01b03851660008181526001602090815260408083203380855290835292819020549051908152919291600080516020613054833981519152910160405180910390a3506001949350505050565b60065461010090046001600160a01b03163314610e685760405162461bcd60e51b8152600401610a2090612eeb565b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b03163314610ec25760405162461bcd60e51b8152600401610a2090612eeb565b600a8054911515600160b81b0260ff60b81b19909216919091179055565b6006546000903390600160a81b900460ff168015610f075750600654600160b01b900460ff165b80610f2457506006546001600160a01b0382811661010090920416145b80610f3e57503360009081526007602052604090205460ff165b610f5a5760405162461bcd60e51b8152600401610a2090612ebe565b6001600160a01b038416610f805760405162461bcd60e51b8152600401610a2090612e87565b3360009081526001602090815260408083206001600160a01b0388168452909152902054610faf908490612f33565b3360008181526001602090815260408083206001600160a01b038a16808552908352928190208590555193845290926000805160206130548339815191529101610c3a565b3360009081526014602052604090205460ff166110495760405162461bcd60e51b81526020600482015260136024820152726e6f206275726e207065726d697373696f6e7360681b6044820152606401610a20565b611053338261206f565b50565b600654600160b01b900460ff166110c15760405162461bcd60e51b815260206004820152602960248201527f63616e206f6e6c792062652063616c6c6564206f6e636520746f6b656e206973604482015268081b185d5b98da195960ba1b6064820152608401610a20565b601560009054906101000a90046001600160a01b03166001600160a01b031663e4fc6b6d6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561111157600080fd5b505af1158015611125573d6000803e3d6000fd5b50505050565b6001600160a01b0381166000908152601a602052604081205460ff168061116c5750601b546001600160a01b03831660009081526020819052604090205410155b92915050565b60155460408051631296b91d60e11b815290516000926001600160a01b03169163252d723a916004808301926020929190829003018186803b1580156111b757600080fd5b505afa1580156111cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ef9190612da0565b905090565b60065461010090046001600160a01b031633146112235760405162461bcd60e51b8152600401610a2090612eeb565b60158054911515600160a01b0260ff60a01b19909216919091179055565b60065461010090046001600160a01b031633146112705760405162461bcd60e51b8152600401610a2090612eeb565b6001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b031633146112ca5760405162461bcd60e51b8152600401610a2090612eeb565b600a8054911515600160b01b0260ff60b01b19909216919091179055565b60065461010090046001600160a01b031633146113175760405162461bcd60e51b8152600401610a2090612eeb565b60155460405163583dd79d60e01b81526001600160a01b039091169063583dd79d90610b229085908590600401612e3b565b60065461010090046001600160a01b031633146113785760405162461bcd60e51b8152600401610a2090612eeb565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b031633146113d25760405162461bcd60e51b8152600401610a2090612eeb565b6001600160a01b03919091166000908152601260205260409020805460ff1916911515919091179055565b6000612710600c546002546114129190612f6d565b6111ef9190612f4b565b60065461010090046001600160a01b0316331461144b5760405162461bcd60e51b8152600401610a2090612eeb565b60155460405163328462bf60e11b81526001600160a01b0390911690636508c57e90610b229085908590600401612e65565b60065460009061010090046001600160a01b031633146114af5760405162461bcd60e51b8152600401610a2090612eeb565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a082319060240160206040518083038186803b1580156114f157600080fd5b505afa158015611505573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115299190612da0565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb90604401602060405180830381600087803b15801561157757600080fd5b505af115801561158b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115af9190612ce0565b949350505050565b6000612710600b546002546114129190612f6d565b3360009081526014602052604090205460ff166116215760405162461bcd60e51b81526020600482015260136024820152726e6f206275726e207065726d697373696f6e7360681b6044820152606401610a20565b6001600160a01b0382166000908152600160209081526040808320338452909152902054611650908290612f8c565b6001600160a01b038316600090815260016020908152604080832033845290915290205561167e828261206f565b6001600160a01b0382166000818152600160209081526040808320338085529083529281902054905190815291929160008051602061305483398151915291015b60405180910390a35050565b60065461010090046001600160a01b031633146116fa5760405162461bcd60e51b8152600401610a2090612eeb565b600c55565b60065461010090046001600160a01b0316331461172e5760405162461bcd60e51b8152600401610a2090612eeb565b600a54600160a01b900460ff166117875760405162461bcd60e51b815260206004820152601f60248201527f70696e6b20616e746920626f74206973206e6f7420636f6e66696775726564006044820152606401610a20565b600a8054911515600160c01b0260ff60c01b19909216919091179055565b60048054610a4090612fa3565b6006546000903390600160a81b900460ff1680156117d95750600654600160b01b900460ff165b806117f657506006546001600160a01b0382811661010090920416145b8061181057503360009081526007602052604090205460ff165b61182c5760405162461bcd60e51b8152600401610a2090612ebe565b6001600160a01b0384166118525760405162461bcd60e51b8152600401610a2090612e87565b3360009081526001602090815260408083206001600160a01b0388168452909152902054610faf908490612f8c565b60065461010090046001600160a01b031633146118b05760405162461bcd60e51b8152600401610a2090612eeb565b6001600160a01b0381166118ff5760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b6044820152606401610a20565b600680546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6006546000903390600160a81b900460ff16801561194e5750600654600160b01b900460ff165b8061196b57506006546001600160a01b0382811661010090920416145b8061198557503360009081526007602052604090205460ff165b6119a15760405162461bcd60e51b8152600401610a2090612ebe565b6119ac338585611e56565b5060019392505050565b60065461010090046001600160a01b031633146119e55760405162461bcd60e51b8152600401610a2090612eeb565b600b55565b60065461010090046001600160a01b03163314611a195760405162461bcd60e51b8152600401610a2090612eeb565b6001600160a01b03821660009081526009602052604090205460ff161580611a3f575080155b611a975760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74206578636c75646520616e2065786368616e67652066726f6d206044820152620e8c2f60eb1b6064820152608401610a20565b6001600160a01b03919091166000908152601860205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b03163314611af15760405162461bcd60e51b8152600401610a2090612eeb565b600a8054911515600160a81b0260ff60a81b19909216919091179055565b6015546040805163585e42ef60e11b815290516000926001600160a01b03169163b0bc85de916004808301926020929190829003018186803b1580156111b757600080fd5b60065461010090046001600160a01b03163314611b835760405162461bcd60e51b8152600401610a2090612eeb565b601791909155601655565b60065461010090046001600160a01b03163314611bbd5760405162461bcd60e51b8152600401610a2090612eeb565b600a80546001600160a01b0319166001600160a01b038381169182179092556006546040516318e02bd960e01b81526101009091049092166004830152906318e02bd990602401600060405180830381600087803b158015611c1e57600080fd5b505af1158015611c32573d6000803e3d6000fd5b5050600a805464ff000000ff60a01b191664010000000160a01b179055505050565b60065461010090046001600160a01b03163314611c835760405162461bcd60e51b8152600401610a2090612eeb565b600654604051479161010090046001600160a01b0316906108fc8315029083906000818181858888f19350505050158015611cc2573d6000803e3d6000fd5b5050565b60065461010090046001600160a01b03163314611cf55760405162461bcd60e51b8152600401610a2090612eeb565b6001600160a01b03919091166000908152601a60205260409020805460ff1916911515919091179055565b600654600090600160b01b900460ff1615611d52576003600f5443611d459190612f8c565b1015611d5257506126ac90565b50600090565b6001600160a01b0381166000908152601860205260409020805460ff19166001179055611053815b6001600160a01b0381166000908152601460205260409020805460ff19166001179055611053815b6001600160a01b0381166000908152601260205260409020805460ff19166001179055611053815b60068054610100600160a81b0319166101006001600160a01b03938416810291909117918290559004166000908152600760205260409020805460ff19166001179055565b60065461010090046001600160a01b03163314611e445760405162461bcd60e51b8152600401610a2090612eeb565b611e4c6120f1565b42600e5543600f55565b6001600160a01b038216611ea55760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b6044820152606401610a20565b6001600160a01b03831660009081526008602052604090205460ff1615611f0e5760405162461bcd60e51b815260206004820152601e60248201527f61646472657373206973206e6f7420616c6c6f77656420746f2073656c6c00006044820152606401610a20565b60035460ff1615611fb4576001600160a01b038316600090815260208190526040902054611f3d908290612f8c565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611f6d908290612f33565b6001600160a01b03838116600081815260208181526040918290209490945551848152909291861691600080516020613034833981519152910160405180910390a3505050565b611fbf838383612135565b6000611fcc848484612140565b6001600160a01b038516600090815260208190526040902054909150611ff3908390612f8c565b6001600160a01b038086166000908152602081905260408082209390935590851681522054612023908290612f33565b6001600160a01b03848116600081815260208181526040918290209490945551848152909291871691600080516020613034833981519152910160405180910390a3611125565b505050565b6001600160a01b03821661208257600080fd5b806002546120909190612f8c565b6002556001600160a01b0382166000908152602081905260409020546120b7908290612f8c565b6001600160a01b038316600081815260208181526040808320949094559251848152909260008051602061303483398151915291016116bf565b60065461010090046001600160a01b031633146121205760405162461bcd60e51b8152600401610a2090612eeb565b6006805460ff60b01b1916600160b01b179055565b61206a83838361214d565b60006115af848484612369565b60155460408051630dd8715760e01b815290516000926001600160a01b031691630dd87157916004808301926020929190829003018186803b15801561219257600080fd5b505afa1580156121a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ca9190612da0565b6121d49042612f8c565b600654909150600160b01b900460ff1680156121f95750601554600160a01b900460ff165b801561221d57506001600160a01b03831660009081526009602052604090205460ff165b8015612237575042601954603c6122349190612f33565b11155b801561224557506016548110155b801561226d57506017546015546001600160a01b031660009081526020819052604090205410155b80156122fc5750601560009054906101000a90046001600160a01b03166001600160a01b031663d83067866040518163ffffffff1660e01b815260040160206040518083038186803b1580156122c257600080fd5b505afa1580156122d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122fa9190612ce0565b155b1561235e57426019556015546040805163e4fc6b6d60e01b815290516001600160a01b039092169163e4fc6b6d9160048082019260009290919082900301818387803b15801561234b57600080fd5b505af192505050801561235c575060015b505b6111258484846125aa565b6001600160a01b038316600090815260186020526040812054829060ff161580156123ad57506001600160a01b03841660009081526018602052604090205460ff16155b80156123c25750600654600160b01b900460ff165b1561250f576001600160a01b03851660009081526009602052604090205460ff161561246d5760155460405163db017dc760e01b8152600481018590526001600160a01b039091169063db017dc790602401602060405180830381600087803b15801561242e57600080fd5b505af1158015612442573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124669190612da0565b905061250f565b6001600160a01b03841660009081526009602052604090205460ff161561250f57601554604051634fa26fd560e01b8152600481018590526001600160a01b0390911690634fa26fd590602401602060405180830381600087803b1580156124d457600080fd5b505af11580156124e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250c9190612da0565b90505b600061251b8285612f8c565b90508015612595576015546001600160a01b0316600090815260208190526040902054612549908290612f33565b601580546001600160a01b039081166000908152602081815260409182902094909455915491518481529181169290891691600080516020613034833981519152910160405180910390a35b6125a08686846129d3565b9695505050505050565b600a54600160a81b900460ff1615806125d357503360009081526011602052604090205460ff16155b6126115760405162461bcd60e51b815260206004820152600f60248201526e1cdb9a5c195c881c995a9958dd1959608a1b6044820152606401610a20565b600654600160b01b900460ff16801561263d57506006546001600160a01b038481166101009092041614155b801561266257506001600160a01b03831660009081526012602052604090205460ff16155b801561268757506001600160a01b03821660009081526012602052604090205460ff16155b1561206a57600d54156126e657600d545a11156126e65760405162461bcd60e51b815260206004820152601e60248201527f74686973206973206f76657220746865206d617820676173206c696d697400006044820152606401610a20565b6000600c5411801561271157506001600160a01b03821660009081526009602052604090205460ff16155b156127905761271e6113fd565b6001600160a01b038316600090815260208190526040902054612742908390612f33565b11156127905760405162461bcd60e51b815260206004820181905260248201527f74686973206973206f76657220746865206d617820686f6c6420616d6f756e746044820152606401610a20565b6000600b541180156127ba57506001600160a01b03821660009081526009602052604090205460ff165b15612816576127c76115b7565b8111156128165760405162461bcd60e51b815260206004820181905260248201527f74686973206973206f76657220746865206d61782073656c6c20616d6f756e746044820152606401610a20565b600a54600160b01b900460ff161561294e576001600160a01b03821660009081526013602052604090205443141561287f576001600160a01b0382166000908152601160205260408120805460ff19166001179055601080549161287983612fde565b91905055505b6001600160a01b0383166000908152601360205260409020544314156128d6576001600160a01b0383166000908152601160205260408120805460ff1916600117905560108054916128d083612fde565b91905055505b6001600160a01b03821660009081526009602052604090205460ff16612912576001600160a01b03821660009081526013602052604090204390555b6001600160a01b03831660009081526009602052604090205460ff1661294e576001600160a01b03831660009081526013602052604090204390555b600a54600160c01b900460ff161561206a57600a5460405163090ec10b60e31b81526001600160a01b03858116600483015284811660248301526044820184905290911690634876085890606401600060405180830381600087803b1580156129b657600080fd5b505af11580156129ca573d6000803e3d6000fd5b50505050505050565b6006546000908290600160b01b900460ff1680156129fa5750600a54600160b81b900460ff165b15612aa9576006546001600160a01b038681166101009092041614801590612a2957506000612a27611d20565b115b8015612a4e57506001600160a01b03851660009081526012602052604090205460ff16155b8015612a7357506001600160a01b03841660009081526012602052604090205460ff16155b15612aa9576000612710612a85611d20565b612a8f9086612f6d565b612a999190612f4b565b9050612aa58183612f8c565b9150505b612ab4858583612abd565b95945050505050565b6000826001600160a01b0316846001600160a01b03161415612b215760405162461bcd60e51b815260206004820152601f60248201527f796f752063616e6e6f74207472616e7366657220746f20796f757273656c66006044820152606401610a20565b5092915050565b80356001600160a01b0381168114612b3f57600080fd5b919050565b600082601f830112612b5557600080fd5b813567ffffffffffffffff80821115612b7057612b7061300f565b604051601f8301601f19908116603f01168101908282118183101715612b9857612b9861300f565b81604052838152866020858801011115612bb157600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060208284031215612be357600080fd5b612bec82612b28565b9392505050565b60008060408385031215612c0657600080fd5b612c0f83612b28565b9150612c1d60208401612b28565b90509250929050565b600080600060608486031215612c3b57600080fd5b612c4484612b28565b9250612c5260208501612b28565b9150604084013590509250925092565b60008060408385031215612c7557600080fd5b612c7e83612b28565b91506020830135612c8e81613025565b809150509250929050565b60008060408385031215612cac57600080fd5b612cb583612b28565b946020939093013593505050565b600060208284031215612cd557600080fd5b8135612bec81613025565b600060208284031215612cf257600080fd5b8151612bec81613025565b60008060408385031215612d1057600080fd5b823567ffffffffffffffff811115612d2757600080fd5b612d3385828601612b44565b925050612c1d60208401612b28565b60008060408385031215612d5557600080fd5b823567ffffffffffffffff811115612d6c57600080fd5b612d7885828601612b44565b95602094909401359450505050565b600060208284031215612d9957600080fd5b5035919050565b600060208284031215612db257600080fd5b5051919050565b60008060408385031215612dcc57600080fd5b50508035926020909101359150565b6000815180845260005b81811015612e0157602081850181015186830182015201612de5565b81811115612e13576000602083870101525b50601f01601f19169290920160200192915050565b602081526000612bec6020830184612ddb565b604081526000612e4e6040830185612ddb565b905060018060a01b03831660208301529392505050565b604081526000612e786040830185612ddb565b90508260208301529392505050565b6020808252601c908201527f63616e6e6f7420617070726f7665207468652030206164647265737300000000604082015260600190565b6020808252601390820152721d1c98591a5b99c81b9bdd08195b98589b1959606a1b604082015260600190565b60208082526028908201527f63616e206f6e6c792062652063616c6c65642062792074686520636f6e74726160408201526731ba1037bbb732b960c11b606082015260800190565b60008219821115612f4657612f46612ff9565b500190565b600082612f6857634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612f8757612f87612ff9565b500290565b600082821015612f9e57612f9e612ff9565b500390565b600181811c90821680612fb757607f821691505b60208210811415612fd857634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612ff257612ff2612ff9565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b801515811461105357600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a26469706673582212206204d32ac11c136025a2fcacb1d451b5a5ff53ffc993127dc4f526f605016e8664736f6c634300080700336101406040523480156200001257600080fd5b5060405162002dca38038062002dca8339810160408190526200003591620001b5565b6001600160a01b038316620000915760405162461bcd60e51b815260206004820152601f60248201527f706169726564546f6b656e2063616e6e6f74206265203020616464726573730060448201526064015b60405180910390fd5b6001600160a01b038416620000e95760405162461bcd60e51b815260206004820152601860248201527f706169722063616e6e6f74206265203020616464726573730000000000000000604482015260640162000088565b6001600160a01b038516620001415760405162461bcd60e51b815260206004820152601a60248201527f726f757465722063616e6e6f7420626520302061646472657373000000000000604482015260640162000088565b33606090811b60c0526001600160601b031993811b841660e052600080546001600160a01b0388166001600160a01b0319909116179055610100929092526101205291821b811660805291901b1660a05262000212565b80516001600160a01b0381168114620001b057600080fd5b919050565b600080600080600060a08688031215620001ce57600080fd5b620001d98662000198565b9450620001e96020870162000198565b9350620001f96040870162000198565b6060870151608090970151959894975095949392505050565b60805160601c60a05160601c60c05160601c60e05160601c6101005161012051612ad7620002f36000396000818161032a01526105930152600081816102ad0152610bdb0152600061104f015260008181610424015281816106180152818161079601528181610836015281816108ba015281816109e101528181610b1501528181610c0d01528181610c9101528181610e1f01528181610f3c01528181610ffb0152818161109b01528181611a0601528181611ca401528181611df101528181611fbf0152612136015260006101e1015260006103d70152612ad76000f3fe6080604052600436106101235760003560e01c8063a411209a116100a0578063db017dc711610064578063db017dc71461037d578063e4fc6b6d1461039d578063ed4ce99e146103a5578063ee16c160146103c5578063fb5a780c146103f957600080fd5b8063a411209a1461029b578063b0bc85de146102cf578063c5be2bc7146102e4578063c8e956ab14610318578063d83067861461034c57600080fd5b80633268cc56116100e75780633268cc56146101cf5780634fa26fd51461021b578063583dd79d1461023b5780636508c57e1461025b5780638d262cfe1461027b57600080fd5b806307a1cfbd1461012f5780630dd8715714610151578063135b4fc01461017a578063252d723a1461019a5780632b1fb89e146101af57600080fd5b3661012a57005b600080fd5b34801561013b57600080fd5b5061014f61014a3660046125bc565b610419565b005b34801561015d57600080fd5b5061016760015481565b6040519081526020015b60405180910390f35b34801561018657600080fd5b5061014f6101953660046126b0565b61060d565b3480156101a657600080fd5b50610167610789565b3480156101bb57600080fd5b5061014f6101ca3660046126b0565b61082b565b3480156101db57600080fd5b506102037f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610171565b34801561022757600080fd5b50610167610236366004612726565b6108ad565b34801561024757600080fd5b5061014f61025636600461256e565b6109d6565b34801561026757600080fd5b5061014f6102763660046125bc565b610b0a565b34801561028757600080fd5b5061014f6102963660046126b0565b610c02565b3480156102a757600080fd5b506101677f000000000000000000000000000000000000000000000000000000000000000081565b3480156102db57600080fd5b50610167610c84565b3480156102f057600080fd5b506103046102ff366004612726565b610d20565b6040516101719897969594939291906127a2565b34801561032457600080fd5b506101677f000000000000000000000000000000000000000000000000000000000000000081565b34801561035857600080fd5b5060005461036d90600160a01b900460ff1681565b6040519015158152602001610171565b34801561038957600080fd5b50610167610398366004612726565b610e12565b61014f610f31565b3480156103b157600080fd5b5061014f6103c036600461264f565b611fb4565b3480156103d157600080fd5b506102037f000000000000000000000000000000000000000000000000000000000000000081565b34801561040557600080fd5b5061014f610414366004612601565b61212b565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461046a5760405162461bcd60e51b815260040161046190612878565b60405180910390fd5b6000805b6002548110156105735761052e6002828154811061048e5761048e612a64565b906000526020600020906007020160000180546104aa906129e2565b80601f01602080910402602001604051908101604052809291908181526020018280546104d6906129e2565b80156105235780601f106104f857610100808354040283529160200191610523565b820191906000526020600020905b81548152906001019060200180831161050657829003601f168201915b505050505085612294565b1561056157826002828154811061054757610547612a64565b906000526020600020906007020160010181905550600191505b8061056b81612a1d565b91505061046e565b50806105915760405162461bcd60e51b815260040161046190612841565b7f00000000000000000000000000000000000000000000000000000000000000006105ba610789565b11156106085760405162461bcd60e51b815260206004820152601b60248201527f7461782063616e6e6f74206265207365742074686973206869676800000000006044820152606401610461565b505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106555760405162461bcd60e51b815260040161046190612878565b6002604051806101000160405280878152602001868152602001858152602001600081526020016003600481111561068f5761068f612a4e565b81526001600160a01b038516602080830191909152600060408301819052851515606090930192909252835460018101855593825290819020825180519394600702909101926106e29284920190612384565b5060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff0219169083600481111561072b5761072b612a4e565b021790555060a0820151600482018054610100600160a81b0319166101006001600160a01b039093169290920291909117905560c0820151600582015560e0909101516006909101805460ff19169115159190911790555050505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107d35760405162461bcd60e51b815260040161046190612878565b6000805b60025481101561082557600281815481106107f4576107f4612a64565b906000526020600020906007020160010154826108119190612942565b91508061081d81612a1d565b9150506107d7565b50905090565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108735760405162461bcd60e51b815260040161046190612878565b6002604051806101000160405280878152602001868152602001858152602001600081526020016001600481111561068f5761068f612a4e565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108f75760405162461bcd60e51b815260040161046190612878565b60005b6002548110156109cc5760006002828154811061091957610919612a64565b90600052602060002090600702016002015411156109ba5760006127106002838154811061094957610949612a64565b90600052602060002090600702016002015485610966919061297c565b610970919061295a565b9050806002838154811061098657610986612a64565b906000526020600020906007020160030160008282546109a69190612942565b909155506109b69050818561299b565b9350505b806109c481612a1d565b9150506108fa565b508190505b919050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a1e5760405162461bcd60e51b815260040161046190612878565b6000805b600254811015610aec57600060028281548110610a4157610a41612a64565b60009182526020909120600460079092020181015460ff1690811115610a6957610a69612a4e565b148015610a875750610a876002828154811061048e5761048e612a64565b15610ada578260028281548110610aa057610aa0612a64565b906000526020600020906007020160040160016101000a8154816001600160a01b0302191690836001600160a01b03160217905550600191505b80610ae481612a1d565b915050610a22565b50806106085760405162461bcd60e51b815260040161046190612841565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b525760405162461bcd60e51b815260040161046190612878565b6000805b600254811015610bbb57610b766002828154811061048e5761048e612a64565b15610ba9578260028281548110610b8f57610b8f612a64565b906000526020600020906007020160020181905550600191505b80610bb381612a1d565b915050610b56565b5080610bd95760405162461bcd60e51b815260040161046190612841565b7f00000000000000000000000000000000000000000000000000000000000000006105ba610c84565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c4a5760405162461bcd60e51b815260040161046190612878565b6002604051806101000160405280878152602001868152602001858152602001600081526020016000600481111561068f5761068f612a4e565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610cce5760405162461bcd60e51b815260040161046190612878565b6000805b6002548110156108255760028181548110610cef57610cef612a64565b90600052602060002090600702016002015482610d0c9190612942565b915080610d1881612a1d565b915050610cd2565b60028181548110610d3057600080fd5b9060005260206000209060070201600091509050806000018054610d53906129e2565b80601f0160208091040260200160405190810160405280929190818152602001828054610d7f906129e2565b8015610dcc5780601f10610da157610100808354040283529160200191610dcc565b820191906000526020600020905b815481529060010190602001808311610daf57829003601f168201915b505050506001830154600284015460038501546004860154600587015460069097015495969395929450909260ff808316936101009093046001600160a01b0316921688565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e5c5760405162461bcd60e51b815260040161046190612878565b60005b6002548110156109cc57600060028281548110610e7e57610e7e612a64565b9060005260206000209060070201600101541115610f1f57600061271060028381548110610eae57610eae612a64565b90600052602060002090600702016001015485610ecb919061297c565b610ed5919061295a565b90508060028381548110610eeb57610eeb612a64565b90600052602060002090600702016003016000828254610f0b9190612942565b90915550610f1b9050818561299b565b9350505b80610f2981612a1d565b915050610e5f565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f795760405162461bcd60e51b815260040161046190612878565b600054600160a01b900460ff1615610fc65760405162461bcd60e51b815260206004820152601060248201526f616c7265616479207377617070696e6760801b6044820152606401610461565b6000805460ff60a01b1916600160a01b17815560408051600280825260608201835290916020830190803683370190505090507f00000000000000000000000000000000000000000000000000000000000000008160008151811061102d5761102d612a64565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061108157611081612a64565b6001600160a01b03909216602092830291909101909101527f00000000000000000000000000000000000000000000000000000000000000006000805b6002548110156111f45760028082815481106110dc576110dc612a64565b60009182526020909120600460079092020181015460ff169081111561110457611104612a4e565b1415611180576000600280838154811061112057611120612a64565b90600052602060002090600702016003015461113c919061295a565b9050806002838154811061115257611152612a64565b90600052602060002090600702016003015461116e919061299b565b6111789084612942565b9250506111e2565b6002818154811061119357611193612a64565b600091825260209091206006600790920201015460ff16156111e257600281815481106111c2576111c2612a64565b906000526020600020906007020160030154826111df9190612942565b91505b806111ec81612a1d565b9150506110be565b506111ff82826122ee565b90508061120c83836122ee565b1461129c577fde3142f93c040ab4be0d03a16ac06c502816c1205865dd41d9848727102570d160405161128c9060208082526033908201527f496e73756666696369656e7420746f6b656e7320746f20737761702e20506c6560408201527261736520616464206d6f726520746f6b656e7360681b606082015260800190565b60405180910390a1505050611fa5565b600080546001600160a01b03166318cbafe5838387306112be4261012c612942565b6040518663ffffffff1660e01b81526004016112de9594939291906128a0565b600060405180830381600087803b1580156112f857600080fd5b505af115801561130c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261133491908101906124a4565b905060004790508160008151811061134e5761134e612a64565b60200260200101518314158061137e57508160018151811061137257611372612a64565b60200260200101518114155b156113f9577fde3142f93c040ab4be0d03a16ac06c502816c1205865dd41d9848727102570d16040516113f09060208082526025908201527f556e657870656374656420616d6f756e74732072657475726e65642066726f6d604082015264020737761760dc1b606082015260800190565b60405180910390a15b8060005b60025481101561163f576002818154811061141a5761141a612a64565b600091825260209091206006600790920201015460ff16806114755750600280828154811061144b5761144b612a64565b60009182526020909120600460079092020181015460ff169081111561147357611473612a4e565b145b1561162d576002546114899060019061299b565b8114156114be5781600282815481106114a4576114a4612a64565b90600052602060002090600702016005018190555061162d565b60028082815481106114d2576114d2612a64565b60009182526020909120600460079092020181015460ff16908111156114fa576114fa612a4e565b14156115b8576000600280838154811061151657611516612a64565b906000526020600020906007020160030154611532919061295a565b9050600086826002858154811061154b5761154b612a64565b906000526020600020906007020160030154611567919061299b565b611571908761297c565b61157b919061295a565b9050806002848154811061159157611591612a64565b60009182526020909120600560079092020101556115af818561299b565b9350505061162d565b600085600283815481106115ce576115ce612a64565b906000526020600020906007020160030154856115eb919061297c565b6115f5919061295a565b9050806002838154811061160b5761160b612a64565b6000918252602090912060056007909202010155611629818461299b565b9250505b8061163781612a1d565b9150506113fd565b5060005b600254811015611f605760006002828154811061166257611662612a64565b60009182526020909120600460079092020181015460ff169081111561168a5761168a612a4e565b141561184c57600281815481106116a3576116a3612a64565b600091825260209091206006600790920201015460ff161561175957600281815481106116d2576116d2612a64565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166001600160a01b03166108fc6002838154811061171657611716612a64565b9060005260206000209060070201600501549081150290604051600060405180830381858888f19350505050158015611753573d6000803e3d6000fd5b50611efb565b856001600160a01b031663a9059cbb6002838154811061177b5761177b612a64565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166117ce89600286815481106117b7576117b7612a64565b9060005260206000209060070201600301546122ee565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561181457600080fd5b505af1158015611828573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117539190612551565b60036002828154811061186157611861612a64565b60009182526020909120600460079092020181015460ff169081111561188957611889612a4e565b1415611aaa57600281815481106118a2576118a2612a64565b600091825260209091206006600790920201015460ff16156118d157600281815481106116d2576116d2612a64565b856001600160a01b031663095ea7b3600283815481106118f3576118f3612a64565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166002848154811061192b5761192b612a64565b60009182526020909120600360079092020101546040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561198557600080fd5b505af1158015611999573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119bd9190612551565b50600281815481106119d1576119d1612a64565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166001600160a01b0316634ec109f47f000000000000000000000000000000000000000000000000000000000000000030611a3d8a600287815481106117b7576117b7612a64565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064015b600060405180830381600087803b158015611a8d57600080fd5b505af1158015611aa1573d6000803e3d6000fd5b50505050611efb565b600160028281548110611abf57611abf612a64565b60009182526020909120600460079092020181015460ff1690811115611ae757611ae7612a4e565b1415611c5f5760028181548110611b0057611b00612a64565b600091825260209091206006600790920201015460ff1615611bd05760028181548110611b2f57611b2f612a64565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166001600160a01b031663db6b524660028381548110611b7557611b75612a64565b9060005260206000209060070201600501546040518263ffffffff1660e01b81526004016000604051808303818588803b158015611bb257600080fd5b505af1158015611bc6573d6000803e3d6000fd5b5050505050611efb565b60028181548110611be357611be3612a64565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166001600160a01b031663338b5dea30611c2e89600286815481106117b7576117b7612a64565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401611a73565b600460028281548110611c7457611c74612a64565b60009182526020909120600460079092020181015460ff1690811115611c9c57611c9c612a4e565b1415611d06577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166342966c68611ce888600285815481106117b7576117b7612a64565b6040518263ffffffff1660e01b8152600401611a7391815260200190565b6002808281548110611d1a57611d1a612a64565b60009182526020909120600460079092020181015460ff1690811115611d4257611d42612a4e565b1415611efb57600060028281548110611d5d57611d5d612a64565b9060005260206000209060070201600501541115611efb576000611db0876002808581548110611d8f57611d8f612a64565b906000526020600020906007020160030154611dab919061295a565b6122ee565b600054600280549293506001600160a01b039091169163f305d719919085908110611ddd57611ddd612a64565b9060005260206000209060070201600501547f00000000000000000000000000000000000000000000000000000000000000008460008060028981548110611e2757611e27612a64565b600091825260209091206007909102016004015461010090046001600160a01b0316611e554261012c612942565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c4016060604051808303818588803b158015611ebd57600080fd5b505af1158015611ed1573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611ef69190612758565b505050505b600060028281548110611f1057611f10612a64565b906000526020600020906007020160030181905550600060028281548110611f3a57611f3a612a64565b600091825260209091206005600790920201015580611f5881612a1d565b915050611643565b5060408051858152602081018490527f5e20c9aee521e656eed033c4ae35378c79c584706f5ce7f410ab3fba389607a1910160405180910390a1505042600155505050505b6000805460ff60a01b19169055565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611ffc5760405162461bcd60e51b815260040161046190612878565b6002604051806101000160405280868152602001858152602001848152602001600081526020016002600481111561203657612036612a4e565b81526001600160a01b0384166020808301919091526000604083018190526060909201829052835460018101855593825290819020825180519394600702909101926120859284920190612384565b5060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff021916908360048111156120ce576120ce612a4e565b021790555060a0820151600482018054610100600160a81b0319166101006001600160a01b039093169290920291909117905560c0820151600582015560e0909101516006909101805460ff191691151591909117905550505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146121735760405162461bcd60e51b815260040161046190612878565b6002604051806101000160405280858152602001848152602001838152602001600081526020016004808111156121ac576121ac612a4e565b8152600060208083018290526040830182905260609092018190528354600181018555938152819020825180519394600702909101926121ef9284920190612384565b5060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff0219169083600481111561223857612238612a4e565b021790555060a0820151600482018054610100600160a81b0319166101006001600160a01b039093169290920291909117905560c0820151600582015560e0909101516006909101805460ff1916911515919091179055505050565b6000816040516020016122a79190612786565b60405160208183030381529060405280519060200120836040516020016122ce9190612786565b604051602081830303815290604052805190602001201490505b92915050565b6040516370a0823160e01b815230600482015260009081906001600160a01b038516906370a082319060240160206040518083038186803b15801561233257600080fd5b505afa158015612346573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061236a919061273f565b90508281111561237d57829150506122e8565b9392505050565b828054612390906129e2565b90600052602060002090601f0160209004810192826123b257600085556123f8565b82601f106123cb57805160ff19168380011785556123f8565b828001600101855582156123f8579182015b828111156123f85782518255916020019190600101906123dd565b50612404929150612408565b5090565b5b808211156124045760008155600101612409565b80356001600160a01b03811681146109d157600080fd5b600082601f83011261244557600080fd5b813567ffffffffffffffff81111561245f5761245f612a7a565b612472601f8201601f1916602001612911565b81815284602083860101111561248757600080fd5b816020850160208301376000918101602001919091529392505050565b600060208083850312156124b757600080fd5b825167ffffffffffffffff808211156124cf57600080fd5b818501915085601f8301126124e357600080fd5b8151818111156124f5576124f5612a7a565b8060051b9150612506848301612911565b8181528481019084860184860187018a101561252157600080fd5b600095505b83861015612544578051835260019590950194918601918601612526565b5098975050505050505050565b60006020828403121561256357600080fd5b815161237d81612a90565b6000806040838503121561258157600080fd5b823567ffffffffffffffff81111561259857600080fd5b6125a485828601612434565b9250506125b36020840161241d565b90509250929050565b600080604083850312156125cf57600080fd5b823567ffffffffffffffff8111156125e657600080fd5b6125f285828601612434565b95602094909401359450505050565b60008060006060848603121561261657600080fd5b833567ffffffffffffffff81111561262d57600080fd5b61263986828701612434565b9660208601359650604090950135949350505050565b6000806000806080858703121561266557600080fd5b843567ffffffffffffffff81111561267c57600080fd5b61268887828801612434565b94505060208501359250604085013591506126a56060860161241d565b905092959194509250565b600080600080600060a086880312156126c857600080fd5b853567ffffffffffffffff8111156126df57600080fd5b6126eb88828901612434565b95505060208601359350604086013592506127086060870161241d565b9150608086013561271881612a90565b809150509295509295909350565b60006020828403121561273857600080fd5b5035919050565b60006020828403121561275157600080fd5b5051919050565b60008060006060848603121561276d57600080fd5b8351925060208401519150604084015190509250925092565b600082516127988184602087016129b2565b9190910192915050565b60006101008083528a51808285015261012091506127c68183860160208f016129b2565b602084018b9052604084018a905260608401899052601f01601f191683010190506005861061280557634e487b7160e01b600052602160045260246000fd5b85608083015261282060a08301866001600160a01b03169052565b8360c083015261283460e083018415159052565b9998505050505050505050565b6020808252601c908201527f636f756c64206e6f742066696e642074617820746f2075706461746500000000604082015260600190565b6020808252600e908201526d6e6f207065726d697373696f6e7360901b604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156128f05784516001600160a01b0316835293830193918301916001016128cb565b50506001600160a01b03969096166060850152505050608001529392505050565b604051601f8201601f1916810167ffffffffffffffff8111828210171561293a5761293a612a7a565b604052919050565b6000821982111561295557612955612a38565b500190565b60008261297757634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561299657612996612a38565b500290565b6000828210156129ad576129ad612a38565b500390565b60005b838110156129cd5781810151838201526020016129b5565b838111156129dc576000848401525b50505050565b600181811c908216806129f657607f821691505b60208210811415612a1757634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612a3157612a31612a38565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114612a9e57600080fd5b5056fea2646970667358221220dee1094e34294ea839b72410c4eb0b66574eb8a52d3921e7b270f1fd8dda977064736f6c63430008070033
60806040526006805460ff60a81b1916600160a81b1790553480156200002457600080fd5b506200004473a281151c22a70d6743f5b31bc4e3958ce3681985620006f2565b604080518082019091526007808252664e4555524f4e4960c81b60209092019182526200007491600491620008d2565b5060408051808201909152600a808252694e6575726f6e692e414960b01b6020909201918252620000a891600591620008d2565b506006805460ff191660121790556000620000c26200070b565b905060008190506000816001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200010557600080fd5b505afa1580156200011a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000140919062000986565b90506000826001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200017e57600080fd5b505afa15801562000193573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001b9919062000986565b6040516364e329cb60e11b81526001600160a01b038481166004830152306024830152919091169063c9c6539690604401602060405180830381600087803b1580156200020557600080fd5b505af11580156200021a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000240919062000986565b6001600160a01b03811660009081526009602052604090819020805460ff1916600117905551909150849082908490610514908190620002809062000961565b6001600160a01b03958616815293851660208501529390911660408301526060820152608081019190915260a001604051809103906000f080158015620002cb573d6000803e3d6000fd5b50601580546001600160a01b03929092166001600160a01b031990921682179055600a805460ff60a81b1916600160a81b178155600091825260126020526040909120805460ff1916600117905561012c600c55805460ff60b81b1916600160b81b178155601e6016556006546200034a9160ff919091169062000a1c565b620003589061271062000add565b601755601580546001600160a01b0390811660009081526018602052604090819020805460ff1916600190811790915592549051634693167f60e11b815260a06004820152600760a482015266125b9cda59da1d60ca1b60c482015260be60248201526101c8604482015273c6467b4f00ca55c5548fb7bd872c872b63841eb9606482015260848101939093521690638d262cfe9060e401600060405180830381600087803b1580156200040b57600080fd5b505af115801562000420573d6000803e3d6000fd5b5050601554604051634693167f60e11b815260a06004820152600960a4820152684d61726b6574696e6760b81b60c482015260b960248201526101bc604482015273e53820cadd647d99b1bd98a29af7be87e497cf0f6064820152600160848201526001600160a01b039091169250638d262cfe915060e401600060405180830381600087803b158015620004b457600080fd5b505af1158015620004c9573d6000803e3d6000fd5b5050601554604051634693167f60e11b815260a06004820152600360a4820152622232bb60e91b60c4820152607d602482015261012c60448201527308a3351e0c1eb65c5d80d568adbe97810820d7e36064820152600160848201526001600160a01b039091169250638d262cfe915060e401600060405180830381600087803b1580156200055757600080fd5b505af11580156200056c573d6000803e3d6000fd5b50506015805460ff60a01b1981169091556001600160a01b039081166000908152601460209081526040808320805460ff1990811660019081179092556006805461010090049096168552601a90935292208054909116909117905554620005dc925060ff169050600a62000a1c565b620005eb90620186a062000add565b601b556015546001600160a01b03908116600090815260016020908152604080832093881683529290522060001990556006546200062e9060ff16600a62000a1c565b6200063d906298968062000add565b6002546200064c9190620009b8565b600281905560065461010090046001600160a01b03166000908152602081905260409020546200067d9190620009b8565b600680546001600160a01b03610100918290048116600090815260208190526040808220959095559254600254945192900416927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91620006e091815260200190565b60405180910390a35050505062000b52565b6200070881620007d960201b62001d581760201c565b50565b600046600114806200071d5750466003145b80620007295750466004145b80620007355750466005145b15620007545750737a250d5630b4cf539739df2c5dacb4c659f2488d90565b46603814156200077757507310ed43c718714eb63d5aa57b78b54704e256024e90565b46606114156200079a575073c99f3718db7c90b020cbbbb47ed26b0ba0c6512b90565b60405162461bcd60e51b815260206004820152601060248201526f155b9adb9bdddb8810da185a5b88125160821b604482015260640160405180910390fd5b6001600160a01b0381166000908152601860209081526040909120805460ff191660011790556200070890829062001d8062000815821b17901c565b6001600160a01b0381166000908152601460209081526040909120805460ff191660011790556200070890829062001da862000851821b17901c565b6001600160a01b0381166000908152601260209081526040909120805460ff191660011790556200070890829062001dd06200088d821b17901c565b60068054610100600160a81b0319166101006001600160a01b03938416810291909117918290559004166000908152600760205260409020805460ff19166001179055565b828054620008e09062000aff565b90600052602060002090601f0160209004810192826200090457600085556200094f565b82601f106200091f57805160ff19168380011785556200094f565b828001600101855582156200094f579182015b828111156200094f57825182559160200191906001019062000932565b506200095d9291506200096f565b5090565b612dca8062003c0b83390190565b5b808211156200095d576000815560010162000970565b6000602082840312156200099957600080fd5b81516001600160a01b0381168114620009b157600080fd5b9392505050565b60008219821115620009ce57620009ce62000b3c565b500190565b600181815b8085111562000a14578160001904821115620009f857620009f862000b3c565b8085161562000a0657918102915b93841c9390800290620009d8565b509250929050565b6000620009b160ff84168360008262000a385750600162000ad7565b8162000a475750600062000ad7565b816001811462000a60576002811462000a6b5762000a8b565b600191505062000ad7565b60ff84111562000a7f5762000a7f62000b3c565b50506001821b62000ad7565b5060208310610133831016604e8410600b841016171562000ab0575081810a62000ad7565b62000abc8383620009d3565b806000190482111562000ad35762000ad362000b3c565b0290505b92915050565b600081600019048311821515161562000afa5762000afa62000b3c565b500290565b600181811c9082168062000b1457607f821691505b6020821081141562000b3657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6130a98062000b626000396000f3fe608060405234801561001057600080fd5b50600436106104335760003560e01c80636a092e7911610236578063c20c5caf1161013b578063db38a41d116100c3578063e79d416011610087578063e79d416014610995578063e948474b1461099e578063ede49a19146109c1578063f19fffcb146109d5578063f1f5cd91146109e957600080fd5b8063db38a41d14610918578063dba61c5814610938578063dd62ed3e14610941578063e53be8d11461097a578063e5a829791461098257600080fd5b8063cc1776d31161010a578063cc1776d3146108d8578063d00efb2f146108e0578063d2d7ad83146108e9578063d31acb28146108f2578063d3b0066f1461090557600080fd5b8063c20c5caf14610896578063c2ed286b146108a9578063c4a5abcd146108bc578063c552f4c5146108c557600080fd5b8063870333e0116101be578063989763ef1161018d578063989763ef14610817578063a457c2d71461083a578063a6f9dae11461084d578063a9059cbb14610860578063b0ad3ebf1461087357600080fd5b8063870333e0146107c157806389d53c01146107e45780638da5cb5b146107f757806395d89b411461080f57600080fd5b80637412dbb3116102055780637412dbb31461075b578063790ca4131461077e57806379cc6790146107875780638091f3bf1461079a57806381045345146107ae57600080fd5b80636a092e79146107035780636b8f2f3b146107165780636f8645521461072a57806370a082311461073257600080fd5b8063368274991161033c5780634fbc2775116102c45780635d90bbaf116102935780635d90bbaf146106b95780635d9d7d43146106cc5780635e45da23146106df5780636331bf65146106e85780636508c57e146106f057600080fd5b80634fbc27751461066c57806352c6dbc41461067f5780635543379a14610693578063583dd79d146106a657600080fd5b8063442ef7d21161030b578063442ef7d21461062d57806345541cba146106355780634cf49dd71461063e5780634f7041a5146106515780634f72e2a21461065957600080fd5b806336827499146105e157806339509351146105f4578063407133d21461060757806342966c681461061a57600080fd5b806318551108116103bf5780632b7506271161038e5780632b7506271461055f5780632dcb51991461058257806330bd85c51461058b578063313ce5671461059f5780633164df8b146105be57600080fd5b806318551108146105015780631e19ae771461052657806323b872dd1461053957806328be90381461054c57600080fd5b8063095ea7b311610406578063095ea7b3146104935780630ab9e6a0146104a65780630f3a325f146104b95780631776834a146104dc57806318160ddd146104ef57600080fd5b806301339c2114610438578063064a59d01461044257806306fdde031461046b57806307a1cfbd14610480575b600080fd5b6104406109f1565b005b60065461045690600160a81b900460ff1681565b60405190151581526020015b60405180910390f35b610473610a33565b6040516104629190612e28565b61044061048e366004612d42565b610ac1565b6104566104a1366004612c99565b610b58565b6104406104b4366004612d87565b610c4c565b6104566104c7366004612bd1565b60116020526000908152604090205460ff1681565b6104406104ea366004612d87565b610c80565b6002545b604051908152602001610462565b6015546001600160a01b03165b6040516001600160a01b039091168152602001610462565b610440610534366004612c62565b610cb4565b610456610547366004612c26565b610d0e565b61044061055a366004612c62565b610e39565b61045661056d366004612bd1565b60126020526000908152604090205460ff1681565b6104f3601b5481565b600a5461045690600160c01b900460ff1681565b6006546105ac9060ff1681565b60405160ff9091168152602001610462565b6104566105cc366004612bd1565b60146020526000908152604090205460ff1681565b6104406105ef366004612cc3565b610e93565b610456610602366004612c99565b610ee0565b600a5461050e906001600160a01b031681565b610440610628366004612d87565b610ff4565b610440611056565b6104f3600b5481565b61045661064c366004612bd1565b61112b565b6104f3611172565b610440610667366004612cc3565b6111f4565b61044061067a366004612c62565b611241565b600a5461045690600160b01b900460ff1681565b6104406106a1366004612cc3565b61129b565b6104406106b4366004612cfd565b6112e8565b6104406106c7366004612c62565b611349565b6104406106da366004612c62565b6113a3565b6104f3600d5481565b6104f36113fd565b6104406106fe366004612d42565b61141c565b610456610711366004612bf3565b61147d565b60155461045690600160a01b900460ff1681565b6104f36115b7565b6104f3610740366004612bd1565b6001600160a01b031660009081526020819052604090205490565b610456610769366004612bd1565b60096020526000908152604090205460ff1681565b6104f3600e5481565b610440610795366004612c99565b6115cc565b60065461045690600160b01b900460ff1681565b6104406107bc366004612d87565b6116cb565b6104566107cf366004612bd1565b601a6020526000908152604090205460ff1681565b6104406107f2366004612cc3565b6116ff565b60065461050e9061010090046001600160a01b031681565b6104736117a5565b610456610825366004612bd1565b60186020526000908152604090205460ff1681565b610456610848366004612c99565b6117b2565b61044061085b366004612bd1565b611881565b61045661086e366004612c99565b611927565b610456610881366004612bd1565b60076020526000908152604090205460ff1681565b6104406108a4366004612d87565b6119b6565b6104406108b7366004612c62565b6119ea565b6104f3600c5481565b6104406108d3366004612cc3565b611ac2565b6104f3611b0f565b6104f3600f5481565b6104f360175481565b610440610900366004612db9565b611b54565b610440610913366004612bd1565b611b8e565b6104f3610926366004612bd1565b60136020526000908152604090205481565b6104f360165481565b6104f361094f366004612bf3565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610440611c54565b610440610990366004612c62565b611cc6565b6104f360105481565b6104566109ac366004612bd1565b60086020526000908152604090205460ff1681565b600a5461045690600160a81b900460ff1681565b600a5461045690600160b81b900460ff1681565b6104f3611d20565b60065461010090046001600160a01b03163314610a295760405162461bcd60e51b8152600401610a2090612eeb565b60405180910390fd5b610a31611e15565b565b60058054610a4090612fa3565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6c90612fa3565b8015610ab95780601f10610a8e57610100808354040283529160200191610ab9565b820191906000526020600020905b815481529060010190602001808311610a9c57829003601f168201915b505050505081565b60065461010090046001600160a01b03163314610af05760405162461bcd60e51b8152600401610a2090612eeb565b6015546040516307a1cfbd60e01b81526001600160a01b03909116906307a1cfbd90610b229085908590600401612e65565b600060405180830381600087803b158015610b3c57600080fd5b505af1158015610b50573d6000803e3d6000fd5b505050505050565b6006546000903390600160a81b900460ff168015610b7f5750600654600160b01b900460ff165b80610b9c57506006546001600160a01b0382811661010090920416145b80610bb657503360009081526007602052604090205460ff165b610bd25760405162461bcd60e51b8152600401610a2090612ebe565b6001600160a01b038416610bf85760405162461bcd60e51b8152600401610a2090612e87565b3360008181526001602090815260408083206001600160a01b038916808552908352928190208790555186815291929160008051602061305483398151915291015b60405180910390a35060019392505050565b60065461010090046001600160a01b03163314610c7b5760405162461bcd60e51b8152600401610a2090612eeb565b601b55565b60065461010090046001600160a01b03163314610caf5760405162461bcd60e51b8152600401610a2090612eeb565b600d55565b60065461010090046001600160a01b03163314610ce35760405162461bcd60e51b8152600401610a2090612eeb565b6001600160a01b03919091166000908152601460205260409020805460ff1916911515919091179055565b6006546000908490600160a81b900460ff168015610d355750600654600160b01b900460ff165b80610d5257506006546001600160a01b0382811661010090920416145b80610d6c57503360009081526007602052604090205460ff165b610d885760405162461bcd60e51b8152600401610a2090612ebe565b6001600160a01b0385166000908152600160209081526040808320338452909152902054610db7908490612f8c565b6001600160a01b0386166000908152600160209081526040808320338452909152902055610de6858585611e56565b6001600160a01b03851660008181526001602090815260408083203380855290835292819020549051908152919291600080516020613054833981519152910160405180910390a3506001949350505050565b60065461010090046001600160a01b03163314610e685760405162461bcd60e51b8152600401610a2090612eeb565b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b03163314610ec25760405162461bcd60e51b8152600401610a2090612eeb565b600a8054911515600160b81b0260ff60b81b19909216919091179055565b6006546000903390600160a81b900460ff168015610f075750600654600160b01b900460ff165b80610f2457506006546001600160a01b0382811661010090920416145b80610f3e57503360009081526007602052604090205460ff165b610f5a5760405162461bcd60e51b8152600401610a2090612ebe565b6001600160a01b038416610f805760405162461bcd60e51b8152600401610a2090612e87565b3360009081526001602090815260408083206001600160a01b0388168452909152902054610faf908490612f33565b3360008181526001602090815260408083206001600160a01b038a16808552908352928190208590555193845290926000805160206130548339815191529101610c3a565b3360009081526014602052604090205460ff166110495760405162461bcd60e51b81526020600482015260136024820152726e6f206275726e207065726d697373696f6e7360681b6044820152606401610a20565b611053338261206f565b50565b600654600160b01b900460ff166110c15760405162461bcd60e51b815260206004820152602960248201527f63616e206f6e6c792062652063616c6c6564206f6e636520746f6b656e206973604482015268081b185d5b98da195960ba1b6064820152608401610a20565b601560009054906101000a90046001600160a01b03166001600160a01b031663e4fc6b6d6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561111157600080fd5b505af1158015611125573d6000803e3d6000fd5b50505050565b6001600160a01b0381166000908152601a602052604081205460ff168061116c5750601b546001600160a01b03831660009081526020819052604090205410155b92915050565b60155460408051631296b91d60e11b815290516000926001600160a01b03169163252d723a916004808301926020929190829003018186803b1580156111b757600080fd5b505afa1580156111cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ef9190612da0565b905090565b60065461010090046001600160a01b031633146112235760405162461bcd60e51b8152600401610a2090612eeb565b60158054911515600160a01b0260ff60a01b19909216919091179055565b60065461010090046001600160a01b031633146112705760405162461bcd60e51b8152600401610a2090612eeb565b6001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b031633146112ca5760405162461bcd60e51b8152600401610a2090612eeb565b600a8054911515600160b01b0260ff60b01b19909216919091179055565b60065461010090046001600160a01b031633146113175760405162461bcd60e51b8152600401610a2090612eeb565b60155460405163583dd79d60e01b81526001600160a01b039091169063583dd79d90610b229085908590600401612e3b565b60065461010090046001600160a01b031633146113785760405162461bcd60e51b8152600401610a2090612eeb565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b031633146113d25760405162461bcd60e51b8152600401610a2090612eeb565b6001600160a01b03919091166000908152601260205260409020805460ff1916911515919091179055565b6000612710600c546002546114129190612f6d565b6111ef9190612f4b565b60065461010090046001600160a01b0316331461144b5760405162461bcd60e51b8152600401610a2090612eeb565b60155460405163328462bf60e11b81526001600160a01b0390911690636508c57e90610b229085908590600401612e65565b60065460009061010090046001600160a01b031633146114af5760405162461bcd60e51b8152600401610a2090612eeb565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a082319060240160206040518083038186803b1580156114f157600080fd5b505afa158015611505573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115299190612da0565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb90604401602060405180830381600087803b15801561157757600080fd5b505af115801561158b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115af9190612ce0565b949350505050565b6000612710600b546002546114129190612f6d565b3360009081526014602052604090205460ff166116215760405162461bcd60e51b81526020600482015260136024820152726e6f206275726e207065726d697373696f6e7360681b6044820152606401610a20565b6001600160a01b0382166000908152600160209081526040808320338452909152902054611650908290612f8c565b6001600160a01b038316600090815260016020908152604080832033845290915290205561167e828261206f565b6001600160a01b0382166000818152600160209081526040808320338085529083529281902054905190815291929160008051602061305483398151915291015b60405180910390a35050565b60065461010090046001600160a01b031633146116fa5760405162461bcd60e51b8152600401610a2090612eeb565b600c55565b60065461010090046001600160a01b0316331461172e5760405162461bcd60e51b8152600401610a2090612eeb565b600a54600160a01b900460ff166117875760405162461bcd60e51b815260206004820152601f60248201527f70696e6b20616e746920626f74206973206e6f7420636f6e66696775726564006044820152606401610a20565b600a8054911515600160c01b0260ff60c01b19909216919091179055565b60048054610a4090612fa3565b6006546000903390600160a81b900460ff1680156117d95750600654600160b01b900460ff165b806117f657506006546001600160a01b0382811661010090920416145b8061181057503360009081526007602052604090205460ff165b61182c5760405162461bcd60e51b8152600401610a2090612ebe565b6001600160a01b0384166118525760405162461bcd60e51b8152600401610a2090612e87565b3360009081526001602090815260408083206001600160a01b0388168452909152902054610faf908490612f8c565b60065461010090046001600160a01b031633146118b05760405162461bcd60e51b8152600401610a2090612eeb565b6001600160a01b0381166118ff5760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b6044820152606401610a20565b600680546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6006546000903390600160a81b900460ff16801561194e5750600654600160b01b900460ff165b8061196b57506006546001600160a01b0382811661010090920416145b8061198557503360009081526007602052604090205460ff165b6119a15760405162461bcd60e51b8152600401610a2090612ebe565b6119ac338585611e56565b5060019392505050565b60065461010090046001600160a01b031633146119e55760405162461bcd60e51b8152600401610a2090612eeb565b600b55565b60065461010090046001600160a01b03163314611a195760405162461bcd60e51b8152600401610a2090612eeb565b6001600160a01b03821660009081526009602052604090205460ff161580611a3f575080155b611a975760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74206578636c75646520616e2065786368616e67652066726f6d206044820152620e8c2f60eb1b6064820152608401610a20565b6001600160a01b03919091166000908152601860205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b03163314611af15760405162461bcd60e51b8152600401610a2090612eeb565b600a8054911515600160a81b0260ff60a81b19909216919091179055565b6015546040805163585e42ef60e11b815290516000926001600160a01b03169163b0bc85de916004808301926020929190829003018186803b1580156111b757600080fd5b60065461010090046001600160a01b03163314611b835760405162461bcd60e51b8152600401610a2090612eeb565b601791909155601655565b60065461010090046001600160a01b03163314611bbd5760405162461bcd60e51b8152600401610a2090612eeb565b600a80546001600160a01b0319166001600160a01b038381169182179092556006546040516318e02bd960e01b81526101009091049092166004830152906318e02bd990602401600060405180830381600087803b158015611c1e57600080fd5b505af1158015611c32573d6000803e3d6000fd5b5050600a805464ff000000ff60a01b191664010000000160a01b179055505050565b60065461010090046001600160a01b03163314611c835760405162461bcd60e51b8152600401610a2090612eeb565b600654604051479161010090046001600160a01b0316906108fc8315029083906000818181858888f19350505050158015611cc2573d6000803e3d6000fd5b5050565b60065461010090046001600160a01b03163314611cf55760405162461bcd60e51b8152600401610a2090612eeb565b6001600160a01b03919091166000908152601a60205260409020805460ff1916911515919091179055565b600654600090600160b01b900460ff1615611d52576003600f5443611d459190612f8c565b1015611d5257506126ac90565b50600090565b6001600160a01b0381166000908152601860205260409020805460ff19166001179055611053815b6001600160a01b0381166000908152601460205260409020805460ff19166001179055611053815b6001600160a01b0381166000908152601260205260409020805460ff19166001179055611053815b60068054610100600160a81b0319166101006001600160a01b03938416810291909117918290559004166000908152600760205260409020805460ff19166001179055565b60065461010090046001600160a01b03163314611e445760405162461bcd60e51b8152600401610a2090612eeb565b611e4c6120f1565b42600e5543600f55565b6001600160a01b038216611ea55760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b6044820152606401610a20565b6001600160a01b03831660009081526008602052604090205460ff1615611f0e5760405162461bcd60e51b815260206004820152601e60248201527f61646472657373206973206e6f7420616c6c6f77656420746f2073656c6c00006044820152606401610a20565b60035460ff1615611fb4576001600160a01b038316600090815260208190526040902054611f3d908290612f8c565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611f6d908290612f33565b6001600160a01b03838116600081815260208181526040918290209490945551848152909291861691600080516020613034833981519152910160405180910390a3505050565b611fbf838383612135565b6000611fcc848484612140565b6001600160a01b038516600090815260208190526040902054909150611ff3908390612f8c565b6001600160a01b038086166000908152602081905260408082209390935590851681522054612023908290612f33565b6001600160a01b03848116600081815260208181526040918290209490945551848152909291871691600080516020613034833981519152910160405180910390a3611125565b505050565b6001600160a01b03821661208257600080fd5b806002546120909190612f8c565b6002556001600160a01b0382166000908152602081905260409020546120b7908290612f8c565b6001600160a01b038316600081815260208181526040808320949094559251848152909260008051602061303483398151915291016116bf565b60065461010090046001600160a01b031633146121205760405162461bcd60e51b8152600401610a2090612eeb565b6006805460ff60b01b1916600160b01b179055565b61206a83838361214d565b60006115af848484612369565b60155460408051630dd8715760e01b815290516000926001600160a01b031691630dd87157916004808301926020929190829003018186803b15801561219257600080fd5b505afa1580156121a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ca9190612da0565b6121d49042612f8c565b600654909150600160b01b900460ff1680156121f95750601554600160a01b900460ff165b801561221d57506001600160a01b03831660009081526009602052604090205460ff165b8015612237575042601954603c6122349190612f33565b11155b801561224557506016548110155b801561226d57506017546015546001600160a01b031660009081526020819052604090205410155b80156122fc5750601560009054906101000a90046001600160a01b03166001600160a01b031663d83067866040518163ffffffff1660e01b815260040160206040518083038186803b1580156122c257600080fd5b505afa1580156122d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122fa9190612ce0565b155b1561235e57426019556015546040805163e4fc6b6d60e01b815290516001600160a01b039092169163e4fc6b6d9160048082019260009290919082900301818387803b15801561234b57600080fd5b505af192505050801561235c575060015b505b6111258484846125aa565b6001600160a01b038316600090815260186020526040812054829060ff161580156123ad57506001600160a01b03841660009081526018602052604090205460ff16155b80156123c25750600654600160b01b900460ff165b1561250f576001600160a01b03851660009081526009602052604090205460ff161561246d5760155460405163db017dc760e01b8152600481018590526001600160a01b039091169063db017dc790602401602060405180830381600087803b15801561242e57600080fd5b505af1158015612442573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124669190612da0565b905061250f565b6001600160a01b03841660009081526009602052604090205460ff161561250f57601554604051634fa26fd560e01b8152600481018590526001600160a01b0390911690634fa26fd590602401602060405180830381600087803b1580156124d457600080fd5b505af11580156124e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250c9190612da0565b90505b600061251b8285612f8c565b90508015612595576015546001600160a01b0316600090815260208190526040902054612549908290612f33565b601580546001600160a01b039081166000908152602081815260409182902094909455915491518481529181169290891691600080516020613034833981519152910160405180910390a35b6125a08686846129d3565b9695505050505050565b600a54600160a81b900460ff1615806125d357503360009081526011602052604090205460ff16155b6126115760405162461bcd60e51b815260206004820152600f60248201526e1cdb9a5c195c881c995a9958dd1959608a1b6044820152606401610a20565b600654600160b01b900460ff16801561263d57506006546001600160a01b038481166101009092041614155b801561266257506001600160a01b03831660009081526012602052604090205460ff16155b801561268757506001600160a01b03821660009081526012602052604090205460ff16155b1561206a57600d54156126e657600d545a11156126e65760405162461bcd60e51b815260206004820152601e60248201527f74686973206973206f76657220746865206d617820676173206c696d697400006044820152606401610a20565b6000600c5411801561271157506001600160a01b03821660009081526009602052604090205460ff16155b156127905761271e6113fd565b6001600160a01b038316600090815260208190526040902054612742908390612f33565b11156127905760405162461bcd60e51b815260206004820181905260248201527f74686973206973206f76657220746865206d617820686f6c6420616d6f756e746044820152606401610a20565b6000600b541180156127ba57506001600160a01b03821660009081526009602052604090205460ff165b15612816576127c76115b7565b8111156128165760405162461bcd60e51b815260206004820181905260248201527f74686973206973206f76657220746865206d61782073656c6c20616d6f756e746044820152606401610a20565b600a54600160b01b900460ff161561294e576001600160a01b03821660009081526013602052604090205443141561287f576001600160a01b0382166000908152601160205260408120805460ff19166001179055601080549161287983612fde565b91905055505b6001600160a01b0383166000908152601360205260409020544314156128d6576001600160a01b0383166000908152601160205260408120805460ff1916600117905560108054916128d083612fde565b91905055505b6001600160a01b03821660009081526009602052604090205460ff16612912576001600160a01b03821660009081526013602052604090204390555b6001600160a01b03831660009081526009602052604090205460ff1661294e576001600160a01b03831660009081526013602052604090204390555b600a54600160c01b900460ff161561206a57600a5460405163090ec10b60e31b81526001600160a01b03858116600483015284811660248301526044820184905290911690634876085890606401600060405180830381600087803b1580156129b657600080fd5b505af11580156129ca573d6000803e3d6000fd5b50505050505050565b6006546000908290600160b01b900460ff1680156129fa5750600a54600160b81b900460ff165b15612aa9576006546001600160a01b038681166101009092041614801590612a2957506000612a27611d20565b115b8015612a4e57506001600160a01b03851660009081526012602052604090205460ff16155b8015612a7357506001600160a01b03841660009081526012602052604090205460ff16155b15612aa9576000612710612a85611d20565b612a8f9086612f6d565b612a999190612f4b565b9050612aa58183612f8c565b9150505b612ab4858583612abd565b95945050505050565b6000826001600160a01b0316846001600160a01b03161415612b215760405162461bcd60e51b815260206004820152601f60248201527f796f752063616e6e6f74207472616e7366657220746f20796f757273656c66006044820152606401610a20565b5092915050565b80356001600160a01b0381168114612b3f57600080fd5b919050565b600082601f830112612b5557600080fd5b813567ffffffffffffffff80821115612b7057612b7061300f565b604051601f8301601f19908116603f01168101908282118183101715612b9857612b9861300f565b81604052838152866020858801011115612bb157600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060208284031215612be357600080fd5b612bec82612b28565b9392505050565b60008060408385031215612c0657600080fd5b612c0f83612b28565b9150612c1d60208401612b28565b90509250929050565b600080600060608486031215612c3b57600080fd5b612c4484612b28565b9250612c5260208501612b28565b9150604084013590509250925092565b60008060408385031215612c7557600080fd5b612c7e83612b28565b91506020830135612c8e81613025565b809150509250929050565b60008060408385031215612cac57600080fd5b612cb583612b28565b946020939093013593505050565b600060208284031215612cd557600080fd5b8135612bec81613025565b600060208284031215612cf257600080fd5b8151612bec81613025565b60008060408385031215612d1057600080fd5b823567ffffffffffffffff811115612d2757600080fd5b612d3385828601612b44565b925050612c1d60208401612b28565b60008060408385031215612d5557600080fd5b823567ffffffffffffffff811115612d6c57600080fd5b612d7885828601612b44565b95602094909401359450505050565b600060208284031215612d9957600080fd5b5035919050565b600060208284031215612db257600080fd5b5051919050565b60008060408385031215612dcc57600080fd5b50508035926020909101359150565b6000815180845260005b81811015612e0157602081850181015186830182015201612de5565b81811115612e13576000602083870101525b50601f01601f19169290920160200192915050565b602081526000612bec6020830184612ddb565b604081526000612e4e6040830185612ddb565b905060018060a01b03831660208301529392505050565b604081526000612e786040830185612ddb565b90508260208301529392505050565b6020808252601c908201527f63616e6e6f7420617070726f7665207468652030206164647265737300000000604082015260600190565b6020808252601390820152721d1c98591a5b99c81b9bdd08195b98589b1959606a1b604082015260600190565b60208082526028908201527f63616e206f6e6c792062652063616c6c65642062792074686520636f6e74726160408201526731ba1037bbb732b960c11b606082015260800190565b60008219821115612f4657612f46612ff9565b500190565b600082612f6857634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612f8757612f87612ff9565b500290565b600082821015612f9e57612f9e612ff9565b500390565b600181811c90821680612fb757607f821691505b60208210811415612fd857634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612ff257612ff2612ff9565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b801515811461105357600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a26469706673582212206204d32ac11c136025a2fcacb1d451b5a5ff53ffc993127dc4f526f605016e8664736f6c634300080700336101406040523480156200001257600080fd5b5060405162002dca38038062002dca8339810160408190526200003591620001b5565b6001600160a01b038316620000915760405162461bcd60e51b815260206004820152601f60248201527f706169726564546f6b656e2063616e6e6f74206265203020616464726573730060448201526064015b60405180910390fd5b6001600160a01b038416620000e95760405162461bcd60e51b815260206004820152601860248201527f706169722063616e6e6f74206265203020616464726573730000000000000000604482015260640162000088565b6001600160a01b038516620001415760405162461bcd60e51b815260206004820152601a60248201527f726f757465722063616e6e6f7420626520302061646472657373000000000000604482015260640162000088565b33606090811b60c0526001600160601b031993811b841660e052600080546001600160a01b0388166001600160a01b0319909116179055610100929092526101205291821b811660805291901b1660a05262000212565b80516001600160a01b0381168114620001b057600080fd5b919050565b600080600080600060a08688031215620001ce57600080fd5b620001d98662000198565b9450620001e96020870162000198565b9350620001f96040870162000198565b6060870151608090970151959894975095949392505050565b60805160601c60a05160601c60c05160601c60e05160601c6101005161012051612ad7620002f36000396000818161032a01526105930152600081816102ad0152610bdb0152600061104f015260008181610424015281816106180152818161079601528181610836015281816108ba015281816109e101528181610b1501528181610c0d01528181610c9101528181610e1f01528181610f3c01528181610ffb0152818161109b01528181611a0601528181611ca401528181611df101528181611fbf0152612136015260006101e1015260006103d70152612ad76000f3fe6080604052600436106101235760003560e01c8063a411209a116100a0578063db017dc711610064578063db017dc71461037d578063e4fc6b6d1461039d578063ed4ce99e146103a5578063ee16c160146103c5578063fb5a780c146103f957600080fd5b8063a411209a1461029b578063b0bc85de146102cf578063c5be2bc7146102e4578063c8e956ab14610318578063d83067861461034c57600080fd5b80633268cc56116100e75780633268cc56146101cf5780634fa26fd51461021b578063583dd79d1461023b5780636508c57e1461025b5780638d262cfe1461027b57600080fd5b806307a1cfbd1461012f5780630dd8715714610151578063135b4fc01461017a578063252d723a1461019a5780632b1fb89e146101af57600080fd5b3661012a57005b600080fd5b34801561013b57600080fd5b5061014f61014a3660046125bc565b610419565b005b34801561015d57600080fd5b5061016760015481565b6040519081526020015b60405180910390f35b34801561018657600080fd5b5061014f6101953660046126b0565b61060d565b3480156101a657600080fd5b50610167610789565b3480156101bb57600080fd5b5061014f6101ca3660046126b0565b61082b565b3480156101db57600080fd5b506102037f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610171565b34801561022757600080fd5b50610167610236366004612726565b6108ad565b34801561024757600080fd5b5061014f61025636600461256e565b6109d6565b34801561026757600080fd5b5061014f6102763660046125bc565b610b0a565b34801561028757600080fd5b5061014f6102963660046126b0565b610c02565b3480156102a757600080fd5b506101677f000000000000000000000000000000000000000000000000000000000000000081565b3480156102db57600080fd5b50610167610c84565b3480156102f057600080fd5b506103046102ff366004612726565b610d20565b6040516101719897969594939291906127a2565b34801561032457600080fd5b506101677f000000000000000000000000000000000000000000000000000000000000000081565b34801561035857600080fd5b5060005461036d90600160a01b900460ff1681565b6040519015158152602001610171565b34801561038957600080fd5b50610167610398366004612726565b610e12565b61014f610f31565b3480156103b157600080fd5b5061014f6103c036600461264f565b611fb4565b3480156103d157600080fd5b506102037f000000000000000000000000000000000000000000000000000000000000000081565b34801561040557600080fd5b5061014f610414366004612601565b61212b565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461046a5760405162461bcd60e51b815260040161046190612878565b60405180910390fd5b6000805b6002548110156105735761052e6002828154811061048e5761048e612a64565b906000526020600020906007020160000180546104aa906129e2565b80601f01602080910402602001604051908101604052809291908181526020018280546104d6906129e2565b80156105235780601f106104f857610100808354040283529160200191610523565b820191906000526020600020905b81548152906001019060200180831161050657829003601f168201915b505050505085612294565b1561056157826002828154811061054757610547612a64565b906000526020600020906007020160010181905550600191505b8061056b81612a1d565b91505061046e565b50806105915760405162461bcd60e51b815260040161046190612841565b7f00000000000000000000000000000000000000000000000000000000000000006105ba610789565b11156106085760405162461bcd60e51b815260206004820152601b60248201527f7461782063616e6e6f74206265207365742074686973206869676800000000006044820152606401610461565b505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106555760405162461bcd60e51b815260040161046190612878565b6002604051806101000160405280878152602001868152602001858152602001600081526020016003600481111561068f5761068f612a4e565b81526001600160a01b038516602080830191909152600060408301819052851515606090930192909252835460018101855593825290819020825180519394600702909101926106e29284920190612384565b5060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff0219169083600481111561072b5761072b612a4e565b021790555060a0820151600482018054610100600160a81b0319166101006001600160a01b039093169290920291909117905560c0820151600582015560e0909101516006909101805460ff19169115159190911790555050505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107d35760405162461bcd60e51b815260040161046190612878565b6000805b60025481101561082557600281815481106107f4576107f4612a64565b906000526020600020906007020160010154826108119190612942565b91508061081d81612a1d565b9150506107d7565b50905090565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108735760405162461bcd60e51b815260040161046190612878565b6002604051806101000160405280878152602001868152602001858152602001600081526020016001600481111561068f5761068f612a4e565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108f75760405162461bcd60e51b815260040161046190612878565b60005b6002548110156109cc5760006002828154811061091957610919612a64565b90600052602060002090600702016002015411156109ba5760006127106002838154811061094957610949612a64565b90600052602060002090600702016002015485610966919061297c565b610970919061295a565b9050806002838154811061098657610986612a64565b906000526020600020906007020160030160008282546109a69190612942565b909155506109b69050818561299b565b9350505b806109c481612a1d565b9150506108fa565b508190505b919050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a1e5760405162461bcd60e51b815260040161046190612878565b6000805b600254811015610aec57600060028281548110610a4157610a41612a64565b60009182526020909120600460079092020181015460ff1690811115610a6957610a69612a4e565b148015610a875750610a876002828154811061048e5761048e612a64565b15610ada578260028281548110610aa057610aa0612a64565b906000526020600020906007020160040160016101000a8154816001600160a01b0302191690836001600160a01b03160217905550600191505b80610ae481612a1d565b915050610a22565b50806106085760405162461bcd60e51b815260040161046190612841565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b525760405162461bcd60e51b815260040161046190612878565b6000805b600254811015610bbb57610b766002828154811061048e5761048e612a64565b15610ba9578260028281548110610b8f57610b8f612a64565b906000526020600020906007020160020181905550600191505b80610bb381612a1d565b915050610b56565b5080610bd95760405162461bcd60e51b815260040161046190612841565b7f00000000000000000000000000000000000000000000000000000000000000006105ba610c84565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c4a5760405162461bcd60e51b815260040161046190612878565b6002604051806101000160405280878152602001868152602001858152602001600081526020016000600481111561068f5761068f612a4e565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610cce5760405162461bcd60e51b815260040161046190612878565b6000805b6002548110156108255760028181548110610cef57610cef612a64565b90600052602060002090600702016002015482610d0c9190612942565b915080610d1881612a1d565b915050610cd2565b60028181548110610d3057600080fd5b9060005260206000209060070201600091509050806000018054610d53906129e2565b80601f0160208091040260200160405190810160405280929190818152602001828054610d7f906129e2565b8015610dcc5780601f10610da157610100808354040283529160200191610dcc565b820191906000526020600020905b815481529060010190602001808311610daf57829003601f168201915b505050506001830154600284015460038501546004860154600587015460069097015495969395929450909260ff808316936101009093046001600160a01b0316921688565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e5c5760405162461bcd60e51b815260040161046190612878565b60005b6002548110156109cc57600060028281548110610e7e57610e7e612a64565b9060005260206000209060070201600101541115610f1f57600061271060028381548110610eae57610eae612a64565b90600052602060002090600702016001015485610ecb919061297c565b610ed5919061295a565b90508060028381548110610eeb57610eeb612a64565b90600052602060002090600702016003016000828254610f0b9190612942565b90915550610f1b9050818561299b565b9350505b80610f2981612a1d565b915050610e5f565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f795760405162461bcd60e51b815260040161046190612878565b600054600160a01b900460ff1615610fc65760405162461bcd60e51b815260206004820152601060248201526f616c7265616479207377617070696e6760801b6044820152606401610461565b6000805460ff60a01b1916600160a01b17815560408051600280825260608201835290916020830190803683370190505090507f00000000000000000000000000000000000000000000000000000000000000008160008151811061102d5761102d612a64565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061108157611081612a64565b6001600160a01b03909216602092830291909101909101527f00000000000000000000000000000000000000000000000000000000000000006000805b6002548110156111f45760028082815481106110dc576110dc612a64565b60009182526020909120600460079092020181015460ff169081111561110457611104612a4e565b1415611180576000600280838154811061112057611120612a64565b90600052602060002090600702016003015461113c919061295a565b9050806002838154811061115257611152612a64565b90600052602060002090600702016003015461116e919061299b565b6111789084612942565b9250506111e2565b6002818154811061119357611193612a64565b600091825260209091206006600790920201015460ff16156111e257600281815481106111c2576111c2612a64565b906000526020600020906007020160030154826111df9190612942565b91505b806111ec81612a1d565b9150506110be565b506111ff82826122ee565b90508061120c83836122ee565b1461129c577fde3142f93c040ab4be0d03a16ac06c502816c1205865dd41d9848727102570d160405161128c9060208082526033908201527f496e73756666696369656e7420746f6b656e7320746f20737761702e20506c6560408201527261736520616464206d6f726520746f6b656e7360681b606082015260800190565b60405180910390a1505050611fa5565b600080546001600160a01b03166318cbafe5838387306112be4261012c612942565b6040518663ffffffff1660e01b81526004016112de9594939291906128a0565b600060405180830381600087803b1580156112f857600080fd5b505af115801561130c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261133491908101906124a4565b905060004790508160008151811061134e5761134e612a64565b60200260200101518314158061137e57508160018151811061137257611372612a64565b60200260200101518114155b156113f9577fde3142f93c040ab4be0d03a16ac06c502816c1205865dd41d9848727102570d16040516113f09060208082526025908201527f556e657870656374656420616d6f756e74732072657475726e65642066726f6d604082015264020737761760dc1b606082015260800190565b60405180910390a15b8060005b60025481101561163f576002818154811061141a5761141a612a64565b600091825260209091206006600790920201015460ff16806114755750600280828154811061144b5761144b612a64565b60009182526020909120600460079092020181015460ff169081111561147357611473612a4e565b145b1561162d576002546114899060019061299b565b8114156114be5781600282815481106114a4576114a4612a64565b90600052602060002090600702016005018190555061162d565b60028082815481106114d2576114d2612a64565b60009182526020909120600460079092020181015460ff16908111156114fa576114fa612a4e565b14156115b8576000600280838154811061151657611516612a64565b906000526020600020906007020160030154611532919061295a565b9050600086826002858154811061154b5761154b612a64565b906000526020600020906007020160030154611567919061299b565b611571908761297c565b61157b919061295a565b9050806002848154811061159157611591612a64565b60009182526020909120600560079092020101556115af818561299b565b9350505061162d565b600085600283815481106115ce576115ce612a64565b906000526020600020906007020160030154856115eb919061297c565b6115f5919061295a565b9050806002838154811061160b5761160b612a64565b6000918252602090912060056007909202010155611629818461299b565b9250505b8061163781612a1d565b9150506113fd565b5060005b600254811015611f605760006002828154811061166257611662612a64565b60009182526020909120600460079092020181015460ff169081111561168a5761168a612a4e565b141561184c57600281815481106116a3576116a3612a64565b600091825260209091206006600790920201015460ff161561175957600281815481106116d2576116d2612a64565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166001600160a01b03166108fc6002838154811061171657611716612a64565b9060005260206000209060070201600501549081150290604051600060405180830381858888f19350505050158015611753573d6000803e3d6000fd5b50611efb565b856001600160a01b031663a9059cbb6002838154811061177b5761177b612a64565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166117ce89600286815481106117b7576117b7612a64565b9060005260206000209060070201600301546122ee565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561181457600080fd5b505af1158015611828573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117539190612551565b60036002828154811061186157611861612a64565b60009182526020909120600460079092020181015460ff169081111561188957611889612a4e565b1415611aaa57600281815481106118a2576118a2612a64565b600091825260209091206006600790920201015460ff16156118d157600281815481106116d2576116d2612a64565b856001600160a01b031663095ea7b3600283815481106118f3576118f3612a64565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166002848154811061192b5761192b612a64565b60009182526020909120600360079092020101546040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561198557600080fd5b505af1158015611999573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119bd9190612551565b50600281815481106119d1576119d1612a64565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166001600160a01b0316634ec109f47f000000000000000000000000000000000000000000000000000000000000000030611a3d8a600287815481106117b7576117b7612a64565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064015b600060405180830381600087803b158015611a8d57600080fd5b505af1158015611aa1573d6000803e3d6000fd5b50505050611efb565b600160028281548110611abf57611abf612a64565b60009182526020909120600460079092020181015460ff1690811115611ae757611ae7612a4e565b1415611c5f5760028181548110611b0057611b00612a64565b600091825260209091206006600790920201015460ff1615611bd05760028181548110611b2f57611b2f612a64565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166001600160a01b031663db6b524660028381548110611b7557611b75612a64565b9060005260206000209060070201600501546040518263ffffffff1660e01b81526004016000604051808303818588803b158015611bb257600080fd5b505af1158015611bc6573d6000803e3d6000fd5b5050505050611efb565b60028181548110611be357611be3612a64565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166001600160a01b031663338b5dea30611c2e89600286815481106117b7576117b7612a64565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401611a73565b600460028281548110611c7457611c74612a64565b60009182526020909120600460079092020181015460ff1690811115611c9c57611c9c612a4e565b1415611d06577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166342966c68611ce888600285815481106117b7576117b7612a64565b6040518263ffffffff1660e01b8152600401611a7391815260200190565b6002808281548110611d1a57611d1a612a64565b60009182526020909120600460079092020181015460ff1690811115611d4257611d42612a4e565b1415611efb57600060028281548110611d5d57611d5d612a64565b9060005260206000209060070201600501541115611efb576000611db0876002808581548110611d8f57611d8f612a64565b906000526020600020906007020160030154611dab919061295a565b6122ee565b600054600280549293506001600160a01b039091169163f305d719919085908110611ddd57611ddd612a64565b9060005260206000209060070201600501547f00000000000000000000000000000000000000000000000000000000000000008460008060028981548110611e2757611e27612a64565b600091825260209091206007909102016004015461010090046001600160a01b0316611e554261012c612942565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c4016060604051808303818588803b158015611ebd57600080fd5b505af1158015611ed1573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611ef69190612758565b505050505b600060028281548110611f1057611f10612a64565b906000526020600020906007020160030181905550600060028281548110611f3a57611f3a612a64565b600091825260209091206005600790920201015580611f5881612a1d565b915050611643565b5060408051858152602081018490527f5e20c9aee521e656eed033c4ae35378c79c584706f5ce7f410ab3fba389607a1910160405180910390a1505042600155505050505b6000805460ff60a01b19169055565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611ffc5760405162461bcd60e51b815260040161046190612878565b6002604051806101000160405280868152602001858152602001848152602001600081526020016002600481111561203657612036612a4e565b81526001600160a01b0384166020808301919091526000604083018190526060909201829052835460018101855593825290819020825180519394600702909101926120859284920190612384565b5060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff021916908360048111156120ce576120ce612a4e565b021790555060a0820151600482018054610100600160a81b0319166101006001600160a01b039093169290920291909117905560c0820151600582015560e0909101516006909101805460ff191691151591909117905550505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146121735760405162461bcd60e51b815260040161046190612878565b6002604051806101000160405280858152602001848152602001838152602001600081526020016004808111156121ac576121ac612a4e565b8152600060208083018290526040830182905260609092018190528354600181018555938152819020825180519394600702909101926121ef9284920190612384565b5060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff0219169083600481111561223857612238612a4e565b021790555060a0820151600482018054610100600160a81b0319166101006001600160a01b039093169290920291909117905560c0820151600582015560e0909101516006909101805460ff1916911515919091179055505050565b6000816040516020016122a79190612786565b60405160208183030381529060405280519060200120836040516020016122ce9190612786565b604051602081830303815290604052805190602001201490505b92915050565b6040516370a0823160e01b815230600482015260009081906001600160a01b038516906370a082319060240160206040518083038186803b15801561233257600080fd5b505afa158015612346573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061236a919061273f565b90508281111561237d57829150506122e8565b9392505050565b828054612390906129e2565b90600052602060002090601f0160209004810192826123b257600085556123f8565b82601f106123cb57805160ff19168380011785556123f8565b828001600101855582156123f8579182015b828111156123f85782518255916020019190600101906123dd565b50612404929150612408565b5090565b5b808211156124045760008155600101612409565b80356001600160a01b03811681146109d157600080fd5b600082601f83011261244557600080fd5b813567ffffffffffffffff81111561245f5761245f612a7a565b612472601f8201601f1916602001612911565b81815284602083860101111561248757600080fd5b816020850160208301376000918101602001919091529392505050565b600060208083850312156124b757600080fd5b825167ffffffffffffffff808211156124cf57600080fd5b818501915085601f8301126124e357600080fd5b8151818111156124f5576124f5612a7a565b8060051b9150612506848301612911565b8181528481019084860184860187018a101561252157600080fd5b600095505b83861015612544578051835260019590950194918601918601612526565b5098975050505050505050565b60006020828403121561256357600080fd5b815161237d81612a90565b6000806040838503121561258157600080fd5b823567ffffffffffffffff81111561259857600080fd5b6125a485828601612434565b9250506125b36020840161241d565b90509250929050565b600080604083850312156125cf57600080fd5b823567ffffffffffffffff8111156125e657600080fd5b6125f285828601612434565b95602094909401359450505050565b60008060006060848603121561261657600080fd5b833567ffffffffffffffff81111561262d57600080fd5b61263986828701612434565b9660208601359650604090950135949350505050565b6000806000806080858703121561266557600080fd5b843567ffffffffffffffff81111561267c57600080fd5b61268887828801612434565b94505060208501359250604085013591506126a56060860161241d565b905092959194509250565b600080600080600060a086880312156126c857600080fd5b853567ffffffffffffffff8111156126df57600080fd5b6126eb88828901612434565b95505060208601359350604086013592506127086060870161241d565b9150608086013561271881612a90565b809150509295509295909350565b60006020828403121561273857600080fd5b5035919050565b60006020828403121561275157600080fd5b5051919050565b60008060006060848603121561276d57600080fd5b8351925060208401519150604084015190509250925092565b600082516127988184602087016129b2565b9190910192915050565b60006101008083528a51808285015261012091506127c68183860160208f016129b2565b602084018b9052604084018a905260608401899052601f01601f191683010190506005861061280557634e487b7160e01b600052602160045260246000fd5b85608083015261282060a08301866001600160a01b03169052565b8360c083015261283460e083018415159052565b9998505050505050505050565b6020808252601c908201527f636f756c64206e6f742066696e642074617820746f2075706461746500000000604082015260600190565b6020808252600e908201526d6e6f207065726d697373696f6e7360901b604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156128f05784516001600160a01b0316835293830193918301916001016128cb565b50506001600160a01b03969096166060850152505050608001529392505050565b604051601f8201601f1916810167ffffffffffffffff8111828210171561293a5761293a612a7a565b604052919050565b6000821982111561295557612955612a38565b500190565b60008261297757634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561299657612996612a38565b500290565b6000828210156129ad576129ad612a38565b500390565b60005b838110156129cd5781810151838201526020016129b5565b838111156129dc576000848401525b50505050565b600181811c908216806129f657607f821691505b60208210811415612a1757634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612a3157612a31612a38565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114612a9e57600080fd5b5056fea2646970667358221220dee1094e34294ea839b72410c4eb0b66574eb8a52d3921e7b270f1fd8dda977064736f6c63430008070033

Check out more smart contracts

Build blockchain magic with Alchemy

Alchemy combines the most powerful web3 developer products and tools with resources, community and legendary support.