ETH Price: $3,843.73 (+6.25%)

Token

ERC-20: TradefiX (TDX)
 

Overview

Max Total Supply

5,826,083.337982665561380953 TDX

Holders

74

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
TradefiX

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-02-07
*/

/**░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

████████╗██████╗░░█████╗░██████╗░███████╗███████╗██╗██╗░░██╗░░░░█████╗░██████╗░░██████╗░
╚══██╔══╝██╔══██╗██╔══██╗██╔══██╗██╔════╝██╔════╝██║╚██╗██╔╝░░░██╔══██╗██╔══██╗██╔════╝░
░░░██║░░░██████╔╝███████║██║░░██║█████╗░░█████╗░░██║░╚███╔╝░░░░██║░░██║██████╔╝██║░░██╗░
░░░██║░░░██╔══██╗██╔══██║██║░░██║██╔══╝░░██╔══╝░░██║░██╔██╗░░░░██║░░██║██╔══██╗██║░░╚██╗
░░░██║░░░██║░░██║██║░░██║██████╔╝███████╗██║░░░░░██║██╔╝╚██╗██╗╚█████╔╝██║░░██║╚██████╔╝
░░░╚═╝░░░╚═╝░░╚═╝╚═╝░░╚═╝╚═════╝░╚══════╝╚═╝░░░░░╚═╝╚═╝░░╚═╝╚═╝░╚════╝░╚═╝░░╚═╝░╚═════╝░


TradefiX is a financial market available to everyone, across borders, instantly and simply using L2

web : https://tradefix.org
blog : https://medium.com/@tradefixorg
social : https://t.me/tradefixorg
twitter : https://twitter.com/TradefixOrg

░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░**/

//SPDX-License-Identifier: UNLICENSED

pragma solidity >= 0.8.7;

interface IOwnable {
    function owner() external view returns (address);
}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address who) external view returns (uint256);
    function allowance(address _owner, address spender) external view returns (uint256);
    function transfer(address to, uint256 value) external returns (bool);
    function approve(address spender, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IBurnable {
    function burn(uint256 value) external;
    function burnFrom(address account, uint256 value) external;
}

interface IDEXFactory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
}

interface IDEXRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function addLiquidityETH(address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    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);    
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);
    function swapExactTokensForTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);
    function swapExactTokensForETHSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);
}

interface IDividendDistributor {
    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external;
    function setShare(address shareholder, uint256 amount) external;
    function depositNative() external payable;
    function depositToken(address from, uint256 amount) external;
    function process(uint256 gas) external;
    function inSwap() external view returns (bool);
}


interface ITaxDistributor {
    receive() external payable;
    function lastSwapTime() external view returns (uint256);
    function inSwap() external view returns (bool);
    function createWalletTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external;
    function createDistributorTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external;
    function createDividendTax(string memory name, uint256 buyTax, uint256 sellTax, address dividendDistributor, bool convertToNative) external;
    function createBurnTax(string memory name, uint256 buyTax, uint256 sellTax) external;
    function createLiquidityTax(string memory name, uint256 buyTax, uint256 sellTax, address holder) external;
    function distribute() external;
    function getSellTax() external view returns (uint256);
    function getBuyTax() external view returns (uint256);
    function setTaxWallet(string memory taxName, address wallet) external;
    function setSellTax(string memory taxName, uint256 taxPercentage) external;
    function setBuyTax(string memory taxName, uint256 taxPercentage) external;
    function takeSellTax(uint256 value) external returns (uint256);
    function takeBuyTax(uint256 value) external returns (uint256);
}

interface IWalletDistributor {
    function receiveToken(address token, address from, uint256 amount) external;
}

/**
 * @title SafeMath
 * @dev Math operations with safety checks that revert on error
 */
library SafeMath {

    int256 constant private INT256_MIN = -2**255;

    /**
    * @dev Multiplies two unsigned integers, reverts on overflow.
    */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b);

        return c;
    }

    /**
    * @dev Multiplies two signed integers, reverts on overflow.
    */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) {
            return 0;
        }

        require(!(a == -1 && b == INT256_MIN)); // This is the only case of overflow not detected by the check below

        int256 c = a * b;
        require(c / a == b);

        return c;
    }

    /**
    * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero.
    */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
    * @dev Integer division of two signed integers truncating the quotient, reverts on division by zero.
    */
    function div(int256 a, int256 b) internal pure returns (int256) {
        require(b != 0); // Solidity only automatically asserts when dividing by 0
        require(!(b == -1 && a == INT256_MIN)); // This is the only case of overflow

        int256 c = a / b;

        return c;
    }

    /**
    * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend).
    */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a);
        uint256 c = a - b;

        return c;
    }

    /**
    * @dev Subtracts two signed integers, reverts on overflow.
    */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));

        return c;
    }

    /**
    * @dev Adds two unsigned integers, reverts on overflow.
    */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a);

        return c;
    }

    /**
    * @dev Adds two signed integers, reverts on overflow.
    */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));

        return c;
    }

    /**
    * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo),
    * reverts when dividing by zero.
    */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0);
        return a % b;
    }
}

abstract contract BaseErc20 is IERC20, IOwnable {

    mapping (address => uint256) internal _balances;
    mapping (address => mapping (address => uint256)) internal _allowed;
    uint256 internal _totalSupply;
    bool internal _useSafeTransfer;
    
    string public symbol;
    string public  name;
    uint8 public decimals;
    
    address public override owner;
    address public operator;
    bool public isTradingEnabled = true;
    bool public launched;
    
    mapping (address => bool) public canAlwaysTrade;
    mapping (address => bool) public excludedFromSelling;
    mapping (address => bool) public exchanges;
    
    modifier onlyOwner() {
        require(msg.sender == owner, "can only be called by the contract owner");
        _;
    }
    
    modifier isLaunched() {
        require(launched, "can only be called once token is launched");
        _;
    }

    // @dev Trading is allowed before launch if the sender is the owner, we are transferring from the owner, or in canAlwaysTrade list
    modifier tradingEnabled(address from) {
        require((isTradingEnabled && launched) || from == owner || canAlwaysTrade[msg.sender], "trading not enabled");
        _;
    }
    
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    function configure(address _owner) internal virtual {
        owner = _owner;
        canAlwaysTrade[owner] = true;
        operator = owner;
    }

    /**
    * @dev Total number of tokens in existence
    */
    function totalSupply() external override view returns (uint256) {
        return _totalSupply;
    }

    /**
    * @dev Gets the balance of the specified address.
    * @param _owner The address to query the balance of.
    * @return An uint256 representing the amount owned by the passed address.
    */
    function balanceOf(address _owner) external override view returns (uint256) {
        return _balances[_owner];
    }

    /**
     * @dev Function to check the amount of tokens that an owner allowed to a spender.
     * @param _owner address The address which owns the funds.
     * @param spender address The address which will spend the funds.
     * @return A uint256 specifying the amount of tokens still available for the spender.
     */
    function allowance(address _owner, address spender) external override view returns (uint256) {
        return _allowed[_owner][spender];
    }

    /**
    * @dev Transfer token for a specified address
    * @param to The address to transfer to.
    * @param value The amount to be transferred.
    */
    function transfer(address to, uint256 value) external override tradingEnabled(msg.sender) returns (bool) {
        _transfer(msg.sender, to, value);
        return true;
    }

    /**
     * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
     * Beware that changing an allowance with this method brings the risk that someone may use both the old
     * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
     * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     * @param spender The address which will spend the funds.
     * @param value The amount of tokens to be spent.
     */
    function approve(address spender, uint256 value) external override tradingEnabled(msg.sender) returns (bool) {
        require(spender != address(0), "cannot approve the 0 address");

        _allowed[msg.sender][spender] = value;
        emit Approval(msg.sender, spender, value);
        return true;
    }

    /**
     * @dev Transfer tokens from one address to another.
     * Note that while this function emits an Approval event, this is not required as per the specification,
     * and other compliant implementations may not emit the event.
     * @param from address The address which you want to send tokens from
     * @param to address The address which you want to transfer to
     * @param value uint256 the amount of tokens to be transferred
     */
    function transferFrom(address from, address to, uint256 value) external override tradingEnabled(from) returns (bool) {
        _allowed[from][msg.sender] = _allowed[from][msg.sender] - value;
        _transfer(from, to, value);
        emit Approval(from, msg.sender, _allowed[from][msg.sender]);
        return true;
    }

    /**
     * @dev Increase the amount of tokens that an owner allowed to a spender.
     * approve should be called when allowed_[_spender] == 0. To increment
     * allowed value is better to use this function to avoid 2 calls (and wait until
     * the first transaction is mined)
     * From MonolithDAO Token.sol
     * Emits an Approval event.
     * @param spender The address which will spend the funds.
     * @param addedValue The amount of tokens to increase the allowance by.
     */
    function increaseAllowance(address spender, uint256 addedValue) external tradingEnabled(msg.sender) returns (bool) {
        require(spender != address(0), "cannot approve the 0 address");

        _allowed[msg.sender][spender] = _allowed[msg.sender][spender] + addedValue;
        emit Approval(msg.sender, spender, _allowed[msg.sender][spender]);
        return true;
    }

    /**
     * @dev Decrease the amount of tokens that an owner allowed to a spender.
     * approve should be called when allowed_[_spender] == 0. To decrement
     * allowed value is better to use this function to avoid 2 calls (and wait until
     * the first transaction is mined)
     * From MonolithDAO Token.sol
     * Emits an Approval event.
     * @param spender The address which will spend the funds.
     * @param subtractedValue The amount of tokens to decrease the allowance by.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) external tradingEnabled(msg.sender) returns (bool) {
        require(spender != address(0), "cannot approve the 0 address");

        _allowed[msg.sender][spender] = _allowed[msg.sender][spender] - subtractedValue;
        emit Approval(msg.sender, spender, _allowed[msg.sender][spender]);
        return true;
    }

    
    
    // Virtual methods
    function launch() virtual public onlyOwner {
        launched = true;
    }
    
    function preTransfer(address from, address to, uint256 value) virtual internal { }

    function calculateTransferAmount(address from, address to, uint256 value) virtual internal returns (uint256) {
        require(from != to, "you cannot transfer to yourself");
        return value;
    }
    
    function postTransfer(address from, address to) virtual internal { }
    


    // Admin methods
    function changeOwner(address who) external onlyOwner {
        require(who != address(0), "cannot be zero address");
        owner = who;
    }

    function renounceOwnership() external onlyOwner {
        emit OwnershipTransferred(owner, address(0));
        owner = address(0);
    }

    function removeEth() external {
        uint256 balance = address(this).balance;
        payable(operator).transfer(balance);
    }


    function transferTokens(address token, address to) external onlyOwner returns(bool){
        uint256 balance = IERC20(token).balanceOf(address(this));
        return IERC20(token).transfer(to, balance);
    }
    
    function setCanAlwaysTrade(address who, bool enabled) external onlyOwner {
        canAlwaysTrade[who] = enabled;
    }
    
    function setExchange(address who, bool isExchange) external onlyOwner {
        exchanges[who] = isExchange;
    }
    
   
    // Private methods

    function getRouterAddress() internal view returns (address routerAddress) {
        if (block.chainid == 1 || block.chainid == 5) {
            routerAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D ; // ETHEREUM
        } else if (block.chainid == 56) {
            routerAddress = 0x10ED43C718714eb63d5aA57B78B54704E256024E; // BSC MAINNET
        } else if (block.chainid == 97) {
            routerAddress = 0xc99f3718dB7c90b020cBBbb47eD26b0BA0C6512B; // BSC TESTNET
        } else {
            revert("Unknown Chain ID");
        }
    }

    /**
    * @dev Transfer token for a specified addresses
    * @param from The address to transfer from.
    * @param to The address to transfer to.
    * @param value The amount to be transferred.
    */
    function _transfer(address from, address to, uint256 value) private {
        require(to != address(0), "cannot be zero address");
        require(excludedFromSelling[from] == false, "address is not allowed to sell");
        
        if (_useSafeTransfer) {

            _balances[from] = _balances[from] - value;
            _balances[to] = _balances[to] + value;
            emit Transfer(from, to, value);

        } else {
            preTransfer(from, to, value);

            uint256 modifiedAmount = calculateTransferAmount(from, to, value);
            _balances[from] = _balances[from] - value;
            _balances[to] = _balances[to] + modifiedAmount;

            emit Transfer(from, to, modifiedAmount);

            postTransfer(from, to);
        }
    }
}

abstract contract Taxable is BaseErc20 {
    
    ITaxDistributor taxDistributor;

    bool public autoSwapTax;
    uint256 public minimumTimeBetweenSwaps;
    uint256 public minimumTokensBeforeSwap;
    mapping (address => bool) public excludedFromTax;
    uint256 swapStartTime;
    
    // Overrides
    
    function configure(address _owner) internal virtual override {
        excludedFromTax[_owner] = true;
        super.configure(_owner);
    }
    
    
    function calculateTransferAmount(address from, address to, uint256 value) internal virtual override returns (uint256) {
        
        uint256 amountAfterTax = value;

        if (excludedFromTax[from] == false && excludedFromTax[to] == false && launched) {
            if (exchanges[from]) {
                // we are BUYING
                amountAfterTax = taxDistributor.takeBuyTax(value);
            } else if (exchanges[to]) {
                // we are SELLING
                amountAfterTax = taxDistributor.takeSellTax(value);
            }
        }

        uint256 taxAmount = value - amountAfterTax;
        if (taxAmount > 0) {
            _balances[address(taxDistributor)] = _balances[address(taxDistributor)] + taxAmount;
            emit Transfer(from, address(taxDistributor), taxAmount);
        }
        return super.calculateTransferAmount(from, to, amountAfterTax);
    }


    function preTransfer(address from, address to, uint256 value) override virtual internal {
        if (
            launched && 
            autoSwapTax && 
            exchanges[to] && 
            swapStartTime + 10 <= block.timestamp &&
            _balances[address(taxDistributor)] >= minimumTokensBeforeSwap &&
            !excludedFromTax[from] &&
            taxDistributor.inSwap() == false
        ) {
            swapStartTime = block.timestamp;
            taxDistributor.distribute();
        }
        super.preTransfer(from, to, value);
    }

    
    // Public methods
    
    /**
     * @dev Return the current total sell tax from the tax distributor
     */
    function sellTax() external view returns (uint256) {
        return taxDistributor.getSellTax();
    }

    /**
     * @dev Return the current total sell tax from the tax distributor
     */
    function buyTax() external view returns (uint256) {
        return taxDistributor.getBuyTax();
    }

    /**
     * @dev Return the address of the tax distributor contract
     */
    function taxDistributorAddress() external view returns (address) {
        return address(taxDistributor);
    }    
    
    
    // Admin methods

    function setAutoSwaptax(bool enabled) external onlyOwner {
        autoSwapTax = enabled;
    }

    function setExcludedFromTax(address who, bool enabled) external onlyOwner {
        require(exchanges[who] == false || enabled == false, "Cannot exclude an exchange from tax");
        excludedFromTax[who] = enabled;
    }

    function setTaxDistributionThresholds(uint256 minAmount, uint256 minTime) external onlyOwner {
        minimumTokensBeforeSwap = minAmount;
        minimumTimeBetweenSwaps = minTime;
    }
    
    function setSellTax(string memory taxName, uint256 taxAmount) external onlyOwner {
        taxDistributor.setSellTax(taxName, taxAmount);
    }

    function setBuyTax(string memory taxName, uint256 taxAmount) external onlyOwner {
        taxDistributor.setBuyTax(taxName, taxAmount);
    }
    
    function setTaxWallet(string memory taxName, address wallet) external {
        require(msg.sender == operator);
        taxDistributor.setTaxWallet(taxName, wallet);
    }
    
    function manualDistribute() external isLaunched {
        require(msg.sender == operator);
        taxDistributor.distribute();
    }
}

abstract contract Burnable is BaseErc20, IBurnable {
    
    mapping (address => bool) public ableToBurn;

    modifier onlyBurner() {
        require(ableToBurn[msg.sender], "no burn permissions");
        _;
    }

    // Overrides
    
    function configure(address _owner) internal virtual override {
        ableToBurn[_owner] = true;
        super.configure(_owner);
    }
    
    
    // Admin methods

    function setAbleToBurn(address who, bool enabled) external onlyOwner {
        ableToBurn[who] = enabled;
    }

    /**
     * @dev Internal function that burns an amount of the token of a given
     * account.
     * @param value The amount that will be burnt.
     */
    function burn(uint256 value) external override onlyBurner {
        _burn(msg.sender, value);
    }

    /**
     * @dev Internal function that burns an amount of the token of a given
     * account, deducting from the sender's allowance for said account. Uses the
     * internal burn function.
     * Emits an Approval event (reflecting the reduced allowance).
     * @param account The account whose tokens will be burnt.
     * @param value The amount that will be burnt.
     */
    function burnFrom(address account, uint256 value) external override onlyBurner {
        uint256 allowance = _allowed[account][msg.sender];
        if (allowance >= value) {
            _allowed[account][msg.sender] = allowance - value;
        } else {
            _allowed[account][msg.sender] = 0;
        }
        _burn(account, value);
        emit Approval(account, msg.sender, _allowed[account][msg.sender]);
    }

    // Private methods
    function _burn(address account, uint256 value) internal {
        require(account != address(0));

        _totalSupply = _totalSupply - value;
        _balances[account] = _balances[account] - value;
        emit Transfer(account, address(0), value);
    }
}

