ETH Price: $3,064.39 (-1.26%)

Token

AxiomAI (AXIOM)
 

Overview

Max Total Supply

1,000,000,000 AXIOM

Holders

108

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Filtered by Token Holder
Uniswap V2: AXIOM
Balance
0.00000042 AXIOM

Value
$0.00
0x1cb5d8045b91cc3ee2f0917097b789a989ff4173
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:
AxiomAI

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

/**
 *    __    _  _  ____  _____  __  __    __    ____ 
 *   /__\  ( \/ )(_  _)(  _  )(  \/  )  /__\  (_  _)
 *  /(__)\  )  (  _)(_  )(_)(  )    (  /(__)\  _)(_ 
 * (__)(__)(_/\_)(____)(_____)(_/\/\_)(__)(__)(____)                   
 * 
 * AXIOM is an advanced artificial intelligence capable of understanding and responding to complex questions. Powered by Ethereum.
 * 
 * 
 * Total Supply: 1 Billion Tokens
 * 
 * 1% added to liquidity, 4% tax for Marketing & compute costs.
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.16;

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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function allPairsLength() external view returns (uint256);

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

    function allPairs(uint256) external view returns (address pair);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

interface IUniswapV2Pair {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 value);

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint256);

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    event Mint(address indexed sender, uint256 amount0, uint256 amount1);
    event Burn(
        address indexed sender,
        uint256 amount0,
        uint256 amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        );

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

interface IUniswapV2Router01 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
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);
}

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

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

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }
}

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
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 anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing 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);
    }
}

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
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;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

    /**
     * @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 value {ERC20} uses, unless this function is
     * 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 9;
    }

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

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

    /**
     * @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)
        external
        virtual
        override
        returns (bool)
    {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @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)
        external
        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
    ) external virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        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)
        external
        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 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)
        external
        virtual
        returns (bool)
    {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /** @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");

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

    /**
     * @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");

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

    /**
     * @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);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    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 _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");

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

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
 contract AxiomAI is ERC20, Ownable {
    // TOKENOMICS START ==========================================================>
    string private _name = "AxiomAI";
    string private _symbol = "AXIOM";
    uint8 private _decimals = 9;
    uint256 private _supply = 1000000000;
    uint256 public taxForLiquidity = 45; //sniper protection, gradually lowered to 1% after launch
    uint256 public taxForMarketing = 50; //sniper protection, gradually lowered to 4% after launch
    uint256 public maxTxAmount = 15000001 * 10**_decimals;
    uint256 public maxWalletAmount = 15000001 * 10**_decimals;
    address public marketingWallet = 0x92eC41f7E97a17c474aD57aFd9A3d60f70C615F7;
    address public DEAD = 0x000000000000000000000000000000000000dEaD;
    uint256 public _marketingReserves = 0;
    mapping(address => bool) public _isExcludedFromFee;
    uint256 public numTokensSellToAddToLiquidity = 200000 * 10**_decimals;
    uint256 public numTokensSellToAddToETH = 800000 * 10**_decimals;

    function LaunchPhaseI() external onlyOwner {
        require(taxForMarketing > 49, "Can only be used once after launch for reducing taxes");
        taxForLiquidity = 2;
        taxForMarketing = 48;
        maxTxAmount = 15000001 * 10**_decimals;
        maxWalletAmount = 15000001 * 10**_decimals;
    }
	
	    function LaunchPhaseII() external onlyOwner {
        require(taxForMarketing > 45, "Can only be used once after launch for reducing taxes");
        taxForLiquidity = 2;
        taxForMarketing = 23;
        maxTxAmount = 15000001 * 10**_decimals;
        maxWalletAmount = 15000001 * 10**_decimals;
    }
	
	    function LaunchPhaseFinal() external onlyOwner {
        require(taxForMarketing > 20, "Can only be used once after launch for reducing taxes");
        taxForLiquidity = 1;
        taxForMarketing = 4;
        maxTxAmount = 20000001 * 10**_decimals;
        maxWalletAmount = 20000001 * 10**_decimals;
    }
	
	
    // TOKENOMICS END ============================================================>

    // Backend Access START ==============================================>
    struct userUnlock {
        string tgUserName;
        bool unlocked;
        uint256 unlockedAt;
        uint256 totalEthPaid;
    }

    struct channelUnlock {
        string tgChannel;
        bool unlocked;
        uint256 unlockedAt;
        uint256 totalEthPaid;
    }

    mapping(string => userUnlock) public unlockedUsers;
    mapping(string => channelUnlock) public unlockedChannels;

    uint public userCostEth = 0.01 ether;
    uint public userCostTokens = 10000 * 10**_decimals;

    uint public channelCostEth = 0.1 ether;
    uint public channelCostTokens = 100000 * 10**_decimals;

    event UserUnlocked(string tg_username, uint256 unlockTime);
    event ChannelUnlocked(string tg_channel, uint256 unlockTime);
    event CostUpdated(bool _isEth, bool _isChannel, uint _cost);
    event ExcludedFromFeeUpdated(address _address, bool _status);
    event AdminModifierSet(string tg_user_chan, bool _isChannel, bool _isUnlocked, 
        uint _unlockBlock, uint _amtPaid);
    event PairUpdated(address _address);

    // Unlock bot access through contract
    function unlockUser(string memory tg_username) external payable {
        require(msg.value >= userCostEth, "Not enough ETH sent!");
        require(msg.sender.balance >= userCostTokens, "Not enough tokens!");
        _marketingReserves += msg.value;
        _transfer(msg.sender, DEAD, userCostTokens);

        unlockedUsers[tg_username] = userUnlock(
            tg_username,
            true,
            block.timestamp,
            unlockedUsers[tg_username].totalEthPaid + msg.value
        );
        emit UserUnlocked(tg_username, block.timestamp);
    }

    function unlockChannel(string memory tg_channel) external payable {
        require(msg.value >= userCostEth, "Not enough ETH sent!");
        require(msg.sender.balance >= userCostTokens, "Not enough tokens!");
        _marketingReserves += msg.value;
        _transfer(msg.sender, DEAD, userCostTokens);
        
        unlockedChannels[tg_channel] = channelUnlock(
            tg_channel,
            true,
            block.timestamp,
            unlockedChannels[tg_channel].totalEthPaid + msg.value
        );
        emit ChannelUnlocked(tg_channel, block.timestamp);
    }

    //ABIv1 getters
    function isUnlocked(string memory tg_user_chan, bool _isChannel) external view returns(bool) {
        if (_isChannel) {
            return unlockedChannels[tg_user_chan].unlocked;
        }
        return unlockedUsers[tg_user_chan].unlocked;
    }

    function getAmtPaid(string memory tg_user_chan, bool _isChannel) external view returns(uint) {
        if (_isChannel) {
            return unlockedChannels[tg_user_chan].totalEthPaid;
        }
        return unlockedUsers[tg_user_chan].totalEthPaid;
    }

    function getUnlockBlock(string memory tg_user_chan, bool _isChannel) external view returns(uint) {
        if (_isChannel) {
            return unlockedChannels[tg_user_chan].unlockedAt;
        }
        return unlockedUsers[tg_user_chan].unlockedAt;
    }

    //Admin modifier function
    function setUnlockStatus(string memory tg_user_chan, bool _isChannel, 
        bool _isUnlocked, uint _unlockBlock, uint _amtPaid) external onlyOwner {
        if (_isChannel) {
            unlockedChannels[tg_user_chan] = channelUnlock(
                tg_user_chan,
                _isUnlocked,
                _unlockBlock,
                _amtPaid
            );
        } else {
            unlockedUsers[tg_user_chan] = userUnlock(
                tg_user_chan,
                _isUnlocked,
                _unlockBlock,
                _amtPaid
            );
        }
        emit AdminModifierSet(tg_user_chan, _isChannel, _isUnlocked, _unlockBlock, _amtPaid);
    }

    function setCost(bool _isEth, bool _isChannel, uint _cost) external onlyOwner {
        if (_isEth) {
            if (_isChannel) {
                channelCostEth = _cost;
            } else {
                userCostEth = _cost;
            }
        } else {
            if (_isChannel) {
                channelCostTokens = _cost * 10**_decimals;
            } else {
                userCostTokens = _cost * 10**_decimals;
            }
        }
        emit CostUpdated(_isEth, _isChannel, _cost);
    }
    // Backend Access END ================================================>

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public uniswapV2Pair;
    
    bool inSwapAndLiquify;

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );

    modifier lockTheSwap() {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor() ERC20(_name, _symbol) {
        _mint(msg.sender, (_supply * 10**_decimals));

        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); //eth mainnet
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;

        _isExcludedFromFee[address(uniswapV2Router)] = true;
        _isExcludedFromFee[msg.sender] = true;
        _isExcludedFromFee[marketingWallet] = true;
    }

    function updatePair(address _pair) external onlyOwner {
        require(_pair != DEAD, "LP Pair cannot be the Dead wallet, or 0!");
        require(_pair != address(0), "LP Pair cannot be the Dead wallet, or 0!");
        uniswapV2Pair = _pair;
        emit PairUpdated(_pair);
    }

    /**
     * @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 override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(balanceOf(from) >= amount, "ERC20: transfer amount exceeds balance");

        if ((from == uniswapV2Pair || to == uniswapV2Pair) && !inSwapAndLiquify) {
            if (from != uniswapV2Pair) {
                uint256 contractLiquidityBalance = balanceOf(address(this)) - _marketingReserves;
                if (contractLiquidityBalance >= numTokensSellToAddToLiquidity) {
                    _swapAndLiquify(numTokensSellToAddToLiquidity);
                }
                if ((_marketingReserves) >= numTokensSellToAddToETH) {
                    _swapTokensForEth(numTokensSellToAddToETH);
                    _marketingReserves -= numTokensSellToAddToETH;
                    bool sent = payable(marketingWallet).send(address(this).balance);
                    require(sent, "Failed to send ETH");
                }
            }

            uint256 transferAmount;
            if (_isExcludedFromFee[from] || _isExcludedFromFee[to]) {
                transferAmount = amount;
            } 
            else {
                require(amount <= maxTxAmount, "ERC20: transfer amount exceeds the max transaction amount");
                if(from == uniswapV2Pair){
                    require((amount + balanceOf(to)) <= maxWalletAmount, "ERC20: balance amount exceeded max wallet amount limit");
                }

                uint256 marketingShare = ((amount * taxForMarketing) / 100);
                uint256 liquidityShare = ((amount * taxForLiquidity) / 100);
                transferAmount = amount - (marketingShare + liquidityShare);
                _marketingReserves += marketingShare;

                super._transfer(from, address(this), (marketingShare + liquidityShare));
            }
            super._transfer(from, to, transferAmount);
        } 
        else {
            super._transfer(from, to, amount);
        }
    }

    function excludeFromFee(address _address, bool _status) external onlyOwner {
        _isExcludedFromFee[_address] = _status;
        emit ExcludedFromFeeUpdated(_address, _status);
    }

    function _swapAndLiquify(uint256 contractTokenBalance) private lockTheSwap {
        uint256 half = (contractTokenBalance / 2);
        uint256 otherHalf = (contractTokenBalance - half);

        uint256 initialBalance = address(this).balance;

        _swapTokensForEth(half);

        uint256 newBalance = (address(this).balance - initialBalance);

        _addLiquidity(otherHalf, newBalance);

        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

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

        _approve(address(this), address(uniswapV2Router), tokenAmount);

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

    function _addLiquidity(uint256 tokenAmount, uint256 ethAmount)
        private
        lockTheSwap
    {
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            marketingWallet,
            block.timestamp
        );
    }

    function changeMarketingWallet(address newWallet)
        public
        onlyOwner
        returns (bool)
    {
        require(newWallet != DEAD, "LP Pair cannot be the Dead wallet, or 0!");
        require(newWallet != address(0), "LP Pair cannot be the Dead wallet, or 0!");
        marketingWallet = newWallet;
        return true;
    }

    function changeTaxForLiquidityAndMarketing(uint256 _taxForLiquidity, uint256 _taxForMarketing)
        public
        onlyOwner
        returns (bool)
    {
        require((_taxForLiquidity+_taxForMarketing) <= 10, "ERC20: total tax must not be greater than 10%");
        taxForLiquidity = _taxForLiquidity;
        taxForMarketing = _taxForMarketing;

        return true;
    }

    function changeSwapThresholds(uint256 _numTokensSellToAddToLiquidity, uint256 _numTokensSellToAddToETH)
        public
        onlyOwner
        returns (bool)
    {
        require(_numTokensSellToAddToLiquidity < _supply / 98, "Cannot liquidate more than 2% of the supply at once!");
        require(_numTokensSellToAddToETH < _supply / 98, "Cannot liquidate more than 2% of the supply at once!");
        numTokensSellToAddToLiquidity = _numTokensSellToAddToLiquidity * 10**_decimals;
        numTokensSellToAddToETH = _numTokensSellToAddToETH * 10**_decimals;

        return true;
    }

    function changeMaxTxAmount(uint256 _maxTxAmount)
        public
        onlyOwner
        returns (bool)
    {
        require(_maxTxAmount > 10000000000000000, "Min 1%");
        maxTxAmount = _maxTxAmount;

        return true;
    }

    function changeMaxWalletAmount(uint256 _maxWalletAmount)
        public
        onlyOwner
        returns (bool)
    {
        require(_maxWalletAmount > 10000000000000000, "Min 1%");
        maxWalletAmount = _maxWalletAmount;

        return true;
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"tg_user_chan","type":"string"},{"indexed":false,"internalType":"bool","name":"_isChannel","type":"bool"},{"indexed":false,"internalType":"bool","name":"_isUnlocked","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_unlockBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_amtPaid","type":"uint256"}],"name":"AdminModifierSet","type":"event"},{"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":false,"internalType":"string","name":"tg_channel","type":"string"},{"indexed":false,"internalType":"uint256","name":"unlockTime","type":"uint256"}],"name":"ChannelUnlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_isEth","type":"bool"},{"indexed":false,"internalType":"bool","name":"_isChannel","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"CostUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"bool","name":"_status","type":"bool"}],"name":"ExcludedFromFeeUpdated","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":false,"internalType":"address","name":"_address","type":"address"}],"name":"PairUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"tg_username","type":"string"},{"indexed":false,"internalType":"uint256","name":"unlockTime","type":"uint256"}],"name":"UserUnlocked","type":"event"},{"inputs":[],"name":"DEAD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LaunchPhaseFinal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"LaunchPhaseI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"LaunchPhaseII","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_marketingReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"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":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"changeMarketingWallet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTxAmount","type":"uint256"}],"name":"changeMaxTxAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWalletAmount","type":"uint256"}],"name":"changeMaxWalletAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numTokensSellToAddToLiquidity","type":"uint256"},{"internalType":"uint256","name":"_numTokensSellToAddToETH","type":"uint256"}],"name":"changeSwapThresholds","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_taxForLiquidity","type":"uint256"},{"internalType":"uint256","name":"_taxForMarketing","type":"uint256"}],"name":"changeTaxForLiquidityAndMarketing","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"channelCostEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"channelCostTokens","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":"_address","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tg_user_chan","type":"string"},{"internalType":"bool","name":"_isChannel","type":"bool"}],"name":"getAmtPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"tg_user_chan","type":"string"},{"internalType":"bool","name":"_isChannel","type":"bool"}],"name":"getUnlockBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"string","name":"tg_user_chan","type":"string"},{"internalType":"bool","name":"_isChannel","type":"bool"}],"name":"isUnlocked","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":"maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","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":"numTokensSellToAddToETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokensSellToAddToLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isEth","type":"bool"},{"internalType":"bool","name":"_isChannel","type":"bool"},{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tg_user_chan","type":"string"},{"internalType":"bool","name":"_isChannel","type":"bool"},{"internalType":"bool","name":"_isUnlocked","type":"bool"},{"internalType":"uint256","name":"_unlockBlock","type":"uint256"},{"internalType":"uint256","name":"_amtPaid","type":"uint256"}],"name":"setUnlockStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxForMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","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":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"tg_channel","type":"string"}],"name":"unlockChannel","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"tg_username","type":"string"}],"name":"unlockUser","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"unlockedChannels","outputs":[{"internalType":"string","name":"tgChannel","type":"string"},{"internalType":"bool","name":"unlocked","type":"bool"},{"internalType":"uint256","name":"unlockedAt","type":"uint256"},{"internalType":"uint256","name":"totalEthPaid","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"unlockedUsers","outputs":[{"internalType":"string","name":"tgUserName","type":"string"},{"internalType":"bool","name":"unlocked","type":"bool"},{"internalType":"uint256","name":"unlockedAt","type":"uint256"},{"internalType":"uint256","name":"totalEthPaid","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_pair","type":"address"}],"name":"updatePair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"userCostEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"userCostTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e0604052600760a0908152664178696f6d414960c81b60c052600690620000289082620006d0565b506040805180820190915260058152644158494f4d60d81b6020820152600790620000549082620006d0565b506008805460ff19166009908117909155633b9aca008155602d600a9081556032600b55620000849190620008b1565b620000939062e4e1c1620008c9565b600c55600854620000a99060ff16600a620008b1565b620000b89062e4e1c1620008c9565b600d55600e80546001600160a01b03199081167392ec41f7e97a17c474ad57afd9a3d60f70c615f717909155600f805490911661dead1790556000601055600854620001099060ff16600a620008b1565b620001189062030d40620008c9565b6012556008546200012e9060ff16600a620008b1565b6200013d90620c3500620008c9565b601355662386f26fc100006016556008546200015e9060ff16600a620008b1565b6200016c90612710620008c9565b60175567016345785d8a00006018556008546200018e9060ff16600a620008b1565b6200019d90620186a0620008c9565b601955348015620001ad57600080fd5b5060068054620001bd9062000641565b80601f0160208091040260200160405190810160405280929190818152602001828054620001eb9062000641565b80156200023c5780601f1062000210576101008083540402835291602001916200023c565b820191906000526020600020905b8154815290600101906020018083116200021e57829003601f168201915b505050505060078054620002509062000641565b80601f01602080910402602001604051908101604052809291908181526020018280546200027e9062000641565b8015620002cf5780601f10620002a357610100808354040283529160200191620002cf565b820191906000526020600020905b815481529060010190602001808311620002b157829003601f168201915b50505050508160039081620002e59190620006d0565b506004620002f48282620006d0565b505050620003116200030b6200050f60201b60201c565b62000513565b600854620003409033906200032b9060ff16600a620008b1565b6009546200033a9190620008c9565b62000565565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d9050806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000398573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003be9190620008eb565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200040c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004329190620008eb565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000480573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004a69190620008eb565b601a80546001600160a01b0319166001600160a01b039283161790559081166080819052600090815260116020526040808220805460ff1990811660019081179092553384528284208054821683179055600e549094168352912080549092161790556200092c565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620005c05760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060026000828254620005d4919062000916565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200065657607f821691505b6020821081036200067757634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620006cb57600081815260208120601f850160051c81016020861015620006a65750805b601f850160051c820191505b81811015620006c757828155600101620006b2565b5050505b505050565b81516001600160401b03811115620006ec57620006ec6200062b565b6200070481620006fd845462000641565b846200067d565b602080601f8311600181146200073c5760008415620007235750858301515b600019600386901b1c1916600185901b178555620006c7565b600085815260208120601f198616915b828110156200076d578886015182559484019460019091019084016200074c565b50858210156200078c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620007f3578160001904821115620007d757620007d76200079c565b80851615620007e557918102915b93841c9390800290620007b7565b509250929050565b6000826200080c57506001620008ab565b816200081b57506000620008ab565b81600181146200083457600281146200083f576200085f565b6001915050620008ab565b60ff8411156200085357620008536200079c565b50506001821b620008ab565b5060208310610133831016604e8410600b841016171562000884575081810a620008ab565b620008908383620007b2565b8060001904821115620008a757620008a76200079c565b0290505b92915050565b6000620008c260ff841683620007fb565b9392505050565b6000816000190483118215151615620008e657620008e66200079c565b500290565b600060208284031215620008fe57600080fd5b81516001600160a01b0381168114620008c257600080fd5b80820180821115620008ab57620008ab6200079c565b608051612b236200096b6000396000818161039801528181611e0501528181611ebe01528181611efa0152818161208001526120e80152612b236000f3fe6080604052600436106102b25760003560e01c806375f0a87411610175578063ad16a0cf116100dc578063dd62ed3e11610095578063f1b2b3d91161006f578063f1b2b3d91461082b578063f2fde38b1461084b578063f345bd851461086b578063fbee93ba1461088157600080fd5b8063dd62ed3e146107d5578063df1d099e146107f5578063df8408fe1461080b57600080fd5b8063ad16a0cf14610733578063af8af69014610749578063b5c78e8a14610769578063bb85c6d114610789578063c0fdea57146107a9578063d12a7688146107bf57600080fd5b806395d89b411161012e57806395d89b4114610693578063a146d3f4146106a8578063a2330d97146106bd578063a457c2d7146106dd578063a9059cbb146106fd578063aa4bde281461071d57600080fd5b806375f0a874146105d9578063768dc710146105f95780637930ef691461062957806381bfdcca1461063f5780638c0b5e221461065f5780638da5cb5b1461067557600080fd5b8063313ce56711610219578063527ffabd116101d2578063527ffabd1461050857806363cdf60f1461051e578063677daa571461054e57806370a082311461056e578063715018a6146105a457806373c503b3146105b957600080fd5b8063313ce567146104625780633647430f1461047e57806339509351146104935780633b1d74af146104b357806349bd5a5e146104c85780634fa74c4d146104e857600080fd5b806316a7b1601161026b57806316a7b160146103ba57806318160ddd146103cd57806318bc47f6146103e25780631b56bbf91461040257806323b872dd1461042257806330b63d801461044257600080fd5b806303fd2a45146102be578063054dee0f146102fb57806306fdde031461031f578063095ea7b3146103415780630f1d7ad9146103715780631694505e1461038657600080fd5b366102b957005b600080fd5b3480156102ca57600080fd5b50600f546102de906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561030757600080fd5b5061031160165481565b6040519081526020016102f2565b34801561032b57600080fd5b50610334610897565b6040516102f291906121bd565b34801561034d57600080fd5b5061036161035c3660046121ec565b610929565b60405190151581526020016102f2565b61038461037f3660046122bb565b610943565b005b34801561039257600080fd5b506102de7f000000000000000000000000000000000000000000000000000000000000000081565b6103846103c83660046122bb565b610af5565b3480156103d957600080fd5b50600254610311565b3480156103ee57600080fd5b506103846103fd366004612308565b610c97565b34801561040e57600080fd5b5061038461041d366004612378565b610def565b34801561042e57600080fd5b5061036161043d366004612395565b610e99565b34801561044e57600080fd5b5061036161045d3660046123d6565b610ebd565b34801561046e57600080fd5b50604051600981526020016102f2565b34801561048a57600080fd5b50610384610f66565b34801561049f57600080fd5b506103616104ae3660046121ec565b610fe3565b3480156104bf57600080fd5b50610384611005565b3480156104d457600080fd5b50601a546102de906001600160a01b031681565b3480156104f457600080fd5b506103616105033660046123f8565b61107b565b34801561051457600080fd5b50610311600b5481565b34801561052a57600080fd5b5061053e6105393660046122bb565b6110de565b6040516102f29493929190612446565b34801561055a57600080fd5b50610361610569366004612475565b61119f565b34801561057a57600080fd5b50610311610589366004612378565b6001600160a01b031660009081526020819052604090205490565b3480156105b057600080fd5b506103846111f6565b3480156105c557600080fd5b506103846105d436600461248e565b61120a565b3480156105e557600080fd5b50600e546102de906001600160a01b031681565b34801561060557600080fd5b50610361610614366004612378565b60116020526000908152604090205460ff1681565b34801561063557600080fd5b5061031160185481565b34801561064b57600080fd5b5061036161065a366004612475565b6112c3565b34801561066b57600080fd5b50610311600c5481565b34801561068157600080fd5b506005546001600160a01b03166102de565b34801561069f57600080fd5b50610334611315565b3480156106b457600080fd5b50610384611324565b3480156106c957600080fd5b5061053e6106d83660046122bb565b61136c565b3480156106e957600080fd5b506103616106f83660046121ec565b611392565b34801561070957600080fd5b506103616107183660046121ec565b61140d565b34801561072957600080fd5b50610311600d5481565b34801561073f57600080fd5b5061031160135481565b34801561075557600080fd5b506103616107643660046123d6565b61141b565b34801561077557600080fd5b506103116107843660046123f8565b6114a4565b34801561079557600080fd5b506103616107a4366004612378565b6114ff565b3480156107b557600080fd5b5061031160105481565b3480156107cb57600080fd5b5061031160125481565b3480156107e157600080fd5b506103116107f03660046124ca565b611582565b34801561080157600080fd5b5061031160195481565b34801561081757600080fd5b50610384610826366004612503565b6115ad565b34801561083757600080fd5b506103116108463660046123f8565b611618565b34801561085757600080fd5b50610384610866366004612378565b611673565b34801561087757600080fd5b50610311600a5481565b34801561088d57600080fd5b5061031160175481565b6060600380546108a69061252f565b80601f01602080910402602001604051908101604052809291908181526020018280546108d29061252f565b801561091f5780601f106108f45761010080835404028352916020019161091f565b820191906000526020600020905b81548152906001019060200180831161090257829003601f168201915b5050505050905090565b6000336109378185856116ec565b60019150505b92915050565b6016543410156109915760405162461bcd60e51b81526020600482015260146024820152734e6f7420656e6f756768204554482073656e742160601b60448201526064015b60405180910390fd5b601754333110156109d95760405162461bcd60e51b81526020600482015260126024820152714e6f7420656e6f75676820746f6b656e732160701b6044820152606401610988565b34601060008282546109eb919061257f565b9091555050600f54601754610a0d9133916001600160a01b0390911690611810565b604051806080016040528082815260200160011515815260200142815260200134601584604051610a3e9190612592565b908152602001604051809103902060030154610a5a919061257f565b815250601582604051610a6d9190612592565b90815260405190819003602001902081518190610a8a90826125fc565b50602082015160018201805460ff19169115159190911790556040808301516002830155606090920151600390910155517f8382dfeb92e23123a91d983e4f179a9fbe329ff91e14e11cd3c3b5252f11512290610aea90839042906126bc565b60405180910390a150565b601654341015610b3e5760405162461bcd60e51b81526020600482015260146024820152734e6f7420656e6f756768204554482073656e742160601b6044820152606401610988565b60175433311015610b865760405162461bcd60e51b81526020600482015260126024820152714e6f7420656e6f75676820746f6b656e732160701b6044820152606401610988565b3460106000828254610b98919061257f565b9091555050600f54601754610bba9133916001600160a01b0390911690611810565b604051806080016040528082815260200160011515815260200142815260200134601484604051610beb9190612592565b908152602001604051809103902060030154610c07919061257f565b815250601482604051610c1a9190612592565b90815260405190819003602001902081518190610c3790826125fc565b50602082015160018201805460ff19169115159190911790556040808301516002830155606090920151600390910155517f892c7b6af36dc1cd7c78d56ead1e536ddf81fe5688e6b3f631cdfadf7ad4c50890610aea90839042906126bc565b610c9f611bd4565b8315610d29576040518060800160405280868152602001841515815260200183815260200182815250601586604051610cd89190612592565b90815260405190819003602001902081518190610cf590826125fc565b50602082015160018201805460ff191691151591909117905560408201516002820155606090910151600390910155610da9565b6040518060800160405280868152602001841515815260200183815260200182815250601486604051610d5c9190612592565b90815260405190819003602001902081518190610d7990826125fc565b50602082015160018201805460ff1916911515919091179055604082015160028201556060909101516003909101555b7fc7da2a9b77928245e263afcf4e639fd44ae7d1970e45b7c6ff1a952442938caf8585858585604051610de09594939291906126de565b60405180910390a15050505050565b610df7611bd4565b600f546001600160a01b0390811690821603610e255760405162461bcd60e51b815260040161098890612715565b6001600160a01b038116610e4b5760405162461bcd60e51b815260040161098890612715565b601a80546001600160a01b0319166001600160a01b0383169081179091556040519081527f1d288f7aba265e8b154b112bbb631ceca5df5fe93a750b2fe042fd1cc826647f90602001610aea565b600033610ea7858285611c2e565b610eb2858585611810565b506001949350505050565b6000610ec7611bd4565b6062600954610ed6919061275d565b8310610ef45760405162461bcd60e51b81526004016109889061277f565b6062600954610f03919061275d565b8210610f215760405162461bcd60e51b81526004016109889061277f565b600854610f329060ff16600a6128b7565b610f3c90846128c6565b601255600854610f509060ff16600a6128b7565b610f5a90836128c6565b60135550600192915050565b610f6e611bd4565b6014600b5411610f905760405162461bcd60e51b8152600401610988906128e5565b6001600a9081556004600b55600854610fae9160ff909116906128b7565b610fbc906301312d016128c6565b600c55600854610fd09060ff16600a6128b7565b610fde906301312d016128c6565b600d55565b600033610937818585610ff68383611582565b611000919061257f565b6116ec565b61100d611bd4565b6031600b541161102f5760405162461bcd60e51b8152600401610988906128e5565b6002600a9081556030600b5560085461104d9160ff909116906128b7565b61105a9062e4e1c16128c6565b600c5560085461106e9060ff16600a6128b7565b610fde9062e4e1c16128c6565b600081156110b0576015836040516110939190612592565b9081526040519081900360200190206001015460ff16905061093d565b6014836040516110c09190612592565b9081526040519081900360200190206001015460ff16905092915050565b80516020818301810180516014825292820191909301209152805481906111049061252f565b80601f01602080910402602001604051908101604052809291908181526020018280546111309061252f565b801561117d5780601f106111525761010080835404028352916020019161117d565b820191906000526020600020905b81548152906001019060200180831161116057829003601f168201915b5050505060018301546002840154600390940154929360ff9091169290915084565b60006111a9611bd4565b662386f26fc1000082116111e85760405162461bcd60e51b81526020600482015260066024820152654d696e20312560d01b6044820152606401610988565b50600c81905560015b919050565b6111fe611bd4565b6112086000611ca2565b565b611212611bd4565b821561123257811561122857601881905561127a565b601681905561127a565b811561125b576008546112499060ff16600a6128b7565b61125390826128c6565b60195561127a565b60085461126c9060ff16600a6128b7565b61127690826128c6565b6017555b60408051841515815283151560208201529081018290527fb87a29e1f0734b57d95308af5a136440c194441ac49edd417a1ed26aa78ceda29060600160405180910390a1505050565b60006112cd611bd4565b662386f26fc10000821161130c5760405162461bcd60e51b81526020600482015260066024820152654d696e20312560d01b6044820152606401610988565b50600d55600190565b6060600480546108a69061252f565b61132c611bd4565b602d600b541161134e5760405162461bcd60e51b8152600401610988906128e5565b6002600a9081556017600b5560085461104d9160ff909116906128b7565b80516020818301810180516015825292820191909301209152805481906111049061252f565b600033816113a08286611582565b9050838110156114005760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610988565b610eb282868684036116ec565b600033610937818585611810565b6000611425611bd4565b600a611431838561257f565b11156114955760405162461bcd60e51b815260206004820152602d60248201527f45524332303a20746f74616c20746178206d757374206e6f742062652067726560448201526c61746572207468616e2031302560981b6064820152608401610988565b50600a91909155600b55600190565b600081156114d5576015836040516114bc9190612592565b908152602001604051809103902060030154905061093d565b6014836040516114e59190612592565b908152602001604051809103902060030154905092915050565b6000611509611bd4565b600f546001600160a01b03908116908316036115375760405162461bcd60e51b815260040161098890612715565b6001600160a01b03821661155d5760405162461bcd60e51b815260040161098890612715565b50600e80546001600160a01b0383166001600160a01b03199091161790556001919050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6115b5611bd4565b6001600160a01b038216600081815260116020908152604091829020805460ff19168515159081179091558251938452908301527f318c131114339c004fff0a22fcdbbc0566bb2a7cd3aa1660e636ec5a66784ff2910160405180910390a15050565b60008115611649576015836040516116309190612592565b908152602001604051809103902060020154905061093d565b6014836040516116599190612592565b908152602001604051809103902060020154905092915050565b61167b611bd4565b6001600160a01b0381166116e05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610988565b6116e981611ca2565b50565b6001600160a01b03831661174e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610988565b6001600160a01b0382166117af5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610988565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166118365760405162461bcd60e51b81526004016109889061293a565b6001600160a01b03821661185c5760405162461bcd60e51b81526004016109889061297f565b8061187c846001600160a01b031660009081526020819052604090205490565b101561189a5760405162461bcd60e51b8152600401610988906129c2565b601a546001600160a01b03848116911614806118c35750601a546001600160a01b038381169116145b80156118d95750601a54600160a01b900460ff16155b15611bc457601a546001600160a01b038481169116146119c65760105430600090815260208190526040812054909161191191612a08565b9050601254811061192757611927601254611cf4565b601354601054106119c45761193d601354611d9b565b601354601060008282546119519190612a08565b9091555050600e546040516000916001600160a01b0316904780156108fc029184818181858888f193505050509050806119c25760405162461bcd60e51b815260206004820152601260248201527108cc2d2d8cac840e8de40e6cadcc8408aa8960731b6044820152606401610988565b505b505b6001600160a01b03831660009081526011602052604081205460ff1680611a0557506001600160a01b03831660009081526011602052604090205460ff165b15611a11575080611bb3565b600c54821115611a895760405162461bcd60e51b815260206004820152603960248201527f45524332303a207472616e7366657220616d6f756e742065786365656473207460448201527f6865206d6178207472616e73616374696f6e20616d6f756e74000000000000006064820152608401610988565b601a546001600160a01b0390811690851603611b3257600d546001600160a01b038416600090815260208190526040902054611ac5908461257f565b1115611b325760405162461bcd60e51b815260206004820152603660248201527f45524332303a2062616c616e636520616d6f756e74206578636565646564206d604482015275185e081dd85b1b195d08185b5bdd5b9d081b1a5b5a5d60521b6064820152608401610988565b60006064600b5484611b4491906128c6565b611b4e919061275d565b905060006064600a5485611b6291906128c6565b611b6c919061275d565b9050611b78818361257f565b611b829085612a08565b92508160106000828254611b96919061257f565b90915550611bb090508630611bab848661257f565b611f7b565b50505b611bbe848483611f7b565b50505050565b611bcf838383611f7b565b505050565b6005546001600160a01b031633146112085760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610988565b6000611c3a8484611582565b90506000198114611bbe5781811015611c955760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610988565b611bbe84848484036116ec565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b601a805460ff60a01b1916600160a01b1790556000611d1460028361275d565b90506000611d228284612a08565b905047611d2e83611d9b565b6000611d3a8247612a08565b9050611d468382612067565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050601a805460ff60a01b19169055505050565b601a805460ff60a01b1916600160a01b1790556040805160028082526060820183526000926020830190803683370190505090503081600081518110611de357611de3612a1b565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e859190612a31565b81600181518110611e9857611e98612a1b565b60200260200101906001600160a01b031690816001600160a01b031681525050611ee3307f0000000000000000000000000000000000000000000000000000000000000000846116ec565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac94790611f38908590600090869030904290600401612a4e565b600060405180830381600087803b158015611f5257600080fd5b505af1158015611f66573d6000803e3d6000fd5b5050601a805460ff60a01b1916905550505050565b6001600160a01b038316611fa15760405162461bcd60e51b81526004016109889061293a565b6001600160a01b038216611fc75760405162461bcd60e51b81526004016109889061297f565b6001600160a01b038316600090815260208190526040902054818110156120005760405162461bcd60e51b8152600401610988906129c2565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350505050565b601a805460ff60a01b1916600160a01b1790556120a5307f0000000000000000000000000000000000000000000000000000000000000000846116ec565b600e5460405163f305d71960e01b81523060048201526024810184905260006044820181905260648201526001600160a01b0391821660848201524260a48201527f00000000000000000000000000000000000000000000000000000000000000009091169063f305d71990839060c40160606040518083038185885af1158015612134573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906121599190612abf565b5050601a805460ff60a01b19169055505050565b60005b83811015612188578181015183820152602001612170565b50506000910152565b600081518084526121a981602086016020860161216d565b601f01601f19169290920160200192915050565b6020815260006121d06020830184612191565b9392505050565b6001600160a01b03811681146116e957600080fd5b600080604083850312156121ff57600080fd5b823561220a816121d7565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261223f57600080fd5b813567ffffffffffffffff8082111561225a5761225a612218565b604051601f8301601f19908116603f0116810190828211818310171561228257612282612218565b8160405283815286602085880101111561229b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000602082840312156122cd57600080fd5b813567ffffffffffffffff8111156122e457600080fd5b6122f08482850161222e565b949350505050565b803580151581146111f157600080fd5b600080600080600060a0868803121561232057600080fd5b853567ffffffffffffffff81111561233757600080fd5b6123438882890161222e565b955050612352602087016122f8565b9350612360604087016122f8565b94979396509394606081013594506080013592915050565b60006020828403121561238a57600080fd5b81356121d0816121d7565b6000806000606084860312156123aa57600080fd5b83356123b5816121d7565b925060208401356123c5816121d7565b929592945050506040919091013590565b600080604083850312156123e957600080fd5b50508035926020909101359150565b6000806040838503121561240b57600080fd5b823567ffffffffffffffff81111561242257600080fd5b61242e8582860161222e565b92505061243d602084016122f8565b90509250929050565b6080815260006124596080830187612191565b9415156020830152506040810192909252606090910152919050565b60006020828403121561248757600080fd5b5035919050565b6000806000606084860312156124a357600080fd5b6124ac846122f8565b92506124ba602085016122f8565b9150604084013590509250925092565b600080604083850312156124dd57600080fd5b82356124e8816121d7565b915060208301356124f8816121d7565b809150509250929050565b6000806040838503121561251657600080fd5b8235612521816121d7565b915061243d602084016122f8565b600181811c9082168061254357607f821691505b60208210810361256357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561093d5761093d612569565b600082516125a481846020870161216d565b9190910192915050565b601f821115611bcf57600081815260208120601f850160051c810160208610156125d55750805b601f850160051c820191505b818110156125f4578281556001016125e1565b505050505050565b815167ffffffffffffffff81111561261657612616612218565b61262a81612624845461252f565b846125ae565b602080601f83116001811461265f57600084156126475750858301515b600019600386901b1c1916600185901b1785556125f4565b600085815260208120601f198616915b8281101561268e5788860151825594840194600190910190840161266f565b50858210156126ac5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6040815260006126cf6040830185612191565b90508260208301529392505050565b60a0815260006126f160a0830188612191565b95151560208301525092151560408401526060830191909152608090910152919050565b60208082526028908201527f4c5020506169722063616e6e6f742062652074686520446561642077616c6c65604082015267742c206f7220302160c01b606082015260800190565b60008261277a57634e487b7160e01b600052601260045260246000fd5b500490565b60208082526034908201527f43616e6e6f74206c6971756964617465206d6f7265207468616e203225206f666040820152732074686520737570706c79206174206f6e63652160601b606082015260800190565b600181815b8085111561280e5781600019048211156127f4576127f4612569565b8085161561280157918102915b93841c93908002906127d8565b509250929050565b6000826128255750600161093d565b816128325750600061093d565b816001811461284857600281146128525761286e565b600191505061093d565b60ff84111561286357612863612569565b50506001821b61093d565b5060208310610133831016604e8410600b8410161715612891575081810a61093d565b61289b83836127d3565b80600019048211156128af576128af612569565b029392505050565b60006121d060ff841683612816565b60008160001904831182151516156128e0576128e0612569565b500290565b60208082526035908201527f43616e206f6e6c792062652075736564206f6e6365206166746572206c61756e604082015274636820666f72207265647563696e6720746178657360581b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b8181038181111561093d5761093d612569565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612a4357600080fd5b81516121d0816121d7565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612a9e5784516001600160a01b031683529383019391830191600101612a79565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215612ad457600080fd5b835192506020840151915060408401519050925092509256fea264697066735822122087cc2bb161be46905fac4dea56ed77d7eb10514bda030dd4a0abec86db0ff43d64736f6c63430008100033

Deployed Bytecode

0x6080604052600436106102b25760003560e01c806375f0a87411610175578063ad16a0cf116100dc578063dd62ed3e11610095578063f1b2b3d91161006f578063f1b2b3d91461082b578063f2fde38b1461084b578063f345bd851461086b578063fbee93ba1461088157600080fd5b8063dd62ed3e146107d5578063df1d099e146107f5578063df8408fe1461080b57600080fd5b8063ad16a0cf14610733578063af8af69014610749578063b5c78e8a14610769578063bb85c6d114610789578063c0fdea57146107a9578063d12a7688146107bf57600080fd5b806395d89b411161012e57806395d89b4114610693578063a146d3f4146106a8578063a2330d97146106bd578063a457c2d7146106dd578063a9059cbb146106fd578063aa4bde281461071d57600080fd5b806375f0a874146105d9578063768dc710146105f95780637930ef691461062957806381bfdcca1461063f5780638c0b5e221461065f5780638da5cb5b1461067557600080fd5b8063313ce56711610219578063527ffabd116101d2578063527ffabd1461050857806363cdf60f1461051e578063677daa571461054e57806370a082311461056e578063715018a6146105a457806373c503b3146105b957600080fd5b8063313ce567146104625780633647430f1461047e57806339509351146104935780633b1d74af146104b357806349bd5a5e146104c85780634fa74c4d146104e857600080fd5b806316a7b1601161026b57806316a7b160146103ba57806318160ddd146103cd57806318bc47f6146103e25780631b56bbf91461040257806323b872dd1461042257806330b63d801461044257600080fd5b806303fd2a45146102be578063054dee0f146102fb57806306fdde031461031f578063095ea7b3146103415780630f1d7ad9146103715780631694505e1461038657600080fd5b366102b957005b600080fd5b3480156102ca57600080fd5b50600f546102de906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561030757600080fd5b5061031160165481565b6040519081526020016102f2565b34801561032b57600080fd5b50610334610897565b6040516102f291906121bd565b34801561034d57600080fd5b5061036161035c3660046121ec565b610929565b60405190151581526020016102f2565b61038461037f3660046122bb565b610943565b005b34801561039257600080fd5b506102de7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6103846103c83660046122bb565b610af5565b3480156103d957600080fd5b50600254610311565b3480156103ee57600080fd5b506103846103fd366004612308565b610c97565b34801561040e57600080fd5b5061038461041d366004612378565b610def565b34801561042e57600080fd5b5061036161043d366004612395565b610e99565b34801561044e57600080fd5b5061036161045d3660046123d6565b610ebd565b34801561046e57600080fd5b50604051600981526020016102f2565b34801561048a57600080fd5b50610384610f66565b34801561049f57600080fd5b506103616104ae3660046121ec565b610fe3565b3480156104bf57600080fd5b50610384611005565b3480156104d457600080fd5b50601a546102de906001600160a01b031681565b3480156104f457600080fd5b506103616105033660046123f8565b61107b565b34801561051457600080fd5b50610311600b5481565b34801561052a57600080fd5b5061053e6105393660046122bb565b6110de565b6040516102f29493929190612446565b34801561055a57600080fd5b50610361610569366004612475565b61119f565b34801561057a57600080fd5b50610311610589366004612378565b6001600160a01b031660009081526020819052604090205490565b3480156105b057600080fd5b506103846111f6565b3480156105c557600080fd5b506103846105d436600461248e565b61120a565b3480156105e557600080fd5b50600e546102de906001600160a01b031681565b34801561060557600080fd5b50610361610614366004612378565b60116020526000908152604090205460ff1681565b34801561063557600080fd5b5061031160185481565b34801561064b57600080fd5b5061036161065a366004612475565b6112c3565b34801561066b57600080fd5b50610311600c5481565b34801561068157600080fd5b506005546001600160a01b03166102de565b34801561069f57600080fd5b50610334611315565b3480156106b457600080fd5b50610384611324565b3480156106c957600080fd5b5061053e6106d83660046122bb565b61136c565b3480156106e957600080fd5b506103616106f83660046121ec565b611392565b34801561070957600080fd5b506103616107183660046121ec565b61140d565b34801561072957600080fd5b50610311600d5481565b34801561073f57600080fd5b5061031160135481565b34801561075557600080fd5b506103616107643660046123d6565b61141b565b34801561077557600080fd5b506103116107843660046123f8565b6114a4565b34801561079557600080fd5b506103616107a4366004612378565b6114ff565b3480156107b557600080fd5b5061031160105481565b3480156107cb57600080fd5b5061031160125481565b3480156107e157600080fd5b506103116107f03660046124ca565b611582565b34801561080157600080fd5b5061031160195481565b34801561081757600080fd5b50610384610826366004612503565b6115ad565b34801561083757600080fd5b506103116108463660046123f8565b611618565b34801561085757600080fd5b50610384610866366004612378565b611673565b34801561087757600080fd5b50610311600a5481565b34801561088d57600080fd5b5061031160175481565b6060600380546108a69061252f565b80601f01602080910402602001604051908101604052809291908181526020018280546108d29061252f565b801561091f5780601f106108f45761010080835404028352916020019161091f565b820191906000526020600020905b81548152906001019060200180831161090257829003601f168201915b5050505050905090565b6000336109378185856116ec565b60019150505b92915050565b6016543410156109915760405162461bcd60e51b81526020600482015260146024820152734e6f7420656e6f756768204554482073656e742160601b60448201526064015b60405180910390fd5b601754333110156109d95760405162461bcd60e51b81526020600482015260126024820152714e6f7420656e6f75676820746f6b656e732160701b6044820152606401610988565b34601060008282546109eb919061257f565b9091555050600f54601754610a0d9133916001600160a01b0390911690611810565b604051806080016040528082815260200160011515815260200142815260200134601584604051610a3e9190612592565b908152602001604051809103902060030154610a5a919061257f565b815250601582604051610a6d9190612592565b90815260405190819003602001902081518190610a8a90826125fc565b50602082015160018201805460ff19169115159190911790556040808301516002830155606090920151600390910155517f8382dfeb92e23123a91d983e4f179a9fbe329ff91e14e11cd3c3b5252f11512290610aea90839042906126bc565b60405180910390a150565b601654341015610b3e5760405162461bcd60e51b81526020600482015260146024820152734e6f7420656e6f756768204554482073656e742160601b6044820152606401610988565b60175433311015610b865760405162461bcd60e51b81526020600482015260126024820152714e6f7420656e6f75676820746f6b656e732160701b6044820152606401610988565b3460106000828254610b98919061257f565b9091555050600f54601754610bba9133916001600160a01b0390911690611810565b604051806080016040528082815260200160011515815260200142815260200134601484604051610beb9190612592565b908152602001604051809103902060030154610c07919061257f565b815250601482604051610c1a9190612592565b90815260405190819003602001902081518190610c3790826125fc565b50602082015160018201805460ff19169115159190911790556040808301516002830155606090920151600390910155517f892c7b6af36dc1cd7c78d56ead1e536ddf81fe5688e6b3f631cdfadf7ad4c50890610aea90839042906126bc565b610c9f611bd4565b8315610d29576040518060800160405280868152602001841515815260200183815260200182815250601586604051610cd89190612592565b90815260405190819003602001902081518190610cf590826125fc565b50602082015160018201805460ff191691151591909117905560408201516002820155606090910151600390910155610da9565b6040518060800160405280868152602001841515815260200183815260200182815250601486604051610d5c9190612592565b90815260405190819003602001902081518190610d7990826125fc565b50602082015160018201805460ff1916911515919091179055604082015160028201556060909101516003909101555b7fc7da2a9b77928245e263afcf4e639fd44ae7d1970e45b7c6ff1a952442938caf8585858585604051610de09594939291906126de565b60405180910390a15050505050565b610df7611bd4565b600f546001600160a01b0390811690821603610e255760405162461bcd60e51b815260040161098890612715565b6001600160a01b038116610e4b5760405162461bcd60e51b815260040161098890612715565b601a80546001600160a01b0319166001600160a01b0383169081179091556040519081527f1d288f7aba265e8b154b112bbb631ceca5df5fe93a750b2fe042fd1cc826647f90602001610aea565b600033610ea7858285611c2e565b610eb2858585611810565b506001949350505050565b6000610ec7611bd4565b6062600954610ed6919061275d565b8310610ef45760405162461bcd60e51b81526004016109889061277f565b6062600954610f03919061275d565b8210610f215760405162461bcd60e51b81526004016109889061277f565b600854610f329060ff16600a6128b7565b610f3c90846128c6565b601255600854610f509060ff16600a6128b7565b610f5a90836128c6565b60135550600192915050565b610f6e611bd4565b6014600b5411610f905760405162461bcd60e51b8152600401610988906128e5565b6001600a9081556004600b55600854610fae9160ff909116906128b7565b610fbc906301312d016128c6565b600c55600854610fd09060ff16600a6128b7565b610fde906301312d016128c6565b600d55565b600033610937818585610ff68383611582565b611000919061257f565b6116ec565b61100d611bd4565b6031600b541161102f5760405162461bcd60e51b8152600401610988906128e5565b6002600a9081556030600b5560085461104d9160ff909116906128b7565b61105a9062e4e1c16128c6565b600c5560085461106e9060ff16600a6128b7565b610fde9062e4e1c16128c6565b600081156110b0576015836040516110939190612592565b9081526040519081900360200190206001015460ff16905061093d565b6014836040516110c09190612592565b9081526040519081900360200190206001015460ff16905092915050565b80516020818301810180516014825292820191909301209152805481906111049061252f565b80601f01602080910402602001604051908101604052809291908181526020018280546111309061252f565b801561117d5780601f106111525761010080835404028352916020019161117d565b820191906000526020600020905b81548152906001019060200180831161116057829003601f168201915b5050505060018301546002840154600390940154929360ff9091169290915084565b60006111a9611bd4565b662386f26fc1000082116111e85760405162461bcd60e51b81526020600482015260066024820152654d696e20312560d01b6044820152606401610988565b50600c81905560015b919050565b6111fe611bd4565b6112086000611ca2565b565b611212611bd4565b821561123257811561122857601881905561127a565b601681905561127a565b811561125b576008546112499060ff16600a6128b7565b61125390826128c6565b60195561127a565b60085461126c9060ff16600a6128b7565b61127690826128c6565b6017555b60408051841515815283151560208201529081018290527fb87a29e1f0734b57d95308af5a136440c194441ac49edd417a1ed26aa78ceda29060600160405180910390a1505050565b60006112cd611bd4565b662386f26fc10000821161130c5760405162461bcd60e51b81526020600482015260066024820152654d696e20312560d01b6044820152606401610988565b50600d55600190565b6060600480546108a69061252f565b61132c611bd4565b602d600b541161134e5760405162461bcd60e51b8152600401610988906128e5565b6002600a9081556017600b5560085461104d9160ff909116906128b7565b80516020818301810180516015825292820191909301209152805481906111049061252f565b600033816113a08286611582565b9050838110156114005760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610988565b610eb282868684036116ec565b600033610937818585611810565b6000611425611bd4565b600a611431838561257f565b11156114955760405162461bcd60e51b815260206004820152602d60248201527f45524332303a20746f74616c20746178206d757374206e6f742062652067726560448201526c61746572207468616e2031302560981b6064820152608401610988565b50600a91909155600b55600190565b600081156114d5576015836040516114bc9190612592565b908152602001604051809103902060030154905061093d565b6014836040516114e59190612592565b908152602001604051809103902060030154905092915050565b6000611509611bd4565b600f546001600160a01b03908116908316036115375760405162461bcd60e51b815260040161098890612715565b6001600160a01b03821661155d5760405162461bcd60e51b815260040161098890612715565b50600e80546001600160a01b0383166001600160a01b03199091161790556001919050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6115b5611bd4565b6001600160a01b038216600081815260116020908152604091829020805460ff19168515159081179091558251938452908301527f318c131114339c004fff0a22fcdbbc0566bb2a7cd3aa1660e636ec5a66784ff2910160405180910390a15050565b60008115611649576015836040516116309190612592565b908152602001604051809103902060020154905061093d565b6014836040516116599190612592565b908152602001604051809103902060020154905092915050565b61167b611bd4565b6001600160a01b0381166116e05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610988565b6116e981611ca2565b50565b6001600160a01b03831661174e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610988565b6001600160a01b0382166117af5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610988565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166118365760405162461bcd60e51b81526004016109889061293a565b6001600160a01b03821661185c5760405162461bcd60e51b81526004016109889061297f565b8061187c846001600160a01b031660009081526020819052604090205490565b101561189a5760405162461bcd60e51b8152600401610988906129c2565b601a546001600160a01b03848116911614806118c35750601a546001600160a01b038381169116145b80156118d95750601a54600160a01b900460ff16155b15611bc457601a546001600160a01b038481169116146119c65760105430600090815260208190526040812054909161191191612a08565b9050601254811061192757611927601254611cf4565b601354601054106119c45761193d601354611d9b565b601354601060008282546119519190612a08565b9091555050600e546040516000916001600160a01b0316904780156108fc029184818181858888f193505050509050806119c25760405162461bcd60e51b815260206004820152601260248201527108cc2d2d8cac840e8de40e6cadcc8408aa8960731b6044820152606401610988565b505b505b6001600160a01b03831660009081526011602052604081205460ff1680611a0557506001600160a01b03831660009081526011602052604090205460ff165b15611a11575080611bb3565b600c54821115611a895760405162461bcd60e51b815260206004820152603960248201527f45524332303a207472616e7366657220616d6f756e742065786365656473207460448201527f6865206d6178207472616e73616374696f6e20616d6f756e74000000000000006064820152608401610988565b601a546001600160a01b0390811690851603611b3257600d546001600160a01b038416600090815260208190526040902054611ac5908461257f565b1115611b325760405162461bcd60e51b815260206004820152603660248201527f45524332303a2062616c616e636520616d6f756e74206578636565646564206d604482015275185e081dd85b1b195d08185b5bdd5b9d081b1a5b5a5d60521b6064820152608401610988565b60006064600b5484611b4491906128c6565b611b4e919061275d565b905060006064600a5485611b6291906128c6565b611b6c919061275d565b9050611b78818361257f565b611b829085612a08565b92508160106000828254611b96919061257f565b90915550611bb090508630611bab848661257f565b611f7b565b50505b611bbe848483611f7b565b50505050565b611bcf838383611f7b565b505050565b6005546001600160a01b031633146112085760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610988565b6000611c3a8484611582565b90506000198114611bbe5781811015611c955760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610988565b611bbe84848484036116ec565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b601a805460ff60a01b1916600160a01b1790556000611d1460028361275d565b90506000611d228284612a08565b905047611d2e83611d9b565b6000611d3a8247612a08565b9050611d468382612067565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050601a805460ff60a01b19169055505050565b601a805460ff60a01b1916600160a01b1790556040805160028082526060820183526000926020830190803683370190505090503081600081518110611de357611de3612a1b565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e859190612a31565b81600181518110611e9857611e98612a1b565b60200260200101906001600160a01b031690816001600160a01b031681525050611ee3307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846116ec565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac94790611f38908590600090869030904290600401612a4e565b600060405180830381600087803b158015611f5257600080fd5b505af1158015611f66573d6000803e3d6000fd5b5050601a805460ff60a01b1916905550505050565b6001600160a01b038316611fa15760405162461bcd60e51b81526004016109889061293a565b6001600160a01b038216611fc75760405162461bcd60e51b81526004016109889061297f565b6001600160a01b038316600090815260208190526040902054818110156120005760405162461bcd60e51b8152600401610988906129c2565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350505050565b601a805460ff60a01b1916600160a01b1790556120a5307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846116ec565b600e5460405163f305d71960e01b81523060048201526024810184905260006044820181905260648201526001600160a01b0391821660848201524260a48201527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063f305d71990839060c40160606040518083038185885af1158015612134573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906121599190612abf565b5050601a805460ff60a01b19169055505050565b60005b83811015612188578181015183820152602001612170565b50506000910152565b600081518084526121a981602086016020860161216d565b601f01601f19169290920160200192915050565b6020815260006121d06020830184612191565b9392505050565b6001600160a01b03811681146116e957600080fd5b600080604083850312156121ff57600080fd5b823561220a816121d7565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261223f57600080fd5b813567ffffffffffffffff8082111561225a5761225a612218565b604051601f8301601f19908116603f0116810190828211818310171561228257612282612218565b8160405283815286602085880101111561229b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000602082840312156122cd57600080fd5b813567ffffffffffffffff8111156122e457600080fd5b6122f08482850161222e565b949350505050565b803580151581146111f157600080fd5b600080600080600060a0868803121561232057600080fd5b853567ffffffffffffffff81111561233757600080fd5b6123438882890161222e565b955050612352602087016122f8565b9350612360604087016122f8565b94979396509394606081013594506080013592915050565b60006020828403121561238a57600080fd5b81356121d0816121d7565b6000806000606084860312156123aa57600080fd5b83356123b5816121d7565b925060208401356123c5816121d7565b929592945050506040919091013590565b600080604083850312156123e957600080fd5b50508035926020909101359150565b6000806040838503121561240b57600080fd5b823567ffffffffffffffff81111561242257600080fd5b61242e8582860161222e565b92505061243d602084016122f8565b90509250929050565b6080815260006124596080830187612191565b9415156020830152506040810192909252606090910152919050565b60006020828403121561248757600080fd5b5035919050565b6000806000606084860312156124a357600080fd5b6124ac846122f8565b92506124ba602085016122f8565b9150604084013590509250925092565b600080604083850312156124dd57600080fd5b82356124e8816121d7565b915060208301356124f8816121d7565b809150509250929050565b6000806040838503121561251657600080fd5b8235612521816121d7565b915061243d602084016122f8565b600181811c9082168061254357607f821691505b60208210810361256357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561093d5761093d612569565b600082516125a481846020870161216d565b9190910192915050565b601f821115611bcf57600081815260208120601f850160051c810160208610156125d55750805b601f850160051c820191505b818110156125f4578281556001016125e1565b505050505050565b815167ffffffffffffffff81111561261657612616612218565b61262a81612624845461252f565b846125ae565b602080601f83116001811461265f57600084156126475750858301515b600019600386901b1c1916600185901b1785556125f4565b600085815260208120601f198616915b8281101561268e5788860151825594840194600190910190840161266f565b50858210156126ac5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6040815260006126cf6040830185612191565b90508260208301529392505050565b60a0815260006126f160a0830188612191565b95151560208301525092151560408401526060830191909152608090910152919050565b60208082526028908201527f4c5020506169722063616e6e6f742062652074686520446561642077616c6c65604082015267742c206f7220302160c01b606082015260800190565b60008261277a57634e487b7160e01b600052601260045260246000fd5b500490565b60208082526034908201527f43616e6e6f74206c6971756964617465206d6f7265207468616e203225206f666040820152732074686520737570706c79206174206f6e63652160601b606082015260800190565b600181815b8085111561280e5781600019048211156127f4576127f4612569565b8085161561280157918102915b93841c93908002906127d8565b509250929050565b6000826128255750600161093d565b816128325750600061093d565b816001811461284857600281146128525761286e565b600191505061093d565b60ff84111561286357612863612569565b50506001821b61093d565b5060208310610133831016604e8410600b8410161715612891575081810a61093d565b61289b83836127d3565b80600019048211156128af576128af612569565b029392505050565b60006121d060ff841683612816565b60008160001904831182151516156128e0576128e0612569565b500290565b60208082526035908201527f43616e206f6e6c792062652075736564206f6e6365206166746572206c61756e604082015274636820666f72207265647563696e6720746178657360581b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b8181038181111561093d5761093d612569565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612a4357600080fd5b81516121d0816121d7565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612a9e5784516001600160a01b031683529383019391830191600101612a79565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215612ad457600080fd5b835192506020840151915060408401519050925092509256fea264697066735822122087cc2bb161be46905fac4dea56ed77d7eb10514bda030dd4a0abec86db0ff43d64736f6c63430008100033

Deployed Bytecode Sourcemap

28643:14294:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29331:64;;;;;;;;;;-1:-1:-1;29331:64:0;;;;-1:-1:-1;;;;;29331:64:0;;;;;;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;29331:64:0;;;;;;;;31200:36;;;;;;;;;;;;;;;;;;;368:25:1;;;356:2;341:18;31200:36:0;222:177:1;18361:102:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;20635:244::-;;;;;;;;;;-1:-1:-1;20635:244:0;;;;;:::i;:::-;;:::i;:::-;;;1781:14:1;;1774:22;1756:41;;1744:2;1729:18;20635:244:0;1616:187:1;32475:594:0;;;;;;:::i;:::-;;:::i;:::-;;35242:51;;;;;;;;;;;;;;;31891:576;;;;;;:::i;:::-;;:::i;19499:110::-;;;;;;;;;;-1:-1:-1;19589:12:0;;19499:110;;33931:694;;;;;;;;;;-1:-1:-1;33931:694:0;;;;;:::i;:::-;;:::i;36507:288::-;;;;;;;;;;-1:-1:-1;36507:288:0;;;;;:::i;:::-;;:::i;21459:297::-;;;;;;;;;;-1:-1:-1;21459:297:0;;;;;:::i;:::-;;:::i;41771:602::-;;;;;;;;;;-1:-1:-1;41771:602:0;;;;;:::i;:::-;;:::i;19342:92::-;;;;;;;;;;-1:-1:-1;19342:92:0;;19425:1;5099:36:1;;5087:2;5072:18;19342:92:0;4957:184:1;30294:314:0;;;;;;;;;;;;;:::i;23175:272::-;;;;;;;;;;-1:-1:-1;23175:272:0;;;;;:::i;:::-;;:::i;29651:311::-;;;;;;;;;;;;;:::i;35300:28::-;;;;;;;;;;-1:-1:-1;35300:28:0;;;;-1:-1:-1;;;;;35300:28:0;;;33098:254;;;;;;;;;;-1:-1:-1;33098:254:0;;;;;:::i;:::-;;:::i;29025:35::-;;;;;;;;;;;;;;;;31078:50;;;;;;;;;;-1:-1:-1;31078:50:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;42381:244::-;;;;;;;;;;-1:-1:-1;42381:244:0;;;;;:::i;:::-;;:::i;18526:177::-;;;;;;;;;;-1:-1:-1;18526:177:0;;;;;:::i;:::-;-1:-1:-1;;;;;18677:18:0;18645:7;18677:18;;;;;;;;;;;;18526:177;15620:103;;;;;;;;;;;;;:::i;34633:524::-;;;;;;;;;;-1:-1:-1;34633:524:0;;;;;:::i;:::-;;:::i;29249:75::-;;;;;;;;;;-1:-1:-1;29249:75:0;;;;-1:-1:-1;;;;;29249:75:0;;;29446:50;;;;;;;;;;-1:-1:-1;29446:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;31302:38;;;;;;;;;;;;;;;;42633:264;;;;;;;;;;-1:-1:-1;42633:264:0;;;;;:::i;:::-;;:::i;29125:53::-;;;;;;;;;;;;;;;;14972:87;;;;;;;;;;-1:-1:-1;15045:6:0;;-1:-1:-1;;;;;15045:6:0;14972:87;;18185:106;;;;;;;;;;;;;:::i;29972:312::-;;;;;;;;;;;;;:::i;31135:56::-;;;;;;;;;;-1:-1:-1;31135:56:0;;;;;:::i;:::-;;:::i;22259:507::-;;;;;;;;;;-1:-1:-1;22259:507:0;;;;;:::i;:::-;;:::i;20079:236::-;;;;;;;;;;-1:-1:-1;20079:236:0;;;;;:::i;:::-;;:::i;29185:57::-;;;;;;;;;;;;;;;;29579:63;;;;;;;;;;;;;;;;41372:391;;;;;;;;;;-1:-1:-1;41372:391:0;;;;;:::i;:::-;;:::i;33360:262::-;;;;;;;;;;-1:-1:-1;33360:262:0;;;;;:::i;:::-;;:::i;41014:350::-;;;;;;;;;;-1:-1:-1;41014:350:0;;;;;:::i;:::-;;:::i;29402:37::-;;;;;;;;;;;;;;;;29503:69;;;;;;;;;;;;;;;;19672:201;;;;;;;;;;-1:-1:-1;19672:201:0;;;;;:::i;:::-;;:::i;31347:54::-;;;;;;;;;;;;;;;;39425:189;;;;;;;;;;-1:-1:-1;39425:189:0;;;;;:::i;:::-;;:::i;33630:262::-;;;;;;;;;;-1:-1:-1;33630:262:0;;;;;:::i;:::-;;:::i;15878:238::-;;;;;;;;;;-1:-1:-1;15878:238:0;;;;;:::i;:::-;;:::i;28925:35::-;;;;;;;;;;;;;;;;31243:50;;;;;;;;;;;;;;;;18361:102;18417:13;18450:5;18443:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18361:102;:::o;20635:244::-;20756:4;13845:10;20817:32;13845:10;20833:7;20842:6;20817:8;:32::i;:::-;20867:4;20860:11;;;20635:244;;;;;:::o;32475:594::-;32573:11;;32560:9;:24;;32552:57;;;;-1:-1:-1;;;32552:57:0;;7797:2:1;32552:57:0;;;7779:21:1;7836:2;7816:18;;;7809:30;-1:-1:-1;;;7855:18:1;;;7848:50;7915:18;;32552:57:0;;;;;;;;;32650:14;;32628:10;:18;:36;;32620:67;;;;-1:-1:-1;;;32620:67:0;;8146:2:1;32620:67:0;;;8128:21:1;8185:2;8165:18;;;8158:30;-1:-1:-1;;;8204:18:1;;;8197:48;8262:18;;32620:67:0;7944:342:1;32620:67:0;32720:9;32698:18;;:31;;;;;;;:::i;:::-;;;;-1:-1:-1;;32762:4:0;;32768:14;;32740:43;;32750:10;;-1:-1:-1;;;;;32762:4:0;;;;32740:9;:43::i;:::-;32835:166;;;;;;;;32863:10;32835:166;;;;32888:4;32835:166;;;;;;32907:15;32835:166;;;;32981:9;32937:16;32954:10;32937:28;;;;;;:::i;:::-;;;;;;;;;;;;;:41;;;:53;;;;:::i;:::-;32835:166;;;32804:16;32821:10;32804:28;;;;;;:::i;:::-;;;;;;;;;;;;;;:197;;:28;;:197;;:28;:197;:::i;:::-;-1:-1:-1;32804:197:0;;;;;;;;;-1:-1:-1;;32804:197:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33017:44;;;;;33033:10;;33045:15;;33017:44;:::i;:::-;;;;;;;;32475:594;:::o;31891:576::-;31987:11;;31974:9;:24;;31966:57;;;;-1:-1:-1;;;31966:57:0;;7797:2:1;31966:57:0;;;7779:21:1;7836:2;7816:18;;;7809:30;-1:-1:-1;;;7855:18:1;;;7848:50;7915:18;;31966:57:0;7595:344:1;31966:57:0;32064:14;;32042:10;:18;:36;;32034:67;;;;-1:-1:-1;;;32034:67:0;;8146:2:1;32034:67:0;;;8128:21:1;8185:2;8165:18;;;8158:30;-1:-1:-1;;;8204:18:1;;;8197:48;8262:18;;32034:67:0;7944:342:1;32034:67:0;32134:9;32112:18;;:31;;;;;;;:::i;:::-;;;;-1:-1:-1;;32176:4:0;;32182:14;;32154:43;;32164:10;;-1:-1:-1;;;;;32176:4:0;;;;32154:9;:43::i;:::-;32239:162;;;;;;;;32264:11;32239:162;;;;32290:4;32239:162;;;;;;32309:15;32239:162;;;;32381:9;32339:13;32353:11;32339:26;;;;;;:::i;:::-;;;;;;;;;;;;;:39;;;:51;;;;:::i;:::-;32239:162;;;32210:13;32224:11;32210:26;;;;;;:::i;:::-;;;;;;;;;;;;;;:191;;:26;;:191;;:26;:191;:::i;:::-;-1:-1:-1;32210:191:0;;;;;;;;;-1:-1:-1;;32210:191:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32417:42;;;;;32430:11;;32443:15;;32417:42;:::i;33931:694::-;14858:13;:11;:13::i;:::-;34097:10:::1;34093:430;;;34157:147;;;;;;;;34189:12;34157:147;;;;34220:11;34157:147;;;;;;34250:12;34157:147;;;;34281:8;34157:147;;::::0;34124:16:::1;34141:12;34124:30;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:180;;:30;;:180:::1;::::0;:30;:180:::1;:::i;:::-;-1:-1:-1::0;34124:180:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;-1:-1:-1;;34124:180:0::1;::::0;::::1;;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;34093:430:::1;;;34367:144;;;;;;;;34396:12;34367:144;;;;34427:11;34367:144;;;;;;34457:12;34367:144;;;;34488:8;34367:144;;::::0;34337:13:::1;34351:12;34337:27;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:174;;:27;;:174:::1;::::0;:27;:174:::1;:::i;:::-;-1:-1:-1::0;34337:174:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;-1:-1:-1;;34337:174:0::1;::::0;::::1;;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;34093:430:::1;34538:79;34555:12;34569:10;34581:11;34594:12;34608:8;34538:79;;;;;;;;;;:::i;:::-;;;;;;;;33931:694:::0;;;;;:::o;36507:288::-;14858:13;:11;:13::i;:::-;36589:4:::1;::::0;-1:-1:-1;;;;;36589:4:0;;::::1;36580:13:::0;;::::1;::::0;36572:66:::1;;;;-1:-1:-1::0;;;36572:66:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;36657:19:0;::::1;36649:72;;;;-1:-1:-1::0;;;36649:72:0::1;;;;;;;:::i;:::-;36732:13;:21:::0;;-1:-1:-1;;;;;;36732:21:0::1;-1:-1:-1::0;;;;;36732:21:0;::::1;::::0;;::::1;::::0;;;36769:18:::1;::::0;160:51:1;;;36769:18:0::1;::::0;148:2:1;133:18;36769::0::1;14:203:1::0;21459:297:0;21592:4;13845:10;21650:38;21666:4;13845:10;21681:6;21650:15;:38::i;:::-;21699:27;21709:4;21715:2;21719:6;21699:9;:27::i;:::-;-1:-1:-1;21744:4:0;;21459:297;-1:-1:-1;;;;21459:297:0:o;41771:602::-;41928:4;14858:13;:11;:13::i;:::-;42001:2:::1;41991:7;;:12;;;;:::i;:::-;41958:30;:45;41950:110;;;;-1:-1:-1::0;;;41950:110:0::1;;;;;;;:::i;:::-;42116:2;42106:7;;:12;;;;:::i;:::-;42079:24;:39;42071:104;;;;-1:-1:-1::0;;;42071:104:0::1;;;;;;;:::i;:::-;42255:9;::::0;42251:13:::1;::::0;42255:9:::1;;42251:2;:13;:::i;:::-;42218:46;::::0;:30;:46:::1;:::i;:::-;42186:29;:78:::0;42332:9:::1;::::0;42328:13:::1;::::0;42332:9:::1;;42328:2;:13;:::i;:::-;42301:40;::::0;:24;:40:::1;:::i;:::-;42275:23;:66:::0;-1:-1:-1;42361:4:0::1;41771:602:::0;;;;:::o;30294:314::-;14858:13;:11;:13::i;:::-;30378:2:::1;30360:15;;:20;30352:86;;;;-1:-1:-1::0;;;30352:86:0::1;;;;;;;:::i;:::-;30467:1;30449:15;:19:::0;;;30497:1:::1;30479:15;:19:::0;30538:9:::1;::::0;30534:13:::1;::::0;30538:9:::1;::::0;;::::1;::::0;30534:13:::1;:::i;:::-;30523:24;::::0;:8:::1;:24;:::i;:::-;30509:11;:38:::0;30591:9:::1;::::0;30587:13:::1;::::0;30591:9:::1;;30587:2;:13;:::i;:::-;30576:24;::::0;:8:::1;:24;:::i;:::-;30558:15;:42:::0;30294:314::o;23175:272::-;23292:4;13845:10;23353:64;13845:10;23369:7;23406:10;23378:25;13845:10;23369:7;23378:9;:25::i;:::-;:38;;;;:::i;:::-;23353:8;:64::i;29651:311::-;14858:13;:11;:13::i;:::-;29731:2:::1;29713:15;;:20;29705:86;;;;-1:-1:-1::0;;;29705:86:0::1;;;;;;;:::i;:::-;29820:1;29802:15;:19:::0;;;29850:2:::1;29832:15;:20:::0;29892:9:::1;::::0;29888:13:::1;::::0;29892:9:::1;::::0;;::::1;::::0;29888:13:::1;:::i;:::-;29877:24;::::0;:8:::1;:24;:::i;:::-;29863:11;:38:::0;29945:9:::1;::::0;29941:13:::1;::::0;29945:9:::1;;29941:2;:13;:::i;:::-;29930:24;::::0;:8:::1;:24;:::i;33098:254::-:0;33185:4;33206:10;33202:89;;;33240:16;33257:12;33240:30;;;;;;:::i;:::-;;;;;;;;;;;;;;:39;;;;;;-1:-1:-1;33233:46:0;;33202:89;33308:13;33322:12;33308:27;;;;;;:::i;:::-;;;;;;;;;;;;;;:36;;;;;;-1:-1:-1;33098:254:0;;;;:::o;31078:50::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;31078:50:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31078:50:0;:::o;42381:244::-;42483:4;14858:13;:11;:13::i;:::-;42528:17:::1;42513:12;:32;42505:51;;;::::0;-1:-1:-1;;;42505:51:0;;15111:2:1;42505:51:0::1;::::0;::::1;15093:21:1::0;15150:1;15130:18;;;15123:29;-1:-1:-1;;;15168:18:1;;;15161:36;15214:18;;42505:51:0::1;14909:329:1::0;42505:51:0::1;-1:-1:-1::0;42567:11:0::1;:26:::0;;;42613:4:::1;14882:1;42381:244:::0;;;:::o;15620:103::-;14858:13;:11;:13::i;:::-;15685:30:::1;15712:1;15685:18;:30::i;:::-;15620:103::o:0;34633:524::-;14858:13;:11;:13::i;:::-;34726:6:::1;34722:374;;;34753:10;34749:133;;;34784:14;:22:::0;;;34722:374:::1;;34749:133;34847:11;:19:::0;;;34722:374:::1;;;34918:10;34914:171;;;34981:9;::::0;34977:13:::1;::::0;34981:9:::1;;34977:2;:13;:::i;:::-;34969:21;::::0;:5;:21:::1;:::i;:::-;34949:17;:41:::0;34914:171:::1;;;35060:9;::::0;35056:13:::1;::::0;35060:9:::1;;35056:2;:13;:::i;:::-;35048:21;::::0;:5;:21:::1;:::i;:::-;35031:14;:38:::0;34914:171:::1;35111:38;::::0;;15458:14:1;;15451:22;15433:41;;15517:14;;15510:22;15505:2;15490:18;;15483:50;15549:18;;;15542:34;;;35111:38:0::1;::::0;15421:2:1;15406:18;35111:38:0::1;;;;;;;34633:524:::0;;;:::o;42633:264::-;42743:4;14858:13;:11;:13::i;:::-;42792:17:::1;42773:16;:36;42765:55;;;::::0;-1:-1:-1;;;42765:55:0;;15111:2:1;42765:55:0::1;::::0;::::1;15093:21:1::0;15150:1;15130:18;;;15123:29;-1:-1:-1;;;15168:18:1;;;15161:36;15214:18;;42765:55:0::1;14909:329:1::0;42765:55:0::1;-1:-1:-1::0;42831:15:0::1;:34:::0;42885:4:::1;::::0;42633:264::o;18185:106::-;18243:13;18276:7;18269:14;;;;;:::i;29972:312::-;14858:13;:11;:13::i;:::-;30053:2:::1;30035:15;;:20;30027:86;;;;-1:-1:-1::0;;;30027:86:0::1;;;;;;;:::i;:::-;30142:1;30124:15;:19:::0;;;30172:2:::1;30154:15;:20:::0;30214:9:::1;::::0;30210:13:::1;::::0;30214:9:::1;::::0;;::::1;::::0;30210:13:::1;:::i;31135:56::-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;22259:507::-;22381:4;13845:10;22381:4;22469:25;13845:10;22486:7;22469:9;:25::i;:::-;22442:52;;22547:15;22527:16;:35;;22505:122;;;;-1:-1:-1;;;22505:122:0;;15789:2:1;22505:122:0;;;15771:21:1;15828:2;15808:18;;;15801:30;15867:34;15847:18;;;15840:62;-1:-1:-1;;;15918:18:1;;;15911:35;15963:19;;22505:122:0;15587:401:1;22505:122:0;22663:60;22672:5;22679:7;22707:15;22688:16;:34;22663:8;:60::i;20079:236::-;20196:4;13845:10;20257:28;13845:10;20274:2;20278:6;20257:9;:28::i;41372:391::-;41520:4;14858:13;:11;:13::i;:::-;41589:2:::1;41551:33;41568:16:::0;41551;:33:::1;:::i;:::-;41550:41;;41542:99;;;::::0;-1:-1:-1;;;41542:99:0;;16195:2:1;41542:99:0::1;::::0;::::1;16177:21:1::0;16234:2;16214:18;;;16207:30;16273:34;16253:18;;;16246:62;-1:-1:-1;;;16324:18:1;;;16317:43;16377:19;;41542:99:0::1;15993:409:1::0;41542:99:0::1;-1:-1:-1::0;41652:15:0::1;:34:::0;;;;41697:15:::1;:34:::0;41751:4:::1;::::0;41372:391::o;33360:262::-;33447:4;33468:10;33464:93;;;33502:16;33519:12;33502:30;;;;;;:::i;:::-;;;;;;;;;;;;;:43;;;33495:50;;;;33464:93;33574:13;33588:12;33574:27;;;;;;:::i;:::-;;;;;;;;;;;;;:40;;;33567:47;;33360:262;;;;:::o;41014:350::-;41117:4;14858:13;:11;:13::i;:::-;41160:4:::1;::::0;-1:-1:-1;;;;;41160:4:0;;::::1;41147:17:::0;;::::1;::::0;41139:70:::1;;;;-1:-1:-1::0;;;41139:70:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;41228:23:0;::::1;41220:76;;;;-1:-1:-1::0;;;41220:76:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;41307:15:0::1;:27:::0;;-1:-1:-1;;;;;41307:27:0;::::1;-1:-1:-1::0;;;;;;41307:27:0;;::::1;;::::0;;;41014:350;;;:::o;19672:201::-;-1:-1:-1;;;;;19838:18:0;;;19806:7;19838:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;19672:201::o;39425:189::-;14858:13;:11;:13::i;:::-;-1:-1:-1;;;;;39511:28:0;::::1;;::::0;;;:18:::1;:28;::::0;;;;;;;;:38;;-1:-1:-1;;39511:38:0::1;::::0;::::1;;::::0;;::::1;::::0;;;39565:41;;16575:51:1;;;16642:18;;;16635:50;39565:41:0::1;::::0;16548:18:1;39565:41:0::1;;;;;;;39425:189:::0;;:::o;33630:262::-;33721:4;33742:10;33738:91;;;33776:16;33793:12;33776:30;;;;;;:::i;:::-;;;;;;;;;;;;;:41;;;33769:48;;;;33738:91;33846:13;33860:12;33846:27;;;;;;:::i;:::-;;;;;;;;;;;;;:38;;;33839:45;;33630:262;;;;:::o;15878:238::-;14858:13;:11;:13::i;:::-;-1:-1:-1;;;;;15981:22:0;::::1;15959:110;;;::::0;-1:-1:-1;;;15959:110:0;;16898:2:1;15959:110:0::1;::::0;::::1;16880:21:1::0;16937:2;16917:18;;;16910:30;16976:34;16956:18;;;16949:62;-1:-1:-1;;;17027:18:1;;;17020:36;17073:19;;15959:110:0::1;16696:402:1::0;15959:110:0::1;16080:28;16099:8;16080:18;:28::i;:::-;15878:238:::0;:::o;25482:380::-;-1:-1:-1;;;;;25618:19:0;;25610:68;;;;-1:-1:-1;;;25610:68:0;;17305:2:1;25610:68:0;;;17287:21:1;17344:2;17324:18;;;17317:30;17383:34;17363:18;;;17356:62;-1:-1:-1;;;17434:18:1;;;17427:34;17478:19;;25610:68:0;17103:400:1;25610:68:0;-1:-1:-1;;;;;25697:21:0;;25689:68;;;;-1:-1:-1;;;25689:68:0;;17710:2:1;25689:68:0;;;17692:21:1;17749:2;17729:18;;;17722:30;17788:34;17768:18;;;17761:62;-1:-1:-1;;;17839:18:1;;;17832:32;17881:19;;25689:68:0;17508:398:1;25689:68:0;-1:-1:-1;;;;;25770:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;25822:32;;368:25:1;;;25822:32:0;;341:18:1;25822:32:0;;;;;;;25482:380;;;:::o;37273:2144::-;-1:-1:-1;;;;;37371:18:0;;37363:68;;;;-1:-1:-1;;;37363:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37450:16:0;;37442:64;;;;-1:-1:-1;;;37442:64:0;;;;;;;:::i;:::-;37544:6;37525:15;37535:4;-1:-1:-1;;;;;18677:18:0;18645:7;18677:18;;;;;;;;;;;;18526:177;37525:15;:25;;37517:76;;;;-1:-1:-1;;;37517:76:0;;;;;;;:::i;:::-;37619:13;;-1:-1:-1;;;;;37611:21:0;;;37619:13;;37611:21;;:44;;-1:-1:-1;37642:13:0;;-1:-1:-1;;;;;37636:19:0;;;37642:13;;37636:19;37611:44;37610:67;;;;-1:-1:-1;37661:16:0;;-1:-1:-1;;;37661:16:0;;;;37660:17;37610:67;37606:1804;;;37706:13;;-1:-1:-1;;;;;37698:21:0;;;37706:13;;37698:21;37694:681;;37802:18;;37793:4;37740:32;18677:18;;;;;;;;;;;37740:32;;37775:45;;;:::i;:::-;37740:80;;37871:29;;37843:24;:57;37839:152;;37925:46;37941:29;;37925:15;:46::i;:::-;38037:23;;38014:18;;38013:47;38009:351;;38085:42;38103:23;;38085:17;:42::i;:::-;38172:23;;38150:18;;:45;;;;;;;:::i;:::-;;;;-1:-1:-1;;38238:15:0;;38230:52;;38218:9;;-1:-1:-1;;;;;38238:15:0;;38260:21;38230:52;;;;;38218:9;38230:52;38218:9;38230:52;38260:21;38238:15;38230:52;;;;;;;38218:64;;38313:4;38305:35;;;;-1:-1:-1;;;38305:35:0;;19463:2:1;38305:35:0;;;19445:21:1;19502:2;19482:18;;;19475:30;-1:-1:-1;;;19521:18:1;;;19514:48;19579:18;;38305:35:0;19261:342:1;38305:35:0;38062:298;38009:351;37721:654;37694:681;-1:-1:-1;;;;;38432:24:0;;38391:22;38432:24;;;:18;:24;;;;;;;;;:50;;-1:-1:-1;;;;;;38460:22:0;;;;;;:18;:22;;;;;;;;38432:50;38428:839;;;-1:-1:-1;38520:6:0;38428:839;;;38599:11;;38589:6;:21;;38581:91;;;;-1:-1:-1;;;38581:91:0;;19810:2:1;38581:91:0;;;19792:21:1;19849:2;19829:18;;;19822:30;19888:34;19868:18;;;19861:62;19959:27;19939:18;;;19932:55;20004:19;;38581:91:0;19608:421:1;38581:91:0;38702:13;;-1:-1:-1;;;;;38702:13:0;;;38694:21;;;;38691:178;;38775:15;;-1:-1:-1;;;;;18677:18:0;;18645:7;18677:18;;;;;;;;;;;38748:22;;:6;:22;:::i;:::-;38747:43;;38739:110;;;;-1:-1:-1;;;38739:110:0;;20236:2:1;38739:110:0;;;20218:21:1;20275:2;20255:18;;;20248:30;20314:34;20294:18;;;20287:62;-1:-1:-1;;;20365:18:1;;;20358:52;20427:19;;38739:110:0;20034:418:1;38739:110:0;38889:22;38944:3;38925:15;;38916:6;:24;;;;:::i;:::-;38915:32;;;;:::i;:::-;38889:59;;38967:22;39022:3;39003:15;;38994:6;:24;;;;:::i;:::-;38993:32;;;;:::i;:::-;38967:59;-1:-1:-1;39072:31:0;38967:59;39072:14;:31;:::i;:::-;39062:42;;:6;:42;:::i;:::-;39045:59;;39145:14;39123:18;;:36;;;;;;;:::i;:::-;;;;-1:-1:-1;39180:71:0;;-1:-1:-1;39196:4:0;39210;39218:31;39235:14;39218;:31;:::i;:::-;39180:15;:71::i;:::-;38562:705;;38428:839;39281:41;39297:4;39303:2;39307:14;39281:15;:41::i;:::-;37679:1655;37273:2144;;;:::o;37606:1804::-;39365:33;39381:4;39387:2;39391:6;39365:15;:33::i;:::-;37273:2144;;;:::o;15137:132::-;15045:6;;-1:-1:-1;;;;;15045:6:0;13845:10;15201:23;15193:68;;;;-1:-1:-1;;;15193:68:0;;20659:2:1;15193:68:0;;;20641:21:1;;;20678:18;;;20671:30;20737:34;20717:18;;;20710:62;20789:18;;15193:68:0;20457:356:1;26153:502:0;26288:24;26315:25;26325:5;26332:7;26315:9;:25::i;:::-;26288:52;;-1:-1:-1;;26355:16:0;:37;26351:297;;26455:6;26435:16;:26;;26409:117;;;;-1:-1:-1;;;26409:117:0;;21020:2:1;26409:117:0;;;21002:21:1;21059:2;21039:18;;;21032:30;21098:31;21078:18;;;21071:59;21147:18;;26409:117:0;20818:353:1;26409:117:0;26570:51;26579:5;26586:7;26614:6;26595:16;:25;26570:8;:51::i;16276:191::-;16369:6;;;-1:-1:-1;;;;;16386:17:0;;;-1:-1:-1;;;;;;16386:17:0;;;;;;;16419:40;;16369:6;;;16386:17;16369:6;;16419:40;;16350:16;;16419:40;16339:128;16276:191;:::o;39622:474::-;35540:16;:23;;-1:-1:-1;;;;35540:23:0;-1:-1:-1;;;35540:23:0;;;;39724:24:::1;39747:1;39724:20:::0;:24:::1;:::i;:::-;39708:41:::0;-1:-1:-1;39760:17:0::1;39781:27;39708:41:::0;39781:20;:27:::1;:::i;:::-;39760:49:::0;-1:-1:-1;39847:21:0::1;39881:23;39899:4:::0;39881:17:::1;:23::i;:::-;39917:18;39939:38;39963:14:::0;39939:21:::1;:38;:::i;:::-;39917:61;;39991:36;40005:9;40016:10;39991:13;:36::i;:::-;40045:43;::::0;;21378:25:1;;;21434:2;21419:18;;21412:34;;;21462:18;;;21455:34;;;40045:43:0::1;::::0;21366:2:1;21351:18;40045:43:0::1;;;;;;;-1:-1:-1::0;;35586:16:0;:24;;-1:-1:-1;;;;35586:24:0;;;-1:-1:-1;;;39622:474:0:o;40104:488::-;35540:16;:23;;-1:-1:-1;;;;35540:23:0;-1:-1:-1;;;35540:23:0;;;40207:16:::1;::::0;;40221:1:::1;40207:16:::0;;;;;::::1;::::0;;-1:-1:-1;;40207:16:0::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;40207:16:0::1;40183:40;;40252:4;40234;40239:1;40234:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1::0;;;;;40234:23:0::1;;;-1:-1:-1::0;;;;;40234:23:0::1;;;::::0;::::1;40278:15;-1:-1:-1::0;;;;;40278:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40268:4;40273:1;40268:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1::0;;;;;40268:32:0::1;;;-1:-1:-1::0;;;;;40268:32:0::1;;;::::0;::::1;40313:62;40330:4;40345:15;40363:11;40313:8;:62::i;:::-;40388:196;::::0;-1:-1:-1;;;40388:196:0;;-1:-1:-1;;;;;40388:15:0::1;:66;::::0;::::1;::::0;:196:::1;::::0;40469:11;;40495:1:::1;::::0;40511:4;;40538::::1;::::0;40558:15:::1;::::0;40388:196:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;35586:16:0;:24;;-1:-1:-1;;;;35586:24:0;;;-1:-1:-1;;;;40104:488:0:o;26663:776::-;-1:-1:-1;;;;;26794:18:0;;26786:68;;;;-1:-1:-1;;;26786:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26873:16:0;;26865:64;;;;-1:-1:-1;;;26865:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26964:15:0;;26942:19;26964:15;;;;;;;;;;;27012:21;;;;26990:109;;;;-1:-1:-1;;;26990:109:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27135:15:0;;;:9;:15;;;;;;;;;;;27153:20;;;27135:38;;27353:13;;;;;;;;;;:23;;;;;;27405:26;;368:25:1;;;27353:13:0;;27405:26;;341:18:1;27405:26:0;;;;;;;26775:664;26663:776;;;:::o;40600:406::-;35540:16;:23;;-1:-1:-1;;;;35540:23:0;-1:-1:-1;;;35540:23:0;;;40717:62:::1;40734:4;40749:15;40767:11:::0;40717:8:::1;:62::i;:::-;40942:15;::::0;40792:206:::1;::::0;-1:-1:-1;;;40792:206:0;;40864:4:::1;40792:206;::::0;::::1;23214:34:1::0;23264:18;;;23257:34;;;40910:1:0::1;23307:18:1::0;;;23300:34;;;23350:18;;;23343:34;-1:-1:-1;;;;;40942:15:0;;::::1;23393:19:1::0;;;23386:44;40972:15:0::1;23446:19:1::0;;;23439:35;40792:15:0::1;:31:::0;;::::1;::::0;::::1;::::0;40831:9;;23148:19:1;;40792:206:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;35586:16:0;:24;;-1:-1:-1;;;;35586:24:0;;;-1:-1:-1;;;40600:406:0:o;404:250:1:-;489:1;499:113;513:6;510:1;507:13;499:113;;;589:11;;;583:18;570:11;;;563:39;535:2;528:10;499:113;;;-1:-1:-1;;646:1:1;628:16;;621:27;404:250::o;659:271::-;701:3;739:5;733:12;766:6;761:3;754:19;782:76;851:6;844:4;839:3;835:14;828:4;821:5;817:16;782:76;:::i;:::-;912:2;891:15;-1:-1:-1;;887:29:1;878:39;;;;919:4;874:50;;659:271;-1:-1:-1;;659:271:1:o;935:220::-;1084:2;1073:9;1066:21;1047:4;1104:45;1145:2;1134:9;1130:18;1122:6;1104:45;:::i;:::-;1096:53;935:220;-1:-1:-1;;;935:220:1:o;1160:131::-;-1:-1:-1;;;;;1235:31:1;;1225:42;;1215:70;;1281:1;1278;1271:12;1296:315;1364:6;1372;1425:2;1413:9;1404:7;1400:23;1396:32;1393:52;;;1441:1;1438;1431:12;1393:52;1480:9;1467:23;1499:31;1524:5;1499:31;:::i;:::-;1549:5;1601:2;1586:18;;;;1573:32;;-1:-1:-1;;;1296:315:1:o;1808:127::-;1869:10;1864:3;1860:20;1857:1;1850:31;1900:4;1897:1;1890:15;1924:4;1921:1;1914:15;1940:719;1983:5;2036:3;2029:4;2021:6;2017:17;2013:27;2003:55;;2054:1;2051;2044:12;2003:55;2090:6;2077:20;2116:18;2153:2;2149;2146:10;2143:36;;;2159:18;;:::i;:::-;2234:2;2228:9;2202:2;2288:13;;-1:-1:-1;;2284:22:1;;;2308:2;2280:31;2276:40;2264:53;;;2332:18;;;2352:22;;;2329:46;2326:72;;;2378:18;;:::i;:::-;2418:10;2414:2;2407:22;2453:2;2445:6;2438:18;2499:3;2492:4;2487:2;2479:6;2475:15;2471:26;2468:35;2465:55;;;2516:1;2513;2506:12;2465:55;2580:2;2573:4;2565:6;2561:17;2554:4;2546:6;2542:17;2529:54;2627:1;2620:4;2615:2;2607:6;2603:15;2599:26;2592:37;2647:6;2638:15;;;;;;1940:719;;;;:::o;2664:322::-;2733:6;2786:2;2774:9;2765:7;2761:23;2757:32;2754:52;;;2802:1;2799;2792:12;2754:52;2842:9;2829:23;2875:18;2867:6;2864:30;2861:50;;;2907:1;2904;2897:12;2861:50;2930;2972:7;2963:6;2952:9;2948:22;2930:50;:::i;:::-;2920:60;2664:322;-1:-1:-1;;;;2664:322:1:o;3225:160::-;3290:20;;3346:13;;3339:21;3329:32;;3319:60;;3375:1;3372;3365:12;3390:596;3489:6;3497;3505;3513;3521;3574:3;3562:9;3553:7;3549:23;3545:33;3542:53;;;3591:1;3588;3581:12;3542:53;3631:9;3618:23;3664:18;3656:6;3653:30;3650:50;;;3696:1;3693;3686:12;3650:50;3719;3761:7;3752:6;3741:9;3737:22;3719:50;:::i;:::-;3709:60;;;3788:35;3819:2;3808:9;3804:18;3788:35;:::i;:::-;3778:45;;3842:35;3873:2;3862:9;3858:18;3842:35;:::i;:::-;3390:596;;;;-1:-1:-1;3832:45:1;;3924:2;3909:18;;3896:32;;-1:-1:-1;3975:3:1;3960:19;3947:33;;3390:596;-1:-1:-1;;3390:596:1:o;3991:247::-;4050:6;4103:2;4091:9;4082:7;4078:23;4074:32;4071:52;;;4119:1;4116;4109:12;4071:52;4158:9;4145:23;4177:31;4202:5;4177:31;:::i;4243:456::-;4320:6;4328;4336;4389:2;4377:9;4368:7;4364:23;4360:32;4357:52;;;4405:1;4402;4395:12;4357:52;4444:9;4431:23;4463:31;4488:5;4463:31;:::i;:::-;4513:5;-1:-1:-1;4570:2:1;4555:18;;4542:32;4583:33;4542:32;4583:33;:::i;:::-;4243:456;;4635:7;;-1:-1:-1;;;4689:2:1;4674:18;;;;4661:32;;4243:456::o;4704:248::-;4772:6;4780;4833:2;4821:9;4812:7;4808:23;4804:32;4801:52;;;4849:1;4846;4839:12;4801:52;-1:-1:-1;;4872:23:1;;;4942:2;4927:18;;;4914:32;;-1:-1:-1;4704:248:1:o;5146:390::-;5221:6;5229;5282:2;5270:9;5261:7;5257:23;5253:32;5250:52;;;5298:1;5295;5288:12;5250:52;5338:9;5325:23;5371:18;5363:6;5360:30;5357:50;;;5403:1;5400;5393:12;5357:50;5426;5468:7;5459:6;5448:9;5444:22;5426:50;:::i;:::-;5416:60;;;5495:35;5526:2;5515:9;5511:18;5495:35;:::i;:::-;5485:45;;5146:390;;;;;:::o;5541:445::-;5768:3;5757:9;5750:22;5731:4;5789:46;5830:3;5819:9;5815:19;5807:6;5789:46;:::i;:::-;5878:14;;5871:22;5866:2;5851:18;;5844:50;-1:-1:-1;5925:2:1;5910:18;;5903:34;;;;5968:2;5953:18;;;5946:34;5781:54;5541:445;-1:-1:-1;5541:445:1:o;5991:180::-;6050:6;6103:2;6091:9;6082:7;6078:23;6074:32;6071:52;;;6119:1;6116;6109:12;6071:52;-1:-1:-1;6142:23:1;;5991:180;-1:-1:-1;5991:180:1:o;6176:316::-;6247:6;6255;6263;6316:2;6304:9;6295:7;6291:23;6287:32;6284:52;;;6332:1;6329;6322:12;6284:52;6355:26;6371:9;6355:26;:::i;:::-;6345:36;;6400:35;6431:2;6420:9;6416:18;6400:35;:::i;:::-;6390:45;;6482:2;6471:9;6467:18;6454:32;6444:42;;6176:316;;;;;:::o;6497:388::-;6565:6;6573;6626:2;6614:9;6605:7;6601:23;6597:32;6594:52;;;6642:1;6639;6632:12;6594:52;6681:9;6668:23;6700:31;6725:5;6700:31;:::i;:::-;6750:5;-1:-1:-1;6807:2:1;6792:18;;6779:32;6820:33;6779:32;6820:33;:::i;:::-;6872:7;6862:17;;;6497:388;;;;;:::o;6890:315::-;6955:6;6963;7016:2;7004:9;6995:7;6991:23;6987:32;6984:52;;;7032:1;7029;7022:12;6984:52;7071:9;7058:23;7090:31;7115:5;7090:31;:::i;:::-;7140:5;-1:-1:-1;7164:35:1;7195:2;7180:18;;7164:35;:::i;7210:380::-;7289:1;7285:12;;;;7332;;;7353:61;;7407:4;7399:6;7395:17;7385:27;;7353:61;7460:2;7452:6;7449:14;7429:18;7426:38;7423:161;;7506:10;7501:3;7497:20;7494:1;7487:31;7541:4;7538:1;7531:15;7569:4;7566:1;7559:15;7423:161;;7210:380;;;:::o;8291:127::-;8352:10;8347:3;8343:20;8340:1;8333:31;8383:4;8380:1;8373:15;8407:4;8404:1;8397:15;8423:125;8488:9;;;8509:10;;;8506:36;;;8522:18;;:::i;8553:289::-;8684:3;8722:6;8716:13;8738:66;8797:6;8792:3;8785:4;8777:6;8773:17;8738:66;:::i;:::-;8820:16;;;;;8553:289;-1:-1:-1;;8553:289:1:o;8973:545::-;9075:2;9070:3;9067:11;9064:448;;;9111:1;9136:5;9132:2;9125:17;9181:4;9177:2;9167:19;9251:2;9239:10;9235:19;9232:1;9228:27;9222:4;9218:38;9287:4;9275:10;9272:20;9269:47;;;-1:-1:-1;9310:4:1;9269:47;9365:2;9360:3;9356:12;9353:1;9349:20;9343:4;9339:31;9329:41;;9420:82;9438:2;9431:5;9428:13;9420:82;;;9483:17;;;9464:1;9453:13;9420:82;;;9424:3;;;8973:545;;;:::o;9694:1352::-;9820:3;9814:10;9847:18;9839:6;9836:30;9833:56;;;9869:18;;:::i;:::-;9898:97;9988:6;9948:38;9980:4;9974:11;9948:38;:::i;:::-;9942:4;9898:97;:::i;:::-;10050:4;;10114:2;10103:14;;10131:1;10126:663;;;;10833:1;10850:6;10847:89;;;-1:-1:-1;10902:19:1;;;10896:26;10847:89;-1:-1:-1;;9651:1:1;9647:11;;;9643:24;9639:29;9629:40;9675:1;9671:11;;;9626:57;10949:81;;10096:944;;10126:663;8920:1;8913:14;;;8957:4;8944:18;;-1:-1:-1;;10162:20:1;;;10280:236;10294:7;10291:1;10288:14;10280:236;;;10383:19;;;10377:26;10362:42;;10475:27;;;;10443:1;10431:14;;;;10310:19;;10280:236;;;10284:3;10544:6;10535:7;10532:19;10529:201;;;10605:19;;;10599:26;-1:-1:-1;;10688:1:1;10684:14;;;10700:3;10680:24;10676:37;10672:42;10657:58;10642:74;;10529:201;-1:-1:-1;;;;;10776:1:1;10760:14;;;10756:22;10743:36;;-1:-1:-1;9694:1352:1:o;11051:291::-;11228:2;11217:9;11210:21;11191:4;11248:45;11289:2;11278:9;11274:18;11266:6;11248:45;:::i;:::-;11240:53;;11329:6;11324:2;11313:9;11309:18;11302:34;11051:291;;;;;:::o;11347:527::-;11596:3;11585:9;11578:22;11559:4;11617:46;11658:3;11647:9;11643:19;11635:6;11617:46;:::i;:::-;11706:14;;11699:22;11694:2;11679:18;;11672:50;-1:-1:-1;11765:14:1;;11758:22;11753:2;11738:18;;11731:50;11812:2;11797:18;;11790:34;;;;11855:3;11840:19;;;11833:35;11609:54;11347:527;-1:-1:-1;11347:527:1:o;11879:404::-;12081:2;12063:21;;;12120:2;12100:18;;;12093:30;12159:34;12154:2;12139:18;;12132:62;-1:-1:-1;;;12225:2:1;12210:18;;12203:38;12273:3;12258:19;;11879:404::o;12288:217::-;12328:1;12354;12344:132;;12398:10;12393:3;12389:20;12386:1;12379:31;12433:4;12430:1;12423:15;12461:4;12458:1;12451:15;12344:132;-1:-1:-1;12490:9:1;;12288:217::o;12510:416::-;12712:2;12694:21;;;12751:2;12731:18;;;12724:30;12790:34;12785:2;12770:18;;12763:62;-1:-1:-1;;;12856:2:1;12841:18;;12834:50;12916:3;12901:19;;12510:416::o;12931:422::-;13020:1;13063:5;13020:1;13077:270;13098:7;13088:8;13085:21;13077:270;;;13157:4;13153:1;13149:6;13145:17;13139:4;13136:27;13133:53;;;13166:18;;:::i;:::-;13216:7;13206:8;13202:22;13199:55;;;13236:16;;;;13199:55;13315:22;;;;13275:15;;;;13077:270;;;13081:3;12931:422;;;;;:::o;13358:806::-;13407:5;13437:8;13427:80;;-1:-1:-1;13478:1:1;13492:5;;13427:80;13526:4;13516:76;;-1:-1:-1;13563:1:1;13577:5;;13516:76;13608:4;13626:1;13621:59;;;;13694:1;13689:130;;;;13601:218;;13621:59;13651:1;13642:10;;13665:5;;;13689:130;13726:3;13716:8;13713:17;13710:43;;;13733:18;;:::i;:::-;-1:-1:-1;;13789:1:1;13775:16;;13804:5;;13601:218;;13903:2;13893:8;13890:16;13884:3;13878:4;13875:13;13871:36;13865:2;13855:8;13852:16;13847:2;13841:4;13838:12;13834:35;13831:77;13828:159;;;-1:-1:-1;13940:19:1;;;13972:5;;13828:159;14019:34;14044:8;14038:4;14019:34;:::i;:::-;14089:6;14085:1;14081:6;14077:19;14068:7;14065:32;14062:58;;;14100:18;;:::i;:::-;14138:20;;13358:806;-1:-1:-1;;;13358:806:1:o;14169:140::-;14227:5;14256:47;14297:4;14287:8;14283:19;14277:4;14256:47;:::i;14314:168::-;14354:7;14420:1;14416;14412:6;14408:14;14405:1;14402:21;14397:1;14390:9;14383:17;14379:45;14376:71;;;14427:18;;:::i;:::-;-1:-1:-1;14467:9:1;;14314:168::o;14487:417::-;14689:2;14671:21;;;14728:2;14708:18;;;14701:30;14767:34;14762:2;14747:18;;14740:62;-1:-1:-1;;;14833:2:1;14818:18;;14811:51;14894:3;14879:19;;14487:417::o;17911:401::-;18113:2;18095:21;;;18152:2;18132:18;;;18125:30;18191:34;18186:2;18171:18;;18164:62;-1:-1:-1;;;18257:2:1;18242:18;;18235:35;18302:3;18287:19;;17911:401::o;18317:399::-;18519:2;18501:21;;;18558:2;18538:18;;;18531:30;18597:34;18592:2;18577:18;;18570:62;-1:-1:-1;;;18663:2:1;18648:18;;18641:33;18706:3;18691:19;;18317:399::o;18721:402::-;18923:2;18905:21;;;18962:2;18942:18;;;18935:30;19001:34;18996:2;18981:18;;18974:62;-1:-1:-1;;;19067:2:1;19052:18;;19045:36;19113:3;19098:19;;18721:402::o;19128:128::-;19195:9;;;19216:11;;;19213:37;;;19230:18;;:::i;21500:127::-;21561:10;21556:3;21552:20;21549:1;21542:31;21592:4;21589:1;21582:15;21616:4;21613:1;21606:15;21632:251;21702:6;21755:2;21743:9;21734:7;21730:23;21726:32;21723:52;;;21771:1;21768;21761:12;21723:52;21803:9;21797:16;21822:31;21847:5;21822:31;:::i;21888:980::-;22150:4;22198:3;22187:9;22183:19;22229:6;22218:9;22211:25;22255:2;22293:6;22288:2;22277:9;22273:18;22266:34;22336:3;22331:2;22320:9;22316:18;22309:31;22360:6;22395;22389:13;22426:6;22418;22411:22;22464:3;22453:9;22449:19;22442:26;;22503:2;22495:6;22491:15;22477:29;;22524:1;22534:195;22548:6;22545:1;22542:13;22534:195;;;22613:13;;-1:-1:-1;;;;;22609:39:1;22597:52;;22704:15;;;;22669:12;;;;22645:1;22563:9;22534:195;;;-1:-1:-1;;;;;;;22785:32:1;;;;22780:2;22765:18;;22758:60;-1:-1:-1;;;22849:3:1;22834:19;22827:35;22746:3;21888:980;-1:-1:-1;;;21888:980:1:o;23485:306::-;23573:6;23581;23589;23642:2;23630:9;23621:7;23617:23;23613:32;23610:52;;;23658:1;23655;23648:12;23610:52;23687:9;23681:16;23671:26;;23737:2;23726:9;23722:18;23716:25;23706:35;;23781:2;23770:9;23766:18;23760:25;23750:35;;23485:306;;;;;:::o

Swarm Source

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