ETH Price: $3,029.24 (+4.35%)

Token

Image Generation AI | imgnAI.com (imgnAI)
 

Overview

Max Total Supply

1,000,000,000 imgnAI

Holders

6,062 (0.00%)

Market

Price

$0.01 @ 0.000003 ETH (+3.52%)

Onchain Market Cap

$8,326,070.00

Circulating Supply Market Cap

$6,277,335.00

Other Info

Token Contract (WITH 9 Decimals)

Balance
5,244.157275796 imgnAI

Value
$43.66 ( ~0.0144128456706211 Eth) [0.0005%]
0xa78cbeef60b6a514d5f6e11985860949f2693ed5
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

$imgnAI is the creator token that powers the imgnAI platform - a suite of creative AI tools built for maximum fun, and maximum freedom.

Market

Volume (24H):$794,230.00
Market Capitalization:$6,277,335.00
Circulating Supply:777,193,333.00 imgnAI
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Imgnai

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-12-09
*/

/**
 *   _                                _____ 
 *  (_)                         /\   |_   _|
 *   _ _ __ ___   __ _ _ __    /  \    | |  
 *  | | '_ ` _ \ / _` | '_ \  / /\ \   | |  
 *  | | | | | | | (_| | | | |/ ____ \ _| |_ 
 *  |_|_| |_| |_|\__, |_| |_/_/    \_\_____|
 *                __/ |                     
 *               |___/                      
 * 
 * Image Generation AI : Powered by Stability AI's Stable Diffusion
 * 
 * Telegram: https://t.me/imgnAI
 * Twitter: twitter.com/imgnAI
 * Homepage: https://imgnAI.com
 * 
 * Total Supply: 1 Billion Tokens
 * Unlock rendering & Add our AI Bot to your Telegram channel at our homepage!
 * 
 * Set slippage to 3-4% : 1% to LP, 2% 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 Imgnai is ERC20, Ownable {
    // TOKENOMICS START ==========================================================>
    string private _name = "Image Generation AI | imgnAI.com";
    string private _symbol = "imgnAI";
    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 2% after launch
    uint256 public maxTxAmount = 10000001 * 10**_decimals;
    uint256 public maxWalletAmount = 10000001 * 10**_decimals;
    address public marketingWallet = 0xbC14dE74243788c5D934C963c4EAf3b743F1b0C6;
    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 = 2;
        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"}]

60a06040526040518060400160405280602081526020017f496d6167652047656e65726174696f6e204149207c20696d676e41492e636f6d815250600690816200004a919062000c03565b506040518060400160405280600681526020017f696d676e414900000000000000000000000000000000000000000000000000008152506007908162000091919062000c03565b506009600860006101000a81548160ff021916908360ff160217905550633b9aca00600955602f600a55602f600b55600860009054906101000a900460ff16600a620000de919062000e7a565b62989681620000ee919062000ecb565b600c55600860009054906101000a900460ff16600a6200010f919062000e7a565b629896816200011f919062000ecb565b600d5573bc14de74243788c5d934c963c4eaf3b743f1b0c6600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061dead600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000601055600860009054906101000a900460ff16600a620001dd919062000e7a565b62030d40620001ed919062000ecb565b601255600860009054906101000a900460ff16600a6200020e919062000e7a565b620186a06200021e919062000ecb565b601355662386f26fc10000601655600860009054906101000a900460ff16600a6200024a919062000e7a565b61271062000259919062000ecb565b60175567016345785d8a0000601855600860009054906101000a900460ff16600a62000286919062000e7a565b620186a062000296919062000ecb565b601955348015620002a657600080fd5b5060068054620002b690620009f2565b80601f0160208091040260200160405190810160405280929190818152602001828054620002e490620009f2565b8015620003355780601f10620003095761010080835404028352916020019162000335565b820191906000526020600020905b8154815290600101906020018083116200031757829003601f168201915b5050505050600780546200034990620009f2565b80601f01602080910402602001604051908101604052809291908181526020018280546200037790620009f2565b8015620003c85780601f106200039c57610100808354040283529160200191620003c8565b820191906000526020600020905b815481529060010190602001808311620003aa57829003601f168201915b50505050508160039081620003de919062000c03565b508060049081620003f0919062000c03565b50505062000413620004076200077660201b60201c565b6200077e60201b60201c565b6200045133600860009054906101000a900460ff16600a62000436919062000e7a565b60095462000445919062000ecb565b6200084460201b60201c565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d90508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620004b6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004dc919062000f96565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000544573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200056a919062000f96565b6040518363ffffffff1660e01b81526004016200058992919062000fd9565b6020604051808303816000875af1158015620005a9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005cf919062000f96565b601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505060016011600060805173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050620010f2565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620008b6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008ad9062001067565b60405180910390fd5b8060026000828254620008ca919062001089565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200097d9190620010d5565b60405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a0b57607f821691505b60208210810362000a215762000a20620009c3565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000a8b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000a4c565b62000a97868362000a4c565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000ae462000ade62000ad88462000aaf565b62000ab9565b62000aaf565b9050919050565b6000819050919050565b62000b008362000ac3565b62000b1862000b0f8262000aeb565b84845462000a59565b825550505050565b600090565b62000b2f62000b20565b62000b3c81848462000af5565b505050565b5b8181101562000b645762000b5860008262000b25565b60018101905062000b42565b5050565b601f82111562000bb35762000b7d8162000a27565b62000b888462000a3c565b8101602085101562000b98578190505b62000bb062000ba78562000a3c565b83018262000b41565b50505b505050565b600082821c905092915050565b600062000bd86000198460080262000bb8565b1980831691505092915050565b600062000bf3838362000bc5565b9150826002028217905092915050565b62000c0e8262000989565b67ffffffffffffffff81111562000c2a5762000c2962000994565b5b62000c368254620009f2565b62000c4382828562000b68565b600060209050601f83116001811462000c7b576000841562000c66578287015190505b62000c72858262000be5565b86555062000ce2565b601f19841662000c8b8662000a27565b60005b8281101562000cb55784890151825560018201915060208501945060208101905062000c8e565b8683101562000cd5578489015162000cd1601f89168262000bc5565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b600185111562000d785780860481111562000d505762000d4f62000cea565b5b600185161562000d605780820291505b808102905062000d708562000d19565b945062000d30565b94509492505050565b60008262000d93576001905062000e66565b8162000da3576000905062000e66565b816001811462000dbc576002811462000dc75762000dfd565b600191505062000e66565b60ff84111562000ddc5762000ddb62000cea565b5b8360020a91508482111562000df65762000df562000cea565b5b5062000e66565b5060208310610133831016604e8410600b841016171562000e375782820a90508381111562000e315762000e3062000cea565b5b62000e66565b62000e46848484600162000d26565b9250905081840481111562000e605762000e5f62000cea565b5b81810290505b9392505050565b600060ff82169050919050565b600062000e878262000aaf565b915062000e948362000e6d565b925062000ec37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000d81565b905092915050565b600062000ed88262000aaf565b915062000ee58362000aaf565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000f215762000f2062000cea565b5b828202905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000f5e8262000f31565b9050919050565b62000f708162000f51565b811462000f7c57600080fd5b50565b60008151905062000f908162000f65565b92915050565b60006020828403121562000faf5762000fae62000f2c565b5b600062000fbf8482850162000f7f565b91505092915050565b62000fd38162000f51565b82525050565b600060408201905062000ff0600083018562000fc8565b62000fff602083018462000fc8565b9392505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006200104f601f8362001006565b91506200105c8262001017565b602082019050919050565b60006020820190508181036000830152620010828162001040565b9050919050565b6000620010968262000aaf565b9150620010a38362000aaf565b9250828201905080821115620010be57620010bd62000cea565b5b92915050565b620010cf8162000aaf565b82525050565b6000602082019050620010ec6000830184620010c4565b92915050565b6080516149286200113160003960008181610e3a0152818161299101528181612a7201528181612a9901528181612dcb0152612df201526149286000f3fe60806040526004361061028c5760003560e01c8063768dc7101161015a578063af8af690116100c1578063df1d099e1161007a578063df1d099e14610a67578063df8408fe14610a92578063f1b2b3d914610abb578063f2fde38b14610af8578063f345bd8514610b21578063fbee93ba14610b4c57610293565b8063af8af6901461091d578063b5c78e8a1461095a578063bb85c6d114610997578063c0fdea57146109d4578063d12a7688146109ff578063dd62ed3e14610a2a57610293565b8063a2330d9711610113578063a2330d97146107f6578063a3996f7b14610836578063a457c2d71461084d578063a9059cbb1461088a578063aa4bde28146108c7578063ad16a0cf146108f257610293565b8063768dc710146106d05780637930ef691461070d57806381bfdcca146107385780638c0b5e22146107755780638da5cb5b146107a057806395d89b41146107cb57610293565b806330b63d80116101fe57806363cdf60f116101b757806363cdf60f146105ab578063677daa57146105eb57806370a0823114610628578063715018a61461066557806373c503b31461067c57806375f0a874146106a557610293565b806330b63d8014610473578063313ce567146104b057806339509351146104db57806349bd5a5e146105185780634fa74c4d14610543578063527ffabd1461058057610293565b80631694505e116102505780631694505e1461037257806316a7b1601461039d57806318160ddd146103b957806318bc47f6146103e45780631b56bbf91461040d57806323b872dd1461043657610293565b806303fd2a4514610298578063054dee0f146102c357806306fdde03146102ee578063095ea7b3146103195780630f1d7ad91461035657610293565b3661029357005b600080fd5b3480156102a457600080fd5b506102ad610b77565b6040516102ba9190612f1d565b60405180910390f35b3480156102cf57600080fd5b506102d8610b9d565b6040516102e59190612f51565b60405180910390f35b3480156102fa57600080fd5b50610303610ba3565b6040516103109190612ffc565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b919061308a565b610c35565b60405161034d91906130e5565b60405180910390f35b610370600480360381019061036b9190613235565b610c58565b005b34801561037e57600080fd5b50610387610e38565b60405161039491906132dd565b60405180910390f35b6103b760048036038101906103b29190613235565b610e5c565b005b3480156103c557600080fd5b506103ce61103c565b6040516103db9190612f51565b60405180910390f35b3480156103f057600080fd5b5061040b60048036038101906104069190613324565b611046565b005b34801561041957600080fd5b50610434600480360381019061042f91906133bb565b6111bc565b005b34801561044257600080fd5b5061045d600480360381019061045891906133e8565b61133e565b60405161046a91906130e5565b60405180910390f35b34801561047f57600080fd5b5061049a6004803603810190610495919061343b565b61136d565b6040516104a791906130e5565b60405180910390f35b3480156104bc57600080fd5b506104c561147b565b6040516104d29190613497565b60405180910390f35b3480156104e757600080fd5b5061050260048036038101906104fd919061308a565b611484565b60405161050f91906130e5565b60405180910390f35b34801561052457600080fd5b5061052d6114bb565b60405161053a9190612f1d565b60405180910390f35b34801561054f57600080fd5b5061056a600480360381019061056591906134b2565b6114e1565b60405161057791906130e5565b60405180910390f35b34801561058c57600080fd5b50610595611557565b6040516105a29190612f51565b60405180910390f35b3480156105b757600080fd5b506105d260048036038101906105cd9190613235565b61155d565b6040516105e2949392919061350e565b60405180910390f35b3480156105f757600080fd5b50610612600480360381019061060d919061355a565b611638565b60405161061f91906130e5565b60405180910390f35b34801561063457600080fd5b5061064f600480360381019061064a91906133bb565b611652565b60405161065c9190612f51565b60405180910390f35b34801561067157600080fd5b5061067a61169a565b005b34801561068857600080fd5b506106a3600480360381019061069e9190613587565b6116ae565b005b3480156106b157600080fd5b506106ba611782565b6040516106c79190612f1d565b60405180910390f35b3480156106dc57600080fd5b506106f760048036038101906106f291906133bb565b6117a8565b60405161070491906130e5565b60405180910390f35b34801561071957600080fd5b506107226117c8565b60405161072f9190612f51565b60405180910390f35b34801561074457600080fd5b5061075f600480360381019061075a919061355a565b6117ce565b60405161076c91906130e5565b60405180910390f35b34801561078157600080fd5b5061078a6117e8565b6040516107979190612f51565b60405180910390f35b3480156107ac57600080fd5b506107b56117ee565b6040516107c29190612f1d565b60405180910390f35b3480156107d757600080fd5b506107e0611818565b6040516107ed9190612ffc565b60405180910390f35b34801561080257600080fd5b5061081d60048036038101906108189190613235565b6118aa565b60405161082d949392919061350e565b60405180910390f35b34801561084257600080fd5b5061084b611985565b005b34801561085957600080fd5b50610874600480360381019061086f919061308a565b6119ff565b60405161088191906130e5565b60405180910390f35b34801561089657600080fd5b506108b160048036038101906108ac919061308a565b611a76565b6040516108be91906130e5565b60405180910390f35b3480156108d357600080fd5b506108dc611a99565b6040516108e99190612f51565b60405180910390f35b3480156108fe57600080fd5b50610907611a9f565b6040516109149190612f51565b60405180910390f35b34801561092957600080fd5b50610944600480360381019061093f919061343b565b611aa5565b60405161095191906130e5565b60405180910390f35b34801561096657600080fd5b50610981600480360381019061097c91906134b2565b611b16565b60405161098e9190612f51565b60405180910390f35b3480156109a357600080fd5b506109be60048036038101906109b991906133bb565b611b72565b6040516109cb91906130e5565b60405180910390f35b3480156109e057600080fd5b506109e9611cc5565b6040516109f69190612f51565b60405180910390f35b348015610a0b57600080fd5b50610a14611ccb565b604051610a219190612f51565b60405180910390f35b348015610a3657600080fd5b50610a516004803603810190610a4c91906135da565b611cd1565b604051610a5e9190612f51565b60405180910390f35b348015610a7357600080fd5b50610a7c611d58565b604051610a899190612f51565b60405180910390f35b348015610a9e57600080fd5b50610ab96004803603810190610ab4919061361a565b611d5e565b005b348015610ac757600080fd5b50610ae26004803603810190610add91906134b2565b611dfa565b604051610aef9190612f51565b60405180910390f35b348015610b0457600080fd5b50610b1f6004803603810190610b1a91906133bb565b611e56565b005b348015610b2d57600080fd5b50610b36611ed9565b604051610b439190612f51565b60405180910390f35b348015610b5857600080fd5b50610b61611edf565b604051610b6e9190612f51565b60405180910390f35b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60165481565b606060038054610bb290613689565b80601f0160208091040260200160405190810160405280929190818152602001828054610bde90613689565b8015610c2b5780601f10610c0057610100808354040283529160200191610c2b565b820191906000526020600020905b815481529060010190602001808311610c0e57829003601f168201915b5050505050905090565b600080610c40611ee5565b9050610c4d818585611eed565b600191505092915050565b601654341015610c9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9490613706565b60405180910390fd5b6017543373ffffffffffffffffffffffffffffffffffffffff16311015610cf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf090613772565b60405180910390fd5b3460106000828254610d0b91906137c1565b92505081905550610d4133600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166017546120b6565b604051806080016040528082815260200160011515815260200142815260200134601584604051610d729190613831565b908152602001604051809103902060030154610d8e91906137c1565b815250601582604051610da19190613831565b90815260200160405180910390206000820151816000019081610dc491906139ea565b5060208201518160010160006101000a81548160ff02191690831515021790555060408201518160020155606082015181600301559050507f8382dfeb92e23123a91d983e4f179a9fbe329ff91e14e11cd3c3b5252f1151228142604051610e2d929190613abc565b60405180910390a150565b7f000000000000000000000000000000000000000000000000000000000000000081565b601654341015610ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9890613706565b60405180910390fd5b6017543373ffffffffffffffffffffffffffffffffffffffff16311015610efd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef490613772565b60405180910390fd5b3460106000828254610f0f91906137c1565b92505081905550610f4533600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166017546120b6565b604051806080016040528082815260200160011515815260200142815260200134601484604051610f769190613831565b908152602001604051809103902060030154610f9291906137c1565b815250601482604051610fa59190613831565b90815260200160405180910390206000820151816000019081610fc891906139ea565b5060208201518160010160006101000a81548160ff02191690831515021790555060408201518160020155606082015181600301559050507f892c7b6af36dc1cd7c78d56ead1e536ddf81fe5688e6b3f631cdfadf7ad4c5088142604051611031929190613abc565b60405180910390a150565b6000600254905090565b61104e612646565b83156110e75760405180608001604052808681526020018415158152602001838152602001828152506015866040516110879190613831565b908152602001604051809103902060008201518160000190816110aa91906139ea565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030155905050611176565b604051806080016040528086815260200184151581526020018381526020018281525060148660405161111a9190613831565b9081526020016040518091039020600082015181600001908161113d91906139ea565b5060208201518160010160006101000a81548160ff02191690831515021790555060408201518160020155606082015181600301559050505b7fc7da2a9b77928245e263afcf4e639fd44ae7d1970e45b7c6ff1a952442938caf85858585856040516111ad959493929190613aec565b60405180910390a15050505050565b6111c4612646565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611254576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124b90613bb8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036112c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ba90613bb8565b60405180910390fd5b80601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f1d288f7aba265e8b154b112bbb631ceca5df5fe93a750b2fe042fd1cc826647f816040516113339190612f1d565b60405180910390a150565b600080611349611ee5565b90506113568582856126c4565b6113618585856120b6565b60019150509392505050565b6000611377612646565b60626009546113869190613c07565b83106113c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113be90613caa565b60405180910390fd5b60626009546113d69190613c07565b8210611417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140e90613caa565b60405180910390fd5b600860009054906101000a900460ff16600a6114339190613dfd565b8361143e9190613e48565b601281905550600860009054906101000a900460ff16600a6114609190613dfd565b8261146b9190613e48565b6013819055506001905092915050565b60006009905090565b60008061148f611ee5565b90506114b08185856114a18589611cd1565b6114ab91906137c1565b611eed565b600191505092915050565b601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000811561151f576015836040516114f99190613831565b908152602001604051809103902060010160009054906101000a900460ff169050611551565b60148360405161152f9190613831565b908152602001604051809103902060010160009054906101000a900460ff1690505b92915050565b600b5481565b60148180516020810182018051848252602083016020850120818352809550505050505060009150905080600001805461159690613689565b80601f01602080910402602001604051908101604052809291908181526020018280546115c290613689565b801561160f5780601f106115e45761010080835404028352916020019161160f565b820191906000526020600020905b8154815290600101906020018083116115f257829003601f168201915b5050505050908060010160009054906101000a900460ff16908060020154908060030154905084565b6000611642612646565b81600c8190555060019050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116a2612646565b6116ac6000612750565b565b6116b6612646565b82156116db5781156116ce57806018819055506116d6565b806016819055505b611742565b811561171357600860009054906101000a900460ff16600a6116fd9190613dfd565b816117089190613e48565b601981905550611741565b600860009054906101000a900460ff16600a61172f9190613dfd565b8161173a9190613e48565b6017819055505b5b7fb87a29e1f0734b57d95308af5a136440c194441ac49edd417a1ed26aa78ceda283838360405161177593929190613ea2565b60405180910390a1505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60116020528060005260406000206000915054906101000a900460ff1681565b60185481565b60006117d8612646565b81600d8190555060019050919050565b600c5481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461182790613689565b80601f016020809104026020016040519081016040528092919081815260200182805461185390613689565b80156118a05780601f10611875576101008083540402835291602001916118a0565b820191906000526020600020905b81548152906001019060200180831161188357829003601f168201915b5050505050905090565b6015818051602081018201805184825260208301602085012081835280955050505050506000915090508060000180546118e390613689565b80601f016020809104026020016040519081016040528092919081815260200182805461190f90613689565b801561195c5780601f106119315761010080835404028352916020019161195c565b820191906000526020600020905b81548152906001019060200180831161193f57829003601f168201915b5050505050908060010160009054906101000a900460ff16908060020154908060030154905084565b61198d612646565b6001600a819055506002600b81905550600860009054906101000a900460ff16600a6119b99190613dfd565b629896816119c79190613e48565b600c81905550600860009054906101000a900460ff16600a6119e99190613dfd565b629896816119f79190613e48565b600d81905550565b600080611a0a611ee5565b90506000611a188286611cd1565b905083811015611a5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5490613f4b565b60405180910390fd5b611a6a8286868403611eed565b60019250505092915050565b600080611a81611ee5565b9050611a8e8185856120b6565b600191505092915050565b600d5481565b60135481565b6000611aaf612646565b600a8284611abd91906137c1565b1115611afe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af590613fdd565b60405180910390fd5b82600a8190555081600b819055506001905092915050565b60008115611b4757601583604051611b2e9190613831565b9081526020016040518091039020600301549050611b6c565b601483604051611b579190613831565b90815260200160405180910390206003015490505b92915050565b6000611b7c612646565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0390613bb8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7290613bb8565b60405180910390fd5b81600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b60105481565b60125481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60195481565b611d66612646565b80601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f318c131114339c004fff0a22fcdbbc0566bb2a7cd3aa1660e636ec5a66784ff28282604051611dee929190613ffd565b60405180910390a15050565b60008115611e2b57601583604051611e129190613831565b9081526020016040518091039020600201549050611e50565b601483604051611e3b9190613831565b90815260200160405180910390206002015490505b92915050565b611e5e612646565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ecd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec490614098565b60405180910390fd5b611ed681612750565b50565b600a5481565b60175481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f539061412a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611fcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc2906141bc565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516120a99190612f51565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211c9061424e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218b906142e0565b60405180910390fd5b8061219e84611652565b10156121df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d690614372565b60405180910390fd5b601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806122885750601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b80156122a15750601a60149054906101000a900460ff16155b1561263557601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146123fa57600060105461230930611652565b6123139190614392565b9050601254811061232a57612329601254612816565b5b601354601054106123f8576123406013546128d7565b601354601060008282546123549190614392565b925050819055506000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050509050806123f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ed90614412565b60405180910390fd5b505b505b6000601160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061249d5750601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156124aa57819050612624565b600c548211156124ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e6906144a4565b60405180910390fd5b601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361259d57600d5461255084611652565b8361255b91906137c1565b111561259c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259390614536565b60405180910390fd5b5b60006064600b54846125af9190613e48565b6125b99190613c07565b905060006064600a54856125cd9190613e48565b6125d79190613c07565b905080826125e591906137c1565b846125f09190614392565b9250816010600082825461260491906137c1565b925050819055506126218630838561261c91906137c1565b612b4a565b50505b61262f848483612b4a565b50612641565b612640838383612b4a565b5b505050565b61264e611ee5565b73ffffffffffffffffffffffffffffffffffffffff1661266c6117ee565b73ffffffffffffffffffffffffffffffffffffffff16146126c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b9906145a2565b60405180910390fd5b565b60006126d08484611cd1565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461274a578181101561273c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127339061460e565b60405180910390fd5b6127498484848403611eed565b5b50505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001601a60146101000a81548160ff02191690831515021790555060006002826128409190613c07565b9050600081836128509190614392565b90506000479050612860836128d7565b6000814761286e9190614392565b905061287a8382612daa565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5618482856040516128ad9392919061462e565b60405180910390a1505050506000601a60146101000a81548160ff02191690831515021790555050565b6001601a60146101000a81548160ff0219169083151502179055506000600267ffffffffffffffff81111561290f5761290e61310a565b5b60405190808252806020026020018201604052801561293d5781602001602082028036833780820191505090505b509050308160008151811061295557612954614665565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129fa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a1e91906146a9565b81600181518110612a3257612a31614665565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612a97307f000000000000000000000000000000000000000000000000000000000000000084611eed565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401612af99594939291906147cf565b600060405180830381600087803b158015612b1357600080fd5b505af1158015612b27573d6000803e3d6000fd5b50505050506000601a60146101000a81548160ff02191690831515021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612bb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb09061424e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1f906142e0565b60405180910390fd5b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca590614372565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612d9c9190612f51565b60405180910390a350505050565b6001601a60146101000a81548160ff021916908315150217905550612df0307f000000000000000000000000000000000000000000000000000000000000000084611eed565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b8152600401612e7796959493929190614829565b60606040518083038185885af1158015612e95573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612eba919061489f565b5050506000601a60146101000a81548160ff0219169083151502179055505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612f0782612edc565b9050919050565b612f1781612efc565b82525050565b6000602082019050612f326000830184612f0e565b92915050565b6000819050919050565b612f4b81612f38565b82525050565b6000602082019050612f666000830184612f42565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612fa6578082015181840152602081019050612f8b565b60008484015250505050565b6000601f19601f8301169050919050565b6000612fce82612f6c565b612fd88185612f77565b9350612fe8818560208601612f88565b612ff181612fb2565b840191505092915050565b600060208201905081810360008301526130168184612fc3565b905092915050565b6000604051905090565b600080fd5b600080fd5b61303b81612efc565b811461304657600080fd5b50565b60008135905061305881613032565b92915050565b61306781612f38565b811461307257600080fd5b50565b6000813590506130848161305e565b92915050565b600080604083850312156130a1576130a0613028565b5b60006130af85828601613049565b92505060206130c085828601613075565b9150509250929050565b60008115159050919050565b6130df816130ca565b82525050565b60006020820190506130fa60008301846130d6565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61314282612fb2565b810181811067ffffffffffffffff821117156131615761316061310a565b5b80604052505050565b600061317461301e565b90506131808282613139565b919050565b600067ffffffffffffffff8211156131a05761319f61310a565b5b6131a982612fb2565b9050602081019050919050565b82818337600083830152505050565b60006131d86131d384613185565b61316a565b9050828152602081018484840111156131f4576131f3613105565b5b6131ff8482856131b6565b509392505050565b600082601f83011261321c5761321b613100565b5b813561322c8482602086016131c5565b91505092915050565b60006020828403121561324b5761324a613028565b5b600082013567ffffffffffffffff8111156132695761326861302d565b5b61327584828501613207565b91505092915050565b6000819050919050565b60006132a361329e61329984612edc565b61327e565b612edc565b9050919050565b60006132b582613288565b9050919050565b60006132c7826132aa565b9050919050565b6132d7816132bc565b82525050565b60006020820190506132f260008301846132ce565b92915050565b613301816130ca565b811461330c57600080fd5b50565b60008135905061331e816132f8565b92915050565b600080600080600060a086880312156133405761333f613028565b5b600086013567ffffffffffffffff81111561335e5761335d61302d565b5b61336a88828901613207565b955050602061337b8882890161330f565b945050604061338c8882890161330f565b935050606061339d88828901613075565b92505060806133ae88828901613075565b9150509295509295909350565b6000602082840312156133d1576133d0613028565b5b60006133df84828501613049565b91505092915050565b60008060006060848603121561340157613400613028565b5b600061340f86828701613049565b935050602061342086828701613049565b925050604061343186828701613075565b9150509250925092565b6000806040838503121561345257613451613028565b5b600061346085828601613075565b925050602061347185828601613075565b9150509250929050565b600060ff82169050919050565b6134918161347b565b82525050565b60006020820190506134ac6000830184613488565b92915050565b600080604083850312156134c9576134c8613028565b5b600083013567ffffffffffffffff8111156134e7576134e661302d565b5b6134f385828601613207565b92505060206135048582860161330f565b9150509250929050565b600060808201905081810360008301526135288187612fc3565b905061353760208301866130d6565b6135446040830185612f42565b6135516060830184612f42565b95945050505050565b6000602082840312156135705761356f613028565b5b600061357e84828501613075565b91505092915050565b6000806000606084860312156135a05761359f613028565b5b60006135ae8682870161330f565b93505060206135bf8682870161330f565b92505060406135d086828701613075565b9150509250925092565b600080604083850312156135f1576135f0613028565b5b60006135ff85828601613049565b925050602061361085828601613049565b9150509250929050565b6000806040838503121561363157613630613028565b5b600061363f85828601613049565b92505060206136508582860161330f565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806136a157607f821691505b6020821081036136b4576136b361365a565b5b50919050565b7f4e6f7420656e6f756768204554482073656e7421000000000000000000000000600082015250565b60006136f0601483612f77565b91506136fb826136ba565b602082019050919050565b6000602082019050818103600083015261371f816136e3565b9050919050565b7f4e6f7420656e6f75676820746f6b656e73210000000000000000000000000000600082015250565b600061375c601283612f77565b915061376782613726565b602082019050919050565b6000602082019050818103600083015261378b8161374f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006137cc82612f38565b91506137d783612f38565b92508282019050808211156137ef576137ee613792565b5b92915050565b600081905092915050565b600061380b82612f6c565b61381581856137f5565b9350613825818560208601612f88565b80840191505092915050565b600061383d8284613800565b915081905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026138aa7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261386d565b6138b4868361386d565b95508019841693508086168417925050509392505050565b60006138e76138e26138dd84612f38565b61327e565b612f38565b9050919050565b6000819050919050565b613901836138cc565b61391561390d826138ee565b84845461387a565b825550505050565b600090565b61392a61391d565b6139358184846138f8565b505050565b5b818110156139595761394e600082613922565b60018101905061393b565b5050565b601f82111561399e5761396f81613848565b6139788461385d565b81016020851015613987578190505b61399b6139938561385d565b83018261393a565b50505b505050565b600082821c905092915050565b60006139c1600019846008026139a3565b1980831691505092915050565b60006139da83836139b0565b9150826002028217905092915050565b6139f382612f6c565b67ffffffffffffffff811115613a0c57613a0b61310a565b5b613a168254613689565b613a2182828561395d565b600060209050601f831160018114613a545760008415613a42578287015190505b613a4c85826139ce565b865550613ab4565b601f198416613a6286613848565b60005b82811015613a8a57848901518255600182019150602085019450602081019050613a65565b86831015613aa75784890151613aa3601f8916826139b0565b8355505b6001600288020188555050505b505050505050565b60006040820190508181036000830152613ad68185612fc3565b9050613ae56020830184612f42565b9392505050565b600060a0820190508181036000830152613b068188612fc3565b9050613b1560208301876130d6565b613b2260408301866130d6565b613b2f6060830185612f42565b613b3c6080830184612f42565b9695505050505050565b7f4c5020506169722063616e6e6f742062652074686520446561642077616c6c6560008201527f742c206f72203021000000000000000000000000000000000000000000000000602082015250565b6000613ba2602883612f77565b9150613bad82613b46565b604082019050919050565b60006020820190508181036000830152613bd181613b95565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613c1282612f38565b9150613c1d83612f38565b925082613c2d57613c2c613bd8565b5b828204905092915050565b7f43616e6e6f74206c6971756964617465206d6f7265207468616e203225206f6660008201527f2074686520737570706c79206174206f6e636521000000000000000000000000602082015250565b6000613c94603483612f77565b9150613c9f82613c38565b604082019050919050565b60006020820190508181036000830152613cc381613c87565b9050919050565b60008160011c9050919050565b6000808291508390505b6001851115613d2157808604811115613cfd57613cfc613792565b5b6001851615613d0c5780820291505b8081029050613d1a85613cca565b9450613ce1565b94509492505050565b600082613d3a5760019050613df6565b81613d485760009050613df6565b8160018114613d5e5760028114613d6857613d97565b6001915050613df6565b60ff841115613d7a57613d79613792565b5b8360020a915084821115613d9157613d90613792565b5b50613df6565b5060208310610133831016604e8410600b8410161715613dcc5782820a905083811115613dc757613dc6613792565b5b613df6565b613dd98484846001613cd7565b92509050818404811115613df057613def613792565b5b81810290505b9392505050565b6000613e0882612f38565b9150613e138361347b565b9250613e407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613d2a565b905092915050565b6000613e5382612f38565b9150613e5e83612f38565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e9757613e96613792565b5b828202905092915050565b6000606082019050613eb760008301866130d6565b613ec460208301856130d6565b613ed16040830184612f42565b949350505050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613f35602583612f77565b9150613f4082613ed9565b604082019050919050565b60006020820190508181036000830152613f6481613f28565b9050919050565b7f45524332303a20746f74616c20746178206d757374206e6f742062652067726560008201527f61746572207468616e2031302500000000000000000000000000000000000000602082015250565b6000613fc7602d83612f77565b9150613fd282613f6b565b604082019050919050565b60006020820190508181036000830152613ff681613fba565b9050919050565b60006040820190506140126000830185612f0e565b61401f60208301846130d6565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614082602683612f77565b915061408d82614026565b604082019050919050565b600060208201905081810360008301526140b181614075565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614114602483612f77565b915061411f826140b8565b604082019050919050565b6000602082019050818103600083015261414381614107565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006141a6602283612f77565b91506141b18261414a565b604082019050919050565b600060208201905081810360008301526141d581614199565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614238602583612f77565b9150614243826141dc565b604082019050919050565b600060208201905081810360008301526142678161422b565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006142ca602383612f77565b91506142d58261426e565b604082019050919050565b600060208201905081810360008301526142f9816142bd565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061435c602683612f77565b915061436782614300565b604082019050919050565b6000602082019050818103600083015261438b8161434f565b9050919050565b600061439d82612f38565b91506143a883612f38565b92508282039050818111156143c0576143bf613792565b5b92915050565b7f4661696c656420746f2073656e64204554480000000000000000000000000000600082015250565b60006143fc601283612f77565b9150614407826143c6565b602082019050919050565b6000602082019050818103600083015261442b816143ef565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473207460008201527f6865206d6178207472616e73616374696f6e20616d6f756e7400000000000000602082015250565b600061448e603983612f77565b915061449982614432565b604082019050919050565b600060208201905081810360008301526144bd81614481565b9050919050565b7f45524332303a2062616c616e636520616d6f756e74206578636565646564206d60008201527f61782077616c6c657420616d6f756e74206c696d697400000000000000000000602082015250565b6000614520603683612f77565b915061452b826144c4565b604082019050919050565b6000602082019050818103600083015261454f81614513565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061458c602083612f77565b915061459782614556565b602082019050919050565b600060208201905081810360008301526145bb8161457f565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006145f8601d83612f77565b9150614603826145c2565b602082019050919050565b60006020820190508181036000830152614627816145eb565b9050919050565b60006060820190506146436000830186612f42565b6146506020830185612f42565b61465d6040830184612f42565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815190506146a381613032565b92915050565b6000602082840312156146bf576146be613028565b5b60006146cd84828501614694565b91505092915050565b6000819050919050565b60006146fb6146f66146f1846146d6565b61327e565b612f38565b9050919050565b61470b816146e0565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61474681612efc565b82525050565b6000614758838361473d565b60208301905092915050565b6000602082019050919050565b600061477c82614711565b614786818561471c565b93506147918361472d565b8060005b838110156147c25781516147a9888261474c565b97506147b483614764565b925050600181019050614795565b5085935050505092915050565b600060a0820190506147e46000830188612f42565b6147f16020830187614702565b81810360408301526148038186614771565b90506148126060830185612f0e565b61481f6080830184612f42565b9695505050505050565b600060c08201905061483e6000830189612f0e565b61484b6020830188612f42565b6148586040830187614702565b6148656060830186614702565b6148726080830185612f0e565b61487f60a0830184612f42565b979650505050505050565b6000815190506148998161305e565b92915050565b6000806000606084860312156148b8576148b7613028565b5b60006148c68682870161488a565b93505060206148d78682870161488a565b92505060406148e88682870161488a565b915050925092509256fea2646970667358221220662c2cd14135ccce2b9a986111545aafccc0dceef6265a43e28cadba1a9134c364736f6c63430008100033

Deployed Bytecode

0x60806040526004361061028c5760003560e01c8063768dc7101161015a578063af8af690116100c1578063df1d099e1161007a578063df1d099e14610a67578063df8408fe14610a92578063f1b2b3d914610abb578063f2fde38b14610af8578063f345bd8514610b21578063fbee93ba14610b4c57610293565b8063af8af6901461091d578063b5c78e8a1461095a578063bb85c6d114610997578063c0fdea57146109d4578063d12a7688146109ff578063dd62ed3e14610a2a57610293565b8063a2330d9711610113578063a2330d97146107f6578063a3996f7b14610836578063a457c2d71461084d578063a9059cbb1461088a578063aa4bde28146108c7578063ad16a0cf146108f257610293565b8063768dc710146106d05780637930ef691461070d57806381bfdcca146107385780638c0b5e22146107755780638da5cb5b146107a057806395d89b41146107cb57610293565b806330b63d80116101fe57806363cdf60f116101b757806363cdf60f146105ab578063677daa57146105eb57806370a0823114610628578063715018a61461066557806373c503b31461067c57806375f0a874146106a557610293565b806330b63d8014610473578063313ce567146104b057806339509351146104db57806349bd5a5e146105185780634fa74c4d14610543578063527ffabd1461058057610293565b80631694505e116102505780631694505e1461037257806316a7b1601461039d57806318160ddd146103b957806318bc47f6146103e45780631b56bbf91461040d57806323b872dd1461043657610293565b806303fd2a4514610298578063054dee0f146102c357806306fdde03146102ee578063095ea7b3146103195780630f1d7ad91461035657610293565b3661029357005b600080fd5b3480156102a457600080fd5b506102ad610b77565b6040516102ba9190612f1d565b60405180910390f35b3480156102cf57600080fd5b506102d8610b9d565b6040516102e59190612f51565b60405180910390f35b3480156102fa57600080fd5b50610303610ba3565b6040516103109190612ffc565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b919061308a565b610c35565b60405161034d91906130e5565b60405180910390f35b610370600480360381019061036b9190613235565b610c58565b005b34801561037e57600080fd5b50610387610e38565b60405161039491906132dd565b60405180910390f35b6103b760048036038101906103b29190613235565b610e5c565b005b3480156103c557600080fd5b506103ce61103c565b6040516103db9190612f51565b60405180910390f35b3480156103f057600080fd5b5061040b60048036038101906104069190613324565b611046565b005b34801561041957600080fd5b50610434600480360381019061042f91906133bb565b6111bc565b005b34801561044257600080fd5b5061045d600480360381019061045891906133e8565b61133e565b60405161046a91906130e5565b60405180910390f35b34801561047f57600080fd5b5061049a6004803603810190610495919061343b565b61136d565b6040516104a791906130e5565b60405180910390f35b3480156104bc57600080fd5b506104c561147b565b6040516104d29190613497565b60405180910390f35b3480156104e757600080fd5b5061050260048036038101906104fd919061308a565b611484565b60405161050f91906130e5565b60405180910390f35b34801561052457600080fd5b5061052d6114bb565b60405161053a9190612f1d565b60405180910390f35b34801561054f57600080fd5b5061056a600480360381019061056591906134b2565b6114e1565b60405161057791906130e5565b60405180910390f35b34801561058c57600080fd5b50610595611557565b6040516105a29190612f51565b60405180910390f35b3480156105b757600080fd5b506105d260048036038101906105cd9190613235565b61155d565b6040516105e2949392919061350e565b60405180910390f35b3480156105f757600080fd5b50610612600480360381019061060d919061355a565b611638565b60405161061f91906130e5565b60405180910390f35b34801561063457600080fd5b5061064f600480360381019061064a91906133bb565b611652565b60405161065c9190612f51565b60405180910390f35b34801561067157600080fd5b5061067a61169a565b005b34801561068857600080fd5b506106a3600480360381019061069e9190613587565b6116ae565b005b3480156106b157600080fd5b506106ba611782565b6040516106c79190612f1d565b60405180910390f35b3480156106dc57600080fd5b506106f760048036038101906106f291906133bb565b6117a8565b60405161070491906130e5565b60405180910390f35b34801561071957600080fd5b506107226117c8565b60405161072f9190612f51565b60405180910390f35b34801561074457600080fd5b5061075f600480360381019061075a919061355a565b6117ce565b60405161076c91906130e5565b60405180910390f35b34801561078157600080fd5b5061078a6117e8565b6040516107979190612f51565b60405180910390f35b3480156107ac57600080fd5b506107b56117ee565b6040516107c29190612f1d565b60405180910390f35b3480156107d757600080fd5b506107e0611818565b6040516107ed9190612ffc565b60405180910390f35b34801561080257600080fd5b5061081d60048036038101906108189190613235565b6118aa565b60405161082d949392919061350e565b60405180910390f35b34801561084257600080fd5b5061084b611985565b005b34801561085957600080fd5b50610874600480360381019061086f919061308a565b6119ff565b60405161088191906130e5565b60405180910390f35b34801561089657600080fd5b506108b160048036038101906108ac919061308a565b611a76565b6040516108be91906130e5565b60405180910390f35b3480156108d357600080fd5b506108dc611a99565b6040516108e99190612f51565b60405180910390f35b3480156108fe57600080fd5b50610907611a9f565b6040516109149190612f51565b60405180910390f35b34801561092957600080fd5b50610944600480360381019061093f919061343b565b611aa5565b60405161095191906130e5565b60405180910390f35b34801561096657600080fd5b50610981600480360381019061097c91906134b2565b611b16565b60405161098e9190612f51565b60405180910390f35b3480156109a357600080fd5b506109be60048036038101906109b991906133bb565b611b72565b6040516109cb91906130e5565b60405180910390f35b3480156109e057600080fd5b506109e9611cc5565b6040516109f69190612f51565b60405180910390f35b348015610a0b57600080fd5b50610a14611ccb565b604051610a219190612f51565b60405180910390f35b348015610a3657600080fd5b50610a516004803603810190610a4c91906135da565b611cd1565b604051610a5e9190612f51565b60405180910390f35b348015610a7357600080fd5b50610a7c611d58565b604051610a899190612f51565b60405180910390f35b348015610a9e57600080fd5b50610ab96004803603810190610ab4919061361a565b611d5e565b005b348015610ac757600080fd5b50610ae26004803603810190610add91906134b2565b611dfa565b604051610aef9190612f51565b60405180910390f35b348015610b0457600080fd5b50610b1f6004803603810190610b1a91906133bb565b611e56565b005b348015610b2d57600080fd5b50610b36611ed9565b604051610b439190612f51565b60405180910390f35b348015610b5857600080fd5b50610b61611edf565b604051610b6e9190612f51565b60405180910390f35b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60165481565b606060038054610bb290613689565b80601f0160208091040260200160405190810160405280929190818152602001828054610bde90613689565b8015610c2b5780601f10610c0057610100808354040283529160200191610c2b565b820191906000526020600020905b815481529060010190602001808311610c0e57829003601f168201915b5050505050905090565b600080610c40611ee5565b9050610c4d818585611eed565b600191505092915050565b601654341015610c9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9490613706565b60405180910390fd5b6017543373ffffffffffffffffffffffffffffffffffffffff16311015610cf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf090613772565b60405180910390fd5b3460106000828254610d0b91906137c1565b92505081905550610d4133600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166017546120b6565b604051806080016040528082815260200160011515815260200142815260200134601584604051610d729190613831565b908152602001604051809103902060030154610d8e91906137c1565b815250601582604051610da19190613831565b90815260200160405180910390206000820151816000019081610dc491906139ea565b5060208201518160010160006101000a81548160ff02191690831515021790555060408201518160020155606082015181600301559050507f8382dfeb92e23123a91d983e4f179a9fbe329ff91e14e11cd3c3b5252f1151228142604051610e2d929190613abc565b60405180910390a150565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b601654341015610ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9890613706565b60405180910390fd5b6017543373ffffffffffffffffffffffffffffffffffffffff16311015610efd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef490613772565b60405180910390fd5b3460106000828254610f0f91906137c1565b92505081905550610f4533600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166017546120b6565b604051806080016040528082815260200160011515815260200142815260200134601484604051610f769190613831565b908152602001604051809103902060030154610f9291906137c1565b815250601482604051610fa59190613831565b90815260200160405180910390206000820151816000019081610fc891906139ea565b5060208201518160010160006101000a81548160ff02191690831515021790555060408201518160020155606082015181600301559050507f892c7b6af36dc1cd7c78d56ead1e536ddf81fe5688e6b3f631cdfadf7ad4c5088142604051611031929190613abc565b60405180910390a150565b6000600254905090565b61104e612646565b83156110e75760405180608001604052808681526020018415158152602001838152602001828152506015866040516110879190613831565b908152602001604051809103902060008201518160000190816110aa91906139ea565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030155905050611176565b604051806080016040528086815260200184151581526020018381526020018281525060148660405161111a9190613831565b9081526020016040518091039020600082015181600001908161113d91906139ea565b5060208201518160010160006101000a81548160ff02191690831515021790555060408201518160020155606082015181600301559050505b7fc7da2a9b77928245e263afcf4e639fd44ae7d1970e45b7c6ff1a952442938caf85858585856040516111ad959493929190613aec565b60405180910390a15050505050565b6111c4612646565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611254576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124b90613bb8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036112c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ba90613bb8565b60405180910390fd5b80601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f1d288f7aba265e8b154b112bbb631ceca5df5fe93a750b2fe042fd1cc826647f816040516113339190612f1d565b60405180910390a150565b600080611349611ee5565b90506113568582856126c4565b6113618585856120b6565b60019150509392505050565b6000611377612646565b60626009546113869190613c07565b83106113c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113be90613caa565b60405180910390fd5b60626009546113d69190613c07565b8210611417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140e90613caa565b60405180910390fd5b600860009054906101000a900460ff16600a6114339190613dfd565b8361143e9190613e48565b601281905550600860009054906101000a900460ff16600a6114609190613dfd565b8261146b9190613e48565b6013819055506001905092915050565b60006009905090565b60008061148f611ee5565b90506114b08185856114a18589611cd1565b6114ab91906137c1565b611eed565b600191505092915050565b601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000811561151f576015836040516114f99190613831565b908152602001604051809103902060010160009054906101000a900460ff169050611551565b60148360405161152f9190613831565b908152602001604051809103902060010160009054906101000a900460ff1690505b92915050565b600b5481565b60148180516020810182018051848252602083016020850120818352809550505050505060009150905080600001805461159690613689565b80601f01602080910402602001604051908101604052809291908181526020018280546115c290613689565b801561160f5780601f106115e45761010080835404028352916020019161160f565b820191906000526020600020905b8154815290600101906020018083116115f257829003601f168201915b5050505050908060010160009054906101000a900460ff16908060020154908060030154905084565b6000611642612646565b81600c8190555060019050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116a2612646565b6116ac6000612750565b565b6116b6612646565b82156116db5781156116ce57806018819055506116d6565b806016819055505b611742565b811561171357600860009054906101000a900460ff16600a6116fd9190613dfd565b816117089190613e48565b601981905550611741565b600860009054906101000a900460ff16600a61172f9190613dfd565b8161173a9190613e48565b6017819055505b5b7fb87a29e1f0734b57d95308af5a136440c194441ac49edd417a1ed26aa78ceda283838360405161177593929190613ea2565b60405180910390a1505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60116020528060005260406000206000915054906101000a900460ff1681565b60185481565b60006117d8612646565b81600d8190555060019050919050565b600c5481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461182790613689565b80601f016020809104026020016040519081016040528092919081815260200182805461185390613689565b80156118a05780601f10611875576101008083540402835291602001916118a0565b820191906000526020600020905b81548152906001019060200180831161188357829003601f168201915b5050505050905090565b6015818051602081018201805184825260208301602085012081835280955050505050506000915090508060000180546118e390613689565b80601f016020809104026020016040519081016040528092919081815260200182805461190f90613689565b801561195c5780601f106119315761010080835404028352916020019161195c565b820191906000526020600020905b81548152906001019060200180831161193f57829003601f168201915b5050505050908060010160009054906101000a900460ff16908060020154908060030154905084565b61198d612646565b6001600a819055506002600b81905550600860009054906101000a900460ff16600a6119b99190613dfd565b629896816119c79190613e48565b600c81905550600860009054906101000a900460ff16600a6119e99190613dfd565b629896816119f79190613e48565b600d81905550565b600080611a0a611ee5565b90506000611a188286611cd1565b905083811015611a5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5490613f4b565b60405180910390fd5b611a6a8286868403611eed565b60019250505092915050565b600080611a81611ee5565b9050611a8e8185856120b6565b600191505092915050565b600d5481565b60135481565b6000611aaf612646565b600a8284611abd91906137c1565b1115611afe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af590613fdd565b60405180910390fd5b82600a8190555081600b819055506001905092915050565b60008115611b4757601583604051611b2e9190613831565b9081526020016040518091039020600301549050611b6c565b601483604051611b579190613831565b90815260200160405180910390206003015490505b92915050565b6000611b7c612646565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0390613bb8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7290613bb8565b60405180910390fd5b81600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b60105481565b60125481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60195481565b611d66612646565b80601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f318c131114339c004fff0a22fcdbbc0566bb2a7cd3aa1660e636ec5a66784ff28282604051611dee929190613ffd565b60405180910390a15050565b60008115611e2b57601583604051611e129190613831565b9081526020016040518091039020600201549050611e50565b601483604051611e3b9190613831565b90815260200160405180910390206002015490505b92915050565b611e5e612646565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ecd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec490614098565b60405180910390fd5b611ed681612750565b50565b600a5481565b60175481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f539061412a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611fcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc2906141bc565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516120a99190612f51565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211c9061424e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218b906142e0565b60405180910390fd5b8061219e84611652565b10156121df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d690614372565b60405180910390fd5b601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806122885750601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b80156122a15750601a60149054906101000a900460ff16155b1561263557601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146123fa57600060105461230930611652565b6123139190614392565b9050601254811061232a57612329601254612816565b5b601354601054106123f8576123406013546128d7565b601354601060008282546123549190614392565b925050819055506000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050509050806123f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ed90614412565b60405180910390fd5b505b505b6000601160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061249d5750601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156124aa57819050612624565b600c548211156124ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e6906144a4565b60405180910390fd5b601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361259d57600d5461255084611652565b8361255b91906137c1565b111561259c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259390614536565b60405180910390fd5b5b60006064600b54846125af9190613e48565b6125b99190613c07565b905060006064600a54856125cd9190613e48565b6125d79190613c07565b905080826125e591906137c1565b846125f09190614392565b9250816010600082825461260491906137c1565b925050819055506126218630838561261c91906137c1565b612b4a565b50505b61262f848483612b4a565b50612641565b612640838383612b4a565b5b505050565b61264e611ee5565b73ffffffffffffffffffffffffffffffffffffffff1661266c6117ee565b73ffffffffffffffffffffffffffffffffffffffff16146126c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b9906145a2565b60405180910390fd5b565b60006126d08484611cd1565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461274a578181101561273c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127339061460e565b60405180910390fd5b6127498484848403611eed565b5b50505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001601a60146101000a81548160ff02191690831515021790555060006002826128409190613c07565b9050600081836128509190614392565b90506000479050612860836128d7565b6000814761286e9190614392565b905061287a8382612daa565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5618482856040516128ad9392919061462e565b60405180910390a1505050506000601a60146101000a81548160ff02191690831515021790555050565b6001601a60146101000a81548160ff0219169083151502179055506000600267ffffffffffffffff81111561290f5761290e61310a565b5b60405190808252806020026020018201604052801561293d5781602001602082028036833780820191505090505b509050308160008151811061295557612954614665565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129fa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a1e91906146a9565b81600181518110612a3257612a31614665565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612a97307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611eed565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401612af99594939291906147cf565b600060405180830381600087803b158015612b1357600080fd5b505af1158015612b27573d6000803e3d6000fd5b50505050506000601a60146101000a81548160ff02191690831515021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612bb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb09061424e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1f906142e0565b60405180910390fd5b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca590614372565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612d9c9190612f51565b60405180910390a350505050565b6001601a60146101000a81548160ff021916908315150217905550612df0307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611eed565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b8152600401612e7796959493929190614829565b60606040518083038185885af1158015612e95573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612eba919061489f565b5050506000601a60146101000a81548160ff0219169083151502179055505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612f0782612edc565b9050919050565b612f1781612efc565b82525050565b6000602082019050612f326000830184612f0e565b92915050565b6000819050919050565b612f4b81612f38565b82525050565b6000602082019050612f666000830184612f42565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612fa6578082015181840152602081019050612f8b565b60008484015250505050565b6000601f19601f8301169050919050565b6000612fce82612f6c565b612fd88185612f77565b9350612fe8818560208601612f88565b612ff181612fb2565b840191505092915050565b600060208201905081810360008301526130168184612fc3565b905092915050565b6000604051905090565b600080fd5b600080fd5b61303b81612efc565b811461304657600080fd5b50565b60008135905061305881613032565b92915050565b61306781612f38565b811461307257600080fd5b50565b6000813590506130848161305e565b92915050565b600080604083850312156130a1576130a0613028565b5b60006130af85828601613049565b92505060206130c085828601613075565b9150509250929050565b60008115159050919050565b6130df816130ca565b82525050565b60006020820190506130fa60008301846130d6565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61314282612fb2565b810181811067ffffffffffffffff821117156131615761316061310a565b5b80604052505050565b600061317461301e565b90506131808282613139565b919050565b600067ffffffffffffffff8211156131a05761319f61310a565b5b6131a982612fb2565b9050602081019050919050565b82818337600083830152505050565b60006131d86131d384613185565b61316a565b9050828152602081018484840111156131f4576131f3613105565b5b6131ff8482856131b6565b509392505050565b600082601f83011261321c5761321b613100565b5b813561322c8482602086016131c5565b91505092915050565b60006020828403121561324b5761324a613028565b5b600082013567ffffffffffffffff8111156132695761326861302d565b5b61327584828501613207565b91505092915050565b6000819050919050565b60006132a361329e61329984612edc565b61327e565b612edc565b9050919050565b60006132b582613288565b9050919050565b60006132c7826132aa565b9050919050565b6132d7816132bc565b82525050565b60006020820190506132f260008301846132ce565b92915050565b613301816130ca565b811461330c57600080fd5b50565b60008135905061331e816132f8565b92915050565b600080600080600060a086880312156133405761333f613028565b5b600086013567ffffffffffffffff81111561335e5761335d61302d565b5b61336a88828901613207565b955050602061337b8882890161330f565b945050604061338c8882890161330f565b935050606061339d88828901613075565b92505060806133ae88828901613075565b9150509295509295909350565b6000602082840312156133d1576133d0613028565b5b60006133df84828501613049565b91505092915050565b60008060006060848603121561340157613400613028565b5b600061340f86828701613049565b935050602061342086828701613049565b925050604061343186828701613075565b9150509250925092565b6000806040838503121561345257613451613028565b5b600061346085828601613075565b925050602061347185828601613075565b9150509250929050565b600060ff82169050919050565b6134918161347b565b82525050565b60006020820190506134ac6000830184613488565b92915050565b600080604083850312156134c9576134c8613028565b5b600083013567ffffffffffffffff8111156134e7576134e661302d565b5b6134f385828601613207565b92505060206135048582860161330f565b9150509250929050565b600060808201905081810360008301526135288187612fc3565b905061353760208301866130d6565b6135446040830185612f42565b6135516060830184612f42565b95945050505050565b6000602082840312156135705761356f613028565b5b600061357e84828501613075565b91505092915050565b6000806000606084860312156135a05761359f613028565b5b60006135ae8682870161330f565b93505060206135bf8682870161330f565b92505060406135d086828701613075565b9150509250925092565b600080604083850312156135f1576135f0613028565b5b60006135ff85828601613049565b925050602061361085828601613049565b9150509250929050565b6000806040838503121561363157613630613028565b5b600061363f85828601613049565b92505060206136508582860161330f565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806136a157607f821691505b6020821081036136b4576136b361365a565b5b50919050565b7f4e6f7420656e6f756768204554482073656e7421000000000000000000000000600082015250565b60006136f0601483612f77565b91506136fb826136ba565b602082019050919050565b6000602082019050818103600083015261371f816136e3565b9050919050565b7f4e6f7420656e6f75676820746f6b656e73210000000000000000000000000000600082015250565b600061375c601283612f77565b915061376782613726565b602082019050919050565b6000602082019050818103600083015261378b8161374f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006137cc82612f38565b91506137d783612f38565b92508282019050808211156137ef576137ee613792565b5b92915050565b600081905092915050565b600061380b82612f6c565b61381581856137f5565b9350613825818560208601612f88565b80840191505092915050565b600061383d8284613800565b915081905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026138aa7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261386d565b6138b4868361386d565b95508019841693508086168417925050509392505050565b60006138e76138e26138dd84612f38565b61327e565b612f38565b9050919050565b6000819050919050565b613901836138cc565b61391561390d826138ee565b84845461387a565b825550505050565b600090565b61392a61391d565b6139358184846138f8565b505050565b5b818110156139595761394e600082613922565b60018101905061393b565b5050565b601f82111561399e5761396f81613848565b6139788461385d565b81016020851015613987578190505b61399b6139938561385d565b83018261393a565b50505b505050565b600082821c905092915050565b60006139c1600019846008026139a3565b1980831691505092915050565b60006139da83836139b0565b9150826002028217905092915050565b6139f382612f6c565b67ffffffffffffffff811115613a0c57613a0b61310a565b5b613a168254613689565b613a2182828561395d565b600060209050601f831160018114613a545760008415613a42578287015190505b613a4c85826139ce565b865550613ab4565b601f198416613a6286613848565b60005b82811015613a8a57848901518255600182019150602085019450602081019050613a65565b86831015613aa75784890151613aa3601f8916826139b0565b8355505b6001600288020188555050505b505050505050565b60006040820190508181036000830152613ad68185612fc3565b9050613ae56020830184612f42565b9392505050565b600060a0820190508181036000830152613b068188612fc3565b9050613b1560208301876130d6565b613b2260408301866130d6565b613b2f6060830185612f42565b613b3c6080830184612f42565b9695505050505050565b7f4c5020506169722063616e6e6f742062652074686520446561642077616c6c6560008201527f742c206f72203021000000000000000000000000000000000000000000000000602082015250565b6000613ba2602883612f77565b9150613bad82613b46565b604082019050919050565b60006020820190508181036000830152613bd181613b95565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613c1282612f38565b9150613c1d83612f38565b925082613c2d57613c2c613bd8565b5b828204905092915050565b7f43616e6e6f74206c6971756964617465206d6f7265207468616e203225206f6660008201527f2074686520737570706c79206174206f6e636521000000000000000000000000602082015250565b6000613c94603483612f77565b9150613c9f82613c38565b604082019050919050565b60006020820190508181036000830152613cc381613c87565b9050919050565b60008160011c9050919050565b6000808291508390505b6001851115613d2157808604811115613cfd57613cfc613792565b5b6001851615613d0c5780820291505b8081029050613d1a85613cca565b9450613ce1565b94509492505050565b600082613d3a5760019050613df6565b81613d485760009050613df6565b8160018114613d5e5760028114613d6857613d97565b6001915050613df6565b60ff841115613d7a57613d79613792565b5b8360020a915084821115613d9157613d90613792565b5b50613df6565b5060208310610133831016604e8410600b8410161715613dcc5782820a905083811115613dc757613dc6613792565b5b613df6565b613dd98484846001613cd7565b92509050818404811115613df057613def613792565b5b81810290505b9392505050565b6000613e0882612f38565b9150613e138361347b565b9250613e407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613d2a565b905092915050565b6000613e5382612f38565b9150613e5e83612f38565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e9757613e96613792565b5b828202905092915050565b6000606082019050613eb760008301866130d6565b613ec460208301856130d6565b613ed16040830184612f42565b949350505050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613f35602583612f77565b9150613f4082613ed9565b604082019050919050565b60006020820190508181036000830152613f6481613f28565b9050919050565b7f45524332303a20746f74616c20746178206d757374206e6f742062652067726560008201527f61746572207468616e2031302500000000000000000000000000000000000000602082015250565b6000613fc7602d83612f77565b9150613fd282613f6b565b604082019050919050565b60006020820190508181036000830152613ff681613fba565b9050919050565b60006040820190506140126000830185612f0e565b61401f60208301846130d6565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614082602683612f77565b915061408d82614026565b604082019050919050565b600060208201905081810360008301526140b181614075565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614114602483612f77565b915061411f826140b8565b604082019050919050565b6000602082019050818103600083015261414381614107565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006141a6602283612f77565b91506141b18261414a565b604082019050919050565b600060208201905081810360008301526141d581614199565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614238602583612f77565b9150614243826141dc565b604082019050919050565b600060208201905081810360008301526142678161422b565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006142ca602383612f77565b91506142d58261426e565b604082019050919050565b600060208201905081810360008301526142f9816142bd565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061435c602683612f77565b915061436782614300565b604082019050919050565b6000602082019050818103600083015261438b8161434f565b9050919050565b600061439d82612f38565b91506143a883612f38565b92508282039050818111156143c0576143bf613792565b5b92915050565b7f4661696c656420746f2073656e64204554480000000000000000000000000000600082015250565b60006143fc601283612f77565b9150614407826143c6565b602082019050919050565b6000602082019050818103600083015261442b816143ef565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473207460008201527f6865206d6178207472616e73616374696f6e20616d6f756e7400000000000000602082015250565b600061448e603983612f77565b915061449982614432565b604082019050919050565b600060208201905081810360008301526144bd81614481565b9050919050565b7f45524332303a2062616c616e636520616d6f756e74206578636565646564206d60008201527f61782077616c6c657420616d6f756e74206c696d697400000000000000000000602082015250565b6000614520603683612f77565b915061452b826144c4565b604082019050919050565b6000602082019050818103600083015261454f81614513565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061458c602083612f77565b915061459782614556565b602082019050919050565b600060208201905081810360008301526145bb8161457f565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006145f8601d83612f77565b9150614603826145c2565b602082019050919050565b60006020820190508181036000830152614627816145eb565b9050919050565b60006060820190506146436000830186612f42565b6146506020830185612f42565b61465d6040830184612f42565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815190506146a381613032565b92915050565b6000602082840312156146bf576146be613028565b5b60006146cd84828501614694565b91505092915050565b6000819050919050565b60006146fb6146f66146f1846146d6565b61327e565b612f38565b9050919050565b61470b816146e0565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61474681612efc565b82525050565b6000614758838361473d565b60208301905092915050565b6000602082019050919050565b600061477c82614711565b614786818561471c565b93506147918361472d565b8060005b838110156147c25781516147a9888261474c565b97506147b483614764565b925050600181019050614795565b5085935050505092915050565b600060a0820190506147e46000830188612f42565b6147f16020830187614702565b81810360408301526148038186614771565b90506148126060830185612f0e565b61481f6080830184612f42565b9695505050505050565b600060c08201905061483e6000830189612f0e565b61484b6020830188612f42565b6148586040830187614702565b6148656060830186614702565b6148726080830185612f0e565b61487f60a0830184612f42565b979650505050505050565b6000815190506148998161305e565b92915050565b6000806000606084860312156148b8576148b7613028565b5b60006148c68682870161488a565b93505060206148d78682870161488a565b92505060406148e88682870161488a565b915050925092509256fea2646970667358221220662c2cd14135ccce2b9a986111545aafccc0dceef6265a43e28cadba1a9134c364736f6c63430008100033

Deployed Bytecode Sourcemap

28906:13524:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29611:64;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30736:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18624:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20898:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32070:594;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34863:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31486:576;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19762:110;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33544:694;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36128:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21722:297;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41392:602;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19605:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23438:272;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34921:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32711:254;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29309:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30614:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;42002:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18789:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15883:103;;;;;;;;;;;;;:::i;:::-;;34246:524;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29529:75;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29726:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30838:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42192:198;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29405:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15235:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18448:106;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30671:56;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;29931:211;;;;;;;;;;;;;:::i;:::-;;22522:507;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20342:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29465:57;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29859:63;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40993:391;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32973:262;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40635:350;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29682:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29783:69;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19935:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30883:54;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39046:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33243:262;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16141:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29213:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30779:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29611:64;;;;;;;;;;;;;:::o;30736:36::-;;;;:::o;18624:102::-;18680:13;18713:5;18706:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18624:102;:::o;20898:244::-;21019:4;21041:13;21057:12;:10;:12::i;:::-;21041:28;;21080:32;21089:5;21096:7;21105:6;21080:8;:32::i;:::-;21130:4;21123:11;;;20898:244;;;;:::o;32070:594::-;32168:11;;32155:9;:24;;32147:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;32245:14;;32223:10;:18;;;:36;;32215:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;32315:9;32293:18;;:31;;;;;;;:::i;:::-;;;;;;;;32335:43;32345:10;32357:4;;;;;;;;;;;32363:14;;32335:9;:43::i;:::-;32430:166;;;;;;;;32458:10;32430:166;;;;32483:4;32430:166;;;;;;32502:15;32430:166;;;;32576:9;32532:16;32549:10;32532:28;;;;;;:::i;:::-;;;;;;;;;;;;;:41;;;:53;;;;:::i;:::-;32430:166;;;32399:16;32416:10;32399:28;;;;;;:::i;:::-;;;;;;;;;;;;;:197;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32612:44;32628:10;32640:15;32612:44;;;;;;;:::i;:::-;;;;;;;;32070:594;:::o;34863:51::-;;;:::o;31486:576::-;31582:11;;31569:9;:24;;31561:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;31659:14;;31637:10;:18;;;:36;;31629:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;31729:9;31707:18;;:31;;;;;;;:::i;:::-;;;;;;;;31749:43;31759:10;31771:4;;;;;;;;;;;31777:14;;31749:9;:43::i;:::-;31834:162;;;;;;;;31859:11;31834:162;;;;31885:4;31834:162;;;;;;31904:15;31834:162;;;;31976:9;31934:13;31948:11;31934:26;;;;;;:::i;:::-;;;;;;;;;;;;;:39;;;:51;;;;:::i;:::-;31834:162;;;31805:13;31819:11;31805:26;;;;;;:::i;:::-;;;;;;;;;;;;;:191;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32012:42;32025:11;32038:15;32012:42;;;;;;;:::i;:::-;;;;;;;;31486:576;:::o;19762:110::-;19825:7;19852:12;;19845:19;;19762:110;:::o;33544:694::-;15121:13;:11;:13::i;:::-;33710:10:::1;33706:430;;;33770:147;;;;;;;;33802:12;33770:147;;;;33833:11;33770:147;;;;;;33863:12;33770:147;;;;33894:8;33770:147;;::::0;33737:16:::1;33754:12;33737:30;;;;;;:::i;:::-;;;;;;;;;;;;;:180;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33706:430;;;33980:144;;;;;;;;34009:12;33980:144;;;;34040:11;33980:144;;;;;;34070:12;33980:144;;;;34101:8;33980:144;;::::0;33950:13:::1;33964:12;33950:27;;;;;;:::i;:::-;;;;;;;;;;;;;:174;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33706:430;34151:79;34168:12;34182:10;34194:11;34207:12;34221:8;34151:79;;;;;;;;;;:::i;:::-;;;;;;;;33544:694:::0;;;;;:::o;36128:288::-;15121:13;:11;:13::i;:::-;36210:4:::1;;;;;;;;;;;36201:13;;:5;:13;;::::0;36193:66:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;36295:1;36278:19;;:5;:19;;::::0;36270:72:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;36369:5;36353:13;;:21;;;;;;;;;;;;;;;;;;36390:18;36402:5;36390:18;;;;;;:::i;:::-;;;;;;;;36128:288:::0;:::o;21722:297::-;21855:4;21872:15;21890:12;:10;:12::i;:::-;21872:30;;21913:38;21929:4;21935:7;21944:6;21913:15;:38::i;:::-;21962:27;21972:4;21978:2;21982:6;21962:9;:27::i;:::-;22007:4;22000:11;;;21722:297;;;;;:::o;41392:602::-;41549:4;15121:13;:11;:13::i;:::-;41622:2:::1;41612:7;;:12;;;;:::i;:::-;41579:30;:45;41571:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;41737:2;41727:7;;:12;;;;:::i;:::-;41700:24;:39;41692:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;41876:9;;;;;;;;;;;41872:2;:13;;;;:::i;:::-;41839:30;:46;;;;:::i;:::-;41807:29;:78;;;;41953:9;;;;;;;;;;;41949:2;:13;;;;:::i;:::-;41922:24;:40;;;;:::i;:::-;41896:23;:66;;;;41982:4;41975:11;;41392:602:::0;;;;:::o;19605:92::-;19663:5;19688:1;19681:8;;19605:92;:::o;23438:272::-;23555:4;23577:13;23593:12;:10;:12::i;:::-;23577:28;;23616:64;23625:5;23632:7;23669:10;23641:25;23651:5;23658:7;23641:9;:25::i;:::-;:38;;;;:::i;:::-;23616:8;:64::i;:::-;23698:4;23691:11;;;23438:272;;;;:::o;34921:28::-;;;;;;;;;;;;;:::o;32711:254::-;32798:4;32819:10;32815:89;;;32853:16;32870:12;32853:30;;;;;;:::i;:::-;;;;;;;;;;;;;:39;;;;;;;;;;;;32846:46;;;;32815:89;32921:13;32935:12;32921:27;;;;;;:::i;:::-;;;;;;;;;;;;;:36;;;;;;;;;;;;32914:43;;32711:254;;;;;:::o;29309:35::-;;;;:::o;30614:50::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42002:182::-;42104:4;15121:13;:11;:13::i;:::-;42140:12:::1;42126:11;:26;;;;42172:4;42165:11;;42002:182:::0;;;:::o;18789:177::-;18908:7;18940:9;:18;18950:7;18940:18;;;;;;;;;;;;;;;;18933:25;;18789:177;;;:::o;15883:103::-;15121:13;:11;:13::i;:::-;15948:30:::1;15975:1;15948:18;:30::i;:::-;15883:103::o:0;34246:524::-;15121:13;:11;:13::i;:::-;34339:6:::1;34335:374;;;34366:10;34362:133;;;34414:5;34397:14;:22;;;;34362:133;;;34474:5;34460:11;:19;;;;34362:133;34335:374;;;34531:10;34527:171;;;34594:9;;;;;;;;;;;34590:2;:13;;;;:::i;:::-;34582:5;:21;;;;:::i;:::-;34562:17;:41;;;;34527:171;;;34673:9;;;;;;;;;;;34669:2;:13;;;;:::i;:::-;34661:5;:21;;;;:::i;:::-;34644:14;:38;;;;34527:171;34335:374;34724:38;34736:6;34744:10;34756:5;34724:38;;;;;;;;:::i;:::-;;;;;;;;34246:524:::0;;;:::o;29529:75::-;;;;;;;;;;;;;:::o;29726:50::-;;;;;;;;;;;;;;;;;;;;;;:::o;30838:38::-;;;;:::o;42192:198::-;42302:4;15121:13;:11;:13::i;:::-;42342:16:::1;42324:15;:34;;;;42378:4;42371:11;;42192:198:::0;;;:::o;29405:53::-;;;;:::o;15235:87::-;15281:7;15308:6;;;;;;;;;;;15301:13;;15235:87;:::o;18448:106::-;18506:13;18539:7;18532:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18448:106;:::o;30671:56::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29931:211::-;15121:13;:11;:13::i;:::-;30001:1:::1;29983:15;:19;;;;30031:1;30013:15;:19;;;;30072:9;;;;;;;;;;;30068:2;:13;;;;:::i;:::-;30057:8;:24;;;;:::i;:::-;30043:11;:38;;;;30125:9;;;;;;;;;;;30121:2;:13;;;;:::i;:::-;30110:8;:24;;;;:::i;:::-;30092:15;:42;;;;29931:211::o:0;22522:507::-;22644:4;22666:13;22682:12;:10;:12::i;:::-;22666:28;;22705:24;22732:25;22742:5;22749:7;22732:9;:25::i;:::-;22705:52;;22810:15;22790:16;:35;;22768:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;22926:60;22935:5;22942:7;22970:15;22951:16;:34;22926:8;:60::i;:::-;23017:4;23010:11;;;;22522:507;;;;:::o;20342:236::-;20459:4;20481:13;20497:12;:10;:12::i;:::-;20481:28;;20520;20530:5;20537:2;20541:6;20520:9;:28::i;:::-;20566:4;20559:11;;;20342:236;;;;:::o;29465:57::-;;;;:::o;29859:63::-;;;;:::o;40993:391::-;41141:4;15121:13;:11;:13::i;:::-;41210:2:::1;41189:16;41172;:33;;;;:::i;:::-;41171:41;;41163:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;41291:16;41273:15;:34;;;;41336:16;41318:15;:34;;;;41372:4;41365:11;;40993:391:::0;;;;:::o;32973:262::-;33060:4;33081:10;33077:93;;;33115:16;33132:12;33115:30;;;;;;:::i;:::-;;;;;;;;;;;;;:43;;;33108:50;;;;33077:93;33187:13;33201:12;33187:27;;;;;;:::i;:::-;;;;;;;;;;;;;:40;;;33180:47;;32973:262;;;;;:::o;40635:350::-;40738:4;15121:13;:11;:13::i;:::-;40781:4:::1;;;;;;;;;;;40768:17;;:9;:17;;::::0;40760:70:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;40870:1;40849:23;;:9;:23;;::::0;40841:76:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;40946:9;40928:15;;:27;;;;;;;;;;;;;;;;;;40973:4;40966:11;;40635:350:::0;;;:::o;29682:37::-;;;;:::o;29783:69::-;;;;:::o;19935:201::-;20069:7;20101:11;:18;20113:5;20101:18;;;;;;;;;;;;;;;:27;20120:7;20101:27;;;;;;;;;;;;;;;;20094:34;;19935:201;;;;:::o;30883:54::-;;;;:::o;39046:189::-;15121:13;:11;:13::i;:::-;39163:7:::1;39132:18;:28;39151:8;39132:28;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;39186:41;39209:8;39219:7;39186:41;;;;;;;:::i;:::-;;;;;;;;39046:189:::0;;:::o;33243:262::-;33334:4;33355:10;33351:91;;;33389:16;33406:12;33389:30;;;;;;:::i;:::-;;;;;;;;;;;;;:41;;;33382:48;;;;33351:91;33459:13;33473:12;33459:27;;;;;;:::i;:::-;;;;;;;;;;;;;:38;;;33452:45;;33243:262;;;;;:::o;16141:238::-;15121:13;:11;:13::i;:::-;16264:1:::1;16244:22;;:8;:22;;::::0;16222:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;16343:28;16362:8;16343:18;:28::i;:::-;16141:238:::0;:::o;29213:35::-;;;;:::o;30779:50::-;;;;:::o;14028:98::-;14081:7;14108:10;14101:17;;14028:98;:::o;25745:380::-;25898:1;25881:19;;:5;:19;;;25873:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25979:1;25960:21;;:7;:21;;;25952:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26063:6;26033:11;:18;26045:5;26033:18;;;;;;;;;;;;;;;:27;26052:7;26033:27;;;;;;;;;;;;;;;:36;;;;26101:7;26085:32;;26094:5;26085:32;;;26110:6;26085:32;;;;;;:::i;:::-;;;;;;;;25745:380;;;:::o;36894:2144::-;37008:1;36992:18;;:4;:18;;;36984:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37085:1;37071:16;;:2;:16;;;37063:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;37165:6;37146:15;37156:4;37146:9;:15::i;:::-;:25;;37138:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;37240:13;;;;;;;;;;;37232:21;;:4;:21;;;:44;;;;37263:13;;;;;;;;;;;37257:19;;:2;:19;;;37232:44;37231:67;;;;;37282:16;;;;;;;;;;;37281:17;37231:67;37227:1804;;;37327:13;;;;;;;;;;;37319:21;;:4;:21;;;37315:681;;37361:32;37423:18;;37396:24;37414:4;37396:9;:24::i;:::-;:45;;;;:::i;:::-;37361:80;;37492:29;;37464:24;:57;37460:152;;37546:46;37562:29;;37546:15;:46::i;:::-;37460:152;37658:23;;37635:18;;37634:47;37630:351;;37706:42;37724:23;;37706:17;:42::i;:::-;37793:23;;37771:18;;:45;;;;;;;:::i;:::-;;;;;;;;37839:9;37859:15;;;;;;;;;;;37851:29;;:52;37881:21;37851:52;;;;;;;;;;;;;;;;;;;;;;;37839:64;;37934:4;37926:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;37683:298;37630:351;37342:654;37315:681;38012:22;38053:18;:24;38072:4;38053:24;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;;38081:18;:22;38100:2;38081:22;;;;;;;;;;;;;;;;;;;;;;;;;38053:50;38049:839;;;38141:6;38124:23;;38049:839;;;38220:11;;38210:6;:21;;38202:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;38323:13;;;;;;;;;;;38315:21;;:4;:21;;;38312:178;;38396:15;;38378:13;38388:2;38378:9;:13::i;:::-;38369:6;:22;;;;:::i;:::-;38368:43;;38360:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;38312:178;38510:22;38565:3;38546:15;;38537:6;:24;;;;:::i;:::-;38536:32;;;;:::i;:::-;38510:59;;38588:22;38643:3;38624:15;;38615:6;:24;;;;:::i;:::-;38614:32;;;;:::i;:::-;38588:59;;38710:14;38693;:31;;;;:::i;:::-;38683:6;:42;;;;:::i;:::-;38666:59;;38766:14;38744:18;;:36;;;;;;;:::i;:::-;;;;;;;;38801:71;38817:4;38831;38856:14;38839;:31;;;;:::i;:::-;38801:15;:71::i;:::-;38183:705;;38049:839;38902:41;38918:4;38924:2;38928:14;38902:15;:41::i;:::-;37300:1655;37227:1804;;;38986:33;39002:4;39008:2;39012:6;38986:15;:33::i;:::-;37227:1804;36894:2144;;;:::o;15400:132::-;15475:12;:10;:12::i;:::-;15464:23;;:7;:5;:7::i;:::-;:23;;;15456:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15400:132::o;26416:502::-;26551:24;26578:25;26588:5;26595:7;26578:9;:25::i;:::-;26551:52;;26638:17;26618:16;:37;26614:297;;26718:6;26698:16;:26;;26672:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;26833:51;26842:5;26849:7;26877:6;26858:16;:25;26833:8;:51::i;:::-;26614:297;26540:378;26416:502;;;:::o;16539:191::-;16613:16;16632:6;;;;;;;;;;;16613:25;;16658:8;16649:6;;:17;;;;;;;;;;;;;;;;;;16713:8;16682:40;;16703:8;16682:40;;;;;;;;;;;;16602:128;16539:191;:::o;39243:474::-;35180:4;35161:16;;:23;;;;;;;;;;;;;;;;;;39329:12:::1;39368:1;39345:20;:24;;;;:::i;:::-;39329:41;;39381:17;39425:4;39402:20;:27;;;;:::i;:::-;39381:49;;39443:22;39468:21;39443:46;;39502:23;39520:4;39502:17;:23::i;:::-;39538:18;39584:14;39560:21;:38;;;;:::i;:::-;39538:61;;39612:36;39626:9;39637:10;39612:13;:36::i;:::-;39666:43;39681:4;39687:10;39699:9;39666:43;;;;;;;;:::i;:::-;;;;;;;;39318:399;;;;35226:5:::0;35207:16;;:24;;;;;;;;;;;;;;;;;;39243:474;:::o;39725:488::-;35180:4;35161:16;;:23;;;;;;;;;;;;;;;;;;39804:21:::1;39842:1;39828:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39804:40;;39873:4;39855;39860:1;39855:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;39899:15;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39889:4;39894:1;39889:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;::::0;::::1;39934:62;39951:4;39966:15;39984:11;39934:8;:62::i;:::-;40009:15;:66;;;40090:11;40116:1;40132:4;40159;40179:15;40009:196;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;39793:420;35226:5:::0;35207:16;;:24;;;;;;;;;;;;;;;;;;39725:488;:::o;26926:776::-;27073:1;27057:18;;:4;:18;;;27049:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27150:1;27136:16;;:2;:16;;;27128:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;27205:19;27227:9;:15;27237:4;27227:15;;;;;;;;;;;;;;;;27205:37;;27290:6;27275:11;:21;;27253:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;27430:6;27416:11;:20;27398:9;:15;27408:4;27398:15;;;;;;;;;;;;;;;:38;;;;27633:6;27616:9;:13;27626:2;27616:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;27683:2;27668:26;;27677:4;27668:26;;;27687:6;27668:26;;;;;;:::i;:::-;;;;;;;;27038:664;26926:776;;;:::o;40221:406::-;35180:4;35161:16;;:23;;;;;;;;;;;;;;;;;;40338:62:::1;40355:4;40370:15;40388:11;40338:8;:62::i;:::-;40413:15;:31;;;40452:9;40485:4;40505:11;40531:1;40547::::0;40563:15:::1;;;;;;;;;;;40593;40413:206;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;35226:5:::0;35207:16;;:24;;;;;;;;;;;;;;;;;;40221:406;;:::o;7:126:1:-;44:7;84:42;77:5;73:54;62:65;;7:126;;;:::o;139:96::-;176:7;205:24;223:5;205:24;:::i;:::-;194:35;;139:96;;;:::o;241:118::-;328:24;346:5;328:24;:::i;:::-;323:3;316:37;241:118;;:::o;365:222::-;458:4;496:2;485:9;481:18;473:26;;509:71;577:1;566:9;562:17;553:6;509:71;:::i;:::-;365:222;;;;:::o;593:77::-;630:7;659:5;648:16;;593:77;;;:::o;676:118::-;763:24;781:5;763:24;:::i;:::-;758:3;751:37;676:118;;:::o;800:222::-;893:4;931:2;920:9;916:18;908:26;;944:71;1012:1;1001:9;997:17;988:6;944:71;:::i;:::-;800:222;;;;:::o;1028:99::-;1080:6;1114:5;1108:12;1098:22;;1028:99;;;:::o;1133:169::-;1217:11;1251:6;1246:3;1239:19;1291:4;1286:3;1282:14;1267:29;;1133:169;;;;:::o;1308:246::-;1389:1;1399:113;1413:6;1410:1;1407:13;1399:113;;;1498:1;1493:3;1489:11;1483:18;1479:1;1474:3;1470:11;1463:39;1435:2;1432:1;1428:10;1423:15;;1399:113;;;1546:1;1537:6;1532:3;1528:16;1521:27;1370:184;1308:246;;;:::o;1560:102::-;1601:6;1652:2;1648:7;1643:2;1636:5;1632:14;1628:28;1618:38;;1560:102;;;:::o;1668:377::-;1756:3;1784:39;1817:5;1784:39;:::i;:::-;1839:71;1903:6;1898:3;1839:71;:::i;:::-;1832:78;;1919:65;1977:6;1972:3;1965:4;1958:5;1954:16;1919:65;:::i;:::-;2009:29;2031:6;2009:29;:::i;:::-;2004:3;2000:39;1993:46;;1760:285;1668:377;;;;:::o;2051:313::-;2164:4;2202:2;2191:9;2187:18;2179:26;;2251:9;2245:4;2241:20;2237:1;2226:9;2222:17;2215:47;2279:78;2352:4;2343:6;2279:78;:::i;:::-;2271:86;;2051:313;;;;:::o;2370:75::-;2403:6;2436:2;2430:9;2420:19;;2370:75;:::o;2451:117::-;2560:1;2557;2550:12;2574:117;2683:1;2680;2673:12;2697:122;2770:24;2788:5;2770:24;:::i;:::-;2763:5;2760:35;2750:63;;2809:1;2806;2799:12;2750:63;2697:122;:::o;2825:139::-;2871:5;2909:6;2896:20;2887:29;;2925:33;2952:5;2925:33;:::i;:::-;2825:139;;;;:::o;2970:122::-;3043:24;3061:5;3043:24;:::i;:::-;3036:5;3033:35;3023:63;;3082:1;3079;3072:12;3023:63;2970:122;:::o;3098:139::-;3144:5;3182:6;3169:20;3160:29;;3198:33;3225:5;3198:33;:::i;:::-;3098:139;;;;:::o;3243:474::-;3311:6;3319;3368:2;3356:9;3347:7;3343:23;3339:32;3336:119;;;3374:79;;:::i;:::-;3336:119;3494:1;3519:53;3564:7;3555:6;3544:9;3540:22;3519:53;:::i;:::-;3509:63;;3465:117;3621:2;3647:53;3692:7;3683:6;3672:9;3668:22;3647:53;:::i;:::-;3637:63;;3592:118;3243:474;;;;;:::o;3723:90::-;3757:7;3800:5;3793:13;3786:21;3775:32;;3723:90;;;:::o;3819:109::-;3900:21;3915:5;3900:21;:::i;:::-;3895:3;3888:34;3819:109;;:::o;3934:210::-;4021:4;4059:2;4048:9;4044:18;4036:26;;4072:65;4134:1;4123:9;4119:17;4110:6;4072:65;:::i;:::-;3934:210;;;;:::o;4150:117::-;4259:1;4256;4249:12;4273:117;4382:1;4379;4372:12;4396:180;4444:77;4441:1;4434:88;4541:4;4538:1;4531:15;4565:4;4562:1;4555:15;4582:281;4665:27;4687:4;4665:27;:::i;:::-;4657:6;4653:40;4795:6;4783:10;4780:22;4759:18;4747:10;4744:34;4741:62;4738:88;;;4806:18;;:::i;:::-;4738:88;4846:10;4842:2;4835:22;4625:238;4582:281;;:::o;4869:129::-;4903:6;4930:20;;:::i;:::-;4920:30;;4959:33;4987:4;4979:6;4959:33;:::i;:::-;4869:129;;;:::o;5004:308::-;5066:4;5156:18;5148:6;5145:30;5142:56;;;5178:18;;:::i;:::-;5142:56;5216:29;5238:6;5216:29;:::i;:::-;5208:37;;5300:4;5294;5290:15;5282:23;;5004:308;;;:::o;5318:146::-;5415:6;5410:3;5405;5392:30;5456:1;5447:6;5442:3;5438:16;5431:27;5318:146;;;:::o;5470:425::-;5548:5;5573:66;5589:49;5631:6;5589:49;:::i;:::-;5573:66;:::i;:::-;5564:75;;5662:6;5655:5;5648:21;5700:4;5693:5;5689:16;5738:3;5729:6;5724:3;5720:16;5717:25;5714:112;;;5745:79;;:::i;:::-;5714:112;5835:54;5882:6;5877:3;5872;5835:54;:::i;:::-;5554:341;5470:425;;;;;:::o;5915:340::-;5971:5;6020:3;6013:4;6005:6;6001:17;5997:27;5987:122;;6028:79;;:::i;:::-;5987:122;6145:6;6132:20;6170:79;6245:3;6237:6;6230:4;6222:6;6218:17;6170:79;:::i;:::-;6161:88;;5977:278;5915:340;;;;:::o;6261:509::-;6330:6;6379:2;6367:9;6358:7;6354:23;6350:32;6347:119;;;6385:79;;:::i;:::-;6347:119;6533:1;6522:9;6518:17;6505:31;6563:18;6555:6;6552:30;6549:117;;;6585:79;;:::i;:::-;6549:117;6690:63;6745:7;6736:6;6725:9;6721:22;6690:63;:::i;:::-;6680:73;;6476:287;6261:509;;;;:::o;6776:60::-;6804:3;6825:5;6818:12;;6776:60;;;:::o;6842:142::-;6892:9;6925:53;6943:34;6952:24;6970:5;6952:24;:::i;:::-;6943:34;:::i;:::-;6925:53;:::i;:::-;6912:66;;6842:142;;;:::o;6990:126::-;7040:9;7073:37;7104:5;7073:37;:::i;:::-;7060:50;;6990:126;;;:::o;7122:152::-;7198:9;7231:37;7262:5;7231:37;:::i;:::-;7218:50;;7122:152;;;:::o;7280:183::-;7393:63;7450:5;7393:63;:::i;:::-;7388:3;7381:76;7280:183;;:::o;7469:274::-;7588:4;7626:2;7615:9;7611:18;7603:26;;7639:97;7733:1;7722:9;7718:17;7709:6;7639:97;:::i;:::-;7469:274;;;;:::o;7749:116::-;7819:21;7834:5;7819:21;:::i;:::-;7812:5;7809:32;7799:60;;7855:1;7852;7845:12;7799:60;7749:116;:::o;7871:133::-;7914:5;7952:6;7939:20;7930:29;;7968:30;7992:5;7968:30;:::i;:::-;7871:133;;;;:::o;8010:1079::-;8109:6;8117;8125;8133;8141;8190:3;8178:9;8169:7;8165:23;8161:33;8158:120;;;8197:79;;:::i;:::-;8158:120;8345:1;8334:9;8330:17;8317:31;8375:18;8367:6;8364:30;8361:117;;;8397:79;;:::i;:::-;8361:117;8502:63;8557:7;8548:6;8537:9;8533:22;8502:63;:::i;:::-;8492:73;;8288:287;8614:2;8640:50;8682:7;8673:6;8662:9;8658:22;8640:50;:::i;:::-;8630:60;;8585:115;8739:2;8765:50;8807:7;8798:6;8787:9;8783:22;8765:50;:::i;:::-;8755:60;;8710:115;8864:2;8890:53;8935:7;8926:6;8915:9;8911:22;8890:53;:::i;:::-;8880:63;;8835:118;8992:3;9019:53;9064:7;9055:6;9044:9;9040:22;9019:53;:::i;:::-;9009:63;;8963:119;8010:1079;;;;;;;;:::o;9095:329::-;9154:6;9203:2;9191:9;9182:7;9178:23;9174:32;9171:119;;;9209:79;;:::i;:::-;9171:119;9329:1;9354:53;9399:7;9390:6;9379:9;9375:22;9354:53;:::i;:::-;9344:63;;9300:117;9095:329;;;;:::o;9430:619::-;9507:6;9515;9523;9572:2;9560:9;9551:7;9547:23;9543:32;9540:119;;;9578:79;;:::i;:::-;9540:119;9698:1;9723:53;9768:7;9759:6;9748:9;9744:22;9723:53;:::i;:::-;9713:63;;9669:117;9825:2;9851:53;9896:7;9887:6;9876:9;9872:22;9851:53;:::i;:::-;9841:63;;9796:118;9953:2;9979:53;10024:7;10015:6;10004:9;10000:22;9979:53;:::i;:::-;9969:63;;9924:118;9430:619;;;;;:::o;10055:474::-;10123:6;10131;10180:2;10168:9;10159:7;10155:23;10151:32;10148:119;;;10186:79;;:::i;:::-;10148:119;10306:1;10331:53;10376:7;10367:6;10356:9;10352:22;10331:53;:::i;:::-;10321:63;;10277:117;10433:2;10459:53;10504:7;10495:6;10484:9;10480:22;10459:53;:::i;:::-;10449:63;;10404:118;10055:474;;;;;:::o;10535:86::-;10570:7;10610:4;10603:5;10599:16;10588:27;;10535:86;;;:::o;10627:112::-;10710:22;10726:5;10710:22;:::i;:::-;10705:3;10698:35;10627:112;;:::o;10745:214::-;10834:4;10872:2;10861:9;10857:18;10849:26;;10885:67;10949:1;10938:9;10934:17;10925:6;10885:67;:::i;:::-;10745:214;;;;:::o;10965:648::-;11040:6;11048;11097:2;11085:9;11076:7;11072:23;11068:32;11065:119;;;11103:79;;:::i;:::-;11065:119;11251:1;11240:9;11236:17;11223:31;11281:18;11273:6;11270:30;11267:117;;;11303:79;;:::i;:::-;11267:117;11408:63;11463:7;11454:6;11443:9;11439:22;11408:63;:::i;:::-;11398:73;;11194:287;11520:2;11546:50;11588:7;11579:6;11568:9;11564:22;11546:50;:::i;:::-;11536:60;;11491:115;10965:648;;;;;:::o;11619:632::-;11810:4;11848:3;11837:9;11833:19;11825:27;;11898:9;11892:4;11888:20;11884:1;11873:9;11869:17;11862:47;11926:78;11999:4;11990:6;11926:78;:::i;:::-;11918:86;;12014:66;12076:2;12065:9;12061:18;12052:6;12014:66;:::i;:::-;12090:72;12158:2;12147:9;12143:18;12134:6;12090:72;:::i;:::-;12172;12240:2;12229:9;12225:18;12216:6;12172:72;:::i;:::-;11619:632;;;;;;;:::o;12257:329::-;12316:6;12365:2;12353:9;12344:7;12340:23;12336:32;12333:119;;;12371:79;;:::i;:::-;12333:119;12491:1;12516:53;12561:7;12552:6;12541:9;12537:22;12516:53;:::i;:::-;12506:63;;12462:117;12257:329;;;;:::o;12592:607::-;12663:6;12671;12679;12728:2;12716:9;12707:7;12703:23;12699:32;12696:119;;;12734:79;;:::i;:::-;12696:119;12854:1;12879:50;12921:7;12912:6;12901:9;12897:22;12879:50;:::i;:::-;12869:60;;12825:114;12978:2;13004:50;13046:7;13037:6;13026:9;13022:22;13004:50;:::i;:::-;12994:60;;12949:115;13103:2;13129:53;13174:7;13165:6;13154:9;13150:22;13129:53;:::i;:::-;13119:63;;13074:118;12592:607;;;;;:::o;13205:474::-;13273:6;13281;13330:2;13318:9;13309:7;13305:23;13301:32;13298:119;;;13336:79;;:::i;:::-;13298:119;13456:1;13481:53;13526:7;13517:6;13506:9;13502:22;13481:53;:::i;:::-;13471:63;;13427:117;13583:2;13609:53;13654:7;13645:6;13634:9;13630:22;13609:53;:::i;:::-;13599:63;;13554:118;13205:474;;;;;:::o;13685:468::-;13750:6;13758;13807:2;13795:9;13786:7;13782:23;13778:32;13775:119;;;13813:79;;:::i;:::-;13775:119;13933:1;13958:53;14003:7;13994:6;13983:9;13979:22;13958:53;:::i;:::-;13948:63;;13904:117;14060:2;14086:50;14128:7;14119:6;14108:9;14104:22;14086:50;:::i;:::-;14076:60;;14031:115;13685:468;;;;;:::o;14159:180::-;14207:77;14204:1;14197:88;14304:4;14301:1;14294:15;14328:4;14325:1;14318:15;14345:320;14389:6;14426:1;14420:4;14416:12;14406:22;;14473:1;14467:4;14463:12;14494:18;14484:81;;14550:4;14542:6;14538:17;14528:27;;14484:81;14612:2;14604:6;14601:14;14581:18;14578:38;14575:84;;14631:18;;:::i;:::-;14575:84;14396:269;14345:320;;;:::o;14671:170::-;14811:22;14807:1;14799:6;14795:14;14788:46;14671:170;:::o;14847:366::-;14989:3;15010:67;15074:2;15069:3;15010:67;:::i;:::-;15003:74;;15086:93;15175:3;15086:93;:::i;:::-;15204:2;15199:3;15195:12;15188:19;;14847:366;;;:::o;15219:419::-;15385:4;15423:2;15412:9;15408:18;15400:26;;15472:9;15466:4;15462:20;15458:1;15447:9;15443:17;15436:47;15500:131;15626:4;15500:131;:::i;:::-;15492:139;;15219:419;;;:::o;15644:168::-;15784:20;15780:1;15772:6;15768:14;15761:44;15644:168;:::o;15818:366::-;15960:3;15981:67;16045:2;16040:3;15981:67;:::i;:::-;15974:74;;16057:93;16146:3;16057:93;:::i;:::-;16175:2;16170:3;16166:12;16159:19;;15818:366;;;:::o;16190:419::-;16356:4;16394:2;16383:9;16379:18;16371:26;;16443:9;16437:4;16433:20;16429:1;16418:9;16414:17;16407:47;16471:131;16597:4;16471:131;:::i;:::-;16463:139;;16190:419;;;:::o;16615:180::-;16663:77;16660:1;16653:88;16760:4;16757:1;16750:15;16784:4;16781:1;16774:15;16801:191;16841:3;16860:20;16878:1;16860:20;:::i;:::-;16855:25;;16894:20;16912:1;16894:20;:::i;:::-;16889:25;;16937:1;16934;16930:9;16923:16;;16958:3;16955:1;16952:10;16949:36;;;16965:18;;:::i;:::-;16949:36;16801:191;;;;:::o;16998:148::-;17100:11;17137:3;17122:18;;16998:148;;;;:::o;17152:390::-;17258:3;17286:39;17319:5;17286:39;:::i;:::-;17341:89;17423:6;17418:3;17341:89;:::i;:::-;17334:96;;17439:65;17497:6;17492:3;17485:4;17478:5;17474:16;17439:65;:::i;:::-;17529:6;17524:3;17520:16;17513:23;;17262:280;17152:390;;;;:::o;17548:275::-;17680:3;17702:95;17793:3;17784:6;17702:95;:::i;:::-;17695:102;;17814:3;17807:10;;17548:275;;;;:::o;17829:141::-;17878:4;17901:3;17893:11;;17924:3;17921:1;17914:14;17958:4;17955:1;17945:18;17937:26;;17829:141;;;:::o;17976:93::-;18013:6;18060:2;18055;18048:5;18044:14;18040:23;18030:33;;17976:93;;;:::o;18075:107::-;18119:8;18169:5;18163:4;18159:16;18138:37;;18075:107;;;;:::o;18188:393::-;18257:6;18307:1;18295:10;18291:18;18330:97;18360:66;18349:9;18330:97;:::i;:::-;18448:39;18478:8;18467:9;18448:39;:::i;:::-;18436:51;;18520:4;18516:9;18509:5;18505:21;18496:30;;18569:4;18559:8;18555:19;18548:5;18545:30;18535:40;;18264:317;;18188:393;;;;;:::o;18587:142::-;18637:9;18670:53;18688:34;18697:24;18715:5;18697:24;:::i;:::-;18688:34;:::i;:::-;18670:53;:::i;:::-;18657:66;;18587:142;;;:::o;18735:75::-;18778:3;18799:5;18792:12;;18735:75;;;:::o;18816:269::-;18926:39;18957:7;18926:39;:::i;:::-;18987:91;19036:41;19060:16;19036:41;:::i;:::-;19028:6;19021:4;19015:11;18987:91;:::i;:::-;18981:4;18974:105;18892:193;18816:269;;;:::o;19091:73::-;19136:3;19091:73;:::o;19170:189::-;19247:32;;:::i;:::-;19288:65;19346:6;19338;19332:4;19288:65;:::i;:::-;19223:136;19170:189;;:::o;19365:186::-;19425:120;19442:3;19435:5;19432:14;19425:120;;;19496:39;19533:1;19526:5;19496:39;:::i;:::-;19469:1;19462:5;19458:13;19449:22;;19425:120;;;19365:186;;:::o;19557:543::-;19658:2;19653:3;19650:11;19647:446;;;19692:38;19724:5;19692:38;:::i;:::-;19776:29;19794:10;19776:29;:::i;:::-;19766:8;19762:44;19959:2;19947:10;19944:18;19941:49;;;19980:8;19965:23;;19941:49;20003:80;20059:22;20077:3;20059:22;:::i;:::-;20049:8;20045:37;20032:11;20003:80;:::i;:::-;19662:431;;19647:446;19557:543;;;:::o;20106:117::-;20160:8;20210:5;20204:4;20200:16;20179:37;;20106:117;;;;:::o;20229:169::-;20273:6;20306:51;20354:1;20350:6;20342:5;20339:1;20335:13;20306:51;:::i;:::-;20302:56;20387:4;20381;20377:15;20367:25;;20280:118;20229:169;;;;:::o;20403:295::-;20479:4;20625:29;20650:3;20644:4;20625:29;:::i;:::-;20617:37;;20687:3;20684:1;20680:11;20674:4;20671:21;20663:29;;20403:295;;;;:::o;20703:1395::-;20820:37;20853:3;20820:37;:::i;:::-;20922:18;20914:6;20911:30;20908:56;;;20944:18;;:::i;:::-;20908:56;20988:38;21020:4;21014:11;20988:38;:::i;:::-;21073:67;21133:6;21125;21119:4;21073:67;:::i;:::-;21167:1;21191:4;21178:17;;21223:2;21215:6;21212:14;21240:1;21235:618;;;;21897:1;21914:6;21911:77;;;21963:9;21958:3;21954:19;21948:26;21939:35;;21911:77;22014:67;22074:6;22067:5;22014:67;:::i;:::-;22008:4;22001:81;21870:222;21205:887;;21235:618;21287:4;21283:9;21275:6;21271:22;21321:37;21353:4;21321:37;:::i;:::-;21380:1;21394:208;21408:7;21405:1;21402:14;21394:208;;;21487:9;21482:3;21478:19;21472:26;21464:6;21457:42;21538:1;21530:6;21526:14;21516:24;;21585:2;21574:9;21570:18;21557:31;;21431:4;21428:1;21424:12;21419:17;;21394:208;;;21630:6;21621:7;21618:19;21615:179;;;21688:9;21683:3;21679:19;21673:26;21731:48;21773:4;21765:6;21761:17;21750:9;21731:48;:::i;:::-;21723:6;21716:64;21638:156;21615:179;21840:1;21836;21828:6;21824:14;21820:22;21814:4;21807:36;21242:611;;;21205:887;;20795:1303;;;20703:1395;;:::o;22104:423::-;22245:4;22283:2;22272:9;22268:18;22260:26;;22332:9;22326:4;22322:20;22318:1;22307:9;22303:17;22296:47;22360:78;22433:4;22424:6;22360:78;:::i;:::-;22352:86;;22448:72;22516:2;22505:9;22501:18;22492:6;22448:72;:::i;:::-;22104:423;;;;;:::o;22533:731::-;22746:4;22784:3;22773:9;22769:19;22761:27;;22834:9;22828:4;22824:20;22820:1;22809:9;22805:17;22798:47;22862:78;22935:4;22926:6;22862:78;:::i;:::-;22854:86;;22950:66;23012:2;23001:9;22997:18;22988:6;22950:66;:::i;:::-;23026;23088:2;23077:9;23073:18;23064:6;23026:66;:::i;:::-;23102:72;23170:2;23159:9;23155:18;23146:6;23102:72;:::i;:::-;23184:73;23252:3;23241:9;23237:19;23228:6;23184:73;:::i;:::-;22533:731;;;;;;;;:::o;23270:227::-;23410:34;23406:1;23398:6;23394:14;23387:58;23479:10;23474:2;23466:6;23462:15;23455:35;23270:227;:::o;23503:366::-;23645:3;23666:67;23730:2;23725:3;23666:67;:::i;:::-;23659:74;;23742:93;23831:3;23742:93;:::i;:::-;23860:2;23855:3;23851:12;23844:19;;23503:366;;;:::o;23875:419::-;24041:4;24079:2;24068:9;24064:18;24056:26;;24128:9;24122:4;24118:20;24114:1;24103:9;24099:17;24092:47;24156:131;24282:4;24156:131;:::i;:::-;24148:139;;23875:419;;;:::o;24300:180::-;24348:77;24345:1;24338:88;24445:4;24442:1;24435:15;24469:4;24466:1;24459:15;24486:185;24526:1;24543:20;24561:1;24543:20;:::i;:::-;24538:25;;24577:20;24595:1;24577:20;:::i;:::-;24572:25;;24616:1;24606:35;;24621:18;;:::i;:::-;24606:35;24663:1;24660;24656:9;24651:14;;24486:185;;;;:::o;24677:239::-;24817:34;24813:1;24805:6;24801:14;24794:58;24886:22;24881:2;24873:6;24869:15;24862:47;24677:239;:::o;24922:366::-;25064:3;25085:67;25149:2;25144:3;25085:67;:::i;:::-;25078:74;;25161:93;25250:3;25161:93;:::i;:::-;25279:2;25274:3;25270:12;25263:19;;24922:366;;;:::o;25294:419::-;25460:4;25498:2;25487:9;25483:18;25475:26;;25547:9;25541:4;25537:20;25533:1;25522:9;25518:17;25511:47;25575:131;25701:4;25575:131;:::i;:::-;25567:139;;25294:419;;;:::o;25719:102::-;25761:8;25808:5;25805:1;25801:13;25780:34;;25719:102;;;:::o;25827:848::-;25888:5;25895:4;25919:6;25910:15;;25943:5;25934:14;;25957:712;25978:1;25968:8;25965:15;25957:712;;;26073:4;26068:3;26064:14;26058:4;26055:24;26052:50;;;26082:18;;:::i;:::-;26052:50;26132:1;26122:8;26118:16;26115:451;;;26547:4;26540:5;26536:16;26527:25;;26115:451;26597:4;26591;26587:15;26579:23;;26627:32;26650:8;26627:32;:::i;:::-;26615:44;;25957:712;;;25827:848;;;;;;;:::o;26681:1073::-;26735:5;26926:8;26916:40;;26947:1;26938:10;;26949:5;;26916:40;26975:4;26965:36;;26992:1;26983:10;;26994:5;;26965:36;27061:4;27109:1;27104:27;;;;27145:1;27140:191;;;;27054:277;;27104:27;27122:1;27113:10;;27124:5;;;27140:191;27185:3;27175:8;27172:17;27169:43;;;27192:18;;:::i;:::-;27169:43;27241:8;27238:1;27234:16;27225:25;;27276:3;27269:5;27266:14;27263:40;;;27283:18;;:::i;:::-;27263:40;27316:5;;;27054:277;;27440:2;27430:8;27427:16;27421:3;27415:4;27412:13;27408:36;27390:2;27380:8;27377:16;27372:2;27366:4;27363:12;27359:35;27343:111;27340:246;;;27496:8;27490:4;27486:19;27477:28;;27531:3;27524:5;27521:14;27518:40;;;27538:18;;:::i;:::-;27518:40;27571:5;;27340:246;27611:42;27649:3;27639:8;27633:4;27630:1;27611:42;:::i;:::-;27596:57;;;;27685:4;27680:3;27676:14;27669:5;27666:25;27663:51;;;27694:18;;:::i;:::-;27663:51;27743:4;27736:5;27732:16;27723:25;;26681:1073;;;;;;:::o;27760:281::-;27818:5;27842:23;27860:4;27842:23;:::i;:::-;27834:31;;27886:25;27902:8;27886:25;:::i;:::-;27874:37;;27930:104;27967:66;27957:8;27951:4;27930:104;:::i;:::-;27921:113;;27760:281;;;;:::o;28047:348::-;28087:7;28110:20;28128:1;28110:20;:::i;:::-;28105:25;;28144:20;28162:1;28144:20;:::i;:::-;28139:25;;28332:1;28264:66;28260:74;28257:1;28254:81;28249:1;28242:9;28235:17;28231:105;28228:131;;;28339:18;;:::i;:::-;28228:131;28387:1;28384;28380:9;28369:20;;28047:348;;;;:::o;28401:418::-;28538:4;28576:2;28565:9;28561:18;28553:26;;28589:65;28651:1;28640:9;28636:17;28627:6;28589:65;:::i;:::-;28664:66;28726:2;28715:9;28711:18;28702:6;28664:66;:::i;:::-;28740:72;28808:2;28797:9;28793:18;28784:6;28740:72;:::i;:::-;28401:418;;;;;;:::o;28825:224::-;28965:34;28961:1;28953:6;28949:14;28942:58;29034:7;29029:2;29021:6;29017:15;29010:32;28825:224;:::o;29055:366::-;29197:3;29218:67;29282:2;29277:3;29218:67;:::i;:::-;29211:74;;29294:93;29383:3;29294:93;:::i;:::-;29412:2;29407:3;29403:12;29396:19;;29055:366;;;:::o;29427:419::-;29593:4;29631:2;29620:9;29616:18;29608:26;;29680:9;29674:4;29670:20;29666:1;29655:9;29651:17;29644:47;29708:131;29834:4;29708:131;:::i;:::-;29700:139;;29427:419;;;:::o;29852:232::-;29992:34;29988:1;29980:6;29976:14;29969:58;30061:15;30056:2;30048:6;30044:15;30037:40;29852:232;:::o;30090:366::-;30232:3;30253:67;30317:2;30312:3;30253:67;:::i;:::-;30246:74;;30329:93;30418:3;30329:93;:::i;:::-;30447:2;30442:3;30438:12;30431:19;;30090:366;;;:::o;30462:419::-;30628:4;30666:2;30655:9;30651:18;30643:26;;30715:9;30709:4;30705:20;30701:1;30690:9;30686:17;30679:47;30743:131;30869:4;30743:131;:::i;:::-;30735:139;;30462:419;;;:::o;30887:320::-;31002:4;31040:2;31029:9;31025:18;31017:26;;31053:71;31121:1;31110:9;31106:17;31097:6;31053:71;:::i;:::-;31134:66;31196:2;31185:9;31181:18;31172:6;31134:66;:::i;:::-;30887:320;;;;;:::o;31213:225::-;31353:34;31349:1;31341:6;31337:14;31330:58;31422:8;31417:2;31409:6;31405:15;31398:33;31213:225;:::o;31444:366::-;31586:3;31607:67;31671:2;31666:3;31607:67;:::i;:::-;31600:74;;31683:93;31772:3;31683:93;:::i;:::-;31801:2;31796:3;31792:12;31785:19;;31444:366;;;:::o;31816:419::-;31982:4;32020:2;32009:9;32005:18;31997:26;;32069:9;32063:4;32059:20;32055:1;32044:9;32040:17;32033:47;32097:131;32223:4;32097:131;:::i;:::-;32089:139;;31816:419;;;:::o;32241:223::-;32381:34;32377:1;32369:6;32365:14;32358:58;32450:6;32445:2;32437:6;32433:15;32426:31;32241:223;:::o;32470:366::-;32612:3;32633:67;32697:2;32692:3;32633:67;:::i;:::-;32626:74;;32709:93;32798:3;32709:93;:::i;:::-;32827:2;32822:3;32818:12;32811:19;;32470:366;;;:::o;32842:419::-;33008:4;33046:2;33035:9;33031:18;33023:26;;33095:9;33089:4;33085:20;33081:1;33070:9;33066:17;33059:47;33123:131;33249:4;33123:131;:::i;:::-;33115:139;;32842:419;;;:::o;33267:221::-;33407:34;33403:1;33395:6;33391:14;33384:58;33476:4;33471:2;33463:6;33459:15;33452:29;33267:221;:::o;33494:366::-;33636:3;33657:67;33721:2;33716:3;33657:67;:::i;:::-;33650:74;;33733:93;33822:3;33733:93;:::i;:::-;33851:2;33846:3;33842:12;33835:19;;33494:366;;;:::o;33866:419::-;34032:4;34070:2;34059:9;34055:18;34047:26;;34119:9;34113:4;34109:20;34105:1;34094:9;34090:17;34083:47;34147:131;34273:4;34147:131;:::i;:::-;34139:139;;33866:419;;;:::o;34291:224::-;34431:34;34427:1;34419:6;34415:14;34408:58;34500:7;34495:2;34487:6;34483:15;34476:32;34291:224;:::o;34521:366::-;34663:3;34684:67;34748:2;34743:3;34684:67;:::i;:::-;34677:74;;34760:93;34849:3;34760:93;:::i;:::-;34878:2;34873:3;34869:12;34862:19;;34521:366;;;:::o;34893:419::-;35059:4;35097:2;35086:9;35082:18;35074:26;;35146:9;35140:4;35136:20;35132:1;35121:9;35117:17;35110:47;35174:131;35300:4;35174:131;:::i;:::-;35166:139;;34893:419;;;:::o;35318:222::-;35458:34;35454:1;35446:6;35442:14;35435:58;35527:5;35522:2;35514:6;35510:15;35503:30;35318:222;:::o;35546:366::-;35688:3;35709:67;35773:2;35768:3;35709:67;:::i;:::-;35702:74;;35785:93;35874:3;35785:93;:::i;:::-;35903:2;35898:3;35894:12;35887:19;;35546:366;;;:::o;35918:419::-;36084:4;36122:2;36111:9;36107:18;36099:26;;36171:9;36165:4;36161:20;36157:1;36146:9;36142:17;36135:47;36199:131;36325:4;36199:131;:::i;:::-;36191:139;;35918:419;;;:::o;36343:225::-;36483:34;36479:1;36471:6;36467:14;36460:58;36552:8;36547:2;36539:6;36535:15;36528:33;36343:225;:::o;36574:366::-;36716:3;36737:67;36801:2;36796:3;36737:67;:::i;:::-;36730:74;;36813:93;36902:3;36813:93;:::i;:::-;36931:2;36926:3;36922:12;36915:19;;36574:366;;;:::o;36946:419::-;37112:4;37150:2;37139:9;37135:18;37127:26;;37199:9;37193:4;37189:20;37185:1;37174:9;37170:17;37163:47;37227:131;37353:4;37227:131;:::i;:::-;37219:139;;36946:419;;;:::o;37371:194::-;37411:4;37431:20;37449:1;37431:20;:::i;:::-;37426:25;;37465:20;37483:1;37465:20;:::i;:::-;37460:25;;37509:1;37506;37502:9;37494:17;;37533:1;37527:4;37524:11;37521:37;;;37538:18;;:::i;:::-;37521:37;37371:194;;;;:::o;37571:168::-;37711:20;37707:1;37699:6;37695:14;37688:44;37571:168;:::o;37745:366::-;37887:3;37908:67;37972:2;37967:3;37908:67;:::i;:::-;37901:74;;37984:93;38073:3;37984:93;:::i;:::-;38102:2;38097:3;38093:12;38086:19;;37745:366;;;:::o;38117:419::-;38283:4;38321:2;38310:9;38306:18;38298:26;;38370:9;38364:4;38360:20;38356:1;38345:9;38341:17;38334:47;38398:131;38524:4;38398:131;:::i;:::-;38390:139;;38117:419;;;:::o;38542:244::-;38682:34;38678:1;38670:6;38666:14;38659:58;38751:27;38746:2;38738:6;38734:15;38727:52;38542:244;:::o;38792:366::-;38934:3;38955:67;39019:2;39014:3;38955:67;:::i;:::-;38948:74;;39031:93;39120:3;39031:93;:::i;:::-;39149:2;39144:3;39140:12;39133:19;;38792:366;;;:::o;39164:419::-;39330:4;39368:2;39357:9;39353:18;39345:26;;39417:9;39411:4;39407:20;39403:1;39392:9;39388:17;39381:47;39445:131;39571:4;39445:131;:::i;:::-;39437:139;;39164:419;;;:::o;39589:241::-;39729:34;39725:1;39717:6;39713:14;39706:58;39798:24;39793:2;39785:6;39781:15;39774:49;39589:241;:::o;39836:366::-;39978:3;39999:67;40063:2;40058:3;39999:67;:::i;:::-;39992:74;;40075:93;40164:3;40075:93;:::i;:::-;40193:2;40188:3;40184:12;40177:19;;39836:366;;;:::o;40208:419::-;40374:4;40412:2;40401:9;40397:18;40389:26;;40461:9;40455:4;40451:20;40447:1;40436:9;40432:17;40425:47;40489:131;40615:4;40489:131;:::i;:::-;40481:139;;40208:419;;;:::o;40633:182::-;40773:34;40769:1;40761:6;40757:14;40750:58;40633:182;:::o;40821:366::-;40963:3;40984:67;41048:2;41043:3;40984:67;:::i;:::-;40977:74;;41060:93;41149:3;41060:93;:::i;:::-;41178:2;41173:3;41169:12;41162:19;;40821:366;;;:::o;41193:419::-;41359:4;41397:2;41386:9;41382:18;41374:26;;41446:9;41440:4;41436:20;41432:1;41421:9;41417:17;41410:47;41474:131;41600:4;41474:131;:::i;:::-;41466:139;;41193:419;;;:::o;41618:179::-;41758:31;41754:1;41746:6;41742:14;41735:55;41618:179;:::o;41803:366::-;41945:3;41966:67;42030:2;42025:3;41966:67;:::i;:::-;41959:74;;42042:93;42131:3;42042:93;:::i;:::-;42160:2;42155:3;42151:12;42144:19;;41803:366;;;:::o;42175:419::-;42341:4;42379:2;42368:9;42364:18;42356:26;;42428:9;42422:4;42418:20;42414:1;42403:9;42399:17;42392:47;42456:131;42582:4;42456:131;:::i;:::-;42448:139;;42175:419;;;:::o;42600:442::-;42749:4;42787:2;42776:9;42772:18;42764:26;;42800:71;42868:1;42857:9;42853:17;42844:6;42800:71;:::i;:::-;42881:72;42949:2;42938:9;42934:18;42925:6;42881:72;:::i;:::-;42963;43031:2;43020:9;43016:18;43007:6;42963:72;:::i;:::-;42600:442;;;;;;:::o;43048:180::-;43096:77;43093:1;43086:88;43193:4;43190:1;43183:15;43217:4;43214:1;43207:15;43234:143;43291:5;43322:6;43316:13;43307:22;;43338:33;43365:5;43338:33;:::i;:::-;43234:143;;;;:::o;43383:351::-;43453:6;43502:2;43490:9;43481:7;43477:23;43473:32;43470:119;;;43508:79;;:::i;:::-;43470:119;43628:1;43653:64;43709:7;43700:6;43689:9;43685:22;43653:64;:::i;:::-;43643:74;;43599:128;43383:351;;;;:::o;43740:85::-;43785:7;43814:5;43803:16;;43740:85;;;:::o;43831:158::-;43889:9;43922:61;43940:42;43949:32;43975:5;43949:32;:::i;:::-;43940:42;:::i;:::-;43922:61;:::i;:::-;43909:74;;43831:158;;;:::o;43995:147::-;44090:45;44129:5;44090:45;:::i;:::-;44085:3;44078:58;43995:147;;:::o;44148:114::-;44215:6;44249:5;44243:12;44233:22;;44148:114;;;:::o;44268:184::-;44367:11;44401:6;44396:3;44389:19;44441:4;44436:3;44432:14;44417:29;;44268:184;;;;:::o;44458:132::-;44525:4;44548:3;44540:11;;44578:4;44573:3;44569:14;44561:22;;44458:132;;;:::o;44596:108::-;44673:24;44691:5;44673:24;:::i;:::-;44668:3;44661:37;44596:108;;:::o;44710:179::-;44779:10;44800:46;44842:3;44834:6;44800:46;:::i;:::-;44878:4;44873:3;44869:14;44855:28;;44710:179;;;;:::o;44895:113::-;44965:4;44997;44992:3;44988:14;44980:22;;44895:113;;;:::o;45044:732::-;45163:3;45192:54;45240:5;45192:54;:::i;:::-;45262:86;45341:6;45336:3;45262:86;:::i;:::-;45255:93;;45372:56;45422:5;45372:56;:::i;:::-;45451:7;45482:1;45467:284;45492:6;45489:1;45486:13;45467:284;;;45568:6;45562:13;45595:63;45654:3;45639:13;45595:63;:::i;:::-;45588:70;;45681:60;45734:6;45681:60;:::i;:::-;45671:70;;45527:224;45514:1;45511;45507:9;45502:14;;45467:284;;;45471:14;45767:3;45760:10;;45168:608;;;45044:732;;;;:::o;45782:831::-;46045:4;46083:3;46072:9;46068:19;46060:27;;46097:71;46165:1;46154:9;46150:17;46141:6;46097:71;:::i;:::-;46178:80;46254:2;46243:9;46239:18;46230:6;46178:80;:::i;:::-;46305:9;46299:4;46295:20;46290:2;46279:9;46275:18;46268:48;46333:108;46436:4;46427:6;46333:108;:::i;:::-;46325:116;;46451:72;46519:2;46508:9;46504:18;46495:6;46451:72;:::i;:::-;46533:73;46601:3;46590:9;46586:19;46577:6;46533:73;:::i;:::-;45782:831;;;;;;;;:::o;46619:807::-;46868:4;46906:3;46895:9;46891:19;46883:27;;46920:71;46988:1;46977:9;46973:17;46964:6;46920:71;:::i;:::-;47001:72;47069:2;47058:9;47054:18;47045:6;47001:72;:::i;:::-;47083:80;47159:2;47148:9;47144:18;47135:6;47083:80;:::i;:::-;47173;47249:2;47238:9;47234:18;47225:6;47173:80;:::i;:::-;47263:73;47331:3;47320:9;47316:19;47307:6;47263:73;:::i;:::-;47346;47414:3;47403:9;47399:19;47390:6;47346:73;:::i;:::-;46619:807;;;;;;;;;:::o;47432:143::-;47489:5;47520:6;47514:13;47505:22;;47536:33;47563:5;47536:33;:::i;:::-;47432:143;;;;:::o;47581:663::-;47669:6;47677;47685;47734:2;47722:9;47713:7;47709:23;47705:32;47702:119;;;47740:79;;:::i;:::-;47702:119;47860:1;47885:64;47941:7;47932:6;47921:9;47917:22;47885:64;:::i;:::-;47875:74;;47831:128;47998:2;48024:64;48080:7;48071:6;48060:9;48056:22;48024:64;:::i;:::-;48014:74;;47969:129;48137:2;48163:64;48219:7;48210:6;48199:9;48195:22;48163:64;:::i;:::-;48153:74;;48108:129;47581:663;;;;;:::o

Swarm Source

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