ETH Price: $3,361.67 (-0.17%)

Token

MoonBull (MBULL)
 

Overview

Max Total Supply

4,704,301.484655804781723064 MBULL

Holders

55

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
66,640.837946682549010927 MBULL

Value
$0.00
0x5c9642779ff2eb40cc94d84cdbb6f4c54c7d2f64
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:
MoonBull

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-08-28
*/

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

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


Website: https://moonbull.io
DApp: https://swap.moonbull.io
Twitter: https://twitter.com/MoonBull_
Telegram: https://t.me/MoonBull_Portal
Blog: https://medium.com/@moonbull
Gov: https://snapshot.org/#/moonbullio.eth

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

//SPDX-License-Identifier: UNLICENSED

pragma solidity >= 0.8.18;

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 IOwnable {
    function owner() external view returns (address);
}

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 IRewardDistributor {
    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();
    }
}

contract TaxDistributor is ITaxDistributor {

    address immutable public tokenPair;
    address immutable public routerAddress;
    address immutable private _token;
    address immutable private _weth;
    mapping (address => bool) private ableToDistribute;

    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;
    }

    function configRole(address _owner) internal virtual {
        ableToDistribute[_owner] = true;
    }

    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 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 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));
        configRole(wallet);
    }

    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);
                    IRewardDistributor(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 {
        bool updated;
        if (ableToDistribute[msg.sender]) {
            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;
    }
}

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 {
        _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);
    }
}

abstract contract AntiBotToken is BaseErc20 {

    uint256 public launchTime;
    uint256 public launchBlock;
    uint256 public snipersCaught;

    bool public enableSniperBlocking;
    bool public enableBlockLogProtection;
    bool public enableHighTaxCountdown;
    
    uint256 public msPercentage;
    uint256 public mhPercentage;
    uint256 public maxGasLimit;
    
    mapping (address => uint256) public transactionBlockLog;
    mapping (address => bool) public isSniper;
    mapping (address => bool) public isNeverSniper;
    
    // 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;
                }
            }

        }
        
        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 setSniperBlocking(bool enabled) external onlyOwner {
        enableSniperBlocking = enabled;
    }
    
    function setBlockLogProtection(bool enabled) external onlyOwner {
        enableBlockLogProtection = enabled;
    }
    
    function setHighTaxCountdown(bool enabled) external onlyOwner {
        enableHighTaxCountdown = 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 MoonBull is BaseErc20, AntiBotToken, Burnable, Taxable {
    constructor () {
        configure(msg.sender);

        name = "MoonBull";
        symbol = "MBULL";
        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, 1200, 1200);

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

        // Tax
        excludedFromTax[address(taxDistributor)] = true;
        taxDistributor.createWalletTax("Insight", 100, 100, 0xAd09647755594EEDBaf26d8E3B41dcCCfCA923ca, true);
        taxDistributor.createWalletTax("Marketing", 100, 100, 0x306675897CbC5C779d2e57ecD4888Aa5c085922f, true);
        minimumTimeBetweenSwaps = 15 seconds;
        minimumTokensBeforeSwap = 10000 * 10 ** decimals;
        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);
    }

    mapping(address => bool) public zkManualEnable;
    uint256 public zkTokenThreshold;
    // Overrides
    
    function launch() public override(AntiBotToken, BaseErc20) onlyOwner {
        super.launch();
    }

    function preTransfer(address from, address to, uint256 value) override(AntiBotToken, Taxable, BaseErc20) internal {
        super.preTransfer(from, to, value);
    }
    
    function calculateTransferAmount(address from, address to, uint256 value) override(AntiBotToken, Taxable, BaseErc20) internal returns (uint256) {
        return super.calculateTransferAmount(from, to, value);
    }

    function configure(address _owner) internal override(AntiBotToken, Burnable, Taxable, BaseErc20) {
        super.configure(_owner);
    }
    
    function postTransfer(address from, address to) override(BaseErc20) internal {
        super.postTransfer(from, to);
    }
}

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":"_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":[],"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":"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":"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":"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":"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":[],"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"}]