contract TaxDistributor is ITaxDistributor {

    address immutable public tokenPair;
    address immutable public routerAddress;
    address immutable private _token;
    address immutable private _weth;

    IDEXRouter private _router;

    bool public override inSwap;
    uint256 public override lastSwapTime;

    uint256 immutable public maxSellTax;
    uint256 immutable public maxBuyTax;

    enum TaxType { WALLET, DIVIDEND, LIQUIDITY, DISTRIBUTOR, BURN }
    struct Tax {
        string taxName;
        uint256 buyTaxPercentage;
        uint256 sellTaxPercentage;
        uint256 taxPool;
        TaxType taxType;
        address location;
        uint256 share;
        bool convertToNative;
    }
    Tax[] public taxes;

    event TaxesDistributed(uint256 tokensSwapped, uint256 ethReceived);
    event DistributionError(string text);

    modifier onlyToken() {
        require(msg.sender == _token, "no permissions");
        _;
    }

    modifier swapLock() {
        require(inSwap == false, "already swapping");
        inSwap = true;
        _;
        inSwap = false;
    }

    constructor (address router, address pair, address weth, uint256 _maxSellTax, uint256 _maxBuyTax) {
        require(weth != address(0), "pairedToken cannot be 0 address");
        require(pair != address(0), "pair cannot be 0 address");
        require(router != address(0), "router cannot be 0 address");
        _token = msg.sender;
        _weth = weth;
        _router = IDEXRouter(router);
        maxSellTax = _maxSellTax;
        maxBuyTax = _maxBuyTax;
        tokenPair = pair;
        routerAddress = router;
    }

    receive() external override payable {}

    function createWalletTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external override onlyToken {
        taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.WALLET, wallet, 0, convertToNative));
    }

    function createDistributorTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external override onlyToken {
        taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.DISTRIBUTOR, wallet, 0, convertToNative));
    }
    
    function createDividendTax(string memory name, uint256 buyTax, uint256 sellTax, address dividendDistributor, bool convertToNative) external override onlyToken {
        taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.DIVIDEND, dividendDistributor, 0, convertToNative));
    }
    
    function createBurnTax(string memory name, uint256 buyTax, uint256 sellTax) external override onlyToken {
        taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.BURN, address(0), 0, false));
    }

    function createLiquidityTax(string memory name, uint256 buyTax, uint256 sellTax, address holder) external override onlyToken {
        taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.LIQUIDITY, holder, 0, false));
    }

    function distribute() external override onlyToken swapLock {
        address[] memory path = new address[](2);
        path[0] = _token;
        path[1] = _weth;
        IERC20 token = IERC20(_token);

        uint256 totalTokens;
        for (uint256 i = 0; i < taxes.length; i++) {
            if (taxes[i].taxType == TaxType.LIQUIDITY) {
                uint256 half = taxes[i].taxPool / 2;
                totalTokens += taxes[i].taxPool - half;
            } else if (taxes[i].convertToNative) {
                totalTokens += taxes[i].taxPool;
            }
        }
        totalTokens = checkTokenAmount(token, totalTokens);
        if (checkTokenAmount(token, totalTokens) != totalTokens) {
            emit DistributionError("Insufficient tokens to swap. Please add more tokens");
            return;
        }

        uint256[] memory amts = _router.swapExactTokensForETH(
            totalTokens,
            0,
            path,
            address(this),
            block.timestamp + 300
        );
        uint256 amountETH = address(this).balance;

        if (totalTokens != amts[0] || amountETH != amts[1] ) {
            emit DistributionError("Unexpected amounts returned from swap");
        }

        // Calculate the distribution
        uint256 toDistribute = amountETH;

        for (uint256 i = 0; i < taxes.length; i++) {

            if (taxes[i].convertToNative || taxes[i].taxType == TaxType.LIQUIDITY) {
                if (i == taxes.length - 1) {
                    taxes[i].share = toDistribute;
                } else if (taxes[i].taxType == TaxType.LIQUIDITY) {
                    uint256 half = taxes[i].taxPool / 2;
                    uint256 share = (amountETH * (taxes[i].taxPool - half)) / totalTokens;
                    taxes[i].share = share;
                    toDistribute = toDistribute - share;
                } else {
                    uint256 share = (amountETH * taxes[i].taxPool) / totalTokens;
                    taxes[i].share = share;
                    toDistribute = toDistribute - share;
                }
            }
        }

        // Distribute the coins
        for (uint256 i = 0; i < taxes.length; i++) {
            
            if (taxes[i].taxType == TaxType.WALLET) {
                if (taxes[i].convertToNative) {
                    payable(taxes[i].location).transfer(taxes[i].share);
                } else {
                    token.transfer(taxes[i].location, checkTokenAmount(token, taxes[i].taxPool));
                }
            }
            else if (taxes[i].taxType == TaxType.DISTRIBUTOR) {
                if (taxes[i].convertToNative) {
                    payable(taxes[i].location).transfer(taxes[i].share);
                } else {
                    token.approve(taxes[i].location, taxes[i].taxPool);
                    IWalletDistributor(taxes[i].location).receiveToken(_token, address(this), checkTokenAmount(token, taxes[i].taxPool));
                }
            }
            else if (taxes[i].taxType == TaxType.DIVIDEND) {
               if (taxes[i].convertToNative) {
                    IDividendDistributor(taxes[i].location).depositNative{value: taxes[i].share}();
                } else {
                    IDividendDistributor(taxes[i].location).depositToken(address(this), checkTokenAmount(token, taxes[i].taxPool));
                }
            }
            else if (taxes[i].taxType == TaxType.BURN) {
                IBurnable(_token).burn(checkTokenAmount(token, taxes[i].taxPool));
            }
            else if (taxes[i].taxType == TaxType.LIQUIDITY) {
                if(taxes[i].share > 0){
                    uint256 half = checkTokenAmount(token, taxes[i].taxPool / 2);
                    _router.addLiquidityETH{value: taxes[i].share}(
                        _token,
                        half,
                        0,
                        0,
                        taxes[i].location,
                        block.timestamp + 300
                    );
                }
            }
            
            taxes[i].taxPool = 0;
            taxes[i].share = 0;
        }

        emit TaxesDistributed(totalTokens, amountETH);

        lastSwapTime = block.timestamp;
    }

    function getSellTax() public override onlyToken view returns (uint256) {
        uint256 taxAmount;
        for (uint256 i = 0; i < taxes.length; i++) {
            taxAmount += taxes[i].sellTaxPercentage;
        }
        return taxAmount;
    }

    function getBuyTax() public override onlyToken view returns (uint256) {
        uint256 taxAmount;
        for (uint256 i = 0; i < taxes.length; i++) {
            taxAmount += taxes[i].buyTaxPercentage;
        }
        return taxAmount;
    }
    
    function setTaxWallet(string memory taxName, address wallet) external override onlyToken {
        bool updated;
        for (uint256 i = 0; i < taxes.length; i++) {
            if (taxes[i].taxType == TaxType.WALLET && compareStrings(taxes[i].taxName, taxName)) {
                taxes[i].location = wallet;
                updated = true;
            }
        }
        require(updated, "could not find tax to update");
    }

    function setSellTax(string memory taxName, uint256 taxPercentage) external override onlyToken {
        bool updated;
        for (uint256 i = 0; i < taxes.length; i++) {
            if (compareStrings(taxes[i].taxName, taxName)) {
                taxes[i].sellTaxPercentage = taxPercentage;
                updated = true;
            }
        }
        require(updated, "could not find tax to update");
        require(getSellTax() <= maxSellTax, "tax cannot be set this high");
    }

    function setBuyTax(string memory taxName, uint256 taxPercentage) external override onlyToken {
        bool updated;
        for (uint256 i = 0; i < taxes.length; i++) {
            //if (taxes[i].taxName == taxName) {
            if (compareStrings(taxes[i].taxName, taxName)) {
                taxes[i].buyTaxPercentage = taxPercentage;
                updated = true;
            }
        }
        require(updated, "could not find tax to update");
        require(getBuyTax() <= maxBuyTax, "tax cannot be set this high");
    }

    function takeSellTax(uint256 value) external override onlyToken returns (uint256) {
        for (uint256 i = 0; i < taxes.length; i++) {
            if (taxes[i].sellTaxPercentage > 0) {
                uint256 taxAmount = (value * taxes[i].sellTaxPercentage) / 10000;
                taxes[i].taxPool += taxAmount;
                value = value - taxAmount;
            }
        }
        return value;
    }

    function takeBuyTax(uint256 value) external override onlyToken returns (uint256) {
        for (uint256 i = 0; i < taxes.length; i++) {
            if (taxes[i].buyTaxPercentage > 0) {
                uint256 taxAmount = (value * taxes[i].buyTaxPercentage) / 10000;
                taxes[i].taxPool += taxAmount;
                value = value - taxAmount;
            }
        }
        return value;
    }

    
    // Private methods
    function compareStrings(string memory a, string memory b) private pure returns (bool) {
        return (keccak256(abi.encodePacked((a))) == keccak256(abi.encodePacked((b))));
    }

    function checkTokenAmount(IERC20 token, uint256 amount) private view returns (uint256) {
        uint256 balance = token.balanceOf(address(this));
        if (balance > amount) {
            return amount;
        }
        return balance;
    }
}

interface IPinkAntiBot {
  function setTokenOwner(address owner) external;
  function onPreTransferCheck(address from, address to, uint256 amount) external;
}

abstract contract AntiSniper is BaseErc20 {
    
    IPinkAntiBot public pinkAntiBot;
    bool private pinkAntiBotConfigured;

    bool public enableSniperBlocking;
    bool public enableBlockLogProtection;
    bool public enableHighTaxCountdown;
    bool public enablePinkAntiBot;
    
    uint256 public msPercentage;
    uint256 public mhPercentage;
    uint256 public maxGasLimit;

    uint256 public launchTime;
    uint256 public launchBlock;
    uint256 public snipersCaught;
    
    mapping (address => bool) public isSniper;
    mapping (address => bool) public isNeverSniper;
    mapping (address => uint256) public transactionBlockLog;
    
    // Overrides
    
    function configure(address _owner) internal virtual override {
        isNeverSniper[_owner] = true;
        super.configure(_owner);
    }
    
    function launch() override virtual public onlyOwner {
        super.launch();
        launchTime = block.timestamp;
        launchBlock = block.number;
    }
    
    function preTransfer(address from, address to, uint256 value) override virtual internal {
        require(enableSniperBlocking == false || isSniper[msg.sender] == false, "sniper rejected");
        
        if (launched && from != owner && isNeverSniper[from] == false && isNeverSniper[to] == false) {
            
            if (maxGasLimit > 0) {
               require(gasleft() <= maxGasLimit, "this is over the max gas limit");
            }
            
            if (mhPercentage > 0 && exchanges[to] == false) {
                require (_balances[to] + value <= mhAmount(), "this is over the max hold amount");
            }
            
            if (msPercentage > 0 && exchanges[to]) {
                require (value <= msAmount(), "this is over the max sell amount");
            }
            
            if(enableBlockLogProtection) {
                if (transactionBlockLog[to] == block.number) {
                    isSniper[to] = true;
                    snipersCaught ++;
                }
                if (transactionBlockLog[from] == block.number) {
                    isSniper[from] = true;
                    snipersCaught ++;
                }
                if (exchanges[to] == false) {
                    transactionBlockLog[to] = block.number;
                }
                if (exchanges[from] == false) {
                    transactionBlockLog[from] = block.number;
                }
            }
            
            if (enablePinkAntiBot) {
                pinkAntiBot.onPreTransferCheck(from, to, value);
            }
        }
        
        super.preTransfer(from, to, value);
    }
    
    function calculateTransferAmount(address from, address to, uint256 value) internal virtual override returns (uint256) {
        uint256 amountAfterTax = value;
        if (launched && enableHighTaxCountdown) {
            if (from != owner && sniperTax() > 0 && isNeverSniper[from] == false && isNeverSniper[to] == false) {
                uint256 taxAmount = (value * sniperTax()) / 10000;
                amountAfterTax = amountAfterTax - taxAmount;
            }
        }
        return super.calculateTransferAmount(from, to, amountAfterTax);
    }
    
    // Public methods
    
    function mhAmount() public view returns (uint256) {
        return (_totalSupply * mhPercentage) / 10000;
    }
    
    function msAmount() public view returns (uint256) {
         return (_totalSupply * msPercentage) / 10000;
    }
    
   function sniperTax() public virtual view returns (uint256) {
        if(launched) {
            if (block.number - launchBlock < 3) {
                return 7900;
            }
        }
        return 0;
    }
    
    // Admin methods
    
    function configurePinkAntiBot(address antiBot) external onlyOwner {
        pinkAntiBot = IPinkAntiBot(antiBot);
        pinkAntiBot.setTokenOwner(owner);
        pinkAntiBotConfigured = true;
        enablePinkAntiBot = true;
    }
    
    function setSniperBlocking(bool enabled) external onlyOwner {
        enableSniperBlocking = enabled;
    }
    
    function setBlockLogProtection(bool enabled) external onlyOwner {
        enableBlockLogProtection = enabled;
    }
    
    function setHighTaxCountdown(bool enabled) external onlyOwner {
        enableHighTaxCountdown = enabled;
    }
    
    function setPinkAntiBot(bool enabled) external onlyOwner {
        require(pinkAntiBotConfigured, "pink anti bot is not configured");
        enablePinkAntiBot = enabled;
    }
    
    function setMsPercentage(uint256 amount) external onlyOwner {
        msPercentage = amount;
    }
    
    function setMhPercentage(uint256 amount) external onlyOwner {
        mhPercentage = amount;
    }
    
    function setMaxGasLimit(uint256 amount) external onlyOwner {
        maxGasLimit = amount;
    }
    
    function setIsSniper(address who, bool enabled) external onlyOwner {
        isSniper[who] = enabled;
    }

    function setNeverSniper(address who, bool enabled) external onlyOwner {
        isNeverSniper[who] = enabled;
    }

    function removeLimits() external onlyOwner {
        mhPercentage = 0;
        msPercentage = 0;
    }
    // private methods
}

contract TradefiX is BaseErc20, AntiSniper, Burnable, Taxable {

    mapping(address => bool) public zkManualEnable;
    uint256 public zkTokenThreshold;

    constructor () {
        configure(msg.sender);

        symbol = "TDX";
        name = "TradefiX";
        decimals = 18;

        // Swap
        address routerAddress = getRouterAddress();
        IDEXRouter router = IDEXRouter(routerAddress);
        address WETH = router.WETH();
        address pair = IDEXFactory(router.factory()).createPair(WETH, address(this));
        exchanges[pair] = true;
        taxDistributor = new TaxDistributor(routerAddress, pair, WETH, 1300, 1300);

        // Anti Sniper
        enableSniperBlocking = true;
        isNeverSniper[address(taxDistributor)] = true;
        mhPercentage = 200;
        msPercentage = 150;
        enableHighTaxCountdown = true;

        // Tax
        minimumTimeBetweenSwaps = 30 seconds;
        minimumTokensBeforeSwap = 10000 * 10 ** decimals;
        excludedFromTax[address(taxDistributor)] = true;
        taxDistributor.createWalletTax("Insight", 140, 190, 0x650C70F6079C4Ffb662B478229C834013bC2f4d4, true);
        taxDistributor.createWalletTax("Marketing", 185, 185, 0x8B2EE074d3B0856C2609416aB51A6E6bcaB73431, true);
        taxDistributor.createWalletTax("Dev", 125, 125, 0xb76Ed56DEa589361Af0c79b74B7ECa0f0b5Bbd5a, true);
        autoSwapTax = false;

        // Burnable
        ableToBurn[address(taxDistributor)] = true;

        // ZK
        zkManualEnable[owner] = true;
        zkTokenThreshold = 100_000 * 10 ** decimals;

        // Finalise
        _allowed[address(taxDistributor)][routerAddress] = 2**256 - 1;
        _totalSupply = _totalSupply + (10_000_000 * 10 ** decimals);
        _balances[owner] = _balances[owner] + _totalSupply;
        emit Transfer(address(0), owner, _totalSupply);
    }


    // Overrides
    
    function launch() public override(AntiSniper, BaseErc20) onlyOwner {
        super.launch();
    }

    function configure(address _owner) internal override(AntiSniper, Burnable, Taxable, BaseErc20) {
        super.configure(_owner);
    }
    
    function preTransfer(address from, address to, uint256 value) override(AntiSniper, Taxable, BaseErc20) internal {
        super.preTransfer(from, to, value);
    }
    
    function calculateTransferAmount(address from, address to, uint256 value) override(AntiSniper, Taxable, BaseErc20) internal returns (uint256) {
        return super.calculateTransferAmount(from, to, value);
    }
    
    function postTransfer(address from, address to) override(BaseErc20) internal {
        super.postTransfer(from, to);
    }

    // Public Functions

    function allowZk(address who) external view returns(bool) {
        return zkManualEnable[who] || _balances[who] >= zkTokenThreshold;
    }

    // Admin Functions

    function setManualZK(address who, bool on) external onlyOwner {
        zkManualEnable[who] = on;
    }

    function setZkTokenThreshold(uint256 amount) external onlyOwner {
        zkTokenThreshold = amount;
    }
}

Contract Security Audit

Contract 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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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":"manualDistribute","outputs":[],"stateMutability":"nonpayable","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":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"removeEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","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"}]

