ETH Price: $2,521.16 (+1.20%)

Token

PepAI | PepAI.ai (PepAI)
 

Overview

Max Total Supply

1,000,000,000 PepAI

Holders

121

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
0.088056592 PepAI

Value
$0.00
0x61afeb68eb87b762562934e26050d703e5f5ac5d
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:
PepAI

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-15
*/

/**
* .----------------.  .----------------.  .----------------.  .----------------.  .----------------. 
*| .--------------. || .--------------. || .--------------. || .--------------. || .--------------. |
*| |   ______     | || |  _________   | || |   ______     | || |      __      | || |     _____    | |
*| |  |_   __ \   | || | |_   ___  |  | || |  |_   __ \   | || |     /  \     | || |    |_   _|   | |
*| |    | |__) |  | || |   | |_  \_|  | || |    | |__) |  | || |    / /\ \    | || |      | |     | |
*| |    |  ___/   | || |   |  _|  _   | || |    |  ___/   | || |   / ____ \   | || |      | |     | |
*| |   _| |_      | || |  _| |___/ |  | || |   _| |_      | || | _/ /    \ \_ | || |     _| |_    | |
*| |  |_____|     | || | |_________|  | || |  |_____|     | || ||____|  |____|| || |    |_____|   | |
*| |              | || |              | || |              | || |              | || |              | |
*| '--------------' || '--------------' || '--------------' || '--------------' || '--------------' |
*'----------------'  '----------------'  '----------------'  '----------------'  '----------------' 
*
 * Telegram: https://t.me/PepAIETH
 * Twitter: twitter.com/PepAIETH
 * Website: pepai.ai
 * Telegram bot: t.me/The_PepAI_bot
 * Total Supply: 1 Billion Tokens
 * Unlock rendering & Add our AI Bot to your Telegram channel at our homepage!
 * 
 * Set slippage to 4-5% : 1% to LP, 3% tax for Marketing & GPU Hosting 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 PepAI is ERC20, Ownable {
    // TOKENOMICS START ==========================================================>
    string private _name = "PepAI | PepAI.ai";
    string private _symbol = "PepAI";
    uint8 private _decimals = 9;
    uint256 private _supply = 1000000000;
    uint256 public taxForLiquidity = 47; //sniper protection, to be lowered to 1% after launch
    uint256 public taxForMarketing = 47; //sniper protection, to be lowered to 3% after launch
    uint256 public maxTxAmount = 10000001 * 10**_decimals;
    uint256 public maxWalletAmount = 10000001 * 10**_decimals;
    address public marketingWallet = 0xFDcA97889fC1686dE5DFB626023E8fbd49ff5Ba7;
    address public DEAD = 0x000000000000000000000000000000000000dEaD;
    uint256 public _marketingReserves = 0;
    mapping(address => bool) public _isExcludedFromFee;
    uint256 public numTokensSellToAddToLiquidity = 200000 * 10**_decimals;
    uint256 public numTokensSellToAddToETH = 100000 * 10**_decimals;

    function postLaunch() external onlyOwner {
        taxForLiquidity = 1;
        taxForMarketing = 3;
        maxTxAmount = 10000001 * 10**_decimals;
        maxWalletAmount = 10000001 * 10**_decimals;
    }
    // TOKENOMICS END ============================================================>

    // StableDiffusion 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);

    //with all eth payments, reserve is held on the contract until the sending threshold is reached.
    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);
    }

    //Some simple ABIv1 getters below
    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);
    }
    // StableDiffusion 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)
    {
        maxTxAmount = _maxTxAmount;

        return true;
    }

    function changeMaxWalletAmount(uint256 _maxWalletAmount)
        public
        onlyOwner
        returns (bool)
    {
        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":[{"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":"postLaunch","outputs":[],"stateMutability":"nonpayable","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"}]

60e0604052601060a09081526f5065704149207c2050657041492e616960801b60c052600690620000319082620006da565b50604080518082019091526005815264506570414960d81b60208201526007906200005d9082620006da565b506008805460ff19166009908117909155633b9aca008155602f600a818155600b919091556200008e9190620008bb565b6200009d9062989681620008d3565b600c55600854620000b39060ff16600a620008bb565b620000c29062989681620008d3565b600d55600e80546001600160a01b031990811673fdca97889fc1686de5dfb626023e8fbd49ff5ba717909155600f805490911661dead1790556000601055600854620001139060ff16600a620008bb565b620001229062030d40620008d3565b601255600854620001389060ff16600a620008bb565b6200014790620186a0620008d3565b601355662386f26fc10000601655600854620001689060ff16600a620008bb565b6200017690612710620008d3565b60175567016345785d8a0000601855600854620001989060ff16600a620008bb565b620001a790620186a0620008d3565b601955348015620001b757600080fd5b5060068054620001c7906200064b565b80601f0160208091040260200160405190810160405280929190818152602001828054620001f5906200064b565b8015620002465780601f106200021a5761010080835404028352916020019162000246565b820191906000526020600020905b8154815290600101906020018083116200022857829003601f168201915b5050505050600780546200025a906200064b565b80601f016020809104026020016040519081016040528092919081815260200182805462000288906200064b565b8015620002d95780601f10620002ad57610100808354040283529160200191620002d9565b820191906000526020600020905b815481529060010190602001808311620002bb57829003601f168201915b50505050508160039081620002ef9190620006da565b506004620002fe8282620006da565b5050506200031b620003156200051960201b60201c565b6200051d565b6008546200034a903390620003359060ff16600a620008bb565b600954620003449190620008d3565b6200056f565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d9050806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003a2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003c89190620008f5565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000416573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200043c9190620008f5565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200048a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004b09190620008f5565b601a80546001600160a01b0319166001600160a01b039283161790559081166080819052600090815260116020526040808220805460ff1990811660019081179092553384528284208054821683179055600e5490941683529120805490921617905562000936565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620005ca5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060026000828254620005de919062000920565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200066057607f821691505b6020821081036200068157634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620006d557600081815260208120601f850160051c81016020861015620006b05750805b601f850160051c820191505b81811015620006d157828155600101620006bc565b5050505b505050565b81516001600160401b03811115620006f657620006f662000635565b6200070e816200070784546200064b565b8462000687565b602080601f8311600181146200074657600084156200072d5750858301515b600019600386901b1c1916600185901b178555620006d1565b600085815260208120601f198616915b82811015620007775788860151825594840194600190910190840162000756565b5085821015620007965787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620007fd578160001904821115620007e157620007e1620007a6565b80851615620007ef57918102915b93841c9390800290620007c1565b509250929050565b6000826200081657506001620008b5565b816200082557506000620008b5565b81600181146200083e5760028114620008495762000869565b6001915050620008b5565b60ff8411156200085d576200085d620007a6565b50506001821b620008b5565b5060208310610133831016604e8410600b84101617156200088e575081810a620008b5565b6200089a8383620007bc565b8060001904821115620008b157620008b1620007a6565b0290505b92915050565b6000620008cc60ff84168362000805565b9392505050565b6000816000190483118215151615620008f057620008f0620007a6565b500290565b6000602082840312156200090857600080fd5b81516001600160a01b0381168114620008cc57600080fd5b80820180821115620008b557620008b5620007a6565b60805161291e620009756000396000818161037201528181611c5501528181611d0e01528181611d4a01528181611ed00152611f38015261291e6000f3fe60806040526004361061028c5760003560e01c8063768dc7101161015a578063af8af690116100c1578063df1d099e1161007a578063df1d099e146107a5578063df8408fe146107bb578063f1b2b3d9146107db578063f2fde38b146107fb578063f345bd851461081b578063fbee93ba1461083157600080fd5b8063af8af690146106f9578063b5c78e8a14610719578063bb85c6d114610739578063c0fdea5714610759578063d12a76881461076f578063dd62ed3e1461078557600080fd5b8063a2330d9711610113578063a2330d9714610658578063a3996f7b14610678578063a457c2d71461068d578063a9059cbb146106ad578063aa4bde28146106cd578063ad16a0cf146106e357600080fd5b8063768dc710146105a95780637930ef69146105d957806381bfdcca146105ef5780638c0b5e221461060f5780638da5cb5b1461062557806395d89b411461064357600080fd5b806330b63d80116101fe57806363cdf60f116101b757806363cdf60f146104ce578063677daa57146104fe57806370a082311461051e578063715018a61461055457806373c503b31461056957806375f0a8741461058957600080fd5b806330b63d801461041c578063313ce5671461043c578063395093511461045857806349bd5a5e146104785780634fa74c4d14610498578063527ffabd146104b857600080fd5b80631694505e116102505780631694505e1461036057806316a7b1601461039457806318160ddd146103a757806318bc47f6146103bc5780631b56bbf9146103dc57806323b872dd146103fc57600080fd5b806303fd2a4514610298578063054dee0f146102d557806306fdde03146102f9578063095ea7b31461031b5780630f1d7ad91461034b57600080fd5b3661029357005b600080fd5b3480156102a457600080fd5b50600f546102b8906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102e157600080fd5b506102eb60165481565b6040519081526020016102cc565b34801561030557600080fd5b5061030e610847565b6040516102cc919061200d565b34801561032757600080fd5b5061033b61033636600461203c565b6108d9565b60405190151581526020016102cc565b61035e61035936600461210b565b6108f3565b005b34801561036c57600080fd5b506102b87f000000000000000000000000000000000000000000000000000000000000000081565b61035e6103a236600461210b565b610aa5565b3480156103b357600080fd5b506002546102eb565b3480156103c857600080fd5b5061035e6103d7366004612158565b610c47565b3480156103e857600080fd5b5061035e6103f73660046121c8565b610d9f565b34801561040857600080fd5b5061033b6104173660046121e5565b610e49565b34801561042857600080fd5b5061033b610437366004612226565b610e6d565b34801561044857600080fd5b50604051600981526020016102cc565b34801561046457600080fd5b5061033b61047336600461203c565b610f16565b34801561048457600080fd5b50601a546102b8906001600160a01b031681565b3480156104a457600080fd5b5061033b6104b3366004612248565b610f38565b3480156104c457600080fd5b506102eb600b5481565b3480156104da57600080fd5b506104ee6104e936600461210b565b610f9b565b6040516102cc9493929190612296565b34801561050a57600080fd5b5061033b6105193660046122c5565b61105c565b34801561052a57600080fd5b506102eb6105393660046121c8565b6001600160a01b031660009081526020819052604090205490565b34801561056057600080fd5b5061035e611074565b34801561057557600080fd5b5061035e6105843660046122de565b611088565b34801561059557600080fd5b50600e546102b8906001600160a01b031681565b3480156105b557600080fd5b5061033b6105c43660046121c8565b60116020526000908152604090205460ff1681565b3480156105e557600080fd5b506102eb60185481565b3480156105fb57600080fd5b5061033b61060a3660046122c5565b611141565b34801561061b57600080fd5b506102eb600c5481565b34801561063157600080fd5b506005546001600160a01b03166102b8565b34801561064f57600080fd5b5061030e611154565b34801561066457600080fd5b506104ee61067336600461210b565b611163565b34801561068457600080fd5b5061035e611189565b34801561069957600080fd5b5061033b6106a836600461203c565b6111e2565b3480156106b957600080fd5b5061033b6106c836600461203c565b61125d565b3480156106d957600080fd5b506102eb600d5481565b3480156106ef57600080fd5b506102eb60135481565b34801561070557600080fd5b5061033b610714366004612226565b61126b565b34801561072557600080fd5b506102eb610734366004612248565b6112f4565b34801561074557600080fd5b5061033b6107543660046121c8565b61134f565b34801561076557600080fd5b506102eb60105481565b34801561077b57600080fd5b506102eb60125481565b34801561079157600080fd5b506102eb6107a036600461231a565b6113d2565b3480156107b157600080fd5b506102eb60195481565b3480156107c757600080fd5b5061035e6107d6366004612353565b6113fd565b3480156107e757600080fd5b506102eb6107f6366004612248565b611468565b34801561080757600080fd5b5061035e6108163660046121c8565b6114c3565b34801561082757600080fd5b506102eb600a5481565b34801561083d57600080fd5b506102eb60175481565b6060600380546108569061237f565b80601f01602080910402602001604051908101604052809291908181526020018280546108829061237f565b80156108cf5780601f106108a4576101008083540402835291602001916108cf565b820191906000526020600020905b8154815290600101906020018083116108b257829003601f168201915b5050505050905090565b6000336108e781858561153c565b60019150505b92915050565b6016543410156109415760405162461bcd60e51b81526020600482015260146024820152734e6f7420656e6f756768204554482073656e742160601b60448201526064015b60405180910390fd5b601754333110156109895760405162461bcd60e51b81526020600482015260126024820152714e6f7420656e6f75676820746f6b656e732160701b6044820152606401610938565b346010600082825461099b91906123cf565b9091555050600f546017546109bd9133916001600160a01b0390911690611660565b6040518060800160405280828152602001600115158152602001428152602001346015846040516109ee91906123e2565b908152602001604051809103902060030154610a0a91906123cf565b815250601582604051610a1d91906123e2565b90815260405190819003602001902081518190610a3a908261244c565b50602082015160018201805460ff19169115159190911790556040808301516002830155606090920151600390910155517f8382dfeb92e23123a91d983e4f179a9fbe329ff91e14e11cd3c3b5252f11512290610a9a908390429061250c565b60405180910390a150565b601654341015610aee5760405162461bcd60e51b81526020600482015260146024820152734e6f7420656e6f756768204554482073656e742160601b6044820152606401610938565b60175433311015610b365760405162461bcd60e51b81526020600482015260126024820152714e6f7420656e6f75676820746f6b656e732160701b6044820152606401610938565b3460106000828254610b4891906123cf565b9091555050600f54601754610b6a9133916001600160a01b0390911690611660565b604051806080016040528082815260200160011515815260200142815260200134601484604051610b9b91906123e2565b908152602001604051809103902060030154610bb791906123cf565b815250601482604051610bca91906123e2565b90815260405190819003602001902081518190610be7908261244c565b50602082015160018201805460ff19169115159190911790556040808301516002830155606090920151600390910155517f892c7b6af36dc1cd7c78d56ead1e536ddf81fe5688e6b3f631cdfadf7ad4c50890610a9a908390429061250c565b610c4f611a24565b8315610cd9576040518060800160405280868152602001841515815260200183815260200182815250601586604051610c8891906123e2565b90815260405190819003602001902081518190610ca5908261244c565b50602082015160018201805460ff191691151591909117905560408201516002820155606090910151600390910155610d59565b6040518060800160405280868152602001841515815260200183815260200182815250601486604051610d0c91906123e2565b90815260405190819003602001902081518190610d29908261244c565b50602082015160018201805460ff1916911515919091179055604082015160028201556060909101516003909101555b7fc7da2a9b77928245e263afcf4e639fd44ae7d1970e45b7c6ff1a952442938caf8585858585604051610d9095949392919061252e565b60405180910390a15050505050565b610da7611a24565b600f546001600160a01b0390811690821603610dd55760405162461bcd60e51b815260040161093890612565565b6001600160a01b038116610dfb5760405162461bcd60e51b815260040161093890612565565b601a80546001600160a01b0319166001600160a01b0383169081179091556040519081527f1d288f7aba265e8b154b112bbb631ceca5df5fe93a750b2fe042fd1cc826647f90602001610a9a565b600033610e57858285611a7e565b610e62858585611660565b506001949350505050565b6000610e77611a24565b6062600954610e8691906125ad565b8310610ea45760405162461bcd60e51b8152600401610938906125cf565b6062600954610eb391906125ad565b8210610ed15760405162461bcd60e51b8152600401610938906125cf565b600854610ee29060ff16600a612707565b610eec9084612716565b601255600854610f009060ff16600a612707565b610f0a9083612716565b60135550600192915050565b6000336108e7818585610f2983836113d2565b610f3391906123cf565b61153c565b60008115610f6d57601583604051610f5091906123e2565b9081526040519081900360200190206001015460ff1690506108ed565b601483604051610f7d91906123e2565b9081526040519081900360200190206001015460ff16905092915050565b8051602081830181018051601482529282019190930120915280548190610fc19061237f565b80601f0160208091040260200160405190810160405280929190818152602001828054610fed9061237f565b801561103a5780601f1061100f5761010080835404028352916020019161103a565b820191906000526020600020905b81548152906001019060200180831161101d57829003601f168201915b5050505060018301546002840154600390940154929360ff9091169290915084565b6000611066611a24565b50600c81905560015b919050565b61107c611a24565b6110866000611af2565b565b611090611a24565b82156110b05781156110a65760188190556110f8565b60168190556110f8565b81156110d9576008546110c79060ff16600a612707565b6110d19082612716565b6019556110f8565b6008546110ea9060ff16600a612707565b6110f49082612716565b6017555b60408051841515815283151560208201529081018290527fb87a29e1f0734b57d95308af5a136440c194441ac49edd417a1ed26aa78ceda29060600160405180910390a1505050565b600061114b611a24565b50600d55600190565b6060600480546108569061237f565b8051602081830181018051601582529282019190930120915280548190610fc19061237f565b611191611a24565b6001600a9081556003600b556008546111af9160ff90911690612707565b6111bc9062989681612716565b600c556008546111d09060ff16600a612707565b6111dd9062989681612716565b600d55565b600033816111f082866113d2565b9050838110156112505760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610938565b610e62828686840361153c565b6000336108e7818585611660565b6000611275611a24565b600a61128183856123cf565b11156112e55760405162461bcd60e51b815260206004820152602d60248201527f45524332303a20746f74616c20746178206d757374206e6f742062652067726560448201526c61746572207468616e2031302560981b6064820152608401610938565b50600a91909155600b55600190565b600081156113255760158360405161130c91906123e2565b90815260200160405180910390206003015490506108ed565b60148360405161133591906123e2565b908152602001604051809103902060030154905092915050565b6000611359611a24565b600f546001600160a01b03908116908316036113875760405162461bcd60e51b815260040161093890612565565b6001600160a01b0382166113ad5760405162461bcd60e51b815260040161093890612565565b50600e80546001600160a01b0383166001600160a01b03199091161790556001919050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b611405611a24565b6001600160a01b038216600081815260116020908152604091829020805460ff19168515159081179091558251938452908301527f318c131114339c004fff0a22fcdbbc0566bb2a7cd3aa1660e636ec5a66784ff2910160405180910390a15050565b600081156114995760158360405161148091906123e2565b90815260200160405180910390206002015490506108ed565b6014836040516114a991906123e2565b908152602001604051809103902060020154905092915050565b6114cb611a24565b6001600160a01b0381166115305760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610938565b61153981611af2565b50565b6001600160a01b03831661159e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610938565b6001600160a01b0382166115ff5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610938565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166116865760405162461bcd60e51b815260040161093890612735565b6001600160a01b0382166116ac5760405162461bcd60e51b81526004016109389061277a565b806116cc846001600160a01b031660009081526020819052604090205490565b10156116ea5760405162461bcd60e51b8152600401610938906127bd565b601a546001600160a01b03848116911614806117135750601a546001600160a01b038381169116145b80156117295750601a54600160a01b900460ff16155b15611a1457601a546001600160a01b038481169116146118165760105430600090815260208190526040812054909161176191612803565b9050601254811061177757611777601254611b44565b601354601054106118145761178d601354611beb565b601354601060008282546117a19190612803565b9091555050600e546040516000916001600160a01b0316904780156108fc029184818181858888f193505050509050806118125760405162461bcd60e51b815260206004820152601260248201527108cc2d2d8cac840e8de40e6cadcc8408aa8960731b6044820152606401610938565b505b505b6001600160a01b03831660009081526011602052604081205460ff168061185557506001600160a01b03831660009081526011602052604090205460ff165b15611861575080611a03565b600c548211156118d95760405162461bcd60e51b815260206004820152603960248201527f45524332303a207472616e7366657220616d6f756e742065786365656473207460448201527f6865206d6178207472616e73616374696f6e20616d6f756e74000000000000006064820152608401610938565b601a546001600160a01b039081169085160361198257600d546001600160a01b03841660009081526020819052604090205461191590846123cf565b11156119825760405162461bcd60e51b815260206004820152603660248201527f45524332303a2062616c616e636520616d6f756e74206578636565646564206d604482015275185e081dd85b1b195d08185b5bdd5b9d081b1a5b5a5d60521b6064820152608401610938565b60006064600b54846119949190612716565b61199e91906125ad565b905060006064600a54856119b29190612716565b6119bc91906125ad565b90506119c881836123cf565b6119d29085612803565b925081601060008282546119e691906123cf565b90915550611a00905086306119fb84866123cf565b611dcb565b50505b611a0e848483611dcb565b50505050565b611a1f838383611dcb565b505050565b6005546001600160a01b031633146110865760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610938565b6000611a8a84846113d2565b90506000198114611a0e5781811015611ae55760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610938565b611a0e848484840361153c565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b601a805460ff60a01b1916600160a01b1790556000611b646002836125ad565b90506000611b728284612803565b905047611b7e83611beb565b6000611b8a8247612803565b9050611b968382611eb7565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050601a805460ff60a01b19169055505050565b601a805460ff60a01b1916600160a01b1790556040805160028082526060820183526000926020830190803683370190505090503081600081518110611c3357611c33612816565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd5919061282c565b81600181518110611ce857611ce8612816565b60200260200101906001600160a01b031690816001600160a01b031681525050611d33307f00000000000000000000000000000000000000000000000000000000000000008461153c565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac94790611d88908590600090869030904290600401612849565b600060405180830381600087803b158015611da257600080fd5b505af1158015611db6573d6000803e3d6000fd5b5050601a805460ff60a01b1916905550505050565b6001600160a01b038316611df15760405162461bcd60e51b815260040161093890612735565b6001600160a01b038216611e175760405162461bcd60e51b81526004016109389061277a565b6001600160a01b03831660009081526020819052604090205481811015611e505760405162461bcd60e51b8152600401610938906127bd565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350505050565b601a805460ff60a01b1916600160a01b179055611ef5307f00000000000000000000000000000000000000000000000000000000000000008461153c565b600e5460405163f305d71960e01b81523060048201526024810184905260006044820181905260648201526001600160a01b0391821660848201524260a48201527f00000000000000000000000000000000000000000000000000000000000000009091169063f305d71990839060c40160606040518083038185885af1158015611f84573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611fa991906128ba565b5050601a805460ff60a01b19169055505050565b60005b83811015611fd8578181015183820152602001611fc0565b50506000910152565b60008151808452611ff9816020860160208601611fbd565b601f01601f19169290920160200192915050565b6020815260006120206020830184611fe1565b9392505050565b6001600160a01b038116811461153957600080fd5b6000806040838503121561204f57600080fd5b823561205a81612027565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261208f57600080fd5b813567ffffffffffffffff808211156120aa576120aa612068565b604051601f8301601f19908116603f011681019082821181831017156120d2576120d2612068565b816040528381528660208588010111156120eb57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561211d57600080fd5b813567ffffffffffffffff81111561213457600080fd5b6121408482850161207e565b949350505050565b8035801515811461106f57600080fd5b600080600080600060a0868803121561217057600080fd5b853567ffffffffffffffff81111561218757600080fd5b6121938882890161207e565b9550506121a260208701612148565b93506121b060408701612148565b94979396509394606081013594506080013592915050565b6000602082840312156121da57600080fd5b813561202081612027565b6000806000606084860312156121fa57600080fd5b833561220581612027565b9250602084013561221581612027565b929592945050506040919091013590565b6000806040838503121561223957600080fd5b50508035926020909101359150565b6000806040838503121561225b57600080fd5b823567ffffffffffffffff81111561227257600080fd5b61227e8582860161207e565b92505061228d60208401612148565b90509250929050565b6080815260006122a96080830187611fe1565b9415156020830152506040810192909252606090910152919050565b6000602082840312156122d757600080fd5b5035919050565b6000806000606084860312156122f357600080fd5b6122fc84612148565b925061230a60208501612148565b9150604084013590509250925092565b6000806040838503121561232d57600080fd5b823561233881612027565b9150602083013561234881612027565b809150509250929050565b6000806040838503121561236657600080fd5b823561237181612027565b915061228d60208401612148565b600181811c9082168061239357607f821691505b6020821081036123b357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156108ed576108ed6123b9565b600082516123f4818460208701611fbd565b9190910192915050565b601f821115611a1f57600081815260208120601f850160051c810160208610156124255750805b601f850160051c820191505b8181101561244457828155600101612431565b505050505050565b815167ffffffffffffffff81111561246657612466612068565b61247a81612474845461237f565b846123fe565b602080601f8311600181146124af57600084156124975750858301515b600019600386901b1c1916600185901b178555612444565b600085815260208120601f198616915b828110156124de578886015182559484019460019091019084016124bf565b50858210156124fc5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60408152600061251f6040830185611fe1565b90508260208301529392505050565b60a08152600061254160a0830188611fe1565b95151560208301525092151560408401526060830191909152608090910152919050565b60208082526028908201527f4c5020506169722063616e6e6f742062652074686520446561642077616c6c65604082015267742c206f7220302160c01b606082015260800190565b6000826125ca57634e487b7160e01b600052601260045260246000fd5b500490565b60208082526034908201527f43616e6e6f74206c6971756964617465206d6f7265207468616e203225206f666040820152732074686520737570706c79206174206f6e63652160601b606082015260800190565b600181815b8085111561265e578160001904821115612644576126446123b9565b8085161561265157918102915b93841c9390800290612628565b509250929050565b600082612675575060016108ed565b81612682575060006108ed565b816001811461269857600281146126a2576126be565b60019150506108ed565b60ff8411156126b3576126b36123b9565b50506001821b6108ed565b5060208310610133831016604e8410600b84101617156126e1575081810a6108ed565b6126eb8383612623565b80600019048211156126ff576126ff6123b9565b029392505050565b600061202060ff841683612666565b6000816000190483118215151615612730576127306123b9565b500290565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b818103818111156108ed576108ed6123b9565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561283e57600080fd5b815161202081612027565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156128995784516001600160a01b031683529383019391830191600101612874565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156128cf57600080fd5b835192506020840151915060408401519050925092509256fea264697066735822122056fccd316d92cc3f32da62cd82dbd797f3dd2891d02b6c8cbe02eb082e1166e564736f6c63430008100033

Deployed Bytecode

0x60806040526004361061028c5760003560e01c8063768dc7101161015a578063af8af690116100c1578063df1d099e1161007a578063df1d099e146107a5578063df8408fe146107bb578063f1b2b3d9146107db578063f2fde38b146107fb578063f345bd851461081b578063fbee93ba1461083157600080fd5b8063af8af690146106f9578063b5c78e8a14610719578063bb85c6d114610739578063c0fdea5714610759578063d12a76881461076f578063dd62ed3e1461078557600080fd5b8063a2330d9711610113578063a2330d9714610658578063a3996f7b14610678578063a457c2d71461068d578063a9059cbb146106ad578063aa4bde28146106cd578063ad16a0cf146106e357600080fd5b8063768dc710146105a95780637930ef69146105d957806381bfdcca146105ef5780638c0b5e221461060f5780638da5cb5b1461062557806395d89b411461064357600080fd5b806330b63d80116101fe57806363cdf60f116101b757806363cdf60f146104ce578063677daa57146104fe57806370a082311461051e578063715018a61461055457806373c503b31461056957806375f0a8741461058957600080fd5b806330b63d801461041c578063313ce5671461043c578063395093511461045857806349bd5a5e146104785780634fa74c4d14610498578063527ffabd146104b857600080fd5b80631694505e116102505780631694505e1461036057806316a7b1601461039457806318160ddd146103a757806318bc47f6146103bc5780631b56bbf9146103dc57806323b872dd146103fc57600080fd5b806303fd2a4514610298578063054dee0f146102d557806306fdde03146102f9578063095ea7b31461031b5780630f1d7ad91461034b57600080fd5b3661029357005b600080fd5b3480156102a457600080fd5b50600f546102b8906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102e157600080fd5b506102eb60165481565b6040519081526020016102cc565b34801561030557600080fd5b5061030e610847565b6040516102cc919061200d565b34801561032757600080fd5b5061033b61033636600461203c565b6108d9565b60405190151581526020016102cc565b61035e61035936600461210b565b6108f3565b005b34801561036c57600080fd5b506102b87f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b61035e6103a236600461210b565b610aa5565b3480156103b357600080fd5b506002546102eb565b3480156103c857600080fd5b5061035e6103d7366004612158565b610c47565b3480156103e857600080fd5b5061035e6103f73660046121c8565b610d9f565b34801561040857600080fd5b5061033b6104173660046121e5565b610e49565b34801561042857600080fd5b5061033b610437366004612226565b610e6d565b34801561044857600080fd5b50604051600981526020016102cc565b34801561046457600080fd5b5061033b61047336600461203c565b610f16565b34801561048457600080fd5b50601a546102b8906001600160a01b031681565b3480156104a457600080fd5b5061033b6104b3366004612248565b610f38565b3480156104c457600080fd5b506102eb600b5481565b3480156104da57600080fd5b506104ee6104e936600461210b565b610f9b565b6040516102cc9493929190612296565b34801561050a57600080fd5b5061033b6105193660046122c5565b61105c565b34801561052a57600080fd5b506102eb6105393660046121c8565b6001600160a01b031660009081526020819052604090205490565b34801561056057600080fd5b5061035e611074565b34801561057557600080fd5b5061035e6105843660046122de565b611088565b34801561059557600080fd5b50600e546102b8906001600160a01b031681565b3480156105b557600080fd5b5061033b6105c43660046121c8565b60116020526000908152604090205460ff1681565b3480156105e557600080fd5b506102eb60185481565b3480156105fb57600080fd5b5061033b61060a3660046122c5565b611141565b34801561061b57600080fd5b506102eb600c5481565b34801561063157600080fd5b506005546001600160a01b03166102b8565b34801561064f57600080fd5b5061030e611154565b34801561066457600080fd5b506104ee61067336600461210b565b611163565b34801561068457600080fd5b5061035e611189565b34801561069957600080fd5b5061033b6106a836600461203c565b6111e2565b3480156106b957600080fd5b5061033b6106c836600461203c565b61125d565b3480156106d957600080fd5b506102eb600d5481565b3480156106ef57600080fd5b506102eb60135481565b34801561070557600080fd5b5061033b610714366004612226565b61126b565b34801561072557600080fd5b506102eb610734366004612248565b6112f4565b34801561074557600080fd5b5061033b6107543660046121c8565b61134f565b34801561076557600080fd5b506102eb60105481565b34801561077b57600080fd5b506102eb60125481565b34801561079157600080fd5b506102eb6107a036600461231a565b6113d2565b3480156107b157600080fd5b506102eb60195481565b3480156107c757600080fd5b5061035e6107d6366004612353565b6113fd565b3480156107e757600080fd5b506102eb6107f6366004612248565b611468565b34801561080757600080fd5b5061035e6108163660046121c8565b6114c3565b34801561082757600080fd5b506102eb600a5481565b34801561083d57600080fd5b506102eb60175481565b6060600380546108569061237f565b80601f01602080910402602001604051908101604052809291908181526020018280546108829061237f565b80156108cf5780601f106108a4576101008083540402835291602001916108cf565b820191906000526020600020905b8154815290600101906020018083116108b257829003601f168201915b5050505050905090565b6000336108e781858561153c565b60019150505b92915050565b6016543410156109415760405162461bcd60e51b81526020600482015260146024820152734e6f7420656e6f756768204554482073656e742160601b60448201526064015b60405180910390fd5b601754333110156109895760405162461bcd60e51b81526020600482015260126024820152714e6f7420656e6f75676820746f6b656e732160701b6044820152606401610938565b346010600082825461099b91906123cf565b9091555050600f546017546109bd9133916001600160a01b0390911690611660565b6040518060800160405280828152602001600115158152602001428152602001346015846040516109ee91906123e2565b908152602001604051809103902060030154610a0a91906123cf565b815250601582604051610a1d91906123e2565b90815260405190819003602001902081518190610a3a908261244c565b50602082015160018201805460ff19169115159190911790556040808301516002830155606090920151600390910155517f8382dfeb92e23123a91d983e4f179a9fbe329ff91e14e11cd3c3b5252f11512290610a9a908390429061250c565b60405180910390a150565b601654341015610aee5760405162461bcd60e51b81526020600482015260146024820152734e6f7420656e6f756768204554482073656e742160601b6044820152606401610938565b60175433311015610b365760405162461bcd60e51b81526020600482015260126024820152714e6f7420656e6f75676820746f6b656e732160701b6044820152606401610938565b3460106000828254610b4891906123cf565b9091555050600f54601754610b6a9133916001600160a01b0390911690611660565b604051806080016040528082815260200160011515815260200142815260200134601484604051610b9b91906123e2565b908152602001604051809103902060030154610bb791906123cf565b815250601482604051610bca91906123e2565b90815260405190819003602001902081518190610be7908261244c565b50602082015160018201805460ff19169115159190911790556040808301516002830155606090920151600390910155517f892c7b6af36dc1cd7c78d56ead1e536ddf81fe5688e6b3f631cdfadf7ad4c50890610a9a908390429061250c565b610c4f611a24565b8315610cd9576040518060800160405280868152602001841515815260200183815260200182815250601586604051610c8891906123e2565b90815260405190819003602001902081518190610ca5908261244c565b50602082015160018201805460ff191691151591909117905560408201516002820155606090910151600390910155610d59565b6040518060800160405280868152602001841515815260200183815260200182815250601486604051610d0c91906123e2565b90815260405190819003602001902081518190610d29908261244c565b50602082015160018201805460ff1916911515919091179055604082015160028201556060909101516003909101555b7fc7da2a9b77928245e263afcf4e639fd44ae7d1970e45b7c6ff1a952442938caf8585858585604051610d9095949392919061252e565b60405180910390a15050505050565b610da7611a24565b600f546001600160a01b0390811690821603610dd55760405162461bcd60e51b815260040161093890612565565b6001600160a01b038116610dfb5760405162461bcd60e51b815260040161093890612565565b601a80546001600160a01b0319166001600160a01b0383169081179091556040519081527f1d288f7aba265e8b154b112bbb631ceca5df5fe93a750b2fe042fd1cc826647f90602001610a9a565b600033610e57858285611a7e565b610e62858585611660565b506001949350505050565b6000610e77611a24565b6062600954610e8691906125ad565b8310610ea45760405162461bcd60e51b8152600401610938906125cf565b6062600954610eb391906125ad565b8210610ed15760405162461bcd60e51b8152600401610938906125cf565b600854610ee29060ff16600a612707565b610eec9084612716565b601255600854610f009060ff16600a612707565b610f0a9083612716565b60135550600192915050565b6000336108e7818585610f2983836113d2565b610f3391906123cf565b61153c565b60008115610f6d57601583604051610f5091906123e2565b9081526040519081900360200190206001015460ff1690506108ed565b601483604051610f7d91906123e2565b9081526040519081900360200190206001015460ff16905092915050565b8051602081830181018051601482529282019190930120915280548190610fc19061237f565b80601f0160208091040260200160405190810160405280929190818152602001828054610fed9061237f565b801561103a5780601f1061100f5761010080835404028352916020019161103a565b820191906000526020600020905b81548152906001019060200180831161101d57829003601f168201915b5050505060018301546002840154600390940154929360ff9091169290915084565b6000611066611a24565b50600c81905560015b919050565b61107c611a24565b6110866000611af2565b565b611090611a24565b82156110b05781156110a65760188190556110f8565b60168190556110f8565b81156110d9576008546110c79060ff16600a612707565b6110d19082612716565b6019556110f8565b6008546110ea9060ff16600a612707565b6110f49082612716565b6017555b60408051841515815283151560208201529081018290527fb87a29e1f0734b57d95308af5a136440c194441ac49edd417a1ed26aa78ceda29060600160405180910390a1505050565b600061114b611a24565b50600d55600190565b6060600480546108569061237f565b8051602081830181018051601582529282019190930120915280548190610fc19061237f565b611191611a24565b6001600a9081556003600b556008546111af9160ff90911690612707565b6111bc9062989681612716565b600c556008546111d09060ff16600a612707565b6111dd9062989681612716565b600d55565b600033816111f082866113d2565b9050838110156112505760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610938565b610e62828686840361153c565b6000336108e7818585611660565b6000611275611a24565b600a61128183856123cf565b11156112e55760405162461bcd60e51b815260206004820152602d60248201527f45524332303a20746f74616c20746178206d757374206e6f742062652067726560448201526c61746572207468616e2031302560981b6064820152608401610938565b50600a91909155600b55600190565b600081156113255760158360405161130c91906123e2565b90815260200160405180910390206003015490506108ed565b60148360405161133591906123e2565b908152602001604051809103902060030154905092915050565b6000611359611a24565b600f546001600160a01b03908116908316036113875760405162461bcd60e51b815260040161093890612565565b6001600160a01b0382166113ad5760405162461bcd60e51b815260040161093890612565565b50600e80546001600160a01b0383166001600160a01b03199091161790556001919050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b611405611a24565b6001600160a01b038216600081815260116020908152604091829020805460ff19168515159081179091558251938452908301527f318c131114339c004fff0a22fcdbbc0566bb2a7cd3aa1660e636ec5a66784ff2910160405180910390a15050565b600081156114995760158360405161148091906123e2565b90815260200160405180910390206002015490506108ed565b6014836040516114a991906123e2565b908152602001604051809103902060020154905092915050565b6114cb611a24565b6001600160a01b0381166115305760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610938565b61153981611af2565b50565b6001600160a01b03831661159e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610938565b6001600160a01b0382166115ff5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610938565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166116865760405162461bcd60e51b815260040161093890612735565b6001600160a01b0382166116ac5760405162461bcd60e51b81526004016109389061277a565b806116cc846001600160a01b031660009081526020819052604090205490565b10156116ea5760405162461bcd60e51b8152600401610938906127bd565b601a546001600160a01b03848116911614806117135750601a546001600160a01b038381169116145b80156117295750601a54600160a01b900460ff16155b15611a1457601a546001600160a01b038481169116146118165760105430600090815260208190526040812054909161176191612803565b9050601254811061177757611777601254611b44565b601354601054106118145761178d601354611beb565b601354601060008282546117a19190612803565b9091555050600e546040516000916001600160a01b0316904780156108fc029184818181858888f193505050509050806118125760405162461bcd60e51b815260206004820152601260248201527108cc2d2d8cac840e8de40e6cadcc8408aa8960731b6044820152606401610938565b505b505b6001600160a01b03831660009081526011602052604081205460ff168061185557506001600160a01b03831660009081526011602052604090205460ff165b15611861575080611a03565b600c548211156118d95760405162461bcd60e51b815260206004820152603960248201527f45524332303a207472616e7366657220616d6f756e742065786365656473207460448201527f6865206d6178207472616e73616374696f6e20616d6f756e74000000000000006064820152608401610938565b601a546001600160a01b039081169085160361198257600d546001600160a01b03841660009081526020819052604090205461191590846123cf565b11156119825760405162461bcd60e51b815260206004820152603660248201527f45524332303a2062616c616e636520616d6f756e74206578636565646564206d604482015275185e081dd85b1b195d08185b5bdd5b9d081b1a5b5a5d60521b6064820152608401610938565b60006064600b54846119949190612716565b61199e91906125ad565b905060006064600a54856119b29190612716565b6119bc91906125ad565b90506119c881836123cf565b6119d29085612803565b925081601060008282546119e691906123cf565b90915550611a00905086306119fb84866123cf565b611dcb565b50505b611a0e848483611dcb565b50505050565b611a1f838383611dcb565b505050565b6005546001600160a01b031633146110865760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610938565b6000611a8a84846113d2565b90506000198114611a0e5781811015611ae55760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610938565b611a0e848484840361153c565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b601a805460ff60a01b1916600160a01b1790556000611b646002836125ad565b90506000611b728284612803565b905047611b7e83611beb565b6000611b8a8247612803565b9050611b968382611eb7565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050601a805460ff60a01b19169055505050565b601a805460ff60a01b1916600160a01b1790556040805160028082526060820183526000926020830190803683370190505090503081600081518110611c3357611c33612816565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd5919061282c565b81600181518110611ce857611ce8612816565b60200260200101906001600160a01b031690816001600160a01b031681525050611d33307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d8461153c565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac94790611d88908590600090869030904290600401612849565b600060405180830381600087803b158015611da257600080fd5b505af1158015611db6573d6000803e3d6000fd5b5050601a805460ff60a01b1916905550505050565b6001600160a01b038316611df15760405162461bcd60e51b815260040161093890612735565b6001600160a01b038216611e175760405162461bcd60e51b81526004016109389061277a565b6001600160a01b03831660009081526020819052604090205481811015611e505760405162461bcd60e51b8152600401610938906127bd565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350505050565b601a805460ff60a01b1916600160a01b179055611ef5307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d8461153c565b600e5460405163f305d71960e01b81523060048201526024810184905260006044820181905260648201526001600160a01b0391821660848201524260a48201527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063f305d71990839060c40160606040518083038185885af1158015611f84573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611fa991906128ba565b5050601a805460ff60a01b19169055505050565b60005b83811015611fd8578181015183820152602001611fc0565b50506000910152565b60008151808452611ff9816020860160208601611fbd565b601f01601f19169290920160200192915050565b6020815260006120206020830184611fe1565b9392505050565b6001600160a01b038116811461153957600080fd5b6000806040838503121561204f57600080fd5b823561205a81612027565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261208f57600080fd5b813567ffffffffffffffff808211156120aa576120aa612068565b604051601f8301601f19908116603f011681019082821181831017156120d2576120d2612068565b816040528381528660208588010111156120eb57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561211d57600080fd5b813567ffffffffffffffff81111561213457600080fd5b6121408482850161207e565b949350505050565b8035801515811461106f57600080fd5b600080600080600060a0868803121561217057600080fd5b853567ffffffffffffffff81111561218757600080fd5b6121938882890161207e565b9550506121a260208701612148565b93506121b060408701612148565b94979396509394606081013594506080013592915050565b6000602082840312156121da57600080fd5b813561202081612027565b6000806000606084860312156121fa57600080fd5b833561220581612027565b9250602084013561221581612027565b929592945050506040919091013590565b6000806040838503121561223957600080fd5b50508035926020909101359150565b6000806040838503121561225b57600080fd5b823567ffffffffffffffff81111561227257600080fd5b61227e8582860161207e565b92505061228d60208401612148565b90509250929050565b6080815260006122a96080830187611fe1565b9415156020830152506040810192909252606090910152919050565b6000602082840312156122d757600080fd5b5035919050565b6000806000606084860312156122f357600080fd5b6122fc84612148565b925061230a60208501612148565b9150604084013590509250925092565b6000806040838503121561232d57600080fd5b823561233881612027565b9150602083013561234881612027565b809150509250929050565b6000806040838503121561236657600080fd5b823561237181612027565b915061228d60208401612148565b600181811c9082168061239357607f821691505b6020821081036123b357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156108ed576108ed6123b9565b600082516123f4818460208701611fbd565b9190910192915050565b601f821115611a1f57600081815260208120601f850160051c810160208610156124255750805b601f850160051c820191505b8181101561244457828155600101612431565b505050505050565b815167ffffffffffffffff81111561246657612466612068565b61247a81612474845461237f565b846123fe565b602080601f8311600181146124af57600084156124975750858301515b600019600386901b1c1916600185901b178555612444565b600085815260208120601f198616915b828110156124de578886015182559484019460019091019084016124bf565b50858210156124fc5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60408152600061251f6040830185611fe1565b90508260208301529392505050565b60a08152600061254160a0830188611fe1565b95151560208301525092151560408401526060830191909152608090910152919050565b60208082526028908201527f4c5020506169722063616e6e6f742062652074686520446561642077616c6c65604082015267742c206f7220302160c01b606082015260800190565b6000826125ca57634e487b7160e01b600052601260045260246000fd5b500490565b60208082526034908201527f43616e6e6f74206c6971756964617465206d6f7265207468616e203225206f666040820152732074686520737570706c79206174206f6e63652160601b606082015260800190565b600181815b8085111561265e578160001904821115612644576126446123b9565b8085161561265157918102915b93841c9390800290612628565b509250929050565b600082612675575060016108ed565b81612682575060006108ed565b816001811461269857600281146126a2576126be565b60019150506108ed565b60ff8411156126b3576126b36123b9565b50506001821b6108ed565b5060208310610133831016604e8410600b84101617156126e1575081810a6108ed565b6126eb8383612623565b80600019048211156126ff576126ff6123b9565b029392505050565b600061202060ff841683612666565b6000816000190483118215151615612730576127306123b9565b500290565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b818103818111156108ed576108ed6123b9565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561283e57600080fd5b815161202081612027565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156128995784516001600160a01b031683529383019391830191600101612874565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156128cf57600080fd5b835192506020840151915060408401519050925092509256fea264697066735822122056fccd316d92cc3f32da62cd82dbd797f3dd2891d02b6c8cbe02eb082e1166e564736f6c63430008100033

Deployed Bytecode Sourcemap

29619:13506:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30306:64;;;;;;;;;;-1:-1:-1;30306:64:0;;;;-1:-1:-1;;;;;30306:64:0;;;;;;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;30306:64:0;;;;;;;;31431:36;;;;;;;;;;;;;;;;;;;368:25:1;;;356:2;341:18;31431:36:0;222:177:1;19337:102:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;21611:244::-;;;;;;;;;;-1:-1:-1;21611:244:0;;;;;:::i;:::-;;:::i;:::-;;;1781:14:1;;1774:22;1756:41;;1744:2;1729:18;21611:244:0;1616:187:1;32765:594:0;;;;;;:::i;:::-;;:::i;:::-;;35558:51;;;;;;;;;;;;;;;32181:576;;;;;;:::i;:::-;;:::i;20475:110::-;;;;;;;;;;-1:-1:-1;20565:12:0;;20475:110;;34239:694;;;;;;;;;;-1:-1:-1;34239:694:0;;;;;:::i;:::-;;:::i;36823:288::-;;;;;;;;;;-1:-1:-1;36823:288:0;;;;;:::i;:::-;;:::i;22435:297::-;;;;;;;;;;-1:-1:-1;22435:297:0;;;;;:::i;:::-;;:::i;42087:602::-;;;;;;;;;;-1:-1:-1;42087:602:0;;;;;:::i;:::-;;:::i;20318:92::-;;;;;;;;;;-1:-1:-1;20318:92:0;;20401:1;5099:36:1;;5087:2;5072:18;20318:92:0;4957:184:1;24151:272:0;;;;;;;;;;-1:-1:-1;24151:272:0;;;;;:::i;:::-;;:::i;35616:28::-;;;;;;;;;;-1:-1:-1;35616:28:0;;;;-1:-1:-1;;;;;35616:28:0;;;33406:254;;;;;;;;;;-1:-1:-1;33406:254:0;;;;;:::i;:::-;;:::i;30004:35::-;;;;;;;;;;;;;;;;31309:50;;;;;;;;;;-1:-1:-1;31309:50:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;42697:182::-;;;;;;;;;;-1:-1:-1;42697:182:0;;;;;:::i;:::-;;:::i;19502:177::-;;;;;;;;;;-1:-1:-1;19502:177:0;;;;;:::i;:::-;-1:-1:-1;;;;;19653:18:0;19621:7;19653:18;;;;;;;;;;;;19502:177;16596:103;;;;;;;;;;;;;:::i;34941:524::-;;;;;;;;;;-1:-1:-1;34941:524:0;;;;;:::i;:::-;;:::i;30224:75::-;;;;;;;;;;-1:-1:-1;30224:75:0;;;;-1:-1:-1;;;;;30224:75:0;;;30421:50;;;;;;;;;;-1:-1:-1;30421:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;31533:38;;;;;;;;;;;;;;;;42887:198;;;;;;;;;;-1:-1:-1;42887:198:0;;;;;:::i;:::-;;:::i;30100:53::-;;;;;;;;;;;;;;;;15948:87;;;;;;;;;;-1:-1:-1;16021:6:0;;-1:-1:-1;;;;;16021:6:0;15948:87;;19161:106;;;;;;;;;;;;;:::i;31366:56::-;;;;;;;;;;-1:-1:-1;31366:56:0;;;;;:::i;:::-;;:::i;30626:211::-;;;;;;;;;;;;;:::i;23235:507::-;;;;;;;;;;-1:-1:-1;23235:507:0;;;;;:::i;:::-;;:::i;21055:236::-;;;;;;;;;;-1:-1:-1;21055:236:0;;;;;:::i;:::-;;:::i;30160:57::-;;;;;;;;;;;;;;;;30554:63;;;;;;;;;;;;;;;;41688:391;;;;;;;;;;-1:-1:-1;41688:391:0;;;;;:::i;:::-;;:::i;33668:262::-;;;;;;;;;;-1:-1:-1;33668:262:0;;;;;:::i;:::-;;:::i;41330:350::-;;;;;;;;;;-1:-1:-1;41330:350:0;;;;;:::i;:::-;;:::i;30377:37::-;;;;;;;;;;;;;;;;30478:69;;;;;;;;;;;;;;;;20648:201;;;;;;;;;;-1:-1:-1;20648:201:0;;;;;:::i;:::-;;:::i;31578:54::-;;;;;;;;;;;;;;;;39741:189;;;;;;;;;;-1:-1:-1;39741:189:0;;;;;:::i;:::-;;:::i;33938:262::-;;;;;;;;;;-1:-1:-1;33938:262:0;;;;;:::i;:::-;;:::i;16854:238::-;;;;;;;;;;-1:-1:-1;16854:238:0;;;;;:::i;:::-;;:::i;29908:35::-;;;;;;;;;;;;;;;;31474:50;;;;;;;;;;;;;;;;19337:102;19393:13;19426:5;19419:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19337:102;:::o;21611:244::-;21732:4;14821:10;21793:32;14821:10;21809:7;21818:6;21793:8;:32::i;:::-;21843:4;21836:11;;;21611:244;;;;;:::o;32765:594::-;32863:11;;32850:9;:24;;32842:57;;;;-1:-1:-1;;;32842:57:0;;7797:2:1;32842:57:0;;;7779:21:1;7836:2;7816:18;;;7809:30;-1:-1:-1;;;7855:18:1;;;7848:50;7915:18;;32842:57:0;;;;;;;;;32940:14;;32918:10;:18;:36;;32910:67;;;;-1:-1:-1;;;32910:67:0;;8146:2:1;32910:67:0;;;8128:21:1;8185:2;8165:18;;;8158:30;-1:-1:-1;;;8204:18:1;;;8197:48;8262:18;;32910:67:0;7944:342:1;32910:67:0;33010:9;32988:18;;:31;;;;;;;:::i;:::-;;;;-1:-1:-1;;33052:4:0;;33058:14;;33030:43;;33040:10;;-1:-1:-1;;;;;33052:4:0;;;;33030:9;:43::i;:::-;33125:166;;;;;;;;33153:10;33125:166;;;;33178:4;33125:166;;;;;;33197:15;33125:166;;;;33271:9;33227:16;33244:10;33227:28;;;;;;:::i;:::-;;;;;;;;;;;;;:41;;;:53;;;;:::i;:::-;33125:166;;;33094:16;33111:10;33094:28;;;;;;:::i;:::-;;;;;;;;;;;;;;:197;;:28;;:197;;:28;:197;:::i;:::-;-1:-1:-1;33094:197:0;;;;;;;;;-1:-1:-1;;33094:197:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33307:44;;;;;33323:10;;33335:15;;33307:44;:::i;:::-;;;;;;;;32765:594;:::o;32181:576::-;32277:11;;32264:9;:24;;32256:57;;;;-1:-1:-1;;;32256:57:0;;7797:2:1;32256:57:0;;;7779:21:1;7836:2;7816:18;;;7809:30;-1:-1:-1;;;7855:18:1;;;7848:50;7915:18;;32256:57:0;7595:344:1;32256:57:0;32354:14;;32332:10;:18;:36;;32324:67;;;;-1:-1:-1;;;32324:67:0;;8146:2:1;32324:67:0;;;8128:21:1;8185:2;8165:18;;;8158:30;-1:-1:-1;;;8204:18:1;;;8197:48;8262:18;;32324:67:0;7944:342:1;32324:67:0;32424:9;32402:18;;:31;;;;;;;:::i;:::-;;;;-1:-1:-1;;32466:4:0;;32472:14;;32444:43;;32454:10;;-1:-1:-1;;;;;32466:4:0;;;;32444:9;:43::i;:::-;32529:162;;;;;;;;32554:11;32529:162;;;;32580:4;32529:162;;;;;;32599:15;32529:162;;;;32671:9;32629:13;32643:11;32629:26;;;;;;:::i;:::-;;;;;;;;;;;;;:39;;;:51;;;;:::i;:::-;32529:162;;;32500:13;32514:11;32500:26;;;;;;:::i;:::-;;;;;;;;;;;;;;:191;;:26;;:191;;:26;:191;:::i;:::-;-1:-1:-1;32500:191:0;;;;;;;;;-1:-1:-1;;32500:191:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32707:42;;;;;32720:11;;32733:15;;32707:42;:::i;34239:694::-;15834:13;:11;:13::i;:::-;34405:10:::1;34401:430;;;34465:147;;;;;;;;34497:12;34465:147;;;;34528:11;34465:147;;;;;;34558:12;34465:147;;;;34589:8;34465:147;;::::0;34432:16:::1;34449:12;34432:30;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:180;;:30;;:180:::1;::::0;:30;:180:::1;:::i;:::-;-1:-1:-1::0;34432:180:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;-1:-1:-1;;34432:180:0::1;::::0;::::1;;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;34401:430:::1;;;34675:144;;;;;;;;34704:12;34675:144;;;;34735:11;34675:144;;;;;;34765:12;34675:144;;;;34796:8;34675:144;;::::0;34645:13:::1;34659:12;34645:27;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:174;;:27;;:174:::1;::::0;:27;:174:::1;:::i;:::-;-1:-1:-1::0;34645:174:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;-1:-1:-1;;34645:174:0::1;::::0;::::1;;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;34401:430:::1;34846:79;34863:12;34877:10;34889:11;34902:12;34916:8;34846:79;;;;;;;;;;:::i;:::-;;;;;;;;34239:694:::0;;;;;:::o;36823:288::-;15834:13;:11;:13::i;:::-;36905:4:::1;::::0;-1:-1:-1;;;;;36905:4:0;;::::1;36896:13:::0;;::::1;::::0;36888:66:::1;;;;-1:-1:-1::0;;;36888:66:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;36973:19:0;::::1;36965:72;;;;-1:-1:-1::0;;;36965:72:0::1;;;;;;;:::i;:::-;37048:13;:21:::0;;-1:-1:-1;;;;;;37048:21:0::1;-1:-1:-1::0;;;;;37048:21:0;::::1;::::0;;::::1;::::0;;;37085:18:::1;::::0;160:51:1;;;37085:18:0::1;::::0;148:2:1;133:18;37085::0::1;14:203:1::0;22435:297:0;22568:4;14821:10;22626:38;22642:4;14821:10;22657:6;22626:15;:38::i;:::-;22675:27;22685:4;22691:2;22695:6;22675:9;:27::i;:::-;-1:-1:-1;22720:4:0;;22435:297;-1:-1:-1;;;;22435:297:0:o;42087:602::-;42244:4;15834:13;:11;:13::i;:::-;42317:2:::1;42307:7;;:12;;;;:::i;:::-;42274:30;:45;42266:110;;;;-1:-1:-1::0;;;42266:110:0::1;;;;;;;:::i;:::-;42432:2;42422:7;;:12;;;;:::i;:::-;42395:24;:39;42387:104;;;;-1:-1:-1::0;;;42387:104:0::1;;;;;;;:::i;:::-;42571:9;::::0;42567:13:::1;::::0;42571:9:::1;;42567:2;:13;:::i;:::-;42534:46;::::0;:30;:46:::1;:::i;:::-;42502:29;:78:::0;42648:9:::1;::::0;42644:13:::1;::::0;42648:9:::1;;42644:2;:13;:::i;:::-;42617:40;::::0;:24;:40:::1;:::i;:::-;42591:23;:66:::0;-1:-1:-1;42677:4:0::1;42087:602:::0;;;;:::o;24151:272::-;24268:4;14821:10;24329:64;14821:10;24345:7;24382:10;24354:25;14821:10;24345:7;24354:9;:25::i;:::-;:38;;;;:::i;:::-;24329:8;:64::i;33406:254::-;33493:4;33514:10;33510:89;;;33548:16;33565:12;33548:30;;;;;;:::i;:::-;;;;;;;;;;;;;;:39;;;;;;-1:-1:-1;33541:46:0;;33510:89;33616:13;33630:12;33616:27;;;;;;:::i;:::-;;;;;;;;;;;;;;:36;;;;;;-1:-1:-1;33406:254:0;;;;:::o;31309:50::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;31309:50:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31309:50:0;:::o;42697:182::-;42799:4;15834:13;:11;:13::i;:::-;-1:-1:-1;42821:11:0::1;:26:::0;;;42867:4:::1;15858:1;42697:182:::0;;;:::o;16596:103::-;15834:13;:11;:13::i;:::-;16661:30:::1;16688:1;16661:18;:30::i;:::-;16596:103::o:0;34941:524::-;15834:13;:11;:13::i;:::-;35034:6:::1;35030:374;;;35061:10;35057:133;;;35092:14;:22:::0;;;35030:374:::1;;35057:133;35155:11;:19:::0;;;35030:374:::1;;;35226:10;35222:171;;;35289:9;::::0;35285:13:::1;::::0;35289:9:::1;;35285:2;:13;:::i;:::-;35277:21;::::0;:5;:21:::1;:::i;:::-;35257:17;:41:::0;35222:171:::1;;;35368:9;::::0;35364:13:::1;::::0;35368:9:::1;;35364:2;:13;:::i;:::-;35356:21;::::0;:5;:21:::1;:::i;:::-;35339:14;:38:::0;35222:171:::1;35419:38;::::0;;14702:14:1;;14695:22;14677:41;;14761:14;;14754:22;14749:2;14734:18;;14727:50;14793:18;;;14786:34;;;35419:38:0::1;::::0;14665:2:1;14650:18;35419:38:0::1;;;;;;;34941:524:::0;;;:::o;42887:198::-;42997:4;15834:13;:11;:13::i;:::-;-1:-1:-1;43019:15:0::1;:34:::0;43073:4:::1;::::0;42887:198::o;19161:106::-;19219:13;19252:7;19245:14;;;;;:::i;31366:56::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;30626:211::-;15834:13;:11;:13::i;:::-;30696:1:::1;30678:15;:19:::0;;;30726:1:::1;30708:15;:19:::0;30767:9:::1;::::0;30763:13:::1;::::0;30767:9:::1;::::0;;::::1;::::0;30763:13:::1;:::i;:::-;30752:24;::::0;:8:::1;:24;:::i;:::-;30738:11;:38:::0;30820:9:::1;::::0;30816:13:::1;::::0;30820:9:::1;;30816:2;:13;:::i;:::-;30805:24;::::0;:8:::1;:24;:::i;:::-;30787:15;:42:::0;30626:211::o;23235:507::-;23357:4;14821:10;23357:4;23445:25;14821:10;23462:7;23445:9;:25::i;:::-;23418:52;;23523:15;23503:16;:35;;23481:122;;;;-1:-1:-1;;;23481:122:0;;15033:2:1;23481:122:0;;;15015:21:1;15072:2;15052:18;;;15045:30;15111:34;15091:18;;;15084:62;-1:-1:-1;;;15162:18:1;;;15155:35;15207:19;;23481:122:0;14831:401:1;23481:122:0;23639:60;23648:5;23655:7;23683:15;23664:16;:34;23639:8;:60::i;21055:236::-;21172:4;14821:10;21233:28;14821:10;21250:2;21254:6;21233:9;:28::i;41688:391::-;41836:4;15834:13;:11;:13::i;:::-;41905:2:::1;41867:33;41884:16:::0;41867;:33:::1;:::i;:::-;41866:41;;41858:99;;;::::0;-1:-1:-1;;;41858:99:0;;15439:2:1;41858:99:0::1;::::0;::::1;15421:21:1::0;15478:2;15458:18;;;15451:30;15517:34;15497:18;;;15490:62;-1:-1:-1;;;15568:18:1;;;15561:43;15621:19;;41858:99:0::1;15237:409:1::0;41858:99:0::1;-1:-1:-1::0;41968:15:0::1;:34:::0;;;;42013:15:::1;:34:::0;42067:4:::1;::::0;41688:391::o;33668:262::-;33755:4;33776:10;33772:93;;;33810:16;33827:12;33810:30;;;;;;:::i;:::-;;;;;;;;;;;;;:43;;;33803:50;;;;33772:93;33882:13;33896:12;33882:27;;;;;;:::i;:::-;;;;;;;;;;;;;:40;;;33875:47;;33668:262;;;;:::o;41330:350::-;41433:4;15834:13;:11;:13::i;:::-;41476:4:::1;::::0;-1:-1:-1;;;;;41476:4:0;;::::1;41463:17:::0;;::::1;::::0;41455:70:::1;;;;-1:-1:-1::0;;;41455:70:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;41544:23:0;::::1;41536:76;;;;-1:-1:-1::0;;;41536:76:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;41623:15:0::1;:27:::0;;-1:-1:-1;;;;;41623:27:0;::::1;-1:-1:-1::0;;;;;;41623:27:0;;::::1;;::::0;;;41330:350;;;:::o;20648:201::-;-1:-1:-1;;;;;20814:18:0;;;20782:7;20814:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;20648:201::o;39741:189::-;15834:13;:11;:13::i;:::-;-1:-1:-1;;;;;39827:28:0;::::1;;::::0;;;:18:::1;:28;::::0;;;;;;;;:38;;-1:-1:-1;;39827:38:0::1;::::0;::::1;;::::0;;::::1;::::0;;;39881:41;;15819:51:1;;;15886:18;;;15879:50;39881:41:0::1;::::0;15792:18:1;39881:41:0::1;;;;;;;39741:189:::0;;:::o;33938:262::-;34029:4;34050:10;34046:91;;;34084:16;34101:12;34084:30;;;;;;:::i;:::-;;;;;;;;;;;;;:41;;;34077:48;;;;34046:91;34154:13;34168:12;34154:27;;;;;;:::i;:::-;;;;;;;;;;;;;:38;;;34147:45;;33938:262;;;;:::o;16854:238::-;15834:13;:11;:13::i;:::-;-1:-1:-1;;;;;16957:22:0;::::1;16935:110;;;::::0;-1:-1:-1;;;16935:110:0;;16142:2:1;16935:110:0::1;::::0;::::1;16124:21:1::0;16181:2;16161:18;;;16154:30;16220:34;16200:18;;;16193:62;-1:-1:-1;;;16271:18:1;;;16264:36;16317:19;;16935:110:0::1;15940:402:1::0;16935:110:0::1;17056:28;17075:8;17056:18;:28::i;:::-;16854:238:::0;:::o;26458:380::-;-1:-1:-1;;;;;26594:19:0;;26586:68;;;;-1:-1:-1;;;26586:68:0;;16549:2:1;26586:68:0;;;16531:21:1;16588:2;16568:18;;;16561:30;16627:34;16607:18;;;16600:62;-1:-1:-1;;;16678:18:1;;;16671:34;16722:19;;26586:68:0;16347:400:1;26586:68:0;-1:-1:-1;;;;;26673:21:0;;26665:68;;;;-1:-1:-1;;;26665:68:0;;16954:2:1;26665:68:0;;;16936:21:1;16993:2;16973:18;;;16966:30;17032:34;17012:18;;;17005:62;-1:-1:-1;;;17083:18:1;;;17076:32;17125:19;;26665:68:0;16752:398:1;26665:68:0;-1:-1:-1;;;;;26746:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;26798:32;;368:25:1;;;26798:32:0;;341:18:1;26798:32:0;;;;;;;26458:380;;;:::o;37589:2144::-;-1:-1:-1;;;;;37687:18:0;;37679:68;;;;-1:-1:-1;;;37679:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37766:16:0;;37758:64;;;;-1:-1:-1;;;37758:64:0;;;;;;;:::i;:::-;37860:6;37841:15;37851:4;-1:-1:-1;;;;;19653:18:0;19621:7;19653:18;;;;;;;;;;;;19502:177;37841:15;:25;;37833:76;;;;-1:-1:-1;;;37833:76:0;;;;;;;:::i;:::-;37935:13;;-1:-1:-1;;;;;37927:21:0;;;37935:13;;37927:21;;:44;;-1:-1:-1;37958:13:0;;-1:-1:-1;;;;;37952:19:0;;;37958:13;;37952:19;37927:44;37926:67;;;;-1:-1:-1;37977:16:0;;-1:-1:-1;;;37977:16:0;;;;37976:17;37926:67;37922:1804;;;38022:13;;-1:-1:-1;;;;;38014:21:0;;;38022:13;;38014:21;38010:681;;38118:18;;38109:4;38056:32;19653:18;;;;;;;;;;;38056:32;;38091:45;;;:::i;:::-;38056:80;;38187:29;;38159:24;:57;38155:152;;38241:46;38257:29;;38241:15;:46::i;:::-;38353:23;;38330:18;;38329:47;38325:351;;38401:42;38419:23;;38401:17;:42::i;:::-;38488:23;;38466:18;;:45;;;;;;;:::i;:::-;;;;-1:-1:-1;;38554:15:0;;38546:52;;38534:9;;-1:-1:-1;;;;;38554:15:0;;38576:21;38546:52;;;;;38534:9;38546:52;38534:9;38546:52;38576:21;38554:15;38546:52;;;;;;;38534:64;;38629:4;38621:35;;;;-1:-1:-1;;;38621:35:0;;18707:2:1;38621:35:0;;;18689:21:1;18746:2;18726:18;;;18719:30;-1:-1:-1;;;18765:18:1;;;18758:48;18823:18;;38621:35:0;18505:342:1;38621:35:0;38378:298;38325:351;38037:654;38010:681;-1:-1:-1;;;;;38748:24:0;;38707:22;38748:24;;;:18;:24;;;;;;;;;:50;;-1:-1:-1;;;;;;38776:22:0;;;;;;:18;:22;;;;;;;;38748:50;38744:839;;;-1:-1:-1;38836:6:0;38744:839;;;38915:11;;38905:6;:21;;38897:91;;;;-1:-1:-1;;;38897:91:0;;19054:2:1;38897:91:0;;;19036:21:1;19093:2;19073:18;;;19066:30;19132:34;19112:18;;;19105:62;19203:27;19183:18;;;19176:55;19248:19;;38897:91:0;18852:421:1;38897:91:0;39018:13;;-1:-1:-1;;;;;39018:13:0;;;39010:21;;;;39007:178;;39091:15;;-1:-1:-1;;;;;19653:18:0;;19621:7;19653:18;;;;;;;;;;;39064:22;;:6;:22;:::i;:::-;39063:43;;39055:110;;;;-1:-1:-1;;;39055:110:0;;19480:2:1;39055:110:0;;;19462:21:1;19519:2;19499:18;;;19492:30;19558:34;19538:18;;;19531:62;-1:-1:-1;;;19609:18:1;;;19602:52;19671:19;;39055:110:0;19278:418:1;39055:110:0;39205:22;39260:3;39241:15;;39232:6;:24;;;;:::i;:::-;39231:32;;;;:::i;:::-;39205:59;;39283:22;39338:3;39319:15;;39310:6;:24;;;;:::i;:::-;39309:32;;;;:::i;:::-;39283:59;-1:-1:-1;39388:31:0;39283:59;39388:14;:31;:::i;:::-;39378:42;;:6;:42;:::i;:::-;39361:59;;39461:14;39439:18;;:36;;;;;;;:::i;:::-;;;;-1:-1:-1;39496:71:0;;-1:-1:-1;39512:4:0;39526;39534:31;39551:14;39534;:31;:::i;:::-;39496:15;:71::i;:::-;38878:705;;38744:839;39597:41;39613:4;39619:2;39623:14;39597:15;:41::i;:::-;37995:1655;37589:2144;;;:::o;37922:1804::-;39681:33;39697:4;39703:2;39707:6;39681:15;:33::i;:::-;37589:2144;;;:::o;16113:132::-;16021:6;;-1:-1:-1;;;;;16021:6:0;14821:10;16177:23;16169:68;;;;-1:-1:-1;;;16169:68:0;;19903:2:1;16169:68:0;;;19885:21:1;;;19922:18;;;19915:30;19981:34;19961:18;;;19954:62;20033:18;;16169:68:0;19701:356:1;27129:502:0;27264:24;27291:25;27301:5;27308:7;27291:9;:25::i;:::-;27264:52;;-1:-1:-1;;27331:16:0;:37;27327:297;;27431:6;27411:16;:26;;27385:117;;;;-1:-1:-1;;;27385:117:0;;20264:2:1;27385:117:0;;;20246:21:1;20303:2;20283:18;;;20276:30;20342:31;20322:18;;;20315:59;20391:18;;27385:117:0;20062:353:1;27385:117:0;27546:51;27555:5;27562:7;27590:6;27571:16;:25;27546:8;:51::i;17252:191::-;17345:6;;;-1:-1:-1;;;;;17362:17:0;;;-1:-1:-1;;;;;;17362:17:0;;;;;;;17395:40;;17345:6;;;17362:17;17345:6;;17395:40;;17326:16;;17395:40;17315:128;17252:191;:::o;39938:474::-;35856:16;:23;;-1:-1:-1;;;;35856:23:0;-1:-1:-1;;;35856:23:0;;;;40040:24:::1;40063:1;40040:20:::0;:24:::1;:::i;:::-;40024:41:::0;-1:-1:-1;40076:17:0::1;40097:27;40024:41:::0;40097:20;:27:::1;:::i;:::-;40076:49:::0;-1:-1:-1;40163:21:0::1;40197:23;40215:4:::0;40197:17:::1;:23::i;:::-;40233:18;40255:38;40279:14:::0;40255:21:::1;:38;:::i;:::-;40233:61;;40307:36;40321:9;40332:10;40307:13;:36::i;:::-;40361:43;::::0;;20622:25:1;;;20678:2;20663:18;;20656:34;;;20706:18;;;20699:34;;;40361:43:0::1;::::0;20610:2:1;20595:18;40361:43:0::1;;;;;;;-1:-1:-1::0;;35902:16:0;:24;;-1:-1:-1;;;;35902:24:0;;;-1:-1:-1;;;39938:474:0:o;40420:488::-;35856:16;:23;;-1:-1:-1;;;;35856:23:0;-1:-1:-1;;;35856:23:0;;;40523:16:::1;::::0;;40537:1:::1;40523:16:::0;;;;;::::1;::::0;;-1:-1:-1;;40523:16:0::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;40523:16:0::1;40499:40;;40568:4;40550;40555:1;40550:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1::0;;;;;40550:23:0::1;;;-1:-1:-1::0;;;;;40550:23:0::1;;;::::0;::::1;40594:15;-1:-1:-1::0;;;;;40594:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40584:4;40589:1;40584:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1::0;;;;;40584:32:0::1;;;-1:-1:-1::0;;;;;40584:32:0::1;;;::::0;::::1;40629:62;40646:4;40661:15;40679:11;40629:8;:62::i;:::-;40704:196;::::0;-1:-1:-1;;;40704:196:0;;-1:-1:-1;;;;;40704:15:0::1;:66;::::0;::::1;::::0;:196:::1;::::0;40785:11;;40811:1:::1;::::0;40827:4;;40854::::1;::::0;40874:15:::1;::::0;40704:196:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;35902:16:0;:24;;-1:-1:-1;;;;35902:24:0;;;-1:-1:-1;;;;40420:488:0:o;27639:776::-;-1:-1:-1;;;;;27770:18:0;;27762:68;;;;-1:-1:-1;;;27762:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27849:16:0;;27841:64;;;;-1:-1:-1;;;27841:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27940:15:0;;27918:19;27940:15;;;;;;;;;;;27988:21;;;;27966:109;;;;-1:-1:-1;;;27966:109:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28111:15:0;;;:9;:15;;;;;;;;;;;28129:20;;;28111:38;;28329:13;;;;;;;;;;:23;;;;;;28381:26;;368:25:1;;;28329:13:0;;28381:26;;341:18:1;28381:26:0;;;;;;;27751:664;27639:776;;;:::o;40916:406::-;35856:16;:23;;-1:-1:-1;;;;35856:23:0;-1:-1:-1;;;35856:23:0;;;41033:62:::1;41050:4;41065:15;41083:11:::0;41033:8:::1;:62::i;:::-;41258:15;::::0;41108:206:::1;::::0;-1:-1:-1;;;41108:206:0;;41180:4:::1;41108:206;::::0;::::1;22458:34:1::0;22508:18;;;22501:34;;;41226:1:0::1;22551:18:1::0;;;22544:34;;;22594:18;;;22587:34;-1:-1:-1;;;;;41258:15:0;;::::1;22637:19:1::0;;;22630:44;41288:15:0::1;22690:19:1::0;;;22683:35;41108:15:0::1;:31:::0;;::::1;::::0;::::1;::::0;41147:9;;22392:19:1;;41108:206:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;35902:16:0;:24;;-1:-1:-1;;;;35902:24:0;;;-1:-1:-1;;;40916: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;17155:401::-;17357:2;17339:21;;;17396:2;17376:18;;;17369:30;17435:34;17430:2;17415:18;;17408:62;-1:-1:-1;;;17501:2:1;17486:18;;17479:35;17546:3;17531:19;;17155:401::o;17561:399::-;17763:2;17745:21;;;17802:2;17782:18;;;17775:30;17841:34;17836:2;17821:18;;17814:62;-1:-1:-1;;;17907:2:1;17892:18;;17885:33;17950:3;17935:19;;17561:399::o;17965:402::-;18167:2;18149:21;;;18206:2;18186:18;;;18179:30;18245:34;18240:2;18225:18;;18218:62;-1:-1:-1;;;18311:2:1;18296:18;;18289:36;18357:3;18342:19;;17965:402::o;18372:128::-;18439:9;;;18460:11;;;18457:37;;;18474:18;;:::i;20744:127::-;20805:10;20800:3;20796:20;20793:1;20786:31;20836:4;20833:1;20826:15;20860:4;20857:1;20850:15;20876:251;20946:6;20999:2;20987:9;20978:7;20974:23;20970:32;20967:52;;;21015:1;21012;21005:12;20967:52;21047:9;21041:16;21066:31;21091:5;21066:31;:::i;21132:980::-;21394:4;21442:3;21431:9;21427:19;21473:6;21462:9;21455:25;21499:2;21537:6;21532:2;21521:9;21517:18;21510:34;21580:3;21575:2;21564:9;21560:18;21553:31;21604:6;21639;21633:13;21670:6;21662;21655:22;21708:3;21697:9;21693:19;21686:26;;21747:2;21739:6;21735:15;21721:29;;21768:1;21778:195;21792:6;21789:1;21786:13;21778:195;;;21857:13;;-1:-1:-1;;;;;21853:39:1;21841:52;;21948:15;;;;21913:12;;;;21889:1;21807:9;21778:195;;;-1:-1:-1;;;;;;;22029:32:1;;;;22024:2;22009:18;;22002:60;-1:-1:-1;;;22093:3:1;22078:19;22071:35;21990:3;21132:980;-1:-1:-1;;;21132:980:1:o;22729:306::-;22817:6;22825;22833;22886:2;22874:9;22865:7;22861:23;22857:32;22854:52;;;22902:1;22899;22892:12;22854:52;22931:9;22925:16;22915:26;;22981:2;22970:9;22966:18;22960:25;22950:35;;23025:2;23014:9;23010:18;23004:25;22994:35;;22729:306;;;;;:::o

Swarm Source

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