ETH Price: $3,298.59 (-0.03%)

Token

Ai BubBle | aibubble.net (AiBB)
 

Overview

Max Total Supply

1,000,000,000 AiBB

Holders

51

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
0.443898087 AiBB

Value
$0.00
0xb44BaeA33299f99fA5f7F00757f983e64975b2C5
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
AiBB

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

/**

 * Telegram: https://t.me/aibubble_official
 * Homepage: https://aibubble.net
 * 
*/

// 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 AiBB is ERC20, Ownable {
    // TOKENOMICS START ==========================================================>
    string private _name = "Ai BubBle | aibubble.net";
    string private _symbol = "AiBB";
    uint8 private _decimals = 9;
    uint256 private _supply = 1000000000;
    uint256 public taxForLiquidity = 47; 
    uint256 public taxForMarketing = 47; 
    uint256 public maxTxAmount = 10000001 * 10**_decimals;
    uint256 public maxWalletAmount = 10000001 * 10**_decimals;
    address public marketingWallet = 0xA5b45C4755Ff45BcB9887b833BF2b46fFC5c751c;
    address public DEAD = 0x000000000000000000000000000000000000dEaD;
    uint256 public _marketingReserves = 0;
    mapping(address => bool) public _isExcludedFromFee;

    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 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 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":"_maxWalletAmount","type":"uint256"}],"name":"changeMaxWalletAmount","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":"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"}]

