ETH Price: $3,415.89 (-0.64%)
Gas: 5 Gwei

Token

EtherArts Governance Token (etherNFT)
 

Overview

Max Total Supply

100,000,000 etherNFT

Holders

30

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
4,523,718.100633742852635324 etherNFT

Value
$0.00
0xb42f65c106f1b189686a16b8e0cea4e14f691be8
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:
EtherArtsMarketPlace

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

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

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// File: @openzeppelin/contracts/utils/Context.sol


// 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/token/ERC20/IERC20.sol


// 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/IERC20Metadata.sol


// 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/ERC20.sol


// OpenZeppelin Contracts (last updated v4.8.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.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

    /**
     * @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;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _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;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _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;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _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/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

// File: etherarts.sol


pragma solidity ^0.8.0;




contract EtherArtsMarketPlace is ERC20 {
    using SafeMath for uint256;
    
    
    string private constant TOKEN_NAME = "EtherArts Governance Token";
    string private constant TOKEN_SYMBOL = "etherNFT";
    uint256 private constant STAKING_REWARD_RATE = 1e12; // 0.000001 Token Rewards per block
    
    address private _admin;
    uint256 private _totalStaked;

    struct Offer {
        bool isForSale;
        uint256 price;
        address seller;
        address nftContractAddress;
    }

    struct Staker {
        uint256 stakedTokens;
        uint256 rewardDebt;
    }

    mapping(uint256 => Offer) private _tokenOffers;
    mapping(address => mapping(address => Staker)) private _stakers;

    event OfferCreated(uint256 indexed tokenId, uint256 price, address indexed seller, address nftContractAddress);
    event OfferCancelled(uint256 indexed tokenId, address nftContractAddress);
    event NFTSold(uint256 indexed tokenId, uint256 price, address indexed buyer, address indexed seller, address nftContractAddress);
    event Staked(address indexed staker, uint256 amount, address nftContractAddress);
    event Unstaked(address indexed staker, uint256 amount, address nftContractAddress);
    event RewardClaimed(address indexed staker, uint256 amount, address nftContractAddress);

    constructor() ERC20(TOKEN_NAME, TOKEN_SYMBOL){
        _admin = msg.sender;
        
        
        _mint(msg.sender, 100000000 * 10**18);
    }

    function createOffer(uint256 tokenId, uint256 price, address nftContractAddress) external {
        IERC721 nftContract = IERC721(nftContractAddress);
        require(nftContract.ownerOf(tokenId) == msg.sender, "Only token owner can create offers.");
        require(price > 0, "Price must be greater than 0.");

        nftContract.transferFrom(msg.sender, address(this), tokenId);

        _tokenOffers[tokenId] = Offer({
            isForSale: true,
            price: price,
            seller: msg.sender,
            nftContractAddress: nftContractAddress
        });

        emit OfferCreated(tokenId, price, msg.sender, nftContractAddress);
    }
    
    // same market functions as in the previous EtherArts NFT Marketplace contract
    
    function stake(uint256 amount, address nftContractAddress) external {
        require(amount > 0, "Staking amount must be greater than 0.");
        _transfer(msg.sender, address(this), amount);
        Staker storage staker = _stakers[msg.sender][nftContractAddress];

        updateRewards(msg.sender, nftContractAddress);

        staker.stakedTokens = staker.stakedTokens.add(amount);
        _totalStaked = _totalStaked.add(amount);

        emit Staked(msg.sender, amount, nftContractAddress);
    }

    function unstake(uint256 amount, address nftContractAddress) external {
        Staker storage staker = _stakers[msg.sender][nftContractAddress];
        require(amount > 0, "Unstaking amount must be above zero.");
        require(staker.stakedTokens >= amount, "Insufficient staked balance.");

        updateRewards(msg.sender, nftContractAddress);

        staker.stakedTokens = staker.stakedTokens.sub(amount);
        _totalStaked = _totalStaked.sub(amount);
        _transfer(address(this), msg.sender, amount);

        emit Unstaked(msg.sender, amount, nftContractAddress);
    }

    function claimRewards(address nftContractAddress) external {
        uint256 pendingReward = getPendingRewards(msg.sender, nftContractAddress);
        require(pendingReward > 0, "No rewards to claim.");

        updateRewards(msg.sender, nftContractAddress);
        
        _mint(msg.sender, pendingReward);

        emit RewardClaimed(msg.sender, pendingReward, nftContractAddress);
    }

    function updateRewards(address stakerAddress, address nftContractAddress) internal {
        Staker storage staker = _stakers[stakerAddress][nftContractAddress];
        uint256 pendingReward = getPendingRewards(stakerAddress, nftContractAddress);

        staker.rewardDebt = pendingReward;
    }

    function getPendingRewards(address stakerAddress, address nftContractAddress) public view returns (uint256) {
        Staker storage staker = _stakers[stakerAddress][nftContractAddress];
        uint256 stakedTokens = staker.stakedTokens;
        uint256 userRewardDebt = staker.rewardDebt;

        return stakedTokens.mul(STAKING_REWARD_RATE).sub(userRewardDebt);
    }
}

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":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":true,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"address","name":"nftContractAddress","type":"address"}],"name":"NFTSold","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"nftContractAddress","type":"address"}],"name":"OfferCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":true,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"address","name":"nftContractAddress","type":"address"}],"name":"OfferCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"nftContractAddress","type":"address"}],"name":"RewardClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"nftContractAddress","type":"address"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"nftContractAddress","type":"address"}],"name":"Unstaked","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"nftContractAddress","type":"address"}],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"address","name":"nftContractAddress","type":"address"}],"name":"createOffer","outputs":[],"stateMutability":"nonpayable","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":"stakerAddress","type":"address"},{"internalType":"address","name":"nftContractAddress","type":"address"}],"name":"getPendingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"nftContractAddress","type":"address"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","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":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"nftContractAddress","type":"address"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280601a81526020017f45746865724172747320476f7665726e616e636520546f6b656e0000000000008152506040518060400160405280600881526020017f65746865724e465400000000000000000000000000000000000000000000000081525081600390816200008f9190620004f9565b508060049081620000a19190620004f9565b50505033600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000102336a52b7d2dcc80cd2e40000006200010860201b60201c565b620006fb565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200017a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001719062000641565b60405180910390fd5b6200018e600083836200027560201b60201c565b8060026000828254620001a2919062000692565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620002559190620006de565b60405180910390a362000271600083836200027a60201b60201c565b5050565b505050565b505050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200030157607f821691505b602082108103620003175762000316620002b9565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000342565b6200038d868362000342565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003da620003d4620003ce84620003a5565b620003af565b620003a5565b9050919050565b6000819050919050565b620003f683620003b9565b6200040e6200040582620003e1565b8484546200034f565b825550505050565b600090565b6200042562000416565b62000432818484620003eb565b505050565b5b818110156200045a576200044e6000826200041b565b60018101905062000438565b5050565b601f821115620004a95762000473816200031d565b6200047e8462000332565b810160208510156200048e578190505b620004a66200049d8562000332565b83018262000437565b50505b505050565b600082821c905092915050565b6000620004ce60001984600802620004ae565b1980831691505092915050565b6000620004e98383620004bb565b9150826002028217905092915050565b62000504826200027f565b67ffffffffffffffff81111562000520576200051f6200028a565b5b6200052c8254620002e8565b620005398282856200045e565b600060209050601f8311600181146200057157600084156200055c578287015190505b620005688582620004db565b865550620005d8565b601f19841662000581866200031d565b60005b82811015620005ab5784890151825560018201915060208501945060208101905062000584565b86831015620005cb5784890151620005c7601f891682620004bb565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000629601f83620005e0565b91506200063682620005f1565b602082019050919050565b600060208201905081810360008301526200065c816200061a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200069f82620003a5565b9150620006ac83620003a5565b9250828201905080821115620006c757620006c662000663565b5b92915050565b620006d881620003a5565b82525050565b6000602082019050620006f56000830184620006cd565b92915050565b612224806200070b6000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c80637a27db5711610097578063a457c2d711610066578063a457c2d7146102c1578063a9059cbb146102f1578063dd62ed3e14610321578063ef5cfb8c1461035157610100565b80637a27db571461023b5780637acb77571461026b5780638381e1821461028757806395d89b41146102a357610100565b8063313ce567116100d3578063313ce567146101a157806339509351146101bf57806366b6aff6146101ef57806370a082311461020b57610100565b806306fdde0314610105578063095ea7b31461012357806318160ddd1461015357806323b872dd14610171575b600080fd5b61010d61036d565b60405161011a91906115e1565b60405180910390f35b61013d6004803603810190610138919061169c565b6103ff565b60405161014a91906116f7565b60405180910390f35b61015b610422565b6040516101689190611721565b60405180910390f35b61018b6004803603810190610186919061173c565b61042c565b60405161019891906116f7565b60405180910390f35b6101a961045b565b6040516101b691906117ab565b60405180910390f35b6101d960048036038101906101d4919061169c565b610464565b6040516101e691906116f7565b60405180910390f35b610209600480360381019061020491906117c6565b61049b565b005b61022560048036038101906102209190611819565b6107ae565b6040516102329190611721565b60405180910390f35b61025560048036038101906102509190611846565b6107f6565b6040516102629190611721565b60405180910390f35b61028560048036038101906102809190611886565b6108be565b005b6102a1600480360381019061029c9190611886565b610a25565b005b6102ab610bd3565b6040516102b891906115e1565b60405180910390f35b6102db60048036038101906102d6919061169c565b610c65565b6040516102e891906116f7565b60405180910390f35b61030b6004803603810190610306919061169c565b610cdc565b60405161031891906116f7565b60405180910390f35b61033b60048036038101906103369190611846565b610cff565b6040516103489190611721565b60405180910390f35b61036b60048036038101906103669190611819565b610d86565b005b60606003805461037c906118f5565b80601f01602080910402602001604051908101604052809291908181526020018280546103a8906118f5565b80156103f55780601f106103ca576101008083540402835291602001916103f5565b820191906000526020600020905b8154815290600101906020018083116103d857829003601f168201915b5050505050905090565b60008061040a610e3f565b9050610417818585610e47565b600191505092915050565b6000600254905090565b600080610437610e3f565b9050610444858285611010565b61044f85858561109c565b60019150509392505050565b60006012905090565b60008061046f610e3f565b90506104908185856104818589610cff565b61048b9190611955565b610e47565b600191505092915050565b60008190503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e866040518263ffffffff1660e01b81526004016104f09190611721565b602060405180830381865afa15801561050d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610531919061199e565b73ffffffffffffffffffffffffffffffffffffffff1614610587576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161057e90611a3d565b60405180910390fd5b600083116105ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105c190611aa9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330876040518463ffffffff1660e01b815260040161060793929190611ad8565b600060405180830381600087803b15801561062157600080fd5b505af1158015610635573d6000803e3d6000fd5b5050505060405180608001604052806001151581526020018481526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff168152506007600086815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050503373ffffffffffffffffffffffffffffffffffffffff16847f050e8c2a38075fa43aee93e14a824a2cceb2ec68b4cd1c9ec61782390ba1c0c485856040516107a0929190611b0f565b60405180910390a350505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600080600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816000015490506000826001015490506108b3816108a564e8d4a510008561131290919063ffffffff16565b61132890919063ffffffff16565b935050505092915050565b60008211610901576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f890611baa565b60405180910390fd5b61090c33308461109c565b6000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050610996338361133e565b6109ad8382600001546113db90919063ffffffff16565b81600001819055506109ca836006546113db90919063ffffffff16565b6006819055503373ffffffffffffffffffffffffffffffffffffffff167f9f9e4044c5742cca66ca090b21552bac14645e68bad7a92364a9d9ff18111a1c8484604051610a18929190611b0f565b60405180910390a2505050565b6000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008311610ae8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610adf90611c3c565b60405180910390fd5b8281600001541015610b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2690611ca8565b60405180910390fd5b610b39338361133e565b610b5083826000015461132890919063ffffffff16565b8160000181905550610b6d8360065461132890919063ffffffff16565b600681905550610b7e30338561109c565b3373ffffffffffffffffffffffffffffffffffffffff167fe85b7860587d17eba1b921a125cf25732cd9e64d1516f196df3c9c8fb8d513f38484604051610bc6929190611b0f565b60405180910390a2505050565b606060048054610be2906118f5565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0e906118f5565b8015610c5b5780601f10610c3057610100808354040283529160200191610c5b565b820191906000526020600020905b815481529060010190602001808311610c3e57829003601f168201915b5050505050905090565b600080610c70610e3f565b90506000610c7e8286610cff565b905083811015610cc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cba90611d3a565b60405180910390fd5b610cd08286868403610e47565b60019250505092915050565b600080610ce7610e3f565b9050610cf481858561109c565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000610d9233836107f6565b905060008111610dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dce90611da6565b60405180910390fd5b610de1338361133e565b610deb33826113f1565b3373ffffffffffffffffffffffffffffffffffffffff167ff80b6d248ca65e589d3f24c7ce36e2df22ba16ba4e7656aad67e114abbe971d28284604051610e33929190611b0f565b60405180910390a25050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610eb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ead90611e38565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1c90611eca565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516110039190611721565b60405180910390a3505050565b600061101c8484610cff565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146110965781811015611088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107f90611f36565b60405180910390fd5b6110958484848403610e47565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361110b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110290611fc8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361117a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111719061205a565b60405180910390fd5b611185838383611547565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561120b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611202906120ec565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516112f99190611721565b60405180910390a361130c84848461154c565b50505050565b60008183611320919061210c565b905092915050565b60008183611336919061214e565b905092915050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060006113ca84846107f6565b905080826001018190555050505050565b600081836113e99190611955565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611460576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611457906121ce565b60405180910390fd5b61146c60008383611547565b806002600082825461147e9190611955565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161152f9190611721565b60405180910390a36115436000838361154c565b5050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561158b578082015181840152602081019050611570565b60008484015250505050565b6000601f19601f8301169050919050565b60006115b382611551565b6115bd818561155c565b93506115cd81856020860161156d565b6115d681611597565b840191505092915050565b600060208201905081810360008301526115fb81846115a8565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061163382611608565b9050919050565b61164381611628565b811461164e57600080fd5b50565b6000813590506116608161163a565b92915050565b6000819050919050565b61167981611666565b811461168457600080fd5b50565b60008135905061169681611670565b92915050565b600080604083850312156116b3576116b2611603565b5b60006116c185828601611651565b92505060206116d285828601611687565b9150509250929050565b60008115159050919050565b6116f1816116dc565b82525050565b600060208201905061170c60008301846116e8565b92915050565b61171b81611666565b82525050565b60006020820190506117366000830184611712565b92915050565b60008060006060848603121561175557611754611603565b5b600061176386828701611651565b935050602061177486828701611651565b925050604061178586828701611687565b9150509250925092565b600060ff82169050919050565b6117a58161178f565b82525050565b60006020820190506117c0600083018461179c565b92915050565b6000806000606084860312156117df576117de611603565b5b60006117ed86828701611687565b93505060206117fe86828701611687565b925050604061180f86828701611651565b9150509250925092565b60006020828403121561182f5761182e611603565b5b600061183d84828501611651565b91505092915050565b6000806040838503121561185d5761185c611603565b5b600061186b85828601611651565b925050602061187c85828601611651565b9150509250929050565b6000806040838503121561189d5761189c611603565b5b60006118ab85828601611687565b92505060206118bc85828601611651565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061190d57607f821691505b6020821081036119205761191f6118c6565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061196082611666565b915061196b83611666565b925082820190508082111561198357611982611926565b5b92915050565b6000815190506119988161163a565b92915050565b6000602082840312156119b4576119b3611603565b5b60006119c284828501611989565b91505092915050565b7f4f6e6c7920746f6b656e206f776e65722063616e20637265617465206f66666560008201527f72732e0000000000000000000000000000000000000000000000000000000000602082015250565b6000611a2760238361155c565b9150611a32826119cb565b604082019050919050565b60006020820190508181036000830152611a5681611a1a565b9050919050565b7f5072696365206d7573742062652067726561746572207468616e20302e000000600082015250565b6000611a93601d8361155c565b9150611a9e82611a5d565b602082019050919050565b60006020820190508181036000830152611ac281611a86565b9050919050565b611ad281611628565b82525050565b6000606082019050611aed6000830186611ac9565b611afa6020830185611ac9565b611b076040830184611712565b949350505050565b6000604082019050611b246000830185611712565b611b316020830184611ac9565b9392505050565b7f5374616b696e6720616d6f756e74206d7573742062652067726561746572207460008201527f68616e20302e0000000000000000000000000000000000000000000000000000602082015250565b6000611b9460268361155c565b9150611b9f82611b38565b604082019050919050565b60006020820190508181036000830152611bc381611b87565b9050919050565b7f556e7374616b696e6720616d6f756e74206d7573742062652061626f7665207a60008201527f65726f2e00000000000000000000000000000000000000000000000000000000602082015250565b6000611c2660248361155c565b9150611c3182611bca565b604082019050919050565b60006020820190508181036000830152611c5581611c19565b9050919050565b7f496e73756666696369656e74207374616b65642062616c616e63652e00000000600082015250565b6000611c92601c8361155c565b9150611c9d82611c5c565b602082019050919050565b60006020820190508181036000830152611cc181611c85565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000611d2460258361155c565b9150611d2f82611cc8565b604082019050919050565b60006020820190508181036000830152611d5381611d17565b9050919050565b7f4e6f207265776172647320746f20636c61696d2e000000000000000000000000600082015250565b6000611d9060148361155c565b9150611d9b82611d5a565b602082019050919050565b60006020820190508181036000830152611dbf81611d83565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000611e2260248361155c565b9150611e2d82611dc6565b604082019050919050565b60006020820190508181036000830152611e5181611e15565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000611eb460228361155c565b9150611ebf82611e58565b604082019050919050565b60006020820190508181036000830152611ee381611ea7565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000611f20601d8361155c565b9150611f2b82611eea565b602082019050919050565b60006020820190508181036000830152611f4f81611f13565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000611fb260258361155c565b9150611fbd82611f56565b604082019050919050565b60006020820190508181036000830152611fe181611fa5565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061204460238361155c565b915061204f82611fe8565b604082019050919050565b6000602082019050818103600083015261207381612037565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006120d660268361155c565b91506120e18261207a565b604082019050919050565b60006020820190508181036000830152612105816120c9565b9050919050565b600061211782611666565b915061212283611666565b925082820261213081611666565b9150828204841483151761214757612146611926565b5b5092915050565b600061215982611666565b915061216483611666565b925082820390508181111561217c5761217b611926565b5b92915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006121b8601f8361155c565b91506121c382612182565b602082019050919050565b600060208201905081810360008301526121e7816121ab565b905091905056fea26469706673582212202ae4e87c6da1f8d49f1bd26ac1f3351d40360efed1ea9d212976995ed5c8610964736f6c63430008120033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101005760003560e01c80637a27db5711610097578063a457c2d711610066578063a457c2d7146102c1578063a9059cbb146102f1578063dd62ed3e14610321578063ef5cfb8c1461035157610100565b80637a27db571461023b5780637acb77571461026b5780638381e1821461028757806395d89b41146102a357610100565b8063313ce567116100d3578063313ce567146101a157806339509351146101bf57806366b6aff6146101ef57806370a082311461020b57610100565b806306fdde0314610105578063095ea7b31461012357806318160ddd1461015357806323b872dd14610171575b600080fd5b61010d61036d565b60405161011a91906115e1565b60405180910390f35b61013d6004803603810190610138919061169c565b6103ff565b60405161014a91906116f7565b60405180910390f35b61015b610422565b6040516101689190611721565b60405180910390f35b61018b6004803603810190610186919061173c565b61042c565b60405161019891906116f7565b60405180910390f35b6101a961045b565b6040516101b691906117ab565b60405180910390f35b6101d960048036038101906101d4919061169c565b610464565b6040516101e691906116f7565b60405180910390f35b610209600480360381019061020491906117c6565b61049b565b005b61022560048036038101906102209190611819565b6107ae565b6040516102329190611721565b60405180910390f35b61025560048036038101906102509190611846565b6107f6565b6040516102629190611721565b60405180910390f35b61028560048036038101906102809190611886565b6108be565b005b6102a1600480360381019061029c9190611886565b610a25565b005b6102ab610bd3565b6040516102b891906115e1565b60405180910390f35b6102db60048036038101906102d6919061169c565b610c65565b6040516102e891906116f7565b60405180910390f35b61030b6004803603810190610306919061169c565b610cdc565b60405161031891906116f7565b60405180910390f35b61033b60048036038101906103369190611846565b610cff565b6040516103489190611721565b60405180910390f35b61036b60048036038101906103669190611819565b610d86565b005b60606003805461037c906118f5565b80601f01602080910402602001604051908101604052809291908181526020018280546103a8906118f5565b80156103f55780601f106103ca576101008083540402835291602001916103f5565b820191906000526020600020905b8154815290600101906020018083116103d857829003601f168201915b5050505050905090565b60008061040a610e3f565b9050610417818585610e47565b600191505092915050565b6000600254905090565b600080610437610e3f565b9050610444858285611010565b61044f85858561109c565b60019150509392505050565b60006012905090565b60008061046f610e3f565b90506104908185856104818589610cff565b61048b9190611955565b610e47565b600191505092915050565b60008190503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e866040518263ffffffff1660e01b81526004016104f09190611721565b602060405180830381865afa15801561050d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610531919061199e565b73ffffffffffffffffffffffffffffffffffffffff1614610587576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161057e90611a3d565b60405180910390fd5b600083116105ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105c190611aa9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330876040518463ffffffff1660e01b815260040161060793929190611ad8565b600060405180830381600087803b15801561062157600080fd5b505af1158015610635573d6000803e3d6000fd5b5050505060405180608001604052806001151581526020018481526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff168152506007600086815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050503373ffffffffffffffffffffffffffffffffffffffff16847f050e8c2a38075fa43aee93e14a824a2cceb2ec68b4cd1c9ec61782390ba1c0c485856040516107a0929190611b0f565b60405180910390a350505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600080600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816000015490506000826001015490506108b3816108a564e8d4a510008561131290919063ffffffff16565b61132890919063ffffffff16565b935050505092915050565b60008211610901576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f890611baa565b60405180910390fd5b61090c33308461109c565b6000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050610996338361133e565b6109ad8382600001546113db90919063ffffffff16565b81600001819055506109ca836006546113db90919063ffffffff16565b6006819055503373ffffffffffffffffffffffffffffffffffffffff167f9f9e4044c5742cca66ca090b21552bac14645e68bad7a92364a9d9ff18111a1c8484604051610a18929190611b0f565b60405180910390a2505050565b6000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008311610ae8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610adf90611c3c565b60405180910390fd5b8281600001541015610b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2690611ca8565b60405180910390fd5b610b39338361133e565b610b5083826000015461132890919063ffffffff16565b8160000181905550610b6d8360065461132890919063ffffffff16565b600681905550610b7e30338561109c565b3373ffffffffffffffffffffffffffffffffffffffff167fe85b7860587d17eba1b921a125cf25732cd9e64d1516f196df3c9c8fb8d513f38484604051610bc6929190611b0f565b60405180910390a2505050565b606060048054610be2906118f5565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0e906118f5565b8015610c5b5780601f10610c3057610100808354040283529160200191610c5b565b820191906000526020600020905b815481529060010190602001808311610c3e57829003601f168201915b5050505050905090565b600080610c70610e3f565b90506000610c7e8286610cff565b905083811015610cc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cba90611d3a565b60405180910390fd5b610cd08286868403610e47565b60019250505092915050565b600080610ce7610e3f565b9050610cf481858561109c565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000610d9233836107f6565b905060008111610dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dce90611da6565b60405180910390fd5b610de1338361133e565b610deb33826113f1565b3373ffffffffffffffffffffffffffffffffffffffff167ff80b6d248ca65e589d3f24c7ce36e2df22ba16ba4e7656aad67e114abbe971d28284604051610e33929190611b0f565b60405180910390a25050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610eb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ead90611e38565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1c90611eca565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516110039190611721565b60405180910390a3505050565b600061101c8484610cff565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146110965781811015611088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107f90611f36565b60405180910390fd5b6110958484848403610e47565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361110b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110290611fc8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361117a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111719061205a565b60405180910390fd5b611185838383611547565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561120b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611202906120ec565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516112f99190611721565b60405180910390a361130c84848461154c565b50505050565b60008183611320919061210c565b905092915050565b60008183611336919061214e565b905092915050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060006113ca84846107f6565b905080826001018190555050505050565b600081836113e99190611955565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611460576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611457906121ce565b60405180910390fd5b61146c60008383611547565b806002600082825461147e9190611955565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161152f9190611721565b60405180910390a36115436000838361154c565b5050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561158b578082015181840152602081019050611570565b60008484015250505050565b6000601f19601f8301169050919050565b60006115b382611551565b6115bd818561155c565b93506115cd81856020860161156d565b6115d681611597565b840191505092915050565b600060208201905081810360008301526115fb81846115a8565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061163382611608565b9050919050565b61164381611628565b811461164e57600080fd5b50565b6000813590506116608161163a565b92915050565b6000819050919050565b61167981611666565b811461168457600080fd5b50565b60008135905061169681611670565b92915050565b600080604083850312156116b3576116b2611603565b5b60006116c185828601611651565b92505060206116d285828601611687565b9150509250929050565b60008115159050919050565b6116f1816116dc565b82525050565b600060208201905061170c60008301846116e8565b92915050565b61171b81611666565b82525050565b60006020820190506117366000830184611712565b92915050565b60008060006060848603121561175557611754611603565b5b600061176386828701611651565b935050602061177486828701611651565b925050604061178586828701611687565b9150509250925092565b600060ff82169050919050565b6117a58161178f565b82525050565b60006020820190506117c0600083018461179c565b92915050565b6000806000606084860312156117df576117de611603565b5b60006117ed86828701611687565b93505060206117fe86828701611687565b925050604061180f86828701611651565b9150509250925092565b60006020828403121561182f5761182e611603565b5b600061183d84828501611651565b91505092915050565b6000806040838503121561185d5761185c611603565b5b600061186b85828601611651565b925050602061187c85828601611651565b9150509250929050565b6000806040838503121561189d5761189c611603565b5b60006118ab85828601611687565b92505060206118bc85828601611651565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061190d57607f821691505b6020821081036119205761191f6118c6565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061196082611666565b915061196b83611666565b925082820190508082111561198357611982611926565b5b92915050565b6000815190506119988161163a565b92915050565b6000602082840312156119b4576119b3611603565b5b60006119c284828501611989565b91505092915050565b7f4f6e6c7920746f6b656e206f776e65722063616e20637265617465206f66666560008201527f72732e0000000000000000000000000000000000000000000000000000000000602082015250565b6000611a2760238361155c565b9150611a32826119cb565b604082019050919050565b60006020820190508181036000830152611a5681611a1a565b9050919050565b7f5072696365206d7573742062652067726561746572207468616e20302e000000600082015250565b6000611a93601d8361155c565b9150611a9e82611a5d565b602082019050919050565b60006020820190508181036000830152611ac281611a86565b9050919050565b611ad281611628565b82525050565b6000606082019050611aed6000830186611ac9565b611afa6020830185611ac9565b611b076040830184611712565b949350505050565b6000604082019050611b246000830185611712565b611b316020830184611ac9565b9392505050565b7f5374616b696e6720616d6f756e74206d7573742062652067726561746572207460008201527f68616e20302e0000000000000000000000000000000000000000000000000000602082015250565b6000611b9460268361155c565b9150611b9f82611b38565b604082019050919050565b60006020820190508181036000830152611bc381611b87565b9050919050565b7f556e7374616b696e6720616d6f756e74206d7573742062652061626f7665207a60008201527f65726f2e00000000000000000000000000000000000000000000000000000000602082015250565b6000611c2660248361155c565b9150611c3182611bca565b604082019050919050565b60006020820190508181036000830152611c5581611c19565b9050919050565b7f496e73756666696369656e74207374616b65642062616c616e63652e00000000600082015250565b6000611c92601c8361155c565b9150611c9d82611c5c565b602082019050919050565b60006020820190508181036000830152611cc181611c85565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000611d2460258361155c565b9150611d2f82611cc8565b604082019050919050565b60006020820190508181036000830152611d5381611d17565b9050919050565b7f4e6f207265776172647320746f20636c61696d2e000000000000000000000000600082015250565b6000611d9060148361155c565b9150611d9b82611d5a565b602082019050919050565b60006020820190508181036000830152611dbf81611d83565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000611e2260248361155c565b9150611e2d82611dc6565b604082019050919050565b60006020820190508181036000830152611e5181611e15565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000611eb460228361155c565b9150611ebf82611e58565b604082019050919050565b60006020820190508181036000830152611ee381611ea7565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000611f20601d8361155c565b9150611f2b82611eea565b602082019050919050565b60006020820190508181036000830152611f4f81611f13565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000611fb260258361155c565b9150611fbd82611f56565b604082019050919050565b60006020820190508181036000830152611fe181611fa5565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061204460238361155c565b915061204f82611fe8565b604082019050919050565b6000602082019050818103600083015261207381612037565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006120d660268361155c565b91506120e18261207a565b604082019050919050565b60006020820190508181036000830152612105816120c9565b9050919050565b600061211782611666565b915061212283611666565b925082820261213081611666565b9150828204841483151761214757612146611926565b5b5092915050565b600061215982611666565b915061216483611666565b925082820390508181111561217c5761217b611926565b5b92915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006121b8601f8361155c565b91506121c382612182565b602082019050919050565b600060208201905081810360008301526121e7816121ab565b905091905056fea26469706673582212202ae4e87c6da1f8d49f1bd26ac1f3351d40360efed1ea9d212976995ed5c8610964736f6c63430008120033

Deployed Bytecode Sourcemap

30962:4505:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13692:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16043:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14812:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16824:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14654:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17528:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32465:670;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14983:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35087:377;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33237:516;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33761:599;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13911:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18269:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15316:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15572:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34368:401;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13692:100;13746:13;13779:5;13772:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13692:100;:::o;16043:201::-;16126:4;16143:13;16159:12;:10;:12::i;:::-;16143:28;;16182:32;16191:5;16198:7;16207:6;16182:8;:32::i;:::-;16232:4;16225:11;;;16043:201;;;;:::o;14812:108::-;14873:7;14900:12;;14893:19;;14812:108;:::o;16824:295::-;16955:4;16972:15;16990:12;:10;:12::i;:::-;16972:30;;17013:38;17029:4;17035:7;17044:6;17013:15;:38::i;:::-;17062:27;17072:4;17078:2;17082:6;17062:9;:27::i;:::-;17107:4;17100:11;;;16824:295;;;;;:::o;14654:93::-;14712:5;14737:2;14730:9;;14654:93;:::o;17528:238::-;17616:4;17633:13;17649:12;:10;:12::i;:::-;17633:28;;17672:64;17681:5;17688:7;17725:10;17697:25;17707:5;17714:7;17697:9;:25::i;:::-;:38;;;;:::i;:::-;17672:8;:64::i;:::-;17754:4;17747:11;;;17528:238;;;;:::o;32465:670::-;32566:19;32596:18;32566:49;;32666:10;32634:42;;:11;:19;;;32654:7;32634:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;;;32626:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;32743:1;32735:5;:9;32727:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;32791:11;:24;;;32816:10;32836:4;32843:7;32791:60;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32888:161;;;;;;;;32920:4;32888:161;;;;;;32946:5;32888:161;;;;32974:10;32888:161;;;;;;33019:18;32888:161;;;;;32864:12;:21;32877:7;32864:21;;;;;;;;;;;:185;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33096:10;33067:60;;33080:7;33067:60;33089:5;33108:18;33067:60;;;;;;;:::i;:::-;;;;;;;;32555:580;32465:670;;;:::o;14983:127::-;15057:7;15084:9;:18;15094:7;15084:18;;;;;;;;;;;;;;;;15077:25;;14983:127;;;:::o;35087:377::-;35186:7;35206:21;35230:8;:23;35239:13;35230:23;;;;;;;;;;;;;;;:43;35254:18;35230:43;;;;;;;;;;;;;;;35206:67;;35284:20;35307:6;:19;;;35284:42;;35337:22;35362:6;:17;;;35337:42;;35399:57;35441:14;35399:37;31228:4;35399:12;:16;;:37;;;;:::i;:::-;:41;;:57;;;;:::i;:::-;35392:64;;;;;35087:377;;;;:::o;33237:516::-;33333:1;33324:6;:10;33316:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33388:44;33398:10;33418:4;33425:6;33388:9;:44::i;:::-;33443:21;33467:8;:20;33476:10;33467:20;;;;;;;;;;;;;;;:40;33488:18;33467:40;;;;;;;;;;;;;;;33443:64;;33520:45;33534:10;33546:18;33520:13;:45::i;:::-;33600:31;33624:6;33600;:19;;;:23;;:31;;;;:::i;:::-;33578:6;:19;;:53;;;;33657:24;33674:6;33657:12;;:16;;:24;;;;:::i;:::-;33642:12;:39;;;;33706:10;33699:46;;;33718:6;33726:18;33699:46;;;;;;;:::i;:::-;;;;;;;;33305:448;33237:516;;:::o;33761:599::-;33842:21;33866:8;:20;33875:10;33866:20;;;;;;;;;;;;;;;:40;33887:18;33866:40;;;;;;;;;;;;;;;33842:64;;33934:1;33925:6;:10;33917:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;34018:6;33995;:19;;;:29;;33987:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;34070:45;34084:10;34096:18;34070:13;:45::i;:::-;34150:31;34174:6;34150;:19;;;:23;;:31;;;;:::i;:::-;34128:6;:19;;:53;;;;34207:24;34224:6;34207:12;;:16;;:24;;;;:::i;:::-;34192:12;:39;;;;34242:44;34260:4;34267:10;34279:6;34242:9;:44::i;:::-;34313:10;34304:48;;;34325:6;34333:18;34304:48;;;;;;;:::i;:::-;;;;;;;;33831:529;33761:599;;:::o;13911:104::-;13967:13;14000:7;13993:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13911:104;:::o;18269:436::-;18362:4;18379:13;18395:12;:10;:12::i;:::-;18379:28;;18418:24;18445:25;18455:5;18462:7;18445:9;:25::i;:::-;18418:52;;18509:15;18489:16;:35;;18481:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;18602:60;18611:5;18618:7;18646:15;18627:16;:34;18602:8;:60::i;:::-;18693:4;18686:11;;;;18269:436;;;;:::o;15316:193::-;15395:4;15412:13;15428:12;:10;:12::i;:::-;15412:28;;15451;15461:5;15468:2;15472:6;15451:9;:28::i;:::-;15497:4;15490:11;;;15316:193;;;;:::o;15572:151::-;15661:7;15688:11;:18;15700:5;15688:18;;;;;;;;;;;;;;;:27;15707:7;15688:27;;;;;;;;;;;;;;;;15681:34;;15572:151;;;;:::o;34368:401::-;34438:21;34462:49;34480:10;34492:18;34462:17;:49::i;:::-;34438:73;;34546:1;34530:13;:17;34522:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;34585:45;34599:10;34611:18;34585:13;:45::i;:::-;34651:32;34657:10;34669:13;34651:5;:32::i;:::-;34715:10;34701:60;;;34727:13;34742:18;34701:60;;;;;;;:::i;:::-;;;;;;;;34427:342;34368:401;:::o;7720:98::-;7773:7;7800:10;7793:17;;7720:98;:::o;22296:380::-;22449:1;22432:19;;:5;:19;;;22424:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22530:1;22511:21;;:7;:21;;;22503:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22614:6;22584:11;:18;22596:5;22584:18;;;;;;;;;;;;;;;:27;22603:7;22584:27;;;;;;;;;;;;;;;:36;;;;22652:7;22636:32;;22645:5;22636:32;;;22661:6;22636:32;;;;;;:::i;:::-;;;;;;;;22296:380;;;:::o;22967:453::-;23102:24;23129:25;23139:5;23146:7;23129:9;:25::i;:::-;23102:52;;23189:17;23169:16;:37;23165:248;;23251:6;23231:16;:26;;23223:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23335:51;23344:5;23351:7;23379:6;23360:16;:25;23335:8;:51::i;:::-;23165:248;23091:329;22967:453;;;:::o;19175:840::-;19322:1;19306:18;;:4;:18;;;19298:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19399:1;19385:16;;:2;:16;;;19377:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;19454:38;19475:4;19481:2;19485:6;19454:20;:38::i;:::-;19505:19;19527:9;:15;19537:4;19527:15;;;;;;;;;;;;;;;;19505:37;;19576:6;19561:11;:21;;19553:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;19693:6;19679:11;:20;19661:9;:15;19671:4;19661:15;;;;;;;;;;;;;;;:38;;;;19896:6;19879:9;:13;19889:2;19879:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;19946:2;19931:26;;19940:4;19931:26;;;19950:6;19931:26;;;;;;:::i;:::-;;;;;;;;19970:37;19990:4;19996:2;20000:6;19970:19;:37::i;:::-;19287:728;19175:840;;;:::o;3614:98::-;3672:7;3703:1;3699;:5;;;;:::i;:::-;3692:12;;3614:98;;;;:::o;3257:::-;3315:7;3346:1;3342;:5;;;;:::i;:::-;3335:12;;3257:98;;;;:::o;34777:302::-;34871:21;34895:8;:23;34904:13;34895:23;;;;;;;;;;;;;;;:43;34919:18;34895:43;;;;;;;;;;;;;;;34871:67;;34949:21;34973:52;34991:13;35006:18;34973:17;:52::i;:::-;34949:76;;35058:13;35038:6;:17;;:33;;;;34860:219;;34777:302;;:::o;2876:98::-;2934:7;2965:1;2961;:5;;;;:::i;:::-;2954:12;;2876:98;;;;:::o;20302:548::-;20405:1;20386:21;;:7;:21;;;20378:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;20456:49;20485:1;20489:7;20498:6;20456:20;:49::i;:::-;20534:6;20518:12;;:22;;;;;;;:::i;:::-;;;;;;;;20711:6;20689:9;:18;20699:7;20689:18;;;;;;;;;;;;;;;;:28;;;;;;;;;;;20765:7;20744:37;;20761:1;20744:37;;;20774:6;20744:37;;;;;;:::i;:::-;;;;;;;;20794:48;20822:1;20826:7;20835:6;20794:19;:48::i;:::-;20302:548;;:::o;24020:125::-;;;;:::o;24749:124::-;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1430:117::-;1539:1;1536;1529:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:118::-;3533:24;3551:5;3533:24;:::i;:::-;3528:3;3521:37;3446:118;;:::o;3570:222::-;3663:4;3701:2;3690:9;3686:18;3678:26;;3714:71;3782:1;3771:9;3767:17;3758:6;3714:71;:::i;:::-;3570:222;;;;:::o;3798:619::-;3875:6;3883;3891;3940:2;3928:9;3919:7;3915:23;3911:32;3908:119;;;3946:79;;:::i;:::-;3908:119;4066:1;4091:53;4136:7;4127:6;4116:9;4112:22;4091:53;:::i;:::-;4081:63;;4037:117;4193:2;4219:53;4264:7;4255:6;4244:9;4240:22;4219:53;:::i;:::-;4209:63;;4164:118;4321:2;4347:53;4392:7;4383:6;4372:9;4368:22;4347:53;:::i;:::-;4337:63;;4292:118;3798:619;;;;;:::o;4423:86::-;4458:7;4498:4;4491:5;4487:16;4476:27;;4423:86;;;:::o;4515:112::-;4598:22;4614:5;4598:22;:::i;:::-;4593:3;4586:35;4515:112;;:::o;4633:214::-;4722:4;4760:2;4749:9;4745:18;4737:26;;4773:67;4837:1;4826:9;4822:17;4813:6;4773:67;:::i;:::-;4633:214;;;;:::o;4853:619::-;4930:6;4938;4946;4995:2;4983:9;4974:7;4970:23;4966:32;4963:119;;;5001:79;;:::i;:::-;4963:119;5121:1;5146:53;5191:7;5182:6;5171:9;5167:22;5146:53;:::i;:::-;5136:63;;5092:117;5248:2;5274:53;5319:7;5310:6;5299:9;5295:22;5274:53;:::i;:::-;5264:63;;5219:118;5376:2;5402:53;5447:7;5438:6;5427:9;5423:22;5402:53;:::i;:::-;5392:63;;5347:118;4853:619;;;;;:::o;5478:329::-;5537:6;5586:2;5574:9;5565:7;5561:23;5557:32;5554:119;;;5592:79;;:::i;:::-;5554:119;5712:1;5737:53;5782:7;5773:6;5762:9;5758:22;5737:53;:::i;:::-;5727:63;;5683:117;5478:329;;;;:::o;5813:474::-;5881:6;5889;5938:2;5926:9;5917:7;5913:23;5909:32;5906:119;;;5944:79;;:::i;:::-;5906:119;6064:1;6089:53;6134:7;6125:6;6114:9;6110:22;6089:53;:::i;:::-;6079:63;;6035:117;6191:2;6217:53;6262:7;6253:6;6242:9;6238:22;6217:53;:::i;:::-;6207:63;;6162:118;5813:474;;;;;:::o;6293:::-;6361:6;6369;6418:2;6406:9;6397:7;6393:23;6389:32;6386:119;;;6424:79;;:::i;:::-;6386:119;6544:1;6569:53;6614:7;6605:6;6594:9;6590:22;6569:53;:::i;:::-;6559:63;;6515:117;6671:2;6697:53;6742:7;6733:6;6722:9;6718:22;6697:53;:::i;:::-;6687:63;;6642:118;6293:474;;;;;:::o;6773:180::-;6821:77;6818:1;6811:88;6918:4;6915:1;6908:15;6942:4;6939:1;6932:15;6959:320;7003:6;7040:1;7034:4;7030:12;7020:22;;7087:1;7081:4;7077:12;7108:18;7098:81;;7164:4;7156:6;7152:17;7142:27;;7098:81;7226:2;7218:6;7215:14;7195:18;7192:38;7189:84;;7245:18;;:::i;:::-;7189:84;7010:269;6959:320;;;:::o;7285:180::-;7333:77;7330:1;7323:88;7430:4;7427:1;7420:15;7454:4;7451:1;7444:15;7471:191;7511:3;7530:20;7548:1;7530:20;:::i;:::-;7525:25;;7564:20;7582:1;7564:20;:::i;:::-;7559:25;;7607:1;7604;7600:9;7593:16;;7628:3;7625:1;7622:10;7619:36;;;7635:18;;:::i;:::-;7619:36;7471:191;;;;:::o;7668:143::-;7725:5;7756:6;7750:13;7741:22;;7772:33;7799:5;7772:33;:::i;:::-;7668:143;;;;:::o;7817:351::-;7887:6;7936:2;7924:9;7915:7;7911:23;7907:32;7904:119;;;7942:79;;:::i;:::-;7904:119;8062:1;8087:64;8143:7;8134:6;8123:9;8119:22;8087:64;:::i;:::-;8077:74;;8033:128;7817:351;;;;:::o;8174:222::-;8314:34;8310:1;8302:6;8298:14;8291:58;8383:5;8378:2;8370:6;8366:15;8359:30;8174:222;:::o;8402:366::-;8544:3;8565:67;8629:2;8624:3;8565:67;:::i;:::-;8558:74;;8641:93;8730:3;8641:93;:::i;:::-;8759:2;8754:3;8750:12;8743:19;;8402:366;;;:::o;8774:419::-;8940:4;8978:2;8967:9;8963:18;8955:26;;9027:9;9021:4;9017:20;9013:1;9002:9;8998:17;8991:47;9055:131;9181:4;9055:131;:::i;:::-;9047:139;;8774:419;;;:::o;9199:179::-;9339:31;9335:1;9327:6;9323:14;9316:55;9199:179;:::o;9384:366::-;9526:3;9547:67;9611:2;9606:3;9547:67;:::i;:::-;9540:74;;9623:93;9712:3;9623:93;:::i;:::-;9741:2;9736:3;9732:12;9725:19;;9384:366;;;:::o;9756:419::-;9922:4;9960:2;9949:9;9945:18;9937:26;;10009:9;10003:4;9999:20;9995:1;9984:9;9980:17;9973:47;10037:131;10163:4;10037:131;:::i;:::-;10029:139;;9756:419;;;:::o;10181:118::-;10268:24;10286:5;10268:24;:::i;:::-;10263:3;10256:37;10181:118;;:::o;10305:442::-;10454:4;10492:2;10481:9;10477:18;10469:26;;10505:71;10573:1;10562:9;10558:17;10549:6;10505:71;:::i;:::-;10586:72;10654:2;10643:9;10639:18;10630:6;10586:72;:::i;:::-;10668;10736:2;10725:9;10721:18;10712:6;10668:72;:::i;:::-;10305:442;;;;;;:::o;10753:332::-;10874:4;10912:2;10901:9;10897:18;10889:26;;10925:71;10993:1;10982:9;10978:17;10969:6;10925:71;:::i;:::-;11006:72;11074:2;11063:9;11059:18;11050:6;11006:72;:::i;:::-;10753:332;;;;;:::o;11091:225::-;11231:34;11227:1;11219:6;11215:14;11208:58;11300:8;11295:2;11287:6;11283:15;11276:33;11091:225;:::o;11322:366::-;11464:3;11485:67;11549:2;11544:3;11485:67;:::i;:::-;11478:74;;11561:93;11650:3;11561:93;:::i;:::-;11679:2;11674:3;11670:12;11663:19;;11322:366;;;:::o;11694:419::-;11860:4;11898:2;11887:9;11883:18;11875:26;;11947:9;11941:4;11937:20;11933:1;11922:9;11918:17;11911:47;11975:131;12101:4;11975:131;:::i;:::-;11967:139;;11694:419;;;:::o;12119:223::-;12259:34;12255:1;12247:6;12243:14;12236:58;12328:6;12323:2;12315:6;12311:15;12304:31;12119:223;:::o;12348:366::-;12490:3;12511:67;12575:2;12570:3;12511:67;:::i;:::-;12504:74;;12587:93;12676:3;12587:93;:::i;:::-;12705:2;12700:3;12696:12;12689:19;;12348:366;;;:::o;12720:419::-;12886:4;12924:2;12913:9;12909:18;12901:26;;12973:9;12967:4;12963:20;12959:1;12948:9;12944:17;12937:47;13001:131;13127:4;13001:131;:::i;:::-;12993:139;;12720:419;;;:::o;13145:178::-;13285:30;13281:1;13273:6;13269:14;13262:54;13145:178;:::o;13329:366::-;13471:3;13492:67;13556:2;13551:3;13492:67;:::i;:::-;13485:74;;13568:93;13657:3;13568:93;:::i;:::-;13686:2;13681:3;13677:12;13670:19;;13329:366;;;:::o;13701:419::-;13867:4;13905:2;13894:9;13890:18;13882:26;;13954:9;13948:4;13944:20;13940:1;13929:9;13925:17;13918:47;13982:131;14108:4;13982:131;:::i;:::-;13974:139;;13701:419;;;:::o;14126:224::-;14266:34;14262:1;14254:6;14250:14;14243:58;14335:7;14330:2;14322:6;14318:15;14311:32;14126:224;:::o;14356:366::-;14498:3;14519:67;14583:2;14578:3;14519:67;:::i;:::-;14512:74;;14595:93;14684:3;14595:93;:::i;:::-;14713:2;14708:3;14704:12;14697:19;;14356:366;;;:::o;14728:419::-;14894:4;14932:2;14921:9;14917:18;14909:26;;14981:9;14975:4;14971:20;14967:1;14956:9;14952:17;14945:47;15009:131;15135:4;15009:131;:::i;:::-;15001:139;;14728:419;;;:::o;15153:170::-;15293:22;15289:1;15281:6;15277:14;15270:46;15153:170;:::o;15329:366::-;15471:3;15492:67;15556:2;15551:3;15492:67;:::i;:::-;15485:74;;15568:93;15657:3;15568:93;:::i;:::-;15686:2;15681:3;15677:12;15670:19;;15329:366;;;:::o;15701:419::-;15867:4;15905:2;15894:9;15890:18;15882:26;;15954:9;15948:4;15944:20;15940:1;15929:9;15925:17;15918:47;15982:131;16108:4;15982:131;:::i;:::-;15974:139;;15701:419;;;:::o;16126:223::-;16266:34;16262:1;16254:6;16250:14;16243:58;16335:6;16330:2;16322:6;16318:15;16311:31;16126:223;:::o;16355:366::-;16497:3;16518:67;16582:2;16577:3;16518:67;:::i;:::-;16511:74;;16594:93;16683:3;16594:93;:::i;:::-;16712:2;16707:3;16703:12;16696:19;;16355:366;;;:::o;16727:419::-;16893:4;16931:2;16920:9;16916:18;16908:26;;16980:9;16974:4;16970:20;16966:1;16955:9;16951:17;16944:47;17008:131;17134:4;17008:131;:::i;:::-;17000:139;;16727:419;;;:::o;17152:221::-;17292:34;17288:1;17280:6;17276:14;17269:58;17361:4;17356:2;17348:6;17344:15;17337:29;17152:221;:::o;17379:366::-;17521:3;17542:67;17606:2;17601:3;17542:67;:::i;:::-;17535:74;;17618:93;17707:3;17618:93;:::i;:::-;17736:2;17731:3;17727:12;17720:19;;17379:366;;;:::o;17751:419::-;17917:4;17955:2;17944:9;17940:18;17932:26;;18004:9;17998:4;17994:20;17990:1;17979:9;17975:17;17968:47;18032:131;18158:4;18032:131;:::i;:::-;18024:139;;17751:419;;;:::o;18176:179::-;18316:31;18312:1;18304:6;18300:14;18293:55;18176:179;:::o;18361:366::-;18503:3;18524:67;18588:2;18583:3;18524:67;:::i;:::-;18517:74;;18600:93;18689:3;18600:93;:::i;:::-;18718:2;18713:3;18709:12;18702:19;;18361:366;;;:::o;18733:419::-;18899:4;18937:2;18926:9;18922:18;18914:26;;18986:9;18980:4;18976:20;18972:1;18961:9;18957:17;18950:47;19014:131;19140:4;19014:131;:::i;:::-;19006:139;;18733:419;;;:::o;19158:224::-;19298:34;19294:1;19286:6;19282:14;19275:58;19367:7;19362:2;19354:6;19350:15;19343:32;19158:224;:::o;19388:366::-;19530:3;19551:67;19615:2;19610:3;19551:67;:::i;:::-;19544:74;;19627:93;19716:3;19627:93;:::i;:::-;19745:2;19740:3;19736:12;19729:19;;19388:366;;;:::o;19760:419::-;19926:4;19964:2;19953:9;19949:18;19941:26;;20013:9;20007:4;20003:20;19999:1;19988:9;19984:17;19977:47;20041:131;20167:4;20041:131;:::i;:::-;20033:139;;19760:419;;;:::o;20185:222::-;20325:34;20321:1;20313:6;20309:14;20302:58;20394:5;20389:2;20381:6;20377:15;20370:30;20185:222;:::o;20413:366::-;20555:3;20576:67;20640:2;20635:3;20576:67;:::i;:::-;20569:74;;20652:93;20741:3;20652:93;:::i;:::-;20770:2;20765:3;20761:12;20754:19;;20413:366;;;:::o;20785:419::-;20951:4;20989:2;20978:9;20974:18;20966:26;;21038:9;21032:4;21028:20;21024:1;21013:9;21009:17;21002:47;21066:131;21192:4;21066:131;:::i;:::-;21058:139;;20785:419;;;:::o;21210:225::-;21350:34;21346:1;21338:6;21334:14;21327:58;21419:8;21414:2;21406:6;21402:15;21395:33;21210:225;:::o;21441:366::-;21583:3;21604:67;21668:2;21663:3;21604:67;:::i;:::-;21597:74;;21680:93;21769:3;21680:93;:::i;:::-;21798:2;21793:3;21789:12;21782:19;;21441:366;;;:::o;21813:419::-;21979:4;22017:2;22006:9;22002:18;21994:26;;22066:9;22060:4;22056:20;22052:1;22041:9;22037:17;22030:47;22094:131;22220:4;22094:131;:::i;:::-;22086:139;;21813:419;;;:::o;22238:410::-;22278:7;22301:20;22319:1;22301:20;:::i;:::-;22296:25;;22335:20;22353:1;22335:20;:::i;:::-;22330:25;;22390:1;22387;22383:9;22412:30;22430:11;22412:30;:::i;:::-;22401:41;;22591:1;22582:7;22578:15;22575:1;22572:22;22552:1;22545:9;22525:83;22502:139;;22621:18;;:::i;:::-;22502:139;22286:362;22238:410;;;;:::o;22654:194::-;22694:4;22714:20;22732:1;22714:20;:::i;:::-;22709:25;;22748:20;22766:1;22748:20;:::i;:::-;22743:25;;22792:1;22789;22785:9;22777:17;;22816:1;22810:4;22807:11;22804:37;;;22821:18;;:::i;:::-;22804:37;22654:194;;;;:::o;22854:181::-;22994:33;22990:1;22982:6;22978:14;22971:57;22854:181;:::o;23041:366::-;23183:3;23204:67;23268:2;23263:3;23204:67;:::i;:::-;23197:74;;23280:93;23369:3;23280:93;:::i;:::-;23398:2;23393:3;23389:12;23382:19;;23041:366;;;:::o;23413:419::-;23579:4;23617:2;23606:9;23602:18;23594:26;;23666:9;23660:4;23656:20;23652:1;23641:9;23637:17;23630:47;23694:131;23820:4;23694:131;:::i;:::-;23686:139;;23413:419;;;:::o

Swarm Source

ipfs://2ae4e87c6da1f8d49f1bd26ac1f3351d40360efed1ea9d212976995ed5c86109
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.