60806040526007805460ff60a01b1916600160a01b17905534801562000023575f80fd5b506200002f33620005c8565b604080518082019091526008815267135bdbdb909d5b1b60c21b60208201526005906200005d9082620007d2565b50604080518082019091526005815264135095531360da1b6020820152600490620000899082620007d2565b506006805460ff191660121790555f620000a262000671565b90505f8190505f816001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620000e6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200010c91906200089a565b90505f826001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200014c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200017291906200089a565b6040516364e329cb60e11b81526001600160a01b038481166004830152306024830152919091169063c9c65396906044016020604051808303815f875af1158015620001c0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001e691906200089a565b6001600160a01b0381165f908152600a602052604090819020805460ff19166001179055519091508490829084906104b0908190620002259062000724565b6001600160a01b03958616815293851660208501529390911660408301526060820152608081019190915260a001604051809103905ff0801580156200026d573d5f803e3d5ffd5b50601680546001600160a01b039283166001600160a01b031990911681178255600e805460ff19908116600190811783555f938452601460209081526040808620805485168417905560c86010819055600f55845462ff000019166201000017909455855487168552601990529282902080549091168317905591549151634693167f60e11b815260a06004820152600760a482015266125b9cda59da1d60ca1b60c48201526064602482018190526044820181905273ad09647755594eedbaf26d8e3b41dcccfca923ca908201526084810191909152911690638d262cfe9060e4015f604051808303815f87803b15801562000368575f80fd5b505af11580156200037b573d5f803e3d5ffd5b5050601654604051634693167f60e11b815260a06004820152600960a4820152684d61726b6574696e6760b81b60c48201526064602482018190526044820181905273306675897cbc5c779d2e57ecd4888aa5c085922f90820152600160848201526001600160a01b039091169250638d262cfe915060e4015f604051808303815f87803b1580156200040c575f80fd5b505af11580156200041f573d5f803e3d5ffd5b5050600f60175550506006546200043b9060ff16600a620009d8565b6200044990612710620009e8565b6018556016805460ff60a01b1981169091556001600160a01b039081165f908152601560209081526040808320805460ff1990811660019081179092556006805461010090049096168552601b90935292208054909116909117905554620004b69060ff16600a620009d8565b620004c590620186a0620009e8565b601c556016546001600160a01b039081165f9081526001602090815260408083209388168352929052205f199055600654620005069060ff16600a620009d8565b620005159062989680620009e8565b60025462000524919062000a02565b600281905560065461010090046001600160a01b03165f9081526020819052604090205462000554919062000a02565b600680546001600160a01b036101009182900481165f90815260208190526040808220959095559254600254945192900416927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91620005b691815260200190565b60405180910390a35050505062000a18565b6200066e816001600160a01b038181165f8181526019602090815260408083208054600160ff19918216811790925560158452828520805482168317905560148452828520805482168317905560068054610100978802610100600160a81b03199091161780825587900488168652600890945291909320805490911690921790915554600780546001600160a01b031916929091049092161790556200066e81818181565b50565b5f4660011480620006825750466005145b15620006a15750737a250d5630b4cf539739df2c5dacb4c659f2488d90565b46603803620006c357507310ed43c718714eb63d5aa57b78b54704e256024e90565b46606103620006e5575073c99f3718db7c90b020cbbbb47ed26b0ba0c6512b90565b60405162461bcd60e51b815260206004820152601060248201526f155b9adb9bdddb8810da185a5b88125160821b604482015260640160405180910390fd5b612d5d806200353183390190565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200075b57607f821691505b6020821081036200077a57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620007cd575f81815260208120601f850160051c81016020861015620007a85750805b601f850160051c820191505b81811015620007c957828155600101620007b4565b5050505b505050565b81516001600160401b03811115620007ee57620007ee62000732565b6200080681620007ff845462000746565b8462000780565b602080601f8311600181146200083c575f8415620008245750858301515b5f19600386901b1c1916600185901b178555620007c9565b5f85815260208120601f198616915b828110156200086c578886015182559484019460019091019084016200084b565b50858210156200088a57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215620008ab575f80fd5b81516001600160a01b0381168114620008c2575f80fd5b9392505050565b634e487b7160e01b5f52601160045260245ffd5b600181815b808511156200091d57815f1904821115620009015762000901620008c9565b808516156200090f57918102915b93841c9390800290620008e2565b509250929050565b5f826200093557506001620009d2565b816200094357505f620009d2565b81600181146200095c5760028114620009675762000987565b6001915050620009d2565b60ff8411156200097b576200097b620008c9565b50506001821b620009d2565b5060208310610133831016604e8410600b8410161715620009ac575081810a620009d2565b620009b88383620008dd565b805f1904821115620009ce57620009ce620008c9565b0290505b92915050565b5f620008c260ff84168362000925565b8082028115828204841417620009d257620009d2620008c9565b80820180821115620009d257620009d2620008c9565b612b0b8062000a265f395ff3fe608060405234801561000f575f80fd5b50600436106103f6575f3560e01c80636a092e7911610216578063a9059cbb1161012a578063d31acb28116100b4578063e79d416011610084578063e79d4160146108e8578063e948474b146108f1578063ede49a1914610913578063f19fffcb14610920578063f1f5cd9114610933575f80fd5b8063d31acb2814610875578063db38a41d14610888578063dba61c58146108a7578063dd62ed3e146108b0575f80fd5b8063c4a5abcd116100fa578063c4a5abcd1461083f578063c552f4c514610848578063cc1776d31461085b578063d00efb2f14610863578063d2d7ad831461086c575f80fd5b8063a9059cbb146107e4578063b0ad3ebf146107f7578063c20c5caf14610819578063c2ed286b1461082c575f80fd5b806379cc6790116101ab5780638da5cb5b1161017b5780638da5cb5b1461077c57806395d89b4114610794578063989763ef1461079c578063a457c2d7146107be578063a6f9dae1146107d1575f80fd5b806379cc6790146107205780638091f3bf146107335780638104534514610747578063870333e01461075a575f80fd5b8063715018a6116101e6578063715018a6146106e55780637412dbb3146106ed578063751039fc1461070f578063790ca41314610717575f80fd5b80636a092e791461068e5780636b8f2f3b146106a15780636f864552146106b557806370a08231146106bd575f80fd5b8063368274991161030d57806352c6dbc4116102a25780635d90bbaf116102725780635d90bbaf146106445780635d9d7d43146106575780635e45da231461066a5780636331bf65146106735780636508c57e1461067b575f80fd5b806352c6dbc4146105f95780635543379a1461060b578063570ca7351461061e578063583dd79d14610631575f80fd5b80634c43e307116102dd5780634c43e307146105c35780634f7041a5146105cb5780634f72e2a2146105d35780634fbc2775146105e6575f80fd5b80633682749914610581578063395093511461059457806342966c68146105a757806345541cba146105ba575f80fd5b8063185511081161038e57806328be90381161035e57806328be9038146105025780632b750627146105155780632dcb519914610537578063313ce567146105405780633164df8b1461055f575f80fd5b806318551108146104af5780631e19ae77146104d45780631f4a6d32146104e757806323b872dd146104ef575f80fd5b8063095ea7b3116103c9578063095ea7b3146104555780630f3a325f146104685780631776834a1461048a57806318160ddd1461049d575f80fd5b806301339c21146103fa578063064a59d01461040457806306fdde031461042d57806307a1cfbd14610442575b5f80fd5b61040261093b565b005b60075461041890600160a01b900460ff1681565b60405190151581526020015b60405180910390f35b61043561097d565b6040516104249190612619565b6104026104503660046126cf565b610a09565b61041861046336600461272c565b610a9b565b610418610476366004612754565b60136020525f908152604090205460ff1681565b61040261049836600461276d565b610b8b565b6002545b604051908152602001610424565b6016546001600160a01b03165b6040516001600160a01b039091168152602001610424565b6104026104e2366004612791565b610bbf565b610402610c18565b6104186104fd3660046127c6565b610c53565b610402610510366004612791565b610d78565b610418610523366004612754565b60146020525f908152604090205460ff1681565b6104a1601c5481565b60065461054d9060ff1681565b60405160ff9091168152602001610424565b61041861056d366004612754565b60156020525f908152604090205460ff1681565b61040261058f3660046127ff565b610dd1565b6104186105a236600461272c565b610e1c565b6104026105b536600461276d565b610f2b565b6104a1600f5481565b610402610f8c565b6104a1611071565b6104026105e13660046127ff565b6110e1565b6104026105f4366004612791565b61112e565b600e5461041890610100900460ff1681565b6104026106193660046127ff565b611187565b6007546104bc906001600160a01b031681565b61040261063f36600461281a565b6111d0565b610402610652366004612791565b611218565b610402610665366004612791565b611271565b6104a160115481565b6104a16112ca565b6104026106893660046126cf565b6112e8565b61041861069c366004612865565b611349565b60165461041890600160a01b900460ff1681565b6104a1611460565b6104a16106cb366004612754565b6001600160a01b03165f9081526020819052604090205490565b610402611474565b6104186106fb366004612754565b600a6020525f908152604090205460ff1681565b6104026114f2565b6104a1600b5481565b61040261072e36600461272c565b61152c565b60075461041890600160a81b900460ff1681565b61040261075536600461276d565b6115d5565b610418610768366004612754565b601b6020525f908152604090205460ff1681565b6006546104bc9061010090046001600160a01b031681565b610435611609565b6104186107aa366004612754565b60196020525f908152604090205460ff1681565b6104186107cc36600461272c565b611616565b6104026107df366004612754565b6116e2565b6104186107f236600461272c565b611788565b610418610805366004612754565b60086020525f908152604090205460ff1681565b61040261082736600461276d565b611815565b61040261083a366004612791565b611849565b6104a160105481565b6104026108563660046127ff565b61191f565b6104a1611961565b6104a1600c5481565b6104a160185481565b61040261088336600461288d565b6119a8565b6104a1610896366004612754565b60126020525f908152604090205481565b6104a160175481565b6104a16108be366004612865565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6104a1600d5481565b6104186108ff366004612754565b60096020525f908152604090205460ff1681565b600e546104189060ff1681565b600e546104189062010000900460ff1681565b6104a16119e2565b60065461010090046001600160a01b031633146109735760405162461bcd60e51b815260040161096a906128ad565b60405180910390fd5b61097b611a18565b565b6005805461098a906128f5565b80601f01602080910402602001604051908101604052809291908181526020018280546109b6906128f5565b8015610a015780601f106109d857610100808354040283529160200191610a01565b820191905f5260205f20905b8154815290600101906020018083116109e457829003601f168201915b505050505081565b60065461010090046001600160a01b03163314610a385760405162461bcd60e51b815260040161096a906128ad565b6016546040516307a1cfbd60e01b81526001600160a01b03909116906307a1cfbd90610a6a908590859060040161292d565b5f604051808303815f87803b158015610a81575f80fd5b505af1158015610a93573d5f803e3d5ffd5b505050505050565b6007545f903390600160a01b900460ff168015610ac15750600754600160a81b900460ff165b80610ade57506006546001600160a01b0382811661010090920416145b80610af75750335f9081526008602052604090205460ff165b610b135760405162461bcd60e51b815260040161096a9061294e565b6001600160a01b038416610b395760405162461bcd60e51b815260040161096a9061297b565b335f8181526001602090815260408083206001600160a01b03891680855290835292819020879055518681529192915f80516020612ab683398151915291015b60405180910390a35060019392505050565b60065461010090046001600160a01b03163314610bba5760405162461bcd60e51b815260040161096a906128ad565b601155565b60065461010090046001600160a01b03163314610bee5760405162461bcd60e51b815260040161096a906128ad565b6001600160a01b03919091165f908152601560205260409020805460ff1916911515919091179055565b60075460405147916001600160a01b03169082156108fc029083905f818181858888f19350505050158015610c4f573d5f803e3d5ffd5b5050565b6007545f908490600160a01b900460ff168015610c795750600754600160a81b900460ff165b80610c9657506006546001600160a01b0382811661010090920416145b80610caf5750335f9081526008602052604090205460ff165b610ccb5760405162461bcd60e51b815260040161096a9061294e565b6001600160a01b0385165f908152600160209081526040808320338452909152902054610cf99084906129c6565b6001600160a01b0386165f908152600160209081526040808320338452909152902055610d27858585611a59565b6001600160a01b0385165f81815260016020908152604080832033808552908352928190205490519081529192915f80516020612ab6833981519152910160405180910390a3506001949350505050565b60065461010090046001600160a01b03163314610da75760405162461bcd60e51b815260040161096a906128ad565b6001600160a01b03919091165f908152600a60205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b03163314610e005760405162461bcd60e51b815260040161096a906128ad565b600e8054911515620100000262ff000019909216919091179055565b6007545f903390600160a01b900460ff168015610e425750600754600160a81b900460ff165b80610e5f57506006546001600160a01b0382811661010090920416145b80610e785750335f9081526008602052604090205460ff165b610e945760405162461bcd60e51b815260040161096a9061294e565b6001600160a01b038416610eba5760405162461bcd60e51b815260040161096a9061297b565b335f9081526001602090815260408083206001600160a01b0388168452909152902054610ee89084906129d9565b335f8181526001602090815260408083206001600160a01b038a16808552908352928190208590555193845290925f80516020612ab68339815191529101610b79565b335f9081526015602052604090205460ff16610f7f5760405162461bcd60e51b81526020600482015260136024820152726e6f206275726e207065726d697373696f6e7360681b604482015260640161096a565b610f893382611c68565b50565b600754600160a81b900460ff16610ff75760405162461bcd60e51b815260206004820152602960248201527f63616e206f6e6c792062652063616c6c6564206f6e636520746f6b656e206973604482015268081b185d5b98da195960ba1b606482015260840161096a565b6007546001600160a01b0316331461100d575f80fd5b60165f9054906101000a90046001600160a01b03166001600160a01b031663e4fc6b6d6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611059575f80fd5b505af115801561106b573d5f803e3d5ffd5b50505050565b60165460408051631296b91d60e11b815290515f926001600160a01b03169163252d723a9160048083019260209291908290030181865afa1580156110b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110dc91906129ec565b905090565b60065461010090046001600160a01b031633146111105760405162461bcd60e51b815260040161096a906128ad565b60168054911515600160a01b0260ff60a01b19909216919091179055565b60065461010090046001600160a01b0316331461115d5760405162461bcd60e51b815260040161096a906128ad565b6001600160a01b03919091165f908152600860205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b031633146111b65760405162461bcd60e51b815260040161096a906128ad565b600e80549115156101000261ff0019909216919091179055565b6007546001600160a01b031633146111e6575f80fd5b60165460405163583dd79d60e01b81526001600160a01b039091169063583dd79d90610a6a9085908590600401612a03565b60065461010090046001600160a01b031633146112475760405162461bcd60e51b815260040161096a906128ad565b6001600160a01b03919091165f908152601360205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b031633146112a05760405162461bcd60e51b815260040161096a906128ad565b6001600160a01b03919091165f908152601460205260409020805460ff1916911515919091179055565b5f6127106010546002546112de9190612a2c565b6110dc9190612a43565b60065461010090046001600160a01b031633146113175760405162461bcd60e51b815260040161096a906128ad565b60165460405163328462bf60e11b81526001600160a01b0390911690636508c57e90610a6a908590859060040161292d565b6006545f9061010090046001600160a01b0316331461137a5760405162461bcd60e51b815260040161096a906128ad565b6040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa1580156113be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113e291906129ec565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb906044016020604051808303815f875af1158015611432573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114569190612a62565b9150505b92915050565b5f612710600f546002546112de9190612a2c565b60065461010090046001600160a01b031633146114a35760405162461bcd60e51b815260040161096a906128ad565b6006546040515f9161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360068054610100600160a81b0319169055565b60065461010090046001600160a01b031633146115215760405162461bcd60e51b815260040161096a906128ad565b5f6010819055600f55565b335f9081526015602052604090205460ff166115805760405162461bcd60e51b81526020600482015260136024820152726e6f206275726e207065726d697373696f6e7360681b604482015260640161096a565b61158a8282611c68565b6001600160a01b0382165f81815260016020908152604080832033808552908352928190205490519081529192915f80516020612ab683398151915291015b60405180910390a35050565b60065461010090046001600160a01b031633146116045760405162461bcd60e51b815260040161096a906128ad565b601055565b6004805461098a906128f5565b6007545f903390600160a01b900460ff16801561163c5750600754600160a81b900460ff165b8061165957506006546001600160a01b0382811661010090920416145b806116725750335f9081526008602052604090205460ff165b61168e5760405162461bcd60e51b815260040161096a9061294e565b6001600160a01b0384166116b45760405162461bcd60e51b815260040161096a9061297b565b335f9081526001602090815260408083206001600160a01b0388168452909152902054610ee89084906129c6565b60065461010090046001600160a01b031633146117115760405162461bcd60e51b815260040161096a906128ad565b6001600160a01b0381166117605760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b604482015260640161096a565b600680546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6007545f903390600160a01b900460ff1680156117ae5750600754600160a81b900460ff165b806117cb57506006546001600160a01b0382811661010090920416145b806117e45750335f9081526008602052604090205460ff165b6118005760405162461bcd60e51b815260040161096a9061294e565b61180b338585611a59565b5060019392505050565b60065461010090046001600160a01b031633146118445760405162461bcd60e51b815260040161096a906128ad565b600f55565b60065461010090046001600160a01b031633146118785760405162461bcd60e51b815260040161096a906128ad565b6001600160a01b0382165f908152600a602052604090205460ff16158061189d575080155b6118f55760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74206578636c75646520616e2065786368616e67652066726f6d206044820152620e8c2f60eb1b606482015260840161096a565b6001600160a01b03919091165f908152601960205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b0316331461194e5760405162461bcd60e51b815260040161096a906128ad565b600e805460ff1916911515919091179055565b6016546040805163585e42ef60e11b815290515f926001600160a01b03169163b0bc85de9160048083019260209291908290030181865afa1580156110b8573d5f803e3d5ffd5b60065461010090046001600160a01b031633146119d75760405162461bcd60e51b815260040161096a906128ad565b601891909155601755565b6007545f90600160a81b900460ff1615611a13576003600c5443611a0691906129c6565b1015611a135750611edc90565b505f90565b60065461010090046001600160a01b03163314611a475760405162461bcd60e51b815260040161096a906128ad565b611a4f611ce6565b42600b5543600c55565b6001600160a01b038216611aa85760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b604482015260640161096a565b6001600160a01b0383165f9081526009602052604090205460ff1615611b105760405162461bcd60e51b815260206004820152601e60248201527f61646472657373206973206e6f7420616c6c6f77656420746f2073656c6c0000604482015260640161096a565b60035460ff1615611bb2576001600160a01b0383165f90815260208190526040902054611b3e9082906129c6565b6001600160a01b038085165f908152602081905260408082209390935590841681522054611b6d9082906129d9565b6001600160a01b038381165f818152602081815260409182902094909455518481529092918616915f80516020612a96833981519152910160405180910390a3505050565b611bbd838383611d2a565b5f611bc9848484611d35565b6001600160a01b0385165f90815260208190526040902054909150611bef9083906129c6565b6001600160a01b038086165f908152602081905260408082209390935590851681522054611c1e9082906129d9565b6001600160a01b038481165f818152602081815260409182902094909455518481529092918716915f80516020612a96833981519152910160405180910390a361106b565b505050565b6001600160a01b038216611c7a575f80fd5b80600254611c8891906129c6565b6002556001600160a01b0382165f90815260208190526040902054611cae9082906129c6565b6001600160a01b0383165f8181526020818152604080832094909455925184815290925f80516020612a9683398151915291016115c9565b60065461010090046001600160a01b03163314611d155760405162461bcd60e51b815260040161096a906128ad565b6007805460ff60a81b1916600160a81b179055565b611c63838383611d49565b5f611d41848484611edf565b949350505050565b600754600160a81b900460ff168015611d6b5750601654600160a01b900460ff165b8015611d8e57506001600160a01b0382165f908152600a602052604090205460ff165b8015611da8575042601a54600a611da591906129d9565b11155b8015611dcf57506018546016546001600160a01b03165f9081526020819052604090205410155b8015611df357506001600160a01b0383165f9081526019602052604090205460ff16155b8015611e70575060165f9054906101000a90046001600160a01b03166001600160a01b031663d83067866040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e4a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e6e9190612a62565b155b15611ed45742601a556016546040805163e4fc6b6d60e01b815290516001600160a01b039092169163e4fc6b6d916004808201925f9290919082900301818387803b158015611ebd575f80fd5b505af1158015611ecf573d5f803e3d5ffd5b505050505b611c638383836120f4565b6001600160a01b0383165f90815260196020526040812054829060ff16158015611f2157506001600160a01b0384165f9081526019602052604090205460ff16155b8015611f365750600754600160a81b900460ff165b1561205d576001600160a01b0385165f908152600a602052604090205460ff1615611fce5760165460405163db017dc760e01b8152600481018590526001600160a01b039091169063db017dc7906024016020604051808303815f875af1158015611fa3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fc791906129ec565b905061205d565b6001600160a01b0384165f908152600a602052604090205460ff161561205d57601654604051634fa26fd560e01b8152600481018590526001600160a01b0390911690634fa26fd5906024016020604051808303815f875af1158015612036573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061205a91906129ec565b90505b5f61206882856129c6565b905080156120df576016546001600160a01b03165f908152602081905260409020546120959082906129d9565b601680546001600160a01b039081165f9081526020818152604091829020949094559154915184815291811692908916915f80516020612a96833981519152910160405180910390a35b6120ea868684612489565b9695505050505050565b600e5460ff1615806121155750335f9081526013602052604090205460ff16155b6121535760405162461bcd60e51b815260206004820152600f60248201526e1cdb9a5c195c881c995a9958dd1959608a1b604482015260640161096a565b600754600160a81b900460ff16801561217f57506006546001600160a01b038481166101009092041614155b80156121a357506001600160a01b0383165f9081526014602052604090205460ff16155b80156121c757506001600160a01b0382165f9081526014602052604090205460ff16155b15611c635760115415612226576011545a11156122265760405162461bcd60e51b815260206004820152601e60248201527f74686973206973206f76657220746865206d617820676173206c696d69740000604482015260640161096a565b5f60105411801561224f57506001600160a01b0382165f908152600a602052604090205460ff16155b156122cd5761225c6112ca565b6001600160a01b0383165f9081526020819052604090205461227f9083906129d9565b11156122cd5760405162461bcd60e51b815260206004820181905260248201527f74686973206973206f76657220746865206d617820686f6c6420616d6f756e74604482015260640161096a565b5f600f541180156122f557506001600160a01b0382165f908152600a602052604090205460ff165b1561235157612302611460565b8111156123515760405162461bcd60e51b815260206004820181905260248201527f74686973206973206f76657220746865206d61782073656c6c20616d6f756e74604482015260640161096a565b600e54610100900460ff1615611c63576001600160a01b0382165f908152601260205260409020544390036123b6576001600160a01b0382165f908152601360205260408120805460ff19166001179055600d8054916123b083612a7d565b91905055505b6001600160a01b0383165f9081526012602052604090205443900361240b576001600160a01b0383165f908152601360205260408120805460ff19166001179055600d80549161240583612a7d565b91905055505b6001600160a01b0382165f908152600a602052604081205460ff1615159003612449576001600160a01b0382165f9081526012602052604090204390555b6001600160a01b0383165f908152600a602052604081205460ff1615159003611c635750506001600160a01b03165f908152601260205260409020439055565b6007545f908290600160a81b900460ff1680156124ae5750600e5462010000900460ff165b15612559576006546001600160a01b0386811661010090920416148015906124dc57505f6124da6119e2565b115b801561250057506001600160a01b0385165f9081526014602052604090205460ff16155b801561252457506001600160a01b0384165f9081526014602052604090205460ff16155b15612559575f6127106125356119e2565b61253f9086612a2c565b6125499190612a43565b905061255581836129c6565b9150505b61256485858361256d565b95945050505050565b5f826001600160a01b0316846001600160a01b0316036125cf5760405162461bcd60e51b815260206004820152601f60248201527f796f752063616e6e6f74207472616e7366657220746f20796f757273656c6600604482015260640161096a565b5092915050565b5f81518084525f5b818110156125fa576020818501810151868301820152016125de565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f61262b60208301846125d6565b9392505050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112612655575f80fd5b813567ffffffffffffffff8082111561267057612670612632565b604051601f8301601f19908116603f0116810190828211818310171561269857612698612632565b816040528381528660208588010111156126b0575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f80604083850312156126e0575f80fd5b823567ffffffffffffffff8111156126f6575f80fd5b61270285828601612646565b95602094909401359450505050565b80356001600160a01b0381168114612727575f80fd5b919050565b5f806040838503121561273d575f80fd5b61274683612711565b946020939093013593505050565b5f60208284031215612764575f80fd5b61262b82612711565b5f6020828403121561277d575f80fd5b5035919050565b8015158114610f89575f80fd5b5f80604083850312156127a2575f80fd5b6127ab83612711565b915060208301356127bb81612784565b809150509250929050565b5f805f606084860312156127d8575f80fd5b6127e184612711565b92506127ef60208501612711565b9150604084013590509250925092565b5f6020828403121561280f575f80fd5b813561262b81612784565b5f806040838503121561282b575f80fd5b823567ffffffffffffffff811115612841575f80fd5b61284d85828601612646565b92505061285c60208401612711565b90509250929050565b5f8060408385031215612876575f80fd5b61287f83612711565b915061285c60208401612711565b5f806040838503121561289e575f80fd5b50508035926020909101359150565b60208082526028908201527f63616e206f6e6c792062652063616c6c65642062792074686520636f6e74726160408201526731ba1037bbb732b960c11b606082015260800190565b600181811c9082168061290957607f821691505b60208210810361292757634e487b7160e01b5f52602260045260245ffd5b50919050565b604081525f61293f60408301856125d6565b90508260208301529392505050565b6020808252601390820152721d1c98591a5b99c81b9bdd08195b98589b1959606a1b604082015260600190565b6020808252601c908201527f63616e6e6f7420617070726f7665207468652030206164647265737300000000604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561145a5761145a6129b2565b8082018082111561145a5761145a6129b2565b5f602082840312156129fc575f80fd5b5051919050565b604081525f612a1560408301856125d6565b905060018060a01b03831660208301529392505050565b808202811582820484141761145a5761145a6129b2565b5f82612a5d57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215612a72575f80fd5b815161262b81612784565b5f60018201612a8e57612a8e6129b2565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a26469706673582212209ba694d81b9327d74eaf860646b99829a1ad3d37195dec4d88b31f410467596564736f6c6343000814003361014060405234801562000011575f80fd5b5060405162002d5d38038062002d5d83398101604081905262000034916200019c565b6001600160a01b038316620000905760405162461bcd60e51b815260206004820152601f60248201527f706169726564546f6b656e2063616e6e6f74206265203020616464726573730060448201526064015b60405180910390fd5b6001600160a01b038416620000e85760405162461bcd60e51b815260206004820152601860248201527f706169722063616e6e6f74206265203020616464726573730000000000000000604482015260640162000087565b6001600160a01b038516620001405760405162461bcd60e51b815260206004820152601a60248201527f726f757465722063616e6e6f7420626520302061646472657373000000000000604482015260640162000087565b3360c0526001600160a01b0392831660e052600180546001600160a01b031916958416958617905561010091909152610120521660805260a052620001f5565b80516001600160a01b038116811462000197575f80fd5b919050565b5f805f805f60a08688031215620001b1575f80fd5b620001bc8662000180565b9450620001cc6020870162000180565b9350620001dc6040870162000180565b6060870151608090970151959894975095949392505050565b60805160a05160c05160e0516101005161012051612aa2620002bb5f395f8181610316015261057e01525f818161029c0152610b7301525f6110d401525f81816104170152818161060301528181610776015281816108130152818161089501528181610ab001528181610ba501528181610d2c01528181610eaf01528181610fc2015281816110810152818161112001528181611a2001528181611caa01528181611def01528181611fa5015261211201525f6101d501525f6103cb0152612aa25ff3fe60806040526004361061011e575f3560e01c8063a411209a1161009d578063db017dc711610062578063db017dc714610368578063e4fc6b6d14610387578063ed4ce99e1461039b578063ee16c160146103ba578063fb5a780c146103ed575f80fd5b8063a411209a1461028b578063b0bc85de146102be578063c5be2bc7146102d2578063c8e956ab14610305578063d830678614610338575f80fd5b80633268cc56116100e35780633268cc56146101c45780634fa26fd51461020f578063583dd79d1461022e5780636508c57e1461024d5780638d262cfe1461026c575f80fd5b806307a1cfbd146101295780630dd871571461014a578063135b4fc014610172578063252d723a146101915780632b1fb89e146101a5575f80fd5b3661012557005b5f80fd5b348015610134575f80fd5b506101486101433660046123f4565b61040c565b005b348015610155575f80fd5b5061015f60025481565b6040519081526020015b60405180910390f35b34801561017d575f80fd5b5061014861018c36600461245c565b6105f8565b34801561019c575f80fd5b5061015f61076a565b3480156101b0575f80fd5b506101486101bf36600461245c565b610808565b3480156101cf575f80fd5b506101f77f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610169565b34801561021a575f80fd5b5061015f6102293660046124cd565b610889565b348015610239575f80fd5b506101486102483660046124e4565b6109a7565b348015610258575f80fd5b506101486102673660046123f4565b610aa5565b348015610277575f80fd5b5061014861028636600461245c565b610b9a565b348015610296575f80fd5b5061015f7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102c9575f80fd5b5061015f610d20565b3480156102dd575f80fd5b506102f16102ec3660046124cd565b610db8565b604051610169989796959493929190612565565b348015610310575f80fd5b5061015f7f000000000000000000000000000000000000000000000000000000000000000081565b348015610343575f80fd5b5060015461035890600160a01b900460ff1681565b6040519015158152602001610169565b348015610373575f80fd5b5061015f6103823660046124cd565b610ea3565b348015610392575f80fd5b50610148610fb7565b3480156103a6575f80fd5b506101486103b5366004612601565b611f9a565b3480156103c5575f80fd5b506101f77f000000000000000000000000000000000000000000000000000000000000000081565b3480156103f8575f80fd5b5061014861040736600461265e565b612107565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461045d5760405162461bcd60e51b8152600401610454906126a8565b60405180910390fd5b5f805b60035481101561055e5761051b60038281548110610480576104806126d0565b905f5260205f2090600702015f018054610499906126e4565b80601f01602080910402602001604051908101604052809291908181526020018280546104c5906126e4565b80156105105780601f106104e757610100808354040283529160200191610510565b820191905f5260205f20905b8154815290600101906020018083116104f357829003601f168201915b505050505085612266565b1561054c578260038281548110610534576105346126d0565b905f5260205f20906007020160010181905550600191505b8061055681612730565b915050610460565b508061057c5760405162461bcd60e51b815260040161045490612748565b7f00000000000000000000000000000000000000000000000000000000000000006105a561076a565b11156105f35760405162461bcd60e51b815260206004820152601b60248201527f7461782063616e6e6f74206265207365742074686973206869676800000000006044820152606401610454565b505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106405760405162461bcd60e51b8152600401610454906126a8565b60036040518061010001604052808781526020018681526020018581526020015f81526020016003600481111561067957610679612551565b81526001600160a01b0385166020808301919091525f604083018190528515156060909301929092528354600181018555938252902081519192600702019081906106c490826127cc565b506020820151816001015560408201518160020155606082015181600301556080820151816004015f6101000a81548160ff0219169083600481111561070c5761070c612551565b021790555060a0820151600482018054610100600160a81b0319166101006001600160a01b039093169290920291909117905560c0820151600582015560e0909101516006909101805460ff19169115159190911790555050505050565b5f336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107b35760405162461bcd60e51b8152600401610454906126a8565b5f805b60035481101561080257600381815481106107d3576107d36126d0565b905f5260205f20906007020160010154826107ee9190612888565b9150806107fa81612730565b9150506107b6565b50905090565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108505760405162461bcd60e51b8152600401610454906126a8565b60036040518061010001604052808781526020018681526020018581526020015f81526020016001600481111561067957610679612551565b5f336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108d25760405162461bcd60e51b8152600401610454906126a8565b5f5b60035481101561099d575f600382815481106108f2576108f26126d0565b905f5260205f20906007020160020154111561098b575f6127106003838154811061091f5761091f6126d0565b905f5260205f209060070201600201548561093a919061289b565b61094491906128b2565b9050806003838154811061095a5761095a6126d0565b905f5260205f2090600702016003015f8282546109779190612888565b90915550610987905081856128d1565b9350505b8061099581612730565b9150506108d4565b508190505b919050565b335f9081526020819052604081205460ff1615610a88575f5b600354811015610a86575f600382815481106109de576109de6126d0565b5f9182526020909120600460079092020181015460ff1690811115610a0557610a05612551565b148015610a235750610a2360038281548110610480576104806126d0565b15610a74578260038281548110610a3c57610a3c6126d0565b905f5260205f20906007020160040160016101000a8154816001600160a01b0302191690836001600160a01b03160217905550600191505b80610a7e81612730565b9150506109c0565b505b806105f35760405162461bcd60e51b815260040161045490612748565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610aed5760405162461bcd60e51b8152600401610454906126a8565b5f805b600354811015610b5357610b1060038281548110610480576104806126d0565b15610b41578260038281548110610b2957610b296126d0565b905f5260205f20906007020160020181905550600191505b80610b4b81612730565b915050610af0565b5080610b715760405162461bcd60e51b815260040161045490612748565b7f00000000000000000000000000000000000000000000000000000000000000006105a5610d20565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610be25760405162461bcd60e51b8152600401610454906126a8565b60036040518061010001604052808781526020018681526020018581526020015f81526020015f6004811115610c1a57610c1a612551565b81526001600160a01b0385166020808301919091525f60408301819052851515606090930192909252835460018101855593825290208151919260070201908190610c6590826127cc565b506020820151816001015560408201518160020155606082015181600301556080820151816004015f6101000a81548160ff02191690836004811115610cad57610cad612551565b021790555060a08201516004820180546001600160a01b0392831661010002610100600160a81b031990911617905560c0830151600583015560e0909201516006909101805491151560ff199283161790559083165f908152602081905260409020805490911660011790555050505050565b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610d695760405162461bcd60e51b8152600401610454906126a8565b5f805b6003548110156108025760038181548110610d8957610d896126d0565b905f5260205f2090600702016002015482610da49190612888565b915080610db081612730565b915050610d6c565b60038181548110610dc7575f80fd5b905f5260205f2090600702015f91509050805f018054610de6906126e4565b80601f0160208091040260200160405190810160405280929190818152602001828054610e12906126e4565b8015610e5d5780601f10610e3457610100808354040283529160200191610e5d565b820191905f5260205f20905b815481529060010190602001808311610e4057829003601f168201915b505050506001830154600284015460038501546004860154600587015460069097015495969395929450909260ff808316936101009093046001600160a01b0316921688565b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610eec5760405162461bcd60e51b8152600401610454906126a8565b5f5b60035481101561099d575f60038281548110610f0c57610f0c6126d0565b905f5260205f209060070201600101541115610fa5575f61271060038381548110610f3957610f396126d0565b905f5260205f2090600702016001015485610f54919061289b565b610f5e91906128b2565b90508060038381548110610f7457610f746126d0565b905f5260205f2090600702016003015f828254610f919190612888565b90915550610fa1905081856128d1565b9350505b80610faf81612730565b915050610eee565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fff5760405162461bcd60e51b8152600401610454906126a8565b600154600160a01b900460ff161561104c5760405162461bcd60e51b815260206004820152601060248201526f616c7265616479207377617070696e6760801b6044820152606401610454565b6001805460ff60a01b1916600160a01b1790556040805160028082526060820183525f926020830190803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000815f815181106110b2576110b26126d0565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611106576111066126d0565b6001600160a01b03909216602092830291909101909101527f00000000000000000000000000000000000000000000000000000000000000005f805b60035481101561127057600260038281548110611161576111616126d0565b5f9182526020909120600460079092020181015460ff169081111561118857611188612551565b036111ff575f6002600383815481106111a3576111a36126d0565b905f5260205f209060070201600301546111bd91906128b2565b905080600383815481106111d3576111d36126d0565b905f5260205f209060070201600301546111ed91906128d1565b6111f79084612888565b92505061125e565b60038181548110611212576112126126d0565b5f91825260209091206006600790920201015460ff161561125e5760038181548110611240576112406126d0565b905f5260205f209060070201600301548261125b9190612888565b91505b8061126881612730565b915050611142565b5061127b82826122bf565b90508061128883836122bf565b14611318577fde3142f93c040ab4be0d03a16ac06c502816c1205865dd41d9848727102570d16040516113089060208082526033908201527f496e73756666696369656e7420746f6b656e7320746f20737761702e20506c6560408201527261736520616464206d6f726520746f6b656e7360681b606082015260800190565b60405180910390a1505050611f8b565b6001545f906001600160a01b03166318cbafe58383873061133b4261012c612888565b6040518663ffffffff1660e01b815260040161135b9594939291906128e4565b5f604051808303815f875af1158015611376573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261139d9190810190612953565b90505f479050815f815181106113b5576113b56126d0565b6020026020010151831415806113e55750816001815181106113d9576113d96126d0565b60200260200101518114155b15611460577fde3142f93c040ab4be0d03a16ac06c502816c1205865dd41d9848727102570d16040516114579060208082526025908201527f556e657870656374656420616d6f756e74732072657475726e65642066726f6d604082015264020737761760dc1b606082015260800190565b60405180910390a15b805f5b6003548110156116965760038181548110611480576114806126d0565b5f91825260209091206006600790920201015460ff16806114da57506002600382815481106114b1576114b16126d0565b5f9182526020909120600460079092020181015460ff16908111156114d8576114d8612551565b145b15611684576003546114ee906001906128d1565b8103611520578160038281548110611508576115086126d0565b905f5260205f20906007020160050181905550611684565b600260038281548110611535576115356126d0565b5f9182526020909120600460079092020181015460ff169081111561155c5761155c612551565b03611613575f600260038381548110611577576115776126d0565b905f5260205f2090600702016003015461159191906128b2565b90505f8682600385815481106115a9576115a96126d0565b905f5260205f209060070201600301546115c391906128d1565b6115cd908761289b565b6115d791906128b2565b905080600384815481106115ed576115ed6126d0565b5f91825260209091206005600790920201015561160a81856128d1565b93505050611684565b5f8560038381548110611628576116286126d0565b905f5260205f2090600702016003015485611643919061289b565b61164d91906128b2565b90508060038381548110611663576116636126d0565b5f91825260209091206005600790920201015561168081846128d1565b9250505b8061168e81612730565b915050611463565b505f5b600354811015611f46575f600382815481106116b7576116b76126d0565b5f9182526020909120600460079092020181015460ff16908111156116de576116de612551565b0361188157600381815481106116f6576116f66126d0565b5f91825260209091206006600790920201015460ff16156117a45760038181548110611724576117246126d0565b905f5260205f20906007020160040160019054906101000a90046001600160a01b03166001600160a01b03166108fc60038381548110611766576117666126d0565b905f5260205f2090600702016005015490811502906040515f60405180830381858888f1935050505015801561179e573d5f803e3d5ffd5b50611ee6565b856001600160a01b031663a9059cbb600383815481106117c6576117c66126d0565b905f5260205f20906007020160040160019054906101000a90046001600160a01b03166118158960038681548110611800576118006126d0565b905f5260205f209060070201600301546122bf565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af115801561185d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061179e91906129f4565b6003808281548110611895576118956126d0565b5f9182526020909120600460079092020181015460ff16908111156118bc576118bc612551565b03611abf57600381815481106118d4576118d46126d0565b5f91825260209091206006600790920201015460ff16156119025760038181548110611724576117246126d0565b856001600160a01b031663095ea7b360038381548110611924576119246126d0565b905f5260205f20906007020160040160019054906101000a90046001600160a01b03166003848154811061195a5761195a6126d0565b5f9182526020909120600360079092020101546040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af11580156119b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119d991906129f4565b50600381815481106119ed576119ed6126d0565b905f5260205f20906007020160040160019054906101000a90046001600160a01b03166001600160a01b0316634ec109f47f000000000000000000000000000000000000000000000000000000000000000030611a578a60038781548110611800576118006126d0565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064015b5f604051808303815f87803b158015611aa4575f80fd5b505af1158015611ab6573d5f803e3d5ffd5b50505050611ee6565b600160038281548110611ad457611ad46126d0565b5f9182526020909120600460079092020181015460ff1690811115611afb57611afb612551565b03611c675760038181548110611b1357611b136126d0565b5f91825260209091206006600790920201015460ff1615611bda5760038181548110611b4157611b416126d0565b905f5260205f20906007020160040160019054906101000a90046001600160a01b03166001600160a01b031663db6b524660038381548110611b8557611b856126d0565b905f5260205f209060070201600501546040518263ffffffff1660e01b81526004015f604051808303818588803b158015611bbe575f80fd5b505af1158015611bd0573d5f803e3d5ffd5b5050505050611ee6565b60038181548110611bed57611bed6126d0565b905f5260205f20906007020160040160019054906101000a90046001600160a01b03166001600160a01b031663338b5dea30611c368960038681548110611800576118006126d0565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401611a8d565b600460038281548110611c7c57611c7c6126d0565b5f9182526020909120600460079092020181015460ff1690811115611ca357611ca3612551565b03611d0c577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166342966c68611cee8860038581548110611800576118006126d0565b6040518263ffffffff1660e01b8152600401611a8d91815260200190565b600260038281548110611d2157611d216126d0565b5f9182526020909120600460079092020181015460ff1690811115611d4857611d48612551565b03611ee6575f60038281548110611d6157611d616126d0565b905f5260205f209060070201600501541115611ee6575f611db087600260038581548110611d9157611d916126d0565b905f5260205f20906007020160030154611dab91906128b2565b6122bf565b600154600380549293506001600160a01b039091169163f305d719919085908110611ddd57611ddd6126d0565b905f5260205f209060070201600501547f0000000000000000000000000000000000000000000000000000000000000000845f8060038981548110611e2457611e246126d0565b5f91825260209091206007909102016004015461010090046001600160a01b0316611e514261012c612888565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c40160606040518083038185885af1158015611ebc573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190611ee19190612a0f565b505050505b5f60038281548110611efa57611efa6126d0565b905f5260205f209060070201600301819055505f60038281548110611f2157611f216126d0565b5f91825260209091206005600790920201015580611f3e81612730565b915050611699565b5060408051858152602081018490527f5e20c9aee521e656eed033c4ae35378c79c584706f5ce7f410ab3fba389607a1910160405180910390a1505042600255505050505b6001805460ff60a01b19169055565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611fe25760405162461bcd60e51b8152600401610454906126a8565b60036040518061010001604052808681526020018581526020018481526020015f81526020016002600481111561201b5761201b612551565b81526001600160a01b0384166020808301919091525f60408301819052606090920182905283546001810185559382529020815191926007020190819061206290826127cc565b506020820151816001015560408201518160020155606082015181600301556080820151816004015f6101000a81548160ff021916908360048111156120aa576120aa612551565b021790555060a0820151600482018054610100600160a81b0319166101006001600160a01b039093169290920291909117905560c0820151600582015560e0909101516006909101805460ff191691151591909117905550505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461214f5760405162461bcd60e51b8152600401610454906126a8565b60036040518061010001604052808581526020018481526020018381526020015f815260200160048081111561218757612187612551565b81525f602080830182905260408301829052606090920181905283546001810185559381522081519192600702019081906121c290826127cc565b506020820151816001015560408201518160020155606082015181600301556080820151816004015f6101000a81548160ff0219169083600481111561220a5761220a612551565b021790555060a0820151600482018054610100600160a81b0319166101006001600160a01b039093169290920291909117905560c0820151600582015560e0909101516006909101805460ff1916911515919091179055505050565b5f816040516020016122789190612a3a565b604051602081830303815290604052805190602001208360405160200161229f9190612a3a565b604051602081830303815290604052805190602001201490505b92915050565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015612305573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123299190612a55565b90508281111561233c57829150506122b9565b9392505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561238057612380612343565b604052919050565b5f82601f830112612397575f80fd5b813567ffffffffffffffff8111156123b1576123b1612343565b6123c4601f8201601f1916602001612357565b8181528460208386010111156123d8575f80fd5b816020850160208301375f918101602001919091529392505050565b5f8060408385031215612405575f80fd5b823567ffffffffffffffff81111561241b575f80fd5b61242785828601612388565b95602094909401359450505050565b80356001600160a01b03811681146109a2575f80fd5b8015158114612459575f80fd5b50565b5f805f805f60a08688031215612470575f80fd5b853567ffffffffffffffff811115612486575f80fd5b61249288828901612388565b95505060208601359350604086013592506124af60608701612436565b915060808601356124bf8161244c565b809150509295509295909350565b5f602082840312156124dd575f80fd5b5035919050565b5f80604083850312156124f5575f80fd5b823567ffffffffffffffff81111561250b575f80fd5b61251785828601612388565b92505061252660208401612436565b90509250929050565b5f5b83811015612549578181015183820152602001612531565b50505f910152565b634e487b7160e01b5f52602160045260245ffd5b5f6101008083528a51808285015261012091506125888183860160208f0161252f565b602084018b9052604084018a905260608401899052601f01601f19168301019050600586106125c557634e487b7160e01b5f52602160045260245ffd5b8560808301526125e060a08301866001600160a01b03169052565b8360c08301526125f460e083018415159052565b9998505050505050505050565b5f805f8060808587031215612614575f80fd5b843567ffffffffffffffff81111561262a575f80fd5b61263687828801612388565b945050602085013592506040850135915061265360608601612436565b905092959194509250565b5f805f60608486031215612670575f80fd5b833567ffffffffffffffff811115612686575f80fd5b61269286828701612388565b9660208601359650604090950135949350505050565b6020808252600e908201526d6e6f207065726d697373696f6e7360901b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b600181811c908216806126f857607f821691505b60208210810361271657634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b5f600182016127415761274161271c565b5060010190565b6020808252601c908201527f636f756c64206e6f742066696e642074617820746f2075706461746500000000604082015260600190565b601f8211156105f3575f81815260208120601f850160051c810160208610156127a55750805b601f850160051c820191505b818110156127c4578281556001016127b1565b505050505050565b815167ffffffffffffffff8111156127e6576127e6612343565b6127fa816127f484546126e4565b8461277f565b602080601f83116001811461282d575f84156128165750858301515b5f19600386901b1c1916600185901b1785556127c4565b5f85815260208120601f198616915b8281101561285b5788860151825594840194600190910190840161283c565b508582101561287857878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156122b9576122b961271c565b80820281158282048414176122b9576122b961271c565b5f826128cc57634e487b7160e01b5f52601260045260245ffd5b500490565b818103818111156122b9576122b961271c565b5f60a082018783526020878185015260a0604085015281875180845260c08601915082890193505f5b818110156129325784516001600160a01b03168352938301939183019160010161290d565b50506001600160a01b03969096166060850152505050608001529392505050565b5f6020808385031215612964575f80fd5b825167ffffffffffffffff8082111561297b575f80fd5b818501915085601f83011261298e575f80fd5b8151818111156129a0576129a0612343565b8060051b91506129b1848301612357565b81815291830184019184810190888411156129ca575f80fd5b938501935b838510156129e8578451825293850193908501906129cf565b98975050505050505050565b5f60208284031215612a04575f80fd5b815161233c8161244c565b5f805f60608486031215612a21575f80fd5b8351925060208401519150604084015190509250925092565b5f8251612a4b81846020870161252f565b9190910192915050565b5f60208284031215612a65575f80fd5b505191905056fea2646970667358221220b2c6616cc20eee9fded2d304bb24b7c5fa3f5d87a94953387dc2adcfdf5d1d4864736f6c63430008140033