60a06040526040518060400160405280601881526020017f416920427562426c65207c206169627562626c652e6e65740000000000000000815250600690816200004a919062000ba1565b506040518060400160405280600481526020017f41694242000000000000000000000000000000000000000000000000000000008152506007908162000091919062000ba1565b506009600860006101000a81548160ff021916908360ff160217905550633b9aca00600955602f600a55602f600b55600860009054906101000a900460ff16600a620000de919062000e18565b62989681620000ee919062000e69565b600c55600860009054906101000a900460ff16600a6200010f919062000e18565b629896816200011f919062000e69565b600d5573a5b45c4755ff45bcb9887b833bf2b46ffc5c751c600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061dead600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000601055662386f26fc10000601455600860009054906101000a900460ff16600a620001e8919062000e18565b612710620001f7919062000e69565b60155567016345785d8a0000601655600860009054906101000a900460ff16600a62000224919062000e18565b620186a062000234919062000e69565b6017553480156200024457600080fd5b5060068054620002549062000990565b80601f0160208091040260200160405190810160405280929190818152602001828054620002829062000990565b8015620002d35780601f10620002a757610100808354040283529160200191620002d3565b820191906000526020600020905b815481529060010190602001808311620002b557829003601f168201915b505050505060078054620002e79062000990565b80601f0160208091040260200160405190810160405280929190818152602001828054620003159062000990565b8015620003665780601f106200033a5761010080835404028352916020019162000366565b820191906000526020600020905b8154815290600101906020018083116200034857829003601f168201915b505050505081600390816200037c919062000ba1565b5080600490816200038e919062000ba1565b505050620003b1620003a56200071460201b60201c565b6200071c60201b60201c565b620003ef33600860009054906101000a900460ff16600a620003d4919062000e18565b600954620003e3919062000e69565b620007e260201b60201c565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d90508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000454573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200047a919062000f34565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620004e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000508919062000f34565b6040518363ffffffff1660e01b81526004016200052792919062000f77565b6020604051808303816000875af115801562000547573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200056d919062000f34565b601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505060016011600060805173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505062001090565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000854576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200084b9062001005565b60405180910390fd5b806002600082825462000868919062001027565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200091b919062001073565b60405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620009a957607f821691505b602082108103620009bf57620009be62000961565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000a297fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620009ea565b62000a358683620009ea565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000a8262000a7c62000a768462000a4d565b62000a57565b62000a4d565b9050919050565b6000819050919050565b62000a9e8362000a61565b62000ab662000aad8262000a89565b848454620009f7565b825550505050565b600090565b62000acd62000abe565b62000ada81848462000a93565b505050565b5b8181101562000b025762000af660008262000ac3565b60018101905062000ae0565b5050565b601f82111562000b515762000b1b81620009c5565b62000b2684620009da565b8101602085101562000b36578190505b62000b4e62000b4585620009da565b83018262000adf565b50505b505050565b600082821c905092915050565b600062000b766000198460080262000b56565b1980831691505092915050565b600062000b91838362000b63565b9150826002028217905092915050565b62000bac8262000927565b67ffffffffffffffff81111562000bc85762000bc762000932565b5b62000bd4825462000990565b62000be182828562000b06565b600060209050601f83116001811462000c19576000841562000c04578287015190505b62000c10858262000b83565b86555062000c80565b601f19841662000c2986620009c5565b60005b8281101562000c535784890151825560018201915060208501945060208101905062000c2c565b8683101562000c73578489015162000c6f601f89168262000b63565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b600185111562000d165780860481111562000cee5762000ced62000c88565b5b600185161562000cfe5780820291505b808102905062000d0e8562000cb7565b945062000cce565b94509492505050565b60008262000d31576001905062000e04565b8162000d41576000905062000e04565b816001811462000d5a576002811462000d655762000d9b565b600191505062000e04565b60ff84111562000d7a5762000d7962000c88565b5b8360020a91508482111562000d945762000d9362000c88565b5b5062000e04565b5060208310610133831016604e8410600b841016171562000dd55782820a90508381111562000dcf5762000dce62000c88565b5b62000e04565b62000de4848484600162000cc4565b9250905081840481111562000dfe5762000dfd62000c88565b5b81810290505b9392505050565b600060ff82169050919050565b600062000e258262000a4d565b915062000e328362000e0b565b925062000e617fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000d1f565b905092915050565b600062000e768262000a4d565b915062000e838362000a4d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000ebf5762000ebe62000c88565b5b828202905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000efc8262000ecf565b9050919050565b62000f0e8162000eef565b811462000f1a57600080fd5b50565b60008151905062000f2e8162000f03565b92915050565b60006020828403121562000f4d5762000f4c62000eca565b5b600062000f5d8482850162000f1d565b91505092915050565b62000f718162000eef565b82525050565b600060408201905062000f8e600083018562000f66565b62000f9d602083018462000f66565b9392505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000fed601f8362000fa4565b915062000ffa8262000fb5565b602082019050919050565b60006020820190508181036000830152620010208162000fde565b9050919050565b6000620010348262000a4d565b9150620010418362000a4d565b92508282019050808211156200105c576200105b62000c88565b5b92915050565b6200106d8162000a4d565b82525050565b60006020820190506200108a600083018462001062565b92915050565b608051613788620010ac6000396000610d3e01526137886000f3fe6080604052600436106102605760003560e01c8063768dc71011610144578063af8af690116100b6578063df1d099e1161007a578063df1d099e1461096b578063df8408fe14610996578063f1b2b3d9146109bf578063f2fde38b146109fc578063f345bd8514610a25578063fbee93ba14610a5057610267565b8063af8af6901461084c578063b5c78e8a14610889578063bb85c6d1146108c6578063c0fdea5714610903578063dd62ed3e1461092e57610267565b806395d89b411161010857806395d89b4114610725578063a2330d9714610750578063a3996f7b14610790578063a457c2d7146107a7578063a9059cbb146107e4578063aa4bde281461082157610267565b8063768dc7101461062a5780637930ef691461066757806381bfdcca146106925780638c0b5e22146106cf5780638da5cb5b146106fa57610267565b806323b872dd116101dd578063527ffabd116101a1578063527ffabd1461051757806363cdf60f1461054257806370a0823114610582578063715018a6146105bf57806373c503b3146105d657806375f0a874146105ff57610267565b806323b872dd1461040a578063313ce56714610447578063395093511461047257806349bd5a5e146104af5780634fa74c4d146104da57610267565b80631694505e116102245780631694505e1461034657806316a7b1601461037157806318160ddd1461038d57806318bc47f6146103b85780631b56bbf9146103e157610267565b806303fd2a451461026c578063054dee0f1461029757806306fdde03146102c2578063095ea7b3146102ed5780630f1d7ad91461032a57610267565b3661026757005b600080fd5b34801561027857600080fd5b50610281610a7b565b60405161028e91906122f7565b60405180910390f35b3480156102a357600080fd5b506102ac610aa1565b6040516102b9919061232b565b60405180910390f35b3480156102ce57600080fd5b506102d7610aa7565b6040516102e491906123d6565b60405180910390f35b3480156102f957600080fd5b50610314600480360381019061030f9190612464565b610b39565b60405161032191906124bf565b60405180910390f35b610344600480360381019061033f919061260f565b610b5c565b005b34801561035257600080fd5b5061035b610d3c565b60405161036891906126b7565b60405180910390f35b61038b6004803603810190610386919061260f565b610d60565b005b34801561039957600080fd5b506103a2610f40565b6040516103af919061232b565b60405180910390f35b3480156103c457600080fd5b506103df60048036038101906103da91906126fe565b610f4a565b005b3480156103ed57600080fd5b5061040860048036038101906104039190612795565b6110c0565b005b34801561041657600080fd5b50610431600480360381019061042c91906127c2565b611242565b60405161043e91906124bf565b60405180910390f35b34801561045357600080fd5b5061045c611271565b6040516104699190612831565b60405180910390f35b34801561047e57600080fd5b5061049960048036038101906104949190612464565b61127a565b6040516104a691906124bf565b60405180910390f35b3480156104bb57600080fd5b506104c46112b1565b6040516104d191906122f7565b60405180910390f35b3480156104e657600080fd5b5061050160048036038101906104fc919061284c565b6112d7565b60405161050e91906124bf565b60405180910390f35b34801561052357600080fd5b5061052c61134d565b604051610539919061232b565b60405180910390f35b34801561054e57600080fd5b506105696004803603810190610564919061260f565b611353565b60405161057994939291906128a8565b60405180910390f35b34801561058e57600080fd5b506105a960048036038101906105a49190612795565b61142e565b6040516105b6919061232b565b60405180910390f35b3480156105cb57600080fd5b506105d4611476565b005b3480156105e257600080fd5b506105fd60048036038101906105f891906128f4565b61148a565b005b34801561060b57600080fd5b5061061461155e565b60405161062191906122f7565b60405180910390f35b34801561063657600080fd5b50610651600480360381019061064c9190612795565b611584565b60405161065e91906124bf565b60405180910390f35b34801561067357600080fd5b5061067c6115a4565b604051610689919061232b565b60405180910390f35b34801561069e57600080fd5b506106b960048036038101906106b49190612947565b6115aa565b6040516106c691906124bf565b60405180910390f35b3480156106db57600080fd5b506106e46115c4565b6040516106f1919061232b565b60405180910390f35b34801561070657600080fd5b5061070f6115ca565b60405161071c91906122f7565b60405180910390f35b34801561073157600080fd5b5061073a6115f4565b60405161074791906123d6565b60405180910390f35b34801561075c57600080fd5b506107776004803603810190610772919061260f565b611686565b60405161078794939291906128a8565b60405180910390f35b34801561079c57600080fd5b506107a5611761565b005b3480156107b357600080fd5b506107ce60048036038101906107c99190612464565b6117db565b6040516107db91906124bf565b60405180910390f35b3480156107f057600080fd5b5061080b60048036038101906108069190612464565b611852565b60405161081891906124bf565b60405180910390f35b34801561082d57600080fd5b50610836611875565b604051610843919061232b565b60405180910390f35b34801561085857600080fd5b50610873600480360381019061086e9190612974565b61187b565b60405161088091906124bf565b60405180910390f35b34801561089557600080fd5b506108b060048036038101906108ab919061284c565b6118ec565b6040516108bd919061232b565b60405180910390f35b3480156108d257600080fd5b506108ed60048036038101906108e89190612795565b611948565b6040516108fa91906124bf565b60405180910390f35b34801561090f57600080fd5b50610918611a9b565b604051610925919061232b565b60405180910390f35b34801561093a57600080fd5b50610955600480360381019061095091906129b4565b611aa1565b604051610962919061232b565b60405180910390f35b34801561097757600080fd5b50610980611b28565b60405161098d919061232b565b60405180910390f35b3480156109a257600080fd5b506109bd60048036038101906109b891906129f4565b611b2e565b005b3480156109cb57600080fd5b506109e660048036038101906109e1919061284c565b611bca565b6040516109f3919061232b565b60405180910390f35b348015610a0857600080fd5b50610a236004803603810190610a1e9190612795565b611c26565b005b348015610a3157600080fd5b50610a3a611ca9565b604051610a47919061232b565b60405180910390f35b348015610a5c57600080fd5b50610a65611caf565b604051610a72919061232b565b60405180910390f35b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60145481565b606060038054610ab690612a63565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae290612a63565b8015610b2f5780601f10610b0457610100808354040283529160200191610b2f565b820191906000526020600020905b815481529060010190602001808311610b1257829003601f168201915b5050505050905090565b600080610b44611cb5565b9050610b51818585611cbd565b600191505092915050565b601454341015610ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9890612ae0565b60405180910390fd5b6015543373ffffffffffffffffffffffffffffffffffffffff16311015610bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf490612b4c565b60405180910390fd5b3460106000828254610c0f9190612b9b565b92505081905550610c4533600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601554611e86565b604051806080016040528082815260200160011515815260200142815260200134601384604051610c769190612c0b565b908152602001604051809103902060030154610c929190612b9b565b815250601382604051610ca59190612c0b565b90815260200160405180910390206000820151816000019081610cc89190612dc4565b5060208201518160010160006101000a81548160ff02191690831515021790555060408201518160020155606082015181600301559050507f8382dfeb92e23123a91d983e4f179a9fbe329ff91e14e11cd3c3b5252f1151228142604051610d31929190612e96565b60405180910390a150565b7f000000000000000000000000000000000000000000000000000000000000000081565b601454341015610da5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9c90612ae0565b60405180910390fd5b6015543373ffffffffffffffffffffffffffffffffffffffff16311015610e01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df890612b4c565b60405180910390fd5b3460106000828254610e139190612b9b565b92505081905550610e4933600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601554611e86565b604051806080016040528082815260200160011515815260200142815260200134601284604051610e7a9190612c0b565b908152602001604051809103902060030154610e969190612b9b565b815250601282604051610ea99190612c0b565b90815260200160405180910390206000820151816000019081610ecc9190612dc4565b5060208201518160010160006101000a81548160ff02191690831515021790555060408201518160020155606082015181600301559050507f892c7b6af36dc1cd7c78d56ead1e536ddf81fe5688e6b3f631cdfadf7ad4c5088142604051610f35929190612e96565b60405180910390a150565b6000600254905090565b610f526120e6565b8315610feb576040518060800160405280868152602001841515815260200183815260200182815250601386604051610f8b9190612c0b565b90815260200160405180910390206000820151816000019081610fae9190612dc4565b5060208201518160010160006101000a81548160ff021916908315150217905550604082015181600201556060820151816003015590505061107a565b604051806080016040528086815260200184151581526020018381526020018281525060128660405161101e9190612c0b565b908152602001604051809103902060008201518160000190816110419190612dc4565b5060208201518160010160006101000a81548160ff02191690831515021790555060408201518160020155606082015181600301559050505b7fc7da2a9b77928245e263afcf4e639fd44ae7d1970e45b7c6ff1a952442938caf85858585856040516110b1959493929190612ec6565b60405180910390a15050505050565b6110c86120e6565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114f90612f92565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036111c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111be90612f92565b60405180910390fd5b80601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f1d288f7aba265e8b154b112bbb631ceca5df5fe93a750b2fe042fd1cc826647f8160405161123791906122f7565b60405180910390a150565b60008061124d611cb5565b905061125a858285612164565b611265858585611e86565b60019150509392505050565b60006009905090565b600080611285611cb5565b90506112a68185856112978589611aa1565b6112a19190612b9b565b611cbd565b600191505092915050565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008115611315576013836040516112ef9190612c0b565b908152602001604051809103902060010160009054906101000a900460ff169050611347565b6012836040516113259190612c0b565b908152602001604051809103902060010160009054906101000a900460ff1690505b92915050565b600b5481565b60128180516020810182018051848252602083016020850120818352809550505050505060009150905080600001805461138c90612a63565b80601f01602080910402602001604051908101604052809291908181526020018280546113b890612a63565b80156114055780601f106113da57610100808354040283529160200191611405565b820191906000526020600020905b8154815290600101906020018083116113e857829003601f168201915b5050505050908060010160009054906101000a900460ff16908060020154908060030154905084565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61147e6120e6565b61148860006121f0565b565b6114926120e6565b82156114b75781156114aa57806016819055506114b2565b806014819055505b61151e565b81156114ef57600860009054906101000a900460ff16600a6114d991906130e5565b816114e49190613130565b60178190555061151d565b600860009054906101000a900460ff16600a61150b91906130e5565b816115169190613130565b6015819055505b5b7fb87a29e1f0734b57d95308af5a136440c194441ac49edd417a1ed26aa78ceda28383836040516115519392919061318a565b60405180910390a1505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60116020528060005260406000206000915054906101000a900460ff1681565b60165481565b60006115b46120e6565b81600d8190555060019050919050565b600c5481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461160390612a63565b80601f016020809104026020016040519081016040528092919081815260200182805461162f90612a63565b801561167c5780601f106116515761010080835404028352916020019161167c565b820191906000526020600020905b81548152906001019060200180831161165f57829003601f168201915b5050505050905090565b6013818051602081018201805184825260208301602085012081835280955050505050506000915090508060000180546116bf90612a63565b80601f01602080910402602001604051908101604052809291908181526020018280546116eb90612a63565b80156117385780601f1061170d57610100808354040283529160200191611738565b820191906000526020600020905b81548152906001019060200180831161171b57829003601f168201915b5050505050908060010160009054906101000a900460ff16908060020154908060030154905084565b6117696120e6565b6001600a819055506002600b81905550600860009054906101000a900460ff16600a61179591906130e5565b629896816117a39190613130565b600c81905550600860009054906101000a900460ff16600a6117c591906130e5565b629896816117d39190613130565b600d81905550565b6000806117e6611cb5565b905060006117f48286611aa1565b905083811015611839576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183090613233565b60405180910390fd5b6118468286868403611cbd565b60019250505092915050565b60008061185d611cb5565b905061186a818585611e86565b600191505092915050565b600d5481565b60006118856120e6565b600a82846118939190612b9b565b11156118d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cb906132c5565b60405180910390fd5b82600a8190555081600b819055506001905092915050565b6000811561191d576013836040516119049190612c0b565b9081526020016040518091039020600301549050611942565b60128360405161192d9190612c0b565b90815260200160405180910390206003015490505b92915050565b60006119526120e6565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d990612f92565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4890612f92565b60405180910390fd5b81600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b60105481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60175481565b611b366120e6565b80601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f318c131114339c004fff0a22fcdbbc0566bb2a7cd3aa1660e636ec5a66784ff28282604051611bbe9291906132e5565b60405180910390a15050565b60008115611bfb57601383604051611be29190612c0b565b9081526020016040518091039020600201549050611c20565b601283604051611c0b9190612c0b565b90815260200160405180910390206002015490505b92915050565b611c2e6120e6565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9490613380565b60405180910390fd5b611ca6816121f0565b50565b600a5481565b60155481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2390613412565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d92906134a4565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611e79919061232b565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611ef5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eec90613536565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5b906135c8565b60405180910390fd5b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611fea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe19061365a565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516120d8919061232b565b60405180910390a350505050565b6120ee611cb5565b73ffffffffffffffffffffffffffffffffffffffff1661210c6115ca565b73ffffffffffffffffffffffffffffffffffffffff1614612162576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612159906136c6565b60405180910390fd5b565b60006121708484611aa1565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146121ea57818110156121dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d390613732565b60405180910390fd5b6121e98484848403611cbd565b5b50505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006122e1826122b6565b9050919050565b6122f1816122d6565b82525050565b600060208201905061230c60008301846122e8565b92915050565b6000819050919050565b61232581612312565b82525050565b6000602082019050612340600083018461231c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612380578082015181840152602081019050612365565b60008484015250505050565b6000601f19601f8301169050919050565b60006123a882612346565b6123b28185612351565b93506123c2818560208601612362565b6123cb8161238c565b840191505092915050565b600060208201905081810360008301526123f0818461239d565b905092915050565b6000604051905090565b600080fd5b600080fd5b612415816122d6565b811461242057600080fd5b50565b6000813590506124328161240c565b92915050565b61244181612312565b811461244c57600080fd5b50565b60008135905061245e81612438565b92915050565b6000806040838503121561247b5761247a612402565b5b600061248985828601612423565b925050602061249a8582860161244f565b9150509250929050565b60008115159050919050565b6124b9816124a4565b82525050565b60006020820190506124d460008301846124b0565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61251c8261238c565b810181811067ffffffffffffffff8211171561253b5761253a6124e4565b5b80604052505050565b600061254e6123f8565b905061255a8282612513565b919050565b600067ffffffffffffffff82111561257a576125796124e4565b5b6125838261238c565b9050602081019050919050565b82818337600083830152505050565b60006125b26125ad8461255f565b612544565b9050828152602081018484840111156125ce576125cd6124df565b5b6125d9848285612590565b509392505050565b600082601f8301126125f6576125f56124da565b5b813561260684826020860161259f565b91505092915050565b60006020828403121561262557612624612402565b5b600082013567ffffffffffffffff81111561264357612642612407565b5b61264f848285016125e1565b91505092915050565b6000819050919050565b600061267d612678612673846122b6565b612658565b6122b6565b9050919050565b600061268f82612662565b9050919050565b60006126a182612684565b9050919050565b6126b181612696565b82525050565b60006020820190506126cc60008301846126a8565b92915050565b6126db816124a4565b81146126e657600080fd5b50565b6000813590506126f8816126d2565b92915050565b600080600080600060a0868803121561271a57612719612402565b5b600086013567ffffffffffffffff81111561273857612737612407565b5b612744888289016125e1565b9550506020612755888289016126e9565b9450506040612766888289016126e9565b93505060606127778882890161244f565b92505060806127888882890161244f565b9150509295509295909350565b6000602082840312156127ab576127aa612402565b5b60006127b984828501612423565b91505092915050565b6000806000606084860312156127db576127da612402565b5b60006127e986828701612423565b93505060206127fa86828701612423565b925050604061280b8682870161244f565b9150509250925092565b600060ff82169050919050565b61282b81612815565b82525050565b60006020820190506128466000830184612822565b92915050565b6000806040838503121561286357612862612402565b5b600083013567ffffffffffffffff81111561288157612880612407565b5b61288d858286016125e1565b925050602061289e858286016126e9565b9150509250929050565b600060808201905081810360008301526128c2818761239d565b90506128d160208301866124b0565b6128de604083018561231c565b6128eb606083018461231c565b95945050505050565b60008060006060848603121561290d5761290c612402565b5b600061291b868287016126e9565b935050602061292c868287016126e9565b925050604061293d8682870161244f565b9150509250925092565b60006020828403121561295d5761295c612402565b5b600061296b8482850161244f565b91505092915050565b6000806040838503121561298b5761298a612402565b5b60006129998582860161244f565b92505060206129aa8582860161244f565b9150509250929050565b600080604083850312156129cb576129ca612402565b5b60006129d985828601612423565b92505060206129ea85828601612423565b9150509250929050565b60008060408385031215612a0b57612a0a612402565b5b6000612a1985828601612423565b9250506020612a2a858286016126e9565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612a7b57607f821691505b602082108103612a8e57612a8d612a34565b5b50919050565b7f4e6f7420656e6f756768204554482073656e7421000000000000000000000000600082015250565b6000612aca601483612351565b9150612ad582612a94565b602082019050919050565b60006020820190508181036000830152612af981612abd565b9050919050565b7f4e6f7420656e6f75676820746f6b656e73210000000000000000000000000000600082015250565b6000612b36601283612351565b9150612b4182612b00565b602082019050919050565b60006020820190508181036000830152612b6581612b29565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612ba682612312565b9150612bb183612312565b9250828201905080821115612bc957612bc8612b6c565b5b92915050565b600081905092915050565b6000612be582612346565b612bef8185612bcf565b9350612bff818560208601612362565b80840191505092915050565b6000612c178284612bda565b915081905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612c847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612c47565b612c8e8683612c47565b95508019841693508086168417925050509392505050565b6000612cc1612cbc612cb784612312565b612658565b612312565b9050919050565b6000819050919050565b612cdb83612ca6565b612cef612ce782612cc8565b848454612c54565b825550505050565b600090565b612d04612cf7565b612d0f818484612cd2565b505050565b5b81811015612d3357612d28600082612cfc565b600181019050612d15565b5050565b601f821115612d7857612d4981612c22565b612d5284612c37565b81016020851015612d61578190505b612d75612d6d85612c37565b830182612d14565b50505b505050565b600082821c905092915050565b6000612d9b60001984600802612d7d565b1980831691505092915050565b6000612db48383612d8a565b9150826002028217905092915050565b612dcd82612346565b67ffffffffffffffff811115612de657612de56124e4565b5b612df08254612a63565b612dfb828285612d37565b600060209050601f831160018114612e2e5760008415612e1c578287015190505b612e268582612da8565b865550612e8e565b601f198416612e3c86612c22565b60005b82811015612e6457848901518255600182019150602085019450602081019050612e3f565b86831015612e815784890151612e7d601f891682612d8a565b8355505b6001600288020188555050505b505050505050565b60006040820190508181036000830152612eb0818561239d565b9050612ebf602083018461231c565b9392505050565b600060a0820190508181036000830152612ee0818861239d565b9050612eef60208301876124b0565b612efc60408301866124b0565b612f09606083018561231c565b612f16608083018461231c565b9695505050505050565b7f4c5020506169722063616e6e6f742062652074686520446561642077616c6c6560008201527f742c206f72203021000000000000000000000000000000000000000000000000602082015250565b6000612f7c602883612351565b9150612f8782612f20565b604082019050919050565b60006020820190508181036000830152612fab81612f6f565b9050919050565b60008160011c9050919050565b6000808291508390505b600185111561300957808604811115612fe557612fe4612b6c565b5b6001851615612ff45780820291505b808102905061300285612fb2565b9450612fc9565b94509492505050565b60008261302257600190506130de565b8161303057600090506130de565b816001811461304657600281146130505761307f565b60019150506130de565b60ff84111561306257613061612b6c565b5b8360020a91508482111561307957613078612b6c565b5b506130de565b5060208310610133831016604e8410600b84101617156130b45782820a9050838111156130af576130ae612b6c565b5b6130de565b6130c18484846001612fbf565b925090508184048111156130d8576130d7612b6c565b5b81810290505b9392505050565b60006130f082612312565b91506130fb83612815565b92506131287fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613012565b905092915050565b600061313b82612312565b915061314683612312565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561317f5761317e612b6c565b5b828202905092915050565b600060608201905061319f60008301866124b0565b6131ac60208301856124b0565b6131b9604083018461231c565b949350505050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061321d602583612351565b9150613228826131c1565b604082019050919050565b6000602082019050818103600083015261324c81613210565b9050919050565b7f45524332303a20746f74616c20746178206d757374206e6f742062652067726560008201527f61746572207468616e2031302500000000000000000000000000000000000000602082015250565b60006132af602d83612351565b91506132ba82613253565b604082019050919050565b600060208201905081810360008301526132de816132a2565b9050919050565b60006040820190506132fa60008301856122e8565b61330760208301846124b0565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061336a602683612351565b91506133758261330e565b604082019050919050565b600060208201905081810360008301526133998161335d565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006133fc602483612351565b9150613407826133a0565b604082019050919050565b6000602082019050818103600083015261342b816133ef565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061348e602283612351565b915061349982613432565b604082019050919050565b600060208201905081810360008301526134bd81613481565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613520602583612351565b915061352b826134c4565b604082019050919050565b6000602082019050818103600083015261354f81613513565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006135b2602383612351565b91506135bd82613556565b604082019050919050565b600060208201905081810360008301526135e1816135a5565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000613644602683612351565b915061364f826135e8565b604082019050919050565b6000602082019050818103600083015261367381613637565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006136b0602083612351565b91506136bb8261367a565b602082019050919050565b600060208201905081810360008301526136df816136a3565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061371c601d83612351565b9150613727826136e6565b602082019050919050565b6000602082019050818103600083015261374b8161370f565b905091905056fea2646970667358221220845e304d7854d0c02ad1a3a764d94843d0c1b25b20e4bbf8ce29c2cbc4b2c2c664736f6c63430008100033

