ETH Price: $3,440.64 (-1.25%)

Token

DragoEgg (DEGG)
 

Overview

Max Total Supply

0 DEGG

Holders

95

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
grafmc.eth
Balance
2 DEGG
0xb0af9e6c8620d5031ee998eaffa7d64f6031cd5c
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:
DragoEgg

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-08
*/

pragma solidity ^0.8.0;

// SPDX-License-Identifier: MIT

// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
/**
 * @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);
}


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)
/**
 * @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 be 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: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * 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);
}


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)
/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}


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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
/**
 * @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;
    }
}


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)
/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol)
/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @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.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` 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 tokenId
    ) 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.
     * - `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 tokenId
    ) internal virtual {}
}


contract Membership is Context {
    address private owner;
    event MembershipChanged(address indexed owner, uint256 level);
    event OwnerTransferred(address indexed preOwner, address indexed newOwner);

    mapping(address => uint256) internal membership;

    constructor() {
        owner = _msgSender();
        setMembership(_msgSender(), 1);
    }

    function transferOwner(address newOwner) public onlyOwner {
        address preOwner = owner;
        setMembership(newOwner, 1);
        setMembership(preOwner, 0);
        owner = newOwner;
        emit OwnerTransferred(preOwner, newOwner);
    }

    function setMembership(address key, uint256 level) public onlyOwner {
        membership[key] = level;
        emit MembershipChanged(key, level);
    }

    modifier onlyOwner() {
        require(isOwner(), "Membership : caller is not the owner");
        _;
    }

    function isOwner() public view returns (bool) {
        return _msgSender() == owner;
    }


    modifier onlyAdmin() {
        require(isAdmin(), "Membership : caller is not a admin");
        _;
    }

    function isAdmin() public view returns (bool) {
        return membership[_msgSender()] == 1;
    }

    modifier onlyMinter() {
        require(isMinter(), "Memberhsip : caller is not a Minter");
        _;
    }

    function isMinter() public view returns (bool) {
        return isOwner() || membership[_msgSender()] == 11;
    }
    
    function getMembership(address account) public view returns (uint256){
        return membership[account];
    }
}


contract DragoEgg is ERC721, Membership {
    // constructor() ERC721("DDDE", "DDDG") {
    string baseURI;
    constructor() ERC721("DragoEgg", "DEGG") {
        setBaseURI("https://lok-nft.leagueofkingdoms.com/api/drago/egg/");
    }
    function _baseURI() internal view override returns (string memory) {
        return baseURI;
    }
    function setBaseURI(string memory uri) public onlyOwner {
        baseURI = uri;
    }
    function mint(address to, uint256 tokenId) public onlyMinter{
        _mint(to, tokenId);
    }
    function burn(uint256 tokenId) public onlyMinter{
        _burn(tokenId);
    }
}

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":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"level","type":"uint256"}],"name":"MembershipChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"preOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"key","type":"address"},{"internalType":"uint256","name":"level","type":"uint256"}],"name":"setMembership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwner","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280600881526020017f447261676f4567670000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f44454747000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000969291906200031b565b508060019080519060200190620000af9291906200031b565b505050620000c26200015460201b60201c565b600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000124620001166200015460201b60201c565b60016200015c60201b60201c565b6200014e604051806060016040528060338152602001620035e6603391396200024660201b60201c565b62000511565b600033905090565b6200016c620002b460201b60201c565b620001ae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001a59062000452565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f65efeaf737ce094d287661b6a56bb530dce1fc30853708d1912a74f8ae65ffbb826040516200023a91906200048f565b60405180910390a25050565b62000256620002b460201b60201c565b62000298576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200028f9062000452565b60405180910390fd5b8060089080519060200190620002b09291906200031b565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16620002ff6200015460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b8280546200032990620004db565b90600052602060002090601f0160209004810192826200034d576000855562000399565b82601f106200036857805160ff191683800117855562000399565b8280016001018555821562000399579182015b82811115620003985782518255916020019190600101906200037b565b5b509050620003a89190620003ac565b5090565b5b80821115620003c7576000816000905550600101620003ad565b5090565b600082825260208201905092915050565b7f4d656d62657273686970203a2063616c6c6572206973206e6f7420746865206f60008201527f776e657200000000000000000000000000000000000000000000000000000000602082015250565b60006200043a602483620003cb565b91506200044782620003dc565b604082019050919050565b600060208201905081810360008301526200046d816200042b565b9050919050565b6000819050919050565b620004898162000474565b82525050565b6000602082019050620004a660008301846200047e565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004f457607f821691505b602082108114156200050b576200050a620004ac565b5b50919050565b6130c580620005216000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c806355f804b3116100b857806395d89b411161007c57806395d89b4114610371578063a22cb4651461038f578063b6db75a0146103ab578063b88d4fde146103c9578063c87b56dd146103e5578063e985e9c51461041557610142565b806355f804b3146102bb5780636352211e146102d757806370a0823114610307578063874dae88146103375780638f32d59b1461035357610142565b806334c5a0441161010a57806334c5a044146101fd57806340c10f191461022d57806342842e0e1461024957806342966c68146102655780634fb2e45d1461028157806350e59eb31461029d57610142565b806301ffc9a71461014757806306fdde0314610177578063081812fc14610195578063095ea7b3146101c557806323b872dd146101e1575b600080fd5b610161600480360381019061015c9190611e3a565b610445565b60405161016e9190611e82565b60405180910390f35b61017f610527565b60405161018c9190611f36565b60405180910390f35b6101af60048036038101906101aa9190611f8e565b6105b9565b6040516101bc9190611ffc565b60405180910390f35b6101df60048036038101906101da9190612043565b61063e565b005b6101fb60048036038101906101f69190612083565b610756565b005b610217600480360381019061021291906120d6565b6107b6565b6040516102249190612112565b60405180910390f35b61024760048036038101906102429190612043565b6107ff565b005b610263600480360381019061025e9190612083565b610854565b005b61027f600480360381019061027a9190611f8e565b610874565b005b61029b600480360381019061029691906120d6565b6108c7565b005b6102a56109ea565b6040516102b29190611e82565b60405180910390f35b6102d560048036038101906102d09190612262565b610a4a565b005b6102f160048036038101906102ec9190611f8e565b610aab565b6040516102fe9190611ffc565b60405180910390f35b610321600480360381019061031c91906120d6565b610b5d565b60405161032e9190612112565b60405180910390f35b610351600480360381019061034c9190612043565b610c15565b005b61035b610cf2565b6040516103689190611e82565b60405180910390f35b610379610d51565b6040516103869190611f36565b60405180910390f35b6103a960048036038101906103a491906122d7565b610de3565b005b6103b3610df9565b6040516103c09190611e82565b60405180910390f35b6103e360048036038101906103de91906123b8565b610e4a565b005b6103ff60048036038101906103fa9190611f8e565b610eac565b60405161040c9190611f36565b60405180910390f35b61042f600480360381019061042a919061243b565b610f53565b60405161043c9190611e82565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061051057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610520575061051f82610fe7565b5b9050919050565b606060008054610536906124aa565b80601f0160208091040260200160405190810160405280929190818152602001828054610562906124aa565b80156105af5780601f10610584576101008083540402835291602001916105af565b820191906000526020600020905b81548152906001019060200180831161059257829003601f168201915b5050505050905090565b60006105c482611051565b610603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105fa9061254e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061064982610aab565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b1906125e0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106d96110bd565b73ffffffffffffffffffffffffffffffffffffffff1614806107085750610707816107026110bd565b610f53565b5b610747576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073e90612672565b60405180910390fd5b61075183836110c5565b505050565b6107676107616110bd565b8261117e565b6107a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079d90612704565b60405180910390fd5b6107b183838361125c565b505050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6108076109ea565b610846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083d90612796565b60405180910390fd5b61085082826114c3565b5050565b61086f83838360405180602001604052806000815250610e4a565b505050565b61087c6109ea565b6108bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b290612796565b60405180910390fd5b6108c48161169d565b50565b6108cf610cf2565b61090e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090590612828565b60405180910390fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050610940826001610c15565b61094b816000610c15565b81600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8934ce4adea8d9ce0d714d2c22b86790e41b7731c84b926fbbdc1d40ff6533c960405160405180910390a35050565b60006109f4610cf2565b80610a455750600b60076000610a086110bd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b905090565b610a52610cf2565b610a91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8890612828565b60405180910390fd5b8060089080519060200190610aa7929190611d2b565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610b54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4b906128ba565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc59061294c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610c1d610cf2565b610c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5390612828565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f65efeaf737ce094d287661b6a56bb530dce1fc30853708d1912a74f8ae65ffbb82604051610ce69190612112565b60405180910390a25050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610d356110bd565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b606060018054610d60906124aa565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8c906124aa565b8015610dd95780601f10610dae57610100808354040283529160200191610dd9565b820191906000526020600020905b815481529060010190602001808311610dbc57829003601f168201915b5050505050905090565b610df5610dee6110bd565b83836117ba565b5050565b6000600160076000610e096110bd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414905090565b610e5b610e556110bd565b8361117e565b610e9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9190612704565b60405180910390fd5b610ea684848484611927565b50505050565b6060610eb782611051565b610ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eed906129de565b60405180910390fd5b6000610f00611983565b90506000815111610f205760405180602001604052806000815250610f4b565b80610f2a84611a15565b604051602001610f3b929190612a3a565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661113883610aab565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061118982611051565b6111c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bf90612ad0565b60405180910390fd5b60006111d383610aab565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061121557506112148185610f53565b5b8061125357508373ffffffffffffffffffffffffffffffffffffffff1661123b846105b9565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661127c82610aab565b73ffffffffffffffffffffffffffffffffffffffff16146112d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c990612b62565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611342576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133990612bf4565b60405180910390fd5b61134d838383611b76565b6113586000826110c5565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113a89190612c43565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113ff9190612c77565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46114be838383611b7b565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152a90612d19565b60405180910390fd5b61153c81611051565b1561157c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157390612d85565b60405180910390fd5b61158860008383611b76565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115d89190612c77565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461169960008383611b7b565b5050565b60006116a882610aab565b90506116b681600084611b76565b6116c16000836110c5565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117119190612c43565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46117b681600084611b7b565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611829576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182090612df1565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161191a9190611e82565b60405180910390a3505050565b61193284848461125c565b61193e84848484611b80565b61197d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197490612e83565b60405180910390fd5b50505050565b606060088054611992906124aa565b80601f01602080910402602001604051908101604052809291908181526020018280546119be906124aa565b8015611a0b5780601f106119e057610100808354040283529160200191611a0b565b820191906000526020600020905b8154815290600101906020018083116119ee57829003601f168201915b5050505050905090565b60606000821415611a5d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611b71565b600082905060005b60008214611a8f578080611a7890612ea3565b915050600a82611a889190612f1b565b9150611a65565b60008167ffffffffffffffff811115611aab57611aaa612137565b5b6040519080825280601f01601f191660200182016040528015611add5781602001600182028036833780820191505090505b5090505b60008514611b6a57600182611af69190612c43565b9150600a85611b059190612f4c565b6030611b119190612c77565b60f81b818381518110611b2757611b26612f7d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611b639190612f1b565b9450611ae1565b8093505050505b919050565b505050565b505050565b6000611ba18473ffffffffffffffffffffffffffffffffffffffff16611d08565b15611cfb578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611bca6110bd565b8786866040518563ffffffff1660e01b8152600401611bec9493929190613001565b6020604051808303816000875af1925050508015611c2857506040513d601f19601f82011682018060405250810190611c259190613062565b60015b611cab573d8060008114611c58576040519150601f19603f3d011682016040523d82523d6000602084013e611c5d565b606091505b50600081511415611ca3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9a90612e83565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611d00565b600190505b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054611d37906124aa565b90600052602060002090601f016020900481019282611d595760008555611da0565b82601f10611d7257805160ff1916838001178555611da0565b82800160010185558215611da0579182015b82811115611d9f578251825591602001919060010190611d84565b5b509050611dad9190611db1565b5090565b5b80821115611dca576000816000905550600101611db2565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611e1781611de2565b8114611e2257600080fd5b50565b600081359050611e3481611e0e565b92915050565b600060208284031215611e5057611e4f611dd8565b5b6000611e5e84828501611e25565b91505092915050565b60008115159050919050565b611e7c81611e67565b82525050565b6000602082019050611e976000830184611e73565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611ed7578082015181840152602081019050611ebc565b83811115611ee6576000848401525b50505050565b6000601f19601f8301169050919050565b6000611f0882611e9d565b611f128185611ea8565b9350611f22818560208601611eb9565b611f2b81611eec565b840191505092915050565b60006020820190508181036000830152611f508184611efd565b905092915050565b6000819050919050565b611f6b81611f58565b8114611f7657600080fd5b50565b600081359050611f8881611f62565b92915050565b600060208284031215611fa457611fa3611dd8565b5b6000611fb284828501611f79565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611fe682611fbb565b9050919050565b611ff681611fdb565b82525050565b60006020820190506120116000830184611fed565b92915050565b61202081611fdb565b811461202b57600080fd5b50565b60008135905061203d81612017565b92915050565b6000806040838503121561205a57612059611dd8565b5b60006120688582860161202e565b925050602061207985828601611f79565b9150509250929050565b60008060006060848603121561209c5761209b611dd8565b5b60006120aa8682870161202e565b93505060206120bb8682870161202e565b92505060406120cc86828701611f79565b9150509250925092565b6000602082840312156120ec576120eb611dd8565b5b60006120fa8482850161202e565b91505092915050565b61210c81611f58565b82525050565b60006020820190506121276000830184612103565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61216f82611eec565b810181811067ffffffffffffffff8211171561218e5761218d612137565b5b80604052505050565b60006121a1611dce565b90506121ad8282612166565b919050565b600067ffffffffffffffff8211156121cd576121cc612137565b5b6121d682611eec565b9050602081019050919050565b82818337600083830152505050565b6000612205612200846121b2565b612197565b90508281526020810184848401111561222157612220612132565b5b61222c8482856121e3565b509392505050565b600082601f8301126122495761224861212d565b5b81356122598482602086016121f2565b91505092915050565b60006020828403121561227857612277611dd8565b5b600082013567ffffffffffffffff81111561229657612295611ddd565b5b6122a284828501612234565b91505092915050565b6122b481611e67565b81146122bf57600080fd5b50565b6000813590506122d1816122ab565b92915050565b600080604083850312156122ee576122ed611dd8565b5b60006122fc8582860161202e565b925050602061230d858286016122c2565b9150509250929050565b600067ffffffffffffffff82111561233257612331612137565b5b61233b82611eec565b9050602081019050919050565b600061235b61235684612317565b612197565b90508281526020810184848401111561237757612376612132565b5b6123828482856121e3565b509392505050565b600082601f83011261239f5761239e61212d565b5b81356123af848260208601612348565b91505092915050565b600080600080608085870312156123d2576123d1611dd8565b5b60006123e08782880161202e565b94505060206123f18782880161202e565b935050604061240287828801611f79565b925050606085013567ffffffffffffffff81111561242357612422611ddd565b5b61242f8782880161238a565b91505092959194509250565b6000806040838503121561245257612451611dd8565b5b60006124608582860161202e565b92505060206124718582860161202e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806124c257607f821691505b602082108114156124d6576124d561247b565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612538602c83611ea8565b9150612543826124dc565b604082019050919050565b600060208201905081810360008301526125678161252b565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006125ca602183611ea8565b91506125d58261256e565b604082019050919050565b600060208201905081810360008301526125f9816125bd565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b600061265c603883611ea8565b915061266782612600565b604082019050919050565b6000602082019050818103600083015261268b8161264f565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006126ee603183611ea8565b91506126f982612692565b604082019050919050565b6000602082019050818103600083015261271d816126e1565b9050919050565b7f4d656d62657268736970203a2063616c6c6572206973206e6f742061204d696e60008201527f7465720000000000000000000000000000000000000000000000000000000000602082015250565b6000612780602383611ea8565b915061278b82612724565b604082019050919050565b600060208201905081810360008301526127af81612773565b9050919050565b7f4d656d62657273686970203a2063616c6c6572206973206e6f7420746865206f60008201527f776e657200000000000000000000000000000000000000000000000000000000602082015250565b6000612812602483611ea8565b915061281d826127b6565b604082019050919050565b6000602082019050818103600083015261284181612805565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006128a4602983611ea8565b91506128af82612848565b604082019050919050565b600060208201905081810360008301526128d381612897565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000612936602a83611ea8565b9150612941826128da565b604082019050919050565b6000602082019050818103600083015261296581612929565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006129c8602f83611ea8565b91506129d38261296c565b604082019050919050565b600060208201905081810360008301526129f7816129bb565b9050919050565b600081905092915050565b6000612a1482611e9d565b612a1e81856129fe565b9350612a2e818560208601611eb9565b80840191505092915050565b6000612a468285612a09565b9150612a528284612a09565b91508190509392505050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612aba602c83611ea8565b9150612ac582612a5e565b604082019050919050565b60006020820190508181036000830152612ae981612aad565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000612b4c602583611ea8565b9150612b5782612af0565b604082019050919050565b60006020820190508181036000830152612b7b81612b3f565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612bde602483611ea8565b9150612be982612b82565b604082019050919050565b60006020820190508181036000830152612c0d81612bd1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612c4e82611f58565b9150612c5983611f58565b925082821015612c6c57612c6b612c14565b5b828203905092915050565b6000612c8282611f58565b9150612c8d83611f58565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612cc257612cc1612c14565b5b828201905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000612d03602083611ea8565b9150612d0e82612ccd565b602082019050919050565b60006020820190508181036000830152612d3281612cf6565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000612d6f601c83611ea8565b9150612d7a82612d39565b602082019050919050565b60006020820190508181036000830152612d9e81612d62565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000612ddb601983611ea8565b9150612de682612da5565b602082019050919050565b60006020820190508181036000830152612e0a81612dce565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000612e6d603283611ea8565b9150612e7882612e11565b604082019050919050565b60006020820190508181036000830152612e9c81612e60565b9050919050565b6000612eae82611f58565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612ee157612ee0612c14565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612f2682611f58565b9150612f3183611f58565b925082612f4157612f40612eec565b5b828204905092915050565b6000612f5782611f58565b9150612f6283611f58565b925082612f7257612f71612eec565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000612fd382612fac565b612fdd8185612fb7565b9350612fed818560208601611eb9565b612ff681611eec565b840191505092915050565b60006080820190506130166000830187611fed565b6130236020830186611fed565b6130306040830185612103565b81810360608301526130428184612fc8565b905095945050505050565b60008151905061305c81611e0e565b92915050565b60006020828403121561307857613077611dd8565b5b60006130868482850161304d565b9150509291505056fea264697066735822122034d7b3faaccbaedcc1bb3b414b7a6928c0c441ca6465fbedc48b7b77196ccff564736f6c634300080a003368747470733a2f2f6c6f6b2d6e66742e6c65616775656f666b696e67646f6d732e636f6d2f6170692f647261676f2f6567672f

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101425760003560e01c806355f804b3116100b857806395d89b411161007c57806395d89b4114610371578063a22cb4651461038f578063b6db75a0146103ab578063b88d4fde146103c9578063c87b56dd146103e5578063e985e9c51461041557610142565b806355f804b3146102bb5780636352211e146102d757806370a0823114610307578063874dae88146103375780638f32d59b1461035357610142565b806334c5a0441161010a57806334c5a044146101fd57806340c10f191461022d57806342842e0e1461024957806342966c68146102655780634fb2e45d1461028157806350e59eb31461029d57610142565b806301ffc9a71461014757806306fdde0314610177578063081812fc14610195578063095ea7b3146101c557806323b872dd146101e1575b600080fd5b610161600480360381019061015c9190611e3a565b610445565b60405161016e9190611e82565b60405180910390f35b61017f610527565b60405161018c9190611f36565b60405180910390f35b6101af60048036038101906101aa9190611f8e565b6105b9565b6040516101bc9190611ffc565b60405180910390f35b6101df60048036038101906101da9190612043565b61063e565b005b6101fb60048036038101906101f69190612083565b610756565b005b610217600480360381019061021291906120d6565b6107b6565b6040516102249190612112565b60405180910390f35b61024760048036038101906102429190612043565b6107ff565b005b610263600480360381019061025e9190612083565b610854565b005b61027f600480360381019061027a9190611f8e565b610874565b005b61029b600480360381019061029691906120d6565b6108c7565b005b6102a56109ea565b6040516102b29190611e82565b60405180910390f35b6102d560048036038101906102d09190612262565b610a4a565b005b6102f160048036038101906102ec9190611f8e565b610aab565b6040516102fe9190611ffc565b60405180910390f35b610321600480360381019061031c91906120d6565b610b5d565b60405161032e9190612112565b60405180910390f35b610351600480360381019061034c9190612043565b610c15565b005b61035b610cf2565b6040516103689190611e82565b60405180910390f35b610379610d51565b6040516103869190611f36565b60405180910390f35b6103a960048036038101906103a491906122d7565b610de3565b005b6103b3610df9565b6040516103c09190611e82565b60405180910390f35b6103e360048036038101906103de91906123b8565b610e4a565b005b6103ff60048036038101906103fa9190611f8e565b610eac565b60405161040c9190611f36565b60405180910390f35b61042f600480360381019061042a919061243b565b610f53565b60405161043c9190611e82565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061051057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610520575061051f82610fe7565b5b9050919050565b606060008054610536906124aa565b80601f0160208091040260200160405190810160405280929190818152602001828054610562906124aa565b80156105af5780601f10610584576101008083540402835291602001916105af565b820191906000526020600020905b81548152906001019060200180831161059257829003601f168201915b5050505050905090565b60006105c482611051565b610603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105fa9061254e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061064982610aab565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b1906125e0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106d96110bd565b73ffffffffffffffffffffffffffffffffffffffff1614806107085750610707816107026110bd565b610f53565b5b610747576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073e90612672565b60405180910390fd5b61075183836110c5565b505050565b6107676107616110bd565b8261117e565b6107a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079d90612704565b60405180910390fd5b6107b183838361125c565b505050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6108076109ea565b610846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083d90612796565b60405180910390fd5b61085082826114c3565b5050565b61086f83838360405180602001604052806000815250610e4a565b505050565b61087c6109ea565b6108bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b290612796565b60405180910390fd5b6108c48161169d565b50565b6108cf610cf2565b61090e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090590612828565b60405180910390fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050610940826001610c15565b61094b816000610c15565b81600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8934ce4adea8d9ce0d714d2c22b86790e41b7731c84b926fbbdc1d40ff6533c960405160405180910390a35050565b60006109f4610cf2565b80610a455750600b60076000610a086110bd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b905090565b610a52610cf2565b610a91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8890612828565b60405180910390fd5b8060089080519060200190610aa7929190611d2b565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610b54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4b906128ba565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc59061294c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610c1d610cf2565b610c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5390612828565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f65efeaf737ce094d287661b6a56bb530dce1fc30853708d1912a74f8ae65ffbb82604051610ce69190612112565b60405180910390a25050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610d356110bd565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b606060018054610d60906124aa565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8c906124aa565b8015610dd95780601f10610dae57610100808354040283529160200191610dd9565b820191906000526020600020905b815481529060010190602001808311610dbc57829003601f168201915b5050505050905090565b610df5610dee6110bd565b83836117ba565b5050565b6000600160076000610e096110bd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414905090565b610e5b610e556110bd565b8361117e565b610e9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9190612704565b60405180910390fd5b610ea684848484611927565b50505050565b6060610eb782611051565b610ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eed906129de565b60405180910390fd5b6000610f00611983565b90506000815111610f205760405180602001604052806000815250610f4b565b80610f2a84611a15565b604051602001610f3b929190612a3a565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661113883610aab565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061118982611051565b6111c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bf90612ad0565b60405180910390fd5b60006111d383610aab565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061121557506112148185610f53565b5b8061125357508373ffffffffffffffffffffffffffffffffffffffff1661123b846105b9565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661127c82610aab565b73ffffffffffffffffffffffffffffffffffffffff16146112d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c990612b62565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611342576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133990612bf4565b60405180910390fd5b61134d838383611b76565b6113586000826110c5565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113a89190612c43565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113ff9190612c77565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46114be838383611b7b565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152a90612d19565b60405180910390fd5b61153c81611051565b1561157c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157390612d85565b60405180910390fd5b61158860008383611b76565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115d89190612c77565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461169960008383611b7b565b5050565b60006116a882610aab565b90506116b681600084611b76565b6116c16000836110c5565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117119190612c43565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46117b681600084611b7b565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611829576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182090612df1565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161191a9190611e82565b60405180910390a3505050565b61193284848461125c565b61193e84848484611b80565b61197d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197490612e83565b60405180910390fd5b50505050565b606060088054611992906124aa565b80601f01602080910402602001604051908101604052809291908181526020018280546119be906124aa565b8015611a0b5780601f106119e057610100808354040283529160200191611a0b565b820191906000526020600020905b8154815290600101906020018083116119ee57829003601f168201915b5050505050905090565b60606000821415611a5d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611b71565b600082905060005b60008214611a8f578080611a7890612ea3565b915050600a82611a889190612f1b565b9150611a65565b60008167ffffffffffffffff811115611aab57611aaa612137565b5b6040519080825280601f01601f191660200182016040528015611add5781602001600182028036833780820191505090505b5090505b60008514611b6a57600182611af69190612c43565b9150600a85611b059190612f4c565b6030611b119190612c77565b60f81b818381518110611b2757611b26612f7d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611b639190612f1b565b9450611ae1565b8093505050505b919050565b505050565b505050565b6000611ba18473ffffffffffffffffffffffffffffffffffffffff16611d08565b15611cfb578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611bca6110bd565b8786866040518563ffffffff1660e01b8152600401611bec9493929190613001565b6020604051808303816000875af1925050508015611c2857506040513d601f19601f82011682018060405250810190611c259190613062565b60015b611cab573d8060008114611c58576040519150601f19603f3d011682016040523d82523d6000602084013e611c5d565b606091505b50600081511415611ca3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9a90612e83565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611d00565b600190505b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054611d37906124aa565b90600052602060002090601f016020900481019282611d595760008555611da0565b82601f10611d7257805160ff1916838001178555611da0565b82800160010185558215611da0579182015b82811115611d9f578251825591602001919060010190611d84565b5b509050611dad9190611db1565b5090565b5b80821115611dca576000816000905550600101611db2565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611e1781611de2565b8114611e2257600080fd5b50565b600081359050611e3481611e0e565b92915050565b600060208284031215611e5057611e4f611dd8565b5b6000611e5e84828501611e25565b91505092915050565b60008115159050919050565b611e7c81611e67565b82525050565b6000602082019050611e976000830184611e73565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611ed7578082015181840152602081019050611ebc565b83811115611ee6576000848401525b50505050565b6000601f19601f8301169050919050565b6000611f0882611e9d565b611f128185611ea8565b9350611f22818560208601611eb9565b611f2b81611eec565b840191505092915050565b60006020820190508181036000830152611f508184611efd565b905092915050565b6000819050919050565b611f6b81611f58565b8114611f7657600080fd5b50565b600081359050611f8881611f62565b92915050565b600060208284031215611fa457611fa3611dd8565b5b6000611fb284828501611f79565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611fe682611fbb565b9050919050565b611ff681611fdb565b82525050565b60006020820190506120116000830184611fed565b92915050565b61202081611fdb565b811461202b57600080fd5b50565b60008135905061203d81612017565b92915050565b6000806040838503121561205a57612059611dd8565b5b60006120688582860161202e565b925050602061207985828601611f79565b9150509250929050565b60008060006060848603121561209c5761209b611dd8565b5b60006120aa8682870161202e565b93505060206120bb8682870161202e565b92505060406120cc86828701611f79565b9150509250925092565b6000602082840312156120ec576120eb611dd8565b5b60006120fa8482850161202e565b91505092915050565b61210c81611f58565b82525050565b60006020820190506121276000830184612103565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61216f82611eec565b810181811067ffffffffffffffff8211171561218e5761218d612137565b5b80604052505050565b60006121a1611dce565b90506121ad8282612166565b919050565b600067ffffffffffffffff8211156121cd576121cc612137565b5b6121d682611eec565b9050602081019050919050565b82818337600083830152505050565b6000612205612200846121b2565b612197565b90508281526020810184848401111561222157612220612132565b5b61222c8482856121e3565b509392505050565b600082601f8301126122495761224861212d565b5b81356122598482602086016121f2565b91505092915050565b60006020828403121561227857612277611dd8565b5b600082013567ffffffffffffffff81111561229657612295611ddd565b5b6122a284828501612234565b91505092915050565b6122b481611e67565b81146122bf57600080fd5b50565b6000813590506122d1816122ab565b92915050565b600080604083850312156122ee576122ed611dd8565b5b60006122fc8582860161202e565b925050602061230d858286016122c2565b9150509250929050565b600067ffffffffffffffff82111561233257612331612137565b5b61233b82611eec565b9050602081019050919050565b600061235b61235684612317565b612197565b90508281526020810184848401111561237757612376612132565b5b6123828482856121e3565b509392505050565b600082601f83011261239f5761239e61212d565b5b81356123af848260208601612348565b91505092915050565b600080600080608085870312156123d2576123d1611dd8565b5b60006123e08782880161202e565b94505060206123f18782880161202e565b935050604061240287828801611f79565b925050606085013567ffffffffffffffff81111561242357612422611ddd565b5b61242f8782880161238a565b91505092959194509250565b6000806040838503121561245257612451611dd8565b5b60006124608582860161202e565b92505060206124718582860161202e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806124c257607f821691505b602082108114156124d6576124d561247b565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612538602c83611ea8565b9150612543826124dc565b604082019050919050565b600060208201905081810360008301526125678161252b565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006125ca602183611ea8565b91506125d58261256e565b604082019050919050565b600060208201905081810360008301526125f9816125bd565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b600061265c603883611ea8565b915061266782612600565b604082019050919050565b6000602082019050818103600083015261268b8161264f565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006126ee603183611ea8565b91506126f982612692565b604082019050919050565b6000602082019050818103600083015261271d816126e1565b9050919050565b7f4d656d62657268736970203a2063616c6c6572206973206e6f742061204d696e60008201527f7465720000000000000000000000000000000000000000000000000000000000602082015250565b6000612780602383611ea8565b915061278b82612724565b604082019050919050565b600060208201905081810360008301526127af81612773565b9050919050565b7f4d656d62657273686970203a2063616c6c6572206973206e6f7420746865206f60008201527f776e657200000000000000000000000000000000000000000000000000000000602082015250565b6000612812602483611ea8565b915061281d826127b6565b604082019050919050565b6000602082019050818103600083015261284181612805565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006128a4602983611ea8565b91506128af82612848565b604082019050919050565b600060208201905081810360008301526128d381612897565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000612936602a83611ea8565b9150612941826128da565b604082019050919050565b6000602082019050818103600083015261296581612929565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006129c8602f83611ea8565b91506129d38261296c565b604082019050919050565b600060208201905081810360008301526129f7816129bb565b9050919050565b600081905092915050565b6000612a1482611e9d565b612a1e81856129fe565b9350612a2e818560208601611eb9565b80840191505092915050565b6000612a468285612a09565b9150612a528284612a09565b91508190509392505050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612aba602c83611ea8565b9150612ac582612a5e565b604082019050919050565b60006020820190508181036000830152612ae981612aad565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000612b4c602583611ea8565b9150612b5782612af0565b604082019050919050565b60006020820190508181036000830152612b7b81612b3f565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612bde602483611ea8565b9150612be982612b82565b604082019050919050565b60006020820190508181036000830152612c0d81612bd1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612c4e82611f58565b9150612c5983611f58565b925082821015612c6c57612c6b612c14565b5b828203905092915050565b6000612c8282611f58565b9150612c8d83611f58565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612cc257612cc1612c14565b5b828201905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000612d03602083611ea8565b9150612d0e82612ccd565b602082019050919050565b60006020820190508181036000830152612d3281612cf6565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000612d6f601c83611ea8565b9150612d7a82612d39565b602082019050919050565b60006020820190508181036000830152612d9e81612d62565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000612ddb601983611ea8565b9150612de682612da5565b602082019050919050565b60006020820190508181036000830152612e0a81612dce565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000612e6d603283611ea8565b9150612e7882612e11565b604082019050919050565b60006020820190508181036000830152612e9c81612e60565b9050919050565b6000612eae82611f58565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612ee157612ee0612c14565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612f2682611f58565b9150612f3183611f58565b925082612f4157612f40612eec565b5b828204905092915050565b6000612f5782611f58565b9150612f6283611f58565b925082612f7257612f71612eec565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000612fd382612fac565b612fdd8185612fb7565b9350612fed818560208601611eb9565b612ff681611eec565b840191505092915050565b60006080820190506130166000830187611fed565b6130236020830186611fed565b6130306040830185612103565b81810360608301526130428184612fc8565b905095945050505050565b60008151905061305c81611e0e565b92915050565b60006020828403121561307857613077611dd8565b5b60006130868482850161304d565b9150509291505056fea264697066735822122034d7b3faaccbaedcc1bb3b414b7a6928c0c441ca6465fbedc48b7b77196ccff564736f6c634300080a0033

Deployed Bytecode Sourcemap

35562:633:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20829:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21774:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23334:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22857:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24084:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35439:114;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36008:97;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24494:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36111:81;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34321:254;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35311:116;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35914:88;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21468:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21198:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34583:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34864:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21943:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23627:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35083:101;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24750:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22118:334;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23853:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20829:305;20931:4;20983:25;20968:40;;;:11;:40;;;;:105;;;;21040:33;21025:48;;;:11;:48;;;;20968:105;:158;;;;21090:36;21114:11;21090:23;:36::i;:::-;20968:158;20948:178;;20829:305;;;:::o;21774:100::-;21828:13;21861:5;21854:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21774:100;:::o;23334:221::-;23410:7;23438:16;23446:7;23438;:16::i;:::-;23430:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23523:15;:24;23539:7;23523:24;;;;;;;;;;;;;;;;;;;;;23516:31;;23334:221;;;:::o;22857:411::-;22938:13;22954:23;22969:7;22954:14;:23::i;:::-;22938:39;;23002:5;22996:11;;:2;:11;;;;22988:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23096:5;23080:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23105:37;23122:5;23129:12;:10;:12::i;:::-;23105:16;:37::i;:::-;23080:62;23058:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23239:21;23248:2;23252:7;23239:8;:21::i;:::-;22927:341;22857:411;;:::o;24084:339::-;24279:41;24298:12;:10;:12::i;:::-;24312:7;24279:18;:41::i;:::-;24271:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24387:28;24397:4;24403:2;24407:7;24387:9;:28::i;:::-;24084:339;;;:::o;35439:114::-;35500:7;35526:10;:19;35537:7;35526:19;;;;;;;;;;;;;;;;35519:26;;35439:114;;;:::o;36008:97::-;35233:10;:8;:10::i;:::-;35225:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;36079:18:::1;36085:2;36089:7;36079:5;:18::i;:::-;36008:97:::0;;:::o;24494:185::-;24632:39;24649:4;24655:2;24659:7;24632:39;;;;;;;;;;;;:16;:39::i;:::-;24494:185;;;:::o;36111:81::-;35233:10;:8;:10::i;:::-;35225:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;36170:14:::1;36176:7;36170:5;:14::i;:::-;36111:81:::0;:::o;34321:254::-;34786:9;:7;:9::i;:::-;34778:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;34390:16:::1;34409:5;;;;;;;;;;;34390:24;;34425:26;34439:8;34449:1;34425:13;:26::i;:::-;34462;34476:8;34486:1;34462:13;:26::i;:::-;34507:8;34499:5;;:16;;;;;;;;;;;;;;;;;;34558:8;34531:36;;34548:8;34531:36;;;;;;;;;;;;34379:196;34321:254:::0;:::o;35311:116::-;35352:4;35376:9;:7;:9::i;:::-;:43;;;;35417:2;35389:10;:24;35400:12;:10;:12::i;:::-;35389:24;;;;;;;;;;;;;;;;:30;35376:43;35369:50;;35311:116;:::o;35914:88::-;34786:9;:7;:9::i;:::-;34778:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;35991:3:::1;35981:7;:13;;;;;;;;;;;;:::i;:::-;;35914:88:::0;:::o;21468:239::-;21540:7;21560:13;21576:7;:16;21584:7;21576:16;;;;;;;;;;;;;;;;;;;;;21560:32;;21628:1;21611:19;;:5;:19;;;;21603:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21694:5;21687:12;;;21468:239;;;:::o;21198:208::-;21270:7;21315:1;21298:19;;:5;:19;;;;21290:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21382:9;:16;21392:5;21382:16;;;;;;;;;;;;;;;;21375:23;;21198:208;;;:::o;34583:155::-;34786:9;:7;:9::i;:::-;34778:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;34680:5:::1;34662:10;:15;34673:3;34662:15;;;;;;;;;;;;;;;:23;;;;34719:3;34701:29;;;34724:5;34701:29;;;;;;:::i;:::-;;;;;;;;34583:155:::0;;:::o;34864:93::-;34904:4;34944:5;;;;;;;;;;;34928:21;;:12;:10;:12::i;:::-;:21;;;34921:28;;34864:93;:::o;21943:104::-;21999:13;22032:7;22025:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21943:104;:::o;23627:155::-;23722:52;23741:12;:10;:12::i;:::-;23755:8;23765;23722:18;:52::i;:::-;23627:155;;:::o;35083:101::-;35123:4;35175:1;35147:10;:24;35158:12;:10;:12::i;:::-;35147:24;;;;;;;;;;;;;;;;:29;35140:36;;35083:101;:::o;24750:328::-;24925:41;24944:12;:10;:12::i;:::-;24958:7;24925:18;:41::i;:::-;24917:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25031:39;25045:4;25051:2;25055:7;25064:5;25031:13;:39::i;:::-;24750:328;;;;:::o;22118:334::-;22191:13;22225:16;22233:7;22225;:16::i;:::-;22217:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22306:21;22330:10;:8;:10::i;:::-;22306:34;;22382:1;22364:7;22358:21;:25;:86;;;;;;;;;;;;;;;;;22410:7;22419:18;:7;:16;:18::i;:::-;22393:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22358:86;22351:93;;;22118:334;;;:::o;23853:164::-;23950:4;23974:18;:25;23993:5;23974:25;;;;;;;;;;;;;;;:35;24000:8;23974:35;;;;;;;;;;;;;;;;;;;;;;;;;23967:42;;23853:164;;;;:::o;19361:157::-;19446:4;19485:25;19470:40;;;:11;:40;;;;19463:47;;19361:157;;;:::o;26588:127::-;26653:4;26705:1;26677:30;;:7;:16;26685:7;26677:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26670:37;;26588:127;;;:::o;16339:98::-;16392:7;16419:10;16412:17;;16339:98;:::o;30734:174::-;30836:2;30809:15;:24;30825:7;30809:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30892:7;30888:2;30854:46;;30863:23;30878:7;30863:14;:23::i;:::-;30854:46;;;;;;;;;;;;30734:174;;:::o;26882:348::-;26975:4;27000:16;27008:7;27000;:16::i;:::-;26992:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27076:13;27092:23;27107:7;27092:14;:23::i;:::-;27076:39;;27145:5;27134:16;;:7;:16;;;:52;;;;27154:32;27171:5;27178:7;27154:16;:32::i;:::-;27134:52;:87;;;;27214:7;27190:31;;:20;27202:7;27190:11;:20::i;:::-;:31;;;27134:87;27126:96;;;26882:348;;;;:::o;29991:625::-;30150:4;30123:31;;:23;30138:7;30123:14;:23::i;:::-;:31;;;30115:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;30229:1;30215:16;;:2;:16;;;;30207:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30285:39;30306:4;30312:2;30316:7;30285:20;:39::i;:::-;30389:29;30406:1;30410:7;30389:8;:29::i;:::-;30450:1;30431:9;:15;30441:4;30431:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30479:1;30462:9;:13;30472:2;30462:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30510:2;30491:7;:16;30499:7;30491:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30549:7;30545:2;30530:27;;30539:4;30530:27;;;;;;;;;;;;30570:38;30590:4;30596:2;30600:7;30570:19;:38::i;:::-;29991:625;;;:::o;28566:439::-;28660:1;28646:16;;:2;:16;;;;28638:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28719:16;28727:7;28719;:16::i;:::-;28718:17;28710:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28781:45;28810:1;28814:2;28818:7;28781:20;:45::i;:::-;28856:1;28839:9;:13;28849:2;28839:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28887:2;28868:7;:16;28876:7;28868:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28932:7;28928:2;28907:33;;28924:1;28907:33;;;;;;;;;;;;28953:44;28981:1;28985:2;28989:7;28953:19;:44::i;:::-;28566:439;;:::o;29234:420::-;29294:13;29310:23;29325:7;29310:14;:23::i;:::-;29294:39;;29346:48;29367:5;29382:1;29386:7;29346:20;:48::i;:::-;29435:29;29452:1;29456:7;29435:8;:29::i;:::-;29497:1;29477:9;:16;29487:5;29477:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;29516:7;:16;29524:7;29516:16;;;;;;;;;;;;29509:23;;;;;;;;;;;29578:7;29574:1;29550:36;;29559:5;29550:36;;;;;;;;;;;;29599:47;29619:5;29634:1;29638:7;29599:19;:47::i;:::-;29283:371;29234:420;:::o;31050:315::-;31205:8;31196:17;;:5;:17;;;;31188:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;31292:8;31254:18;:25;31273:5;31254:25;;;;;;;;;;;;;;;:35;31280:8;31254:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;31338:8;31316:41;;31331:5;31316:41;;;31348:8;31316:41;;;;;;:::i;:::-;;;;;;;;31050:315;;;:::o;25960:::-;26117:28;26127:4;26133:2;26137:7;26117:9;:28::i;:::-;26164:48;26187:4;26193:2;26197:7;26206:5;26164:22;:48::i;:::-;26156:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25960:315;;;;:::o;35808:100::-;35860:13;35893:7;35886:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35808:100;:::o;16835:723::-;16891:13;17121:1;17112:5;:10;17108:53;;;17139:10;;;;;;;;;;;;;;;;;;;;;17108:53;17171:12;17186:5;17171:20;;17202:14;17227:78;17242:1;17234:4;:9;17227:78;;17260:8;;;;;:::i;:::-;;;;17291:2;17283:10;;;;;:::i;:::-;;;17227:78;;;17315:19;17347:6;17337:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17315:39;;17365:154;17381:1;17372:5;:10;17365:154;;17409:1;17399:11;;;;;:::i;:::-;;;17476:2;17468:5;:10;;;;:::i;:::-;17455:2;:24;;;;:::i;:::-;17442:39;;17425:6;17432;17425:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17505:2;17496:11;;;;;:::i;:::-;;;17365:154;;;17543:6;17529:21;;;;;16835:723;;;;:::o;33301:126::-;;;;:::o;33812:125::-;;;;:::o;31930:799::-;32085:4;32106:15;:2;:13;;;:15::i;:::-;32102:620;;;32158:2;32142:36;;;32179:12;:10;:12::i;:::-;32193:4;32199:7;32208:5;32142:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32138:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32401:1;32384:6;:13;:18;32380:272;;;32427:60;;;;;;;;;;:::i;:::-;;;;;;;;32380:272;32602:6;32596:13;32587:6;32583:2;32579:15;32572:38;32138:529;32275:41;;;32265:51;;;:6;:51;;;;32258:58;;;;;32102:620;32706:4;32699:11;;31930:799;;;;;;;:::o;8473:326::-;8533:4;8790:1;8768:7;:19;;;:23;8761:30;;8473:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:619::-;5015:6;5023;5031;5080:2;5068:9;5059:7;5055:23;5051:32;5048:119;;;5086:79;;:::i;:::-;5048:119;5206:1;5231:53;5276:7;5267:6;5256:9;5252:22;5231:53;:::i;:::-;5221:63;;5177:117;5333:2;5359:53;5404:7;5395:6;5384:9;5380:22;5359:53;:::i;:::-;5349:63;;5304:118;5461:2;5487:53;5532:7;5523:6;5512:9;5508:22;5487:53;:::i;:::-;5477:63;;5432:118;4938:619;;;;;:::o;5563:329::-;5622:6;5671:2;5659:9;5650:7;5646:23;5642:32;5639:119;;;5677:79;;:::i;:::-;5639:119;5797:1;5822:53;5867:7;5858:6;5847:9;5843:22;5822:53;:::i;:::-;5812:63;;5768:117;5563:329;;;;:::o;5898:118::-;5985:24;6003:5;5985:24;:::i;:::-;5980:3;5973:37;5898:118;;:::o;6022:222::-;6115:4;6153:2;6142:9;6138:18;6130:26;;6166:71;6234:1;6223:9;6219:17;6210:6;6166:71;:::i;:::-;6022:222;;;;:::o;6250:117::-;6359:1;6356;6349:12;6373:117;6482:1;6479;6472:12;6496:180;6544:77;6541:1;6534:88;6641:4;6638:1;6631:15;6665:4;6662:1;6655:15;6682:281;6765:27;6787:4;6765:27;:::i;:::-;6757:6;6753:40;6895:6;6883:10;6880:22;6859:18;6847:10;6844:34;6841:62;6838:88;;;6906:18;;:::i;:::-;6838:88;6946:10;6942:2;6935:22;6725:238;6682:281;;:::o;6969:129::-;7003:6;7030:20;;:::i;:::-;7020:30;;7059:33;7087:4;7079:6;7059:33;:::i;:::-;6969:129;;;:::o;7104:308::-;7166:4;7256:18;7248:6;7245:30;7242:56;;;7278:18;;:::i;:::-;7242:56;7316:29;7338:6;7316:29;:::i;:::-;7308:37;;7400:4;7394;7390:15;7382:23;;7104:308;;;:::o;7418:154::-;7502:6;7497:3;7492;7479:30;7564:1;7555:6;7550:3;7546:16;7539:27;7418:154;;;:::o;7578:412::-;7656:5;7681:66;7697:49;7739:6;7697:49;:::i;:::-;7681:66;:::i;:::-;7672:75;;7770:6;7763:5;7756:21;7808:4;7801:5;7797:16;7846:3;7837:6;7832:3;7828:16;7825:25;7822:112;;;7853:79;;:::i;:::-;7822:112;7943:41;7977:6;7972:3;7967;7943:41;:::i;:::-;7662:328;7578:412;;;;;:::o;8010:340::-;8066:5;8115:3;8108:4;8100:6;8096:17;8092:27;8082:122;;8123:79;;:::i;:::-;8082:122;8240:6;8227:20;8265:79;8340:3;8332:6;8325:4;8317:6;8313:17;8265:79;:::i;:::-;8256:88;;8072:278;8010:340;;;;:::o;8356:509::-;8425:6;8474:2;8462:9;8453:7;8449:23;8445:32;8442:119;;;8480:79;;:::i;:::-;8442:119;8628:1;8617:9;8613:17;8600:31;8658:18;8650:6;8647:30;8644:117;;;8680:79;;:::i;:::-;8644:117;8785:63;8840:7;8831:6;8820:9;8816:22;8785:63;:::i;:::-;8775:73;;8571:287;8356:509;;;;:::o;8871:116::-;8941:21;8956:5;8941:21;:::i;:::-;8934:5;8931:32;8921:60;;8977:1;8974;8967:12;8921:60;8871:116;:::o;8993:133::-;9036:5;9074:6;9061:20;9052:29;;9090:30;9114:5;9090:30;:::i;:::-;8993:133;;;;:::o;9132:468::-;9197:6;9205;9254:2;9242:9;9233:7;9229:23;9225:32;9222:119;;;9260:79;;:::i;:::-;9222:119;9380:1;9405:53;9450:7;9441:6;9430:9;9426:22;9405:53;:::i;:::-;9395:63;;9351:117;9507:2;9533:50;9575:7;9566:6;9555:9;9551:22;9533:50;:::i;:::-;9523:60;;9478:115;9132:468;;;;;:::o;9606:307::-;9667:4;9757:18;9749:6;9746:30;9743:56;;;9779:18;;:::i;:::-;9743:56;9817:29;9839:6;9817:29;:::i;:::-;9809:37;;9901:4;9895;9891:15;9883:23;;9606:307;;;:::o;9919:410::-;9996:5;10021:65;10037:48;10078:6;10037:48;:::i;:::-;10021:65;:::i;:::-;10012:74;;10109:6;10102:5;10095:21;10147:4;10140:5;10136:16;10185:3;10176:6;10171:3;10167:16;10164:25;10161:112;;;10192:79;;:::i;:::-;10161:112;10282:41;10316:6;10311:3;10306;10282:41;:::i;:::-;10002:327;9919:410;;;;;:::o;10348:338::-;10403:5;10452:3;10445:4;10437:6;10433:17;10429:27;10419:122;;10460:79;;:::i;:::-;10419:122;10577:6;10564:20;10602:78;10676:3;10668:6;10661:4;10653:6;10649:17;10602:78;:::i;:::-;10593:87;;10409:277;10348:338;;;;:::o;10692:943::-;10787:6;10795;10803;10811;10860:3;10848:9;10839:7;10835:23;10831:33;10828:120;;;10867:79;;:::i;:::-;10828:120;10987:1;11012:53;11057:7;11048:6;11037:9;11033:22;11012:53;:::i;:::-;11002:63;;10958:117;11114:2;11140:53;11185:7;11176:6;11165:9;11161:22;11140:53;:::i;:::-;11130:63;;11085:118;11242:2;11268:53;11313:7;11304:6;11293:9;11289:22;11268:53;:::i;:::-;11258:63;;11213:118;11398:2;11387:9;11383:18;11370:32;11429:18;11421:6;11418:30;11415:117;;;11451:79;;:::i;:::-;11415:117;11556:62;11610:7;11601:6;11590:9;11586:22;11556:62;:::i;:::-;11546:72;;11341:287;10692:943;;;;;;;:::o;11641:474::-;11709:6;11717;11766:2;11754:9;11745:7;11741:23;11737:32;11734:119;;;11772:79;;:::i;:::-;11734:119;11892:1;11917:53;11962:7;11953:6;11942:9;11938:22;11917:53;:::i;:::-;11907:63;;11863:117;12019:2;12045:53;12090:7;12081:6;12070:9;12066:22;12045:53;:::i;:::-;12035:63;;11990:118;11641:474;;;;;:::o;12121:180::-;12169:77;12166:1;12159:88;12266:4;12263:1;12256:15;12290:4;12287:1;12280:15;12307:320;12351:6;12388:1;12382:4;12378:12;12368:22;;12435:1;12429:4;12425:12;12456:18;12446:81;;12512:4;12504:6;12500:17;12490:27;;12446:81;12574:2;12566:6;12563:14;12543:18;12540:38;12537:84;;;12593:18;;:::i;:::-;12537:84;12358:269;12307:320;;;:::o;12633:231::-;12773:34;12769:1;12761:6;12757:14;12750:58;12842:14;12837:2;12829:6;12825:15;12818:39;12633:231;:::o;12870:366::-;13012:3;13033:67;13097:2;13092:3;13033:67;:::i;:::-;13026:74;;13109:93;13198:3;13109:93;:::i;:::-;13227:2;13222:3;13218:12;13211:19;;12870:366;;;:::o;13242:419::-;13408:4;13446:2;13435:9;13431:18;13423:26;;13495:9;13489:4;13485:20;13481:1;13470:9;13466:17;13459:47;13523:131;13649:4;13523:131;:::i;:::-;13515:139;;13242:419;;;:::o;13667:220::-;13807:34;13803:1;13795:6;13791:14;13784:58;13876:3;13871:2;13863:6;13859:15;13852:28;13667:220;:::o;13893:366::-;14035:3;14056:67;14120:2;14115:3;14056:67;:::i;:::-;14049:74;;14132:93;14221:3;14132:93;:::i;:::-;14250:2;14245:3;14241:12;14234:19;;13893:366;;;:::o;14265:419::-;14431:4;14469:2;14458:9;14454:18;14446:26;;14518:9;14512:4;14508:20;14504:1;14493:9;14489:17;14482:47;14546:131;14672:4;14546:131;:::i;:::-;14538:139;;14265:419;;;:::o;14690:243::-;14830:34;14826:1;14818:6;14814:14;14807:58;14899:26;14894:2;14886:6;14882:15;14875:51;14690:243;:::o;14939:366::-;15081:3;15102:67;15166:2;15161:3;15102:67;:::i;:::-;15095:74;;15178:93;15267:3;15178:93;:::i;:::-;15296:2;15291:3;15287:12;15280:19;;14939:366;;;:::o;15311:419::-;15477:4;15515:2;15504:9;15500:18;15492:26;;15564:9;15558:4;15554:20;15550:1;15539:9;15535:17;15528:47;15592:131;15718:4;15592:131;:::i;:::-;15584:139;;15311:419;;;:::o;15736:236::-;15876:34;15872:1;15864:6;15860:14;15853:58;15945:19;15940:2;15932:6;15928:15;15921:44;15736:236;:::o;15978:366::-;16120:3;16141:67;16205:2;16200:3;16141:67;:::i;:::-;16134:74;;16217:93;16306:3;16217:93;:::i;:::-;16335:2;16330:3;16326:12;16319:19;;15978:366;;;:::o;16350:419::-;16516:4;16554:2;16543:9;16539:18;16531:26;;16603:9;16597:4;16593:20;16589:1;16578:9;16574:17;16567:47;16631:131;16757:4;16631:131;:::i;:::-;16623:139;;16350:419;;;:::o;16775:222::-;16915:34;16911:1;16903:6;16899:14;16892:58;16984:5;16979:2;16971:6;16967:15;16960:30;16775:222;:::o;17003:366::-;17145:3;17166:67;17230:2;17225:3;17166:67;:::i;:::-;17159:74;;17242:93;17331:3;17242:93;:::i;:::-;17360:2;17355:3;17351:12;17344:19;;17003:366;;;:::o;17375:419::-;17541:4;17579:2;17568:9;17564:18;17556:26;;17628:9;17622:4;17618:20;17614:1;17603:9;17599:17;17592:47;17656:131;17782:4;17656:131;:::i;:::-;17648:139;;17375:419;;;:::o;17800:223::-;17940:34;17936:1;17928:6;17924:14;17917:58;18009:6;18004:2;17996:6;17992:15;17985:31;17800:223;:::o;18029:366::-;18171:3;18192:67;18256:2;18251:3;18192:67;:::i;:::-;18185:74;;18268:93;18357:3;18268:93;:::i;:::-;18386:2;18381:3;18377:12;18370:19;;18029:366;;;:::o;18401:419::-;18567:4;18605:2;18594:9;18590:18;18582:26;;18654:9;18648:4;18644:20;18640:1;18629:9;18625:17;18618:47;18682:131;18808:4;18682:131;:::i;:::-;18674:139;;18401:419;;;:::o;18826:228::-;18966:34;18962:1;18954:6;18950:14;18943:58;19035:11;19030:2;19022:6;19018:15;19011:36;18826:228;:::o;19060:366::-;19202:3;19223:67;19287:2;19282:3;19223:67;:::i;:::-;19216:74;;19299:93;19388:3;19299:93;:::i;:::-;19417:2;19412:3;19408:12;19401:19;;19060:366;;;:::o;19432:419::-;19598:4;19636:2;19625:9;19621:18;19613:26;;19685:9;19679:4;19675:20;19671:1;19660:9;19656:17;19649:47;19713:131;19839:4;19713:131;:::i;:::-;19705:139;;19432:419;;;:::o;19857:229::-;19997:34;19993:1;19985:6;19981:14;19974:58;20066:12;20061:2;20053:6;20049:15;20042:37;19857:229;:::o;20092:366::-;20234:3;20255:67;20319:2;20314:3;20255:67;:::i;:::-;20248:74;;20331:93;20420:3;20331:93;:::i;:::-;20449:2;20444:3;20440:12;20433:19;;20092:366;;;:::o;20464:419::-;20630:4;20668:2;20657:9;20653:18;20645:26;;20717:9;20711:4;20707:20;20703:1;20692:9;20688:17;20681:47;20745:131;20871:4;20745:131;:::i;:::-;20737:139;;20464:419;;;:::o;20889:234::-;21029:34;21025:1;21017:6;21013:14;21006:58;21098:17;21093:2;21085:6;21081:15;21074:42;20889:234;:::o;21129:366::-;21271:3;21292:67;21356:2;21351:3;21292:67;:::i;:::-;21285:74;;21368:93;21457:3;21368:93;:::i;:::-;21486:2;21481:3;21477:12;21470:19;;21129:366;;;:::o;21501:419::-;21667:4;21705:2;21694:9;21690:18;21682:26;;21754:9;21748:4;21744:20;21740:1;21729:9;21725:17;21718:47;21782:131;21908:4;21782:131;:::i;:::-;21774:139;;21501:419;;;:::o;21926:148::-;22028:11;22065:3;22050:18;;21926:148;;;;:::o;22080:377::-;22186:3;22214:39;22247:5;22214:39;:::i;:::-;22269:89;22351:6;22346:3;22269:89;:::i;:::-;22262:96;;22367:52;22412:6;22407:3;22400:4;22393:5;22389:16;22367:52;:::i;:::-;22444:6;22439:3;22435:16;22428:23;;22190:267;22080:377;;;;:::o;22463:435::-;22643:3;22665:95;22756:3;22747:6;22665:95;:::i;:::-;22658:102;;22777:95;22868:3;22859:6;22777:95;:::i;:::-;22770:102;;22889:3;22882:10;;22463:435;;;;;:::o;22904:231::-;23044:34;23040:1;23032:6;23028:14;23021:58;23113:14;23108:2;23100:6;23096:15;23089:39;22904:231;:::o;23141:366::-;23283:3;23304:67;23368:2;23363:3;23304:67;:::i;:::-;23297:74;;23380:93;23469:3;23380:93;:::i;:::-;23498:2;23493:3;23489:12;23482:19;;23141:366;;;:::o;23513:419::-;23679:4;23717:2;23706:9;23702:18;23694:26;;23766:9;23760:4;23756:20;23752:1;23741:9;23737:17;23730:47;23794:131;23920:4;23794:131;:::i;:::-;23786:139;;23513:419;;;:::o;23938:224::-;24078:34;24074:1;24066:6;24062:14;24055:58;24147:7;24142:2;24134:6;24130:15;24123:32;23938:224;:::o;24168:366::-;24310:3;24331:67;24395:2;24390:3;24331:67;:::i;:::-;24324:74;;24407:93;24496:3;24407:93;:::i;:::-;24525:2;24520:3;24516:12;24509:19;;24168:366;;;:::o;24540:419::-;24706:4;24744:2;24733:9;24729:18;24721:26;;24793:9;24787:4;24783:20;24779:1;24768:9;24764:17;24757:47;24821:131;24947:4;24821:131;:::i;:::-;24813:139;;24540:419;;;:::o;24965:223::-;25105:34;25101:1;25093:6;25089:14;25082:58;25174:6;25169:2;25161:6;25157:15;25150:31;24965:223;:::o;25194:366::-;25336:3;25357:67;25421:2;25416:3;25357:67;:::i;:::-;25350:74;;25433:93;25522:3;25433:93;:::i;:::-;25551:2;25546:3;25542:12;25535:19;;25194:366;;;:::o;25566:419::-;25732:4;25770:2;25759:9;25755:18;25747:26;;25819:9;25813:4;25809:20;25805:1;25794:9;25790:17;25783:47;25847:131;25973:4;25847:131;:::i;:::-;25839:139;;25566:419;;;:::o;25991:180::-;26039:77;26036:1;26029:88;26136:4;26133:1;26126:15;26160:4;26157:1;26150:15;26177:191;26217:4;26237:20;26255:1;26237:20;:::i;:::-;26232:25;;26271:20;26289:1;26271:20;:::i;:::-;26266:25;;26310:1;26307;26304:8;26301:34;;;26315:18;;:::i;:::-;26301:34;26360:1;26357;26353:9;26345:17;;26177:191;;;;:::o;26374:305::-;26414:3;26433:20;26451:1;26433:20;:::i;:::-;26428:25;;26467:20;26485:1;26467:20;:::i;:::-;26462:25;;26621:1;26553:66;26549:74;26546:1;26543:81;26540:107;;;26627:18;;:::i;:::-;26540:107;26671:1;26668;26664:9;26657:16;;26374:305;;;;:::o;26685:182::-;26825:34;26821:1;26813:6;26809:14;26802:58;26685:182;:::o;26873:366::-;27015:3;27036:67;27100:2;27095:3;27036:67;:::i;:::-;27029:74;;27112:93;27201:3;27112:93;:::i;:::-;27230:2;27225:3;27221:12;27214:19;;26873:366;;;:::o;27245:419::-;27411:4;27449:2;27438:9;27434:18;27426:26;;27498:9;27492:4;27488:20;27484:1;27473:9;27469:17;27462:47;27526:131;27652:4;27526:131;:::i;:::-;27518:139;;27245:419;;;:::o;27670:178::-;27810:30;27806:1;27798:6;27794:14;27787:54;27670:178;:::o;27854:366::-;27996:3;28017:67;28081:2;28076:3;28017:67;:::i;:::-;28010:74;;28093:93;28182:3;28093:93;:::i;:::-;28211:2;28206:3;28202:12;28195:19;;27854:366;;;:::o;28226:419::-;28392:4;28430:2;28419:9;28415:18;28407:26;;28479:9;28473:4;28469:20;28465:1;28454:9;28450:17;28443:47;28507:131;28633:4;28507:131;:::i;:::-;28499:139;;28226:419;;;:::o;28651:175::-;28791:27;28787:1;28779:6;28775:14;28768:51;28651:175;:::o;28832:366::-;28974:3;28995:67;29059:2;29054:3;28995:67;:::i;:::-;28988:74;;29071:93;29160:3;29071:93;:::i;:::-;29189:2;29184:3;29180:12;29173:19;;28832:366;;;:::o;29204:419::-;29370:4;29408:2;29397:9;29393:18;29385:26;;29457:9;29451:4;29447:20;29443:1;29432:9;29428:17;29421:47;29485:131;29611:4;29485:131;:::i;:::-;29477:139;;29204:419;;;:::o;29629:237::-;29769:34;29765:1;29757:6;29753:14;29746:58;29838:20;29833:2;29825:6;29821:15;29814:45;29629:237;:::o;29872:366::-;30014:3;30035:67;30099:2;30094:3;30035:67;:::i;:::-;30028:74;;30111:93;30200:3;30111:93;:::i;:::-;30229:2;30224:3;30220:12;30213:19;;29872:366;;;:::o;30244:419::-;30410:4;30448:2;30437:9;30433:18;30425:26;;30497:9;30491:4;30487:20;30483:1;30472:9;30468:17;30461:47;30525:131;30651:4;30525:131;:::i;:::-;30517:139;;30244:419;;;:::o;30669:233::-;30708:3;30731:24;30749:5;30731:24;:::i;:::-;30722:33;;30777:66;30770:5;30767:77;30764:103;;;30847:18;;:::i;:::-;30764:103;30894:1;30887:5;30883:13;30876:20;;30669:233;;;:::o;30908:180::-;30956:77;30953:1;30946:88;31053:4;31050:1;31043:15;31077:4;31074:1;31067:15;31094:185;31134:1;31151:20;31169:1;31151:20;:::i;:::-;31146:25;;31185:20;31203:1;31185:20;:::i;:::-;31180:25;;31224:1;31214:35;;31229:18;;:::i;:::-;31214:35;31271:1;31268;31264:9;31259:14;;31094:185;;;;:::o;31285:176::-;31317:1;31334:20;31352:1;31334:20;:::i;:::-;31329:25;;31368:20;31386:1;31368:20;:::i;:::-;31363:25;;31407:1;31397:35;;31412:18;;:::i;:::-;31397:35;31453:1;31450;31446:9;31441:14;;31285:176;;;;:::o;31467:180::-;31515:77;31512:1;31505:88;31612:4;31609:1;31602:15;31636:4;31633:1;31626:15;31653:98;31704:6;31738:5;31732:12;31722:22;;31653:98;;;:::o;31757:168::-;31840:11;31874:6;31869:3;31862:19;31914:4;31909:3;31905:14;31890:29;;31757:168;;;;:::o;31931:360::-;32017:3;32045:38;32077:5;32045:38;:::i;:::-;32099:70;32162:6;32157:3;32099:70;:::i;:::-;32092:77;;32178:52;32223:6;32218:3;32211:4;32204:5;32200:16;32178:52;:::i;:::-;32255:29;32277:6;32255:29;:::i;:::-;32250:3;32246:39;32239:46;;32021:270;31931:360;;;;:::o;32297:640::-;32492:4;32530:3;32519:9;32515:19;32507:27;;32544:71;32612:1;32601:9;32597:17;32588:6;32544:71;:::i;:::-;32625:72;32693:2;32682:9;32678:18;32669:6;32625:72;:::i;:::-;32707;32775:2;32764:9;32760:18;32751:6;32707:72;:::i;:::-;32826:9;32820:4;32816:20;32811:2;32800:9;32796:18;32789:48;32854:76;32925:4;32916:6;32854:76;:::i;:::-;32846:84;;32297:640;;;;;;;:::o;32943:141::-;32999:5;33030:6;33024:13;33015:22;;33046:32;33072:5;33046:32;:::i;:::-;32943:141;;;;:::o;33090:349::-;33159:6;33208:2;33196:9;33187:7;33183:23;33179:32;33176:119;;;33214:79;;:::i;:::-;33176:119;33334:1;33359:63;33414:7;33405:6;33394:9;33390:22;33359:63;:::i;:::-;33349:73;;33305:127;33090:349;;;;:::o

Swarm Source

ipfs://34d7b3faaccbaedcc1bb3b414b7a6928c0c441ca6465fbedc48b7b77196ccff5
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.