Deployed Bytecode

0x608060405234801561000f575f80fd5b50600436106103f6575f3560e01c80636a092e7911610216578063a9059cbb1161012a578063d31acb28116100b4578063e79d416011610084578063e79d4160146108e8578063e948474b146108f1578063ede49a1914610913578063f19fffcb14610920578063f1f5cd9114610933575f80fd5b8063d31acb2814610875578063db38a41d14610888578063dba61c58146108a7578063dd62ed3e146108b0575f80fd5b8063c4a5abcd116100fa578063c4a5abcd1461083f578063c552f4c514610848578063cc1776d31461085b578063d00efb2f14610863578063d2d7ad831461086c575f80fd5b8063a9059cbb146107e4578063b0ad3ebf146107f7578063c20c5caf14610819578063c2ed286b1461082c575f80fd5b806379cc6790116101ab5780638da5cb5b1161017b5780638da5cb5b1461077c57806395d89b4114610794578063989763ef1461079c578063a457c2d7146107be578063a6f9dae1146107d1575f80fd5b806379cc6790146107205780638091f3bf146107335780638104534514610747578063870333e01461075a575f80fd5b8063715018a6116101e6578063715018a6146106e55780637412dbb3146106ed578063751039fc1461070f578063790ca41314610717575f80fd5b80636a092e791461068e5780636b8f2f3b146106a15780636f864552146106b557806370a08231146106bd575f80fd5b8063368274991161030d57806352c6dbc4116102a25780635d90bbaf116102725780635d90bbaf146106445780635d9d7d43146106575780635e45da231461066a5780636331bf65146106735780636508c57e1461067b575f80fd5b806352c6dbc4146105f95780635543379a1461060b578063570ca7351461061e578063583dd79d14610631575f80fd5b80634c43e307116102dd5780634c43e307146105c35780634f7041a5146105cb5780634f72e2a2146105d35780634fbc2775146105e6575f80fd5b80633682749914610581578063395093511461059457806342966c68146105a757806345541cba146105ba575f80fd5b8063185511081161038e57806328be90381161035e57806328be9038146105025780632b750627146105155780632dcb519914610537578063313ce567146105405780633164df8b1461055f575f80fd5b806318551108146104af5780631e19ae77146104d45780631f4a6d32146104e757806323b872dd146104ef575f80fd5b8063095ea7b3116103c9578063095ea7b3146104555780630f3a325f146104685780631776834a1461048a57806318160ddd1461049d575f80fd5b806301339c21146103fa578063064a59d01461040457806306fdde031461042d57806307a1cfbd14610442575b5f80fd5b61040261093b565b005b60075461041890600160a01b900460ff1681565b60405190151581526020015b60405180910390f35b61043561097d565b6040516104249190612619565b6104026104503660046126cf565b610a09565b61041861046336600461272c565b610a9b565b610418610476366004612754565b60136020525f908152604090205460ff1681565b61040261049836600461276d565b610b8b565b6002545b604051908152602001610424565b6016546001600160a01b03165b6040516001600160a01b039091168152602001610424565b6104026104e2366004612791565b610bbf565b610402610c18565b6104186104fd3660046127c6565b610c53565b610402610510366004612791565b610d78565b610418610523366004612754565b60146020525f908152604090205460ff1681565b6104a1601c5481565b60065461054d9060ff1681565b60405160ff9091168152602001610424565b61041861056d366004612754565b60156020525f908152604090205460ff1681565b61040261058f3660046127ff565b610dd1565b6104186105a236600461272c565b610e1c565b6104026105b536600461276d565b610f2b565b6104a1600f5481565b610402610f8c565b6104a1611071565b6104026105e13660046127ff565b6110e1565b6104026105f4366004612791565b61112e565b600e5461041890610100900460ff1681565b6104026106193660046127ff565b611187565b6007546104bc906001600160a01b031681565b61040261063f36600461281a565b6111d0565b610402610652366004612791565b611218565b610402610665366004612791565b611271565b6104a160115481565b6104a16112ca565b6104026106893660046126cf565b6112e8565b61041861069c366004612865565b611349565b60165461041890600160a01b900460ff1681565b6104a1611460565b6104a16106cb366004612754565b6001600160a01b03165f9081526020819052604090205490565b610402611474565b6104186106fb366004612754565b600a6020525f908152604090205460ff1681565b6104026114f2565b6104a1600b5481565b61040261072e36600461272c565b61152c565b60075461041890600160a81b900460ff1681565b61040261075536600461276d565b6115d5565b610418610768366004612754565b601b6020525f908152604090205460ff1681565b6006546104bc9061010090046001600160a01b031681565b610435611609565b6104186107aa366004612754565b60196020525f908152604090205460ff1681565b6104186107cc36600461272c565b611616565b6104026107df366004612754565b6116e2565b6104186107f236600461272c565b611788565b610418610805366004612754565b60086020525f908152604090205460ff1681565b61040261082736600461276d565b611815565b61040261083a366004612791565b611849565b6104a160105481565b6104026108563660046127ff565b61191f565b6104a1611961565b6104a1600c5481565b6104a160185481565b61040261088336600461288d565b6119a8565b6104a1610896366004612754565b60126020525f908152604090205481565b6104a160175481565b6104a16108be366004612865565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6104a1600d5481565b6104186108ff366004612754565b60096020525f908152604090205460ff1681565b600e546104189060ff1681565b600e546104189062010000900460ff1681565b6104a16119e2565b60065461010090046001600160a01b031633146109735760405162461bcd60e51b815260040161096a906128ad565b60405180910390fd5b61097b611a18565b565b6005805461098a906128f5565b80601f01602080910402602001604051908101604052809291908181526020018280546109b6906128f5565b8015610a015780601f106109d857610100808354040283529160200191610a01565b820191905f5260205f20905b8154815290600101906020018083116109e457829003601f168201915b505050505081565b60065461010090046001600160a01b03163314610a385760405162461bcd60e51b815260040161096a906128ad565b6016546040516307a1cfbd60e01b81526001600160a01b03909116906307a1cfbd90610a6a908590859060040161292d565b5f604051808303815f87803b158015610a81575f80fd5b505af1158015610a93573d5f803e3d5ffd5b505050505050565b6007545f903390600160a01b900460ff168015610ac15750600754600160a81b900460ff165b80610ade57506006546001600160a01b0382811661010090920416145b80610af75750335f9081526008602052604090205460ff165b610b135760405162461bcd60e51b815260040161096a9061294e565b6001600160a01b038416610b395760405162461bcd60e51b815260040161096a9061297b565b335f8181526001602090815260408083206001600160a01b03891680855290835292819020879055518681529192915f80516020612ab683398151915291015b60405180910390a35060019392505050565b60065461010090046001600160a01b03163314610bba5760405162461bcd60e51b815260040161096a906128ad565b601155565b60065461010090046001600160a01b03163314610bee5760405162461bcd60e51b815260040161096a906128ad565b6001600160a01b03919091165f908152601560205260409020805460ff1916911515919091179055565b60075460405147916001600160a01b03169082156108fc029083905f818181858888f19350505050158015610c4f573d5f803e3d5ffd5b5050565b6007545f908490600160a01b900460ff168015610c795750600754600160a81b900460ff165b80610c9657506006546001600160a01b0382811661010090920416145b80610caf5750335f9081526008602052604090205460ff165b610ccb5760405162461bcd60e51b815260040161096a9061294e565b6001600160a01b0385165f908152600160209081526040808320338452909152902054610cf99084906129c6565b6001600160a01b0386165f908152600160209081526040808320338452909152902055610d27858585611a59565b6001600160a01b0385165f81815260016020908152604080832033808552908352928190205490519081529192915f80516020612ab6833981519152910160405180910390a3506001949350505050565b60065461010090046001600160a01b03163314610da75760405162461bcd60e51b815260040161096a906128ad565b6001600160a01b03919091165f908152600a60205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b03163314610e005760405162461bcd60e51b815260040161096a906128ad565b600e8054911515620100000262ff000019909216919091179055565b6007545f903390600160a01b900460ff168015610e425750600754600160a81b900460ff165b80610e5f57506006546001600160a01b0382811661010090920416145b80610e785750335f9081526008602052604090205460ff165b610e945760405162461bcd60e51b815260040161096a9061294e565b6001600160a01b038416610eba5760405162461bcd60e51b815260040161096a9061297b565b335f9081526001602090815260408083206001600160a01b0388168452909152902054610ee89084906129d9565b335f8181526001602090815260408083206001600160a01b038a16808552908352928190208590555193845290925f80516020612ab68339815191529101610b79565b335f9081526015602052604090205460ff16610f7f5760405162461bcd60e51b81526020600482015260136024820152726e6f206275726e207065726d697373696f6e7360681b604482015260640161096a565b610f893382611c68565b50565b600754600160a81b900460ff16610ff75760405162461bcd60e51b815260206004820152602960248201527f63616e206f6e6c792062652063616c6c6564206f6e636520746f6b656e206973604482015268081b185d5b98da195960ba1b606482015260840161096a565b6007546001600160a01b0316331461100d575f80fd5b60165f9054906101000a90046001600160a01b03166001600160a01b031663e4fc6b6d6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611059575f80fd5b505af115801561106b573d5f803e3d5ffd5b50505050565b60165460408051631296b91d60e11b815290515f926001600160a01b03169163252d723a9160048083019260209291908290030181865afa1580156110b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110dc91906129ec565b905090565b60065461010090046001600160a01b031633146111105760405162461bcd60e51b815260040161096a906128ad565b60168054911515600160a01b0260ff60a01b19909216919091179055565b60065461010090046001600160a01b0316331461115d5760405162461bcd60e51b815260040161096a906128ad565b6001600160a01b03919091165f908152600860205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b031633146111b65760405162461bcd60e51b815260040161096a906128ad565b600e80549115156101000261ff0019909216919091179055565b6007546001600160a01b031633146111e6575f80fd5b60165460405163583dd79d60e01b81526001600160a01b039091169063583dd79d90610a6a9085908590600401612a03565b60065461010090046001600160a01b031633146112475760405162461bcd60e51b815260040161096a906128ad565b6001600160a01b03919091165f908152601360205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b031633146112a05760405162461bcd60e51b815260040161096a906128ad565b6001600160a01b03919091165f908152601460205260409020805460ff1916911515919091179055565b5f6127106010546002546112de9190612a2c565b6110dc9190612a43565b60065461010090046001600160a01b031633146113175760405162461bcd60e51b815260040161096a906128ad565b60165460405163328462bf60e11b81526001600160a01b0390911690636508c57e90610a6a908590859060040161292d565b6006545f9061010090046001600160a01b0316331461137a5760405162461bcd60e51b815260040161096a906128ad565b6040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa1580156113be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113e291906129ec565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb906044016020604051808303815f875af1158015611432573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114569190612a62565b9150505b92915050565b5f612710600f546002546112de9190612a2c565b60065461010090046001600160a01b031633146114a35760405162461bcd60e51b815260040161096a906128ad565b6006546040515f9161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360068054610100600160a81b0319169055565b60065461010090046001600160a01b031633146115215760405162461bcd60e51b815260040161096a906128ad565b5f6010819055600f55565b335f9081526015602052604090205460ff166115805760405162461bcd60e51b81526020600482015260136024820152726e6f206275726e207065726d697373696f6e7360681b604482015260640161096a565b61158a8282611c68565b6001600160a01b0382165f81815260016020908152604080832033808552908352928190205490519081529192915f80516020612ab683398151915291015b60405180910390a35050565b60065461010090046001600160a01b031633146116045760405162461bcd60e51b815260040161096a906128ad565b601055565b6004805461098a906128f5565b6007545f903390600160a01b900460ff16801561163c5750600754600160a81b900460ff165b8061165957506006546001600160a01b0382811661010090920416145b806116725750335f9081526008602052604090205460ff165b61168e5760405162461bcd60e51b815260040161096a9061294e565b6001600160a01b0384166116b45760405162461bcd60e51b815260040161096a9061297b565b335f9081526001602090815260408083206001600160a01b0388168452909152902054610ee89084906129c6565b60065461010090046001600160a01b031633146117115760405162461bcd60e51b815260040161096a906128ad565b6001600160a01b0381166117605760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b604482015260640161096a565b600680546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6007545f903390600160a01b900460ff1680156117ae5750600754600160a81b900460ff165b806117cb57506006546001600160a01b0382811661010090920416145b806117e45750335f9081526008602052604090205460ff165b6118005760405162461bcd60e51b815260040161096a9061294e565b61180b338585611a59565b5060019392505050565b60065461010090046001600160a01b031633146118445760405162461bcd60e51b815260040161096a906128ad565b600f55565b60065461010090046001600160a01b031633146118785760405162461bcd60e51b815260040161096a906128ad565b6001600160a01b0382165f908152600a602052604090205460ff16158061189d575080155b6118f55760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74206578636c75646520616e2065786368616e67652066726f6d206044820152620e8c2f60eb1b606482015260840161096a565b6001600160a01b03919091165f908152601960205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b0316331461194e5760405162461bcd60e51b815260040161096a906128ad565b600e805460ff1916911515919091179055565b6016546040805163585e42ef60e11b815290515f926001600160a01b03169163b0bc85de9160048083019260209291908290030181865afa1580156110b8573d5f803e3d5ffd5b60065461010090046001600160a01b031633146119d75760405162461bcd60e51b815260040161096a906128ad565b601891909155601755565b6007545f90600160a81b900460ff1615611a13576003600c5443611a0691906129c6565b1015611a135750611edc90565b505f90565b60065461010090046001600160a01b03163314611a475760405162461bcd60e51b815260040161096a906128ad565b611a4f611ce6565b42600b5543600c55565b6001600160a01b038216611aa85760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b604482015260640161096a565b6001600160a01b0383165f9081526009602052604090205460ff1615611b105760405162461bcd60e51b815260206004820152601e60248201527f61646472657373206973206e6f7420616c6c6f77656420746f2073656c6c0000604482015260640161096a565b60035460ff1615611bb2576001600160a01b0383165f90815260208190526040902054611b3e9082906129c6565b6001600160a01b038085165f908152602081905260408082209390935590841681522054611b6d9082906129d9565b6001600160a01b038381165f818152602081815260409182902094909455518481529092918616915f80516020612a96833981519152910160405180910390a3505050565b611bbd838383611d2a565b5f611bc9848484611d35565b6001600160a01b0385165f90815260208190526040902054909150611bef9083906129c6565b6001600160a01b038086165f908152602081905260408082209390935590851681522054611c1e9082906129d9565b6001600160a01b038481165f818152602081815260409182902094909455518481529092918716915f80516020612a96833981519152910160405180910390a361106b565b505050565b6001600160a01b038216611c7a575f80fd5b80600254611c8891906129c6565b6002556001600160a01b0382165f90815260208190526040902054611cae9082906129c6565b6001600160a01b0383165f8181526020818152604080832094909455925184815290925f80516020612a9683398151915291016115c9565b60065461010090046001600160a01b03163314611d155760405162461bcd60e51b815260040161096a906128ad565b6007805460ff60a81b1916600160a81b179055565b611c63838383611d49565b5f611d41848484611edf565b949350505050565b600754600160a81b900460ff168015611d6b5750601654600160a01b900460ff165b8015611d8e57506001600160a01b0382165f908152600a602052604090205460ff165b8015611da8575042601a54600a611da591906129d9565b11155b8015611dcf57506018546016546001600160a01b03165f9081526020819052604090205410155b8015611df357506001600160a01b0383165f9081526019602052604090205460ff16155b8015611e70575060165f9054906101000a90046001600160a01b03166001600160a01b031663d83067866040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e4a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e6e9190612a62565b155b15611ed45742601a556016546040805163e4fc6b6d60e01b815290516001600160a01b039092169163e4fc6b6d916004808201925f9290919082900301818387803b158015611ebd575f80fd5b505af1158015611ecf573d5f803e3d5ffd5b505050505b611c638383836120f4565b6001600160a01b0383165f90815260196020526040812054829060ff16158015611f2157506001600160a01b0384165f9081526019602052604090205460ff16155b8015611f365750600754600160a81b900460ff165b1561205d576001600160a01b0385165f908152600a602052604090205460ff1615611fce5760165460405163db017dc760e01b8152600481018590526001600160a01b039091169063db017dc7906024016020604051808303815f875af1158015611fa3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fc791906129ec565b905061205d565b6001600160a01b0384165f908152600a602052604090205460ff161561205d57601654604051634fa26fd560e01b8152600481018590526001600160a01b0390911690634fa26fd5906024016020604051808303815f875af1158015612036573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061205a91906129ec565b90505b5f61206882856129c6565b905080156120df576016546001600160a01b03165f908152602081905260409020546120959082906129d9565b601680546001600160a01b039081165f9081526020818152604091829020949094559154915184815291811692908916915f80516020612a96833981519152910160405180910390a35b6120ea868684612489565b9695505050505050565b600e5460ff1615806121155750335f9081526013602052604090205460ff16155b6121535760405162461bcd60e51b815260206004820152600f60248201526e1cdb9a5c195c881c995a9958dd1959608a1b604482015260640161096a565b600754600160a81b900460ff16801561217f57506006546001600160a01b038481166101009092041614155b80156121a357506001600160a01b0383165f9081526014602052604090205460ff16155b80156121c757506001600160a01b0382165f9081526014602052604090205460ff16155b15611c635760115415612226576011545a11156122265760405162461bcd60e51b815260206004820152601e60248201527f74686973206973206f76657220746865206d617820676173206c696d69740000604482015260640161096a565b5f60105411801561224f57506001600160a01b0382165f908152600a602052604090205460ff16155b156122cd5761225c6112ca565b6001600160a01b0383165f9081526020819052604090205461227f9083906129d9565b11156122cd5760405162461bcd60e51b815260206004820181905260248201527f74686973206973206f76657220746865206d617820686f6c6420616d6f756e74604482015260640161096a565b5f600f541180156122f557506001600160a01b0382165f908152600a602052604090205460ff165b1561235157612302611460565b8111156123515760405162461bcd60e51b815260206004820181905260248201527f74686973206973206f76657220746865206d61782073656c6c20616d6f756e74604482015260640161096a565b600e54610100900460ff1615611c63576001600160a01b0382165f908152601260205260409020544390036123b6576001600160a01b0382165f908152601360205260408120805460ff19166001179055600d8054916123b083612a7d565b91905055505b6001600160a01b0383165f9081526012602052604090205443900361240b576001600160a01b0383165f908152601360205260408120805460ff19166001179055600d80549161240583612a7d565b91905055505b6001600160a01b0382165f908152600a602052604081205460ff1615159003612449576001600160a01b0382165f9081526012602052604090204390555b6001600160a01b0383165f908152600a602052604081205460ff1615159003611c635750506001600160a01b03165f908152601260205260409020439055565b6007545f908290600160a81b900460ff1680156124ae5750600e5462010000900460ff165b15612559576006546001600160a01b0386811661010090920416148015906124dc57505f6124da6119e2565b115b801561250057506001600160a01b0385165f9081526014602052604090205460ff16155b801561252457506001600160a01b0384165f9081526014602052604090205460ff16155b15612559575f6127106125356119e2565b61253f9086612a2c565b6125499190612a43565b905061255581836129c6565b9150505b61256485858361256d565b95945050505050565b5f826001600160a01b0316846001600160a01b0316036125cf5760405162461bcd60e51b815260206004820152601f60248201527f796f752063616e6e6f74207472616e7366657220746f20796f757273656c6600604482015260640161096a565b5092915050565b5f81518084525f5b818110156125fa576020818501810151868301820152016125de565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f61262b60208301846125d6565b9392505050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112612655575f80fd5b813567ffffffffffffffff8082111561267057612670612632565b604051601f8301601f19908116603f0116810190828211818310171561269857612698612632565b816040528381528660208588010111156126b0575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f80604083850312156126e0575f80fd5b823567ffffffffffffffff8111156126f6575f80fd5b61270285828601612646565b95602094909401359450505050565b80356001600160a01b0381168114612727575f80fd5b919050565b5f806040838503121561273d575f80fd5b61274683612711565b946020939093013593505050565b5f60208284031215612764575f80fd5b61262b82612711565b5f6020828403121561277d575f80fd5b5035919050565b8015158114610f89575f80fd5b5f80604083850312156127a2575f80fd5b6127ab83612711565b915060208301356127bb81612784565b809150509250929050565b5f805f606084860312156127d8575f80fd5b6127e184612711565b92506127ef60208501612711565b9150604084013590509250925092565b5f6020828403121561280f575f80fd5b813561262b81612784565b5f806040838503121561282b575f80fd5b823567ffffffffffffffff811115612841575f80fd5b61284d85828601612646565b92505061285c60208401612711565b90509250929050565b5f8060408385031215612876575f80fd5b61287f83612711565b915061285c60208401612711565b5f806040838503121561289e575f80fd5b50508035926020909101359150565b60208082526028908201527f63616e206f6e6c792062652063616c6c65642062792074686520636f6e74726160408201526731ba1037bbb732b960c11b606082015260800190565b600181811c9082168061290957607f821691505b60208210810361292757634e487b7160e01b5f52602260045260245ffd5b50919050565b604081525f61293f60408301856125d6565b90508260208301529392505050565b6020808252601390820152721d1c98591a5b99c81b9bdd08195b98589b1959606a1b604082015260600190565b6020808252601c908201527f63616e6e6f7420617070726f7665207468652030206164647265737300000000604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561145a5761145a6129b2565b8082018082111561145a5761145a6129b2565b5f602082840312156129fc575f80fd5b5051919050565b604081525f612a1560408301856125d6565b905060018060a01b03831660208301529392505050565b808202811582820484141761145a5761145a6129b2565b5f82612a5d57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215612a72575f80fd5b815161262b81612784565b5f60018201612a8e57612a8e6129b2565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a26469706673582212209ba694d81b9327d74eaf860646b99829a1ad3d37195dec4d88b31f410467596564736f6c63430008140033