Deployed Bytecode

0x6080604052600436106102605760003560e01c8063768dc71011610144578063af8af690116100b6578063df1d099e1161007a578063df1d099e1461096b578063df8408fe14610996578063f1b2b3d9146109bf578063f2fde38b146109fc578063f345bd8514610a25578063fbee93ba14610a5057610267565b8063af8af6901461084c578063b5c78e8a14610889578063bb85c6d1146108c6578063c0fdea5714610903578063dd62ed3e1461092e57610267565b806395d89b411161010857806395d89b4114610725578063a2330d9714610750578063a3996f7b14610790578063a457c2d7146107a7578063a9059cbb146107e4578063aa4bde281461082157610267565b8063768dc7101461062a5780637930ef691461066757806381bfdcca146106925780638c0b5e22146106cf5780638da5cb5b146106fa57610267565b806323b872dd116101dd578063527ffabd116101a1578063527ffabd1461051757806363cdf60f1461054257806370a0823114610582578063715018a6146105bf57806373c503b3146105d657806375f0a874146105ff57610267565b806323b872dd1461040a578063313ce56714610447578063395093511461047257806349bd5a5e146104af5780634fa74c4d146104da57610267565b80631694505e116102245780631694505e1461034657806316a7b1601461037157806318160ddd1461038d57806318bc47f6146103b85780631b56bbf9146103e157610267565b806303fd2a451461026c578063054dee0f1461029757806306fdde03146102c2578063095ea7b3146102ed5780630f1d7ad91461032a57610267565b3661026757005b600080fd5b34801561027857600080fd5b50610281610a7b565b60405161028e91906122f7565b60405180910390f35b3480156102a357600080fd5b506102ac610aa1565b6040516102b9919061232b565b60405180910390f35b3480156102ce57600080fd5b506102d7610aa7565b6040516102e491906123d6565b60405180910390f35b3480156102f957600080fd5b50610314600480360381019061030f9190612464565b610b39565b60405161032191906124bf565b60405180910390f35b610344600480360381019061033f919061260f565b610b5c565b005b34801561035257600080fd5b5061035b610d3c565b60405161036891906126b7565b60405180910390f35b61038b6004803603810190610386919061260f565b610d60565b005b34801561039957600080fd5b506103a2610f40565b6040516103af919061232b565b60405180910390f35b3480156103c457600080fd5b506103df60048036038101906103da91906126fe565b610f4a565b005b3480156103ed57600080fd5b5061040860048036038101906104039190612795565b6110c0565b005b34801561041657600080fd5b50610431600480360381019061042c91906127c2565b611242565b60405161043e91906124bf565b60405180910390f35b34801561045357600080fd5b5061045c611271565b6040516104699190612831565b60405180910390f35b34801561047e57600080fd5b5061049960048036038101906104949190612464565b61127a565b6040516104a691906124bf565b60405180910390f35b3480156104bb57600080fd5b506104c46112b1565b6040516104d191906122f7565b60405180910390f35b3480156104e657600080fd5b5061050160048036038101906104fc919061284c565b6112d7565b60405161050e91906124bf565b60405180910390f35b34801561052357600080fd5b5061052c61134d565b604051610539919061232b565b60405180910390f35b34801561054e57600080fd5b506105696004803603810190610564919061260f565b611353565b60405161057994939291906128a8565b60405180910390f35b34801561058e57600080fd5b506105a960048036038101906105a49190612795565b61142e565b6040516105b6919061232b565b60405180910390f35b3480156105cb57600080fd5b506105d4611476565b005b3480156105e257600080fd5b506105fd60048036038101906105f891906128f4565b61148a565b005b34801561060b57600080fd5b5061061461155e565b60405161062191906122f7565b60405180910390f35b34801561063657600080fd5b50610651600480360381019061064c9190612795565b611584565b60405161065e91906124bf565b60405180910390f35b34801561067357600080fd5b5061067c6115a4565b604051610689919061232b565b60405180910390f35b34801561069e57600080fd5b506106b960048036038101906106b49190612947565b6115aa565b6040516106c691906124bf565b60405180910390f35b3480156106db57600080fd5b506106e46115c4565b6040516106f1919061232b565b60405180910390f35b34801561070657600080fd5b5061070f6115ca565b60405161071c91906122f7565b60405180910390f35b34801561073157600080fd5b5061073a6115f4565b60405161074791906123d6565b60405180910390f35b34801561075c57600080fd5b506107776004803603810190610772919061260f565b611686565b60405161078794939291906128a8565b60405180910390f35b34801561079c57600080fd5b506107a5611761565b005b3480156107b357600080fd5b506107ce60048036038101906107c99190612464565b6117db565b6040516107db91906124bf565b60405180910390f35b3480156107f057600080fd5b5061080b60048036038101906108069190612464565b611852565b60405161081891906124bf565b60405180910390f35b34801561082d57600080fd5b50610836611875565b604051610843919061232b565b60405180910390f35b34801561085857600080fd5b50610873600480360381019061086e9190612974565b61187b565b60405161088091906124bf565b60405180910390f35b34801561089557600080fd5b506108b060048036038101906108ab919061284c565b6118ec565b6040516108bd919061232b565b60405180910390f35b3480156108d257600080fd5b506108ed60048036038101906108e89190612795565b611948565b6040516108fa91906124bf565b60405180910390f35b34801561090f57600080fd5b50610918611a9b565b604051610925919061232b565b60405180910390f35b34801561093a57600080fd5b50610955600480360381019061095091906129b4565b611aa1565b604051610962919061232b565b60405180910390f35b34801561097757600080fd5b50610980611b28565b60405161098d919061232b565b60405180910390f35b3480156109a257600080fd5b506109bd60048036038101906109b891906129f4565b611b2e565b005b3480156109cb57600080fd5b506109e660048036038101906109e1919061284c565b611bca565b6040516109f3919061232b565b60405180910390f35b348015610a0857600080fd5b50610a236004803603810190610a1e9190612795565b611c26565b005b348015610a3157600080fd5b50610a3a611ca9565b604051610a47919061232b565b60405180910390f35b348015610a5c57600080fd5b50610a65611caf565b604051610a72919061232b565b60405180910390f35b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60145481565b606060038054610ab690612a63565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae290612a63565b8015610b2f5780601f10610b0457610100808354040283529160200191610b2f565b820191906000526020600020905b815481529060010190602001808311610b1257829003601f168201915b5050505050905090565b600080610b44611cb5565b9050610b51818585611cbd565b600191505092915050565b601454341015610ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9890612ae0565b60405180910390fd5b6015543373ffffffffffffffffffffffffffffffffffffffff16311015610bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf490612b4c565b60405180910390fd5b3460106000828254610c0f9190612b9b565b92505081905550610c4533600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601554611e86565b604051806080016040528082815260200160011515815260200142815260200134601384604051610c769190612c0b565b908152602001604051809103902060030154610c929190612b9b565b815250601382604051610ca59190612c0b565b90815260200160405180910390206000820151816000019081610cc89190612dc4565b5060208201518160010160006101000a81548160ff02191690831515021790555060408201518160020155606082015181600301559050507f8382dfeb92e23123a91d983e4f179a9fbe329ff91e14e11cd3c3b5252f1151228142604051610d31929190612e96565b60405180910390a150565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b601454341015610da5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9c90612ae0565b60405180910390fd5b6015543373ffffffffffffffffffffffffffffffffffffffff16311015610e01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df890612b4c565b60405180910390fd5b3460106000828254610e139190612b9b565b92505081905550610e4933600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601554611e86565b604051806080016040528082815260200160011515815260200142815260200134601284604051610e7a9190612c0b565b908152602001604051809103902060030154610e969190612b9b565b815250601282604051610ea99190612c0b565b90815260200160405180910390206000820151816000019081610ecc9190612dc4565b5060208201518160010160006101000a81548160ff02191690831515021790555060408201518160020155606082015181600301559050507f892c7b6af36dc1cd7c78d56ead1e536ddf81fe5688e6b3f631cdfadf7ad4c5088142604051610f35929190612e96565b60405180910390a150565b6000600254905090565b610f526120e6565b8315610feb576040518060800160405280868152602001841515815260200183815260200182815250601386604051610f8b9190612c0b565b90815260200160405180910390206000820151816000019081610fae9190612dc4565b5060208201518160010160006101000a81548160ff021916908315150217905550604082015181600201556060820151816003015590505061107a565b604051806080016040528086815260200184151581526020018381526020018281525060128660405161101e9190612c0b565b908152602001604051809103902060008201518160000190816110419190612dc4565b5060208201518160010160006101000a81548160ff02191690831515021790555060408201518160020155606082015181600301559050505b7fc7da2a9b77928245e263afcf4e639fd44ae7d1970e45b7c6ff1a952442938caf85858585856040516110b1959493929190612ec6565b60405180910390a15050505050565b6110c86120e6565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114f90612f92565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036111c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111be90612f92565b60405180910390fd5b80601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f1d288f7aba265e8b154b112bbb631ceca5df5fe93a750b2fe042fd1cc826647f8160405161123791906122f7565b60405180910390a150565b60008061124d611cb5565b905061125a858285612164565b611265858585611e86565b60019150509392505050565b60006009905090565b600080611285611cb5565b90506112a68185856112978589611aa1565b6112a19190612b9b565b611cbd565b600191505092915050565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008115611315576013836040516112ef9190612c0b565b908152602001604051809103902060010160009054906101000a900460ff169050611347565b6012836040516113259190612c0b565b908152602001604051809103902060010160009054906101000a900460ff1690505b92915050565b600b5481565b60128180516020810182018051848252602083016020850120818352809550505050505060009150905080600001805461138c90612a63565b80601f01602080910402602001604051908101604052809291908181526020018280546113b890612a63565b80156114055780601f106113da57610100808354040283529160200191611405565b820191906000526020600020905b8154815290600101906020018083116113e857829003601f168201915b5050505050908060010160009054906101000a900460ff16908060020154908060030154905084565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61147e6120e6565b61148860006121f0565b565b6114926120e6565b82156114b75781156114aa57806016819055506114b2565b806014819055505b61151e565b81156114ef57600860009054906101000a900460ff16600a6114d991906130e5565b816114e49190613130565b60178190555061151d565b600860009054906101000a900460ff16600a61150b91906130e5565b816115169190613130565b6015819055505b5b7fb87a29e1f0734b57d95308af5a136440c194441ac49edd417a1ed26aa78ceda28383836040516115519392919061318a565b60405180910390a1505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60116020528060005260406000206000915054906101000a900460ff1681565b60165481565b60006115b46120e6565b81600d8190555060019050919050565b600c5481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461160390612a63565b80601f016020809104026020016040519081016040528092919081815260200182805461162f90612a63565b801561167c5780601f106116515761010080835404028352916020019161167c565b820191906000526020600020905b81548152906001019060200180831161165f57829003601f168201915b5050505050905090565b6013818051602081018201805184825260208301602085012081835280955050505050506000915090508060000180546116bf90612a63565b80601f01602080910402602001604051908101604052809291908181526020018280546116eb90612a63565b80156117385780601f1061170d57610100808354040283529160200191611738565b820191906000526020600020905b81548152906001019060200180831161171b57829003601f168201915b5050505050908060010160009054906101000a900460ff16908060020154908060030154905084565b6117696120e6565b6001600a819055506002600b81905550600860009054906101000a900460ff16600a61179591906130e5565b629896816117a39190613130565b600c81905550600860009054906101000a900460ff16600a6117c591906130e5565b629896816117d39190613130565b600d81905550565b6000806117e6611cb5565b905060006117f48286611aa1565b905083811015611839576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183090613233565b60405180910390fd5b6118468286868403611cbd565b60019250505092915050565b60008061185d611cb5565b905061186a818585611e86565b600191505092915050565b600d5481565b60006118856120e6565b600a82846118939190612b9b565b11156118d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cb906132c5565b60405180910390fd5b82600a8190555081600b819055506001905092915050565b6000811561191d576013836040516119049190612c0b565b9081526020016040518091039020600301549050611942565b60128360405161192d9190612c0b565b90815260200160405180910390206003015490505b92915050565b60006119526120e6565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d990612f92565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4890612f92565b60405180910390fd5b81600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b60105481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60175481565b611b366120e6565b80601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f318c131114339c004fff0a22fcdbbc0566bb2a7cd3aa1660e636ec5a66784ff28282604051611bbe9291906132e5565b60405180910390a15050565b60008115611bfb57601383604051611be29190612c0b565b9081526020016040518091039020600201549050611c20565b601283604051611c0b9190612c0b565b90815260200160405180910390206002015490505b92915050565b611c2e6120e6565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9490613380565b60405180910390fd5b611ca6816121f0565b50565b600a5481565b60155481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2390613412565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d92906134a4565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611e79919061232b565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611ef5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eec90613536565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5b906135c8565b60405180910390fd5b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611fea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe19061365a565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516120d8919061232b565b60405180910390a350505050565b6120ee611cb5565b73ffffffffffffffffffffffffffffffffffffffff1661210c6115ca565b73ffffffffffffffffffffffffffffffffffffffff1614612162576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612159906136c6565b60405180910390fd5b565b60006121708484611aa1565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146121ea57818110156121dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d390613732565b60405180910390fd5b6121e98484848403611cbd565b5b50505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006122e1826122b6565b9050919050565b6122f1816122d6565b82525050565b600060208201905061230c60008301846122e8565b92915050565b6000819050919050565b61232581612312565b82525050565b6000602082019050612340600083018461231c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612380578082015181840152602081019050612365565b60008484015250505050565b6000601f19601f8301169050919050565b60006123a882612346565b6123b28185612351565b93506123c2818560208601612362565b6123cb8161238c565b840191505092915050565b600060208201905081810360008301526123f0818461239d565b905092915050565b6000604051905090565b600080fd5b600080fd5b612415816122d6565b811461242057600080fd5b50565b6000813590506124328161240c565b92915050565b61244181612312565b811461244c57600080fd5b50565b60008135905061245e81612438565b92915050565b6000806040838503121561247b5761247a612402565b5b600061248985828601612423565b925050602061249a8582860161244f565b9150509250929050565b60008115159050919050565b6124b9816124a4565b82525050565b60006020820190506124d460008301846124b0565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61251c8261238c565b810181811067ffffffffffffffff8211171561253b5761253a6124e4565b5b80604052505050565b600061254e6123f8565b905061255a8282612513565b919050565b600067ffffffffffffffff82111561257a576125796124e4565b5b6125838261238c565b9050602081019050919050565b82818337600083830152505050565b60006125b26125ad8461255f565b612544565b9050828152602081018484840111156125ce576125cd6124df565b5b6125d9848285612590565b509392505050565b600082601f8301126125f6576125f56124da565b5b813561260684826020860161259f565b91505092915050565b60006020828403121561262557612624612402565b5b600082013567ffffffffffffffff81111561264357612642612407565b5b61264f848285016125e1565b91505092915050565b6000819050919050565b600061267d612678612673846122b6565b612658565b6122b6565b9050919050565b600061268f82612662565b9050919050565b60006126a182612684565b9050919050565b6126b181612696565b82525050565b60006020820190506126cc60008301846126a8565b92915050565b6126db816124a4565b81146126e657600080fd5b50565b6000813590506126f8816126d2565b92915050565b600080600080600060a0868803121561271a57612719612402565b5b600086013567ffffffffffffffff81111561273857612737612407565b5b612744888289016125e1565b9550506020612755888289016126e9565b9450506040612766888289016126e9565b93505060606127778882890161244f565b92505060806127888882890161244f565b9150509295509295909350565b6000602082840312156127ab576127aa612402565b5b60006127b984828501612423565b91505092915050565b6000806000606084860312156127db576127da612402565b5b60006127e986828701612423565b93505060206127fa86828701612423565b925050604061280b8682870161244f565b9150509250925092565b600060ff82169050919050565b61282b81612815565b82525050565b60006020820190506128466000830184612822565b92915050565b6000806040838503121561286357612862612402565b5b600083013567ffffffffffffffff81111561288157612880612407565b5b61288d858286016125e1565b925050602061289e858286016126e9565b9150509250929050565b600060808201905081810360008301526128c2818761239d565b90506128d160208301866124b0565b6128de604083018561231c565b6128eb606083018461231c565b95945050505050565b60008060006060848603121561290d5761290c612402565b5b600061291b868287016126e9565b935050602061292c868287016126e9565b925050604061293d8682870161244f565b9150509250925092565b60006020828403121561295d5761295c612402565b5b600061296b8482850161244f565b91505092915050565b6000806040838503121561298b5761298a612402565b5b60006129998582860161244f565b92505060206129aa8582860161244f565b9150509250929050565b600080604083850312156129cb576129ca612402565b5b60006129d985828601612423565b92505060206129ea85828601612423565b9150509250929050565b60008060408385031215612a0b57612a0a612402565b5b6000612a1985828601612423565b9250506020612a2a858286016126e9565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612a7b57607f821691505b602082108103612a8e57612a8d612a34565b5b50919050565b7f4e6f7420656e6f756768204554482073656e7421000000000000000000000000600082015250565b6000612aca601483612351565b9150612ad582612a94565b602082019050919050565b60006020820190508181036000830152612af981612abd565b9050919050565b7f4e6f7420656e6f75676820746f6b656e73210000000000000000000000000000600082015250565b6000612b36601283612351565b9150612b4182612b00565b602082019050919050565b60006020820190508181036000830152612b6581612b29565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612ba682612312565b9150612bb183612312565b9250828201905080821115612bc957612bc8612b6c565b5b92915050565b600081905092915050565b6000612be582612346565b612bef8185612bcf565b9350612bff818560208601612362565b80840191505092915050565b6000612c178284612bda565b915081905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612c847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612c47565b612c8e8683612c47565b95508019841693508086168417925050509392505050565b6000612cc1612cbc612cb784612312565b612658565b612312565b9050919050565b6000819050919050565b612cdb83612ca6565b612cef612ce782612cc8565b848454612c54565b825550505050565b600090565b612d04612cf7565b612d0f818484612cd2565b505050565b5b81811015612d3357612d28600082612cfc565b600181019050612d15565b5050565b601f821115612d7857612d4981612c22565b612d5284612c37565b81016020851015612d61578190505b612d75612d6d85612c37565b830182612d14565b50505b505050565b600082821c905092915050565b6000612d9b60001984600802612d7d565b1980831691505092915050565b6000612db48383612d8a565b9150826002028217905092915050565b612dcd82612346565b67ffffffffffffffff811115612de657612de56124e4565b5b612df08254612a63565b612dfb828285612d37565b600060209050601f831160018114612e2e5760008415612e1c578287015190505b612e268582612da8565b865550612e8e565b601f198416612e3c86612c22565b60005b82811015612e6457848901518255600182019150602085019450602081019050612e3f565b86831015612e815784890151612e7d601f891682612d8a565b8355505b6001600288020188555050505b505050505050565b60006040820190508181036000830152612eb0818561239d565b9050612ebf602083018461231c565b9392505050565b600060a0820190508181036000830152612ee0818861239d565b9050612eef60208301876124b0565b612efc60408301866124b0565b612f09606083018561231c565b612f16608083018461231c565b9695505050505050565b7f4c5020506169722063616e6e6f742062652074686520446561642077616c6c6560008201527f742c206f72203021000000000000000000000000000000000000000000000000602082015250565b6000612f7c602883612351565b9150612f8782612f20565b604082019050919050565b60006020820190508181036000830152612fab81612f6f565b9050919050565b60008160011c9050919050565b6000808291508390505b600185111561300957808604811115612fe557612fe4612b6c565b5b6001851615612ff45780820291505b808102905061300285612fb2565b9450612fc9565b94509492505050565b60008261302257600190506130de565b8161303057600090506130de565b816001811461304657600281146130505761307f565b60019150506130de565b60ff84111561306257613061612b6c565b5b8360020a91508482111561307957613078612b6c565b5b506130de565b5060208310610133831016604e8410600b84101617156130b45782820a9050838111156130af576130ae612b6c565b5b6130de565b6130c18484846001612fbf565b925090508184048111156130d8576130d7612b6c565b5b81810290505b9392505050565b60006130f082612312565b91506130fb83612815565b92506131287fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613012565b905092915050565b600061313b82612312565b915061314683612312565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561317f5761317e612b6c565b5b828202905092915050565b600060608201905061319f60008301866124b0565b6131ac60208301856124b0565b6131b9604083018461231c565b949350505050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061321d602583612351565b9150613228826131c1565b604082019050919050565b6000602082019050818103600083015261324c81613210565b9050919050565b7f45524332303a20746f74616c20746178206d757374206e6f742062652067726560008201527f61746572207468616e2031302500000000000000000000000000000000000000602082015250565b60006132af602d83612351565b91506132ba82613253565b604082019050919050565b600060208201905081810360008301526132de816132a2565b9050919050565b60006040820190506132fa60008301856122e8565b61330760208301846124b0565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061336a602683612351565b91506133758261330e565b604082019050919050565b600060208201905081810360008301526133998161335d565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006133fc602483612351565b9150613407826133a0565b604082019050919050565b6000602082019050818103600083015261342b816133ef565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061348e602283612351565b915061349982613432565b604082019050919050565b600060208201905081810360008301526134bd81613481565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613520602583612351565b915061352b826134c4565b604082019050919050565b6000602082019050818103600083015261354f81613513565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006135b2602383612351565b91506135bd82613556565b604082019050919050565b600060208201905081810360008301526135e1816135a5565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000613644602683612351565b915061364f826135e8565b604082019050919050565b6000602082019050818103600083015261367381613637565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006136b0602083612351565b91506136bb8261367a565b602082019050919050565b600060208201905081810360008301526136df816136a3565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061371c601d83612351565b9150613727826136e6565b602082019050919050565b6000602082019050818103600083015261374b8161370f565b905091905056fea2646970667358221220845e304d7854d0c02ad1a3a764d94843d0c1b25b20e4bbf8ce29c2cbc4b2c2c664736f6c63430008100033

