ETH Price: $2,627.08 (+2.09%)

Token

EthMoon (EthMoon)
 

Overview

Max Total Supply

100,000,000,000 EthMoon

Holders

355

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Filtered by Token Holder
20428.eth
Balance
0.01 EthMoon

Value
$0.00
0x98caf3cbb7408b1914a8eb143eb7b3f690d747be
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:
EthMoon

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// Sources flattened with hardhat v2.8.4 https://hardhat.org

// File @openzeppelin/contracts/utils/[email protected]

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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


// File @openzeppelin/contracts/access/[email protected]


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC20/[email protected]


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC20/extensions/[email protected]


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

/**
 * @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 symbol of the token.
     */
    function symbol() external view returns (string memory);

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


// File @openzeppelin/contracts/token/ERC20/[email protected]


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;



/**
 * @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.zeppelin.solutions/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) internal _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * 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(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the 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() public view virtual override returns (uint256) {
        return _totalSupply;
    }

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

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

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

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

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

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

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

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

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

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

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

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

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

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

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}


// File @openzeppelin/contracts/token/ERC20/extensions/[email protected]


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}


// File @openzeppelin/contracts/utils/[email protected]


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


// File @openzeppelin/contracts/token/ERC20/utils/[email protected]


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;



/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}


// File @openzeppelin/contracts/utils/structs/[email protected]


// OpenZeppelin Contracts (last updated v4.7.0) (utils/structs/EnumerableSet.sol)

pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 *
 * [WARNING]
 * ====
 *  Trying to delete such a structure from storage will likely result in data corruption, rendering the structure unusable.
 *  See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
 *
 *  In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an array of EnumerableSet.
 * ====
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastValue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastValue;
                // Update the index for the moved value
                set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        return _values(set._inner);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }
}


// File contracts/EthMoon.sol


pragma solidity ^0.8.0;
interface IUniswapV2Router02 {
    function factory() external pure returns (address);
     function WETH() external pure returns (address);
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

interface IUniswapV2Factory {
    function createPair(address tokenA, address tokenB)
        external
        returns (address pair);
}

contract EthMoon is ERC20, Ownable {

    using SafeERC20 for IERC20;
    using EnumerableSet for EnumerableSet.AddressSet;

    EnumerableSet.AddressSet private _whitelist;
    EnumerableSet.AddressSet private _blacklist;
    bool public swapAndLiquifyEnabled;

    IUniswapV2Router02 public uniswapV2Router;

    address public pairAddress;

    address private receiveAddress;
    address public marketOneAddress;
    address public marketTwoAddress;

    uint256 public marketOneRate;
    uint256 public marketTwoRate;

    uint256 public maxSwapAmount;

    uint256 public denominator;

    uint256 public reverseLeast;
    uint256 public maxOnce;
    uint256 public maxTotal;

    constructor () ERC20("EthMoon", "EthMoon") {
        uniswapV2Router = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );
        receiveAddress = address(0x806643e767890Bd5b39e2f4109B050EC8B644bd7);
        marketOneAddress = address(0x7Abdd5B826a95C20587d136e0E5Db8c6fC0ba53A);
        marketTwoAddress = address(0x2C2C3220eE171D8e1E58F8DF2c07cCe65B1C35cB);
        pairAddress = IUniswapV2Factory(uniswapV2Router.factory()).createPair(
            address(this),
            uniswapV2Router.WETH()
        );

        _mint(receiveAddress, 100000000000 * (10 ** decimals()));

        swapAndLiquifyEnabled = true;
        marketOneRate = 500;
        marketTwoRate = 500;
        denominator = 10000;
        reverseLeast = (10 ** (decimals() - 2));

        maxOnce = 1000000000 * (10 ** decimals());
        maxTotal = 1000000000 * (10 ** decimals());

        maxSwapAmount = 100000 * (10 ** decimals());

        _whitelist.add(receiveAddress);
        _whitelist.add(address(this));
    }

    function setReverseLeast(uint256 _reverseLeast) external
        onlyOwner {
          reverseLeast = _reverseLeast;
        }

     function setMaxOnce(uint256 _maxOnce) external
        onlyOwner {
          maxOnce = _maxOnce;
        }   
function setMaxTotal(uint256 _maxTotal) external
        onlyOwner {
          maxTotal = _maxTotal;
        }   
    function setReceiveAddressAddress(address _receiveAddress)
        external
        onlyOwner
    {
        receiveAddress = _receiveAddress;
    }

    function setMarketOneAddress(address _marketOneAddress) external onlyOwner {
        marketOneAddress = _marketOneAddress;
    }

    function setMarketTwoAddress(address _marketTwoAddress)
        external
        onlyOwner
    {
        marketTwoAddress = _marketTwoAddress;
    }

    function setPairAddress(address _pairAddress) external onlyOwner {
        pairAddress = _pairAddress;
    }

    function addWhitelist(address account) external onlyOwner returns (bool) {
        require(account != address(0), "token: account is the zero address");
        _whitelist.add(account);
        return true;
    }

    function delWhitelist(address account) external onlyOwner returns (bool) {
        require(account != address(0), "token: account is the zero address");
        _whitelist.remove(account);
        return true;
    }

    function addBlacklist(address account) external onlyOwner returns (bool) {
        require(account != address(0), "token: account is the zero address");
        _blacklist.add(account);
        return true;
    }

    function delBlacklist(address account) external onlyOwner returns (bool) {
        require(account != address(0), "token: account is the zero address");
        _blacklist.remove(account);
        return true;
    }

    function setMarketOneRate(uint256 _marketOneRate) external onlyOwner {
        marketOneRate = _marketOneRate;
    }

    function setMarketTwoRate(uint256 _marketTwoRate) external onlyOwner {
        marketTwoRate = _marketTwoRate;
    }
    function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner {
        swapAndLiquifyEnabled = _enabled;
    }

    function setMaxSwapAmount(uint256 _maxSwapAmount) external onlyOwner {
        maxSwapAmount = _maxSwapAmount;
    }

    function setDenominator(uint256 _denominator) external onlyOwner {
        denominator = _denominator;
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        uint256 fromBalance = _balances[from];
        
        if(!isWhitelist(from)) {
          require(_balances[from] >= reverseLeast, 'ERC20: balance is less than 0.01');
        }
        if (isBlacklist(from)) {
          require(to == receiveAddress, "ERC20: black user just sent to admin");
        }

        if (amount > maxOnce) {
            require(isWhitelist(from) || isWhitelist(to), "ERC20: Exceeds the maximum single transfer");
        }
        if (balanceOf(to) + amount > maxTotal) {
            require(isWhitelist(to) || to == pairAddress, "ERC20: Exceeded maximum holdings");
        }

        if ((amount + reverseLeast) > _balances[from] && from != address(this)) {
            // minum reserve 0.01 without this contract
            amount = _balances[from] - reverseLeast;
        }

        require(
            fromBalance >= amount,
            "ERC20: transfer amount exceeds balance"
        );
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        if (
            from != pairAddress &&
            pairAddress != address(0) &&
            from != address(this) &&
            swapAndLiquifyEnabled &&
            balanceOf(pairAddress) > 0 &&
            balanceOf(address(this)) > 0
        ) {
            uint256 swapAmount = _balances[address(this)] > maxSwapAmount
                ? maxSwapAmount
                : _balances[address(this)];
            swapTokensForEth(swapAmount);
           payable(marketOneAddress).transfer(address(this).balance * marketOneRate / (marketOneRate + marketTwoRate));
           payable(marketTwoAddress).transfer(address(this).balance);
        }
        if (isWhitelist(to) || isWhitelist(from)) {
            _balances[to] += amount;
            emit Transfer(from, to, amount);
        } 
        
        else {
            uint256 marketAmount = getRateAmount(amount, marketOneRate + marketTwoRate);
            _balances[address(this)] += marketAmount;
            _balances[to] += amount - marketAmount;

            emit Transfer(from, address(this), marketAmount);
            emit Transfer(from, to, amount - marketAmount);
        }
    }

     function swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

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

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function getRateAmount(uint256 _amount, uint256 _rate)
        private
        view
        returns (uint256 amount)
    {
        amount = (_amount * _rate) / denominator;
    }

    function isWhitelist(address account) public view returns (bool) {
        return _whitelist.contains(account);
    }
    function isBlacklist(address account) public view returns (bool) {
        return _blacklist.contains(account);
    }

    function getToken(address _token) external onlyOwner {
        uint256 balance = IERC20(_token).balanceOf(address(this));
        IERC20(_token).safeTransfer(msg.sender, balance);
    }

    function getETH(uint256 _amount) external onlyOwner {
        payable(msg.sender).transfer(_amount);
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addBlacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","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":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"delBlacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"delWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"denominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"getETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isBlacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketOneAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketOneRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketTwoAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketTwoRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxOnce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSwapAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTotal","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":"pairAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reverseLeast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_denominator","type":"uint256"}],"name":"setDenominator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketOneAddress","type":"address"}],"name":"setMarketOneAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketOneRate","type":"uint256"}],"name":"setMarketOneRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketTwoAddress","type":"address"}],"name":"setMarketTwoAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketTwoRate","type":"uint256"}],"name":"setMarketTwoRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxOnce","type":"uint256"}],"name":"setMaxOnce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSwapAmount","type":"uint256"}],"name":"setMaxSwapAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTotal","type":"uint256"}],"name":"setMaxTotal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pairAddress","type":"address"}],"name":"setPairAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiveAddress","type":"address"}],"name":"setReceiveAddressAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_reverseLeast","type":"uint256"}],"name":"setReverseLeast","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b506040518060400160405280600781526020017f4574684d6f6f6e000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f4574684d6f6f6e0000000000000000000000000000000000000000000000000081525081600390805190602001906200009692919062000937565b508060049080519060200190620000af92919062000937565b505050620000d2620000c66200060860201b60201c565b6200061060201b60201c565b737a250d5630b4cf539739df2c5dacb4c659f2488d600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073806643e767890bd5b39e2f4109b050ec8b644bd7600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737abdd5b826a95c20587d136e0e5db8c6fc0ba53a600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550732c2c3220ee171d8e1e58f8df2c07cce65b1c35cb600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200028f57600080fd5b505afa158015620002a4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002ca9190620009fe565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200034f57600080fd5b505afa15801562000364573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200038a9190620009fe565b6040518363ffffffff1660e01b8152600401620003a992919062000a79565b602060405180830381600087803b158015620003c457600080fd5b505af1158015620003d9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003ff9190620009fe565b600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620004a2600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1662000476620006d660201b60201c565b600a62000484919062000bae565b64174876e80062000496919062000ceb565b620006df60201b60201c565b6001600a60006101000a81548160ff0219169083151502179055506101f4600f819055506101f46010819055506127106012819055506002620004ea620006d660201b60201c565b620004f6919062000d4c565b600a62000504919062000bae565b6013819055506200051a620006d660201b60201c565b600a62000528919062000bae565b633b9aca0062000539919062000ceb565b6014819055506200054f620006d660201b60201c565b600a6200055d919062000bae565b633b9aca006200056e919062000ceb565b60158190555062000584620006d660201b60201c565b600a62000592919062000bae565b620186a0620005a2919062000ceb565b601181905550620005e5600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660066200085860201b620015421790919060201c565b50620006013060066200085860201b620015421790919060201c565b5062000ebb565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006009905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000752576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007499062000aa6565b60405180910390fd5b62000766600083836200089060201b60201c565b80600260008282546200077a919062000af6565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620007d1919062000af6565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000838919062000ac8565b60405180910390a362000854600083836200089560201b60201c565b5050565b600062000888836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200089a60201b60201c565b905092915050565b505050565b505050565b6000620008ae83836200091460201b60201c565b620009095782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506200090e565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b828054620009459062000dd2565b90600052602060002090601f016020900481019282620009695760008555620009b5565b82601f106200098457805160ff1916838001178555620009b5565b82800160010185558215620009b5579182015b82811115620009b457825182559160200191906001019062000997565b5b509050620009c49190620009c8565b5090565b5b80821115620009e3576000816000905550600101620009c9565b5090565b600081519050620009f88162000ea1565b92915050565b60006020828403121562000a175762000a1662000e66565b5b600062000a2784828501620009e7565b91505092915050565b62000a3b8162000d87565b82525050565b600062000a50601f8362000ae5565b915062000a5d8262000e78565b602082019050919050565b62000a738162000dbb565b82525050565b600060408201905062000a90600083018562000a30565b62000a9f602083018462000a30565b9392505050565b6000602082019050818103600083015262000ac18162000a41565b9050919050565b600060208201905062000adf600083018462000a68565b92915050565b600082825260208201905092915050565b600062000b038262000dbb565b915062000b108362000dbb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000b485762000b4762000e08565b5b828201905092915050565b6000808291508390505b600185111562000ba55780860481111562000b7d5762000b7c62000e08565b5b600185161562000b8d5780820291505b808102905062000b9d8562000e6b565b945062000b5d565b94509492505050565b600062000bbb8262000dbb565b915062000bc88362000dc5565b925062000bf77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000bff565b905092915050565b60008262000c11576001905062000ce4565b8162000c21576000905062000ce4565b816001811462000c3a576002811462000c455762000c7b565b600191505062000ce4565b60ff84111562000c5a5762000c5962000e08565b5b8360020a91508482111562000c745762000c7362000e08565b5b5062000ce4565b5060208310610133831016604e8410600b841016171562000cb55782820a90508381111562000caf5762000cae62000e08565b5b62000ce4565b62000cc4848484600162000b53565b9250905081840481111562000cde5762000cdd62000e08565b5b81810290505b9392505050565b600062000cf88262000dbb565b915062000d058362000dbb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000d415762000d4062000e08565b5b828202905092915050565b600062000d598262000dc5565b915062000d668362000dc5565b92508282101562000d7c5762000d7b62000e08565b5b828203905092915050565b600062000d948262000d9b565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000600282049050600182168062000deb57607f821691505b6020821081141562000e025762000e0162000e37565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b60008160011c9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b62000eac8162000d87565b811462000eb857600080fd5b50565b613ce58062000ecb6000396000f3fe6080604052600436106102815760003560e01c80638da5cb5b1161014f578063aa2bf676116100c1578063dd62ed3e1161007a578063dd62ed3e146109e1578063e7ae07ec14610a1e578063edafa8b514610a47578063f2fde38b14610a70578063f33d738e14610a99578063f80f5dd514610ac257610288565b8063aa2bf676146108d3578063c49b9a80146108fc578063c683630d14610925578063caff1bfc14610962578063cce987d41461098b578063d2492802146109b657610288565b80639cfe42da116101135780639cfe42da1461079f578063a22d4832146107dc578063a457c2d714610805578063a5f7f99d14610842578063a8b089821461086b578063a9059cbb1461089657610288565b80638da5cb5b146106b857806395d89b41146106e357806396ce07951461070e57806397ecfaab146107395780639c4d8f9f1461077657610288565b80633ca50bd2116101f357806367436b69116101ac57806367436b69146105ba5780636cec0ceb146105e557806370a082311461060e578063715018a61461064b5780637e53897b1461066257806386bbecf71461068d57610288565b80633ca50bd2146104aa5780633d0ed048146104d55780634a74bb0214610512578063575e5c541461053d5780635977043814610566578063648e3c261461058f57610288565b806318160ddd1161024557806318160ddd1461037457806323b872dd1461039f5780632835b45c146103dc578063313ce56714610405578063333e99db14610430578063395093511461046d57610288565b806306fdde031461028d578063095ea7b3146102b85780630e22663b146102f55780630e4ba2e6146103205780631694505e1461034957610288565b3661028857005b600080fd5b34801561029957600080fd5b506102a2610aff565b6040516102af9190613165565b60405180910390f35b3480156102c457600080fd5b506102df60048036038101906102da9190612c44565b610b91565b6040516102ec919061312f565b60405180910390f35b34801561030157600080fd5b5061030a610bb4565b60405161031791906133a7565b60405180910390f35b34801561032c57600080fd5b5061034760048036038101906103429190612b57565b610bba565b005b34801561035557600080fd5b5061035e610c06565b60405161036b919061314a565b60405180910390f35b34801561038057600080fd5b50610389610c2c565b60405161039691906133a7565b60405180910390f35b3480156103ab57600080fd5b506103c660048036038101906103c19190612bf1565b610c36565b6040516103d3919061312f565b60405180910390f35b3480156103e857600080fd5b5061040360048036038101906103fe9190612cde565b610c65565b005b34801561041157600080fd5b5061041a610cb7565b604051610427919061341c565b60405180910390f35b34801561043c57600080fd5b5061045760048036038101906104529190612b57565b610cc0565b604051610464919061312f565b60405180910390f35b34801561047957600080fd5b50610494600480360381019061048f9190612c44565b610cdd565b6040516104a1919061312f565b60405180910390f35b3480156104b657600080fd5b506104bf610d14565b6040516104cc91906133a7565b60405180910390f35b3480156104e157600080fd5b506104fc60048036038101906104f79190612b57565b610d1a565b604051610509919061312f565b60405180910390f35b34801561051e57600080fd5b50610527610db2565b604051610534919061312f565b60405180910390f35b34801561054957600080fd5b50610564600480360381019061055f9190612cde565b610dc5565b005b34801561057257600080fd5b5061058d60048036038101906105889190612b57565b610dd7565b005b34801561059b57600080fd5b506105a4610e9b565b6040516105b191906133a7565b60405180910390f35b3480156105c657600080fd5b506105cf610ea1565b6040516105dc91906130eb565b60405180910390f35b3480156105f157600080fd5b5061060c60048036038101906106079190612cde565b610ec7565b005b34801561061a57600080fd5b5061063560048036038101906106309190612b57565b610ed9565b60405161064291906133a7565b60405180910390f35b34801561065757600080fd5b50610660610f21565b005b34801561066e57600080fd5b50610677610f35565b60405161068491906133a7565b60405180910390f35b34801561069957600080fd5b506106a2610f3b565b6040516106af91906130eb565b60405180910390f35b3480156106c457600080fd5b506106cd610f61565b6040516106da91906130eb565b60405180910390f35b3480156106ef57600080fd5b506106f8610f8b565b6040516107059190613165565b60405180910390f35b34801561071a57600080fd5b5061072361101d565b60405161073091906133a7565b60405180910390f35b34801561074557600080fd5b50610760600480360381019061075b9190612b57565b611023565b60405161076d919061312f565b60405180910390f35b34801561078257600080fd5b5061079d60048036038101906107989190612b57565b6110bb565b005b3480156107ab57600080fd5b506107c660048036038101906107c19190612b57565b611107565b6040516107d3919061312f565b60405180910390f35b3480156107e857600080fd5b5061080360048036038101906107fe9190612b57565b61119f565b005b34801561081157600080fd5b5061082c60048036038101906108279190612c44565b6111eb565b604051610839919061312f565b60405180910390f35b34801561084e57600080fd5b5061086960048036038101906108649190612cde565b611262565b005b34801561087757600080fd5b50610880611274565b60405161088d91906130eb565b60405180910390f35b3480156108a257600080fd5b506108bd60048036038101906108b89190612c44565b61129a565b6040516108ca919061312f565b60405180910390f35b3480156108df57600080fd5b506108fa60048036038101906108f59190612cde565b6112bd565b005b34801561090857600080fd5b50610923600480360381019061091e9190612c84565b6112cf565b005b34801561093157600080fd5b5061094c60048036038101906109479190612b57565b6112f4565b604051610959919061312f565b60405180910390f35b34801561096e57600080fd5b5061098960048036038101906109849190612cde565b611311565b005b34801561099757600080fd5b506109a0611323565b6040516109ad91906133a7565b60405180910390f35b3480156109c257600080fd5b506109cb611329565b6040516109d891906133a7565b60405180910390f35b3480156109ed57600080fd5b50610a086004803603810190610a039190612bb1565b61132f565b604051610a1591906133a7565b60405180910390f35b348015610a2a57600080fd5b50610a456004803603810190610a409190612b57565b6113b6565b005b348015610a5357600080fd5b50610a6e6004803603810190610a699190612cde565b611402565b005b348015610a7c57600080fd5b50610a976004803603810190610a929190612b57565b611414565b005b348015610aa557600080fd5b50610ac06004803603810190610abb9190612cde565b611498565b005b348015610ace57600080fd5b50610ae96004803603810190610ae49190612b57565b6114aa565b604051610af6919061312f565b60405180910390f35b606060038054610b0e90613687565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3a90613687565b8015610b875780601f10610b5c57610100808354040283529160200191610b87565b820191906000526020600020905b815481529060010190602001808311610b6a57829003601f168201915b5050505050905090565b600080610b9c611572565b9050610ba981858561157a565b600191505092915050565b60135481565b610bc2611745565b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600254905090565b600080610c41611572565b9050610c4e8582856117c3565b610c5985858561184f565b60019150509392505050565b610c6d611745565b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610cb3573d6000803e3d6000fd5b5050565b60006009905090565b6000610cd682600861229490919063ffffffff16565b9050919050565b600080610ce8611572565b9050610d09818585610cfa858961132f565b610d0491906134a2565b61157a565b600191505092915050565b60145481565b6000610d24611745565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8b906131e7565b60405180910390fd5b610da88260086122c490919063ffffffff16565b5060019050919050565b600a60009054906101000a900460ff1681565b610dcd611745565b8060138190555050565b610ddf611745565b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e1a91906130eb565b60206040518083038186803b158015610e3257600080fd5b505afa158015610e46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6a9190612d0b565b9050610e9733828473ffffffffffffffffffffffffffffffffffffffff166122f49092919063ffffffff16565b5050565b60155481565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610ecf611745565b8060128190555050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f29611745565b610f33600061237a565b565b60105481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610f9a90613687565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc690613687565b80156110135780601f10610fe857610100808354040283529160200191611013565b820191906000526020600020905b815481529060010190602001808311610ff657829003601f168201915b5050505050905090565b60125481565b600061102d611745565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561109d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611094906131e7565b60405180910390fd5b6110b18260066122c490919063ffffffff16565b5060019050919050565b6110c3611745565b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611111611745565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611181576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611178906131e7565b60405180910390fd5b61119582600861154290919063ffffffff16565b5060019050919050565b6111a7611745565b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806111f6611572565b90506000611204828661132f565b905083811015611249576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124090613387565b60405180910390fd5b611256828686840361157a565b60019250505092915050565b61126a611745565b8060118190555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806112a5611572565b90506112b281858561184f565b600191505092915050565b6112c5611745565b8060158190555050565b6112d7611745565b80600a60006101000a81548160ff02191690831515021790555050565b600061130a82600661229490919063ffffffff16565b9050919050565b611319611745565b80600f8190555050565b60115481565b600f5481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6113be611745565b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61140a611745565b8060108190555050565b61141c611745565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561148c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611483906131a7565b60405180910390fd5b6114958161237a565b50565b6114a0611745565b8060148190555050565b60006114b4611745565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611524576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151b906131e7565b60405180910390fd5b61153882600661154290919063ffffffff16565b5060019050919050565b600061156a836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612440565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156115ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e190613327565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561165a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611651906131c7565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161173891906133a7565b60405180910390a3505050565b61174d611572565b73ffffffffffffffffffffffffffffffffffffffff1661176b610f61565b73ffffffffffffffffffffffffffffffffffffffff16146117c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b8906132e7565b60405180910390fd5b565b60006117cf848461132f565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611849578181101561183b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183290613247565b60405180910390fd5b611848848484840361157a565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156118bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b690613307565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561192f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192690613187565b60405180910390fd5b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905061197b846112f4565b611a03576013546000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f990613207565b60405180910390fd5b5b611a0c84610cc0565b15611aa257600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611aa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a98906132c7565b60405180910390fd5b5b601454821115611b0557611ab5846112f4565b80611ac55750611ac4836112f4565b5b611b04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afb90613227565b60405180910390fd5b5b60155482611b1285610ed9565b611b1c91906134a2565b1115611bc357611b2b836112f4565b80611b835750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b611bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb990613287565b60405180910390fd5b5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460135483611c1091906134a2565b118015611c4957503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b15611c9d576013546000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c9a9190613583565b91505b81811015611ce0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd790613267565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614158015611dd25750600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b8015611e0a57503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b8015611e225750600a60009054906101000a900460ff165b8015611e5857506000611e56600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610ed9565b115b8015611e6c57506000611e6a30610ed9565b115b156120085760006011546000803073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611efe576000803073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611f02565b6011545b9050611f0d816124b0565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc601054600f54611f5991906134a2565b600f5447611f679190613529565b611f7191906134f8565b9081150290604051600060405180830381858888f19350505050158015611f9c573d6000803e3d6000fd5b50600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015612005573d6000803e3d6000fd5b50505b612011836112f4565b806120215750612020846112f4565b5b156120e557816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461207491906134a2565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516120d891906133a7565b60405180910390a361228e565b600061210083601054600f546120fb91906134a2565b612702565b9050806000803073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461215091906134a2565b9250508190555080836121639190613583565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121b091906134a2565b925050819055503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161221491906133a7565b60405180910390a38373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83866122779190613583565b60405161228491906133a7565b60405180910390a3505b50505050565b60006122bc836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612725565b905092915050565b60006122ec836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612748565b905092915050565b6123758363a9059cbb60e01b8484604051602401612313929190613106565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061285c565b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061244c8383612725565b6124a55782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506124aa565b600090505b92915050565b6000600267ffffffffffffffff8111156124cd576124cc6137a4565b5b6040519080825280602002602001820160405280156124fb5781602001602082028036833780820191505090505b509050308160008151811061251357612512613775565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156125b557600080fd5b505afa1580156125c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ed9190612b84565b8160018151811061260157612600613775565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061266830600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff168461157a565b600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016126cc9594939291906133c2565b600060405180830381600087803b1580156126e657600080fd5b505af11580156126fa573d6000803e3d6000fd5b505050505050565b600060125482846127139190613529565b61271d91906134f8565b905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b6000808360010160008481526020019081526020016000205490506000811461285057600060018261277a9190613583565b90506000600186600001805490506127929190613583565b90508181146128015760008660000182815481106127b3576127b2613775565b5b90600052602060002001549050808760000184815481106127d7576127d6613775565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061281557612814613746565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612856565b60009150505b92915050565b60006128be826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166129239092919063ffffffff16565b905060008151111561291e57808060200190518101906128de9190612cb1565b61291d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291490613367565b60405180910390fd5b5b505050565b6060612932848460008561293b565b90509392505050565b606082471015612980576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612977906132a7565b60405180910390fd5b61298985612a4f565b6129c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129bf90613347565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516129f191906130d4565b60006040518083038185875af1925050503d8060008114612a2e576040519150601f19603f3d011682016040523d82523d6000602084013e612a33565b606091505b5091509150612a43828286612a72565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60608315612a8257829050612ad2565b600083511115612a955782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac99190613165565b60405180910390fd5b9392505050565b600081359050612ae881613c6a565b92915050565b600081519050612afd81613c6a565b92915050565b600081359050612b1281613c81565b92915050565b600081519050612b2781613c81565b92915050565b600081359050612b3c81613c98565b92915050565b600081519050612b5181613c98565b92915050565b600060208284031215612b6d57612b6c6137d3565b5b6000612b7b84828501612ad9565b91505092915050565b600060208284031215612b9a57612b996137d3565b5b6000612ba884828501612aee565b91505092915050565b60008060408385031215612bc857612bc76137d3565b5b6000612bd685828601612ad9565b9250506020612be785828601612ad9565b9150509250929050565b600080600060608486031215612c0a57612c096137d3565b5b6000612c1886828701612ad9565b9350506020612c2986828701612ad9565b9250506040612c3a86828701612b2d565b9150509250925092565b60008060408385031215612c5b57612c5a6137d3565b5b6000612c6985828601612ad9565b9250506020612c7a85828601612b2d565b9150509250929050565b600060208284031215612c9a57612c996137d3565b5b6000612ca884828501612b03565b91505092915050565b600060208284031215612cc757612cc66137d3565b5b6000612cd584828501612b18565b91505092915050565b600060208284031215612cf457612cf36137d3565b5b6000612d0284828501612b2d565b91505092915050565b600060208284031215612d2157612d206137d3565b5b6000612d2f84828501612b42565b91505092915050565b6000612d448383612d50565b60208301905092915050565b612d59816135b7565b82525050565b612d68816135b7565b82525050565b6000612d7982613447565b612d838185613475565b9350612d8e83613437565b8060005b83811015612dbf578151612da68882612d38565b9750612db183613468565b925050600181019050612d92565b5085935050505092915050565b612dd5816135c9565b82525050565b6000612de682613452565b612df08185613486565b9350612e00818560208601613654565b80840191505092915050565b612e158161360c565b82525050565b612e248161361e565b82525050565b6000612e358261345d565b612e3f8185613491565b9350612e4f818560208601613654565b612e58816137d8565b840191505092915050565b6000612e70602383613491565b9150612e7b826137e9565b604082019050919050565b6000612e93602683613491565b9150612e9e82613838565b604082019050919050565b6000612eb6602283613491565b9150612ec182613887565b604082019050919050565b6000612ed9602283613491565b9150612ee4826138d6565b604082019050919050565b6000612efc602083613491565b9150612f0782613925565b602082019050919050565b6000612f1f602a83613491565b9150612f2a8261394e565b604082019050919050565b6000612f42601d83613491565b9150612f4d8261399d565b602082019050919050565b6000612f65602683613491565b9150612f70826139c6565b604082019050919050565b6000612f88602083613491565b9150612f9382613a15565b602082019050919050565b6000612fab602683613491565b9150612fb682613a3e565b604082019050919050565b6000612fce602483613491565b9150612fd982613a8d565b604082019050919050565b6000612ff1602083613491565b9150612ffc82613adc565b602082019050919050565b6000613014602583613491565b915061301f82613b05565b604082019050919050565b6000613037602483613491565b915061304282613b54565b604082019050919050565b600061305a601d83613491565b915061306582613ba3565b602082019050919050565b600061307d602a83613491565b915061308882613bcc565b604082019050919050565b60006130a0602583613491565b91506130ab82613c1b565b604082019050919050565b6130bf816135f5565b82525050565b6130ce816135ff565b82525050565b60006130e08284612ddb565b915081905092915050565b60006020820190506131006000830184612d5f565b92915050565b600060408201905061311b6000830185612d5f565b61312860208301846130b6565b9392505050565b60006020820190506131446000830184612dcc565b92915050565b600060208201905061315f6000830184612e0c565b92915050565b6000602082019050818103600083015261317f8184612e2a565b905092915050565b600060208201905081810360008301526131a081612e63565b9050919050565b600060208201905081810360008301526131c081612e86565b9050919050565b600060208201905081810360008301526131e081612ea9565b9050919050565b6000602082019050818103600083015261320081612ecc565b9050919050565b6000602082019050818103600083015261322081612eef565b9050919050565b6000602082019050818103600083015261324081612f12565b9050919050565b6000602082019050818103600083015261326081612f35565b9050919050565b6000602082019050818103600083015261328081612f58565b9050919050565b600060208201905081810360008301526132a081612f7b565b9050919050565b600060208201905081810360008301526132c081612f9e565b9050919050565b600060208201905081810360008301526132e081612fc1565b9050919050565b6000602082019050818103600083015261330081612fe4565b9050919050565b6000602082019050818103600083015261332081613007565b9050919050565b600060208201905081810360008301526133408161302a565b9050919050565b600060208201905081810360008301526133608161304d565b9050919050565b6000602082019050818103600083015261338081613070565b9050919050565b600060208201905081810360008301526133a081613093565b9050919050565b60006020820190506133bc60008301846130b6565b92915050565b600060a0820190506133d760008301886130b6565b6133e46020830187612e1b565b81810360408301526133f68186612d6e565b90506134056060830185612d5f565b61341260808301846130b6565b9695505050505050565b600060208201905061343160008301846130c5565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b60006134ad826135f5565b91506134b8836135f5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156134ed576134ec6136b9565b5b828201905092915050565b6000613503826135f5565b915061350e836135f5565b92508261351e5761351d6136e8565b5b828204905092915050565b6000613534826135f5565b915061353f836135f5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613578576135776136b9565b5b828202905092915050565b600061358e826135f5565b9150613599836135f5565b9250828210156135ac576135ab6136b9565b5b828203905092915050565b60006135c2826135d5565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061361782613630565b9050919050565b6000613629826135f5565b9050919050565b600061363b82613642565b9050919050565b600061364d826135d5565b9050919050565b60005b83811015613672578082015181840152602081019050613657565b83811115613681576000848401525b50505050565b6000600282049050600182168061369f57607f821691505b602082108114156136b3576136b2613717565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f746f6b656e3a206163636f756e7420697320746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a2062616c616e6365206973206c657373207468616e20302e3031600082015250565b7f45524332303a204578636565647320746865206d6178696d756d2073696e676c60008201527f65207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a204578636565646564206d6178696d756d20686f6c64696e6773600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20626c61636b2075736572206a7573742073656e7420746f206160008201527f646d696e00000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b613c73816135b7565b8114613c7e57600080fd5b50565b613c8a816135c9565b8114613c9557600080fd5b50565b613ca1816135f5565b8114613cac57600080fd5b5056fea26469706673582212200862011eed8226572aba36e6337b3316461cbcc8922d8a78476582341a8ed6ec64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102815760003560e01c80638da5cb5b1161014f578063aa2bf676116100c1578063dd62ed3e1161007a578063dd62ed3e146109e1578063e7ae07ec14610a1e578063edafa8b514610a47578063f2fde38b14610a70578063f33d738e14610a99578063f80f5dd514610ac257610288565b8063aa2bf676146108d3578063c49b9a80146108fc578063c683630d14610925578063caff1bfc14610962578063cce987d41461098b578063d2492802146109b657610288565b80639cfe42da116101135780639cfe42da1461079f578063a22d4832146107dc578063a457c2d714610805578063a5f7f99d14610842578063a8b089821461086b578063a9059cbb1461089657610288565b80638da5cb5b146106b857806395d89b41146106e357806396ce07951461070e57806397ecfaab146107395780639c4d8f9f1461077657610288565b80633ca50bd2116101f357806367436b69116101ac57806367436b69146105ba5780636cec0ceb146105e557806370a082311461060e578063715018a61461064b5780637e53897b1461066257806386bbecf71461068d57610288565b80633ca50bd2146104aa5780633d0ed048146104d55780634a74bb0214610512578063575e5c541461053d5780635977043814610566578063648e3c261461058f57610288565b806318160ddd1161024557806318160ddd1461037457806323b872dd1461039f5780632835b45c146103dc578063313ce56714610405578063333e99db14610430578063395093511461046d57610288565b806306fdde031461028d578063095ea7b3146102b85780630e22663b146102f55780630e4ba2e6146103205780631694505e1461034957610288565b3661028857005b600080fd5b34801561029957600080fd5b506102a2610aff565b6040516102af9190613165565b60405180910390f35b3480156102c457600080fd5b506102df60048036038101906102da9190612c44565b610b91565b6040516102ec919061312f565b60405180910390f35b34801561030157600080fd5b5061030a610bb4565b60405161031791906133a7565b60405180910390f35b34801561032c57600080fd5b5061034760048036038101906103429190612b57565b610bba565b005b34801561035557600080fd5b5061035e610c06565b60405161036b919061314a565b60405180910390f35b34801561038057600080fd5b50610389610c2c565b60405161039691906133a7565b60405180910390f35b3480156103ab57600080fd5b506103c660048036038101906103c19190612bf1565b610c36565b6040516103d3919061312f565b60405180910390f35b3480156103e857600080fd5b5061040360048036038101906103fe9190612cde565b610c65565b005b34801561041157600080fd5b5061041a610cb7565b604051610427919061341c565b60405180910390f35b34801561043c57600080fd5b5061045760048036038101906104529190612b57565b610cc0565b604051610464919061312f565b60405180910390f35b34801561047957600080fd5b50610494600480360381019061048f9190612c44565b610cdd565b6040516104a1919061312f565b60405180910390f35b3480156104b657600080fd5b506104bf610d14565b6040516104cc91906133a7565b60405180910390f35b3480156104e157600080fd5b506104fc60048036038101906104f79190612b57565b610d1a565b604051610509919061312f565b60405180910390f35b34801561051e57600080fd5b50610527610db2565b604051610534919061312f565b60405180910390f35b34801561054957600080fd5b50610564600480360381019061055f9190612cde565b610dc5565b005b34801561057257600080fd5b5061058d60048036038101906105889190612b57565b610dd7565b005b34801561059b57600080fd5b506105a4610e9b565b6040516105b191906133a7565b60405180910390f35b3480156105c657600080fd5b506105cf610ea1565b6040516105dc91906130eb565b60405180910390f35b3480156105f157600080fd5b5061060c60048036038101906106079190612cde565b610ec7565b005b34801561061a57600080fd5b5061063560048036038101906106309190612b57565b610ed9565b60405161064291906133a7565b60405180910390f35b34801561065757600080fd5b50610660610f21565b005b34801561066e57600080fd5b50610677610f35565b60405161068491906133a7565b60405180910390f35b34801561069957600080fd5b506106a2610f3b565b6040516106af91906130eb565b60405180910390f35b3480156106c457600080fd5b506106cd610f61565b6040516106da91906130eb565b60405180910390f35b3480156106ef57600080fd5b506106f8610f8b565b6040516107059190613165565b60405180910390f35b34801561071a57600080fd5b5061072361101d565b60405161073091906133a7565b60405180910390f35b34801561074557600080fd5b50610760600480360381019061075b9190612b57565b611023565b60405161076d919061312f565b60405180910390f35b34801561078257600080fd5b5061079d60048036038101906107989190612b57565b6110bb565b005b3480156107ab57600080fd5b506107c660048036038101906107c19190612b57565b611107565b6040516107d3919061312f565b60405180910390f35b3480156107e857600080fd5b5061080360048036038101906107fe9190612b57565b61119f565b005b34801561081157600080fd5b5061082c60048036038101906108279190612c44565b6111eb565b604051610839919061312f565b60405180910390f35b34801561084e57600080fd5b5061086960048036038101906108649190612cde565b611262565b005b34801561087757600080fd5b50610880611274565b60405161088d91906130eb565b60405180910390f35b3480156108a257600080fd5b506108bd60048036038101906108b89190612c44565b61129a565b6040516108ca919061312f565b60405180910390f35b3480156108df57600080fd5b506108fa60048036038101906108f59190612cde565b6112bd565b005b34801561090857600080fd5b50610923600480360381019061091e9190612c84565b6112cf565b005b34801561093157600080fd5b5061094c60048036038101906109479190612b57565b6112f4565b604051610959919061312f565b60405180910390f35b34801561096e57600080fd5b5061098960048036038101906109849190612cde565b611311565b005b34801561099757600080fd5b506109a0611323565b6040516109ad91906133a7565b60405180910390f35b3480156109c257600080fd5b506109cb611329565b6040516109d891906133a7565b60405180910390f35b3480156109ed57600080fd5b50610a086004803603810190610a039190612bb1565b61132f565b604051610a1591906133a7565b60405180910390f35b348015610a2a57600080fd5b50610a456004803603810190610a409190612b57565b6113b6565b005b348015610a5357600080fd5b50610a6e6004803603810190610a699190612cde565b611402565b005b348015610a7c57600080fd5b50610a976004803603810190610a929190612b57565b611414565b005b348015610aa557600080fd5b50610ac06004803603810190610abb9190612cde565b611498565b005b348015610ace57600080fd5b50610ae96004803603810190610ae49190612b57565b6114aa565b604051610af6919061312f565b60405180910390f35b606060038054610b0e90613687565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3a90613687565b8015610b875780601f10610b5c57610100808354040283529160200191610b87565b820191906000526020600020905b815481529060010190602001808311610b6a57829003601f168201915b5050505050905090565b600080610b9c611572565b9050610ba981858561157a565b600191505092915050565b60135481565b610bc2611745565b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600254905090565b600080610c41611572565b9050610c4e8582856117c3565b610c5985858561184f565b60019150509392505050565b610c6d611745565b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610cb3573d6000803e3d6000fd5b5050565b60006009905090565b6000610cd682600861229490919063ffffffff16565b9050919050565b600080610ce8611572565b9050610d09818585610cfa858961132f565b610d0491906134a2565b61157a565b600191505092915050565b60145481565b6000610d24611745565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8b906131e7565b60405180910390fd5b610da88260086122c490919063ffffffff16565b5060019050919050565b600a60009054906101000a900460ff1681565b610dcd611745565b8060138190555050565b610ddf611745565b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e1a91906130eb565b60206040518083038186803b158015610e3257600080fd5b505afa158015610e46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6a9190612d0b565b9050610e9733828473ffffffffffffffffffffffffffffffffffffffff166122f49092919063ffffffff16565b5050565b60155481565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610ecf611745565b8060128190555050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f29611745565b610f33600061237a565b565b60105481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610f9a90613687565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc690613687565b80156110135780601f10610fe857610100808354040283529160200191611013565b820191906000526020600020905b815481529060010190602001808311610ff657829003601f168201915b5050505050905090565b60125481565b600061102d611745565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561109d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611094906131e7565b60405180910390fd5b6110b18260066122c490919063ffffffff16565b5060019050919050565b6110c3611745565b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611111611745565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611181576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611178906131e7565b60405180910390fd5b61119582600861154290919063ffffffff16565b5060019050919050565b6111a7611745565b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806111f6611572565b90506000611204828661132f565b905083811015611249576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124090613387565b60405180910390fd5b611256828686840361157a565b60019250505092915050565b61126a611745565b8060118190555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806112a5611572565b90506112b281858561184f565b600191505092915050565b6112c5611745565b8060158190555050565b6112d7611745565b80600a60006101000a81548160ff02191690831515021790555050565b600061130a82600661229490919063ffffffff16565b9050919050565b611319611745565b80600f8190555050565b60115481565b600f5481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6113be611745565b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61140a611745565b8060108190555050565b61141c611745565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561148c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611483906131a7565b60405180910390fd5b6114958161237a565b50565b6114a0611745565b8060148190555050565b60006114b4611745565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611524576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151b906131e7565b60405180910390fd5b61153882600661154290919063ffffffff16565b5060019050919050565b600061156a836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612440565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156115ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e190613327565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561165a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611651906131c7565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161173891906133a7565b60405180910390a3505050565b61174d611572565b73ffffffffffffffffffffffffffffffffffffffff1661176b610f61565b73ffffffffffffffffffffffffffffffffffffffff16146117c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b8906132e7565b60405180910390fd5b565b60006117cf848461132f565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611849578181101561183b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183290613247565b60405180910390fd5b611848848484840361157a565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156118bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b690613307565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561192f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192690613187565b60405180910390fd5b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905061197b846112f4565b611a03576013546000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f990613207565b60405180910390fd5b5b611a0c84610cc0565b15611aa257600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611aa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a98906132c7565b60405180910390fd5b5b601454821115611b0557611ab5846112f4565b80611ac55750611ac4836112f4565b5b611b04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afb90613227565b60405180910390fd5b5b60155482611b1285610ed9565b611b1c91906134a2565b1115611bc357611b2b836112f4565b80611b835750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b611bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb990613287565b60405180910390fd5b5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460135483611c1091906134a2565b118015611c4957503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b15611c9d576013546000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c9a9190613583565b91505b81811015611ce0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd790613267565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614158015611dd25750600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b8015611e0a57503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b8015611e225750600a60009054906101000a900460ff165b8015611e5857506000611e56600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610ed9565b115b8015611e6c57506000611e6a30610ed9565b115b156120085760006011546000803073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611efe576000803073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611f02565b6011545b9050611f0d816124b0565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc601054600f54611f5991906134a2565b600f5447611f679190613529565b611f7191906134f8565b9081150290604051600060405180830381858888f19350505050158015611f9c573d6000803e3d6000fd5b50600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015612005573d6000803e3d6000fd5b50505b612011836112f4565b806120215750612020846112f4565b5b156120e557816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461207491906134a2565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516120d891906133a7565b60405180910390a361228e565b600061210083601054600f546120fb91906134a2565b612702565b9050806000803073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461215091906134a2565b9250508190555080836121639190613583565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121b091906134a2565b925050819055503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161221491906133a7565b60405180910390a38373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83866122779190613583565b60405161228491906133a7565b60405180910390a3505b50505050565b60006122bc836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612725565b905092915050565b60006122ec836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612748565b905092915050565b6123758363a9059cbb60e01b8484604051602401612313929190613106565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061285c565b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061244c8383612725565b6124a55782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506124aa565b600090505b92915050565b6000600267ffffffffffffffff8111156124cd576124cc6137a4565b5b6040519080825280602002602001820160405280156124fb5781602001602082028036833780820191505090505b509050308160008151811061251357612512613775565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156125b557600080fd5b505afa1580156125c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ed9190612b84565b8160018151811061260157612600613775565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061266830600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff168461157a565b600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016126cc9594939291906133c2565b600060405180830381600087803b1580156126e657600080fd5b505af11580156126fa573d6000803e3d6000fd5b505050505050565b600060125482846127139190613529565b61271d91906134f8565b905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b6000808360010160008481526020019081526020016000205490506000811461285057600060018261277a9190613583565b90506000600186600001805490506127929190613583565b90508181146128015760008660000182815481106127b3576127b2613775565b5b90600052602060002001549050808760000184815481106127d7576127d6613775565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061281557612814613746565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612856565b60009150505b92915050565b60006128be826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166129239092919063ffffffff16565b905060008151111561291e57808060200190518101906128de9190612cb1565b61291d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291490613367565b60405180910390fd5b5b505050565b6060612932848460008561293b565b90509392505050565b606082471015612980576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612977906132a7565b60405180910390fd5b61298985612a4f565b6129c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129bf90613347565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516129f191906130d4565b60006040518083038185875af1925050503d8060008114612a2e576040519150601f19603f3d011682016040523d82523d6000602084013e612a33565b606091505b5091509150612a43828286612a72565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60608315612a8257829050612ad2565b600083511115612a955782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac99190613165565b60405180910390fd5b9392505050565b600081359050612ae881613c6a565b92915050565b600081519050612afd81613c6a565b92915050565b600081359050612b1281613c81565b92915050565b600081519050612b2781613c81565b92915050565b600081359050612b3c81613c98565b92915050565b600081519050612b5181613c98565b92915050565b600060208284031215612b6d57612b6c6137d3565b5b6000612b7b84828501612ad9565b91505092915050565b600060208284031215612b9a57612b996137d3565b5b6000612ba884828501612aee565b91505092915050565b60008060408385031215612bc857612bc76137d3565b5b6000612bd685828601612ad9565b9250506020612be785828601612ad9565b9150509250929050565b600080600060608486031215612c0a57612c096137d3565b5b6000612c1886828701612ad9565b9350506020612c2986828701612ad9565b9250506040612c3a86828701612b2d565b9150509250925092565b60008060408385031215612c5b57612c5a6137d3565b5b6000612c6985828601612ad9565b9250506020612c7a85828601612b2d565b9150509250929050565b600060208284031215612c9a57612c996137d3565b5b6000612ca884828501612b03565b91505092915050565b600060208284031215612cc757612cc66137d3565b5b6000612cd584828501612b18565b91505092915050565b600060208284031215612cf457612cf36137d3565b5b6000612d0284828501612b2d565b91505092915050565b600060208284031215612d2157612d206137d3565b5b6000612d2f84828501612b42565b91505092915050565b6000612d448383612d50565b60208301905092915050565b612d59816135b7565b82525050565b612d68816135b7565b82525050565b6000612d7982613447565b612d838185613475565b9350612d8e83613437565b8060005b83811015612dbf578151612da68882612d38565b9750612db183613468565b925050600181019050612d92565b5085935050505092915050565b612dd5816135c9565b82525050565b6000612de682613452565b612df08185613486565b9350612e00818560208601613654565b80840191505092915050565b612e158161360c565b82525050565b612e248161361e565b82525050565b6000612e358261345d565b612e3f8185613491565b9350612e4f818560208601613654565b612e58816137d8565b840191505092915050565b6000612e70602383613491565b9150612e7b826137e9565b604082019050919050565b6000612e93602683613491565b9150612e9e82613838565b604082019050919050565b6000612eb6602283613491565b9150612ec182613887565b604082019050919050565b6000612ed9602283613491565b9150612ee4826138d6565b604082019050919050565b6000612efc602083613491565b9150612f0782613925565b602082019050919050565b6000612f1f602a83613491565b9150612f2a8261394e565b604082019050919050565b6000612f42601d83613491565b9150612f4d8261399d565b602082019050919050565b6000612f65602683613491565b9150612f70826139c6565b604082019050919050565b6000612f88602083613491565b9150612f9382613a15565b602082019050919050565b6000612fab602683613491565b9150612fb682613a3e565b604082019050919050565b6000612fce602483613491565b9150612fd982613a8d565b604082019050919050565b6000612ff1602083613491565b9150612ffc82613adc565b602082019050919050565b6000613014602583613491565b915061301f82613b05565b604082019050919050565b6000613037602483613491565b915061304282613b54565b604082019050919050565b600061305a601d83613491565b915061306582613ba3565b602082019050919050565b600061307d602a83613491565b915061308882613bcc565b604082019050919050565b60006130a0602583613491565b91506130ab82613c1b565b604082019050919050565b6130bf816135f5565b82525050565b6130ce816135ff565b82525050565b60006130e08284612ddb565b915081905092915050565b60006020820190506131006000830184612d5f565b92915050565b600060408201905061311b6000830185612d5f565b61312860208301846130b6565b9392505050565b60006020820190506131446000830184612dcc565b92915050565b600060208201905061315f6000830184612e0c565b92915050565b6000602082019050818103600083015261317f8184612e2a565b905092915050565b600060208201905081810360008301526131a081612e63565b9050919050565b600060208201905081810360008301526131c081612e86565b9050919050565b600060208201905081810360008301526131e081612ea9565b9050919050565b6000602082019050818103600083015261320081612ecc565b9050919050565b6000602082019050818103600083015261322081612eef565b9050919050565b6000602082019050818103600083015261324081612f12565b9050919050565b6000602082019050818103600083015261326081612f35565b9050919050565b6000602082019050818103600083015261328081612f58565b9050919050565b600060208201905081810360008301526132a081612f7b565b9050919050565b600060208201905081810360008301526132c081612f9e565b9050919050565b600060208201905081810360008301526132e081612fc1565b9050919050565b6000602082019050818103600083015261330081612fe4565b9050919050565b6000602082019050818103600083015261332081613007565b9050919050565b600060208201905081810360008301526133408161302a565b9050919050565b600060208201905081810360008301526133608161304d565b9050919050565b6000602082019050818103600083015261338081613070565b9050919050565b600060208201905081810360008301526133a081613093565b9050919050565b60006020820190506133bc60008301846130b6565b92915050565b600060a0820190506133d760008301886130b6565b6133e46020830187612e1b565b81810360408301526133f68186612d6e565b90506134056060830185612d5f565b61341260808301846130b6565b9695505050505050565b600060208201905061343160008301846130c5565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b60006134ad826135f5565b91506134b8836135f5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156134ed576134ec6136b9565b5b828201905092915050565b6000613503826135f5565b915061350e836135f5565b92508261351e5761351d6136e8565b5b828204905092915050565b6000613534826135f5565b915061353f836135f5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613578576135776136b9565b5b828202905092915050565b600061358e826135f5565b9150613599836135f5565b9250828210156135ac576135ab6136b9565b5b828203905092915050565b60006135c2826135d5565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061361782613630565b9050919050565b6000613629826135f5565b9050919050565b600061363b82613642565b9050919050565b600061364d826135d5565b9050919050565b60005b83811015613672578082015181840152602081019050613657565b83811115613681576000848401525b50505050565b6000600282049050600182168061369f57607f821691505b602082108114156136b3576136b2613717565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f746f6b656e3a206163636f756e7420697320746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a2062616c616e6365206973206c657373207468616e20302e3031600082015250565b7f45524332303a204578636565647320746865206d6178696d756d2073696e676c60008201527f65207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a204578636565646564206d6178696d756d20686f6c64696e6773600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20626c61636b2075736572206a7573742073656e7420746f206160008201527f646d696e00000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b613c73816135b7565b8114613c7e57600080fd5b50565b613c8a816135c9565b8114613c9557600080fd5b50565b613ca1816135f5565b8114613cac57600080fd5b5056fea26469706673582212200862011eed8226572aba36e6337b3316461cbcc8922d8a78476582341a8ed6ec64736f6c63430008070033

Deployed Bytecode Sourcemap

49375:8140:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9481:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11831:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49995:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51829:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49651:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10600:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12612:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57367:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10443:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57044:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13316:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50029:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52783:219;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49609:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51157:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57171:188;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50058:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49811:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53511:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10771:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2883:103;;;;;;;;;;;;;:::i;:::-;;49886:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49773:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2235:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9700:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49960:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52332:219;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51531:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52559:216;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51990:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14057:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53385:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49701:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11104:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51409:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53260:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56919:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53010:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49923:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49851;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11360:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51691:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53136:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3141:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51295:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52108:216;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9481:100;9535:13;9568:5;9561:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9481:100;:::o;11831:201::-;11914:4;11931:13;11947:12;:10;:12::i;:::-;11931:28;;11970:32;11979:5;11986:7;11995:6;11970:8;:32::i;:::-;12020:4;12013:11;;;11831:201;;;;:::o;49995:27::-;;;;:::o;51829:153::-;2121:13;:11;:13::i;:::-;51957:17:::1;51938:16;;:36;;;;;;;;;;;;;;;;;;51829:153:::0;:::o;49651:41::-;;;;;;;;;;;;;:::o;10600:108::-;10661:7;10688:12;;10681:19;;10600:108;:::o;12612:295::-;12743:4;12760:15;12778:12;:10;:12::i;:::-;12760:30;;12801:38;12817:4;12823:7;12832:6;12801:15;:38::i;:::-;12850:27;12860:4;12866:2;12870:6;12850:9;:27::i;:::-;12895:4;12888:11;;;12612:295;;;;;:::o;57367:108::-;2121:13;:11;:13::i;:::-;57438:10:::1;57430:28;;:37;57459:7;57430:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;57367:108:::0;:::o;10443:92::-;10501:5;10526:1;10519:8;;10443:92;:::o;57044:119::-;57103:4;57127:28;57147:7;57127:10;:19;;:28;;;;:::i;:::-;57120:35;;57044:119;;;:::o;13316:238::-;13404:4;13421:13;13437:12;:10;:12::i;:::-;13421:28;;13460:64;13469:5;13476:7;13513:10;13485:25;13495:5;13502:7;13485:9;:25::i;:::-;:38;;;;:::i;:::-;13460:8;:64::i;:::-;13542:4;13535:11;;;13316:238;;;;:::o;50029:22::-;;;;:::o;52783:219::-;52850:4;2121:13;:11;:13::i;:::-;52894:1:::1;52875:21;;:7;:21;;;;52867:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52946:26;52964:7;52946:10;:17;;:26;;;;:::i;:::-;;52990:4;52983:11;;52783:219:::0;;;:::o;49609:33::-;;;;;;;;;;;;;:::o;51157:129::-;2121:13;:11;:13::i;:::-;51261::::1;51246:12;:28;;;;51157:129:::0;:::o;57171:188::-;2121:13;:11;:13::i;:::-;57235:15:::1;57260:6;57253:24;;;57286:4;57253:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57235:57;;57303:48;57331:10;57343:7;57310:6;57303:27;;;;:48;;;;;:::i;:::-;57224:135;57171:188:::0;:::o;50058:23::-;;;;:::o;49811:31::-;;;;;;;;;;;;;:::o;53511:110::-;2121:13;:11;:13::i;:::-;53601:12:::1;53587:11;:26;;;;53511:110:::0;:::o;10771:127::-;10845:7;10872:9;:18;10882:7;10872:18;;;;;;;;;;;;;;;;10865:25;;10771:127;;;:::o;2883:103::-;2121:13;:11;:13::i;:::-;2948:30:::1;2975:1;2948:18;:30::i;:::-;2883:103::o:0;49886:28::-;;;;:::o;49773:31::-;;;;;;;;;;;;;:::o;2235:87::-;2281:7;2308:6;;;;;;;;;;;2301:13;;2235:87;:::o;9700:104::-;9756:13;9789:7;9782:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9700:104;:::o;49960:26::-;;;;:::o;52332:219::-;52399:4;2121:13;:11;:13::i;:::-;52443:1:::1;52424:21;;:7;:21;;;;52416:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52495:26;52513:7;52495:10;:17;;:26;;;;:::i;:::-;;52539:4;52532:11;;52332:219:::0;;;:::o;51531:152::-;2121:13;:11;:13::i;:::-;51660:15:::1;51643:14;;:32;;;;;;;;;;;;;;;;;;51531:152:::0;:::o;52559:216::-;52626:4;2121:13;:11;:13::i;:::-;52670:1:::1;52651:21;;:7;:21;;;;52643:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52722:23;52737:7;52722:10;:14;;:23;;;;:::i;:::-;;52763:4;52756:11;;52559:216:::0;;;:::o;51990:110::-;2121:13;:11;:13::i;:::-;52080:12:::1;52066:11;;:26;;;;;;;;;;;;;;;;;;51990:110:::0;:::o;14057:436::-;14150:4;14167:13;14183:12;:10;:12::i;:::-;14167:28;;14206:24;14233:25;14243:5;14250:7;14233:9;:25::i;:::-;14206:52;;14297:15;14277:16;:35;;14269:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;14390:60;14399:5;14406:7;14434:15;14415:16;:34;14390:8;:60::i;:::-;14481:4;14474:11;;;;14057:436;;;;:::o;53385:118::-;2121:13;:11;:13::i;:::-;53481:14:::1;53465:13;:30;;;;53385:118:::0;:::o;49701:26::-;;;;;;;;;;;;;:::o;11104:193::-;11183:4;11200:13;11216:12;:10;:12::i;:::-;11200:28;;11239;11249:5;11256:2;11260:6;11239:9;:28::i;:::-;11285:4;11278:11;;;11104:193;;;;:::o;51409:113::-;2121:13;:11;:13::i;:::-;51501:9:::1;51490:8;:20;;;;51409:113:::0;:::o;53260:117::-;2121:13;:11;:13::i;:::-;53361:8:::1;53337:21;;:32;;;;;;;;;;;;;;;;;;53260:117:::0;:::o;56919:119::-;56978:4;57002:28;57022:7;57002:10;:19;;:28;;;;:::i;:::-;56995:35;;56919:119;;;:::o;53010:118::-;2121:13;:11;:13::i;:::-;53106:14:::1;53090:13;:30;;;;53010:118:::0;:::o;49923:28::-;;;;:::o;49851:::-;;;;:::o;11360:151::-;11449:7;11476:11;:18;11488:5;11476:18;;;;;;;;;;;;;;;:27;11495:7;11476:27;;;;;;;;;;;;;;;;11469:34;;11360:151;;;;:::o;51691:130::-;2121:13;:11;:13::i;:::-;51796:17:::1;51777:16;;:36;;;;;;;;;;;;;;;;;;51691:130:::0;:::o;53136:118::-;2121:13;:11;:13::i;:::-;53232:14:::1;53216:13;:30;;;;53136:118:::0;:::o;3141:201::-;2121:13;:11;:13::i;:::-;3250:1:::1;3230:22;;:8;:22;;;;3222:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3306:28;3325:8;3306:18;:28::i;:::-;3141:201:::0;:::o;51295:109::-;2121:13;:11;:13::i;:::-;51384:8:::1;51374:7;:18;;;;51295:109:::0;:::o;52108:216::-;52175:4;2121:13;:11;:13::i;:::-;52219:1:::1;52200:21;;:7;:21;;;;52192:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52271:23;52286:7;52271:10;:14;;:23;;;;:::i;:::-;;52312:4;52305:11;;52108:216:::0;;;:::o;44014:152::-;44084:4;44108:50;44113:3;:10;;44149:5;44133:23;;44125:32;;44108:4;:50::i;:::-;44101:57;;44014:152;;;;:::o;780:98::-;833:7;860:10;853:17;;780:98;:::o;17682:380::-;17835:1;17818:19;;:5;:19;;;;17810:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17916:1;17897:21;;:7;:21;;;;17889:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18000:6;17970:11;:18;17982:5;17970:18;;;;;;;;;;;;;;;:27;17989:7;17970:27;;;;;;;;;;;;;;;:36;;;;18038:7;18022:32;;18031:5;18022:32;;;18047:6;18022:32;;;;;;:::i;:::-;;;;;;;;17682:380;;;:::o;2400:132::-;2475:12;:10;:12::i;:::-;2464:23;;:7;:5;:7::i;:::-;:23;;;2456:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2400:132::o;18353:453::-;18488:24;18515:25;18525:5;18532:7;18515:9;:25::i;:::-;18488:52;;18575:17;18555:16;:37;18551:248;;18637:6;18617:16;:26;;18609:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18721:51;18730:5;18737:7;18765:6;18746:16;:25;18721:8;:51::i;:::-;18551:248;18477:329;18353:453;;;:::o;53629:2492::-;53777:1;53761:18;;:4;:18;;;;53753:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53854:1;53840:16;;:2;:16;;;;53832:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;53907:19;53929:9;:15;53939:4;53929:15;;;;;;;;;;;;;;;;53907:37;;53969:17;53981:4;53969:11;:17::i;:::-;53965:124;;54028:12;;54009:9;:15;54019:4;54009:15;;;;;;;;;;;;;;;;:31;;54001:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;53965:124;54103:17;54115:4;54103:11;:17::i;:::-;54099:117;;;54149:14;;;;;;;;;;;54143:20;;:2;:20;;;54135:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;54099:117;54241:7;;54232:6;:16;54228:140;;;54273:17;54285:4;54273:11;:17::i;:::-;:36;;;;54294:15;54306:2;54294:11;:15::i;:::-;54273:36;54265:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;54228:140;54407:8;;54398:6;54382:13;54392:2;54382:9;:13::i;:::-;:22;;;;:::i;:::-;:33;54378:147;;;54440:15;54452:2;54440:11;:15::i;:::-;:36;;;;54465:11;;;;;;;;;;;54459:17;;:2;:17;;;54440:36;54432:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;54378:147;54567:9;:15;54577:4;54567:15;;;;;;;;;;;;;;;;54551:12;;54542:6;:21;;;;:::i;:::-;54541:41;:66;;;;;54602:4;54586:21;;:4;:21;;;;54541:66;54537:195;;;54708:12;;54690:9;:15;54700:4;54690:15;;;;;;;;;;;;;;;;:30;;;;:::i;:::-;54681:39;;54537:195;54781:6;54766:11;:21;;54744:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;54921:6;54907:11;:20;54889:9;:15;54899:4;54889:15;;;;;;;;;;;;;;;:38;;;;54975:11;;;;;;;;;;;54967:19;;:4;:19;;;;:61;;;;;55026:1;55003:25;;:11;;;;;;;;;;;:25;;;;54967:61;:99;;;;;55061:4;55045:21;;:4;:21;;;;54967:99;:137;;;;;55083:21;;;;;;;;;;;54967:137;:180;;;;;55146:1;55121:22;55131:11;;;;;;;;;;;55121:9;:22::i;:::-;:26;54967:180;:225;;;;;55191:1;55164:24;55182:4;55164:9;:24::i;:::-;:28;54967:225;54949:655;;;55219:18;55267:13;;55240:9;:24;55258:4;55240:24;;;;;;;;;;;;;;;;:40;:117;;55333:9;:24;55351:4;55333:24;;;;;;;;;;;;;;;;55240:117;;;55300:13;;55240:117;55219:138;;55372:28;55389:10;55372:16;:28::i;:::-;55422:16;;;;;;;;;;;55414:34;;:107;55506:13;;55490;;:29;;;;:::i;:::-;55473:13;;55449:21;:37;;;;:::i;:::-;:71;;;;:::i;:::-;55414:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55543:16;;;;;;;;;;;55535:34;;:57;55570:21;55535:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55204:400;54949:655;55618:15;55630:2;55618:11;:15::i;:::-;:36;;;;55637:17;55649:4;55637:11;:17::i;:::-;55618:36;55614:500;;;55688:6;55671:9;:13;55681:2;55671:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;55729:2;55714:26;;55723:4;55714:26;;;55733:6;55714:26;;;;;;:::i;:::-;;;;;;;;55614:500;;;55793:20;55816:52;55830:6;55854:13;;55838;;:29;;;;:::i;:::-;55816:13;:52::i;:::-;55793:75;;55911:12;55883:9;:24;55901:4;55883:24;;;;;;;;;;;;;;;;:40;;;;;;;:::i;:::-;;;;;;;;55964:12;55955:6;:21;;;;:::i;:::-;55938:9;:13;55948:2;55938:13;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;56021:4;55998:43;;56007:4;55998:43;;;56028:12;55998:43;;;;;;:::i;:::-;;;;;;;;56076:2;56061:41;;56070:4;56061:41;;;56089:12;56080:6;:21;;;;:::i;:::-;56061:41;;;;;;:::i;:::-;;;;;;;;55778:336;55614:500;53742:2379;53629:2492;;;:::o;44586:167::-;44666:4;44690:55;44700:3;:10;;44736:5;44720:23;;44712:32;;44690:9;:55::i;:::-;44683:62;;44586:167;;;;:::o;44342:158::-;44415:4;44439:53;44447:3;:10;;44483:5;44467:23;;44459:32;;44439:7;:53::i;:::-;44432:60;;44342:158;;;;:::o;31920:211::-;32037:86;32057:5;32087:23;;;32112:2;32116:5;32064:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32037:19;:86::i;:::-;31920:211;;;:::o;3502:191::-;3576:16;3595:6;;;;;;;;;;;3576:25;;3621:8;3612:6;;:17;;;;;;;;;;;;;;;;;;3676:8;3645:40;;3666:8;3645:40;;;;;;;;;;;;3565:128;3502:191;:::o;37929:414::-;37992:4;38014:21;38024:3;38029:5;38014:9;:21::i;:::-;38009:327;;38052:3;:11;;38069:5;38052:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38235:3;:11;;:18;;;;38213:3;:12;;:19;38226:5;38213:19;;;;;;;;;;;:40;;;;38275:4;38268:11;;;;38009:327;38319:5;38312:12;;37929:414;;;;;:::o;56130:589::-;56256:21;56294:1;56280:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56256:40;;56325:4;56307;56312:1;56307:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;56351:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56341:4;56346:1;56341:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;56386:62;56403:4;56418:15;;;;;;;;;;;56436:11;56386:8;:62::i;:::-;56487:15;;;;;;;;;;;:66;;;56568:11;56594:1;56638:4;56665;56685:15;56487:224;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56185:534;56130:589;:::o;56727:184::-;56831:14;56892:11;;56883:5;56873:7;:15;;;;:::i;:::-;56872:31;;;;:::i;:::-;56863:40;;56727:184;;;;:::o;40025:129::-;40098:4;40145:1;40122:3;:12;;:19;40135:5;40122:19;;;;;;;;;;;;:24;;40115:31;;40025:129;;;;:::o;38519:1420::-;38585:4;38703:18;38724:3;:12;;:19;38737:5;38724:19;;;;;;;;;;;;38703:40;;38774:1;38760:10;:15;38756:1176;;39135:21;39172:1;39159:10;:14;;;;:::i;:::-;39135:38;;39188:17;39229:1;39208:3;:11;;:18;;;;:22;;;;:::i;:::-;39188:42;;39264:13;39251:9;:26;39247:405;;39298:17;39318:3;:11;;39330:9;39318:22;;;;;;;;:::i;:::-;;;;;;;;;;39298:42;;39472:9;39443:3;:11;;39455:13;39443:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;39583:10;39557:3;:12;;:23;39570:9;39557:23;;;;;;;;;;;:36;;;;39279:373;39247:405;39733:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39828:3;:12;;:19;39841:5;39828:19;;;;;;;;;;;39821:26;;;39871:4;39864:11;;;;;;;38756:1176;39915:5;39908:12;;;38519:1420;;;;;:::o;34987:716::-;35411:23;35437:69;35465:4;35437:69;;;;;;;;;;;;;;;;;35445:5;35437:27;;;;:69;;;;;:::i;:::-;35411:95;;35541:1;35521:10;:17;:21;35517:179;;;35618:10;35607:30;;;;;;;;;;;;:::i;:::-;35599:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;35517:179;35057:646;34987:716;;:::o;26625:229::-;26762:12;26794:52;26816:6;26824:4;26830:1;26833:12;26794:21;:52::i;:::-;26787:59;;26625:229;;;;;:::o;27745:510::-;27915:12;27973:5;27948:21;:30;;27940:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;28040:18;28051:6;28040:10;:18::i;:::-;28032:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;28106:12;28120:23;28147:6;:11;;28166:5;28173:4;28147:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28105:73;;;;28196:51;28213:7;28222:10;28234:12;28196:16;:51::i;:::-;28189:58;;;;27745:510;;;;;;:::o;23880:326::-;23940:4;24197:1;24175:7;:19;;;:23;24168:30;;23880:326;;;:::o;30431:762::-;30581:12;30610:7;30606:580;;;30641:10;30634:17;;;;30606:580;30775:1;30755:10;:17;:21;30751:424;;;31003:10;30997:17;31064:15;31051:10;31047:2;31043:19;31036:44;30751:424;31146:12;31139:20;;;;;;;;;;;:::i;:::-;;;;;;;;30431:762;;;;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;7:139;;;;:::o;152:143::-;209:5;240:6;234:13;225:22;;256:33;283:5;256:33;:::i;:::-;152:143;;;;:::o;301:133::-;344:5;382:6;369:20;360:29;;398:30;422:5;398:30;:::i;:::-;301:133;;;;:::o;440:137::-;494:5;525:6;519:13;510:22;;541:30;565:5;541:30;:::i;:::-;440:137;;;;:::o;583:139::-;629:5;667:6;654:20;645:29;;683:33;710:5;683:33;:::i;:::-;583:139;;;;:::o;728:143::-;785:5;816:6;810:13;801:22;;832:33;859:5;832:33;:::i;:::-;728:143;;;;:::o;877:329::-;936:6;985:2;973:9;964:7;960:23;956:32;953:119;;;991:79;;:::i;:::-;953:119;1111:1;1136:53;1181:7;1172:6;1161:9;1157:22;1136:53;:::i;:::-;1126:63;;1082:117;877:329;;;;:::o;1212:351::-;1282:6;1331:2;1319:9;1310:7;1306:23;1302:32;1299:119;;;1337:79;;:::i;:::-;1299:119;1457:1;1482:64;1538:7;1529:6;1518:9;1514:22;1482:64;:::i;:::-;1472:74;;1428:128;1212:351;;;;:::o;1569:474::-;1637:6;1645;1694:2;1682:9;1673:7;1669:23;1665:32;1662:119;;;1700:79;;:::i;:::-;1662:119;1820:1;1845:53;1890:7;1881:6;1870:9;1866:22;1845:53;:::i;:::-;1835:63;;1791:117;1947:2;1973:53;2018:7;2009:6;1998:9;1994:22;1973:53;:::i;:::-;1963:63;;1918:118;1569:474;;;;;:::o;2049:619::-;2126:6;2134;2142;2191:2;2179:9;2170:7;2166:23;2162:32;2159:119;;;2197:79;;:::i;:::-;2159:119;2317:1;2342:53;2387:7;2378:6;2367:9;2363:22;2342:53;:::i;:::-;2332:63;;2288:117;2444:2;2470:53;2515:7;2506:6;2495:9;2491:22;2470:53;:::i;:::-;2460:63;;2415:118;2572:2;2598:53;2643:7;2634:6;2623:9;2619:22;2598:53;:::i;:::-;2588:63;;2543:118;2049:619;;;;;:::o;2674:474::-;2742:6;2750;2799:2;2787:9;2778:7;2774:23;2770:32;2767:119;;;2805:79;;:::i;:::-;2767:119;2925:1;2950:53;2995:7;2986:6;2975:9;2971:22;2950:53;:::i;:::-;2940:63;;2896:117;3052:2;3078:53;3123:7;3114:6;3103:9;3099:22;3078:53;:::i;:::-;3068:63;;3023:118;2674:474;;;;;:::o;3154:323::-;3210:6;3259:2;3247:9;3238:7;3234:23;3230:32;3227:119;;;3265:79;;:::i;:::-;3227:119;3385:1;3410:50;3452:7;3443:6;3432:9;3428:22;3410:50;:::i;:::-;3400:60;;3356:114;3154:323;;;;:::o;3483:345::-;3550:6;3599:2;3587:9;3578:7;3574:23;3570:32;3567:119;;;3605:79;;:::i;:::-;3567:119;3725:1;3750:61;3803:7;3794:6;3783:9;3779:22;3750:61;:::i;:::-;3740:71;;3696:125;3483:345;;;;:::o;3834:329::-;3893:6;3942:2;3930:9;3921:7;3917:23;3913:32;3910:119;;;3948:79;;:::i;:::-;3910:119;4068:1;4093:53;4138:7;4129:6;4118:9;4114:22;4093:53;:::i;:::-;4083:63;;4039:117;3834:329;;;;:::o;4169:351::-;4239:6;4288:2;4276:9;4267:7;4263:23;4259:32;4256:119;;;4294:79;;:::i;:::-;4256:119;4414:1;4439:64;4495:7;4486:6;4475:9;4471:22;4439:64;:::i;:::-;4429:74;;4385:128;4169:351;;;;:::o;4526:179::-;4595:10;4616:46;4658:3;4650:6;4616:46;:::i;:::-;4694:4;4689:3;4685:14;4671:28;;4526:179;;;;:::o;4711:108::-;4788:24;4806:5;4788:24;:::i;:::-;4783:3;4776:37;4711:108;;:::o;4825:118::-;4912:24;4930:5;4912:24;:::i;:::-;4907:3;4900:37;4825:118;;:::o;4979:732::-;5098:3;5127:54;5175:5;5127:54;:::i;:::-;5197:86;5276:6;5271:3;5197:86;:::i;:::-;5190:93;;5307:56;5357:5;5307:56;:::i;:::-;5386:7;5417:1;5402:284;5427:6;5424:1;5421:13;5402:284;;;5503:6;5497:13;5530:63;5589:3;5574:13;5530:63;:::i;:::-;5523:70;;5616:60;5669:6;5616:60;:::i;:::-;5606:70;;5462:224;5449:1;5446;5442:9;5437:14;;5402:284;;;5406:14;5702:3;5695:10;;5103:608;;;4979:732;;;;:::o;5717:109::-;5798:21;5813:5;5798:21;:::i;:::-;5793:3;5786:34;5717:109;;:::o;5832:373::-;5936:3;5964:38;5996:5;5964:38;:::i;:::-;6018:88;6099:6;6094:3;6018:88;:::i;:::-;6011:95;;6115:52;6160:6;6155:3;6148:4;6141:5;6137:16;6115:52;:::i;:::-;6192:6;6187:3;6183:16;6176:23;;5940:265;5832:373;;;;:::o;6211:185::-;6325:64;6383:5;6325:64;:::i;:::-;6320:3;6313:77;6211:185;;:::o;6402:147::-;6497:45;6536:5;6497:45;:::i;:::-;6492:3;6485:58;6402:147;;:::o;6555:364::-;6643:3;6671:39;6704:5;6671:39;:::i;:::-;6726:71;6790:6;6785:3;6726:71;:::i;:::-;6719:78;;6806:52;6851:6;6846:3;6839:4;6832:5;6828:16;6806:52;:::i;:::-;6883:29;6905:6;6883:29;:::i;:::-;6878:3;6874:39;6867:46;;6647:272;6555:364;;;;:::o;6925:366::-;7067:3;7088:67;7152:2;7147:3;7088:67;:::i;:::-;7081:74;;7164:93;7253:3;7164:93;:::i;:::-;7282:2;7277:3;7273:12;7266:19;;6925:366;;;:::o;7297:::-;7439:3;7460:67;7524:2;7519:3;7460:67;:::i;:::-;7453:74;;7536:93;7625:3;7536:93;:::i;:::-;7654:2;7649:3;7645:12;7638:19;;7297:366;;;:::o;7669:::-;7811:3;7832:67;7896:2;7891:3;7832:67;:::i;:::-;7825:74;;7908:93;7997:3;7908:93;:::i;:::-;8026:2;8021:3;8017:12;8010:19;;7669:366;;;:::o;8041:::-;8183:3;8204:67;8268:2;8263:3;8204:67;:::i;:::-;8197:74;;8280:93;8369:3;8280:93;:::i;:::-;8398:2;8393:3;8389:12;8382:19;;8041:366;;;:::o;8413:::-;8555:3;8576:67;8640:2;8635:3;8576:67;:::i;:::-;8569:74;;8652:93;8741:3;8652:93;:::i;:::-;8770:2;8765:3;8761:12;8754:19;;8413:366;;;:::o;8785:::-;8927:3;8948:67;9012:2;9007:3;8948:67;:::i;:::-;8941:74;;9024:93;9113:3;9024:93;:::i;:::-;9142:2;9137:3;9133:12;9126:19;;8785:366;;;:::o;9157:::-;9299:3;9320:67;9384:2;9379:3;9320:67;:::i;:::-;9313:74;;9396:93;9485:3;9396:93;:::i;:::-;9514:2;9509:3;9505:12;9498:19;;9157:366;;;:::o;9529:::-;9671:3;9692:67;9756:2;9751:3;9692:67;:::i;:::-;9685:74;;9768:93;9857:3;9768:93;:::i;:::-;9886:2;9881:3;9877:12;9870:19;;9529:366;;;:::o;9901:::-;10043:3;10064:67;10128:2;10123:3;10064:67;:::i;:::-;10057:74;;10140:93;10229:3;10140:93;:::i;:::-;10258:2;10253:3;10249:12;10242:19;;9901:366;;;:::o;10273:::-;10415:3;10436:67;10500:2;10495:3;10436:67;:::i;:::-;10429:74;;10512:93;10601:3;10512:93;:::i;:::-;10630:2;10625:3;10621:12;10614:19;;10273:366;;;:::o;10645:::-;10787:3;10808:67;10872:2;10867:3;10808:67;:::i;:::-;10801:74;;10884:93;10973:3;10884:93;:::i;:::-;11002:2;10997:3;10993:12;10986:19;;10645:366;;;:::o;11017:::-;11159:3;11180:67;11244:2;11239:3;11180:67;:::i;:::-;11173:74;;11256:93;11345:3;11256:93;:::i;:::-;11374:2;11369:3;11365:12;11358:19;;11017:366;;;:::o;11389:::-;11531:3;11552:67;11616:2;11611:3;11552:67;:::i;:::-;11545:74;;11628:93;11717:3;11628:93;:::i;:::-;11746:2;11741:3;11737:12;11730:19;;11389:366;;;:::o;11761:::-;11903:3;11924:67;11988:2;11983:3;11924:67;:::i;:::-;11917:74;;12000:93;12089:3;12000:93;:::i;:::-;12118:2;12113:3;12109:12;12102:19;;11761:366;;;:::o;12133:::-;12275:3;12296:67;12360:2;12355:3;12296:67;:::i;:::-;12289:74;;12372:93;12461:3;12372:93;:::i;:::-;12490:2;12485:3;12481:12;12474:19;;12133:366;;;:::o;12505:::-;12647:3;12668:67;12732:2;12727:3;12668:67;:::i;:::-;12661:74;;12744:93;12833:3;12744:93;:::i;:::-;12862:2;12857:3;12853:12;12846:19;;12505:366;;;:::o;12877:::-;13019:3;13040:67;13104:2;13099:3;13040:67;:::i;:::-;13033:74;;13116:93;13205:3;13116:93;:::i;:::-;13234:2;13229:3;13225:12;13218:19;;12877:366;;;:::o;13249:118::-;13336:24;13354:5;13336:24;:::i;:::-;13331:3;13324:37;13249:118;;:::o;13373:112::-;13456:22;13472:5;13456:22;:::i;:::-;13451:3;13444:35;13373:112;;:::o;13491:271::-;13621:3;13643:93;13732:3;13723:6;13643:93;:::i;:::-;13636:100;;13753:3;13746:10;;13491:271;;;;:::o;13768:222::-;13861:4;13899:2;13888:9;13884:18;13876:26;;13912:71;13980:1;13969:9;13965:17;13956:6;13912:71;:::i;:::-;13768:222;;;;:::o;13996:332::-;14117:4;14155:2;14144:9;14140:18;14132:26;;14168:71;14236:1;14225:9;14221:17;14212:6;14168:71;:::i;:::-;14249:72;14317:2;14306:9;14302:18;14293:6;14249:72;:::i;:::-;13996:332;;;;;:::o;14334:210::-;14421:4;14459:2;14448:9;14444:18;14436:26;;14472:65;14534:1;14523:9;14519:17;14510:6;14472:65;:::i;:::-;14334:210;;;;:::o;14550:276::-;14670:4;14708:2;14697:9;14693:18;14685:26;;14721:98;14816:1;14805:9;14801:17;14792:6;14721:98;:::i;:::-;14550:276;;;;:::o;14832:313::-;14945:4;14983:2;14972:9;14968:18;14960:26;;15032:9;15026:4;15022:20;15018:1;15007:9;15003:17;14996:47;15060:78;15133:4;15124:6;15060:78;:::i;:::-;15052:86;;14832:313;;;;:::o;15151:419::-;15317:4;15355:2;15344:9;15340:18;15332:26;;15404:9;15398:4;15394:20;15390:1;15379:9;15375:17;15368:47;15432:131;15558:4;15432:131;:::i;:::-;15424:139;;15151:419;;;:::o;15576:::-;15742:4;15780:2;15769:9;15765:18;15757:26;;15829:9;15823:4;15819:20;15815:1;15804:9;15800:17;15793:47;15857:131;15983:4;15857:131;:::i;:::-;15849:139;;15576:419;;;:::o;16001:::-;16167:4;16205:2;16194:9;16190:18;16182:26;;16254:9;16248:4;16244:20;16240:1;16229:9;16225:17;16218:47;16282:131;16408:4;16282:131;:::i;:::-;16274:139;;16001:419;;;:::o;16426:::-;16592:4;16630:2;16619:9;16615:18;16607:26;;16679:9;16673:4;16669:20;16665:1;16654:9;16650:17;16643:47;16707:131;16833:4;16707:131;:::i;:::-;16699:139;;16426:419;;;:::o;16851:::-;17017:4;17055:2;17044:9;17040:18;17032:26;;17104:9;17098:4;17094:20;17090:1;17079:9;17075:17;17068:47;17132:131;17258:4;17132:131;:::i;:::-;17124:139;;16851:419;;;:::o;17276:::-;17442:4;17480:2;17469:9;17465:18;17457:26;;17529:9;17523:4;17519:20;17515:1;17504:9;17500:17;17493:47;17557:131;17683:4;17557:131;:::i;:::-;17549:139;;17276:419;;;:::o;17701:::-;17867:4;17905:2;17894:9;17890:18;17882:26;;17954:9;17948:4;17944:20;17940:1;17929:9;17925:17;17918:47;17982:131;18108:4;17982:131;:::i;:::-;17974:139;;17701:419;;;:::o;18126:::-;18292:4;18330:2;18319:9;18315:18;18307:26;;18379:9;18373:4;18369:20;18365:1;18354:9;18350:17;18343:47;18407:131;18533:4;18407:131;:::i;:::-;18399:139;;18126:419;;;:::o;18551:::-;18717:4;18755:2;18744:9;18740:18;18732:26;;18804:9;18798:4;18794:20;18790:1;18779:9;18775:17;18768:47;18832:131;18958:4;18832:131;:::i;:::-;18824:139;;18551:419;;;:::o;18976:::-;19142:4;19180:2;19169:9;19165:18;19157:26;;19229:9;19223:4;19219:20;19215:1;19204:9;19200:17;19193:47;19257:131;19383:4;19257:131;:::i;:::-;19249:139;;18976:419;;;:::o;19401:::-;19567:4;19605:2;19594:9;19590:18;19582:26;;19654:9;19648:4;19644:20;19640:1;19629:9;19625:17;19618:47;19682:131;19808:4;19682:131;:::i;:::-;19674:139;;19401:419;;;:::o;19826:::-;19992:4;20030:2;20019:9;20015:18;20007:26;;20079:9;20073:4;20069:20;20065:1;20054:9;20050:17;20043:47;20107:131;20233:4;20107:131;:::i;:::-;20099:139;;19826:419;;;:::o;20251:::-;20417:4;20455:2;20444:9;20440:18;20432:26;;20504:9;20498:4;20494:20;20490:1;20479:9;20475:17;20468:47;20532:131;20658:4;20532:131;:::i;:::-;20524:139;;20251:419;;;:::o;20676:::-;20842:4;20880:2;20869:9;20865:18;20857:26;;20929:9;20923:4;20919:20;20915:1;20904:9;20900:17;20893:47;20957:131;21083:4;20957:131;:::i;:::-;20949:139;;20676:419;;;:::o;21101:::-;21267:4;21305:2;21294:9;21290:18;21282:26;;21354:9;21348:4;21344:20;21340:1;21329:9;21325:17;21318:47;21382:131;21508:4;21382:131;:::i;:::-;21374:139;;21101:419;;;:::o;21526:::-;21692:4;21730:2;21719:9;21715:18;21707:26;;21779:9;21773:4;21769:20;21765:1;21754:9;21750:17;21743:47;21807:131;21933:4;21807:131;:::i;:::-;21799:139;;21526:419;;;:::o;21951:::-;22117:4;22155:2;22144:9;22140:18;22132:26;;22204:9;22198:4;22194:20;22190:1;22179:9;22175:17;22168:47;22232:131;22358:4;22232:131;:::i;:::-;22224:139;;21951:419;;;:::o;22376:222::-;22469:4;22507:2;22496:9;22492:18;22484:26;;22520:71;22588:1;22577:9;22573:17;22564:6;22520:71;:::i;:::-;22376:222;;;;:::o;22604:831::-;22867:4;22905:3;22894:9;22890:19;22882:27;;22919:71;22987:1;22976:9;22972:17;22963:6;22919:71;:::i;:::-;23000:80;23076:2;23065:9;23061:18;23052:6;23000:80;:::i;:::-;23127:9;23121:4;23117:20;23112:2;23101:9;23097:18;23090:48;23155:108;23258:4;23249:6;23155:108;:::i;:::-;23147:116;;23273:72;23341:2;23330:9;23326:18;23317:6;23273:72;:::i;:::-;23355:73;23423:3;23412:9;23408:19;23399:6;23355:73;:::i;:::-;22604:831;;;;;;;;:::o;23441:214::-;23530:4;23568:2;23557:9;23553:18;23545:26;;23581:67;23645:1;23634:9;23630:17;23621:6;23581:67;:::i;:::-;23441:214;;;;:::o;23742:132::-;23809:4;23832:3;23824:11;;23862:4;23857:3;23853:14;23845:22;;23742:132;;;:::o;23880:114::-;23947:6;23981:5;23975:12;23965:22;;23880:114;;;:::o;24000:98::-;24051:6;24085:5;24079:12;24069:22;;24000:98;;;:::o;24104:99::-;24156:6;24190:5;24184:12;24174:22;;24104:99;;;:::o;24209:113::-;24279:4;24311;24306:3;24302:14;24294:22;;24209:113;;;:::o;24328:184::-;24427:11;24461:6;24456:3;24449:19;24501:4;24496:3;24492:14;24477:29;;24328:184;;;;:::o;24518:147::-;24619:11;24656:3;24641:18;;24518:147;;;;:::o;24671:169::-;24755:11;24789:6;24784:3;24777:19;24829:4;24824:3;24820:14;24805:29;;24671:169;;;;:::o;24846:305::-;24886:3;24905:20;24923:1;24905:20;:::i;:::-;24900:25;;24939:20;24957:1;24939:20;:::i;:::-;24934:25;;25093:1;25025:66;25021:74;25018:1;25015:81;25012:107;;;25099:18;;:::i;:::-;25012:107;25143:1;25140;25136:9;25129:16;;24846:305;;;;:::o;25157:185::-;25197:1;25214:20;25232:1;25214:20;:::i;:::-;25209:25;;25248:20;25266:1;25248:20;:::i;:::-;25243:25;;25287:1;25277:35;;25292:18;;:::i;:::-;25277:35;25334:1;25331;25327:9;25322:14;;25157:185;;;;:::o;25348:348::-;25388:7;25411:20;25429:1;25411:20;:::i;:::-;25406:25;;25445:20;25463:1;25445:20;:::i;:::-;25440:25;;25633:1;25565:66;25561:74;25558:1;25555:81;25550:1;25543:9;25536:17;25532:105;25529:131;;;25640:18;;:::i;:::-;25529:131;25688:1;25685;25681:9;25670:20;;25348:348;;;;:::o;25702:191::-;25742:4;25762:20;25780:1;25762:20;:::i;:::-;25757:25;;25796:20;25814:1;25796:20;:::i;:::-;25791:25;;25835:1;25832;25829:8;25826:34;;;25840:18;;:::i;:::-;25826:34;25885:1;25882;25878:9;25870:17;;25702:191;;;;:::o;25899:96::-;25936:7;25965:24;25983:5;25965:24;:::i;:::-;25954:35;;25899:96;;;:::o;26001:90::-;26035:7;26078:5;26071:13;26064:21;26053:32;;26001:90;;;:::o;26097:126::-;26134:7;26174:42;26167:5;26163:54;26152:65;;26097:126;;;:::o;26229:77::-;26266:7;26295:5;26284:16;;26229:77;;;:::o;26312:86::-;26347:7;26387:4;26380:5;26376:16;26365:27;;26312:86;;;:::o;26404:153::-;26481:9;26514:37;26545:5;26514:37;:::i;:::-;26501:50;;26404:153;;;:::o;26563:121::-;26621:9;26654:24;26672:5;26654:24;:::i;:::-;26641:37;;26563:121;;;:::o;26690:126::-;26740:9;26773:37;26804:5;26773:37;:::i;:::-;26760:50;;26690:126;;;:::o;26822:113::-;26872:9;26905:24;26923:5;26905:24;:::i;:::-;26892:37;;26822:113;;;:::o;26941:307::-;27009:1;27019:113;27033:6;27030:1;27027:13;27019:113;;;27118:1;27113:3;27109:11;27103:18;27099:1;27094:3;27090:11;27083:39;27055:2;27052:1;27048:10;27043:15;;27019:113;;;27150:6;27147:1;27144:13;27141:101;;;27230:1;27221:6;27216:3;27212:16;27205:27;27141:101;26990:258;26941:307;;;:::o;27254:320::-;27298:6;27335:1;27329:4;27325:12;27315:22;;27382:1;27376:4;27372:12;27403:18;27393:81;;27459:4;27451:6;27447:17;27437:27;;27393:81;27521:2;27513:6;27510:14;27490:18;27487:38;27484:84;;;27540:18;;:::i;:::-;27484:84;27305:269;27254:320;;;:::o;27580:180::-;27628:77;27625:1;27618:88;27725:4;27722:1;27715:15;27749:4;27746:1;27739:15;27766:180;27814:77;27811:1;27804:88;27911:4;27908:1;27901:15;27935:4;27932:1;27925:15;27952:180;28000:77;27997:1;27990:88;28097:4;28094:1;28087:15;28121:4;28118:1;28111:15;28138:180;28186:77;28183:1;28176:88;28283:4;28280:1;28273:15;28307:4;28304:1;28297:15;28324:180;28372:77;28369:1;28362:88;28469:4;28466:1;28459:15;28493:4;28490:1;28483:15;28510:180;28558:77;28555:1;28548:88;28655:4;28652:1;28645:15;28679:4;28676:1;28669:15;28819:117;28928:1;28925;28918:12;28942:102;28983:6;29034:2;29030:7;29025:2;29018:5;29014:14;29010:28;29000:38;;28942:102;;;:::o;29050:222::-;29190:34;29186:1;29178:6;29174:14;29167:58;29259:5;29254:2;29246:6;29242:15;29235:30;29050:222;:::o;29278:225::-;29418:34;29414:1;29406:6;29402:14;29395:58;29487:8;29482:2;29474:6;29470:15;29463:33;29278:225;:::o;29509:221::-;29649:34;29645:1;29637:6;29633:14;29626:58;29718:4;29713:2;29705:6;29701:15;29694:29;29509:221;:::o;29736:::-;29876:34;29872:1;29864:6;29860:14;29853:58;29945:4;29940:2;29932:6;29928:15;29921:29;29736:221;:::o;29963:182::-;30103:34;30099:1;30091:6;30087:14;30080:58;29963:182;:::o;30151:229::-;30291:34;30287:1;30279:6;30275:14;30268:58;30360:12;30355:2;30347:6;30343:15;30336:37;30151:229;:::o;30386:179::-;30526:31;30522:1;30514:6;30510:14;30503:55;30386:179;:::o;30571:225::-;30711:34;30707:1;30699:6;30695:14;30688:58;30780:8;30775:2;30767:6;30763:15;30756:33;30571:225;:::o;30802:182::-;30942:34;30938:1;30930:6;30926:14;30919:58;30802:182;:::o;30990:225::-;31130:34;31126:1;31118:6;31114:14;31107:58;31199:8;31194:2;31186:6;31182:15;31175:33;30990:225;:::o;31221:223::-;31361:34;31357:1;31349:6;31345:14;31338:58;31430:6;31425:2;31417:6;31413:15;31406:31;31221:223;:::o;31450:182::-;31590:34;31586:1;31578:6;31574:14;31567:58;31450:182;:::o;31638:224::-;31778:34;31774:1;31766:6;31762:14;31755:58;31847:7;31842:2;31834:6;31830:15;31823:32;31638:224;:::o;31868:223::-;32008:34;32004:1;31996:6;31992:14;31985:58;32077:6;32072:2;32064:6;32060:15;32053:31;31868:223;:::o;32097:179::-;32237:31;32233:1;32225:6;32221:14;32214:55;32097:179;:::o;32282:229::-;32422:34;32418:1;32410:6;32406:14;32399:58;32491:12;32486:2;32478:6;32474:15;32467:37;32282:229;:::o;32517:224::-;32657:34;32653:1;32645:6;32641:14;32634:58;32726:7;32721:2;32713:6;32709:15;32702:32;32517:224;:::o;32747:122::-;32820:24;32838:5;32820:24;:::i;:::-;32813:5;32810:35;32800:63;;32859:1;32856;32849:12;32800:63;32747:122;:::o;32875:116::-;32945:21;32960:5;32945:21;:::i;:::-;32938:5;32935:32;32925:60;;32981:1;32978;32971:12;32925:60;32875:116;:::o;32997:122::-;33070:24;33088:5;33070:24;:::i;:::-;33063:5;33060:35;33050:63;;33109:1;33106;33099:12;33050:63;32997:122;:::o

Swarm Source

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