Deployed Bytecode Sourcemap

40139:2616:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41964:102;;;:::i;:::-;;9877:35;;;;;-1:-1:-1;;;9877:35:0;;;;;;;;;179:14:1;;172:22;154:41;;142:2;127:18;9877:35:0;;;;;;;;9751:19;;;:::i;:::-;;;;;;;:::i;22309:143::-;;;;;;:::i;:::-;;:::i;12939:314::-;;;;;;:::i;:::-;;:::i;35921:41::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;39651:98;;;;;;:::i;:::-;;:::i;11021:102::-;11103:12;;11021:102;;;3069:25:1;;;3057:2;3042:18;11021:102:0;2923:177:1;21455:114:0;21546:14;;-1:-1:-1;;;;;21546:14:0;21455:114;;;-1:-1:-1;;;;;3269:32:1;;;3251:51;;3239:2;3224:18;21455:114:0;3105:203:1;34187:113:0;;;;;;:::i;:::-;;:::i;16709:134::-;;;:::i;13726:328::-;;;;;;:::i;:::-;;:::i;17209:116::-;;;;;;:::i;:::-;;:::i;35969:46::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;41902:31;;;;;;9777:21;;;;;;;;;;;;4261:4:1;4249:17;;;4231:36;;4219:2;4204:18;9777:21:0;4089:184:1;33815:43:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;39302:113;;;;;;:::i;:::-;;:::i;14569:381::-;;;;;;:::i;:::-;;:::i;34471:101::-;;;;;;:::i;:::-;;:::i;35752:27::-;;;;;;22651:136;;;:::i;21263:102::-;;;:::i;21615:97::-;;;;;;:::i;:::-;;:::i;17076:121::-;;;;;;:::i;:::-;;:::i;35662:36::-;;;;;;;;;;;;39173:117;;;;;;:::i;:::-;;:::i;9847:23::-;;;;;-1:-1:-1;;;;;9847:23:0;;;22464:175;;;;;;:::i;:::-;;:::i;39761:109::-;;;;;;:::i;:::-;;:::i;39878:117::-;;;;;;:::i;:::-;;:::i;35820:26::-;;;;;;38545:113;;;:::i;22156:145::-;;;;;;:::i;:::-;;:::i;16853:211::-;;;;;;:::i;:::-;;:::i;19037:23::-;;;;;-1:-1:-1;;;19037:23:0;;;;;;38670:114;;;:::i;11340:119::-;;;;;;:::i;:::-;-1:-1:-1;;;;;11434:17:0;11407:7;11434:17;;;;;;;;;;;;11340:119;16561:140;;;:::i;10065:42::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;40003:105;;;:::i;35521:25::-;;;;;;34971:195;;;;;;:::i;:::-;;:::i;9919:20::-;;;;;-1:-1:-1;;;9919:20:0;;;;;;39539:100;;;;;;:::i;:::-;;:::i;41849:46::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;9811:29;;;;;;;;-1:-1:-1;;;;;9811:29:0;;;9724:20;;;:::i;19157:48::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;15470:391;;;;;;:::i;:::-;;:::i;16407:146::-;;;;;;:::i;:::-;;:::i;12114:178::-;;;;;;:::i;:::-;;:::i;9952:47::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;39427:100;;;;;;:::i;:::-;;:::i;21720:225::-;;;;;;:::i;:::-;;:::i;35786:27::-;;;;;;39052:109;;;;;;:::i;:::-;;:::i;21061:104::-;;;:::i;35553:26::-;;;;;;19112:38;;;;;;21953:191;;;;;;:::i;:::-;;:::i;35859:55::-;;;;;;:::i;:::-;;;;;;;;;;;;;;19067:38;;;;;;11799:144;;;;;;:::i;:::-;-1:-1:-1;;;;;11910:16:0;;;11883:7;11910:16;;;:8;:16;;;;;;;;:25;;;;;;;;;;;;;11799:144;35586:28;;;;;;10006:52;;;;;;:::i;:::-;;;;;;;;;;;;;;;;35623:32;;;;;;;;;35705:34;;;;;;;;;;;;38795:217;;;:::i;41964:102::-;10174:5;;;;;-1:-1:-1;;;;;10174:5:0;10160:10;:19;10152:72;;;;-1:-1:-1;;;10152:72:0;;;;;;;:::i;:::-;;;;;;;;;42044:14:::1;:12;:14::i;:::-;41964:102::o:0;9751:19::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22309:143::-;10174:5;;;;;-1:-1:-1;;;;;10174:5:0;10160:10;:19;10152:72;;;;-1:-1:-1;;;10152:72:0;;;;;;;:::i;:::-;22400:14:::1;::::0;:44:::1;::::0;-1:-1:-1;;;22400:44:0;;-1:-1:-1;;;;;22400:14:0;;::::1;::::0;:24:::1;::::0;:44:::1;::::0;22425:7;;22434:9;;22400:44:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;22309:143:::0;;:::o;12939:314::-;10573:16;;13042:4;;13021:10;;-1:-1:-1;;;10573:16:0;;;;:28;;;;-1:-1:-1;10593:8:0;;-1:-1:-1;;;10593:8:0;;;;10573:28;10572:47;;;-1:-1:-1;10614:5:0;;-1:-1:-1;;;;;10606:13:0;;;10614:5;;;;;10606:13;10572:47;:77;;;-1:-1:-1;10638:10:0;10623:26;;;;:14;:26;;;;;;;;10572:77;10564:109;;;;-1:-1:-1;;;10564:109:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13067:21:0;::::1;13059:62;;;;-1:-1:-1::0;;;13059:62:0::1;;;;;;;:::i;:::-;13143:10;13134:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;13134:29:0;::::1;::::0;;;;;;;;;;:37;;;13187:36;3069:25:1;;;13134:29:0;;13143:10;-1:-1:-1;;;;;;;;;;;13187:36:0;3042:18:1;13187:36:0::1;;;;;;;;-1:-1:-1::0;13241:4:0::1;::::0;12939:314;-1:-1:-1;;;12939:314:0:o;39651:98::-;10174:5;;;;;-1:-1:-1;;;;;10174:5:0;10160:10;:19;10152:72;;;;-1:-1:-1;;;10152:72:0;;;;;;;:::i;:::-;39721:11:::1;:20:::0;39651:98::o;34187:113::-;10174:5;;;;;-1:-1:-1;;;;;10174:5:0;10160:10;:19;10152:72;;;;-1:-1:-1;;;10152:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34267:15:0;;;::::1;;::::0;;;:10:::1;:15;::::0;;;;:25;;-1:-1:-1;;34267:25:0::1;::::0;::::1;;::::0;;;::::1;::::0;;34187:113::o;16709:134::-;16808:8;;16800:35;;16768:21;;-1:-1:-1;;;;;16808:8:0;;16800:35;;;;;16768:21;;16750:15;16800:35;16750:15;16800:35;16768:21;16808:8;16800:35;;;;;;;;;;;;;;;;;;;;;16739:104;16709:134::o;13726:328::-;10573:16;;13837:4;;13822;;-1:-1:-1;;;10573:16:0;;;;:28;;;;-1:-1:-1;10593:8:0;;-1:-1:-1;;;10593:8:0;;;;10573:28;10572:47;;;-1:-1:-1;10614:5:0;;-1:-1:-1;;;;;10606:13:0;;;10614:5;;;;;10606:13;10572:47;:77;;;-1:-1:-1;10638:10:0;10623:26;;;;:14;:26;;;;;;;;10572:77;10564:109;;;;-1:-1:-1;;;10564:109:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13883:14:0;::::1;;::::0;;;:8:::1;:14;::::0;;;;;;;13898:10:::1;13883:26:::0;;;;;;;;:34:::1;::::0;13912:5;;13883:34:::1;:::i;:::-;-1:-1:-1::0;;;;;13854:14:0;::::1;;::::0;;;:8:::1;:14;::::0;;;;;;;13869:10:::1;13854:26:::0;;;;;;;:63;13928:26:::1;13863:4:::0;13944:2;13948:5;13928:9:::1;:26::i;:::-;-1:-1:-1::0;;;;;13970:54:0;::::1;13997:14;::::0;;;:8:::1;:14;::::0;;;;;;;13985:10:::1;13997:26:::0;;;;;;;;;;;13970:54;;3069:25:1;;;13985:10:0;;13970:54;-1:-1:-1;;;;;;;;;;;13970:54:0;3042:18:1;13970:54:0::1;;;;;;;-1:-1:-1::0;14042:4:0::1;::::0;13726:328;-1:-1:-1;;;;13726:328:0:o;17209:116::-;10174:5;;;;;-1:-1:-1;;;;;10174:5:0;10160:10;:19;10152:72;;;;-1:-1:-1;;;10152:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17290:14:0;;;::::1;;::::0;;;:9:::1;:14;::::0;;;;:27;;-1:-1:-1;;17290:27:0::1;::::0;::::1;;::::0;;;::::1;::::0;;17209:116::o;39302:113::-;10174:5;;;;;-1:-1:-1;;;;;10174:5:0;10160:10;:19;10152:72;;;;-1:-1:-1;;;10152:72:0;;;;;;;:::i;:::-;39375:22:::1;:32:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;39375:32:0;;::::1;::::0;;;::::1;::::0;;39302:113::o;14569:381::-;10573:16;;14678:4;;14657:10;;-1:-1:-1;;;10573:16:0;;;;:28;;;;-1:-1:-1;10593:8:0;;-1:-1:-1;;;10593:8:0;;;;10573:28;10572:47;;;-1:-1:-1;10614:5:0;;-1:-1:-1;;;;;10606:13:0;;;10614:5;;;;;10606:13;10572:47;:77;;;-1:-1:-1;10638:10:0;10623:26;;;;:14;:26;;;;;;;;10572:77;10564:109;;;;-1:-1:-1;;;10564:109:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14703:21:0;::::1;14695:62;;;;-1:-1:-1::0;;;14695:62:0::1;;;;;;;:::i;:::-;14811:10;14802:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;14802:29:0;::::1;::::0;;;;;;;;:42:::1;::::0;14834:10;;14802:42:::1;:::i;:::-;14779:10;14770:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;14770:29:0;::::1;::::0;;;;;;;;;;:74;;;14860:60;3069:25:1;;;14770:29:0;;-1:-1:-1;;;;;;;;;;;14860:60:0;3042:18:1;14860:60:0::1;2923:177:1::0;34471:101:0;33919:10;33908:22;;;;:10;:22;;;;;;;;33900:54;;;;-1:-1:-1;;;33900:54:0;;7835:2:1;33900:54:0;;;7817:21:1;7874:2;7854:18;;;7847:30;-1:-1:-1;;;7893:18:1;;;7886:49;7952:18;;33900:54:0;7633:343:1;33900:54:0;34540:24:::1;34546:10;34558:5;34540;:24::i;:::-;34471:101:::0;:::o;22651:136::-;10297:8;;-1:-1:-1;;;10297:8:0;;;;10289:62;;;;-1:-1:-1;;;10289:62:0;;8183:2:1;10289:62:0;;;8165:21:1;8222:2;8202:18;;;8195:30;8261:34;8241:18;;;8234:62;-1:-1:-1;;;8312:18:1;;;8305:39;8361:19;;10289:62:0;7981:405:1;10289:62:0;22732:8:::1;::::0;-1:-1:-1;;;;;22732:8:0::1;22718:10;:22;22710:31;;;::::0;::::1;;22752:14;;;;;;;;;-1:-1:-1::0;;;;;22752:14:0::1;-1:-1:-1::0;;;;;22752:25:0::1;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;22651:136::o:0;21263:102::-;21331:14;;:26;;;-1:-1:-1;;;21331:26:0;;;;21304:7;;-1:-1:-1;;;;;21331:14:0;;:24;;:26;;;;;;;;;;;;;;:14;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21324:33;;21263:102;:::o;21615:97::-;10174:5;;;;;-1:-1:-1;;;;;10174:5:0;10160:10;:19;10152:72;;;;-1:-1:-1;;;10152:72:0;;;;;;;:::i;:::-;21683:11:::1;:21:::0;;;::::1;;-1:-1:-1::0;;;21683:21:0::1;-1:-1:-1::0;;;;21683:21:0;;::::1;::::0;;;::::1;::::0;;21615:97::o;17076:121::-;10174:5;;;;;-1:-1:-1;;;;;10174:5:0;10160:10;:19;10152:72;;;;-1:-1:-1;;;10152:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17160:19:0;;;::::1;;::::0;;;:14:::1;:19;::::0;;;;:29;;-1:-1:-1;;17160:29:0::1;::::0;::::1;;::::0;;;::::1;::::0;;17076:121::o;39173:117::-;10174:5;;;;;-1:-1:-1;;;;;10174:5:0;10160:10;:19;10152:72;;;;-1:-1:-1;;;10152:72:0;;;;;;;:::i;:::-;39248:24:::1;:34:::0;;;::::1;;;;-1:-1:-1::0;;39248:34:0;;::::1;::::0;;;::::1;::::0;;39173:117::o;22464:175::-;22567:8;;-1:-1:-1;;;;;22567:8:0;22553:10;:22;22545:31;;;;;;22587:14;;:44;;-1:-1:-1;;;22587:44:0;;-1:-1:-1;;;;;22587:14:0;;;;:27;;:44;;22615:7;;22624:6;;22587:44;;;:::i;39761:109::-;10174:5;;;;;-1:-1:-1;;;;;10174:5:0;10160:10;:19;10152:72;;;;-1:-1:-1;;;10152:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39839:13:0;;;::::1;;::::0;;;:8:::1;:13;::::0;;;;:23;;-1:-1:-1;;39839:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;39761:109::o;39878:117::-;10174:5;;;;;-1:-1:-1;;;;;10174:5:0;10160:10;:19;10152:72;;;;-1:-1:-1;;;10152:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39959:18:0;;;::::1;;::::0;;;:13:::1;:18;::::0;;;;:28;;-1:-1:-1;;39959:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;39878:117::o;38545:113::-;38586:7;38645:5;38629:12;;38614;;:27;;;;:::i;:::-;38613:37;;;;:::i;22156:145::-;10174:5;;;;;-1:-1:-1;;;;;10174:5:0;10160:10;:19;10152:72;;;;-1:-1:-1;;;10152:72:0;;;;;;;:::i;:::-;22248:14:::1;::::0;:45:::1;::::0;-1:-1:-1;;;22248:45:0;;-1:-1:-1;;;;;22248:14:0;;::::1;::::0;:25:::1;::::0;:45:::1;::::0;22274:7;;22283:9;;22248:45:::1;;;:::i;16853:211::-:0;10174:5;;16931:4;;10174:5;;;-1:-1:-1;;;;;10174:5:0;10160:10;:19;10152:72;;;;-1:-1:-1;;;10152:72:0;;;;;;;:::i;:::-;16965:38:::1;::::0;-1:-1:-1;;;16965:38:0;;16997:4:::1;16965:38;::::0;::::1;3251:51:1::0;16947:15:0::1;::::0;-1:-1:-1;;;;;16965:23:0;::::1;::::0;::::1;::::0;3224:18:1;;16965:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17021:35;::::0;-1:-1:-1;;;17021:35:0;;-1:-1:-1;;;;;9489:32:1;;;17021:35:0::1;::::0;::::1;9471:51:1::0;9538:18;;;9531:34;;;16947:56:0;;-1:-1:-1;17021:22:0;;::::1;::::0;::::1;::::0;9444:18:1;;17021:35:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17014:42;;;10235:1;16853:211:::0;;;;:::o;38670:114::-;38711:7;38771:5;38755:12;;38740;;:27;;;;:::i;16561:140::-;10174:5;;;;;-1:-1:-1;;;;;10174:5:0;10160:10;:19;10152:72;;;;-1:-1:-1;;;10152:72:0;;;;;;;:::i;:::-;16646:5:::1;::::0;16625:39:::1;::::0;16661:1:::1;::::0;16646:5:::1;::::0;::::1;-1:-1:-1::0;;;;;16646:5:0::1;::::0;16625:39:::1;::::0;16661:1;;16625:39:::1;16675:5;:18:::0;;-1:-1:-1;;;;;;16675:18:0::1;::::0;;16561:140::o;40003:105::-;10174:5;;;;;-1:-1:-1;;;;;10174:5:0;10160:10;:19;10152:72;;;;-1:-1:-1;;;10152:72:0;;;;;;;:::i;:::-;40072:1:::1;40057:12;:16:::0;;;40084:12:::1;:16:::0;40003:105::o;34971:195::-;33919:10;33908:22;;;;:10;:22;;;;;;;;33900:54;;;;-1:-1:-1;;;33900:54:0;;7835:2:1;33900:54:0;;;7817:21:1;7874:2;7854:18;;;7847:30;-1:-1:-1;;;7893:18:1;;;7886:49;7952:18;;33900:54:0;7633:343:1;33900:54:0;35061:21:::1;35067:7;35076:5;35061;:21::i;:::-;-1:-1:-1::0;;;;;35098:60:0;::::1;35128:17;::::0;;;:8:::1;:17;::::0;;;;;;;35116:10:::1;35128:29:::0;;;;;;;;;;;35098:60;;3069:25:1;;;35116:10:0;;35098:60;-1:-1:-1;;;;;;;;;;;35098:60:0;3042:18:1;35098:60:0::1;;;;;;;;34971:195:::0;;:::o;39539:100::-;10174:5;;;;;-1:-1:-1;;;;;10174:5:0;10160:10;:19;10152:72;;;;-1:-1:-1;;;10152:72:0;;;;;;;:::i;:::-;39610:12:::1;:21:::0;39539:100::o;9724:20::-;;;;;;;:::i;15470:391::-;10573:16;;15584:4;;15563:10;;-1:-1:-1;;;10573:16:0;;;;:28;;;;-1:-1:-1;10593:8:0;;-1:-1:-1;;;10593:8:0;;;;10573:28;10572:47;;;-1:-1:-1;10614:5:0;;-1:-1:-1;;;;;10606:13:0;;;10614:5;;;;;10606:13;10572:47;:77;;;-1:-1:-1;10638:10:0;10623:26;;;;:14;:26;;;;;;;;10572:77;10564:109;;;;-1:-1:-1;;;10564:109:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15609:21:0;::::1;15601:62;;;;-1:-1:-1::0;;;15601:62:0::1;;;;;;;:::i;:::-;15717:10;15708:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;15708:29:0;::::1;::::0;;;;;;;;:47:::1;::::0;15740:15;;15708:47:::1;:::i;16407:146::-:0;10174:5;;;;;-1:-1:-1;;;;;10174:5:0;10160:10;:19;10152:72;;;;-1:-1:-1;;;10152:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16479:17:0;::::1;16471:52;;;::::0;-1:-1:-1;;;16471:52:0;;10028:2:1;16471:52:0::1;::::0;::::1;10010:21:1::0;10067:2;10047:18;;;10040:30;-1:-1:-1;;;10086:18:1;;;10079:52;10148:18;;16471:52:0::1;9826:346:1::0;16471:52:0::1;16534:5;:11:::0;;-1:-1:-1;;;;;16534:11:0;;::::1;;;-1:-1:-1::0;;;;;;16534:11:0;;::::1;::::0;;;::::1;::::0;;16407:146::o;12114:178::-;10573:16;;12213:4;;12192:10;;-1:-1:-1;;;10573:16:0;;;;:28;;;;-1:-1:-1;10593:8:0;;-1:-1:-1;;;10593:8:0;;;;10573:28;10572:47;;;-1:-1:-1;10614:5:0;;-1:-1:-1;;;;;10606:13:0;;;10614:5;;;;;10606:13;10572:47;:77;;;-1:-1:-1;10638:10:0;10623:26;;;;:14;:26;;;;;;;;10572:77;10564:109;;;;-1:-1:-1;;;10564:109:0;;;;;;;:::i;:::-;12230:32:::1;12240:10;12252:2;12256:5;12230:9;:32::i;:::-;-1:-1:-1::0;12280:4:0::1;::::0;12114:178;-1:-1:-1;;;12114:178:0:o;39427:100::-;10174:5;;;;;-1:-1:-1;;;;;10174:5:0;10160:10;:19;10152:72;;;;-1:-1:-1;;;10152:72:0;;;;;;;:::i;:::-;39498:12:::1;:21:::0;39427:100::o;21720:225::-;10174:5;;;;;-1:-1:-1;;;;;10174:5:0;10160:10;:19;10152:72;;;;-1:-1:-1;;;10152:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21813:14:0;::::1;;::::0;;;:9:::1;:14;::::0;;;;;::::1;;:23;::::0;:43:::1;;-1:-1:-1::0;21840:16:0;::::1;21813:43;21805:91;;;::::0;-1:-1:-1;;;21805:91:0;;10379:2:1;21805:91:0::1;::::0;::::1;10361:21:1::0;10418:2;10398:18;;;10391:30;10457:34;10437:18;;;10430:62;-1:-1:-1;;;10508:18:1;;;10501:33;10551:19;;21805:91:0::1;10177:399:1::0;21805:91:0::1;-1:-1:-1::0;;;;;21907:20:0;;;::::1;;::::0;;;:15:::1;:20;::::0;;;;:30;;-1:-1:-1;;21907:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;21720:225::o;39052:109::-;10174:5;;;;;-1:-1:-1;;;;;10174:5:0;10160:10;:19;10152:72;;;;-1:-1:-1;;;10152:72:0;;;;;;;:::i;:::-;39123:20:::1;:30:::0;;-1:-1:-1;;39123:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;39052:109::o;21061:104::-;21130:14;;:27;;;-1:-1:-1;;;21130:27:0;;;;21103:7;;-1:-1:-1;;;;;21130:14:0;;:25;;:27;;;;;;;;;;;;;;:14;:27;;;;;;;;;;;;;;21953:191;10174:5;;;;;-1:-1:-1;;;;;10174:5:0;10160:10;:19;10152:72;;;;-1:-1:-1;;;10152:72:0;;;;;;;:::i;:::-;22057:23:::1;:35:::0;;;;22103:23:::1;:33:::0;21953:191::o;38795:217::-;38868:8;;38845:7;;-1:-1:-1;;;38868:8:0;;;;38865:121;;;38926:1;38912:11;;38897:12;:26;;;;:::i;:::-;:30;38893:82;;;-1:-1:-1;38955:4:0;;38795:217::o;38893:82::-;-1:-1:-1;39003:1:0;;38795:217::o;36206:161::-;10174:5;;;;;-1:-1:-1;;;;;10174:5:0;10160:10;:19;10152:72;;;;-1:-1:-1;;;10152:72:0;;;;;;;:::i;:::-;36269:14:::1;:12;:14::i;:::-;36307:15;36294:10;:28:::0;36347:12:::1;36333:11;:26:::0;36206:161::o;18147:792::-;-1:-1:-1;;;;;18234:16:0;;18226:51;;;;-1:-1:-1;;;18226:51:0;;10028:2:1;18226:51:0;;;10010:21:1;10067:2;10047:18;;;10040:30;-1:-1:-1;;;10086:18:1;;;10079:52;10148:18;;18226:51:0;9826:346:1;18226:51:0;-1:-1:-1;;;;;18296:25:0;;;;;;:19;:25;;;;;;;;:34;18288:77;;;;-1:-1:-1;;;18288:77:0;;10783:2:1;18288:77:0;;;10765:21:1;10822:2;10802:18;;;10795:30;10861:32;10841:18;;;10834:60;10911:18;;18288:77:0;10581:354:1;18288:77:0;18390:16;;;;18386:546;;;-1:-1:-1;;;;;18443:15:0;;:9;:15;;;;;;;;;;;:23;;18461:5;;18443:23;:::i;:::-;-1:-1:-1;;;;;18425:15:0;;;:9;:15;;;;;;;;;;;:41;;;;18497:13;;;;;;;:21;;18513:5;;18497:21;:::i;:::-;-1:-1:-1;;;;;18481:13:0;;;:9;:13;;;;;;;;;;;;:37;;;;18538:25;3069::1;;;18481:13:0;;18538:25;;;;-1:-1:-1;;;;;;;;;;;18538:25:0;3042:18:1;18538:25:0;;;;;;;18147:792;;;:::o;18386:546::-;18598:28;18610:4;18616:2;18620:5;18598:11;:28::i;:::-;18643:22;18668:40;18692:4;18698:2;18702:5;18668:23;:40::i;:::-;-1:-1:-1;;;;;18741:15:0;;:9;:15;;;;;;;;;;;18643:65;;-1:-1:-1;18741:23:0;;18759:5;;18741:23;:::i;:::-;-1:-1:-1;;;;;18723:15:0;;;:9;:15;;;;;;;;;;;:41;;;;18795:13;;;;;;;:30;;18811:14;;18795:30;:::i;:::-;-1:-1:-1;;;;;18779:13:0;;;:9;:13;;;;;;;;;;;;:46;;;;18847:34;3069:25:1;;;18779:13:0;;18847:34;;;;-1:-1:-1;;;;;;;;;;;18847:34:0;3042:18:1;18847:34:0;;;;;;;18898:22;16709:134;18386:546;18147:792;;;:::o;35198:263::-;-1:-1:-1;;;;;35273:21:0;;35265:30;;;;;;35338:5;35323:12;;:20;;;;:::i;:::-;35308:12;:35;-1:-1:-1;;;;;35375:18:0;;:9;:18;;;;;;;;;;;:26;;35396:5;;35375:26;:::i;:::-;-1:-1:-1;;;;;35354:18:0;;:9;:18;;;;;;;;;;;:47;;;;35417:36;;3069:25:1;;;35354:9:0;;-1:-1:-1;;;;;;;;;;;35417:36:0;3042:18:1;35417:36:0;2923:177:1;15905:77:0;10174:5;;;;;-1:-1:-1;;;;;10174:5:0;10160:10;:19;10152:72;;;;-1:-1:-1;;;10152:72:0;;;;;;;:::i;:::-;15959:8:::1;:15:::0;;-1:-1:-1;;;;15959:15:0::1;-1:-1:-1::0;;;15959:15:0::1;::::0;;15905:77::o;42074:167::-;42199:34;42217:4;42223:2;42227:5;42199:17;:34::i;42253:216::-;42388:7;42415:46;42445:4;42451:2;42455:5;42415:29;:46::i;:::-;42408:53;42253:216;-1:-1:-1;;;;42253:216:0:o;20358:570::-;20475:8;;-1:-1:-1;;;20475:8:0;;;;:37;;;;-1:-1:-1;20501:11:0;;-1:-1:-1;;;20501:11:0;;;;20475:37;:68;;;;-1:-1:-1;;;;;;20530:13:0;;;;;;:9;:13;;;;;;;;20475:68;:123;;;;;20583:15;20561:13;;20577:2;20561:18;;;;:::i;:::-;:37;;20475:123;:201;;;;-1:-1:-1;20653:23:0;;20633:14;;-1:-1:-1;;;;;20633:14:0;20615:9;:34;;;;;;;;;;;:61;;20475:201;:240;;;;-1:-1:-1;;;;;;20694:21:0;;;;;;:15;:21;;;;;;;;20693:22;20475:240;:289;;;;;20732:14;;;;;;;;;-1:-1:-1;;;;;20732:14:0;-1:-1:-1;;;;;20732:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:32;20475:289;20457:419;;;20807:15;20791:13;:31;20837:14;;:27;;;-1:-1:-1;;;20837:27:0;;;;-1:-1:-1;;;;;20837:14:0;;;;:25;;:27;;;;;:14;;:27;;;;;;;;:14;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20457:419;20886:34;20904:4;20910:2;20914:5;20886:17;:34::i;19432:916::-;-1:-1:-1;;;;;19618:21:0;;19541:7;19618:21;;;:15;:21;;;;;;19596:5;;19618:21;;:30;;;:62;;-1:-1:-1;;;;;;19652:19:0;;;;;;:15;:19;;;;;;;;:28;19618:62;:74;;;;-1:-1:-1;19684:8:0;;-1:-1:-1;;;19684:8:0;;;;19618:74;19614:390;;;-1:-1:-1;;;;;19713:15:0;;;;;;:9;:15;;;;;;;;19709:284;;;19800:14;;:32;;-1:-1:-1;;;19800:32:0;;;;;3069:25:1;;;-1:-1:-1;;;;;19800:14:0;;;;:25;;3042:18:1;;19800:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19783:49;;19709:284;;;-1:-1:-1;;;;;19858:13:0;;;;;;:9;:13;;;;;;;;19854:139;;;19944:14;;:33;;-1:-1:-1;;;19944:33:0;;;;;3069:25:1;;;-1:-1:-1;;;;;19944:14:0;;;;:26;;3042:18:1;;19944:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19927:50;;19854:139;20016:17;20036:22;20044:14;20036:5;:22;:::i;:::-;20016:42;-1:-1:-1;20073:13:0;;20069:199;;20158:14;;-1:-1:-1;;;;;20158:14:0;20140:9;:34;;;;;;;;;;;:46;;20177:9;;20140:46;:::i;:::-;20121:14;;;-1:-1:-1;;;;;20121:14:0;;;20103:9;:34;;;;;;;;;;;;:83;;;;20229:14;;20206:50;;3069:25:1;;;20229:14:0;;;;20206:50;;;;-1:-1:-1;;;;;;;;;;;20206:50:0;3042:18:1;20206:50:0;;;;;;;20069:199;20285:55;20315:4;20321:2;20325:14;20285:29;:55::i;:::-;20278:62;19432:916;-1:-1:-1;;;;;;19432:916:0:o;36379:1551::-;36486:20;;;;:29;;:62;;-1:-1:-1;36528:10:0;36519:20;;;;:8;:20;;;;;;;;:29;36486:62;36478:90;;;;-1:-1:-1;;;36478:90:0;;11142:2:1;36478:90:0;;;11124:21:1;11181:2;11161:18;;;11154:30;-1:-1:-1;;;11200:18:1;;;11193:45;11255:18;;36478:90:0;10940:339:1;36478:90:0;36593:8;;-1:-1:-1;;;36593:8:0;;;;:25;;;;-1:-1:-1;36613:5:0;;-1:-1:-1;;;;;36605:13:0;;;36613:5;;;;;36605:13;;36593:25;:57;;;;-1:-1:-1;;;;;;36622:19:0;;;;;;:13;:19;;;;;;;;:28;36593:57;:87;;;;-1:-1:-1;;;;;;36654:17:0;;;;;;:13;:17;;;;;;;;:26;36593:87;36589:1279;;;36715:11;;:15;36711:122;;36771:11;;36758:9;:24;;36750:67;;;;-1:-1:-1;;;36750:67:0;;11486:2:1;36750:67:0;;;11468:21:1;11525:2;11505:18;;;11498:30;11564:32;11544:18;;;11537:60;11614:18;;36750:67:0;11284:354:1;36750:67:0;36880:1;36865:12;;:16;:42;;;;-1:-1:-1;;;;;;36885:13:0;;;;;;:9;:13;;;;;;;;:22;36865:42;36861:164;;;36962:10;:8;:10::i;:::-;-1:-1:-1;;;;;36937:13:0;;:9;:13;;;;;;;;;;;:21;;36953:5;;36937:21;:::i;:::-;:35;;36928:81;;;;-1:-1:-1;;;36928:81:0;;11845:2:1;36928:81:0;;;11827:21:1;;;11864:18;;;11857:30;11923:34;11903:18;;;11896:62;11975:18;;36928:81:0;11643:356:1;36928:81:0;37072:1;37057:12;;:16;:33;;;;-1:-1:-1;;;;;;37077:13:0;;;;;;:9;:13;;;;;;;;37057:33;37053:139;;;37129:10;:8;:10::i;:::-;37120:5;:19;;37111:65;;;;-1:-1:-1;;;37111:65:0;;12206:2:1;37111:65:0;;;12188:21:1;;;12225:18;;;12218:30;12284:34;12264:18;;;12257:62;12336:18;;37111:65:0;12004:356:1;37111:65:0;37223:24;;;;;;;37220:635;;;-1:-1:-1;;;;;37272:23:0;;;;;;:19;:23;;;;;;37299:12;37272:39;;37268:146;;-1:-1:-1;;;;;37336:12:0;;;;;;:8;:12;;;;;:19;;-1:-1:-1;;37336:19:0;37351:4;37336:19;;;37378:13;:16;;;;;;:::i;:::-;;;;;;37268:146;-1:-1:-1;;;;;37436:25:0;;;;;;:19;:25;;;;;;37465:12;37436:41;;37432:150;;-1:-1:-1;;;;;37502:14:0;;;;;;:8;:14;;;;;:21;;-1:-1:-1;;37502:21:0;37519:4;37502:21;;;37546:13;:16;;;;;;:::i;:::-;;;;;;37432:150;-1:-1:-1;;;;;37604:13:0;;;;;;:9;:13;;;;;;;;:22;;;;37600:109;;-1:-1:-1;;;;;37651:23:0;;;;;;:19;:23;;;;;37677:12;37651:38;;37600:109;-1:-1:-1;;;;;37731:15:0;;;;;;:9;:15;;;;;;;;:24;;;;37727:113;;-1:-1:-1;;;;;;;37780:25:0;;;;;:19;:25;;;;;37808:12;37780:40;;18147:792::o;37942:562::-;38116:8;;38051:7;;38096:5;;-1:-1:-1;;;38116:8:0;;;;:34;;;;-1:-1:-1;38128:22:0;;;;;;;38116:34;38112:312;;;38179:5;;-1:-1:-1;;;;;38171:13:0;;;38179:5;;;;;38171:13;;;;:32;;;38202:1;38188:11;:9;:11::i;:::-;:15;38171:32;:64;;;;-1:-1:-1;;;;;;38207:19:0;;;;;;:13;:19;;;;;;;;:28;38171:64;:94;;;;-1:-1:-1;;;;;;38239:17:0;;;;;;:13;:17;;;;;;;;:26;38171:94;38167:246;;;38286:17;38330:5;38315:11;:9;:11::i;:::-;38307:19;;:5;:19;:::i;:::-;38306:29;;;;:::i;:::-;38286:49;-1:-1:-1;38371:26:0;38286:49;38371:14;:26;:::i;:::-;38354:43;;38267:146;38167:246;38441:55;38471:4;38477:2;38481:14;38441:29;:55::i;:::-;38434:62;37942:562;-1:-1:-1;;;;;37942:562:0:o;16084:205::-;16184:7;16220:2;-1:-1:-1;;;;;16212:10:0;:4;-1:-1:-1;;;;;16212:10:0;;16204:54;;;;-1:-1:-1;;;16204:54:0;;12707:2:1;16204:54:0;;;12689:21:1;12746:2;12726:18;;;12719:30;12785:33;12765:18;;;12758:61;12836:18;;16204:54:0;12505:355:1;16204:54:0;-1:-1:-1;16276:5:0;16084:205;-1:-1:-1;;16084: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:186::-;2606:6;2659:2;2647:9;2638:7;2634:23;2630:32;2627:52;;;2675:1;2672;2665:12;2627:52;2698:29;2717:9;2698:29;:::i;2738:180::-;2797:6;2850:2;2838:9;2829:7;2825:23;2821:32;2818:52;;;2866:1;2863;2856:12;2818:52;-1:-1:-1;2889:23:1;;2738:180;-1:-1:-1;2738:180:1:o;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;4524:396::-;4602:6;4610;4663:2;4651:9;4642:7;4638:23;4634:32;4631:52;;;4679:1;4676;4669:12;4631:52;4719:9;4706:23;4752:18;4744:6;4741:30;4738:50;;;4784:1;4781;4774:12;4738:50;4807;4849:7;4840:6;4829:9;4825:22;4807:50;:::i;:::-;4797:60;;;4876:38;4910:2;4899:9;4895:18;4876:38;:::i;:::-;4866:48;;4524:396;;;;;:::o;4925:260::-;4993:6;5001;5054:2;5042:9;5033:7;5029:23;5025:32;5022:52;;;5070:1;5067;5060:12;5022:52;5093:29;5112:9;5093:29;:::i;:::-;5083:39;;5141:38;5175:2;5164:9;5160:18;5141:38;:::i;5190:248::-;5258:6;5266;5319:2;5307:9;5298:7;5294:23;5290:32;5287:52;;;5335:1;5332;5325:12;5287:52;-1:-1:-1;;5358:23:1;;;5428:2;5413:18;;;5400:32;;-1:-1:-1;5190:248:1:o;5443:404::-;5645:2;5627:21;;;5684:2;5664:18;;;5657:30;5723:34;5718:2;5703:18;;5696:62;-1:-1:-1;;;5789:2:1;5774:18;;5767:38;5837:3;5822:19;;5443:404::o;5852:380::-;5931:1;5927:12;;;;5974;;;5995:61;;6049:4;6041:6;6037:17;6027:27;;5995:61;6102:2;6094:6;6091:14;6071:18;6068:38;6065:161;;6148:10;6143:3;6139:20;6136:1;6129:31;6183:4;6180:1;6173:15;6211:4;6208:1;6201:15;6065:161;;5852:380;;;:::o;6237:291::-;6414:2;6403:9;6396:21;6377:4;6434:45;6475:2;6464:9;6460:18;6452:6;6434:45;:::i;:::-;6426:53;;6515:6;6510:2;6499:9;6495:18;6488:34;6237:291;;;;;:::o;6533:343::-;6735:2;6717:21;;;6774:2;6754:18;;;6747:30;-1:-1:-1;;;6808:2:1;6793:18;;6786:49;6867:2;6852:18;;6533:343::o;6881:352::-;7083:2;7065:21;;;7122:2;7102:18;;;7095:30;7161;7156:2;7141:18;;7134:58;7224:2;7209:18;;6881:352::o;7238:127::-;7299:10;7294:3;7290:20;7287:1;7280:31;7330:4;7327:1;7320:15;7354:4;7351:1;7344:15;7370:128;7437:9;;;7458:11;;;7455:37;;;7472:18;;:::i;7503:125::-;7568:9;;;7589:10;;;7586:36;;;7602:18;;:::i;8391:184::-;8461:6;8514:2;8502:9;8493:7;8489:23;8485:32;8482:52;;;8530:1;8527;8520:12;8482:52;-1:-1:-1;8553:16:1;;8391:184;-1:-1:-1;8391:184:1:o;8580:317::-;8757:2;8746:9;8739:21;8720:4;8777:45;8818:2;8807:9;8803:18;8795:6;8777:45;:::i;:::-;8769:53;;8887:1;8883;8878:3;8874:11;8870:19;8862:6;8858:32;8853:2;8842:9;8838:18;8831:60;8580:317;;;;;:::o;8902:168::-;8975:9;;;9006;;9023:15;;;9017:22;;9003:37;8993:71;;9044:18;;:::i;9075:217::-;9115:1;9141;9131:132;;9185:10;9180:3;9176:20;9173:1;9166:31;9220:4;9217:1;9210:15;9248:4;9245:1;9238:15;9131:132;-1:-1:-1;9277:9:1;;9075:217::o;9576:245::-;9643:6;9696:2;9684:9;9675:7;9671:23;9667:32;9664:52;;;9712:1;9709;9702:12;9664:52;9744:9;9738:16;9763:28;9785:5;9763:28;:::i;12365:135::-;12404:3;12425:17;;;12422:43;;12445:18;;:::i;:::-;-1:-1:-1;12492:1:1;12481:13;;12365:135::o

Swarm Source

ipfs://b2c6616cc20eee9fded2d304bb24b7c5fa3f5d87a94953387dc2adcfdf5d1d48
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.