Deployed Bytecode Sourcemap

28243:10312:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28830:64;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29809:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17961:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20235:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31143:594;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33936:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30559:576;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19099:110;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32617:694;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35201:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21059:297;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18942:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22775:272;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33994:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31784:254;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28581:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29687:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;18126:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15220:103;;;;;;;;;;;;;:::i;:::-;;33319:524;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28748:75;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28945:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29911:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38317:198;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28624:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14572:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17785:106;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29744:56;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;29004:211;;;;;;;;;;;;;:::i;:::-;;21859:507;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19679:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28684:57;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37916:391;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32046:262;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37558:350;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28901:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19272:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29956:54;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35969:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32316:262;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15478:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28538:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29852:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28830:64;;;;;;;;;;;;;:::o;29809:36::-;;;;:::o;17961:102::-;18017:13;18050:5;18043:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17961:102;:::o;20235:244::-;20356:4;20378:13;20394:12;:10;:12::i;:::-;20378:28;;20417:32;20426:5;20433:7;20442:6;20417:8;:32::i;:::-;20467:4;20460:11;;;20235:244;;;;:::o;31143:594::-;31241:11;;31228:9;:24;;31220:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;31318:14;;31296:10;:18;;;:36;;31288:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;31388:9;31366:18;;:31;;;;;;;:::i;:::-;;;;;;;;31408:43;31418:10;31430:4;;;;;;;;;;;31436:14;;31408:9;:43::i;:::-;31503:166;;;;;;;;31531:10;31503:166;;;;31556:4;31503:166;;;;;;31575:15;31503:166;;;;31649:9;31605:16;31622:10;31605:28;;;;;;:::i;:::-;;;;;;;;;;;;;:41;;;:53;;;;:::i;:::-;31503:166;;;31472:16;31489:10;31472:28;;;;;;:::i;:::-;;;;;;;;;;;;;:197;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31685:44;31701:10;31713:15;31685:44;;;;;;;:::i;:::-;;;;;;;;31143:594;:::o;33936:51::-;;;:::o;30559:576::-;30655:11;;30642:9;:24;;30634:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;30732:14;;30710:10;:18;;;:36;;30702:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;30802:9;30780:18;;:31;;;;;;;:::i;:::-;;;;;;;;30822:43;30832:10;30844:4;;;;;;;;;;;30850:14;;30822:9;:43::i;:::-;30907:162;;;;;;;;30932:11;30907:162;;;;30958:4;30907:162;;;;;;30977:15;30907:162;;;;31049:9;31007:13;31021:11;31007:26;;;;;;:::i;:::-;;;;;;;;;;;;;:39;;;:51;;;;:::i;:::-;30907:162;;;30878:13;30892:11;30878:26;;;;;;:::i;:::-;;;;;;;;;;;;;:191;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31085:42;31098:11;31111:15;31085:42;;;;;;;:::i;:::-;;;;;;;;30559:576;:::o;19099:110::-;19162:7;19189:12;;19182:19;;19099:110;:::o;32617:694::-;14458:13;:11;:13::i;:::-;32783:10:::1;32779:430;;;32843:147;;;;;;;;32875:12;32843:147;;;;32906:11;32843:147;;;;;;32936:12;32843:147;;;;32967:8;32843:147;;::::0;32810:16:::1;32827:12;32810:30;;;;;;:::i;:::-;;;;;;;;;;;;;:180;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32779:430;;;33053:144;;;;;;;;33082:12;33053:144;;;;33113:11;33053:144;;;;;;33143:12;33053:144;;;;33174:8;33053:144;;::::0;33023:13:::1;33037:12;33023:27;;;;;;:::i;:::-;;;;;;;;;;;;;:174;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32779:430;33224:79;33241:12;33255:10;33267:11;33280:12;33294:8;33224:79;;;;;;;;;;:::i;:::-;;;;;;;;32617:694:::0;;;;;:::o;35201:288::-;14458:13;:11;:13::i;:::-;35283:4:::1;;;;;;;;;;;35274:13;;:5;:13;;::::0;35266:66:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;35368:1;35351:19;;:5;:19;;::::0;35343:72:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;35442:5;35426:13;;:21;;;;;;;;;;;;;;;;;;35463:18;35475:5;35463:18;;;;;;:::i;:::-;;;;;;;;35201:288:::0;:::o;21059:297::-;21192:4;21209:15;21227:12;:10;:12::i;:::-;21209:30;;21250:38;21266:4;21272:7;21281:6;21250:15;:38::i;:::-;21299:27;21309:4;21315:2;21319:6;21299:9;:27::i;:::-;21344:4;21337:11;;;21059:297;;;;;:::o;18942:92::-;19000:5;19025:1;19018:8;;18942:92;:::o;22775:272::-;22892:4;22914:13;22930:12;:10;:12::i;:::-;22914:28;;22953:64;22962:5;22969:7;23006:10;22978:25;22988:5;22995:7;22978:9;:25::i;:::-;:38;;;;:::i;:::-;22953:8;:64::i;:::-;23035:4;23028:11;;;22775:272;;;;:::o;33994:28::-;;;;;;;;;;;;;:::o;31784:254::-;31871:4;31892:10;31888:89;;;31926:16;31943:12;31926:30;;;;;;:::i;:::-;;;;;;;;;;;;;:39;;;;;;;;;;;;31919:46;;;;31888:89;31994:13;32008:12;31994:27;;;;;;:::i;:::-;;;;;;;;;;;;;:36;;;;;;;;;;;;31987:43;;31784:254;;;;;:::o;28581:35::-;;;;:::o;29687:50::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;18126:177::-;18245:7;18277:9;:18;18287:7;18277:18;;;;;;;;;;;;;;;;18270:25;;18126:177;;;:::o;15220:103::-;14458:13;:11;:13::i;:::-;15285:30:::1;15312:1;15285:18;:30::i;:::-;15220:103::o:0;33319:524::-;14458:13;:11;:13::i;:::-;33412:6:::1;33408:374;;;33439:10;33435:133;;;33487:5;33470:14;:22;;;;33435:133;;;33547:5;33533:11;:19;;;;33435:133;33408:374;;;33604:10;33600:171;;;33667:9;;;;;;;;;;;33663:2;:13;;;;:::i;:::-;33655:5;:21;;;;:::i;:::-;33635:17;:41;;;;33600:171;;;33746:9;;;;;;;;;;;33742:2;:13;;;;:::i;:::-;33734:5;:21;;;;:::i;:::-;33717:14;:38;;;;33600:171;33408:374;33797:38;33809:6;33817:10;33829:5;33797:38;;;;;;;;:::i;:::-;;;;;;;;33319:524:::0;;;:::o;28748:75::-;;;;;;;;;;;;;:::o;28945:50::-;;;;;;;;;;;;;;;;;;;;;;:::o;29911:38::-;;;;:::o;38317:198::-;38427:4;14458:13;:11;:13::i;:::-;38467:16:::1;38449:15;:34;;;;38503:4;38496:11;;38317:198:::0;;;:::o;28624:53::-;;;;:::o;14572:87::-;14618:7;14645:6;;;;;;;;;;;14638:13;;14572:87;:::o;17785:106::-;17843:13;17876:7;17869:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17785:106;:::o;29744:56::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29004:211::-;14458:13;:11;:13::i;:::-;29074:1:::1;29056:15;:19;;;;29104:1;29086:15;:19;;;;29145:9;;;;;;;;;;;29141:2;:13;;;;:::i;:::-;29130:8;:24;;;;:::i;:::-;29116:11;:38;;;;29198:9;;;;;;;;;;;29194:2;:13;;;;:::i;:::-;29183:8;:24;;;;:::i;:::-;29165:15;:42;;;;29004:211::o:0;21859:507::-;21981:4;22003:13;22019:12;:10;:12::i;:::-;22003:28;;22042:24;22069:25;22079:5;22086:7;22069:9;:25::i;:::-;22042:52;;22147:15;22127:16;:35;;22105:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;22263:60;22272:5;22279:7;22307:15;22288:16;:34;22263:8;:60::i;:::-;22354:4;22347:11;;;;21859:507;;;;:::o;19679:236::-;19796:4;19818:13;19834:12;:10;:12::i;:::-;19818:28;;19857;19867:5;19874:2;19878:6;19857:9;:28::i;:::-;19903:4;19896:11;;;19679:236;;;;:::o;28684:57::-;;;;:::o;37916:391::-;38064:4;14458:13;:11;:13::i;:::-;38133:2:::1;38112:16;38095;:33;;;;:::i;:::-;38094:41;;38086:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;38214:16;38196:15;:34;;;;38259:16;38241:15;:34;;;;38295:4;38288:11;;37916:391:::0;;;;:::o;32046:262::-;32133:4;32154:10;32150:93;;;32188:16;32205:12;32188:30;;;;;;:::i;:::-;;;;;;;;;;;;;:43;;;32181:50;;;;32150:93;32260:13;32274:12;32260:27;;;;;;:::i;:::-;;;;;;;;;;;;;:40;;;32253:47;;32046:262;;;;;:::o;37558:350::-;37661:4;14458:13;:11;:13::i;:::-;37704:4:::1;;;;;;;;;;;37691:17;;:9;:17;;::::0;37683:70:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;37793:1;37772:23;;:9;:23;;::::0;37764:76:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;37869:9;37851:15;;:27;;;;;;;;;;;;;;;;;;37896:4;37889:11;;37558:350:::0;;;:::o;28901:37::-;;;;:::o;19272:201::-;19406:7;19438:11;:18;19450:5;19438:18;;;;;;;;;;;;;;;:27;19457:7;19438:27;;;;;;;;;;;;;;;;19431:34;;19272:201;;;;:::o;29956:54::-;;;;:::o;35969:189::-;14458:13;:11;:13::i;:::-;36086:7:::1;36055:18;:28;36074:8;36055:28;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;36109:41;36132:8;36142:7;36109:41;;;;;;;:::i;:::-;;;;;;;;35969:189:::0;;:::o;32316:262::-;32407:4;32428:10;32424:91;;;32462:16;32479:12;32462:30;;;;;;:::i;:::-;;;;;;;;;;;;;:41;;;32455:48;;;;32424:91;32532:13;32546:12;32532:27;;;;;;:::i;:::-;;;;;;;;;;;;;:38;;;32525:45;;32316:262;;;;;:::o;15478:238::-;14458:13;:11;:13::i;:::-;15601:1:::1;15581:22;;:8;:22;;::::0;15559:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;15680:28;15699:8;15680:18;:28::i;:::-;15478:238:::0;:::o;28538:35::-;;;;:::o;29852:50::-;;;;:::o;13365:98::-;13418:7;13445:10;13438:17;;13365:98;:::o;25082:380::-;25235:1;25218:19;;:5;:19;;;25210:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25316:1;25297:21;;:7;:21;;;25289:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25400:6;25370:11;:18;25382:5;25370:18;;;;;;;;;;;;;;;:27;25389:7;25370:27;;;;;;;;;;;;;;;:36;;;;25438:7;25422:32;;25431:5;25422:32;;;25447:6;25422:32;;;;;;:::i;:::-;;;;;;;;25082:380;;;:::o;26263:776::-;26410:1;26394:18;;:4;:18;;;26386:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26487:1;26473:16;;:2;:16;;;26465:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;26542:19;26564:9;:15;26574:4;26564:15;;;;;;;;;;;;;;;;26542:37;;26627:6;26612:11;:21;;26590:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;26767:6;26753:11;:20;26735:9;:15;26745:4;26735:15;;;;;;;;;;;;;;;:38;;;;26970:6;26953:9;:13;26963:2;26953:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;27020:2;27005:26;;27014:4;27005:26;;;27024:6;27005:26;;;;;;:::i;:::-;;;;;;;;26375:664;26263:776;;;:::o;14737:132::-;14812:12;:10;:12::i;:::-;14801:23;;:7;:5;:7::i;:::-;:23;;;14793:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14737:132::o;25753:502::-;25888:24;25915:25;25925:5;25932:7;25915:9;:25::i;:::-;25888:52;;25975:17;25955:16;:37;25951:297;;26055:6;26035:16;:26;;26009:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;26170:51;26179:5;26186:7;26214:6;26195:16;:25;26170:8;:51::i;:::-;25951:297;25877:378;25753:502;;;:::o;15876:191::-;15950:16;15969:6;;;;;;;;;;;15950:25;;15995:8;15986:6;;:17;;;;;;;;;;;;;;;;;;16050:8;16019:40;;16040:8;16019:40;;;;;;;;;;;;15939:128;15876:191;:::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:86::-;10090:7;10130:4;10123:5;10119:16;10108:27;;10055:86;;;:::o;10147:112::-;10230:22;10246:5;10230:22;:::i;:::-;10225:3;10218:35;10147:112;;:::o;10265:214::-;10354:4;10392:2;10381:9;10377:18;10369:26;;10405:67;10469:1;10458:9;10454:17;10445:6;10405:67;:::i;:::-;10265:214;;;;:::o;10485:648::-;10560:6;10568;10617:2;10605:9;10596:7;10592:23;10588:32;10585:119;;;10623:79;;:::i;:::-;10585:119;10771:1;10760:9;10756:17;10743:31;10801:18;10793:6;10790:30;10787:117;;;10823:79;;:::i;:::-;10787:117;10928:63;10983:7;10974:6;10963:9;10959:22;10928:63;:::i;:::-;10918:73;;10714:287;11040:2;11066:50;11108:7;11099:6;11088:9;11084:22;11066:50;:::i;:::-;11056:60;;11011:115;10485:648;;;;;:::o;11139:632::-;11330:4;11368:3;11357:9;11353:19;11345:27;;11418:9;11412:4;11408:20;11404:1;11393:9;11389:17;11382:47;11446:78;11519:4;11510:6;11446:78;:::i;:::-;11438:86;;11534:66;11596:2;11585:9;11581:18;11572:6;11534:66;:::i;:::-;11610:72;11678:2;11667:9;11663:18;11654:6;11610:72;:::i;:::-;11692;11760:2;11749:9;11745:18;11736:6;11692:72;:::i;:::-;11139:632;;;;;;;:::o;11777:607::-;11848:6;11856;11864;11913:2;11901:9;11892:7;11888:23;11884:32;11881:119;;;11919:79;;:::i;:::-;11881:119;12039:1;12064:50;12106:7;12097:6;12086:9;12082:22;12064:50;:::i;:::-;12054:60;;12010:114;12163:2;12189:50;12231:7;12222:6;12211:9;12207:22;12189:50;:::i;:::-;12179:60;;12134:115;12288:2;12314:53;12359:7;12350:6;12339:9;12335:22;12314:53;:::i;:::-;12304:63;;12259:118;11777:607;;;;;:::o;12390:329::-;12449:6;12498:2;12486:9;12477:7;12473:23;12469:32;12466:119;;;12504:79;;:::i;:::-;12466:119;12624:1;12649:53;12694:7;12685:6;12674:9;12670:22;12649:53;:::i;:::-;12639:63;;12595:117;12390:329;;;;:::o;12725:474::-;12793:6;12801;12850:2;12838:9;12829:7;12825:23;12821:32;12818:119;;;12856:79;;:::i;:::-;12818:119;12976:1;13001:53;13046:7;13037:6;13026:9;13022:22;13001:53;:::i;:::-;12991:63;;12947:117;13103:2;13129:53;13174:7;13165:6;13154:9;13150:22;13129:53;:::i;:::-;13119:63;;13074:118;12725:474;;;;;:::o;13205:::-;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:102::-;24342:8;24389:5;24386:1;24382:13;24361:34;;24300:102;;;:::o;24408:848::-;24469:5;24476:4;24500:6;24491:15;;24524:5;24515:14;;24538:712;24559:1;24549:8;24546:15;24538:712;;;24654:4;24649:3;24645:14;24639:4;24636:24;24633:50;;;24663:18;;:::i;:::-;24633:50;24713:1;24703:8;24699:16;24696:451;;;25128:4;25121:5;25117:16;25108:25;;24696:451;25178:4;25172;25168:15;25160:23;;25208:32;25231:8;25208:32;:::i;:::-;25196:44;;24538:712;;;24408:848;;;;;;;:::o;25262:1073::-;25316:5;25507:8;25497:40;;25528:1;25519:10;;25530:5;;25497:40;25556:4;25546:36;;25573:1;25564:10;;25575:5;;25546:36;25642:4;25690:1;25685:27;;;;25726:1;25721:191;;;;25635:277;;25685:27;25703:1;25694:10;;25705:5;;;25721:191;25766:3;25756:8;25753:17;25750:43;;;25773:18;;:::i;:::-;25750:43;25822:8;25819:1;25815:16;25806:25;;25857:3;25850:5;25847:14;25844:40;;;25864:18;;:::i;:::-;25844:40;25897:5;;;25635:277;;26021:2;26011:8;26008:16;26002:3;25996:4;25993:13;25989:36;25971:2;25961:8;25958:16;25953:2;25947:4;25944:12;25940:35;25924:111;25921:246;;;26077:8;26071:4;26067:19;26058:28;;26112:3;26105:5;26102:14;26099:40;;;26119:18;;:::i;:::-;26099:40;26152:5;;25921:246;26192:42;26230:3;26220:8;26214:4;26211:1;26192:42;:::i;:::-;26177:57;;;;26266:4;26261:3;26257:14;26250:5;26247:25;26244:51;;;26275:18;;:::i;:::-;26244:51;26324:4;26317:5;26313:16;26304:25;;25262:1073;;;;;;:::o;26341:281::-;26399:5;26423:23;26441:4;26423:23;:::i;:::-;26415:31;;26467:25;26483:8;26467:25;:::i;:::-;26455:37;;26511:104;26548:66;26538:8;26532:4;26511:104;:::i;:::-;26502:113;;26341:281;;;;:::o;26628:348::-;26668:7;26691:20;26709:1;26691:20;:::i;:::-;26686:25;;26725:20;26743:1;26725:20;:::i;:::-;26720:25;;26913:1;26845:66;26841:74;26838:1;26835:81;26830:1;26823:9;26816:17;26812:105;26809:131;;;26920:18;;:::i;:::-;26809:131;26968:1;26965;26961:9;26950:20;;26628:348;;;;:::o;26982:418::-;27119:4;27157:2;27146:9;27142:18;27134:26;;27170:65;27232:1;27221:9;27217:17;27208:6;27170:65;:::i;:::-;27245:66;27307:2;27296:9;27292:18;27283:6;27245:66;:::i;:::-;27321:72;27389:2;27378:9;27374:18;27365:6;27321:72;:::i;:::-;26982:418;;;;;;:::o;27406:224::-;27546:34;27542:1;27534:6;27530:14;27523:58;27615:7;27610:2;27602:6;27598:15;27591:32;27406:224;:::o;27636:366::-;27778:3;27799:67;27863:2;27858:3;27799:67;:::i;:::-;27792:74;;27875:93;27964:3;27875:93;:::i;:::-;27993:2;27988:3;27984:12;27977:19;;27636:366;;;:::o;28008:419::-;28174:4;28212:2;28201:9;28197:18;28189:26;;28261:9;28255:4;28251:20;28247:1;28236:9;28232:17;28225:47;28289:131;28415:4;28289:131;:::i;:::-;28281:139;;28008:419;;;:::o;28433:232::-;28573:34;28569:1;28561:6;28557:14;28550:58;28642:15;28637:2;28629:6;28625:15;28618:40;28433:232;:::o;28671:366::-;28813:3;28834:67;28898:2;28893:3;28834:67;:::i;:::-;28827:74;;28910:93;28999:3;28910:93;:::i;:::-;29028:2;29023:3;29019:12;29012:19;;28671:366;;;:::o;29043:419::-;29209:4;29247:2;29236:9;29232:18;29224:26;;29296:9;29290:4;29286:20;29282:1;29271:9;29267:17;29260:47;29324:131;29450:4;29324:131;:::i;:::-;29316:139;;29043:419;;;:::o;29468:320::-;29583:4;29621:2;29610:9;29606:18;29598:26;;29634:71;29702:1;29691:9;29687:17;29678:6;29634:71;:::i;:::-;29715:66;29777:2;29766:9;29762:18;29753:6;29715:66;:::i;:::-;29468:320;;;;;:::o;29794:225::-;29934:34;29930:1;29922:6;29918:14;29911:58;30003:8;29998:2;29990:6;29986:15;29979:33;29794:225;:::o;30025:366::-;30167:3;30188:67;30252:2;30247:3;30188:67;:::i;:::-;30181:74;;30264:93;30353:3;30264:93;:::i;:::-;30382:2;30377:3;30373:12;30366:19;;30025:366;;;:::o;30397:419::-;30563:4;30601:2;30590:9;30586:18;30578:26;;30650:9;30644:4;30640:20;30636:1;30625:9;30621:17;30614:47;30678:131;30804:4;30678:131;:::i;:::-;30670:139;;30397:419;;;:::o;30822:223::-;30962:34;30958:1;30950:6;30946:14;30939:58;31031:6;31026:2;31018:6;31014:15;31007:31;30822:223;:::o;31051:366::-;31193:3;31214:67;31278:2;31273:3;31214:67;:::i;:::-;31207:74;;31290:93;31379:3;31290:93;:::i;:::-;31408:2;31403:3;31399:12;31392:19;;31051:366;;;:::o;31423:419::-;31589:4;31627:2;31616:9;31612:18;31604:26;;31676:9;31670:4;31666:20;31662:1;31651:9;31647:17;31640:47;31704:131;31830:4;31704:131;:::i;:::-;31696:139;;31423:419;;;:::o;31848:221::-;31988:34;31984:1;31976:6;31972:14;31965:58;32057:4;32052:2;32044:6;32040:15;32033:29;31848:221;:::o;32075:366::-;32217:3;32238:67;32302:2;32297:3;32238:67;:::i;:::-;32231:74;;32314:93;32403:3;32314:93;:::i;:::-;32432:2;32427:3;32423:12;32416:19;;32075:366;;;:::o;32447:419::-;32613:4;32651:2;32640:9;32636:18;32628:26;;32700:9;32694:4;32690:20;32686:1;32675:9;32671:17;32664:47;32728:131;32854:4;32728:131;:::i;:::-;32720:139;;32447:419;;;:::o;32872:224::-;33012:34;33008:1;33000:6;32996:14;32989:58;33081:7;33076:2;33068:6;33064:15;33057:32;32872:224;:::o;33102:366::-;33244:3;33265:67;33329:2;33324:3;33265:67;:::i;:::-;33258:74;;33341:93;33430:3;33341:93;:::i;:::-;33459:2;33454:3;33450:12;33443:19;;33102:366;;;:::o;33474:419::-;33640:4;33678:2;33667:9;33663:18;33655:26;;33727:9;33721:4;33717:20;33713:1;33702:9;33698:17;33691:47;33755:131;33881:4;33755:131;:::i;:::-;33747:139;;33474:419;;;:::o;33899:222::-;34039:34;34035:1;34027:6;34023:14;34016:58;34108:5;34103:2;34095:6;34091:15;34084:30;33899:222;:::o;34127:366::-;34269:3;34290:67;34354:2;34349:3;34290:67;:::i;:::-;34283:74;;34366:93;34455:3;34366:93;:::i;:::-;34484:2;34479:3;34475:12;34468:19;;34127:366;;;:::o;34499:419::-;34665:4;34703:2;34692:9;34688:18;34680:26;;34752:9;34746:4;34742:20;34738:1;34727:9;34723:17;34716:47;34780:131;34906:4;34780:131;:::i;:::-;34772:139;;34499:419;;;:::o;34924:225::-;35064:34;35060:1;35052:6;35048:14;35041:58;35133:8;35128:2;35120:6;35116:15;35109:33;34924:225;:::o;35155:366::-;35297:3;35318:67;35382:2;35377:3;35318:67;:::i;:::-;35311:74;;35394:93;35483:3;35394:93;:::i;:::-;35512:2;35507:3;35503:12;35496:19;;35155:366;;;:::o;35527:419::-;35693:4;35731:2;35720:9;35716:18;35708:26;;35780:9;35774:4;35770:20;35766:1;35755:9;35751:17;35744:47;35808:131;35934:4;35808:131;:::i;:::-;35800:139;;35527:419;;;:::o;35952:182::-;36092:34;36088:1;36080:6;36076:14;36069:58;35952:182;:::o;36140:366::-;36282:3;36303:67;36367:2;36362:3;36303:67;:::i;:::-;36296:74;;36379:93;36468:3;36379:93;:::i;:::-;36497:2;36492:3;36488:12;36481:19;;36140:366;;;:::o;36512:419::-;36678:4;36716:2;36705:9;36701:18;36693:26;;36765:9;36759:4;36755:20;36751:1;36740:9;36736:17;36729:47;36793:131;36919:4;36793:131;:::i;:::-;36785:139;;36512:419;;;:::o;36937:179::-;37077:31;37073:1;37065:6;37061:14;37054:55;36937:179;:::o;37122:366::-;37264:3;37285:67;37349:2;37344:3;37285:67;:::i;:::-;37278:74;;37361:93;37450:3;37361:93;:::i;:::-;37479:2;37474:3;37470:12;37463:19;;37122:366;;;:::o;37494:419::-;37660:4;37698:2;37687:9;37683:18;37675:26;;37747:9;37741:4;37737:20;37733:1;37722:9;37718:17;37711:47;37775:131;37901:4;37775:131;:::i;:::-;37767:139;;37494:419;;;:::o

Swarm Source

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