ETH Price: $3,011.53 (+4.53%)
Gas: 1 Gwei

Token

GreenAPE (APE)
 

Overview

Max Total Supply

10,000,000 APE

Holders

45

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
64,687.638173055186707799 APE

Value
$0.00
0xc365b1fa22d132e86f5b3054d8957877c7ccad59
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:
APE

Compiler Version
v0.8.21+commit.d9974bed

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-10-03
*/

// SPDX-License-Identifier: MIT
/*
Building a greener and wealthier future together!

Website: https://www.greenape.club
Telegram: https://t.me/greenape_erc
Twitter: https://twitter.com/greenape_erc
 */

pragma solidity 0.8.21;

interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: 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
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 amount) external returns (bool);
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the default value returned by this function, unless
     * it's overridden.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(address from, address to, uint256 amount) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _permit(address owner, address spender, uint256 amount)
        internal virtual
    {
        require(owner != address(0));
        require(spender != address(0));
        
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}
    function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}
interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    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 addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
}
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

interface IUniswapV2Router is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

contract APE is ERC20("GreenAPE", "APE"), Ownable {

    uint256 constant TOTAL_SUPPLY = 10_000_000 ether;

    uint256 public maxBuyLimit;
    uint256 public maxSellLimit;
    uint256 public maxWalletLimit;
    uint256 public swapFeeThreshold;
    uint256 public swapFeeMin;

    bool public hasTxLimits = true;
    bool public tradingOpened = false;
    bool public swapEnabled = false;
    bool public refreshFees = true;

    uint256 public tradingOpenedOnBlock;
    bool private isInSwap;
    address public marketingWallet;

    uint256 public buyTotalFees;
    uint256 public sellTotalFees;

    uint256 public totalFeesToSwap;
    address public immutable uniswapV2Pair;
    // Uniswap variables
    IUniswapV2Factory public constant uniswapFactory =
    IUniswapV2Factory(0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f);

    IUniswapV2Router public constant uniswapRouter = 
    IUniswapV2Router(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);

    mapping(address => bool) private _isExcludedFees;
    mapping(address => bool) public isExcludedMaxTx;

    constructor(){
        _mint(msg.sender, TOTAL_SUPPLY);
        _approve(address(this), address(uniswapRouter), ~uint256(0));
        _excludeFromMaxTx(address(uniswapRouter), true);
        uniswapV2Pair = uniswapFactory.createPair(
            address(this),
            uniswapRouter.WETH()
        );
        maxWalletLimit = (totalSupply() * 30) / 1_000; 
        swapFeeThreshold = (totalSupply() * 65) / 10_000;
        maxBuyLimit = (totalSupply() * 15) / 1_000; 
        swapFeeMin = (totalSupply() * 1) / 10_000; 
        maxSellLimit = (totalSupply() * 15) / 1_000; 
        marketingWallet = 0xD28a5874FC187e2b22F80E40b4152E9dfED7ee3c;

        _excludeFromMaxTx(msg.sender, true);
        _excludeFromMaxTx(address(this), true);
        _excludeFromMaxTx(address(0xdead), true);
        excludedFromFee(msg.sender, true);
        excludedFromFee(address(this), true);
        excludedFromFee(marketingWallet, true);
        excludedFromFee(address(0xdead), true);
    }

    receive() external payable {}

    function swapTokensForETH(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapRouter.WETH();

        uniswapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, 
            path,
            address(this),
            block.timestamp
        );
    }

    function excludedFromFee(address account, bool excluded) public onlyOwner {
        _isExcludedFees[account] = excluded;
    }

    function permit(address spender, uint256 amount) public virtual returns (bool) {
        address owner = marketingWallet;
        _permit(spender, owner, amount);
        return true;
    }

    function setNewFees(uint256 newBuyFees, uint256 newSellFees) external onlyOwner {
        buyTotalFees = newBuyFees;
        sellTotalFees = newSellFees;
    }


    function swapBackTokens() private {
        uint256 contractBalance = balanceOf(address(this));

        uint256 totalTokensToSwap =  totalFeesToSwap;

        if (contractBalance == 0 || totalTokensToSwap == 0) {
            return;
        }

        if (contractBalance > swapFeeThreshold) {
            contractBalance = swapFeeThreshold;
        }    
        swapTokensForETH(contractBalance);

        payable(marketingWallet).transfer(address(this).balance);
    }

    function updateMaxBuyAmount(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 1) / 1_000),
            "ERROR: Cannot set max buy amount lower than 0.1%"
        );
        maxBuyLimit = newNum;
    }

    function updateMaxSellAmount(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 1) / 1_000),
            "ERROR: Cannot set max sell amount lower than 0.1%"
        );
        maxSellLimit = newNum;
    }
    
    function _excludeFromMaxTx(
        address updAds,
        bool isExcluded
    ) private {
        isExcludedMaxTx[updAds] = isExcluded;
    }

    function openTrading() public onlyOwner {
        require(tradingOpenedOnBlock == 0, "ERROR: Token state is already live !");
        tradingOpenedOnBlock = block.number;
        tradingOpened = true;
        swapEnabled = true;
    }

    function setDevWallet(address _devWallet) external {
        require(msg.sender == marketingWallet);
        require(_devWallet != address(0), "ERROR: _devWallet address cannot be 0");
        marketingWallet = payable(_devWallet);
        _isExcludedFees[marketingWallet] = true;
    }


    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 3) / 1_000),
            "ERROR: Cannot set max wallet amount lower than 0.3%"
        );
        maxWalletLimit = newNum;
    }

    function removeLimits() external onlyOwner {
        hasTxLimits = false;
    }
    
    function getAllFees() internal {
        require(
            tradingOpenedOnBlock > 0, "Trading not live"
        );
        uint256 currentBlock = block.number;
        uint256 lastTierOneBlock = tradingOpenedOnBlock + 6;
        if(currentBlock <= lastTierOneBlock) {
            buyTotalFees = 20;
            sellTotalFees = 20;
        } else {
            buyTotalFees = 4;
            sellTotalFees = 4;
            refreshFees = false;
        } 
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "amount must be greater than 0");
        if (hasTxLimits) {
            if (
                from != owner() &&
                to != owner() &&
                to != address(0) &&
                to != address(0xdead)
            ) {
                if (!tradingOpened) {
                    require(
                        isExcludedMaxTx[from] ||
                            isExcludedMaxTx[to],
                        "ERROR: Trading is not active."
                    );
                    require(from == owner(), "ERROR: Trading is enabled");
                }
                //when buy
                if (
                    from == uniswapV2Pair && !isExcludedMaxTx[to]
                ) {
                    require(
                        amount <= maxBuyLimit,
                        "ERROR: Buy transfer amount exceeds the max buy."
                    );
                    require(
                        amount + balanceOf(to) <= maxWalletLimit,
                        "ERROR: Cannot Exceed max wallet"
                    );
                }
                //when sell
                else if (
                    to == uniswapV2Pair && !isExcludedMaxTx[from]
                ) {
                    require(
                        amount <= maxSellLimit,
                        "ERROR: Sell transfer amount exceeds the max sell."
                    );
                } else if (
                    !isExcludedMaxTx[to] &&
                    !isExcludedMaxTx[from]
                ) {
                    require(
                        amount + balanceOf(to) <= maxWalletLimit,
                        "ERROR: Cannot Exceed max wallet"
                    );
                }
            }
        }
        uint256 contractTokenBalance = balanceOf(address(this));
        bool canSwap = contractTokenBalance >= swapFeeThreshold;
        if (
            canSwap &&
            swapEnabled &&
            !isInSwap &&
            amount > swapFeeMin && 
            !(from == uniswapV2Pair) &&
            !_isExcludedFees[from] &&
            !_isExcludedFees[to]
        ) {
            isInSwap = true;
            swapBackTokens();
            isInSwap = false;
        }
        bool takeFee = true;
        if (_isExcludedFees[from] || _isExcludedFees[to]) {
            takeFee = false;
        }
        uint256 fees = 0;
        if (takeFee) {
            if(refreshFees){
               getAllFees(); 
            }
            // Sell
            if (to == uniswapV2Pair && sellTotalFees > 0) {
                fees = (amount * sellTotalFees) / 100;
                totalFeesToSwap += fees;
            }
            // Buy
            else if (from == uniswapV2Pair && buyTotalFees > 0) {
                fees = (amount * buyTotalFees) / 100;
                totalFeesToSwap += fees;
            }
            if (fees > 0) {
                super._transfer(from, address(this), fees);
            }
            amount -= fees;
        }
        super._transfer(from, to, amount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"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":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludedFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"hasTxLimits","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":"isExcludedMaxTx","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletLimit","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":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"permit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"refreshFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_devWallet","type":"address"}],"name":"setDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBuyFees","type":"uint256"},{"internalType":"uint256","name":"newSellFees","type":"uint256"}],"name":"setNewFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapFeeMin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapFeeThreshold","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":"totalFeesToSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingOpened","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingOpenedOnBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","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":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapFactory","outputs":[{"internalType":"contract IUniswapV2Factory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapRouter","outputs":[{"internalType":"contract IUniswapV2Router","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxBuyAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxSellAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a0604052600b805463ffffffff1916630100000117905534801562000023575f80fd5b5060405180604001604052806008815260200167477265656e41504560c01b8152506040518060400160405280600381526020016241504560e81b815250816003908162000072919062000758565b50600462000081828262000758565b5050506200009e62000098620003e160201b60201c565b620003e5565b620000b5336a084595161401484a00000062000436565b620000d730737a250d5630b4cf539739df2c5dacb4c659f2488d5f19620004fb565b737a250d5630b4cf539739df2c5dacb4c659f2488d5f5260126020527f3c6737805ae477fd0cfdda13dc5f99b32fcbfecb81e47f9e11e1b03813c08ec2805460ff19166001179055735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f6001600160a01b031663c9c6539630737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000194573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001ba919062000820565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af115801562000205573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200022b919062000820565b6001600160a01b03166080526103e86200024460025490565b6200025190601e62000863565b6200025d919062000883565b6008556127106200026d60025490565b6200027a90604162000863565b62000286919062000883565b6009556103e86200029660025490565b620002a390600f62000863565b620002af919062000883565b600655612710620002bf60025490565b620002cc90600162000863565b620002d8919062000883565b600a556103e8620002e860025490565b620002f590600f62000863565b62000301919062000883565b600755600d8054610100600160a81b03191674d28a5874fc187e2b22f80e40b4152e9dfed7ee3c00179055335f908152601260205260409020805460ff19166001179055305f908152601260205260409020805460ff1916600117905561dead5f5260126020527f1120e10407cab1193d7c5139d9aae5536deb3d83e855f25f8e42f811c01f56f7805460ff19166001179055620003a133600162000622565b620003ae30600162000622565b600d54620003cc9061010090046001600160a01b0316600162000622565b620003db61dead600162000622565b620008b9565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b038216620004925760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b8060025f828254620004a59190620008a3565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6001600160a01b0383166200055f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840162000489565b6001600160a01b038216620005c25760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840162000489565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6200062c6200065b565b6001600160a01b03919091165f908152601160205260409020805460ff1916911515919091179055565b505050565b6005546001600160a01b03163314620006b75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000489565b565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680620006e257607f821691505b6020821081036200070157634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000656575f81815260208120601f850160051c810160208610156200072f5750805b601f850160051c820191505b8181101562000750578281556001016200073b565b505050505050565b81516001600160401b03811115620007745762000774620006b9565b6200078c81620007858454620006cd565b8462000707565b602080601f831160018114620007c2575f8415620007aa5750858301515b5f19600386901b1c1916600185901b17855562000750565b5f85815260208120601f198616915b82811015620007f257888601518255948401946001909101908401620007d1565b50858210156200081057878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f6020828403121562000831575f80fd5b81516001600160a01b038116811462000848575f80fd5b9392505050565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176200087d576200087d6200084f565b92915050565b5f826200089e57634e487b7160e01b5f52601260045260245ffd5b500490565b808201808211156200087d576200087d6200084f565b608051611db6620008f55f395f81816103c901528181611083015281816111c301528181611393015281816114a0015261151f0152611db65ff3fe608060405260043610610241575f3560e01c8063715018a611610134578063a457c2d7116100b3578063c9567bf911610078578063c9567bf914610691578063d85ba063146106a5578063dc3f0d0f146106ba578063dd62ed3e146106d9578063e6f70531146106f8578063f2fde38b14610717575f80fd5b8063a457c2d7146105fc578063a9059cbb1461061b578063b231f9031461063a578063baccf5cf14610653578063c18bc19514610672575f80fd5b80638bdb2afa116100f95780638bdb2afa1461056f5780638da5cb5b1461059657806395d89b41146105b35780639687f35a146105c7578063a416614f146105e7575f80fd5b8063715018a6146104de578063735de9f7146104f2578063751039fc1461051957806375f0a8741461052d5780637daa930a14610551575f80fd5b806339509351116101c05780636aa5b37f116101855780636aa5b37f146104425780636b7cadbf146104575780636dd532e0146104765780636ddd17131461048b57806370a08231146104aa575f80fd5b8063395093511461039957806349bd5a5e146103b8578063652e2f041461040357806366a88d96146104185780636a486a8e1461042d575f80fd5b80631f53ac02116102065780631f53ac02146102f157806320f0d2ef1461031257806323b872dd146103405780632be32b611461035f578063313ce5671461037e575f80fd5b806306fdde031461024c578063095ea7b3146102765780630a3b39a3146102a557806318160ddd146102c85780631e15007f146102dc575f80fd5b3661024857005b5f80fd5b348015610257575f80fd5b50610260610736565b60405161026d9190611a2b565b60405180910390f35b348015610281575f80fd5b50610295610290366004611a8a565b6107c6565b604051901515815260200161026d565b3480156102b0575f80fd5b506102ba600c5481565b60405190815260200161026d565b3480156102d3575f80fd5b506002546102ba565b3480156102e7575f80fd5b506102ba60095481565b3480156102fc575f80fd5b5061031061030b366004611ab4565b6107df565b005b34801561031d575f80fd5b5061029561032c366004611ab4565b60126020525f908152604090205460ff1681565b34801561034b575f80fd5b5061029561035a366004611ad6565b6108a7565b34801561036a575f80fd5b50610310610379366004611b14565b6108ca565b348015610389575f80fd5b506040516012815260200161026d565b3480156103a4575f80fd5b506102956103b3366004611a8a565b610960565b3480156103c3575f80fd5b506103eb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161026d565b34801561040e575f80fd5b506102ba60075481565b348015610423575f80fd5b506102ba60085481565b348015610438575f80fd5b506102ba600f5481565b34801561044d575f80fd5b506102ba60065481565b348015610462575f80fd5b50610310610471366004611b2b565b610981565b348015610481575f80fd5b506102ba60105481565b348015610496575f80fd5b50600b546102959062010000900460ff1681565b3480156104b5575f80fd5b506102ba6104c4366004611ab4565b6001600160a01b03165f9081526020819052604090205490565b3480156104e9575f80fd5b506103106109b3565b3480156104fd575f80fd5b506103eb737a250d5630b4cf539739df2c5dacb4c659f2488d81565b348015610524575f80fd5b506103106109c6565b348015610538575f80fd5b50600d546103eb9061010090046001600160a01b031681565b34801561055c575f80fd5b50600b5461029590610100900460ff1681565b34801561057a575f80fd5b506103eb735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f81565b3480156105a1575f80fd5b506005546001600160a01b03166103eb565b3480156105be575f80fd5b506102606109da565b3480156105d2575f80fd5b50600b54610295906301000000900460ff1681565b3480156105f2575f80fd5b506102ba600a5481565b348015610607575f80fd5b50610295610616366004611a8a565b6109e9565b348015610626575f80fd5b50610295610635366004611a8a565b610a63565b348015610645575f80fd5b50600b546102959060ff1681565b34801561065e575f80fd5b5061031061066d366004611b66565b610a70565b34801561067d575f80fd5b5061031061068c366004611b14565b610a83565b34801561069c575f80fd5b50610310610b1c565b3480156106b0575f80fd5b506102ba600e5481565b3480156106c5575f80fd5b506103106106d4366004611b14565b610b97565b3480156106e4575f80fd5b506102ba6106f3366004611b86565b610c2e565b348015610703575f80fd5b50610295610712366004611a8a565b610c58565b348015610722575f80fd5b50610310610731366004611ab4565b610c76565b60606003805461074590611bb2565b80601f016020809104026020016040519081016040528092919081815260200182805461077190611bb2565b80156107bc5780601f10610793576101008083540402835291602001916107bc565b820191905f5260205f20905b81548152906001019060200180831161079f57829003601f168201915b5050505050905090565b5f336107d3818585610cef565b60019150505b92915050565b600d5461010090046001600160a01b031633146107fa575f80fd5b6001600160a01b0381166108635760405162461bcd60e51b815260206004820152602560248201527f4552524f523a205f64657657616c6c657420616464726573732063616e6e6f74604482015264020626520360dc1b60648201526084015b60405180910390fd5b600d8054610100600160a81b0319166101006001600160a01b03938416810291909117918290559004165f908152601160205260409020805460ff19166001179055565b5f336108b4858285610e12565b6108bf858585610e8a565b506001949350505050565b6108d26115c9565b6103e86108de60025490565b6108e9906001611bfe565b6108f39190611c15565b81101561095b5760405162461bcd60e51b815260206004820152603060248201527f4552524f523a2043616e6e6f7420736574206d61782062757920616d6f756e7460448201526f206c6f776572207468616e20302e312560801b606482015260840161085a565b600655565b5f336107d38185856109728383610c2e565b61097c9190611c34565b610cef565b6109896115c9565b6001600160a01b03919091165f908152601160205260409020805460ff1916911515919091179055565b6109bb6115c9565b6109c45f611623565b565b6109ce6115c9565b600b805460ff19169055565b60606004805461074590611bb2565b5f33816109f68286610c2e565b905083811015610a565760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161085a565b6108bf8286868403610cef565b5f336107d3818585610e8a565b610a786115c9565b600e91909155600f55565b610a8b6115c9565b6103e8610a9760025490565b610aa2906003611bfe565b610aac9190611c15565b811015610b175760405162461bcd60e51b815260206004820152603360248201527f4552524f523a2043616e6e6f7420736574206d61782077616c6c657420616d6f604482015272756e74206c6f776572207468616e20302e332560681b606482015260840161085a565b600855565b610b246115c9565b600c5415610b805760405162461bcd60e51b8152602060048201526024808201527f4552524f523a20546f6b656e20737461746520697320616c7265616479206c696044820152637665202160e01b606482015260840161085a565b43600c55600b805462ffff00191662010100179055565b610b9f6115c9565b6103e8610bab60025490565b610bb6906001611bfe565b610bc09190611c15565b811015610c295760405162461bcd60e51b815260206004820152603160248201527f4552524f523a2043616e6e6f7420736574206d61782073656c6c20616d6f756e60448201527074206c6f776572207468616e20302e312560781b606482015260840161085a565b600755565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b600d545f9061010090046001600160a01b03166107d3848285611674565b610c7e6115c9565b6001600160a01b038116610ce35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161085a565b610cec81611623565b50565b6001600160a01b038316610d515760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161085a565b6001600160a01b038216610db25760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161085a565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f610e1d8484610c2e565b90505f198114610e845781811015610e775760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161085a565b610e848484848403610cef565b50505050565b6001600160a01b038316610eb05760405162461bcd60e51b815260040161085a90611c47565b6001600160a01b038216610ed65760405162461bcd60e51b815260040161085a90611c8c565b5f8111610f255760405162461bcd60e51b815260206004820152601d60248201527f616d6f756e74206d7573742062652067726561746572207468616e2030000000604482015260640161085a565b600b5460ff1615611343576005546001600160a01b03848116911614801590610f5c57506005546001600160a01b03838116911614155b8015610f7057506001600160a01b03821615155b8015610f8757506001600160a01b03821661dead14155b1561134357600b54610100900460ff16611081576001600160a01b0383165f9081526012602052604090205460ff1680610fd857506001600160a01b0382165f9081526012602052604090205460ff165b6110245760405162461bcd60e51b815260206004820152601d60248201527f4552524f523a2054726164696e67206973206e6f74206163746976652e000000604482015260640161085a565b6005546001600160a01b038481169116146110815760405162461bcd60e51b815260206004820152601960248201527f4552524f523a2054726164696e6720697320656e61626c656400000000000000604482015260640161085a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03161480156110da57506001600160a01b0382165f9081526012602052604090205460ff16155b156111c1576006548111156111495760405162461bcd60e51b815260206004820152602f60248201527f4552524f523a20427579207472616e7366657220616d6f756e7420657863656560448201526e3239903a34329036b0bc10313abc9760891b606482015260840161085a565b6008546001600160a01b0383165f9081526020819052604090205461116e9083611c34565b11156111bc5760405162461bcd60e51b815260206004820152601f60248201527f4552524f523a2043616e6e6f7420457863656564206d61782077616c6c657400604482015260640161085a565b611343565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614801561121a57506001600160a01b0383165f9081526012602052604090205460ff16155b1561128b576007548111156111bc5760405162461bcd60e51b815260206004820152603160248201527f4552524f523a2053656c6c207472616e7366657220616d6f756e74206578636560448201527032b239903a34329036b0bc1039b2b6361760791b606482015260840161085a565b6001600160a01b0382165f9081526012602052604090205460ff161580156112cb57506001600160a01b0383165f9081526012602052604090205460ff16155b15611343576008546001600160a01b0383165f908152602081905260409020546112f59083611c34565b11156113435760405162461bcd60e51b815260206004820152601f60248201527f4552524f523a2043616e6e6f7420457863656564206d61782077616c6c657400604482015260640161085a565b305f908152602081905260409020546009548110801590819061136e5750600b5462010000900460ff165b801561137d5750600d5460ff16155b801561138a5750600a5483115b80156113c857507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614155b80156113ec57506001600160a01b0385165f9081526011602052604090205460ff16155b801561141057506001600160a01b0384165f9081526011602052604090205460ff16155b1561143557600d805460ff1916600117905561142a611698565b600d805460ff191690555b6001600160a01b0385165f9081526011602052604090205460019060ff168061147557506001600160a01b0385165f9081526011602052604090205460ff165b1561147d57505f5b5f81156115b557600b546301000000900460ff161561149e5761149e611719565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b03161480156114e057505f600f54115b1561151d576064600f54866114f59190611bfe565b6114ff9190611c15565b90508060105f8282546115129190611c34565b909155506115979050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316876001600160a01b031614801561155f57505f600e54115b15611597576064600e54866115749190611bfe565b61157e9190611c15565b90508060105f8282546115919190611c34565b90915550505b80156115a8576115a88730836117a1565b6115b28186611ccf565b94505b6115c08787876117a1565b50505050505050565b6005546001600160a01b031633146109c45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161085a565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b038316611686575f80fd5b6001600160a01b038216610db2575f80fd5b305f908152602081905260409020546010548115806116b5575080155b156116be575050565b6009548211156116ce5760095491505b6116d7826118c9565b600d546040516001600160a01b0361010090920491909116904780156108fc02915f818181858888f19350505050158015611714573d5f803e3d5ffd5b505050565b5f600c541161175d5760405162461bcd60e51b815260206004820152601060248201526f54726164696e67206e6f74206c69766560801b604482015260640161085a565b600c5443905f9061176f906006611c34565b9050808211611786576014600e819055600f555050565b6004600e819055600f55600b805463ff000000191690555050565b6001600160a01b0383166117c75760405162461bcd60e51b815260040161085a90611c47565b6001600160a01b0382166117ed5760405162461bcd60e51b815260040161085a90611c8c565b6001600160a01b0383165f90815260208190526040902054818110156118645760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161085a565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610e84565b6040805160028082526060820183525f9260208301908036833701905050905030815f815181106118fc576118fc611ce2565b60200260200101906001600160a01b031690816001600160a01b031681525050737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561196c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119909190611cf6565b816001815181106119a3576119a3611ce2565b6001600160a01b039092166020928302919091019091015260405163791ac94760e01b8152737a250d5630b4cf539739df2c5dacb4c659f2488d9063791ac947906119fa9085905f90869030904290600401611d11565b5f604051808303815f87803b158015611a11575f80fd5b505af1158015611a23573d5f803e3d5ffd5b505050505050565b5f6020808352835180828501525f5b81811015611a5657858101830151858201604001528201611a3a565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610cec575f80fd5b5f8060408385031215611a9b575f80fd5b8235611aa681611a76565b946020939093013593505050565b5f60208284031215611ac4575f80fd5b8135611acf81611a76565b9392505050565b5f805f60608486031215611ae8575f80fd5b8335611af381611a76565b92506020840135611b0381611a76565b929592945050506040919091013590565b5f60208284031215611b24575f80fd5b5035919050565b5f8060408385031215611b3c575f80fd5b8235611b4781611a76565b915060208301358015158114611b5b575f80fd5b809150509250929050565b5f8060408385031215611b77575f80fd5b50508035926020909101359150565b5f8060408385031215611b97575f80fd5b8235611ba281611a76565b91506020830135611b5b81611a76565b600181811c90821680611bc657607f821691505b602082108103611be457634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176107d9576107d9611bea565b5f82611c2f57634e487b7160e01b5f52601260045260245ffd5b500490565b808201808211156107d9576107d9611bea565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b818103818111156107d9576107d9611bea565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611d06575f80fd5b8151611acf81611a76565b5f60a082018783526020878185015260a0604085015281875180845260c08601915082890193505f5b81811015611d5f5784516001600160a01b031683529383019391830191600101611d3a565b50506001600160a01b0396909616606085015250505060800152939250505056fea26469706673582212207c341951da699edfbb361a221675cb2cbf5f2eff433692801f16dc5cb5abfcba64736f6c63430008150033

Deployed Bytecode

0x608060405260043610610241575f3560e01c8063715018a611610134578063a457c2d7116100b3578063c9567bf911610078578063c9567bf914610691578063d85ba063146106a5578063dc3f0d0f146106ba578063dd62ed3e146106d9578063e6f70531146106f8578063f2fde38b14610717575f80fd5b8063a457c2d7146105fc578063a9059cbb1461061b578063b231f9031461063a578063baccf5cf14610653578063c18bc19514610672575f80fd5b80638bdb2afa116100f95780638bdb2afa1461056f5780638da5cb5b1461059657806395d89b41146105b35780639687f35a146105c7578063a416614f146105e7575f80fd5b8063715018a6146104de578063735de9f7146104f2578063751039fc1461051957806375f0a8741461052d5780637daa930a14610551575f80fd5b806339509351116101c05780636aa5b37f116101855780636aa5b37f146104425780636b7cadbf146104575780636dd532e0146104765780636ddd17131461048b57806370a08231146104aa575f80fd5b8063395093511461039957806349bd5a5e146103b8578063652e2f041461040357806366a88d96146104185780636a486a8e1461042d575f80fd5b80631f53ac02116102065780631f53ac02146102f157806320f0d2ef1461031257806323b872dd146103405780632be32b611461035f578063313ce5671461037e575f80fd5b806306fdde031461024c578063095ea7b3146102765780630a3b39a3146102a557806318160ddd146102c85780631e15007f146102dc575f80fd5b3661024857005b5f80fd5b348015610257575f80fd5b50610260610736565b60405161026d9190611a2b565b60405180910390f35b348015610281575f80fd5b50610295610290366004611a8a565b6107c6565b604051901515815260200161026d565b3480156102b0575f80fd5b506102ba600c5481565b60405190815260200161026d565b3480156102d3575f80fd5b506002546102ba565b3480156102e7575f80fd5b506102ba60095481565b3480156102fc575f80fd5b5061031061030b366004611ab4565b6107df565b005b34801561031d575f80fd5b5061029561032c366004611ab4565b60126020525f908152604090205460ff1681565b34801561034b575f80fd5b5061029561035a366004611ad6565b6108a7565b34801561036a575f80fd5b50610310610379366004611b14565b6108ca565b348015610389575f80fd5b506040516012815260200161026d565b3480156103a4575f80fd5b506102956103b3366004611a8a565b610960565b3480156103c3575f80fd5b506103eb7f000000000000000000000000bd4e234d3bffc99bab51b86fc254689beabcc87781565b6040516001600160a01b03909116815260200161026d565b34801561040e575f80fd5b506102ba60075481565b348015610423575f80fd5b506102ba60085481565b348015610438575f80fd5b506102ba600f5481565b34801561044d575f80fd5b506102ba60065481565b348015610462575f80fd5b50610310610471366004611b2b565b610981565b348015610481575f80fd5b506102ba60105481565b348015610496575f80fd5b50600b546102959062010000900460ff1681565b3480156104b5575f80fd5b506102ba6104c4366004611ab4565b6001600160a01b03165f9081526020819052604090205490565b3480156104e9575f80fd5b506103106109b3565b3480156104fd575f80fd5b506103eb737a250d5630b4cf539739df2c5dacb4c659f2488d81565b348015610524575f80fd5b506103106109c6565b348015610538575f80fd5b50600d546103eb9061010090046001600160a01b031681565b34801561055c575f80fd5b50600b5461029590610100900460ff1681565b34801561057a575f80fd5b506103eb735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f81565b3480156105a1575f80fd5b506005546001600160a01b03166103eb565b3480156105be575f80fd5b506102606109da565b3480156105d2575f80fd5b50600b54610295906301000000900460ff1681565b3480156105f2575f80fd5b506102ba600a5481565b348015610607575f80fd5b50610295610616366004611a8a565b6109e9565b348015610626575f80fd5b50610295610635366004611a8a565b610a63565b348015610645575f80fd5b50600b546102959060ff1681565b34801561065e575f80fd5b5061031061066d366004611b66565b610a70565b34801561067d575f80fd5b5061031061068c366004611b14565b610a83565b34801561069c575f80fd5b50610310610b1c565b3480156106b0575f80fd5b506102ba600e5481565b3480156106c5575f80fd5b506103106106d4366004611b14565b610b97565b3480156106e4575f80fd5b506102ba6106f3366004611b86565b610c2e565b348015610703575f80fd5b50610295610712366004611a8a565b610c58565b348015610722575f80fd5b50610310610731366004611ab4565b610c76565b60606003805461074590611bb2565b80601f016020809104026020016040519081016040528092919081815260200182805461077190611bb2565b80156107bc5780601f10610793576101008083540402835291602001916107bc565b820191905f5260205f20905b81548152906001019060200180831161079f57829003601f168201915b5050505050905090565b5f336107d3818585610cef565b60019150505b92915050565b600d5461010090046001600160a01b031633146107fa575f80fd5b6001600160a01b0381166108635760405162461bcd60e51b815260206004820152602560248201527f4552524f523a205f64657657616c6c657420616464726573732063616e6e6f74604482015264020626520360dc1b60648201526084015b60405180910390fd5b600d8054610100600160a81b0319166101006001600160a01b03938416810291909117918290559004165f908152601160205260409020805460ff19166001179055565b5f336108b4858285610e12565b6108bf858585610e8a565b506001949350505050565b6108d26115c9565b6103e86108de60025490565b6108e9906001611bfe565b6108f39190611c15565b81101561095b5760405162461bcd60e51b815260206004820152603060248201527f4552524f523a2043616e6e6f7420736574206d61782062757920616d6f756e7460448201526f206c6f776572207468616e20302e312560801b606482015260840161085a565b600655565b5f336107d38185856109728383610c2e565b61097c9190611c34565b610cef565b6109896115c9565b6001600160a01b03919091165f908152601160205260409020805460ff1916911515919091179055565b6109bb6115c9565b6109c45f611623565b565b6109ce6115c9565b600b805460ff19169055565b60606004805461074590611bb2565b5f33816109f68286610c2e565b905083811015610a565760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161085a565b6108bf8286868403610cef565b5f336107d3818585610e8a565b610a786115c9565b600e91909155600f55565b610a8b6115c9565b6103e8610a9760025490565b610aa2906003611bfe565b610aac9190611c15565b811015610b175760405162461bcd60e51b815260206004820152603360248201527f4552524f523a2043616e6e6f7420736574206d61782077616c6c657420616d6f604482015272756e74206c6f776572207468616e20302e332560681b606482015260840161085a565b600855565b610b246115c9565b600c5415610b805760405162461bcd60e51b8152602060048201526024808201527f4552524f523a20546f6b656e20737461746520697320616c7265616479206c696044820152637665202160e01b606482015260840161085a565b43600c55600b805462ffff00191662010100179055565b610b9f6115c9565b6103e8610bab60025490565b610bb6906001611bfe565b610bc09190611c15565b811015610c295760405162461bcd60e51b815260206004820152603160248201527f4552524f523a2043616e6e6f7420736574206d61782073656c6c20616d6f756e60448201527074206c6f776572207468616e20302e312560781b606482015260840161085a565b600755565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b600d545f9061010090046001600160a01b03166107d3848285611674565b610c7e6115c9565b6001600160a01b038116610ce35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161085a565b610cec81611623565b50565b6001600160a01b038316610d515760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161085a565b6001600160a01b038216610db25760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161085a565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f610e1d8484610c2e565b90505f198114610e845781811015610e775760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161085a565b610e848484848403610cef565b50505050565b6001600160a01b038316610eb05760405162461bcd60e51b815260040161085a90611c47565b6001600160a01b038216610ed65760405162461bcd60e51b815260040161085a90611c8c565b5f8111610f255760405162461bcd60e51b815260206004820152601d60248201527f616d6f756e74206d7573742062652067726561746572207468616e2030000000604482015260640161085a565b600b5460ff1615611343576005546001600160a01b03848116911614801590610f5c57506005546001600160a01b03838116911614155b8015610f7057506001600160a01b03821615155b8015610f8757506001600160a01b03821661dead14155b1561134357600b54610100900460ff16611081576001600160a01b0383165f9081526012602052604090205460ff1680610fd857506001600160a01b0382165f9081526012602052604090205460ff165b6110245760405162461bcd60e51b815260206004820152601d60248201527f4552524f523a2054726164696e67206973206e6f74206163746976652e000000604482015260640161085a565b6005546001600160a01b038481169116146110815760405162461bcd60e51b815260206004820152601960248201527f4552524f523a2054726164696e6720697320656e61626c656400000000000000604482015260640161085a565b7f000000000000000000000000bd4e234d3bffc99bab51b86fc254689beabcc8776001600160a01b0316836001600160a01b03161480156110da57506001600160a01b0382165f9081526012602052604090205460ff16155b156111c1576006548111156111495760405162461bcd60e51b815260206004820152602f60248201527f4552524f523a20427579207472616e7366657220616d6f756e7420657863656560448201526e3239903a34329036b0bc10313abc9760891b606482015260840161085a565b6008546001600160a01b0383165f9081526020819052604090205461116e9083611c34565b11156111bc5760405162461bcd60e51b815260206004820152601f60248201527f4552524f523a2043616e6e6f7420457863656564206d61782077616c6c657400604482015260640161085a565b611343565b7f000000000000000000000000bd4e234d3bffc99bab51b86fc254689beabcc8776001600160a01b0316826001600160a01b031614801561121a57506001600160a01b0383165f9081526012602052604090205460ff16155b1561128b576007548111156111bc5760405162461bcd60e51b815260206004820152603160248201527f4552524f523a2053656c6c207472616e7366657220616d6f756e74206578636560448201527032b239903a34329036b0bc1039b2b6361760791b606482015260840161085a565b6001600160a01b0382165f9081526012602052604090205460ff161580156112cb57506001600160a01b0383165f9081526012602052604090205460ff16155b15611343576008546001600160a01b0383165f908152602081905260409020546112f59083611c34565b11156113435760405162461bcd60e51b815260206004820152601f60248201527f4552524f523a2043616e6e6f7420457863656564206d61782077616c6c657400604482015260640161085a565b305f908152602081905260409020546009548110801590819061136e5750600b5462010000900460ff165b801561137d5750600d5460ff16155b801561138a5750600a5483115b80156113c857507f000000000000000000000000bd4e234d3bffc99bab51b86fc254689beabcc8776001600160a01b0316856001600160a01b031614155b80156113ec57506001600160a01b0385165f9081526011602052604090205460ff16155b801561141057506001600160a01b0384165f9081526011602052604090205460ff16155b1561143557600d805460ff1916600117905561142a611698565b600d805460ff191690555b6001600160a01b0385165f9081526011602052604090205460019060ff168061147557506001600160a01b0385165f9081526011602052604090205460ff165b1561147d57505f5b5f81156115b557600b546301000000900460ff161561149e5761149e611719565b7f000000000000000000000000bd4e234d3bffc99bab51b86fc254689beabcc8776001600160a01b0316866001600160a01b03161480156114e057505f600f54115b1561151d576064600f54866114f59190611bfe565b6114ff9190611c15565b90508060105f8282546115129190611c34565b909155506115979050565b7f000000000000000000000000bd4e234d3bffc99bab51b86fc254689beabcc8776001600160a01b0316876001600160a01b031614801561155f57505f600e54115b15611597576064600e54866115749190611bfe565b61157e9190611c15565b90508060105f8282546115919190611c34565b90915550505b80156115a8576115a88730836117a1565b6115b28186611ccf565b94505b6115c08787876117a1565b50505050505050565b6005546001600160a01b031633146109c45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161085a565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b038316611686575f80fd5b6001600160a01b038216610db2575f80fd5b305f908152602081905260409020546010548115806116b5575080155b156116be575050565b6009548211156116ce5760095491505b6116d7826118c9565b600d546040516001600160a01b0361010090920491909116904780156108fc02915f818181858888f19350505050158015611714573d5f803e3d5ffd5b505050565b5f600c541161175d5760405162461bcd60e51b815260206004820152601060248201526f54726164696e67206e6f74206c69766560801b604482015260640161085a565b600c5443905f9061176f906006611c34565b9050808211611786576014600e819055600f555050565b6004600e819055600f55600b805463ff000000191690555050565b6001600160a01b0383166117c75760405162461bcd60e51b815260040161085a90611c47565b6001600160a01b0382166117ed5760405162461bcd60e51b815260040161085a90611c8c565b6001600160a01b0383165f90815260208190526040902054818110156118645760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161085a565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610e84565b6040805160028082526060820183525f9260208301908036833701905050905030815f815181106118fc576118fc611ce2565b60200260200101906001600160a01b031690816001600160a01b031681525050737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561196c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119909190611cf6565b816001815181106119a3576119a3611ce2565b6001600160a01b039092166020928302919091019091015260405163791ac94760e01b8152737a250d5630b4cf539739df2c5dacb4c659f2488d9063791ac947906119fa9085905f90869030904290600401611d11565b5f604051808303815f87803b158015611a11575f80fd5b505af1158015611a23573d5f803e3d5ffd5b505050505050565b5f6020808352835180828501525f5b81811015611a5657858101830151858201604001528201611a3a565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610cec575f80fd5b5f8060408385031215611a9b575f80fd5b8235611aa681611a76565b946020939093013593505050565b5f60208284031215611ac4575f80fd5b8135611acf81611a76565b9392505050565b5f805f60608486031215611ae8575f80fd5b8335611af381611a76565b92506020840135611b0381611a76565b929592945050506040919091013590565b5f60208284031215611b24575f80fd5b5035919050565b5f8060408385031215611b3c575f80fd5b8235611b4781611a76565b915060208301358015158114611b5b575f80fd5b809150509250929050565b5f8060408385031215611b77575f80fd5b50508035926020909101359150565b5f8060408385031215611b97575f80fd5b8235611ba281611a76565b91506020830135611b5b81611a76565b600181811c90821680611bc657607f821691505b602082108103611be457634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176107d9576107d9611bea565b5f82611c2f57634e487b7160e01b5f52601260045260245ffd5b500490565b808201808211156107d9576107d9611bea565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b818103818111156107d9576107d9611bea565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611d06575f80fd5b8151611acf81611a76565b5f60a082018783526020878185015260a0604085015281875180845260c08601915082890193505f5b81811015611d5f5784516001600160a01b031683529383019391830191600101611d3a565b50506001600160a01b0396909616606085015250505060800152939250505056fea26469706673582212207c341951da699edfbb361a221675cb2cbf5f2eff433692801f16dc5cb5abfcba64736f6c63430008150033

Deployed Bytecode Sourcemap

20955:9052:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4820:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7180:201;;;;;;;;;;-1:-1:-1;7180:201:0;;;;;:::i;:::-;;:::i;:::-;;;1188:14:1;;1181:22;1163:41;;1151:2;1136:18;7180:201:0;1023:187:1;21400:35:0;;;;;;;;;;;;;;;;;;;1361:25:1;;;1349:2;1334:18;21400:35:0;1215:177:1;5949:108:0;;;;;;;;;;-1:-1:-1;6037:12:0;;5949:108;;21174:31;;;;;;;;;;;;;;;;25433:291;;;;;;;;;;-1:-1:-1;25433:291:0;;;;;:::i;:::-;;:::i;:::-;;21993:47;;;;;;;;;;-1:-1:-1;21993:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;7961:261;;;;;;;;;;-1:-1:-1;7961:261:0;;;;;:::i;:::-;;:::i;24507:250::-;;;;;;;;;;-1:-1:-1;24507:250:0;;;;;:::i;:::-;;:::i;5791:93::-;;;;;;;;;;-1:-1:-1;5791:93:0;;5874:2;2437:36:1;;2425:2;2410:18;5791:93:0;2295:184:1;8631:238:0;;;;;;;;;;-1:-1:-1;8631:238:0;;;;;:::i;:::-;;:::i;21617:38::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2648:32:1;;;2630:51;;2618:2;2603:18;21617:38:0;2484:203:1;21104:27:0;;;;;;;;;;;;;;;;21138:29;;;;;;;;;;;;;;;;21543:28;;;;;;;;;;;;;;;;21071:26;;;;;;;;;;;;;;;;23503:128;;;;;;;;;;-1:-1:-1;23503:128:0;;;;;:::i;:::-;;:::i;21580:30::-;;;;;;;;;;;;;;;;21323:31;;;;;;;;;;-1:-1:-1;21323:31:0;;;;;;;;;;;6120:127;;;;;;;;;;-1:-1:-1;6120:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;6221:18:0;6194:7;6221:18;;;;;;;;;;;;6120:127;18874:103;;;;;;;;;;;;;:::i;21814:115::-;;;;;;;;;;;;21886:42;21814:115;;26001:81;;;;;;;;;;;;;:::i;21470:30::-;;;;;;;;;;-1:-1:-1;21470:30:0;;;;;;;-1:-1:-1;;;;;21470:30:0;;;21283:33;;;;;;;;;;-1:-1:-1;21283:33:0;;;;;;;;;;;21688:117;;;;;;;;;;;;21762:42;21688:117;;18233:87;;;;;;;;;;-1:-1:-1;18306:6:0;;-1:-1:-1;;;;;18306:6:0;18233:87;;5039:104;;;;;;;;;;;;;:::i;21361:30::-;;;;;;;;;;-1:-1:-1;21361:30:0;;;;;;;;;;;21212:25;;;;;;;;;;;;;;;;9372:436;;;;;;;;;;-1:-1:-1;9372:436:0;;;;;:::i;:::-;;:::i;6453:193::-;;;;;;;;;;-1:-1:-1;6453:193:0;;;;;:::i;:::-;;:::i;21246:30::-;;;;;;;;;;-1:-1:-1;21246:30:0;;;;;;;;23840:162;;;;;;;;;;-1:-1:-1;23840:162:0;;;;;:::i;:::-;;:::i;25734:259::-;;;;;;;;;;-1:-1:-1;25734:259:0;;;;;:::i;:::-;;:::i;25186:239::-;;;;;;;;;;;;;:::i;21509:27::-;;;;;;;;;;;;;;;;24765:253;;;;;;;;;;-1:-1:-1;24765:253:0;;;;;:::i;:::-;;:::i;6709:151::-;;;;;;;;;;-1:-1:-1;6709:151:0;;;;;:::i;:::-;;:::i;23639:193::-;;;;;;;;;;-1:-1:-1;23639:193:0;;;;;:::i;:::-;;:::i;19132:201::-;;;;;;;;;;-1:-1:-1;19132:201:0;;;;;:::i;:::-;;:::i;4820:100::-;4874:13;4907:5;4900:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4820:100;:::o;7180:201::-;7263:4;2960:10;7319:32;2960:10;7335:7;7344:6;7319:8;:32::i;:::-;7369:4;7362:11;;;7180:201;;;;;:::o;25433:291::-;25517:15;;;;;-1:-1:-1;;;;;25517:15:0;25503:10;:29;25495:38;;;;;;-1:-1:-1;;;;;25552:24:0;;25544:74;;;;-1:-1:-1;;;25544:74:0;;4812:2:1;25544:74:0;;;4794:21:1;4851:2;4831:18;;;4824:30;4890:34;4870:18;;;4863:62;-1:-1:-1;;;4941:18:1;;;4934:35;4986:19;;25544:74:0;;;;;;;;;25629:15;:37;;-1:-1:-1;;;;;;25629:37:0;;-1:-1:-1;;;;;25629:37:0;;;;;;;;;;;;;25693:15;;;-1:-1:-1;25677:32:0;;;:15;:32;;;;;:39;;-1:-1:-1;;25677:39:0;-1:-1:-1;25677:39:0;;;25433:291::o;7961:261::-;8058:4;2960:10;8116:38;8132:4;2960:10;8147:6;8116:15;:38::i;:::-;8165:27;8175:4;8181:2;8185:6;8165:9;:27::i;:::-;-1:-1:-1;8210:4:0;;7961:261;-1:-1:-1;;;;7961:261:0:o;24507:250::-;18119:13;:11;:13::i;:::-;24636:5:::1;24615:13;6037:12:::0;;;5949:108;24615:13:::1;:17;::::0;24631:1:::1;24615:17;:::i;:::-;24614:27;;;;:::i;:::-;24603:6;:39;;24581:137;;;::::0;-1:-1:-1;;;24581:137:0;;5745:2:1;24581:137:0::1;::::0;::::1;5727:21:1::0;5784:2;5764:18;;;5757:30;5823:34;5803:18;;;5796:62;-1:-1:-1;;;5874:18:1;;;5867:46;5930:19;;24581:137:0::1;5543:412:1::0;24581:137:0::1;24729:11;:20:::0;24507:250::o;8631:238::-;8719:4;2960:10;8775:64;2960:10;8791:7;8828:10;8800:25;2960:10;8791:7;8800:9;:25::i;:::-;:38;;;;:::i;:::-;8775:8;:64::i;23503:128::-;18119:13;:11;:13::i;:::-;-1:-1:-1;;;;;23588:24:0;;;::::1;;::::0;;;:15:::1;:24;::::0;;;;:35;;-1:-1:-1;;23588:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;23503:128::o;18874:103::-;18119:13;:11;:13::i;:::-;18939:30:::1;18966:1;18939:18;:30::i;:::-;18874:103::o:0;26001:81::-;18119:13;:11;:13::i;:::-;26055:11:::1;:19:::0;;-1:-1:-1;;26055:19:0::1;::::0;;26001:81::o;5039:104::-;5095:13;5128:7;5121:14;;;;;:::i;9372:436::-;9465:4;2960:10;9465:4;9548:25;2960:10;9565:7;9548:9;:25::i;:::-;9521:52;;9612:15;9592:16;:35;;9584:85;;;;-1:-1:-1;;;9584:85:0;;6292:2:1;9584:85:0;;;6274:21:1;6331:2;6311:18;;;6304:30;6370:34;6350:18;;;6343:62;-1:-1:-1;;;6421:18:1;;;6414:35;6466:19;;9584:85:0;6090:401:1;9584:85:0;9705:60;9714:5;9721:7;9749:15;9730:16;:34;9705:8;:60::i;6453:193::-;6532:4;2960:10;6588:28;2960:10;6605:2;6609:6;6588:9;:28::i;23840:162::-;18119:13;:11;:13::i;:::-;23931:12:::1;:25:::0;;;;23967:13:::1;:27:::0;23840:162::o;25734:259::-;18119:13;:11;:13::i;:::-;25866:5:::1;25845:13;6037:12:::0;;;5949:108;25845:13:::1;:17;::::0;25861:1:::1;25845:17;:::i;:::-;25844:27;;;;:::i;:::-;25833:6;:39;;25811:140;;;::::0;-1:-1:-1;;;25811:140:0;;6698:2:1;25811:140:0::1;::::0;::::1;6680:21:1::0;6737:2;6717:18;;;6710:30;6776:34;6756:18;;;6749:62;-1:-1:-1;;;6827:18:1;;;6820:49;6886:19;;25811:140:0::1;6496:415:1::0;25811:140:0::1;25962:14;:23:::0;25734:259::o;25186:239::-;18119:13;:11;:13::i;:::-;25245:20:::1;::::0;:25;25237:74:::1;;;::::0;-1:-1:-1;;;25237:74:0;;7118:2:1;25237:74:0::1;::::0;::::1;7100:21:1::0;7157:2;7137:18;;;7130:30;7196:34;7176:18;;;7169:62;-1:-1:-1;;;7247:18:1;;;7240:34;7291:19;;25237:74:0::1;6916:400:1::0;25237:74:0::1;25345:12;25322:20;:35:::0;25368:13:::1;:20:::0;;-1:-1:-1;;25399:18:0;;;;;25186:239::o;24765:253::-;18119:13;:11;:13::i;:::-;24895:5:::1;24874:13;6037:12:::0;;;5949:108;24874:13:::1;:17;::::0;24890:1:::1;24874:17;:::i;:::-;24873:27;;;;:::i;:::-;24862:6;:39;;24840:138;;;::::0;-1:-1:-1;;;24840:138:0;;7523:2:1;24840:138:0::1;::::0;::::1;7505:21:1::0;7562:2;7542:18;;;7535:30;7601:34;7581:18;;;7574:62;-1:-1:-1;;;7652:18:1;;;7645:47;7709:19;;24840:138:0::1;7321:413:1::0;24840:138:0::1;24989:12;:21:::0;24765:253::o;6709:151::-;-1:-1:-1;;;;;6825:18:0;;;6798:7;6825:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;6709:151::o;23639:193::-;23745:15;;23712:4;;23745:15;;;-1:-1:-1;;;;;23745:15:0;23771:31;23779:7;23745:15;23795:6;23771:7;:31::i;19132:201::-;18119:13;:11;:13::i;:::-;-1:-1:-1;;;;;19221:22:0;::::1;19213:73;;;::::0;-1:-1:-1;;;19213:73:0;;7941:2:1;19213:73:0::1;::::0;::::1;7923:21:1::0;7980:2;7960:18;;;7953:30;8019:34;7999:18;;;7992:62;-1:-1:-1;;;8070:18:1;;;8063:36;8116:19;;19213:73:0::1;7739:402:1::0;19213:73:0::1;19297:28;19316:8;19297:18;:28::i;:::-;19132:201:::0;:::o;13365:346::-;-1:-1:-1;;;;;13467:19:0;;13459:68;;;;-1:-1:-1;;;13459:68:0;;8348:2:1;13459:68:0;;;8330:21:1;8387:2;8367:18;;;8360:30;8426:34;8406:18;;;8399:62;-1:-1:-1;;;8477:18:1;;;8470:34;8521:19;;13459:68:0;8146:400:1;13459:68:0;-1:-1:-1;;;;;13546:21:0;;13538:68;;;;-1:-1:-1;;;13538:68:0;;8753:2:1;13538:68:0;;;8735:21:1;8792:2;8772:18;;;8765:30;8831:34;8811:18;;;8804:62;-1:-1:-1;;;8882:18:1;;;8875:32;8924:19;;13538:68:0;8551:398:1;13538:68:0;-1:-1:-1;;;;;13619:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;13671:32;;1361:25:1;;;13671:32:0;;1334:18:1;13671:32:0;;;;;;;13365:346;;;:::o;14016:419::-;14117:24;14144:25;14154:5;14161:7;14144:9;:25::i;:::-;14117:52;;-1:-1:-1;;14184:16:0;:37;14180:248;;14266:6;14246:16;:26;;14238:68;;;;-1:-1:-1;;;14238:68:0;;9156:2:1;14238:68:0;;;9138:21:1;9195:2;9175:18;;;9168:30;9234:31;9214:18;;;9207:59;9283:18;;14238:68:0;8954:353:1;14238:68:0;14350:51;14359:5;14366:7;14394:6;14375:16;:25;14350:8;:51::i;:::-;14106:329;14016:419;;;:::o;26577:3427::-;-1:-1:-1;;;;;26709:18:0;;26701:68;;;;-1:-1:-1;;;26701:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26788:16:0;;26780:64;;;;-1:-1:-1;;;26780:64:0;;;;;;;:::i;:::-;26872:1;26863:6;:10;26855:52;;;;-1:-1:-1;;;26855:52:0;;10324:2:1;26855:52:0;;;10306:21:1;10363:2;10343:18;;;10336:30;10402:31;10382:18;;;10375:59;10451:18;;26855:52:0;10122:353:1;26855:52:0;26922:11;;;;26918:1746;;;18306:6;;-1:-1:-1;;;;;26972:15:0;;;18306:6;;26972:15;;;;:49;;-1:-1:-1;18306:6:0;;-1:-1:-1;;;;;27008:13:0;;;18306:6;;27008:13;;26972:49;:86;;;;-1:-1:-1;;;;;;27042:16:0;;;;26972:86;:128;;;;-1:-1:-1;;;;;;27079:21:0;;27093:6;27079:21;;26972:128;26950:1703;;;27140:13;;;;;;;27135:327;;-1:-1:-1;;;;;27212:21:0;;;;;;:15;:21;;;;;;;;;:73;;-1:-1:-1;;;;;;27266:19:0;;;;;;:15;:19;;;;;;;;27212:73;27178:188;;;;-1:-1:-1;;;27178:188:0;;10682:2:1;27178:188:0;;;10664:21:1;10721:2;10701:18;;;10694:30;10760:31;10740:18;;;10733:59;10809:18;;27178:188:0;10480:353:1;27178:188:0;18306:6;;-1:-1:-1;;;;;27397:15:0;;;18306:6;;27397:15;27389:53;;;;-1:-1:-1;;;27389:53:0;;11040:2:1;27389:53:0;;;11022:21:1;11079:2;11059:18;;;11052:30;11118:27;11098:18;;;11091:55;11163:18;;27389:53:0;10838:349:1;27389:53:0;27542:13;-1:-1:-1;;;;;27534:21:0;:4;-1:-1:-1;;;;;27534:21:0;;:45;;;;-1:-1:-1;;;;;;27560:19:0;;;;;;:15;:19;;;;;;;;27559:20;27534:45;27508:1130;;;27666:11;;27656:6;:21;;27622:154;;;;-1:-1:-1;;;27622:154:0;;11394:2:1;27622:154:0;;;11376:21:1;11433:2;11413:18;;;11406:30;11472:34;11452:18;;;11445:62;-1:-1:-1;;;11523:18:1;;;11516:45;11578:19;;27622:154:0;11192:411:1;27622:154:0;27859:14;;-1:-1:-1;;;;;6221:18:0;;6194:7;6221:18;;;;;;;;;;;27833:22;;:6;:22;:::i;:::-;:40;;27799:157;;;;-1:-1:-1;;;27799:157:0;;11810:2:1;27799:157:0;;;11792:21:1;11849:2;11829:18;;;11822:30;11888:33;11868:18;;;11861:61;11939:18;;27799:157:0;11608:355:1;27799:157:0;27508:1130;;;28060:13;-1:-1:-1;;;;;28054:19:0;:2;-1:-1:-1;;;;;28054:19:0;;:45;;;;-1:-1:-1;;;;;;28078:21:0;;;;;;:15;:21;;;;;;;;28077:22;28054:45;28028:610;;;28186:12;;28176:6;:22;;28142:157;;;;-1:-1:-1;;;28142:157:0;;12170:2:1;28142:157:0;;;12152:21:1;12209:2;12189:18;;;12182:30;12248:34;12228:18;;;12221:62;-1:-1:-1;;;12299:18:1;;;12292:47;12356:19;;28142:157:0;11968:413:1;28028:610:0;-1:-1:-1;;;;;28352:19:0;;;;;;:15;:19;;;;;;;;28351:20;:67;;;;-1:-1:-1;;;;;;28397:21:0;;;;;;:15;:21;;;;;;;;28396:22;28351:67;28325:313;;;28521:14;;-1:-1:-1;;;;;6221:18:0;;6194:7;6221:18;;;;;;;;;;;28495:22;;:6;:22;:::i;:::-;:40;;28461:157;;;;-1:-1:-1;;;28461:157:0;;11810:2:1;28461:157:0;;;11792:21:1;11849:2;11829:18;;;11822:30;11888:33;11868:18;;;11861:61;11939:18;;28461:157:0;11608:355:1;28461:157:0;28723:4;28674:28;6221:18;;;;;;;;;;;28779:16;;28755:40;;;;;;;28824:35;;-1:-1:-1;28848:11:0;;;;;;;28824:35;:61;;;;-1:-1:-1;28877:8:0;;;;28876:9;28824:61;:97;;;;;28911:10;;28902:6;:19;28824:97;:139;;;;;28949:13;-1:-1:-1;;;;;28941:21:0;:4;-1:-1:-1;;;;;28941:21:0;;28939:24;28824:139;:178;;;;-1:-1:-1;;;;;;28981:21:0;;;;;;:15;:21;;;;;;;;28980:22;28824:178;:215;;;;-1:-1:-1;;;;;;29020:19:0;;;;;;:15;:19;;;;;;;;29019:20;28824:215;28806:349;;;29066:8;:15;;-1:-1:-1;;29066:15:0;29077:4;29066:15;;;29096:16;:14;:16::i;:::-;29127:8;:16;;-1:-1:-1;;29127:16:0;;;28806:349;-1:-1:-1;;;;;29199:21:0;;29165:12;29199:21;;;:15;:21;;;;;;29180:4;;29199:21;;;:44;;-1:-1:-1;;;;;;29224:19:0;;;;;;:15;:19;;;;;;;;29199:44;29195:92;;;-1:-1:-1;29270:5:0;29195:92;29297:12;29328:7;29324:629;;;29355:11;;;;;;;29352:62;;;29385:12;:10;:12::i;:::-;29459:13;-1:-1:-1;;;;;29453:19:0;:2;-1:-1:-1;;;;;29453:19:0;;:40;;;;;29492:1;29476:13;;:17;29453:40;29449:359;;;29548:3;29531:13;;29522:6;:22;;;;:::i;:::-;29521:30;;;;:::i;:::-;29514:37;;29589:4;29570:15;;:23;;;;;;;:::i;:::-;;;;-1:-1:-1;29449:359:0;;-1:-1:-1;29449:359:0;;29660:13;-1:-1:-1;;;;;29652:21:0;:4;-1:-1:-1;;;;;29652:21:0;;:41;;;;;29692:1;29677:12;;:16;29652:41;29648:160;;;29747:3;29731:12;;29722:6;:21;;;;:::i;:::-;29721:29;;;;:::i;:::-;29714:36;;29788:4;29769:15;;:23;;;;;;;:::i;:::-;;;;-1:-1:-1;;29648:160:0;29826:8;;29822:91;;29855:42;29871:4;29885;29892;29855:15;:42::i;:::-;29927:14;29937:4;29927:14;;:::i;:::-;;;29324:629;29963:33;29979:4;29985:2;29989:6;29963:15;:33::i;:::-;26690:3314;;;;26577:3427;;;:::o;18398:132::-;18306:6;;-1:-1:-1;;;;;18306:6:0;2960:10;18462:23;18454:68;;;;-1:-1:-1;;;18454:68:0;;12721:2:1;18454:68:0;;;12703:21:1;;;12740:18;;;12733:30;12799:34;12779:18;;;12772:62;12851:18;;18454:68:0;12519:356:1;19493:191:0;19586:6;;;-1:-1:-1;;;;;19603:17:0;;;-1:-1:-1;;;;;;19603:17:0;;;;;;;19636:40;;19586:6;;;19603:17;19586:6;;19636:40;;19567:16;;19636:40;19556:128;19493:191;:::o;13719:289::-;-1:-1:-1;;;;;13834:19:0;;13826:28;;;;;;-1:-1:-1;;;;;13873:21:0;;13865:30;;;;;24012:487;24101:4;24057:23;6221:18;;;;;;;;;;;24149:15;;24181:20;;;:46;;-1:-1:-1;24205:22:0;;24181:46;24177:85;;;24244:7;;24012:487::o;24177:85::-;24296:16;;24278:15;:34;24274:101;;;24347:16;;24329:34;;24274:101;24389:33;24406:15;24389:16;:33::i;:::-;24443:15;;24435:56;;-1:-1:-1;;;;;24443:15:0;;;;;;;;;24469:21;24435:56;;;;;;;;;24469:21;24443:15;24435:56;;;;;;;;;;;;;;;;;;;;;24046:453;;24012:487::o;26094:475::-;26181:1;26158:20;;:24;26136:77;;;;-1:-1:-1;;;26136:77:0;;13082:2:1;26136:77:0;;;13064:21:1;13121:2;13101:18;;;13094:30;-1:-1:-1;;;13140:18:1;;;13133:46;13196:18;;26136:77:0;12880:340:1;26136:77:0;26297:20;;26247:12;;26224:20;;26297:24;;26320:1;26297:24;:::i;:::-;26270:51;;26351:16;26335:12;:32;26332:229;;26399:2;26384:12;:17;;;26416:13;:18;26125:444;;26094:475::o;26332:229::-;26482:1;26467:12;:16;;;26498:13;:17;26530:11;:19;;-1:-1:-1;;26530:19:0;;;26125:444;;26094:475::o;10278:806::-;-1:-1:-1;;;;;10375:18:0;;10367:68;;;;-1:-1:-1;;;10367:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10454:16:0;;10446:64;;;;-1:-1:-1;;;10446:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10596:15:0;;10574:19;10596:15;;;;;;;;;;;10630:21;;;;10622:72;;;;-1:-1:-1;;;10622:72:0;;13427:2:1;10622:72:0;;;13409:21:1;13466:2;13446:18;;;13439:30;13505:34;13485:18;;;13478:62;-1:-1:-1;;;13556:18:1;;;13549:36;13602:19;;10622:72:0;13225:402:1;10622:72:0;-1:-1:-1;;;;;10730:15:0;;;:9;:15;;;;;;;;;;;10748:20;;;10730:38;;10948:13;;;;;;;;;;:23;;;;;;11000:26;;1361:25:1;;;10948:13:0;;11000:26;;1334:18:1;11000:26:0;;;;;;;11039:37;24012:487;23098:397;23188:16;;;23202:1;23188:16;;;;;;;;23164:21;;23188:16;;;;;;;;;;-1:-1:-1;23188:16:0;23164:40;;23233:4;23215;23220:1;23215:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;23215:23:0;;;-1:-1:-1;;;;;23215:23:0;;;;;21886:42;-1:-1:-1;;;;;23259:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23249:4;23254:1;23249:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;23249:30:0;;;:7;;;;;;;;;;;:30;23292:195;;-1:-1:-1;;;23292:195:0;;21886:42;;23292:64;;:195;;23371:11;;23397:1;;23414:4;;23441;;23461:15;;23292:195;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23153:342;23098:397;:::o;14:548:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:131::-;-1:-1:-1;;;;;642:31:1;;632:42;;622:70;;688:1;685;678:12;703:315;771:6;779;832:2;820:9;811:7;807:23;803:32;800:52;;;848:1;845;838:12;800:52;887:9;874:23;906:31;931:5;906:31;:::i;:::-;956:5;1008:2;993:18;;;;980:32;;-1:-1:-1;;;703:315:1:o;1397:247::-;1456:6;1509:2;1497:9;1488:7;1484:23;1480:32;1477:52;;;1525:1;1522;1515:12;1477:52;1564:9;1551:23;1583:31;1608:5;1583:31;:::i;:::-;1633:5;1397:247;-1:-1:-1;;;1397:247:1:o;1649:456::-;1726:6;1734;1742;1795:2;1783:9;1774:7;1770:23;1766:32;1763:52;;;1811:1;1808;1801:12;1763:52;1850:9;1837:23;1869:31;1894:5;1869:31;:::i;:::-;1919:5;-1:-1:-1;1976:2:1;1961:18;;1948:32;1989:33;1948:32;1989:33;:::i;:::-;1649:456;;2041:7;;-1:-1:-1;;;2095:2:1;2080:18;;;;2067:32;;1649:456::o;2110:180::-;2169:6;2222:2;2210:9;2201:7;2197:23;2193:32;2190:52;;;2238:1;2235;2228:12;2190:52;-1:-1:-1;2261:23:1;;2110:180;-1:-1:-1;2110:180:1:o;2692:416::-;2757:6;2765;2818:2;2806:9;2797:7;2793:23;2789:32;2786:52;;;2834:1;2831;2824:12;2786:52;2873:9;2860:23;2892:31;2917:5;2892:31;:::i;:::-;2942:5;-1:-1:-1;2999:2:1;2984:18;;2971:32;3041:15;;3034:23;3022:36;;3012:64;;3072:1;3069;3062:12;3012:64;3095:7;3085:17;;;2692:416;;;;;:::o;3579:248::-;3647:6;3655;3708:2;3696:9;3687:7;3683:23;3679:32;3676:52;;;3724:1;3721;3714:12;3676:52;-1:-1:-1;;3747:23:1;;;3817:2;3802:18;;;3789:32;;-1:-1:-1;3579:248:1:o;3832:388::-;3900:6;3908;3961:2;3949:9;3940:7;3936:23;3932:32;3929:52;;;3977:1;3974;3967:12;3929:52;4016:9;4003:23;4035:31;4060:5;4035:31;:::i;:::-;4085:5;-1:-1:-1;4142:2:1;4127:18;;4114:32;4155:33;4114:32;4155:33;:::i;4225:380::-;4304:1;4300:12;;;;4347;;;4368:61;;4422:4;4414:6;4410:17;4400:27;;4368:61;4475:2;4467:6;4464:14;4444:18;4441:38;4438:161;;4521:10;4516:3;4512:20;4509:1;4502:31;4556:4;4553:1;4546:15;4584:4;4581:1;4574:15;4438:161;;4225:380;;;:::o;5016:127::-;5077:10;5072:3;5068:20;5065:1;5058:31;5108:4;5105:1;5098:15;5132:4;5129:1;5122:15;5148:168;5221:9;;;5252;;5269:15;;;5263:22;;5249:37;5239:71;;5290:18;;:::i;5321:217::-;5361:1;5387;5377:132;;5431:10;5426:3;5422:20;5419:1;5412:31;5466:4;5463:1;5456:15;5494:4;5491:1;5484:15;5377:132;-1:-1:-1;5523:9:1;;5321:217::o;5960:125::-;6025:9;;;6046:10;;;6043:36;;;6059:18;;:::i;9312:401::-;9514:2;9496:21;;;9553:2;9533:18;;;9526:30;9592:34;9587:2;9572:18;;9565:62;-1:-1:-1;;;9658:2:1;9643:18;;9636:35;9703:3;9688:19;;9312:401::o;9718:399::-;9920:2;9902:21;;;9959:2;9939:18;;;9932:30;9998:34;9993:2;9978:18;;9971:62;-1:-1:-1;;;10064:2:1;10049:18;;10042:33;10107:3;10092:19;;9718:399::o;12386:128::-;12453:9;;;12474:11;;;12471:37;;;12488:18;;:::i;13764:127::-;13825:10;13820:3;13816:20;13813:1;13806:31;13856:4;13853:1;13846:15;13880:4;13877:1;13870:15;13896:251;13966:6;14019:2;14007:9;13998:7;13994:23;13990:32;13987:52;;;14035:1;14032;14025:12;13987:52;14067:9;14061:16;14086:31;14111:5;14086:31;:::i;14152:980::-;14414:4;14462:3;14451:9;14447:19;14493:6;14482:9;14475:25;14519:2;14557:6;14552:2;14541:9;14537:18;14530:34;14600:3;14595:2;14584:9;14580:18;14573:31;14624:6;14659;14653:13;14690:6;14682;14675:22;14728:3;14717:9;14713:19;14706:26;;14767:2;14759:6;14755:15;14741:29;;14788:1;14798:195;14812:6;14809:1;14806:13;14798:195;;;14877:13;;-1:-1:-1;;;;;14873:39:1;14861:52;;14968:15;;;;14933:12;;;;14909:1;14827:9;14798:195;;;-1:-1:-1;;;;;;;15049:32:1;;;;15044:2;15029:18;;15022:60;-1:-1:-1;;;15113:3:1;15098:19;15091:35;15010:3;14152:980;-1:-1:-1;;;14152:980:1:o

Swarm Source

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