60806040526007805460ff60a01b1916600160a01b1790553480156200002457600080fd5b506200003033620006a1565b6040805180820190915260038152620a888b60eb1b602082015260049062000059908262000937565b506040805180820190915260088152670a8e4c2c8caccd2b60c31b602082015260059062000088908262000937565b506006805460ff191660121790556000620000a2620006ba565b905060008190506000816001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620000ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000110919062000a03565b90506000826001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000153573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000179919062000a03565b6040516364e329cb60e11b81526001600160a01b038481166004830152306024830152919091169063c9c65396906044016020604051808303816000875af1158015620001ca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001f0919062000a03565b6001600160a01b0381166000908152600a602052604090819020805460ff1916600117905551909150849082908490610514908190620002309062000884565b6001600160a01b03958616815293851660208501529390911660408301526060820152608081019190915260a001604051809103906000f0801580156200027b573d6000803e3d6000fd5b50601680546001600160a01b03929092166001600160a01b031990921682179055600b805460ff60a81b1916600160a81b178155600091825260136020526040909120805460ff1916600117905560c8600d556096600c55805460ff60b81b1916600160b81b179055601e601755600654620002fc9060ff16600a62000b4a565b6200030a9061271062000b5b565b601855601680546001600160a01b0390811660009081526019602052604090819020805460ff1916600190811790915592549051634693167f60e11b815260a06004820152600760a482015266125b9cda59da1d60ca1b60c4820152608c602482015260be604482015273650c70f6079c4ffb662b478229c834013bc2f4d4606482015260848101939093521690638d262cfe9060e401600060405180830381600087803b158015620003bc57600080fd5b505af1158015620003d1573d6000803e3d6000fd5b5050601654604051634693167f60e11b815260a06004820152600960a4820152684d61726b6574696e6760b81b60c482015260b9602482018190526044820152738b2ee074d3b0856c2609416ab51a6e6bcab734316064820152600160848201526001600160a01b039091169250638d262cfe915060e401600060405180830381600087803b1580156200046457600080fd5b505af115801562000479573d6000803e3d6000fd5b5050601654604051634693167f60e11b815260a06004820152600360a4820152622232bb60e91b60c4820152607d60248201819052604482015273b76ed56dea589361af0c79b74b7eca0f0b5bbd5a6064820152600160848201526001600160a01b039091169250638d262cfe915060e401600060405180830381600087803b1580156200050657600080fd5b505af11580156200051b573d6000803e3d6000fd5b50506016805460ff60a01b1981169091556001600160a01b039081166000908152601560209081526040808320805460ff1990811660019081179092556006805461010090049096168552601b909352922080549091169091179055546200058b925060ff169050600a62000b4a565b6200059a90620186a062000b5b565b601c556016546001600160a01b0390811660009081526001602090815260408083209388168352929052206000199055600654620005dd9060ff16600a62000b4a565b620005ec906298968062000b5b565b600254620005fb919062000b75565b600281905560065461010090046001600160a01b03166000908152602081905260409020546200062c919062000b75565b600680546001600160a01b03610100918290048116600090815260208190526040808220959095559254600254945192900416927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef916200068f91815260200190565b60405180910390a35050505062000b8b565b620006b7816200076e60201b62001e2a1760201c565b50565b60004660011480620006cc5750466005145b15620006eb5750737a250d5630b4cf539739df2c5dacb4c659f2488d90565b466038036200070d57507310ed43c718714eb63d5aa57b78b54704e256024e90565b466061036200072f575073c99f3718db7c90b020cbbbb47ed26b0ba0c6512b90565b60405162461bcd60e51b815260206004820152601060248201526f155b9adb9bdddb8810da185a5b88125160821b604482015260640160405180910390fd5b6001600160a01b0381166000908152601960209081526040909120805460ff19166001179055620006b790829062001e52620007aa821b17901c565b6001600160a01b0381166000908152601560209081526040909120805460ff19166001179055620006b790829062001e7a620007e6821b17901c565b6001600160a01b0381166000908152601360209081526040909120805460ff19166001179055620006b790829062001ea262000822821b17901c565b60068054610100600160a81b0319166101006001600160a01b0393841681029190911780835581900483166000908152600860205260409020805460ff19166001179055905460078054929091049092166001600160a01b0319909116179055565b612d9a8062003c8483390190565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620008bd57607f821691505b602082108103620008de57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200093257600081815260208120601f850160051c810160208610156200090d5750805b601f850160051c820191505b818110156200092e5782815560010162000919565b5050505b505050565b81516001600160401b0381111562000953576200095362000892565b6200096b81620009648454620008a8565b84620008e4565b602080601f831160018114620009a357600084156200098a5750858301515b600019600386901b1c1916600185901b1785556200092e565b600085815260208120601f198616915b82811015620009d457888601518255948401946001909101908401620009b3565b5085821015620009f35787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121562000a1657600080fd5b81516001600160a01b038116811462000a2e57600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000a8c57816000190482111562000a705762000a7062000a35565b8085161562000a7e57918102915b93841c939080029062000a50565b509250929050565b60008262000aa55750600162000b44565b8162000ab45750600062000b44565b816001811462000acd576002811462000ad85762000af8565b600191505062000b44565b60ff84111562000aec5762000aec62000a35565b50506001821b62000b44565b5060208310610133831016604e8410600b841016171562000b1d575081810a62000b44565b62000b29838362000a4b565b806000190482111562000b405762000b4062000a35565b0290505b92915050565b600062000a2e60ff84168362000a94565b808202811582820484141762000b445762000b4462000a35565b8082018082111562000b445762000b4462000a35565b6130e98062000b9b6000396000f3fe608060405234801561001057600080fd5b50600436106104545760003560e01c80636a092e7911610241578063b0ad3ebf1161013b578063d3b0066f116100c3578063e79d416011610087578063e79d4160146109d9578063e948474b146109e2578063ede49a1914610a05578063f19fffcb14610a19578063f1f5cd9114610a2d57600080fd5b8063d3b0066f14610951578063db38a41d14610964578063dba61c5814610984578063dd62ed3e1461098d578063e5a82979146109c657600080fd5b8063c552f4c51161010a578063c552f4c514610911578063cc1776d314610924578063d00efb2f1461092c578063d2d7ad8314610935578063d31acb281461093e57600080fd5b8063b0ad3ebf146108bf578063c20c5caf146108e2578063c2ed286b146108f5578063c4a5abcd1461090857600080fd5b80638091f3bf116101c957806395d89b411161018d57806395d89b411461085b578063989763ef14610863578063a457c2d714610886578063a6f9dae114610899578063a9059cbb146108ac57600080fd5b80638091f3bf146107e657806381045345146107fa578063870333e01461080d57806389d53c01146108305780638da5cb5b1461084357600080fd5b8063715018a611610210578063715018a6146107975780637412dbb31461079f578063751039fc146107c2578063790ca413146107ca57806379cc6790146107d357600080fd5b80636a092e791461073f5780636b8f2f3b146107525780636f8645521461076657806370a082311461076e57600080fd5b806336827499116103525780634fbc2775116102da5780635d90bbaf1161029e5780635d90bbaf146106f55780635d9d7d43146107085780635e45da231461071b5780636331bf65146107245780636508c57e1461072c57600080fd5b80634fbc27751461069557806352c6dbc4146106a85780635543379a146106bc578063570ca735146106cf578063583dd79d146106e257600080fd5b806345541cba1161032157806345541cba146106565780634c43e3071461065f5780634cf49dd7146106675780634f7041a51461067a5780634f72e2a21461068257600080fd5b8063368274991461060a578063395093511461061d578063407133d21461063057806342966c681461064357600080fd5b806318551108116103e05780632b750627116103a45780632b750627146105885780632dcb5199146105ab57806330bd85c5146105b4578063313ce567146105c85780633164df8b146105e757600080fd5b806318551108146105225780631e19ae77146105475780631f4a6d321461055a57806323b872dd1461056257806328be90381461057557600080fd5b8063095ea7b311610427578063095ea7b3146104b45780630ab9e6a0146104c75780630f3a325f146104da5780631776834a146104fd57806318160ddd1461051057600080fd5b806301339c2114610459578063064a59d01461046357806306fdde031461048c57806307a1cfbd146104a1575b600080fd5b610461610a35565b005b60075461047790600160a01b900460ff1681565b60405190151581526020015b60405180910390f35b610494610a77565b6040516104839190612bc9565b6104616104af366004612c86565b610b05565b6104776104c2366004612ce7565b610b9c565b6104616104d5366004612d11565b610c90565b6104776104e8366004612d2a565b60126020526000908152604090205460ff1681565b61046161050b366004612d11565b610cc4565b6002545b604051908152602001610483565b6016546001600160a01b03165b6040516001600160a01b039091168152602001610483565b610461610555366004612d53565b610cf8565b610461610d52565b610477610570366004612d8a565b610d90565b610461610583366004612d53565b610ebb565b610477610596366004612d2a565b60136020526000908152604090205460ff1681565b610514601c5481565b600b5461047790600160c01b900460ff1681565b6006546105d59060ff1681565b60405160ff9091168152602001610483565b6104776105f5366004612d2a565b60156020526000908152604090205460ff1681565b610461610618366004612dc6565b610f15565b61047761062b366004612ce7565b610f62565b600b5461052f906001600160a01b031681565b610461610651366004612d11565b611076565b610514600c5481565b6104616110d8565b610477610675366004612d2a565b6111c4565b61051461120b565b610461610690366004612dc6565b61127e565b6104616106a3366004612d53565b6112cb565b600b5461047790600160b01b900460ff1681565b6104616106ca366004612dc6565b611325565b60075461052f906001600160a01b031681565b6104616106f0366004612de3565b611372565b610461610703366004612d53565b6113bb565b610461610716366004612d53565b611415565b610514600e5481565b61051461146f565b61046161073a366004612c86565b61148e565b61047761074d366004612e31565b6114ef565b60165461047790600160a01b900460ff1681565b61051461160b565b61051461077c366004612d2a565b6001600160a01b031660009081526020819052604090205490565b610461611620565b6104776107ad366004612d2a565b600a6020526000908152604090205460ff1681565b61046161169f565b610514600f5481565b6104616107e1366004612ce7565b6116da565b60075461047790600160a81b900460ff1681565b610461610808366004612d11565b61180a565b61047761081b366004612d2a565b601b6020526000908152604090205460ff1681565b61046161083e366004612dc6565b61183e565b60065461052f9061010090046001600160a01b031681565b6104946118e4565b610477610871366004612d2a565b60196020526000908152604090205460ff1681565b610477610894366004612ce7565b6118f1565b6104616108a7366004612d2a565b6119c0565b6104776108ba366004612ce7565b611a66565b6104776108cd366004612d2a565b60086020526000908152604090205460ff1681565b6104616108f0366004612d11565b611af5565b610461610903366004612d53565b611b29565b610514600d5481565b61046161091f366004612dc6565b611c01565b610514611c4e565b61051460105481565b61051460185481565b61046161094c366004612e5b565b611c98565b61046161095f366004612d2a565b611cd2565b610514610972366004612d2a565b60146020526000908152604090205481565b61051460175481565b61051461099b366004612e31565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6104616109d4366004612d53565b611d98565b61051460115481565b6104776109f0366004612d2a565b60096020526000908152604090205460ff1681565b600b5461047790600160a81b900460ff1681565b600b5461047790600160b81b900460ff1681565b610514611df2565b60065461010090046001600160a01b03163314610a6d5760405162461bcd60e51b8152600401610a6490612e7d565b60405180910390fd5b610a75611f04565b565b60058054610a8490612ec5565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab090612ec5565b8015610afd5780601f10610ad257610100808354040283529160200191610afd565b820191906000526020600020905b815481529060010190602001808311610ae057829003601f168201915b505050505081565b60065461010090046001600160a01b03163314610b345760405162461bcd60e51b8152600401610a6490612e7d565b6016546040516307a1cfbd60e01b81526001600160a01b03909116906307a1cfbd90610b669085908590600401612eff565b600060405180830381600087803b158015610b8057600080fd5b505af1158015610b94573d6000803e3d6000fd5b505050505050565b6007546000903390600160a01b900460ff168015610bc35750600754600160a81b900460ff165b80610be057506006546001600160a01b0382811661010090920416145b80610bfa57503360009081526008602052604090205460ff165b610c165760405162461bcd60e51b8152600401610a6490612f21565b6001600160a01b038416610c3c5760405162461bcd60e51b8152600401610a6490612f4e565b3360008181526001602090815260408083206001600160a01b038916808552908352928190208790555186815291929160008051602061309483398151915291015b60405180910390a35060019392505050565b60065461010090046001600160a01b03163314610cbf5760405162461bcd60e51b8152600401610a6490612e7d565b601c55565b60065461010090046001600160a01b03163314610cf35760405162461bcd60e51b8152600401610a6490612e7d565b600e55565b60065461010090046001600160a01b03163314610d275760405162461bcd60e51b8152600401610a6490612e7d565b6001600160a01b03919091166000908152601560205260409020805460ff1916911515919091179055565b60075460405147916001600160a01b03169082156108fc029083906000818181858888f19350505050158015610d8c573d6000803e3d6000fd5b5050565b6007546000908490600160a01b900460ff168015610db75750600754600160a81b900460ff165b80610dd457506006546001600160a01b0382811661010090920416145b80610dee57503360009081526008602052604090205460ff165b610e0a5760405162461bcd60e51b8152600401610a6490612f21565b6001600160a01b0385166000908152600160209081526040808320338452909152902054610e39908490612f9b565b6001600160a01b0386166000908152600160209081526040808320338452909152902055610e68858585611f45565b6001600160a01b03851660008181526001602090815260408083203380855290835292819020549051908152919291600080516020613094833981519152910160405180910390a3506001949350505050565b60065461010090046001600160a01b03163314610eea5760405162461bcd60e51b8152600401610a6490612e7d565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b03163314610f445760405162461bcd60e51b8152600401610a6490612e7d565b600b8054911515600160b81b0260ff60b81b19909216919091179055565b6007546000903390600160a01b900460ff168015610f895750600754600160a81b900460ff165b80610fa657506006546001600160a01b0382811661010090920416145b80610fc057503360009081526008602052604090205460ff165b610fdc5760405162461bcd60e51b8152600401610a6490612f21565b6001600160a01b0384166110025760405162461bcd60e51b8152600401610a6490612f4e565b3360009081526001602090815260408083206001600160a01b0388168452909152902054611031908490612fae565b3360008181526001602090815260408083206001600160a01b038a16808552908352928190208590555193845290926000805160206130948339815191529101610c7e565b3360009081526015602052604090205460ff166110cb5760405162461bcd60e51b81526020600482015260136024820152726e6f206275726e207065726d697373696f6e7360681b6044820152606401610a64565b6110d53382612156565b50565b600754600160a81b900460ff166111435760405162461bcd60e51b815260206004820152602960248201527f63616e206f6e6c792062652063616c6c6564206f6e636520746f6b656e206973604482015268081b185d5b98da195960ba1b6064820152608401610a64565b6007546001600160a01b0316331461115a57600080fd5b601660009054906101000a90046001600160a01b03166001600160a01b031663e4fc6b6d6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156111aa57600080fd5b505af11580156111be573d6000803e3d6000fd5b50505050565b6001600160a01b0381166000908152601b602052604081205460ff16806112055750601c546001600160a01b03831660009081526020819052604090205410155b92915050565b60165460408051631296b91d60e11b815290516000926001600160a01b03169163252d723a9160048083019260209291908290030181865afa158015611255573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112799190612fc1565b905090565b60065461010090046001600160a01b031633146112ad5760405162461bcd60e51b8152600401610a6490612e7d565b60168054911515600160a01b0260ff60a01b19909216919091179055565b60065461010090046001600160a01b031633146112fa5760405162461bcd60e51b8152600401610a6490612e7d565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b031633146113545760405162461bcd60e51b8152600401610a6490612e7d565b600b8054911515600160b01b0260ff60b01b19909216919091179055565b6007546001600160a01b0316331461138957600080fd5b60165460405163583dd79d60e01b81526001600160a01b039091169063583dd79d90610b669085908590600401612fda565b60065461010090046001600160a01b031633146113ea5760405162461bcd60e51b8152600401610a6490612e7d565b6001600160a01b03919091166000908152601260205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b031633146114445760405162461bcd60e51b8152600401610a6490612e7d565b6001600160a01b03919091166000908152601360205260409020805460ff1916911515919091179055565b6000612710600d546002546114849190613004565b611279919061301b565b60065461010090046001600160a01b031633146114bd5760405162461bcd60e51b8152600401610a6490612e7d565b60165460405163328462bf60e11b81526001600160a01b0390911690636508c57e90610b669085908590600401612eff565b60065460009061010090046001600160a01b031633146115215760405162461bcd60e51b8152600401610a6490612e7d565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015611568573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158c9190612fc1565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb906044016020604051808303816000875af11580156115df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611603919061303d565b949350505050565b6000612710600c546002546114849190613004565b60065461010090046001600160a01b0316331461164f5760405162461bcd60e51b8152600401610a6490612e7d565b60065460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360068054610100600160a81b0319169055565b60065461010090046001600160a01b031633146116ce5760405162461bcd60e51b8152600401610a6490612e7d565b6000600d819055600c55565b3360009081526015602052604090205460ff1661172f5760405162461bcd60e51b81526020600482015260136024820152726e6f206275726e207065726d697373696f6e7360681b6044820152606401610a64565b6001600160a01b038216600090815260016020908152604080832033845290915290205481811061178d576117648282612f9b565b6001600160a01b03841660009081526001602090815260408083203384529091529020556117b2565b6001600160a01b03831660009081526001602090815260408083203384529091528120555b6117bc8383612156565b6001600160a01b0383166000818152600160209081526040808320338085529083529281902054905190815291929160008051602061309483398151915291015b60405180910390a3505050565b60065461010090046001600160a01b031633146118395760405162461bcd60e51b8152600401610a6490612e7d565b600d55565b60065461010090046001600160a01b0316331461186d5760405162461bcd60e51b8152600401610a6490612e7d565b600b54600160a01b900460ff166118c65760405162461bcd60e51b815260206004820152601f60248201527f70696e6b20616e746920626f74206973206e6f7420636f6e66696775726564006044820152606401610a64565b600b8054911515600160c01b0260ff60c01b19909216919091179055565b60048054610a8490612ec5565b6007546000903390600160a01b900460ff1680156119185750600754600160a81b900460ff165b8061193557506006546001600160a01b0382811661010090920416145b8061194f57503360009081526008602052604090205460ff165b61196b5760405162461bcd60e51b8152600401610a6490612f21565b6001600160a01b0384166119915760405162461bcd60e51b8152600401610a6490612f4e565b3360009081526001602090815260408083206001600160a01b0388168452909152902054611031908490612f9b565b60065461010090046001600160a01b031633146119ef5760405162461bcd60e51b8152600401610a6490612e7d565b6001600160a01b038116611a3e5760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b6044820152606401610a64565b600680546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6007546000903390600160a01b900460ff168015611a8d5750600754600160a81b900460ff165b80611aaa57506006546001600160a01b0382811661010090920416145b80611ac457503360009081526008602052604090205460ff165b611ae05760405162461bcd60e51b8152600401610a6490612f21565b611aeb338585611f45565b5060019392505050565b60065461010090046001600160a01b03163314611b245760405162461bcd60e51b8152600401610a6490612e7d565b600c55565b60065461010090046001600160a01b03163314611b585760405162461bcd60e51b8152600401610a6490612e7d565b6001600160a01b0382166000908152600a602052604090205460ff161580611b7e575080155b611bd65760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74206578636c75646520616e2065786368616e67652066726f6d206044820152620e8c2f60eb1b6064820152608401610a64565b6001600160a01b03919091166000908152601960205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b03163314611c305760405162461bcd60e51b8152600401610a6490612e7d565b600b8054911515600160a81b0260ff60a81b19909216919091179055565b6016546040805163585e42ef60e11b815290516000926001600160a01b03169163b0bc85de9160048083019260209291908290030181865afa158015611255573d6000803e3d6000fd5b60065461010090046001600160a01b03163314611cc75760405162461bcd60e51b8152600401610a6490612e7d565b601891909155601755565b60065461010090046001600160a01b03163314611d015760405162461bcd60e51b8152600401610a6490612e7d565b600b80546001600160a01b0319166001600160a01b038381169182179092556006546040516318e02bd960e01b81526101009091049092166004830152906318e02bd990602401600060405180830381600087803b158015611d6257600080fd5b505af1158015611d76573d6000803e3d6000fd5b5050600b805464ff000000ff60a01b191664010000000160a01b179055505050565b60065461010090046001600160a01b03163314611dc75760405162461bcd60e51b8152600401610a6490612e7d565b6001600160a01b03919091166000908152601b60205260409020805460ff1916911515919091179055565b600754600090600160a81b900460ff1615611e2457600360105443611e179190612f9b565b1015611e245750611edc90565b50600090565b6001600160a01b0381166000908152601960205260409020805460ff191660011790556110d5815b6001600160a01b0381166000908152601560205260409020805460ff191660011790556110d5815b6001600160a01b0381166000908152601360205260409020805460ff191660011790556110d5815b60068054610100600160a81b0319166101006001600160a01b0393841681029190911780835581900483166000908152600860205260409020805460ff19166001179055905460078054929091049092166001600160a01b0319909116179055565b60065461010090046001600160a01b03163314611f335760405162461bcd60e51b8152600401610a6490612e7d565b611f3b6121df565b42600f5543601055565b6001600160a01b038216611f945760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b6044820152606401610a64565b6001600160a01b03831660009081526009602052604090205460ff1615611ffd5760405162461bcd60e51b815260206004820152601e60248201527f61646472657373206973206e6f7420616c6c6f77656420746f2073656c6c00006044820152606401610a64565b60035460ff161561209b576001600160a01b03831660009081526020819052604090205461202c908290612f9b565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461205c908290612fae565b6001600160a01b0383811660008181526020818152604091829020949094555184815290929186169160008051602061307483398151915291016117fd565b6120a6838383612223565b60006120b384848461222e565b6001600160a01b0385166000908152602081905260409020549091506120da908390612f9b565b6001600160a01b03808616600090815260208190526040808220939093559085168152205461210a908290612fae565b6001600160a01b03848116600081815260208181526040918290209490945551848152909291871691600080516020613074833981519152910160405180910390a36111be565b505050565b6001600160a01b03821661216957600080fd5b806002546121779190612f9b565b6002556001600160a01b03821660009081526020819052604090205461219e908290612f9b565b6001600160a01b0383166000818152602081815260408083209490945592518481529092600080516020613074833981519152910160405180910390a35050565b60065461010090046001600160a01b0316331461220e5760405162461bcd60e51b8152600401610a6490612e7d565b6007805460ff60a81b1916600160a81b179055565b61215183838361223b565b60006116038484846123db565b600754600160a81b900460ff16801561225d5750601654600160a01b900460ff165b801561228157506001600160a01b0382166000908152600a602052604090205460ff165b801561229b575042601a54600a6122989190612fae565b11155b80156122c357506018546016546001600160a01b031660009081526020819052604090205410155b80156122e857506001600160a01b03831660009081526019602052604090205460ff16155b80156123685750601660009054906101000a90046001600160a01b03166001600160a01b031663d83067866040518163ffffffff1660e01b8152600401602060405180830381865afa158015612342573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612366919061303d565b155b156123d05742601a556016546040805163e4fc6b6d60e01b815290516001600160a01b039092169163e4fc6b6d9160048082019260009290919082900301818387803b1580156123b757600080fd5b505af11580156123cb573d6000803e3d6000fd5b505050505b6121518383836125fe565b6001600160a01b038316600090815260196020526040812054829060ff1615801561241f57506001600160a01b03841660009081526019602052604090205460ff16155b80156124345750600754600160a81b900460ff165b15612563576001600160a01b0385166000908152600a602052604090205460ff16156124d05760165460405163db017dc760e01b8152600481018590526001600160a01b039091169063db017dc7906024016020604051808303816000875af11580156124a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124c99190612fc1565b9050612563565b6001600160a01b0384166000908152600a602052604090205460ff161561256357601654604051634fa26fd560e01b8152600481018590526001600160a01b0390911690634fa26fd5906024016020604051808303816000875af115801561253c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125609190612fc1565b90505b600061256f8285612f9b565b905080156125e9576016546001600160a01b031660009081526020819052604090205461259d908290612fae565b601680546001600160a01b039081166000908152602081815260409182902094909455915491518481529181169290891691600080516020613074833981519152910160405180910390a35b6125f4868684612a2f565b9695505050505050565b600b54600160a81b900460ff16158061262757503360009081526012602052604090205460ff16155b6126655760405162461bcd60e51b815260206004820152600f60248201526e1cdb9a5c195c881c995a9958dd1959608a1b6044820152606401610a64565b600754600160a81b900460ff16801561269157506006546001600160a01b038481166101009092041614155b80156126b657506001600160a01b03831660009081526013602052604090205460ff16155b80156126db57506001600160a01b03821660009081526013602052604090205460ff16155b1561215157600e541561273a57600e545a111561273a5760405162461bcd60e51b815260206004820152601e60248201527f74686973206973206f76657220746865206d617820676173206c696d697400006044820152606401610a64565b6000600d5411801561276557506001600160a01b0382166000908152600a602052604090205460ff16155b156127e45761277261146f565b6001600160a01b038316600090815260208190526040902054612796908390612fae565b11156127e45760405162461bcd60e51b815260206004820181905260248201527f74686973206973206f76657220746865206d617820686f6c6420616d6f756e746044820152606401610a64565b6000600c5411801561280e57506001600160a01b0382166000908152600a602052604090205460ff165b1561286a5761281b61160b565b81111561286a5760405162461bcd60e51b815260206004820181905260248201527f74686973206973206f76657220746865206d61782073656c6c20616d6f756e746044820152606401610a64565b600b54600160b01b900460ff16156129aa576001600160a01b0382166000908152601460205260409020544390036128d3576001600160a01b0382166000908152601260205260408120805460ff1916600117905560118054916128cd8361305a565b91905055505b6001600160a01b03831660009081526014602052604090205443900361292a576001600160a01b0383166000908152601260205260408120805460ff1916600117905560118054916129248361305a565b91905055505b6001600160a01b0382166000908152600a602052604081205460ff161515900361296a576001600160a01b03821660009081526014602052604090204390555b6001600160a01b0383166000908152600a602052604081205460ff16151590036129aa576001600160a01b03831660009081526014602052604090204390555b600b54600160c01b900460ff161561215157600b5460405163090ec10b60e31b81526001600160a01b03858116600483015284811660248301526044820184905290911690634876085890606401600060405180830381600087803b158015612a1257600080fd5b505af1158015612a26573d6000803e3d6000fd5b50505050505050565b6007546000908290600160a81b900460ff168015612a565750600b54600160b81b900460ff165b15612b05576006546001600160a01b038681166101009092041614801590612a8557506000612a83611df2565b115b8015612aaa57506001600160a01b03851660009081526013602052604090205460ff16155b8015612acf57506001600160a01b03841660009081526013602052604090205460ff16155b15612b05576000612710612ae1611df2565b612aeb9086613004565b612af5919061301b565b9050612b018183612f9b565b9150505b612b10858583612b19565b95945050505050565b6000826001600160a01b0316846001600160a01b031603612b7c5760405162461bcd60e51b815260206004820152601f60248201527f796f752063616e6e6f74207472616e7366657220746f20796f757273656c66006044820152606401610a64565b5092915050565b6000815180845260005b81811015612ba957602081850181015186830182015201612b8d565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000612bdc6020830184612b83565b9392505050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112612c0a57600080fd5b813567ffffffffffffffff80821115612c2557612c25612be3565b604051601f8301601f19908116603f01168101908282118183101715612c4d57612c4d612be3565b81604052838152866020858801011115612c6657600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060408385031215612c9957600080fd5b823567ffffffffffffffff811115612cb057600080fd5b612cbc85828601612bf9565b95602094909401359450505050565b80356001600160a01b0381168114612ce257600080fd5b919050565b60008060408385031215612cfa57600080fd5b612d0383612ccb565b946020939093013593505050565b600060208284031215612d2357600080fd5b5035919050565b600060208284031215612d3c57600080fd5b612bdc82612ccb565b80151581146110d557600080fd5b60008060408385031215612d6657600080fd5b612d6f83612ccb565b91506020830135612d7f81612d45565b809150509250929050565b600080600060608486031215612d9f57600080fd5b612da884612ccb565b9250612db660208501612ccb565b9150604084013590509250925092565b600060208284031215612dd857600080fd5b8135612bdc81612d45565b60008060408385031215612df657600080fd5b823567ffffffffffffffff811115612e0d57600080fd5b612e1985828601612bf9565b925050612e2860208401612ccb565b90509250929050565b60008060408385031215612e4457600080fd5b612e4d83612ccb565b9150612e2860208401612ccb565b60008060408385031215612e6e57600080fd5b50508035926020909101359150565b60208082526028908201527f63616e206f6e6c792062652063616c6c65642062792074686520636f6e74726160408201526731ba1037bbb732b960c11b606082015260800190565b600181811c90821680612ed957607f821691505b602082108103612ef957634e487b7160e01b600052602260045260246000fd5b50919050565b604081526000612f126040830185612b83565b90508260208301529392505050565b6020808252601390820152721d1c98591a5b99c81b9bdd08195b98589b1959606a1b604082015260600190565b6020808252601c908201527f63616e6e6f7420617070726f7665207468652030206164647265737300000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8181038181111561120557611205612f85565b8082018082111561120557611205612f85565b600060208284031215612fd357600080fd5b5051919050565b604081526000612fed6040830185612b83565b905060018060a01b03831660208301529392505050565b808202811582820484141761120557611205612f85565b60008261303857634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561304f57600080fd5b8151612bdc81612d45565b60006001820161306c5761306c612f85565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a2646970667358221220564e6fcff0ffb4006522df3bab422cc6b5e9a35ba524dea0c06e14cb47d00ba264736f6c634300081100336101406040523480156200001257600080fd5b5060405162002d9a38038062002d9a83398101604081905262000035916200019e565b6001600160a01b038316620000915760405162461bcd60e51b815260206004820152601f60248201527f706169726564546f6b656e2063616e6e6f74206265203020616464726573730060448201526064015b60405180910390fd5b6001600160a01b038416620000e95760405162461bcd60e51b815260206004820152601860248201527f706169722063616e6e6f74206265203020616464726573730000000000000000604482015260640162000088565b6001600160a01b038516620001415760405162461bcd60e51b815260206004820152601a60248201527f726f757465722063616e6e6f7420626520302061646472657373000000000000604482015260640162000088565b3360c0526001600160a01b0392831660e052600080546001600160a01b031916958416958617905561010091909152610120521660805260a052620001fb565b80516001600160a01b03811681146200019957600080fd5b919050565b600080600080600060a08688031215620001b757600080fd5b620001c28662000181565b9450620001d26020870162000181565b9350620001e26040870162000181565b6060870151608090970151959894975095949392505050565b60805160a05160c05160e0516101005161012051612aca620002d06000396000818161032a01526105a00152600081816102ad0152610be101526000611055015260008181610431015281816106250152818161079c0152818161083c015281816108c0015281816109e701528181610b1b01528181610c1301528181610c9701528181610e2501528181610f4201528181611001015281816110a1015281816119da01528181611c7601528181611dc201528181611f8101526120f1015260006101e1015260006103e40152612aca6000f3fe6080604052600436106101235760003560e01c8063a411209a116100a0578063db017dc711610064578063db017dc71461037d578063e4fc6b6d1461039d578063ed4ce99e146103b2578063ee16c160146103d2578063fb5a780c1461040657600080fd5b8063a411209a1461029b578063b0bc85de146102cf578063c5be2bc7146102e4578063c8e956ab14610318578063d83067861461034c57600080fd5b80633268cc56116100e75780633268cc56146101cf5780634fa26fd51461021b578063583dd79d1461023b5780636508c57e1461025b5780638d262cfe1461027b57600080fd5b806307a1cfbd1461012f5780630dd8715714610151578063135b4fc01461017a578063252d723a1461019a5780632b1fb89e146101af57600080fd5b3661012a57005b600080fd5b34801561013b57600080fd5b5061014f61014a3660046123e0565b610426565b005b34801561015d57600080fd5b5061016760015481565b6040519081526020015b60405180910390f35b34801561018657600080fd5b5061014f61019536600461244d565b61061a565b3480156101a657600080fd5b5061016761078f565b3480156101bb57600080fd5b5061014f6101ca36600461244d565b610831565b3480156101db57600080fd5b506102037f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610171565b34801561022757600080fd5b506101676102363660046124c3565b6108b3565b34801561024757600080fd5b5061014f6102563660046124dc565b6109dc565b34801561026757600080fd5b5061014f6102763660046123e0565b610b10565b34801561028757600080fd5b5061014f61029636600461244d565b610c08565b3480156102a757600080fd5b506101677f000000000000000000000000000000000000000000000000000000000000000081565b3480156102db57600080fd5b50610167610c8a565b3480156102f057600080fd5b506103046102ff3660046124c3565b610d26565b604051610171989796959493929190612564565b34801561032457600080fd5b506101677f000000000000000000000000000000000000000000000000000000000000000081565b34801561035857600080fd5b5060005461036d90600160a01b900460ff1681565b6040519015158152602001610171565b34801561038957600080fd5b506101676103983660046124c3565b610e18565b3480156103a957600080fd5b5061014f610f37565b3480156103be57600080fd5b5061014f6103cd366004612603565b611f76565b3480156103de57600080fd5b506102037f000000000000000000000000000000000000000000000000000000000000000081565b34801561041257600080fd5b5061014f610421366004612664565b6120e6565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104775760405162461bcd60e51b815260040161046e906126b2565b60405180910390fd5b6000805b6002548110156105805761053b6002828154811061049b5761049b6126da565b906000526020600020906007020160000180546104b7906126f0565b80601f01602080910402602001604051908101604052809291908181526020018280546104e3906126f0565b80156105305780601f1061050557610100808354040283529160200191610530565b820191906000526020600020905b81548152906001019060200180831161051357829003601f168201915b505050505085612248565b1561056e578260028281548110610554576105546126da565b906000526020600020906007020160010181905550600191505b8061057881612740565b91505061047b565b508061059e5760405162461bcd60e51b815260040161046e90612759565b7f00000000000000000000000000000000000000000000000000000000000000006105c761078f565b11156106155760405162461bcd60e51b815260206004820152601b60248201527f7461782063616e6e6f7420626520736574207468697320686967680000000000604482015260640161046e565b505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106625760405162461bcd60e51b815260040161046e906126b2565b6002604051806101000160405280878152602001868152602001858152602001600081526020016003600481111561069c5761069c61254e565b81526001600160a01b0385166020808301919091526000604083018190528515156060909301929092528354600181018555938252902081519192600702019081906106e890826127de565b5060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff021916908360048111156107315761073161254e565b021790555060a0820151600482018054610100600160a81b0319166101006001600160a01b039093169290920291909117905560c0820151600582015560e0909101516006909101805460ff19169115159190911790555050505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107d95760405162461bcd60e51b815260040161046e906126b2565b6000805b60025481101561082b57600281815481106107fa576107fa6126da565b90600052602060002090600702016001015482610817919061289e565b91508061082381612740565b9150506107dd565b50905090565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108795760405162461bcd60e51b815260040161046e906126b2565b6002604051806101000160405280878152602001868152602001858152602001600081526020016001600481111561069c5761069c61254e565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108fd5760405162461bcd60e51b815260040161046e906126b2565b60005b6002548110156109d25760006002828154811061091f5761091f6126da565b90600052602060002090600702016002015411156109c05760006127106002838154811061094f5761094f6126da565b9060005260206000209060070201600201548561096c91906128b1565b61097691906128c8565b9050806002838154811061098c5761098c6126da565b906000526020600020906007020160030160008282546109ac919061289e565b909155506109bc905081856128ea565b9350505b806109ca81612740565b915050610900565b508190505b919050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a245760405162461bcd60e51b815260040161046e906126b2565b6000805b600254811015610af257600060028281548110610a4757610a476126da565b60009182526020909120600460079092020181015460ff1690811115610a6f57610a6f61254e565b148015610a8d5750610a8d6002828154811061049b5761049b6126da565b15610ae0578260028281548110610aa657610aa66126da565b906000526020600020906007020160040160016101000a8154816001600160a01b0302191690836001600160a01b03160217905550600191505b80610aea81612740565b915050610a28565b50806106155760405162461bcd60e51b815260040161046e90612759565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b585760405162461bcd60e51b815260040161046e906126b2565b6000805b600254811015610bc157610b7c6002828154811061049b5761049b6126da565b15610baf578260028281548110610b9557610b956126da565b906000526020600020906007020160020181905550600191505b80610bb981612740565b915050610b5c565b5080610bdf5760405162461bcd60e51b815260040161046e90612759565b7f00000000000000000000000000000000000000000000000000000000000000006105c7610c8a565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c505760405162461bcd60e51b815260040161046e906126b2565b6002604051806101000160405280878152602001868152602001858152602001600081526020016000600481111561069c5761069c61254e565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610cd45760405162461bcd60e51b815260040161046e906126b2565b6000805b60025481101561082b5760028181548110610cf557610cf56126da565b90600052602060002090600702016002015482610d12919061289e565b915080610d1e81612740565b915050610cd8565b60028181548110610d3657600080fd5b9060005260206000209060070201600091509050806000018054610d59906126f0565b80601f0160208091040260200160405190810160405280929190818152602001828054610d85906126f0565b8015610dd25780601f10610da757610100808354040283529160200191610dd2565b820191906000526020600020905b815481529060010190602001808311610db557829003601f168201915b505050506001830154600284015460038501546004860154600587015460069097015495969395929450909260ff808316936101009093046001600160a01b0316921688565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e625760405162461bcd60e51b815260040161046e906126b2565b60005b6002548110156109d257600060028281548110610e8457610e846126da565b9060005260206000209060070201600101541115610f2557600061271060028381548110610eb457610eb46126da565b90600052602060002090600702016001015485610ed191906128b1565b610edb91906128c8565b90508060028381548110610ef157610ef16126da565b90600052602060002090600702016003016000828254610f11919061289e565b90915550610f21905081856128ea565b9350505b80610f2f81612740565b915050610e65565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f7f5760405162461bcd60e51b815260040161046e906126b2565b600054600160a01b900460ff1615610fcc5760405162461bcd60e51b815260206004820152601060248201526f616c7265616479207377617070696e6760801b604482015260640161046e565b6000805460ff60a01b1916600160a01b17815560408051600280825260608201835290916020830190803683370190505090507f000000000000000000000000000000000000000000000000000000000000000081600081518110611033576110336126da565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611087576110876126da565b6001600160a01b03909216602092830291909101909101527f00000000000000000000000000000000000000000000000000000000000000006000805b6002548110156111f95760028082815481106110e2576110e26126da565b60009182526020909120600460079092020181015460ff169081111561110a5761110a61254e565b036111855760006002808381548110611125576111256126da565b90600052602060002090600702016003015461114191906128c8565b90508060028381548110611157576111576126da565b90600052602060002090600702016003015461117391906128ea565b61117d908461289e565b9250506111e7565b60028181548110611198576111986126da565b600091825260209091206006600790920201015460ff16156111e757600281815481106111c7576111c76126da565b906000526020600020906007020160030154826111e4919061289e565b91505b806111f181612740565b9150506110c4565b5061120482826122a2565b90508061121183836122a2565b146112a1577fde3142f93c040ab4be0d03a16ac06c502816c1205865dd41d9848727102570d16040516112919060208082526033908201527f496e73756666696369656e7420746f6b656e7320746f20737761702e20506c6560408201527261736520616464206d6f726520746f6b656e7360681b606082015260800190565b60405180910390a1505050611f67565b600080546001600160a01b03166318cbafe5838387306112c34261012c61289e565b6040518663ffffffff1660e01b81526004016112e39594939291906128fd565b6000604051808303816000875af1158015611302573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261132a919081019061296e565b9050600047905081600081518110611344576113446126da565b602002602001015183141580611374575081600181518110611368576113686126da565b60200260200101518114155b156113ef577fde3142f93c040ab4be0d03a16ac06c502816c1205865dd41d9848727102570d16040516113e69060208082526025908201527f556e657870656374656420616d6f756e74732072657475726e65642066726f6d604082015264020737761760dc1b606082015260800190565b60405180910390a15b8060005b6002548110156116335760028181548110611410576114106126da565b600091825260209091206006600790920201015460ff168061146b57506002808281548110611441576114416126da565b60009182526020909120600460079092020181015460ff16908111156114695761146961254e565b145b156116215760025461147f906001906128ea565b81036114b3578160028281548110611499576114996126da565b906000526020600020906007020160050181905550611621565b60028082815481106114c7576114c76126da565b60009182526020909120600460079092020181015460ff16908111156114ef576114ef61254e565b036115ac576000600280838154811061150a5761150a6126da565b90600052602060002090600702016003015461152691906128c8565b9050600086826002858154811061153f5761153f6126da565b90600052602060002090600702016003015461155b91906128ea565b61156590876128b1565b61156f91906128c8565b90508060028481548110611585576115856126da565b60009182526020909120600560079092020101556115a381856128ea565b93505050611621565b600085600283815481106115c2576115c26126da565b906000526020600020906007020160030154856115df91906128b1565b6115e991906128c8565b905080600283815481106115ff576115ff6126da565b600091825260209091206005600790920201015561161d81846128ea565b9250505b8061162b81612740565b9150506113f3565b5060005b600254811015611f2257600060028281548110611656576116566126da565b60009182526020909120600460079092020181015460ff169081111561167e5761167e61254e565b036118305760028181548110611696576116966126da565b600091825260209091206006600790920201015460ff161561174c57600281815481106116c5576116c56126da565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166001600160a01b03166108fc60028381548110611709576117096126da565b9060005260206000209060070201600501549081150290604051600060405180830381858888f19350505050158015611746573d6000803e3d6000fd5b50611ebd565b856001600160a01b031663a9059cbb6002838154811061176e5761176e6126da565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166117c189600286815481106117aa576117aa6126da565b9060005260206000209060070201600301546122a2565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af115801561180c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117469190612a14565b600360028281548110611845576118456126da565b60009182526020909120600460079092020181015460ff169081111561186d5761186d61254e565b03611a7e5760028181548110611885576118856126da565b600091825260209091206006600790920201015460ff16156118b457600281815481106116c5576116c56126da565b856001600160a01b031663095ea7b3600283815481106118d6576118d66126da565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166002848154811061190e5761190e6126da565b60009182526020909120600360079092020101546040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af115801561196d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119919190612a14565b50600281815481106119a5576119a56126da565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166001600160a01b0316634ec109f47f000000000000000000000000000000000000000000000000000000000000000030611a118a600287815481106117aa576117aa6126da565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064015b600060405180830381600087803b158015611a6157600080fd5b505af1158015611a75573d6000803e3d6000fd5b50505050611ebd565b600160028281548110611a9357611a936126da565b60009182526020909120600460079092020181015460ff1690811115611abb57611abb61254e565b03611c325760028181548110611ad357611ad36126da565b600091825260209091206006600790920201015460ff1615611ba35760028181548110611b0257611b026126da565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166001600160a01b031663db6b524660028381548110611b4857611b486126da565b9060005260206000209060070201600501546040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b8557600080fd5b505af1158015611b99573d6000803e3d6000fd5b5050505050611ebd565b60028181548110611bb657611bb66126da565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166001600160a01b031663338b5dea30611c0189600286815481106117aa576117aa6126da565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401611a47565b600460028281548110611c4757611c476126da565b60009182526020909120600460079092020181015460ff1690811115611c6f57611c6f61254e565b03611cd8577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166342966c68611cba88600285815481106117aa576117aa6126da565b6040518263ffffffff1660e01b8152600401611a4791815260200190565b6002808281548110611cec57611cec6126da565b60009182526020909120600460079092020181015460ff1690811115611d1457611d1461254e565b03611ebd57600060028281548110611d2e57611d2e6126da565b9060005260206000209060070201600501541115611ebd576000611d81876002808581548110611d6057611d606126da565b906000526020600020906007020160030154611d7c91906128c8565b6122a2565b600054600280549293506001600160a01b039091169163f305d719919085908110611dae57611dae6126da565b9060005260206000209060070201600501547f00000000000000000000000000000000000000000000000000000000000000008460008060028981548110611df857611df86126da565b600091825260209091206007909102016004015461010090046001600160a01b0316611e264261012c61289e565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c40160606040518083038185885af1158015611e93573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611eb89190612a31565b505050505b600060028281548110611ed257611ed26126da565b906000526020600020906007020160030181905550600060028281548110611efc57611efc6126da565b600091825260209091206005600790920201015580611f1a81612740565b915050611637565b5060408051858152602081018490527f5e20c9aee521e656eed033c4ae35378c79c584706f5ce7f410ab3fba389607a1910160405180910390a1505042600155505050505b6000805460ff60a01b19169055565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611fbe5760405162461bcd60e51b815260040161046e906126b2565b60026040518061010001604052808681526020018581526020018481526020016000815260200160026004811115611ff857611ff861254e565b81526001600160a01b038416602080830191909152600060408301819052606090920182905283546001810185559382529020815191926007020190819061204090826127de565b5060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff021916908360048111156120895761208961254e565b021790555060a0820151600482018054610100600160a81b0319166101006001600160a01b039093169290920291909117905560c0820151600582015560e0909101516006909101805460ff191691151591909117905550505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461212e5760405162461bcd60e51b815260040161046e906126b2565b6002604051806101000160405280858152602001848152602001838152602001600081526020016004808111156121675761216761254e565b81526000602080830182905260408301829052606090920181905283546001810185559381522081519192600702019081906121a390826127de565b5060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff021916908360048111156121ec576121ec61254e565b021790555060a0820151600482018054610100600160a81b0319166101006001600160a01b039093169290920291909117905560c0820151600582015560e0909101516006909101805460ff1916911515919091179055505050565b60008160405160200161225b9190612a5f565b60405160208183030381529060405280519060200120836040516020016122829190612a5f565b604051602081830303815290604052805190602001201490505b92915050565b6040516370a0823160e01b815230600482015260009081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156122eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061230f9190612a7b565b905082811115612322578291505061229c565b9392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561236857612368612329565b604052919050565b600082601f83011261238157600080fd5b813567ffffffffffffffff81111561239b5761239b612329565b6123ae601f8201601f191660200161233f565b8181528460208386010111156123c357600080fd5b816020850160208301376000918101602001919091529392505050565b600080604083850312156123f357600080fd5b823567ffffffffffffffff81111561240a57600080fd5b61241685828601612370565b95602094909401359450505050565b80356001600160a01b03811681146109d757600080fd5b801515811461244a57600080fd5b50565b600080600080600060a0868803121561246557600080fd5b853567ffffffffffffffff81111561247c57600080fd5b61248888828901612370565b95505060208601359350604086013592506124a560608701612425565b915060808601356124b58161243c565b809150509295509295909350565b6000602082840312156124d557600080fd5b5035919050565b600080604083850312156124ef57600080fd5b823567ffffffffffffffff81111561250657600080fd5b61251285828601612370565b92505061252160208401612425565b90509250929050565b60005b8381101561254557818101518382015260200161252d565b50506000910152565b634e487b7160e01b600052602160045260246000fd5b60006101008083528a51808285015261012091506125888183860160208f0161252a565b602084018b9052604084018a905260608401899052601f01601f19168301019050600586106125c757634e487b7160e01b600052602160045260246000fd5b8560808301526125e260a08301866001600160a01b03169052565b8360c08301526125f660e083018415159052565b9998505050505050505050565b6000806000806080858703121561261957600080fd5b843567ffffffffffffffff81111561263057600080fd5b61263c87828801612370565b945050602085013592506040850135915061265960608601612425565b905092959194509250565b60008060006060848603121561267957600080fd5b833567ffffffffffffffff81111561269057600080fd5b61269c86828701612370565b9660208601359650604090950135949350505050565b6020808252600e908201526d6e6f207065726d697373696f6e7360901b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b600181811c9082168061270457607f821691505b60208210810361272457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000600182016127525761275261272a565b5060010190565b6020808252601c908201527f636f756c64206e6f742066696e642074617820746f2075706461746500000000604082015260600190565b601f82111561061557600081815260208120601f850160051c810160208610156127b75750805b601f850160051c820191505b818110156127d6578281556001016127c3565b505050505050565b815167ffffffffffffffff8111156127f8576127f8612329565b61280c8161280684546126f0565b84612790565b602080601f83116001811461284157600084156128295750858301515b600019600386901b1c1916600185901b1785556127d6565b600085815260208120601f198616915b8281101561287057888601518255948401946001909101908401612851565b508582101561288e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8082018082111561229c5761229c61272a565b808202811582820484141761229c5761229c61272a565b6000826128e557634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561229c5761229c61272a565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561294d5784516001600160a01b031683529383019391830191600101612928565b50506001600160a01b03969096166060850152505050608001529392505050565b6000602080838503121561298157600080fd5b825167ffffffffffffffff8082111561299957600080fd5b818501915085601f8301126129ad57600080fd5b8151818111156129bf576129bf612329565b8060051b91506129d084830161233f565b81815291830184019184810190888411156129ea57600080fd5b938501935b83851015612a08578451825293850193908501906129ef565b98975050505050505050565b600060208284031215612a2657600080fd5b81516123228161243c565b600080600060608486031215612a4657600080fd5b8351925060208401519150604084015190509250925092565b60008251612a7181846020870161252a565b9190910192915050565b600060208284031215612a8d57600080fd5b505191905056fea264697066735822122009de8d6412ad4917f67dec9c7cd373ebba0d4df7b0bfab5ab0aa8551ff2c5c4864736f6c63430008110033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106104545760003560e01c80636a092e7911610241578063b0ad3ebf1161013b578063d3b0066f116100c3578063e79d416011610087578063e79d4160146109d9578063e948474b146109e2578063ede49a1914610a05578063f19fffcb14610a19578063f1f5cd9114610a2d57600080fd5b8063d3b0066f14610951578063db38a41d14610964578063dba61c5814610984578063dd62ed3e1461098d578063e5a82979146109c657600080fd5b8063c552f4c51161010a578063c552f4c514610911578063cc1776d314610924578063d00efb2f1461092c578063d2d7ad8314610935578063d31acb281461093e57600080fd5b8063b0ad3ebf146108bf578063c20c5caf146108e2578063c2ed286b146108f5578063c4a5abcd1461090857600080fd5b80638091f3bf116101c957806395d89b411161018d57806395d89b411461085b578063989763ef14610863578063a457c2d714610886578063a6f9dae114610899578063a9059cbb146108ac57600080fd5b80638091f3bf146107e657806381045345146107fa578063870333e01461080d57806389d53c01146108305780638da5cb5b1461084357600080fd5b8063715018a611610210578063715018a6146107975780637412dbb31461079f578063751039fc146107c2578063790ca413146107ca57806379cc6790146107d357600080fd5b80636a092e791461073f5780636b8f2f3b146107525780636f8645521461076657806370a082311461076e57600080fd5b806336827499116103525780634fbc2775116102da5780635d90bbaf1161029e5780635d90bbaf146106f55780635d9d7d43146107085780635e45da231461071b5780636331bf65146107245780636508c57e1461072c57600080fd5b80634fbc27751461069557806352c6dbc4146106a85780635543379a146106bc578063570ca735146106cf578063583dd79d146106e257600080fd5b806345541cba1161032157806345541cba146106565780634c43e3071461065f5780634cf49dd7146106675780634f7041a51461067a5780634f72e2a21461068257600080fd5b8063368274991461060a578063395093511461061d578063407133d21461063057806342966c681461064357600080fd5b806318551108116103e05780632b750627116103a45780632b750627146105885780632dcb5199146105ab57806330bd85c5146105b4578063313ce567146105c85780633164df8b146105e757600080fd5b806318551108146105225780631e19ae77146105475780631f4a6d321461055a57806323b872dd1461056257806328be90381461057557600080fd5b8063095ea7b311610427578063095ea7b3146104b45780630ab9e6a0146104c75780630f3a325f146104da5780631776834a146104fd57806318160ddd1461051057600080fd5b806301339c2114610459578063064a59d01461046357806306fdde031461048c57806307a1cfbd146104a1575b600080fd5b610461610a35565b005b60075461047790600160a01b900460ff1681565b60405190151581526020015b60405180910390f35b610494610a77565b6040516104839190612bc9565b6104616104af366004612c86565b610b05565b6104776104c2366004612ce7565b610b9c565b6104616104d5366004612d11565b610c90565b6104776104e8366004612d2a565b60126020526000908152604090205460ff1681565b61046161050b366004612d11565b610cc4565b6002545b604051908152602001610483565b6016546001600160a01b03165b6040516001600160a01b039091168152602001610483565b610461610555366004612d53565b610cf8565b610461610d52565b610477610570366004612d8a565b610d90565b610461610583366004612d53565b610ebb565b610477610596366004612d2a565b60136020526000908152604090205460ff1681565b610514601c5481565b600b5461047790600160c01b900460ff1681565b6006546105d59060ff1681565b60405160ff9091168152602001610483565b6104776105f5366004612d2a565b60156020526000908152604090205460ff1681565b610461610618366004612dc6565b610f15565b61047761062b366004612ce7565b610f62565b600b5461052f906001600160a01b031681565b610461610651366004612d11565b611076565b610514600c5481565b6104616110d8565b610477610675366004612d2a565b6111c4565b61051461120b565b610461610690366004612dc6565b61127e565b6104616106a3366004612d53565b6112cb565b600b5461047790600160b01b900460ff1681565b6104616106ca366004612dc6565b611325565b60075461052f906001600160a01b031681565b6104616106f0366004612de3565b611372565b610461610703366004612d53565b6113bb565b610461610716366004612d53565b611415565b610514600e5481565b61051461146f565b61046161073a366004612c86565b61148e565b61047761074d366004612e31565b6114ef565b60165461047790600160a01b900460ff1681565b61051461160b565b61051461077c366004612d2a565b6001600160a01b031660009081526020819052604090205490565b610461611620565b6104776107ad366004612d2a565b600a6020526000908152604090205460ff1681565b61046161169f565b610514600f5481565b6104616107e1366004612ce7565b6116da565b60075461047790600160a81b900460ff1681565b610461610808366004612d11565b61180a565b61047761081b366004612d2a565b601b6020526000908152604090205460ff1681565b61046161083e366004612dc6565b61183e565b60065461052f9061010090046001600160a01b031681565b6104946118e4565b610477610871366004612d2a565b60196020526000908152604090205460ff1681565b610477610894366004612ce7565b6118f1565b6104616108a7366004612d2a565b6119c0565b6104776108ba366004612ce7565b611a66565b6104776108cd366004612d2a565b60086020526000908152604090205460ff1681565b6104616108f0366004612d11565b611af5565b610461610903366004612d53565b611b29565b610514600d5481565b61046161091f366004612dc6565b611c01565b610514611c4e565b61051460105481565b61051460185481565b61046161094c366004612e5b565b611c98565b61046161095f366004612d2a565b611cd2565b610514610972366004612d2a565b60146020526000908152604090205481565b61051460175481565b61051461099b366004612e31565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6104616109d4366004612d53565b611d98565b61051460115481565b6104776109f0366004612d2a565b60096020526000908152604090205460ff1681565b600b5461047790600160a81b900460ff1681565b600b5461047790600160b81b900460ff1681565b610514611df2565b60065461010090046001600160a01b03163314610a6d5760405162461bcd60e51b8152600401610a6490612e7d565b60405180910390fd5b610a75611f04565b565b60058054610a8490612ec5565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab090612ec5565b8015610afd5780601f10610ad257610100808354040283529160200191610afd565b820191906000526020600020905b815481529060010190602001808311610ae057829003601f168201915b505050505081565b60065461010090046001600160a01b03163314610b345760405162461bcd60e51b8152600401610a6490612e7d565b6016546040516307a1cfbd60e01b81526001600160a01b03909116906307a1cfbd90610b669085908590600401612eff565b600060405180830381600087803b158015610b8057600080fd5b505af1158015610b94573d6000803e3d6000fd5b505050505050565b6007546000903390600160a01b900460ff168015610bc35750600754600160a81b900460ff165b80610be057506006546001600160a01b0382811661010090920416145b80610bfa57503360009081526008602052604090205460ff165b610c165760405162461bcd60e51b8152600401610a6490612f21565b6001600160a01b038416610c3c5760405162461bcd60e51b8152600401610a6490612f4e565b3360008181526001602090815260408083206001600160a01b038916808552908352928190208790555186815291929160008051602061309483398151915291015b60405180910390a35060019392505050565b60065461010090046001600160a01b03163314610cbf5760405162461bcd60e51b8152600401610a6490612e7d565b601c55565b60065461010090046001600160a01b03163314610cf35760405162461bcd60e51b8152600401610a6490612e7d565b600e55565b60065461010090046001600160a01b03163314610d275760405162461bcd60e51b8152600401610a6490612e7d565b6001600160a01b03919091166000908152601560205260409020805460ff1916911515919091179055565b60075460405147916001600160a01b03169082156108fc029083906000818181858888f19350505050158015610d8c573d6000803e3d6000fd5b5050565b6007546000908490600160a01b900460ff168015610db75750600754600160a81b900460ff165b80610dd457506006546001600160a01b0382811661010090920416145b80610dee57503360009081526008602052604090205460ff165b610e0a5760405162461bcd60e51b8152600401610a6490612f21565b6001600160a01b0385166000908152600160209081526040808320338452909152902054610e39908490612f9b565b6001600160a01b0386166000908152600160209081526040808320338452909152902055610e68858585611f45565b6001600160a01b03851660008181526001602090815260408083203380855290835292819020549051908152919291600080516020613094833981519152910160405180910390a3506001949350505050565b60065461010090046001600160a01b03163314610eea5760405162461bcd60e51b8152600401610a6490612e7d565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b03163314610f445760405162461bcd60e51b8152600401610a6490612e7d565b600b8054911515600160b81b0260ff60b81b19909216919091179055565b6007546000903390600160a01b900460ff168015610f895750600754600160a81b900460ff165b80610fa657506006546001600160a01b0382811661010090920416145b80610fc057503360009081526008602052604090205460ff165b610fdc5760405162461bcd60e51b8152600401610a6490612f21565b6001600160a01b0384166110025760405162461bcd60e51b8152600401610a6490612f4e565b3360009081526001602090815260408083206001600160a01b0388168452909152902054611031908490612fae565b3360008181526001602090815260408083206001600160a01b038a16808552908352928190208590555193845290926000805160206130948339815191529101610c7e565b3360009081526015602052604090205460ff166110cb5760405162461bcd60e51b81526020600482015260136024820152726e6f206275726e207065726d697373696f6e7360681b6044820152606401610a64565b6110d53382612156565b50565b600754600160a81b900460ff166111435760405162461bcd60e51b815260206004820152602960248201527f63616e206f6e6c792062652063616c6c6564206f6e636520746f6b656e206973604482015268081b185d5b98da195960ba1b6064820152608401610a64565b6007546001600160a01b0316331461115a57600080fd5b601660009054906101000a90046001600160a01b03166001600160a01b031663e4fc6b6d6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156111aa57600080fd5b505af11580156111be573d6000803e3d6000fd5b50505050565b6001600160a01b0381166000908152601b602052604081205460ff16806112055750601c546001600160a01b03831660009081526020819052604090205410155b92915050565b60165460408051631296b91d60e11b815290516000926001600160a01b03169163252d723a9160048083019260209291908290030181865afa158015611255573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112799190612fc1565b905090565b60065461010090046001600160a01b031633146112ad5760405162461bcd60e51b8152600401610a6490612e7d565b60168054911515600160a01b0260ff60a01b19909216919091179055565b60065461010090046001600160a01b031633146112fa5760405162461bcd60e51b8152600401610a6490612e7d565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b031633146113545760405162461bcd60e51b8152600401610a6490612e7d565b600b8054911515600160b01b0260ff60b01b19909216919091179055565b6007546001600160a01b0316331461138957600080fd5b60165460405163583dd79d60e01b81526001600160a01b039091169063583dd79d90610b669085908590600401612fda565b60065461010090046001600160a01b031633146113ea5760405162461bcd60e51b8152600401610a6490612e7d565b6001600160a01b03919091166000908152601260205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b031633146114445760405162461bcd60e51b8152600401610a6490612e7d565b6001600160a01b03919091166000908152601360205260409020805460ff1916911515919091179055565b6000612710600d546002546114849190613004565b611279919061301b565b60065461010090046001600160a01b031633146114bd5760405162461bcd60e51b8152600401610a6490612e7d565b60165460405163328462bf60e11b81526001600160a01b0390911690636508c57e90610b669085908590600401612eff565b60065460009061010090046001600160a01b031633146115215760405162461bcd60e51b8152600401610a6490612e7d565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015611568573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158c9190612fc1565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb906044016020604051808303816000875af11580156115df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611603919061303d565b949350505050565b6000612710600c546002546114849190613004565b60065461010090046001600160a01b0316331461164f5760405162461bcd60e51b8152600401610a6490612e7d565b60065460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360068054610100600160a81b0319169055565b60065461010090046001600160a01b031633146116ce5760405162461bcd60e51b8152600401610a6490612e7d565b6000600d819055600c55565b3360009081526015602052604090205460ff1661172f5760405162461bcd60e51b81526020600482015260136024820152726e6f206275726e207065726d697373696f6e7360681b6044820152606401610a64565b6001600160a01b038216600090815260016020908152604080832033845290915290205481811061178d576117648282612f9b565b6001600160a01b03841660009081526001602090815260408083203384529091529020556117b2565b6001600160a01b03831660009081526001602090815260408083203384529091528120555b6117bc8383612156565b6001600160a01b0383166000818152600160209081526040808320338085529083529281902054905190815291929160008051602061309483398151915291015b60405180910390a3505050565b60065461010090046001600160a01b031633146118395760405162461bcd60e51b8152600401610a6490612e7d565b600d55565b60065461010090046001600160a01b0316331461186d5760405162461bcd60e51b8152600401610a6490612e7d565b600b54600160a01b900460ff166118c65760405162461bcd60e51b815260206004820152601f60248201527f70696e6b20616e746920626f74206973206e6f7420636f6e66696775726564006044820152606401610a64565b600b8054911515600160c01b0260ff60c01b19909216919091179055565b60048054610a8490612ec5565b6007546000903390600160a01b900460ff1680156119185750600754600160a81b900460ff165b8061193557506006546001600160a01b0382811661010090920416145b8061194f57503360009081526008602052604090205460ff165b61196b5760405162461bcd60e51b8152600401610a6490612f21565b6001600160a01b0384166119915760405162461bcd60e51b8152600401610a6490612f4e565b3360009081526001602090815260408083206001600160a01b0388168452909152902054611031908490612f9b565b60065461010090046001600160a01b031633146119ef5760405162461bcd60e51b8152600401610a6490612e7d565b6001600160a01b038116611a3e5760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b6044820152606401610a64565b600680546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6007546000903390600160a01b900460ff168015611a8d5750600754600160a81b900460ff165b80611aaa57506006546001600160a01b0382811661010090920416145b80611ac457503360009081526008602052604090205460ff165b611ae05760405162461bcd60e51b8152600401610a6490612f21565b611aeb338585611f45565b5060019392505050565b60065461010090046001600160a01b03163314611b245760405162461bcd60e51b8152600401610a6490612e7d565b600c55565b60065461010090046001600160a01b03163314611b585760405162461bcd60e51b8152600401610a6490612e7d565b6001600160a01b0382166000908152600a602052604090205460ff161580611b7e575080155b611bd65760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74206578636c75646520616e2065786368616e67652066726f6d206044820152620e8c2f60eb1b6064820152608401610a64565b6001600160a01b03919091166000908152601960205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b03163314611c305760405162461bcd60e51b8152600401610a6490612e7d565b600b8054911515600160a81b0260ff60a81b19909216919091179055565b6016546040805163585e42ef60e11b815290516000926001600160a01b03169163b0bc85de9160048083019260209291908290030181865afa158015611255573d6000803e3d6000fd5b60065461010090046001600160a01b03163314611cc75760405162461bcd60e51b8152600401610a6490612e7d565b601891909155601755565b60065461010090046001600160a01b03163314611d015760405162461bcd60e51b8152600401610a6490612e7d565b600b80546001600160a01b0319166001600160a01b038381169182179092556006546040516318e02bd960e01b81526101009091049092166004830152906318e02bd990602401600060405180830381600087803b158015611d6257600080fd5b505af1158015611d76573d6000803e3d6000fd5b5050600b805464ff000000ff60a01b191664010000000160a01b179055505050565b60065461010090046001600160a01b03163314611dc75760405162461bcd60e51b8152600401610a6490612e7d565b6001600160a01b03919091166000908152601b60205260409020805460ff1916911515919091179055565b600754600090600160a81b900460ff1615611e2457600360105443611e179190612f9b565b1015611e245750611edc90565b50600090565b6001600160a01b0381166000908152601960205260409020805460ff191660011790556110d5815b6001600160a01b0381166000908152601560205260409020805460ff191660011790556110d5815b6001600160a01b0381166000908152601360205260409020805460ff191660011790556110d5815b60068054610100600160a81b0319166101006001600160a01b0393841681029190911780835581900483166000908152600860205260409020805460ff19166001179055905460078054929091049092166001600160a01b0319909116179055565b60065461010090046001600160a01b03163314611f335760405162461bcd60e51b8152600401610a6490612e7d565b611f3b6121df565b42600f5543601055565b6001600160a01b038216611f945760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b6044820152606401610a64565b6001600160a01b03831660009081526009602052604090205460ff1615611ffd5760405162461bcd60e51b815260206004820152601e60248201527f61646472657373206973206e6f7420616c6c6f77656420746f2073656c6c00006044820152606401610a64565b60035460ff161561209b576001600160a01b03831660009081526020819052604090205461202c908290612f9b565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461205c908290612fae565b6001600160a01b0383811660008181526020818152604091829020949094555184815290929186169160008051602061307483398151915291016117fd565b6120a6838383612223565b60006120b384848461222e565b6001600160a01b0385166000908152602081905260409020549091506120da908390612f9b565b6001600160a01b03808616600090815260208190526040808220939093559085168152205461210a908290612fae565b6001600160a01b03848116600081815260208181526040918290209490945551848152909291871691600080516020613074833981519152910160405180910390a36111be565b505050565b6001600160a01b03821661216957600080fd5b806002546121779190612f9b565b6002556001600160a01b03821660009081526020819052604090205461219e908290612f9b565b6001600160a01b0383166000818152602081815260408083209490945592518481529092600080516020613074833981519152910160405180910390a35050565b60065461010090046001600160a01b0316331461220e5760405162461bcd60e51b8152600401610a6490612e7d565b6007805460ff60a81b1916600160a81b179055565b61215183838361223b565b60006116038484846123db565b600754600160a81b900460ff16801561225d5750601654600160a01b900460ff165b801561228157506001600160a01b0382166000908152600a602052604090205460ff165b801561229b575042601a54600a6122989190612fae565b11155b80156122c357506018546016546001600160a01b031660009081526020819052604090205410155b80156122e857506001600160a01b03831660009081526019602052604090205460ff16155b80156123685750601660009054906101000a90046001600160a01b03166001600160a01b031663d83067866040518163ffffffff1660e01b8152600401602060405180830381865afa158015612342573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612366919061303d565b155b156123d05742601a556016546040805163e4fc6b6d60e01b815290516001600160a01b039092169163e4fc6b6d9160048082019260009290919082900301818387803b1580156123b757600080fd5b505af11580156123cb573d6000803e3d6000fd5b505050505b6121518383836125fe565b6001600160a01b038316600090815260196020526040812054829060ff1615801561241f57506001600160a01b03841660009081526019602052604090205460ff16155b80156124345750600754600160a81b900460ff165b15612563576001600160a01b0385166000908152600a602052604090205460ff16156124d05760165460405163db017dc760e01b8152600481018590526001600160a01b039091169063db017dc7906024016020604051808303816000875af11580156124a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124c99190612fc1565b9050612563565b6001600160a01b0384166000908152600a602052604090205460ff161561256357601654604051634fa26fd560e01b8152600481018590526001600160a01b0390911690634fa26fd5906024016020604051808303816000875af115801561253c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125609190612fc1565b90505b600061256f8285612f9b565b905080156125e9576016546001600160a01b031660009081526020819052604090205461259d908290612fae565b601680546001600160a01b039081166000908152602081815260409182902094909455915491518481529181169290891691600080516020613074833981519152910160405180910390a35b6125f4868684612a2f565b9695505050505050565b600b54600160a81b900460ff16158061262757503360009081526012602052604090205460ff16155b6126655760405162461bcd60e51b815260206004820152600f60248201526e1cdb9a5c195c881c995a9958dd1959608a1b6044820152606401610a64565b600754600160a81b900460ff16801561269157506006546001600160a01b038481166101009092041614155b80156126b657506001600160a01b03831660009081526013602052604090205460ff16155b80156126db57506001600160a01b03821660009081526013602052604090205460ff16155b1561215157600e541561273a57600e545a111561273a5760405162461bcd60e51b815260206004820152601e60248201527f74686973206973206f76657220746865206d617820676173206c696d697400006044820152606401610a64565b6000600d5411801561276557506001600160a01b0382166000908152600a602052604090205460ff16155b156127e45761277261146f565b6001600160a01b038316600090815260208190526040902054612796908390612fae565b11156127e45760405162461bcd60e51b815260206004820181905260248201527f74686973206973206f76657220746865206d617820686f6c6420616d6f756e746044820152606401610a64565b6000600c5411801561280e57506001600160a01b0382166000908152600a602052604090205460ff165b1561286a5761281b61160b565b81111561286a5760405162461bcd60e51b815260206004820181905260248201527f74686973206973206f76657220746865206d61782073656c6c20616d6f756e746044820152606401610a64565b600b54600160b01b900460ff16156129aa576001600160a01b0382166000908152601460205260409020544390036128d3576001600160a01b0382166000908152601260205260408120805460ff1916600117905560118054916128cd8361305a565b91905055505b6001600160a01b03831660009081526014602052604090205443900361292a576001600160a01b0383166000908152601260205260408120805460ff1916600117905560118054916129248361305a565b91905055505b6001600160a01b0382166000908152600a602052604081205460ff161515900361296a576001600160a01b03821660009081526014602052604090204390555b6001600160a01b0383166000908152600a602052604081205460ff16151590036129aa576001600160a01b03831660009081526014602052604090204390555b600b54600160c01b900460ff161561215157600b5460405163090ec10b60e31b81526001600160a01b03858116600483015284811660248301526044820184905290911690634876085890606401600060405180830381600087803b158015612a1257600080fd5b505af1158015612a26573d6000803e3d6000fd5b50505050505050565b6007546000908290600160a81b900460ff168015612a565750600b54600160b81b900460ff165b15612b05576006546001600160a01b038681166101009092041614801590612a8557506000612a83611df2565b115b8015612aaa57506001600160a01b03851660009081526013602052604090205460ff16155b8015612acf57506001600160a01b03841660009081526013602052604090205460ff16155b15612b05576000612710612ae1611df2565b612aeb9086613004565b612af5919061301b565b9050612b018183612f9b565b9150505b612b10858583612b19565b95945050505050565b6000826001600160a01b0316846001600160a01b031603612b7c5760405162461bcd60e51b815260206004820152601f60248201527f796f752063616e6e6f74207472616e7366657220746f20796f757273656c66006044820152606401610a64565b5092915050565b6000815180845260005b81811015612ba957602081850181015186830182015201612b8d565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000612bdc6020830184612b83565b9392505050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112612c0a57600080fd5b813567ffffffffffffffff80821115612c2557612c25612be3565b604051601f8301601f19908116603f01168101908282118183101715612c4d57612c4d612be3565b81604052838152866020858801011115612c6657600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060408385031215612c9957600080fd5b823567ffffffffffffffff811115612cb057600080fd5b612cbc85828601612bf9565b95602094909401359450505050565b80356001600160a01b0381168114612ce257600080fd5b919050565b60008060408385031215612cfa57600080fd5b612d0383612ccb565b946020939093013593505050565b600060208284031215612d2357600080fd5b5035919050565b600060208284031215612d3c57600080fd5b612bdc82612ccb565b80151581146110d557600080fd5b60008060408385031215612d6657600080fd5b612d6f83612ccb565b91506020830135612d7f81612d45565b809150509250929050565b600080600060608486031215612d9f57600080fd5b612da884612ccb565b9250612db660208501612ccb565b9150604084013590509250925092565b600060208284031215612dd857600080fd5b8135612bdc81612d45565b60008060408385031215612df657600080fd5b823567ffffffffffffffff811115612e0d57600080fd5b612e1985828601612bf9565b925050612e2860208401612ccb565b90509250929050565b60008060408385031215612e4457600080fd5b612e4d83612ccb565b9150612e2860208401612ccb565b60008060408385031215612e6e57600080fd5b50508035926020909101359150565b60208082526028908201527f63616e206f6e6c792062652063616c6c65642062792074686520636f6e74726160408201526731ba1037bbb732b960c11b606082015260800190565b600181811c90821680612ed957607f821691505b602082108103612ef957634e487b7160e01b600052602260045260246000fd5b50919050565b604081526000612f126040830185612b83565b90508260208301529392505050565b6020808252601390820152721d1c98591a5b99c81b9bdd08195b98589b1959606a1b604082015260600190565b6020808252601c908201527f63616e6e6f7420617070726f7665207468652030206164647265737300000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8181038181111561120557611205612f85565b8082018082111561120557611205612f85565b600060208284031215612fd357600080fd5b5051919050565b604081526000612fed6040830185612b83565b905060018060a01b03831660208301529392505050565b808202811582820484141761120557611205612f85565b60008261303857634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561304f57600080fd5b8151612bdc81612d45565b60006001820161306c5761306c612f85565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a2646970667358221220564e6fcff0ffb4006522df3bab422cc6b5e9a35ba524dea0c06e14cb47d00ba264736f6c63430008110033

Deployed Bytecode Sourcemap

41445:3155:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43382:100;;;:::i;:::-;;10359:35;;;;;-1:-1:-1;;;10359:35:0;;;;;;;;;179:14:1;;172:22;154:41;;142:2;127:18;10359:35:0;;;;;;;;10233:19;;;:::i;:::-;;;;;;;:::i;22791:143::-;;;;;;:::i;:::-;;:::i;13421:314::-;;;;;;:::i;:::-;;:::i;44489:108::-;;;;;;:::i;:::-;;:::i;36594:41::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;40957:98;;;;;;:::i;:::-;;:::i;11503:102::-;11585:12;;11503:102;;;3069:25:1;;;3057:2;3042:18;11503:102:0;2923:177:1;21937:114:0;22028:14;;-1:-1:-1;;;;;22028:14:0;21937:114;;;-1:-1:-1;;;;;3269:32:1;;;3251:51;;3239:2;3224:18;21937:114:0;3105:203:1;23712:113:0;;;;;;:::i;:::-;;:::i;17191:134::-;;;:::i;14208:328::-;;;;;;:::i;:::-;;:::i;17691:116::-;;;;;;:::i;:::-;;:::i;36642:46::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;41569:31;;;;;;36343:29;;;;;-1:-1:-1;;;36343:29:0;;;;;;10259:21;;;;;;;;;;;;4261:4:1;4249:17;;;4231:36;;4219:2;4204:18;10259:21:0;4089:184:1;23340:43:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;40417:113;;;;;;:::i;:::-;;:::i;15051:381::-;;;;;;:::i;:::-;;:::i;36139:31::-;;;;;-1:-1:-1;;;;;36139:31:0;;;23996:101;;;;;;:::i;:::-;;:::i;36385:27::-;;;;;;23133:136;;;:::i;44201:141::-;;;;;;:::i;:::-;;:::i;21745:102::-;;;:::i;22097:97::-;;;;;;:::i;:::-;;:::i;17558:121::-;;;;;;:::i;:::-;;:::i;36259:36::-;;;;;-1:-1:-1;;;36259:36:0;;;;;;40288:117;;;;;;:::i;:::-;;:::i;10329:23::-;;;;;-1:-1:-1;;;;;10329:23:0;;;22946:175;;;;;;:::i;:::-;;:::i;41067:109::-;;;;;;:::i;:::-;;:::i;41184:117::-;;;;;;:::i;:::-;;:::i;36453:26::-;;;;;;39411:113;;;:::i;22638:145::-;;;;;;:::i;:::-;;:::i;17335:211::-;;;;;;:::i;:::-;;:::i;19519:23::-;;;;;-1:-1:-1;;;19519:23:0;;;;;;39536:114;;;:::i;11822:119::-;;;;;;:::i;:::-;-1:-1:-1;;;;;11916:17:0;11889:7;11916:17;;;;;;;;;;;;11822:119;17043:140;;;:::i;10547:42::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;41309:105;;;:::i;36488:25::-;;;;;;24496:431;;;;;;:::i;:::-;;:::i;10401:20::-;;;;;-1:-1:-1;;;10401:20:0;;;;;;40845:100;;;;;;:::i;:::-;;:::i;41516:46::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;40542:179;;;;;;:::i;:::-;;:::i;10293:29::-;;;;;;;;-1:-1:-1;;;;;10293:29:0;;;10206:20;;;:::i;19639:48::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;15952:391;;;;;;:::i;:::-;;:::i;16889:146::-;;;;;;:::i;:::-;;:::i;12596:178::-;;;;;;:::i;:::-;;:::i;10434:47::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;40733:100;;;;;;:::i;:::-;;:::i;22202:225::-;;;;;;:::i;:::-;;:::i;36419:27::-;;;;;;40167:109;;;;;;:::i;:::-;;:::i;21543:104::-;;;:::i;36520:26::-;;;;;;19594:38;;;;;;22435:191;;;;;;:::i;:::-;;:::i;39918:237::-;;;;;;:::i;:::-;;:::i;36695:55::-;;;;;;:::i;:::-;;;;;;;;;;;;;;19549:38;;;;;;12281:144;;;;;;:::i;:::-;-1:-1:-1;;;;;12392:16:0;;;12365:7;12392:16;;;:8;:16;;;;;;;;:25;;;;;;;;;;;;;12281:144;44376:105;;;;;;:::i;:::-;;:::i;36553:28::-;;;;;;10488:52;;;;;;:::i;:::-;;;;;;;;;;;;;;;;36220:32;;;;;-1:-1:-1;;;36220:32:0;;;;;;36302:34;;;;;-1:-1:-1;;;36302:34:0;;;;;;39661:217;;;:::i;43382:100::-;10656:5;;;;;-1:-1:-1;;;;;10656:5:0;10642:10;:19;10634:72;;;;-1:-1:-1;;;10634:72:0;;;;;;;:::i;:::-;;;;;;;;;43460:14:::1;:12;:14::i;:::-;43382:100::o:0;10233:19::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22791:143::-;10656:5;;;;;-1:-1:-1;;;;;10656:5:0;10642:10;:19;10634:72;;;;-1:-1:-1;;;10634:72:0;;;;;;;:::i;:::-;22882:14:::1;::::0;:44:::1;::::0;-1:-1:-1;;;22882:44:0;;-1:-1:-1;;;;;22882:14:0;;::::1;::::0;:24:::1;::::0;:44:::1;::::0;22907:7;;22916:9;;22882:44:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;22791:143:::0;;:::o;13421:314::-;11055:16;;13524:4;;13503:10;;-1:-1:-1;;;11055:16:0;;;;:28;;;;-1:-1:-1;11075:8:0;;-1:-1:-1;;;11075:8:0;;;;11055:28;11054:47;;;-1:-1:-1;11096:5:0;;-1:-1:-1;;;;;11088:13:0;;;11096:5;;;;;11088:13;11054:47;:77;;;-1:-1:-1;11120:10:0;11105:26;;;;:14;:26;;;;;;;;11054:77;11046:109;;;;-1:-1:-1;;;11046:109:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13549:21:0;::::1;13541:62;;;;-1:-1:-1::0;;;13541:62:0::1;;;;;;;:::i;:::-;13625:10;13616:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;13616:29:0;::::1;::::0;;;;;;;;;;:37;;;13669:36;3069:25:1;;;13616:29:0;;13625:10;-1:-1:-1;;;;;;;;;;;13669:36:0;3042:18:1;13669:36:0::1;;;;;;;;-1:-1:-1::0;13723:4:0::1;::::0;13421:314;-1:-1:-1;;;13421:314:0:o;44489:108::-;10656:5;;;;;-1:-1:-1;;;;;10656:5:0;10642:10;:19;10634:72;;;;-1:-1:-1;;;10634:72:0;;;;;;;:::i;:::-;44564:16:::1;:25:::0;44489:108::o;40957:98::-;10656:5;;;;;-1:-1:-1;;;;;10656:5:0;10642:10;:19;10634:72;;;;-1:-1:-1;;;10634:72:0;;;;;;;:::i;:::-;41027:11:::1;:20:::0;40957:98::o;23712:113::-;10656:5;;;;;-1:-1:-1;;;;;10656:5:0;10642:10;:19;10634:72;;;;-1:-1:-1;;;10634:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23792:15:0;;;::::1;;::::0;;;:10:::1;:15;::::0;;;;:25;;-1:-1:-1;;23792:25:0::1;::::0;::::1;;::::0;;;::::1;::::0;;23712:113::o;17191:134::-;17290:8;;17282:35;;17250:21;;-1:-1:-1;;;;;17290:8:0;;17282:35;;;;;17250:21;;17232:15;17282:35;17232:15;17282:35;17250:21;17290:8;17282:35;;;;;;;;;;;;;;;;;;;;;17221:104;17191:134::o;14208:328::-;11055:16;;14319:4;;14304;;-1:-1:-1;;;11055:16:0;;;;:28;;;;-1:-1:-1;11075:8:0;;-1:-1:-1;;;11075:8:0;;;;11055:28;11054:47;;;-1:-1:-1;11096:5:0;;-1:-1:-1;;;;;11088:13:0;;;11096:5;;;;;11088:13;11054:47;:77;;;-1:-1:-1;11120:10:0;11105:26;;;;:14;:26;;;;;;;;11054:77;11046:109;;;;-1:-1:-1;;;11046:109:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14365:14:0;::::1;;::::0;;;:8:::1;:14;::::0;;;;;;;14380:10:::1;14365:26:::0;;;;;;;;:34:::1;::::0;14394:5;;14365:34:::1;:::i;:::-;-1:-1:-1::0;;;;;14336:14:0;::::1;;::::0;;;:8:::1;:14;::::0;;;;;;;14351:10:::1;14336:26:::0;;;;;;;:63;14410:26:::1;14345:4:::0;14426:2;14430:5;14410:9:::1;:26::i;:::-;-1:-1:-1::0;;;;;14452:54:0;::::1;14479:14;::::0;;;:8:::1;:14;::::0;;;;;;;14467:10:::1;14479:26:::0;;;;;;;;;;;14452:54;;3069:25:1;;;14467:10:0;;14452:54;-1:-1:-1;;;;;;;;;;;14452:54:0;3042:18:1;14452:54:0::1;;;;;;;-1:-1:-1::0;14524:4:0::1;::::0;14208:328;-1:-1:-1;;;;14208:328:0:o;17691:116::-;10656:5;;;;;-1:-1:-1;;;;;10656:5:0;10642:10;:19;10634:72;;;;-1:-1:-1;;;10634:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17772:14:0;;;::::1;;::::0;;;:9:::1;:14;::::0;;;;:27;;-1:-1:-1;;17772:27:0::1;::::0;::::1;;::::0;;;::::1;::::0;;17691:116::o;40417:113::-;10656:5;;;;;-1:-1:-1;;;;;10656:5:0;10642:10;:19;10634:72;;;;-1:-1:-1;;;10634:72:0;;;;;;;:::i;:::-;40490:22:::1;:32:::0;;;::::1;;-1:-1:-1::0;;;40490:32:0::1;-1:-1:-1::0;;;;40490:32:0;;::::1;::::0;;;::::1;::::0;;40417:113::o;15051:381::-;11055:16;;15160:4;;15139:10;;-1:-1:-1;;;11055:16:0;;;;:28;;;;-1:-1:-1;11075:8:0;;-1:-1:-1;;;11075:8:0;;;;11055:28;11054:47;;;-1:-1:-1;11096:5:0;;-1:-1:-1;;;;;11088:13:0;;;11096:5;;;;;11088:13;11054:47;:77;;;-1:-1:-1;11120:10:0;11105:26;;;;:14;:26;;;;;;;;11054:77;11046:109;;;;-1:-1:-1;;;11046:109:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15185:21:0;::::1;15177:62;;;;-1:-1:-1::0;;;15177:62:0::1;;;;;;;:::i;:::-;15293:10;15284:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;15284:29:0;::::1;::::0;;;;;;;;:42:::1;::::0;15316:10;;15284:42:::1;:::i;:::-;15261:10;15252:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;15252:29:0;::::1;::::0;;;;;;;;;;:74;;;15342:60;3069:25:1;;;15252:29:0;;-1:-1:-1;;;;;;;;;;;15342:60:0;3042:18:1;15342:60:0::1;2923:177:1::0;23996:101:0;23444:10;23433:22;;;;:10;:22;;;;;;;;23425:54;;;;-1:-1:-1;;;23425:54:0;;8064:2:1;23425:54:0;;;8046:21:1;8103:2;8083:18;;;8076:30;-1:-1:-1;;;8122:18:1;;;8115:49;8181:18;;23425:54:0;7862:343:1;23425:54:0;24065:24:::1;24071:10;24083:5;24065;:24::i;:::-;23996:101:::0;:::o;23133:136::-;10779:8;;-1:-1:-1;;;10779:8:0;;;;10771:62;;;;-1:-1:-1;;;10771:62:0;;8412:2:1;10771:62:0;;;8394:21:1;8451:2;8431:18;;;8424:30;8490:34;8470:18;;;8463:62;-1:-1:-1;;;8541:18:1;;;8534:39;8590:19;;10771:62:0;8210:405:1;10771:62:0;23214:8:::1;::::0;-1:-1:-1;;;;;23214:8:0::1;23200:10;:22;23192:31;;;::::0;::::1;;23234:14;;;;;;;;;-1:-1:-1::0;;;;;23234:14:0::1;-1:-1:-1::0;;;;;23234:25:0::1;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;23133:136::o:0;44201:141::-;-1:-1:-1;;;;;44277:19:0;;44253:4;44277:19;;;:14;:19;;;;;;;;;:57;;-1:-1:-1;44318:16:0;;-1:-1:-1;;;;;44300:14:0;;:9;:14;;;;;;;;;;;:34;;44277:57;44270:64;44201:141;-1:-1:-1;;44201:141:0:o;21745:102::-;21813:14;;:26;;;-1:-1:-1;;;21813:26:0;;;;21786:7;;-1:-1:-1;;;;;21813:14:0;;:24;;:26;;;;;;;;;;;;;;:14;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21806:33;;21745:102;:::o;22097:97::-;10656:5;;;;;-1:-1:-1;;;;;10656:5:0;10642:10;:19;10634:72;;;;-1:-1:-1;;;10634:72:0;;;;;;;:::i;:::-;22165:11:::1;:21:::0;;;::::1;;-1:-1:-1::0;;;22165:21:0::1;-1:-1:-1::0;;;;22165:21:0;;::::1;::::0;;;::::1;::::0;;22097:97::o;17558:121::-;10656:5;;;;;-1:-1:-1;;;;;10656:5:0;10642:10;:19;10634:72;;;;-1:-1:-1;;;10634:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17642:19:0;;;::::1;;::::0;;;:14:::1;:19;::::0;;;;:29;;-1:-1:-1;;17642:29:0::1;::::0;::::1;;::::0;;;::::1;::::0;;17558:121::o;40288:117::-;10656:5;;;;;-1:-1:-1;;;;;10656:5:0;10642:10;:19;10634:72;;;;-1:-1:-1;;;10634:72:0;;;;;;;:::i;:::-;40363:24:::1;:34:::0;;;::::1;;-1:-1:-1::0;;;40363:34:0::1;-1:-1:-1::0;;;;40363:34:0;;::::1;::::0;;;::::1;::::0;;40288:117::o;22946:175::-;23049:8;;-1:-1:-1;;;;;23049:8:0;23035:10;:22;23027:31;;;;;;23069:14;;:44;;-1:-1:-1;;;23069:44:0;;-1:-1:-1;;;;;23069:14:0;;;;:27;;:44;;23097:7;;23106:6;;23069:44;;;:::i;41067:109::-;10656:5;;;;;-1:-1:-1;;;;;10656:5:0;10642:10;:19;10634:72;;;;-1:-1:-1;;;10634:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41145:13:0;;;::::1;;::::0;;;:8:::1;:13;::::0;;;;:23;;-1:-1:-1;;41145:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;41067:109::o;41184:117::-;10656:5;;;;;-1:-1:-1;;;;;10656:5:0;10642:10;:19;10634:72;;;;-1:-1:-1;;;10634:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41265:18:0;;;::::1;;::::0;;;:13:::1;:18;::::0;;;;:28;;-1:-1:-1;;41265:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;41184:117::o;39411:113::-;39452:7;39511:5;39495:12;;39480;;:27;;;;:::i;:::-;39479:37;;;;:::i;22638:145::-;10656:5;;;;;-1:-1:-1;;;;;10656:5:0;10642:10;:19;10634:72;;;;-1:-1:-1;;;10634:72:0;;;;;;;:::i;:::-;22730:14:::1;::::0;:45:::1;::::0;-1:-1:-1;;;22730:45:0;;-1:-1:-1;;;;;22730:14:0;;::::1;::::0;:25:::1;::::0;:45:::1;::::0;22756:7;;22765:9;;22730:45:::1;;;:::i;17335:211::-:0;10656:5;;17413:4;;10656:5;;;-1:-1:-1;;;;;10656:5:0;10642:10;:19;10634:72;;;;-1:-1:-1;;;10634:72:0;;;;;;;:::i;:::-;17447:38:::1;::::0;-1:-1:-1;;;17447:38:0;;17479:4:::1;17447:38;::::0;::::1;3251:51:1::0;17429:15:0::1;::::0;-1:-1:-1;;;;;17447:23:0;::::1;::::0;::::1;::::0;3224:18:1;;17447:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17503:35;::::0;-1:-1:-1;;;17503:35:0;;-1:-1:-1;;;;;9718:32:1;;;17503:35:0::1;::::0;::::1;9700:51:1::0;9767:18;;;9760:34;;;17429:56:0;;-1:-1:-1;17503:22:0;;::::1;::::0;::::1;::::0;9673:18:1;;17503:35:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17496:42:::0;17335:211;-1:-1:-1;;;;17335:211:0:o;39536:114::-;39577:7;39637:5;39621:12;;39606;;:27;;;;:::i;17043:140::-;10656:5;;;;;-1:-1:-1;;;;;10656:5:0;10642:10;:19;10634:72;;;;-1:-1:-1;;;10634:72:0;;;;;;;:::i;:::-;17128:5:::1;::::0;17107:39:::1;::::0;17143:1:::1;::::0;17128:5:::1;::::0;::::1;-1:-1:-1::0;;;;;17128:5:0::1;::::0;17107:39:::1;::::0;17143:1;;17107:39:::1;17157:5;:18:::0;;-1:-1:-1;;;;;;17157:18:0::1;::::0;;17043:140::o;41309:105::-;10656:5;;;;;-1:-1:-1;;;;;10656:5:0;10642:10;:19;10634:72;;;;-1:-1:-1;;;10634:72:0;;;;;;;:::i;:::-;41378:1:::1;41363:12;:16:::0;;;41390:12:::1;:16:::0;41309:105::o;24496:431::-;23444:10;23433:22;;;;:10;:22;;;;;;;;23425:54;;;;-1:-1:-1;;;23425:54:0;;8064:2:1;23425:54:0;;;8046:21:1;8103:2;8083:18;;;8076:30;-1:-1:-1;;;8122:18:1;;;8115:49;8181:18;;23425:54:0;7862:343:1;23425:54:0;-1:-1:-1;;;;;24606:17:0;::::1;24586;24606::::0;;;:8:::1;:17;::::0;;;;;;;24624:10:::1;24606:29:::0;;;;;;;;24650:18;;::::1;24646:166;;24717:17;24729:5:::0;24717:9;:17:::1;:::i;:::-;-1:-1:-1::0;;;;;24685:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;;;;24703:10:::1;24685:29:::0;;;;;;;:49;24646:166:::1;;;-1:-1:-1::0;;;;;24767:17:0;::::1;24799:1;24767:17:::0;;;:8:::1;:17;::::0;;;;;;;24785:10:::1;24767:29:::0;;;;;;;:33;24646:166:::1;24822:21;24828:7;24837:5;24822;:21::i;:::-;-1:-1:-1::0;;;;;24859:60:0;::::1;24889:17;::::0;;;:8:::1;:17;::::0;;;;;;;24877:10:::1;24889:29:::0;;;;;;;;;;;24859:60;;3069:25:1;;;24877:10:0;;24859:60;-1:-1:-1;;;;;;;;;;;24859:60:0;3042:18:1;24859:60:0::1;;;;;;;;24575:352;24496:431:::0;;:::o;40845:100::-;10656:5;;;;;-1:-1:-1;;;;;10656:5:0;10642:10;:19;10634:72;;;;-1:-1:-1;;;10634:72:0;;;;;;;:::i;:::-;40916:12:::1;:21:::0;40845:100::o;40542:179::-;10656:5;;;;;-1:-1:-1;;;;;10656:5:0;10642:10;:19;10634:72;;;;-1:-1:-1;;;10634:72:0;;;;;;;:::i;:::-;40618:21:::1;::::0;-1:-1:-1;;;40618:21:0;::::1;;;40610:65;;;::::0;-1:-1:-1;;;40610:65:0;;10257:2:1;40610:65:0::1;::::0;::::1;10239:21:1::0;10296:2;10276:18;;;10269:30;10335:33;10315:18;;;10308:61;10386:18;;40610:65:0::1;10055:355:1::0;40610:65:0::1;40686:17;:27:::0;;;::::1;;-1:-1:-1::0;;;40686:27:0::1;-1:-1:-1::0;;;;40686:27:0;;::::1;::::0;;;::::1;::::0;;40542:179::o;10206:20::-;;;;;;;:::i;15952:391::-;11055:16;;16066:4;;16045:10;;-1:-1:-1;;;11055:16:0;;;;:28;;;;-1:-1:-1;11075:8:0;;-1:-1:-1;;;11075:8:0;;;;11055:28;11054:47;;;-1:-1:-1;11096:5:0;;-1:-1:-1;;;;;11088:13:0;;;11096:5;;;;;11088:13;11054:47;:77;;;-1:-1:-1;11120:10:0;11105:26;;;;:14;:26;;;;;;;;11054:77;11046:109;;;;-1:-1:-1;;;11046:109:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16091:21:0;::::1;16083:62;;;;-1:-1:-1::0;;;16083:62:0::1;;;;;;;:::i;:::-;16199:10;16190:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;16190:29:0;::::1;::::0;;;;;;;;:47:::1;::::0;16222:15;;16190:47:::1;:::i;16889:146::-:0;10656:5;;;;;-1:-1:-1;;;;;10656:5:0;10642:10;:19;10634:72;;;;-1:-1:-1;;;10634:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16961:17:0;::::1;16953:52;;;::::0;-1:-1:-1;;;16953:52:0;;10617:2:1;16953:52:0::1;::::0;::::1;10599:21:1::0;10656:2;10636:18;;;10629:30;-1:-1:-1;;;10675:18:1;;;10668:52;10737:18;;16953:52:0::1;10415:346:1::0;16953:52:0::1;17016:5;:11:::0;;-1:-1:-1;;;;;17016:11:0;;::::1;;;-1:-1:-1::0;;;;;;17016:11:0;;::::1;::::0;;;::::1;::::0;;16889:146::o;12596:178::-;11055:16;;12695:4;;12674:10;;-1:-1:-1;;;11055:16:0;;;;:28;;;;-1:-1:-1;11075:8:0;;-1:-1:-1;;;11075:8:0;;;;11055:28;11054:47;;;-1:-1:-1;11096:5:0;;-1:-1:-1;;;;;11088:13:0;;;11096:5;;;;;11088:13;11054:47;:77;;;-1:-1:-1;11120:10:0;11105:26;;;;:14;:26;;;;;;;;11054:77;11046:109;;;;-1:-1:-1;;;11046:109:0;;;;;;;:::i;:::-;12712:32:::1;12722:10;12734:2;12738:5;12712:9;:32::i;:::-;-1:-1:-1::0;12762:4:0::1;::::0;12596:178;-1:-1:-1;;;12596:178:0:o;40733:100::-;10656:5;;;;;-1:-1:-1;;;;;10656:5:0;10642:10;:19;10634:72;;;;-1:-1:-1;;;10634:72:0;;;;;;;:::i;:::-;40804:12:::1;:21:::0;40733:100::o;22202:225::-;10656:5;;;;;-1:-1:-1;;;;;10656:5:0;10642:10;:19;10634:72;;;;-1:-1:-1;;;10634:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22295:14:0;::::1;;::::0;;;:9:::1;:14;::::0;;;;;::::1;;:23;::::0;:43:::1;;-1:-1:-1::0;22322:16:0;::::1;22295:43;22287:91;;;::::0;-1:-1:-1;;;22287:91:0;;10968:2:1;22287:91:0::1;::::0;::::1;10950:21:1::0;11007:2;10987:18;;;10980:30;11046:34;11026:18;;;11019:62;-1:-1:-1;;;11097:18:1;;;11090:33;11140:19;;22287:91:0::1;10766:399:1::0;22287:91:0::1;-1:-1:-1::0;;;;;22389:20:0;;;::::1;;::::0;;;:15:::1;:20;::::0;;;;:30;;-1:-1:-1;;22389:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;22202:225::o;40167:109::-;10656:5;;;;;-1:-1:-1;;;;;10656:5:0;10642:10;:19;10634:72;;;;-1:-1:-1;;;10634:72:0;;;;;;;:::i;:::-;40238:20:::1;:30:::0;;;::::1;;-1:-1:-1::0;;;40238:30:0::1;-1:-1:-1::0;;;;40238:30:0;;::::1;::::0;;;::::1;::::0;;40167:109::o;21543:104::-;21612:14;;:27;;;-1:-1:-1;;;21612:27:0;;;;21585:7;;-1:-1:-1;;;;;21612:14:0;;:25;;:27;;;;;;;;;;;;;;:14;:27;;;;;;;;;;;;;;22435:191;10656:5;;;;;-1:-1:-1;;;;;10656:5:0;10642:10;:19;10634:72;;;;-1:-1:-1;;;10634:72:0;;;;;;;:::i;:::-;22539:23:::1;:35:::0;;;;22585:23:::1;:33:::0;22435:191::o;39918:237::-;10656:5;;;;;-1:-1:-1;;;;;10656:5:0;10642:10;:19;10634:72;;;;-1:-1:-1;;;10634:72:0;;;;;;;:::i;:::-;39995:11:::1;:35:::0;;-1:-1:-1;;;;;;39995:35:0::1;-1:-1:-1::0;;;;;39995:35:0;;::::1;::::0;;::::1;::::0;;;40067:5:::1;::::0;40041:32:::1;::::0;-1:-1:-1;;;40041:32:0;;39995:35:::1;40067:5:::0;;::::1;::::0;;::::1;40041:32;::::0;::::1;3251:51:1::0;39995:35:0;40041:25:::1;::::0;3224:18:1;;40041:32:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;40084:21:0::1;:28:::0;;-1:-1:-1;;;;40123:24:0;-1:-1:-1;;;40123:24:0;;;-1:-1:-1;;;39918:237:0:o;44376:105::-;10656:5;;;;;-1:-1:-1;;;;;10656:5:0;10642:10;:19;10634:72;;;;-1:-1:-1;;;10634:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44449:19:0;;;::::1;;::::0;;;:14:::1;:19;::::0;;;;:24;;-1:-1:-1;;44449:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;44376:105::o;39661:217::-;39734:8;;39711:7;;-1:-1:-1;;;39734:8:0;;;;39731:121;;;39792:1;39778:11;;39763:12;:26;;;;:::i;:::-;:30;39759:82;;;-1:-1:-1;39821:4:0;;39661:217::o;39759:82::-;-1:-1:-1;39869:1:0;;39661:217::o;19752:144::-;-1:-1:-1;;;;;19824:23:0;;;;;;:15;:23;;;;;:30;;-1:-1:-1;;19824:30:0;19850:4;19824:30;;;19865:23;19840:6;23531:139;-1:-1:-1;;;;;23603:18:0;;;;;;:10;:18;;;;;:25;;-1:-1:-1;;23603:25:0;23624:4;23603:25;;;23639:23;23614:6;36787:142;-1:-1:-1;;;;;36859:21:0;;;;;;:13;:21;;;;;:28;;-1:-1:-1;;36859:28:0;36883:4;36859:28;;;36898:23;36873:6;11279:151;11342:5;:14;;-1:-1:-1;;;;;;11342:14:0;;-1:-1:-1;;;;;11342:14:0;;;;;;;;;;;;11382:5;;;;;-1:-1:-1;11367:21:0;;;:14;:21;;;;;:28;;-1:-1:-1;;11367:28:0;-1:-1:-1;11367:28:0;;;11417:5;;11406:8;:16;;11417:5;;;;;;;-1:-1:-1;;;;;;11406:16:0;;;;;;11279:151::o;36941:161::-;10656:5;;;;;-1:-1:-1;;;;;10656:5:0;10642:10;:19;10634:72;;;;-1:-1:-1;;;10634:72:0;;;;;;;:::i;:::-;37004:14:::1;:12;:14::i;:::-;37042:15;37029:10;:28:::0;37082:12:::1;37068:11;:26:::0;36941:161::o;18629:792::-;-1:-1:-1;;;;;18716:16:0;;18708:51;;;;-1:-1:-1;;;18708:51:0;;10617:2:1;18708:51:0;;;10599:21:1;10656:2;10636:18;;;10629:30;-1:-1:-1;;;10675:18:1;;;10668:52;10737:18;;18708:51:0;10415:346:1;18708:51:0;-1:-1:-1;;;;;18778:25:0;;;;;;:19;:25;;;;;;;;:34;18770:77;;;;-1:-1:-1;;;18770:77:0;;11372:2:1;18770:77:0;;;11354:21:1;11411:2;11391:18;;;11384:30;11450:32;11430:18;;;11423:60;11500:18;;18770:77:0;11170:354:1;18770:77:0;18872:16;;;;18868:546;;;-1:-1:-1;;;;;18925:15:0;;:9;:15;;;;;;;;;;;:23;;18943:5;;18925:23;:::i;:::-;-1:-1:-1;;;;;18907:15:0;;;:9;:15;;;;;;;;;;;:41;;;;18979:13;;;;;;;:21;;18995:5;;18979:21;:::i;:::-;-1:-1:-1;;;;;18963:13:0;;;:9;:13;;;;;;;;;;;;:37;;;;19020:25;3069::1;;;18963:13:0;;19020:25;;;;-1:-1:-1;;;;;;;;;;;19020:25:0;3042:18:1;19020:25:0;2923:177:1;18868:546:0;19080:28;19092:4;19098:2;19102:5;19080:11;:28::i;:::-;19125:22;19150:40;19174:4;19180:2;19184:5;19150:23;:40::i;:::-;-1:-1:-1;;;;;19223:15:0;;:9;:15;;;;;;;;;;;19125:65;;-1:-1:-1;19223:23:0;;19241:5;;19223:23;:::i;:::-;-1:-1:-1;;;;;19205:15:0;;;:9;:15;;;;;;;;;;;:41;;;;19277:13;;;;;;;:30;;19293:14;;19277:30;:::i;:::-;-1:-1:-1;;;;;19261:13:0;;;:9;:13;;;;;;;;;;;;:46;;;;19329:34;3069:25:1;;;19261:13:0;;19329:34;;;;-1:-1:-1;;;;;;;;;;;19329:34:0;3042:18:1;19329:34:0;;;;;;;19380:22;17191:134;18868:546;18629:792;;;:::o;24959:263::-;-1:-1:-1;;;;;25034:21:0;;25026:30;;;;;;25099:5;25084:12;;:20;;;;:::i;:::-;25069:12;:35;-1:-1:-1;;;;;25136:18:0;;:9;:18;;;;;;;;;;;:26;;25157:5;;25136:26;:::i;:::-;-1:-1:-1;;;;;25115:18:0;;:9;:18;;;;;;;;;;;:47;;;;25178:36;;3069:25:1;;;25115:9:0;;-1:-1:-1;;;;;;;;;;;25178:36:0;3042:18:1;25178:36:0;;;;;;;24959:263;;:::o;16387:77::-;10656:5;;;;;-1:-1:-1;;;;;10656:5:0;10642:10;:19;10634:72;;;;-1:-1:-1;;;10634:72:0;;;;;;;:::i;:::-;16441:8:::1;:15:::0;;-1:-1:-1;;;;16441:15:0::1;-1:-1:-1::0;;;16441:15:0::1;::::0;;16387:77::o;43639:165::-;43762:34;43780:4;43786:2;43790:5;43762:17;:34::i;43816:214::-;43949:7;43976:46;44006:4;44012:2;44016:5;43976:29;:46::i;20840:570::-;20957:8;;-1:-1:-1;;;20957:8:0;;;;:37;;;;-1:-1:-1;20983:11:0;;-1:-1:-1;;;20983:11:0;;;;20957:37;:68;;;;-1:-1:-1;;;;;;21012:13:0;;;;;;:9;:13;;;;;;;;20957:68;:123;;;;;21065:15;21043:13;;21059:2;21043:18;;;;:::i;:::-;:37;;20957:123;:201;;;;-1:-1:-1;21135:23:0;;21115:14;;-1:-1:-1;;;;;21115:14:0;21097:9;:34;;;;;;;;;;;:61;;20957:201;:240;;;;-1:-1:-1;;;;;;21176:21:0;;;;;;:15;:21;;;;;;;;21175:22;20957:240;:289;;;;;21214:14;;;;;;;;;-1:-1:-1;;;;;21214:14:0;-1:-1:-1;;;;;21214:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:32;20957:289;20939:419;;;21289:15;21273:13;:31;21319:14;;:27;;;-1:-1:-1;;;21319:27:0;;;;-1:-1:-1;;;;;21319:14:0;;;;:25;;:27;;;;;:14;;:27;;;;;;;;:14;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20939:419;21368:34;21386:4;21392:2;21396:5;21368:17;:34::i;19914:916::-;-1:-1:-1;;;;;20100:21:0;;20023:7;20100:21;;;:15;:21;;;;;;20078:5;;20100:21;;:30;;;:62;;-1:-1:-1;;;;;;20134:19:0;;;;;;:15;:19;;;;;;;;:28;20100:62;:74;;;;-1:-1:-1;20166:8:0;;-1:-1:-1;;;20166:8:0;;;;20100:74;20096:390;;;-1:-1:-1;;;;;20195:15:0;;;;;;:9;:15;;;;;;;;20191:284;;;20282:14;;:32;;-1:-1:-1;;;20282:32:0;;;;;3069:25:1;;;-1:-1:-1;;;;;20282:14:0;;;;:25;;3042:18:1;;20282:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20265:49;;20191:284;;;-1:-1:-1;;;;;20340:13:0;;;;;;:9;:13;;;;;;;;20336:139;;;20426:14;;:33;;-1:-1:-1;;;20426:33:0;;;;;3069:25:1;;;-1:-1:-1;;;;;20426:14:0;;;;:26;;3042:18:1;;20426:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20409:50;;20336:139;20498:17;20518:22;20526:14;20518:5;:22;:::i;:::-;20498:42;-1:-1:-1;20555:13:0;;20551:199;;20640:14;;-1:-1:-1;;;;;20640:14:0;20622:9;:34;;;;;;;;;;;:46;;20659:9;;20622:46;:::i;:::-;20603:14;;;-1:-1:-1;;;;;20603:14:0;;;20585:9;:34;;;;;;;;;;;;:83;;;;20711:14;;20688:50;;3069:25:1;;;20711:14:0;;;;20688:50;;;;-1:-1:-1;;;;;;;;;;;20688:50:0;3042:18:1;20688:50:0;;;;;;;20551:199;20767:55;20797:4;20803:2;20807:14;20767:29;:55::i;:::-;20760:62;19914:916;-1:-1:-1;;;;;;19914:916:0:o;37114:1682::-;37221:20;;-1:-1:-1;;;37221:20:0;;;;:29;;:62;;-1:-1:-1;37263:10:0;37254:20;;;;:8;:20;;;;;;;;:29;37221:62;37213:90;;;;-1:-1:-1;;;37213:90:0;;11731:2:1;37213:90:0;;;11713:21:1;11770:2;11750:18;;;11743:30;-1:-1:-1;;;11789:18:1;;;11782:45;11844:18;;37213:90:0;11529:339:1;37213:90:0;37328:8;;-1:-1:-1;;;37328:8:0;;;;:25;;;;-1:-1:-1;37348:5:0;;-1:-1:-1;;;;;37340:13:0;;;37348:5;;;;;37340:13;;37328:25;:57;;;;-1:-1:-1;;;;;;37357:19:0;;;;;;:13;:19;;;;;;;;:28;37328:57;:87;;;;-1:-1:-1;;;;;;37389:17:0;;;;;;:13;:17;;;;;;;;:26;37328:87;37324:1410;;;37450:11;;:15;37446:122;;37506:11;;37493:9;:24;;37485:67;;;;-1:-1:-1;;;37485:67:0;;12075:2:1;37485:67:0;;;12057:21:1;12114:2;12094:18;;;12087:30;12153:32;12133:18;;;12126:60;12203:18;;37485:67:0;11873:354:1;37485:67:0;37615:1;37600:12;;:16;:42;;;;-1:-1:-1;;;;;;37620:13:0;;;;;;:9;:13;;;;;;;;:22;37600:42;37596:164;;;37697:10;:8;:10::i;:::-;-1:-1:-1;;;;;37672:13:0;;:9;:13;;;;;;;;;;;:21;;37688:5;;37672:21;:::i;:::-;:35;;37663:81;;;;-1:-1:-1;;;37663:81:0;;12434:2:1;37663:81:0;;;12416:21:1;;;12453:18;;;12446:30;12512:34;12492:18;;;12485:62;12564:18;;37663:81:0;12232:356:1;37663:81:0;37807:1;37792:12;;:16;:33;;;;-1:-1:-1;;;;;;37812:13:0;;;;;;:9;:13;;;;;;;;37792:33;37788:139;;;37864:10;:8;:10::i;:::-;37855:5;:19;;37846:65;;;;-1:-1:-1;;;37846:65:0;;12795:2:1;37846:65:0;;;12777:21:1;;;12814:18;;;12807:30;12873:34;12853:18;;;12846:62;12925:18;;37846:65:0;12593:356:1;37846:65:0;37958:24;;-1:-1:-1;;;37958:24:0;;;;37955:635;;;-1:-1:-1;;;;;38007:23:0;;;;;;:19;:23;;;;;;38034:12;38007:39;;38003:146;;-1:-1:-1;;;;;38071:12:0;;;;;;:8;:12;;;;;:19;;-1:-1:-1;;38071:19:0;38086:4;38071:19;;;38113:13;:16;;;;;;:::i;:::-;;;;;;38003:146;-1:-1:-1;;;;;38171:25:0;;;;;;:19;:25;;;;;;38200:12;38171:41;;38167:150;;-1:-1:-1;;;;;38237:14:0;;;;;;:8;:14;;;;;:21;;-1:-1:-1;;38237:21:0;38254:4;38237:21;;;38281:13;:16;;;;;;:::i;:::-;;;;;;38167:150;-1:-1:-1;;;;;38339:13:0;;;;;;:9;:13;;;;;;;;:22;;;;38335:109;;-1:-1:-1;;;;;38386:23:0;;;;;;:19;:23;;;;;38412:12;38386:38;;38335:109;-1:-1:-1;;;;;38466:15:0;;;;;;:9;:15;;;;;;;;:24;;;;38462:113;;-1:-1:-1;;;;;38515:25:0;;;;;;:19;:25;;;;;38543:12;38515:40;;38462:113;38622:17;;-1:-1:-1;;;38622:17:0;;;;38618:105;;;38660:11;;:47;;-1:-1:-1;;;38660:47:0;;-1:-1:-1;;;;;13352:15:1;;;38660:47:0;;;13334:34:1;13404:15;;;13384:18;;;13377:43;13436:18;;;13429:34;;;38660:11:0;;;;:30;;13269:18:1;;38660:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18629:792;;;:::o;38808:562::-;38982:8;;38917:7;;38962:5;;-1:-1:-1;;;38982:8:0;;;;:34;;;;-1:-1:-1;38994:22:0;;-1:-1:-1;;;38994:22:0;;;;38982:34;38978:312;;;39045:5;;-1:-1:-1;;;;;39037:13:0;;;39045:5;;;;;39037:13;;;;:32;;;39068:1;39054:11;:9;:11::i;:::-;:15;39037:32;:64;;;;-1:-1:-1;;;;;;39073:19:0;;;;;;:13;:19;;;;;;;;:28;39037:64;:94;;;;-1:-1:-1;;;;;;39105:17:0;;;;;;:13;:17;;;;;;;;:26;39037:94;39033:246;;;39152:17;39196:5;39181:11;:9;:11::i;:::-;39173:19;;:5;:19;:::i;:::-;39172:29;;;;:::i;:::-;39152:49;-1:-1:-1;39237:26:0;39152:49;39237:14;:26;:::i;:::-;39220:43;;39133:146;39033:246;39307:55;39337:4;39343:2;39347:14;39307:29;:55::i;:::-;39300:62;38808:562;-1:-1:-1;;;;;38808:562:0:o;16566:205::-;16666:7;16702:2;-1:-1:-1;;;;;16694:10:0;:4;-1:-1:-1;;;;;16694:10:0;;16686:54;;;;-1:-1:-1;;;16686:54:0;;13676:2:1;16686:54:0;;;13658:21:1;13715:2;13695:18;;;13688:30;13754:33;13734:18;;;13727:61;13805:18;;16686:54:0;13474:355:1;16686:54:0;-1:-1:-1;16758:5:0;16566:205;-1:-1:-1;;16566:205:0:o;206:423:1:-;248:3;286:5;280:12;313:6;308:3;301:19;338:1;348:162;362:6;359:1;356:13;348:162;;;424:4;480:13;;;476:22;;470:29;452:11;;;448:20;;441:59;377:12;348:162;;;352:3;555:1;548:4;539:6;534:3;530:16;526:27;519:38;618:4;611:2;607:7;602:2;594:6;590:15;586:29;581:3;577:39;573:50;566:57;;;206:423;;;;:::o;634:220::-;783:2;772:9;765:21;746:4;803:45;844:2;833:9;829:18;821:6;803:45;:::i;:::-;795:53;634:220;-1:-1:-1;;;634:220:1:o;859:127::-;920:10;915:3;911:20;908:1;901:31;951:4;948:1;941:15;975:4;972:1;965:15;991:719;1034:5;1087:3;1080:4;1072:6;1068:17;1064:27;1054:55;;1105:1;1102;1095:12;1054:55;1141:6;1128:20;1167:18;1204:2;1200;1197:10;1194:36;;;1210:18;;:::i;:::-;1285:2;1279:9;1253:2;1339:13;;-1:-1:-1;;1335:22:1;;;1359:2;1331:31;1327:40;1315:53;;;1383:18;;;1403:22;;;1380:46;1377:72;;;1429:18;;:::i;:::-;1469:10;1465:2;1458:22;1504:2;1496:6;1489:18;1550:3;1543:4;1538:2;1530:6;1526:15;1522:26;1519:35;1516:55;;;1567:1;1564;1557:12;1516:55;1631:2;1624:4;1616:6;1612:17;1605:4;1597:6;1593:17;1580:54;1678:1;1671:4;1666:2;1658:6;1654:15;1650:26;1643:37;1698:6;1689:15;;;;;;991:719;;;;:::o;1715:390::-;1793:6;1801;1854:2;1842:9;1833:7;1829:23;1825:32;1822:52;;;1870:1;1867;1860:12;1822:52;1910:9;1897:23;1943:18;1935:6;1932:30;1929:50;;;1975:1;1972;1965:12;1929:50;1998;2040:7;2031:6;2020:9;2016:22;1998:50;:::i;:::-;1988:60;2095:2;2080:18;;;;2067:32;;-1:-1:-1;;;;1715:390:1:o;2110:173::-;2178:20;;-1:-1:-1;;;;;2227:31:1;;2217:42;;2207:70;;2273:1;2270;2263:12;2207:70;2110:173;;;:::o;2288:254::-;2356:6;2364;2417:2;2405:9;2396:7;2392:23;2388:32;2385:52;;;2433:1;2430;2423:12;2385:52;2456:29;2475:9;2456:29;:::i;:::-;2446:39;2532:2;2517:18;;;;2504:32;;-1:-1:-1;;;2288:254:1:o;2547:180::-;2606:6;2659:2;2647:9;2638:7;2634:23;2630:32;2627:52;;;2675:1;2672;2665:12;2627:52;-1:-1:-1;2698:23:1;;2547:180;-1:-1:-1;2547:180:1:o;2732:186::-;2791:6;2844:2;2832:9;2823:7;2819:23;2815:32;2812:52;;;2860:1;2857;2850:12;2812:52;2883:29;2902:9;2883:29;:::i;3313:118::-;3399:5;3392:13;3385:21;3378:5;3375:32;3365:60;;3421:1;3418;3411:12;3436:315;3501:6;3509;3562:2;3550:9;3541:7;3537:23;3533:32;3530:52;;;3578:1;3575;3568:12;3530:52;3601:29;3620:9;3601:29;:::i;:::-;3591:39;;3680:2;3669:9;3665:18;3652:32;3693:28;3715:5;3693:28;:::i;:::-;3740:5;3730:15;;;3436:315;;;;;:::o;3756:328::-;3833:6;3841;3849;3902:2;3890:9;3881:7;3877:23;3873:32;3870:52;;;3918:1;3915;3908:12;3870:52;3941:29;3960:9;3941:29;:::i;:::-;3931:39;;3989:38;4023:2;4012:9;4008:18;3989:38;:::i;:::-;3979:48;;4074:2;4063:9;4059:18;4046:32;4036:42;;3756:328;;;;;:::o;4278:241::-;4334:6;4387:2;4375:9;4366:7;4362:23;4358:32;4355:52;;;4403:1;4400;4393:12;4355:52;4442:9;4429:23;4461:28;4483:5;4461:28;:::i;4753:396::-;4831:6;4839;4892:2;4880:9;4871:7;4867:23;4863:32;4860:52;;;4908:1;4905;4898:12;4860:52;4948:9;4935:23;4981:18;4973:6;4970:30;4967:50;;;5013:1;5010;5003:12;4967:50;5036;5078:7;5069:6;5058:9;5054:22;5036:50;:::i;:::-;5026:60;;;5105:38;5139:2;5128:9;5124:18;5105:38;:::i;:::-;5095:48;;4753:396;;;;;:::o;5154:260::-;5222:6;5230;5283:2;5271:9;5262:7;5258:23;5254:32;5251:52;;;5299:1;5296;5289:12;5251:52;5322:29;5341:9;5322:29;:::i;:::-;5312:39;;5370:38;5404:2;5393:9;5389:18;5370:38;:::i;5419:248::-;5487:6;5495;5548:2;5536:9;5527:7;5523:23;5519:32;5516:52;;;5564:1;5561;5554:12;5516:52;-1:-1:-1;;5587:23:1;;;5657:2;5642:18;;;5629:32;;-1:-1:-1;5419:248:1:o;5672:404::-;5874:2;5856:21;;;5913:2;5893:18;;;5886:30;5952:34;5947:2;5932:18;;5925:62;-1:-1:-1;;;6018:2:1;6003:18;;5996:38;6066:3;6051:19;;5672:404::o;6081:380::-;6160:1;6156:12;;;;6203;;;6224:61;;6278:4;6270:6;6266:17;6256:27;;6224:61;6331:2;6323:6;6320:14;6300:18;6297:38;6294:161;;6377:10;6372:3;6368:20;6365:1;6358:31;6412:4;6409:1;6402:15;6440:4;6437:1;6430:15;6294:161;;6081:380;;;:::o;6466:291::-;6643:2;6632:9;6625:21;6606:4;6663:45;6704:2;6693:9;6689:18;6681:6;6663:45;:::i;:::-;6655:53;;6744:6;6739:2;6728:9;6724:18;6717:34;6466:291;;;;;:::o;6762:343::-;6964:2;6946:21;;;7003:2;6983:18;;;6976:30;-1:-1:-1;;;7037:2:1;7022:18;;7015:49;7096:2;7081:18;;6762:343::o;7110:352::-;7312:2;7294:21;;;7351:2;7331:18;;;7324:30;7390;7385:2;7370:18;;7363:58;7453:2;7438:18;;7110:352::o;7467:127::-;7528:10;7523:3;7519:20;7516:1;7509:31;7559:4;7556:1;7549:15;7583:4;7580:1;7573:15;7599:128;7666:9;;;7687:11;;;7684:37;;;7701:18;;:::i;7732:125::-;7797:9;;;7818:10;;;7815:36;;;7831:18;;:::i;8620:184::-;8690:6;8743:2;8731:9;8722:7;8718:23;8714:32;8711:52;;;8759:1;8756;8749:12;8711:52;-1:-1:-1;8782:16:1;;8620:184;-1:-1:-1;8620:184:1:o;8809:317::-;8986:2;8975:9;8968:21;8949:4;9006:45;9047:2;9036:9;9032:18;9024:6;9006:45;:::i;:::-;8998:53;;9116:1;9112;9107:3;9103:11;9099:19;9091:6;9087:32;9082:2;9071:9;9067:18;9060:60;8809:317;;;;;:::o;9131:168::-;9204:9;;;9235;;9252:15;;;9246:22;;9232:37;9222:71;;9273:18;;:::i;9304:217::-;9344:1;9370;9360:132;;9414:10;9409:3;9405:20;9402:1;9395:31;9449:4;9446:1;9439:15;9477:4;9474:1;9467:15;9360:132;-1:-1:-1;9506:9:1;;9304:217::o;9805:245::-;9872:6;9925:2;9913:9;9904:7;9900:23;9896:32;9893:52;;;9941:1;9938;9931:12;9893:52;9973:9;9967:16;9992:28;10014:5;9992:28;:::i;12954:135::-;12993:3;13014:17;;;13011:43;;13034:18;;:::i;:::-;-1:-1:-1;13081:1:1;13070:13;;12954:135::o

Swarm Source

ipfs://09de8d6412ad4917f67dec9c7cd373ebba0d4df7b0bfab5ab0aa8551ff2c5c48
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.