ETH Price: $3,430.27 (+1.03%)

Token

ECC Domains (ECC)

Overview

Max Total Supply

26,072 ECC

Holders

8,083

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Balance
1 ECC
0x45a1fe688c01ccfd4606ac31d1f7b10fe2aa875e
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
ECCDomains

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at optimistic.etherscan.io on 2022-08-10
*/

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

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


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must 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);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;








/**
 * @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 ECCDomains is ERC721, Ownable {

    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;
    string private _baseTokenURI;

    constructor(string memory baseURI) ERC721("ECC Domains", "ECC")
    {
    _baseTokenURI = baseURI;
    _tokenIds.increment();
    }
    
    struct ensdomain {uint256 id;}
    mapping(string => ensdomain) public addrOf;

    struct linkedname {string ensname;}
    mapping(uint256 => linkedname) public nameOf;


    function _toLower(string memory str) 
        internal pure
        returns (string memory) 
    {
        bytes memory bStr = bytes(str);
        bytes memory bLower = new bytes(bStr.length);
        for (uint i = 0; i < bStr.length; i++) {
            // Uppercase character...
            if ((uint8(bStr[i]) >= 65) && (uint8(bStr[i]) <= 90)) {
                // So we add 32 to make it lowercase
                bLower[i] = bytes1(uint8(bStr[i]) + 32);
            } else {
                bLower[i] = bStr[i];
            }
        }
        return string(bLower);
    }

    function testAlphaNumeric(string memory str) 
        public view
        returns (bool)
    {
        bytes memory b = bytes(str);
        for(uint i; i<b.length; i++)
        {
        bytes1 char = b[i];
        if(!(char > 0x2F && char < 0x3A) && !(char > 0x60 && char < 0x7B)) return false;
        }
        return true;
    }



    function mintSubdomain(address subDomainOwner, string memory subDomain)
        public
        returns (uint256)
    {
        string memory domain = _toLower(subDomain);
        uint256 newItemId = _tokenIds.current();
        require(addrOf[domain].id == 0, "Sub-domain has already been registered");
        require(bytes(domain).length != 0, "Sub-domain cannot be null");
        require(testAlphaNumeric(domain) == true, "Sub-domain contains unsupported characters");
        

        addrOf[domain].id = newItemId;
        nameOf[newItemId].ensname = domain;

        _mint(subDomainOwner, newItemId);
        _tokenIds.increment();

        return newItemId;
    }

    function resolve(string memory subDomain)
        external view
        returns (address)
    {
        string memory domain = _toLower(subDomain);
        if(addrOf[domain].id == 0) { return address(0);}
        address owner = ownerOf(addrOf[domain].id);
        return owner;
    }



    function setBaseTokenURI(string memory baseURI) 
        external onlyOwner
        returns (string memory)
    {
        _baseTokenURI = baseURI;
        return _baseTokenURI;
    }


    function tokenURI(uint256 tokenId) 
        public view override 
        returns (string memory) 
    {
        string memory domain = nameOf[tokenId].ensname;
        string memory tokenlink = string(abi.encodePacked(_baseTokenURI, domain));
        return tokenlink;
    }


    function totalSupply() 
        external view 
        returns (uint256) 
    {
        uint256 supply = _tokenIds.current() - 1;
        return supply;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"addrOf","outputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"stateMutability":"view","type":"function"},{"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":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[{"internalType":"address","name":"subDomainOwner","type":"address"},{"internalType":"string","name":"subDomain","type":"string"}],"name":"mintSubdomain","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nameOf","outputs":[{"internalType":"string","name":"ensname","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"subDomain","type":"string"}],"name":"resolve","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":"baseURI","type":"string"}],"name":"setBaseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"string","name":"str","type":"string"}],"name":"testAlphaNumeric","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162003a5038038062003a50833981810160405281019062000037919062000340565b6040518060400160405280600b81526020017f45434320446f6d61696e730000000000000000000000000000000000000000008152506040518060400160405280600381526020017f45434300000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000bb92919062000212565b508060019080519060200190620000d492919062000212565b505050620000f7620000eb6200012e60201b60201c565b6200013660201b60201c565b80600890805190602001906200010f92919062000212565b50620001276007620001fc60201b6200131a1760201c565b5062000515565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b828054620002209062000426565b90600052602060002090601f01602090048101928262000244576000855562000290565b82601f106200025f57805160ff191683800117855562000290565b8280016001018555821562000290579182015b828111156200028f57825182559160200191906001019062000272565b5b5090506200029f9190620002a3565b5090565b5b80821115620002be576000816000905550600101620002a4565b5090565b6000620002d9620002d384620003ba565b62000391565b905082815260208101848484011115620002f857620002f7620004f5565b5b62000305848285620003f0565b509392505050565b600082601f830112620003255762000324620004f0565b5b815162000337848260208601620002c2565b91505092915050565b600060208284031215620003595762000358620004ff565b5b600082015167ffffffffffffffff8111156200037a5762000379620004fa565b5b62000388848285016200030d565b91505092915050565b60006200039d620003b0565b9050620003ab82826200045c565b919050565b6000604051905090565b600067ffffffffffffffff821115620003d857620003d7620004c1565b5b620003e38262000504565b9050602081019050919050565b60005b8381101562000410578082015181840152602081019050620003f3565b8381111562000420576000848401525b50505050565b600060028204905060018216806200043f57607f821691505b6020821081141562000456576200045562000492565b5b50919050565b620004678262000504565b810181811067ffffffffffffffff82111715620004895762000488620004c1565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b61352b80620005256000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c8063461a4478116100c3578063a22cb4651161007c578063a22cb465146103d8578063b88d4fde146103f4578063c87b56dd14610410578063d402edc014610440578063e985e9c514610470578063f2fde38b146104a05761014d565b8063461a4478146103025780636352211e1461033257806370a0823114610362578063715018a6146103925780638da5cb5b1461039c57806395d89b41146103ba5761014d565b806317a48acb1161011557806317a48acb1461021c57806318160ddd1461024c5780631afeeece1461026a57806323b872dd1461029a57806330176e13146102b657806342842e0e146102e65761014d565b806301ffc9a714610152578063051a26641461018257806306fdde03146101b2578063081812fc146101d0578063095ea7b314610200575b600080fd5b61016c6004803603810190610167919061240a565b6104bc565b6040516101799190612941565b60405180910390f35b61019c600480360381019061019791906124ad565b61059e565b6040516101a9919061295c565b60405180910390f35b6101ba610644565b6040516101c7919061295c565b60405180910390f35b6101ea60048036038101906101e591906124ad565b6106d6565b6040516101f791906128da565b60405180910390f35b61021a600480360381019061021591906123ca565b61075b565b005b61023660048036038101906102319190612464565b610873565b6040516102439190612bbe565b60405180910390f35b6102546108a7565b6040516102619190612bbe565b60405180910390f35b610284600480360381019061027f919061236e565b6108c9565b6040516102919190612bbe565b60405180910390f35b6102b460048036038101906102af9190612258565b610a4d565b005b6102d060048036038101906102cb9190612464565b610aad565b6040516102dd919061295c565b60405180910390f35b61030060048036038101906102fb9190612258565b610bd4565b005b61031c60048036038101906103179190612464565b610bf4565b60405161032991906128da565b60405180910390f35b61034c600480360381019061034791906124ad565b610c6f565b60405161035991906128da565b60405180910390f35b61037c600480360381019061037791906121eb565b610d21565b6040516103899190612bbe565b60405180910390f35b61039a610dd9565b005b6103a4610e61565b6040516103b191906128da565b60405180910390f35b6103c2610e8b565b6040516103cf919061295c565b60405180910390f35b6103f260048036038101906103ed919061232e565b610f1d565b005b61040e600480360381019061040991906122ab565b610f33565b005b61042a600480360381019061042591906124ad565b610f95565b604051610437919061295c565b60405180910390f35b61045a60048036038101906104559190612464565b61106b565b6040516104679190612941565b60405180910390f35b61048a60048036038101906104859190612218565b61118e565b6040516104979190612941565b60405180910390f35b6104ba60048036038101906104b591906121eb565b611222565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061058757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610597575061059682611330565b5b9050919050565b600a6020528060005260406000206000915090508060000180546105c190612e3c565b80601f01602080910402602001604051908101604052809291908181526020018280546105ed90612e3c565b801561063a5780601f1061060f5761010080835404028352916020019161063a565b820191906000526020600020905b81548152906001019060200180831161061d57829003601f168201915b5050505050905081565b60606000805461065390612e3c565b80601f016020809104026020016040519081016040528092919081815260200182805461067f90612e3c565b80156106cc5780601f106106a1576101008083540402835291602001916106cc565b820191906000526020600020905b8154815290600101906020018083116106af57829003601f168201915b5050505050905090565b60006106e18261139a565b610720576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071790612b1e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061076682610c6f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ce90612b7e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107f6611406565b73ffffffffffffffffffffffffffffffffffffffff16148061082557506108248161081f611406565b61118e565b5b610864576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085b90612a9e565b60405180910390fd5b61086e838361140e565b505050565b6009818051602081018201805184825260208301602085012081835280955050505050506000915090508060000154905081565b60008060016108b660076114c7565b6108c09190612d45565b90508091505090565b6000806108d5836114d5565b905060006108e360076114c7565b905060006009836040516108f7919061289f565b90815260200160405180910390206000015414610949576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094090612b3e565b60405180910390fd5b60008251141561098e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098590612a1e565b60405180910390fd5b6001151561099b8361106b565b1515146109dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d49061297e565b60405180910390fd5b806009836040516109ee919061289f565b90815260200160405180910390206000018190555081600a60008381526020019081526020016000206000019080519060200190610a2d929190611fff565b50610a38858261168d565b610a42600761131a565b809250505092915050565b610a5e610a58611406565b82611867565b610a9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9490612b9e565b60405180910390fd5b610aa8838383611945565b505050565b6060610ab7611406565b73ffffffffffffffffffffffffffffffffffffffff16610ad5610e61565b73ffffffffffffffffffffffffffffffffffffffff1614610b2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2290612b5e565b60405180910390fd5b8160089080519060200190610b41929190611fff565b5060088054610b4f90612e3c565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7b90612e3c565b8015610bc85780601f10610b9d57610100808354040283529160200191610bc8565b820191906000526020600020905b815481529060010190602001808311610bab57829003601f168201915b50505050509050919050565b610bef83838360405180602001604052806000815250610f33565b505050565b600080610c00836114d5565b90506000600982604051610c14919061289f565b9081526020016040518091039020600001541415610c36576000915050610c6a565b6000610c62600983604051610c4b919061289f565b908152602001604051809103902060000154610c6f565b905080925050505b919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0f90612ade565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8990612abe565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610de1611406565b73ffffffffffffffffffffffffffffffffffffffff16610dff610e61565b73ffffffffffffffffffffffffffffffffffffffff1614610e55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4c90612b5e565b60405180910390fd5b610e5f6000611bac565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610e9a90612e3c565b80601f0160208091040260200160405190810160405280929190818152602001828054610ec690612e3c565b8015610f135780601f10610ee857610100808354040283529160200191610f13565b820191906000526020600020905b815481529060010190602001808311610ef657829003601f168201915b5050505050905090565b610f2f610f28611406565b8383611c72565b5050565b610f44610f3e611406565b83611867565b610f83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7a90612b9e565b60405180910390fd5b610f8f84848484611ddf565b50505050565b60606000600a60008481526020019081526020016000206000018054610fba90612e3c565b80601f0160208091040260200160405190810160405280929190818152602001828054610fe690612e3c565b80156110335780601f1061100857610100808354040283529160200191611033565b820191906000526020600020905b81548152906001019060200180831161101657829003601f168201915b5050505050905060006008826040516020016110509291906128b6565b60405160208183030381529060405290508092505050919050565b60008082905060005b815181101561118257600082828151811061109257611091612f46565b5b602001015160f81c60f81b9050602f60f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161180156110f95750603a60f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916105b15801561115d5750606060f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611801561115b5750607b60f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916105b155b1561116e5760009350505050611189565b50808061117a90612e9f565b915050611074565b5060019150505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61122a611406565b73ffffffffffffffffffffffffffffffffffffffff16611248610e61565b73ffffffffffffffffffffffffffffffffffffffff161461129e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129590612b5e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561130e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611305906129be565b60405180910390fd5b61131781611bac565b50565b6001816000016000828254019250508190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661148183610c6f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b606060008290506000815167ffffffffffffffff8111156114f9576114f8612f75565b5b6040519080825280601f01601f19166020018201604052801561152b5781602001600182028036833780820191505090505b50905060005b825181101561168257604183828151811061154f5761154e612f46565b5b602001015160f81c60f81b60f81c60ff16101580156115925750605a83828151811061157e5761157d612f46565b5b602001015160f81c60f81b60f81c60ff1611155b1561160e5760208382815181106115ac576115ab612f46565b5b602001015160f81c60f81b60f81c6115c49190612d0e565b60f81b8282815181106115da576115d9612f46565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061166f565b82818151811061162157611620612f46565b5b602001015160f81c60f81b82828151811061163f5761163e612f46565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b808061167a90612e9f565b915050611531565b508092505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f490612afe565b60405180910390fd5b6117068161139a565b15611746576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173d906129fe565b60405180910390fd5b61175260008383611e3b565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117a29190612cb8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461186360008383611e40565b5050565b60006118728261139a565b6118b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a890612a7e565b60405180910390fd5b60006118bc83610c6f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806118fe57506118fd818561118e565b5b8061193c57508373ffffffffffffffffffffffffffffffffffffffff16611924846106d6565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661196582610c6f565b73ffffffffffffffffffffffffffffffffffffffff16146119bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b2906129de565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2290612a3e565b60405180910390fd5b611a36838383611e3b565b611a4160008261140e565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a919190612d45565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ae89190612cb8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611ba7838383611e40565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611ce1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd890612a5e565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611dd29190612941565b60405180910390a3505050565b611dea848484611945565b611df684848484611e45565b611e35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2c9061299e565b60405180910390fd5b50505050565b505050565b505050565b6000611e668473ffffffffffffffffffffffffffffffffffffffff16611fdc565b15611fcf578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611e8f611406565b8786866040518563ffffffff1660e01b8152600401611eb194939291906128f5565b602060405180830381600087803b158015611ecb57600080fd5b505af1925050508015611efc57506040513d601f19601f82011682018060405250810190611ef99190612437565b60015b611f7f573d8060008114611f2c576040519150601f19603f3d011682016040523d82523d6000602084013e611f31565b606091505b50600081511415611f77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6e9061299e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611fd4565b600190505b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b82805461200b90612e3c565b90600052602060002090601f01602090048101928261202d5760008555612074565b82601f1061204657805160ff1916838001178555612074565b82800160010185558215612074579182015b82811115612073578251825591602001919060010190612058565b5b5090506120819190612085565b5090565b5b8082111561209e576000816000905550600101612086565b5090565b60006120b56120b084612bfe565b612bd9565b9050828152602081018484840111156120d1576120d0612fa9565b5b6120dc848285612dfa565b509392505050565b60006120f76120f284612c2f565b612bd9565b90508281526020810184848401111561211357612112612fa9565b5b61211e848285612dfa565b509392505050565b60008135905061213581613499565b92915050565b60008135905061214a816134b0565b92915050565b60008135905061215f816134c7565b92915050565b600081519050612174816134c7565b92915050565b600082601f83011261218f5761218e612fa4565b5b813561219f8482602086016120a2565b91505092915050565b600082601f8301126121bd576121bc612fa4565b5b81356121cd8482602086016120e4565b91505092915050565b6000813590506121e5816134de565b92915050565b60006020828403121561220157612200612fb3565b5b600061220f84828501612126565b91505092915050565b6000806040838503121561222f5761222e612fb3565b5b600061223d85828601612126565b925050602061224e85828601612126565b9150509250929050565b60008060006060848603121561227157612270612fb3565b5b600061227f86828701612126565b935050602061229086828701612126565b92505060406122a1868287016121d6565b9150509250925092565b600080600080608085870312156122c5576122c4612fb3565b5b60006122d387828801612126565b94505060206122e487828801612126565b93505060406122f5878288016121d6565b925050606085013567ffffffffffffffff81111561231657612315612fae565b5b6123228782880161217a565b91505092959194509250565b6000806040838503121561234557612344612fb3565b5b600061235385828601612126565b92505060206123648582860161213b565b9150509250929050565b6000806040838503121561238557612384612fb3565b5b600061239385828601612126565b925050602083013567ffffffffffffffff8111156123b4576123b3612fae565b5b6123c0858286016121a8565b9150509250929050565b600080604083850312156123e1576123e0612fb3565b5b60006123ef85828601612126565b9250506020612400858286016121d6565b9150509250929050565b6000602082840312156124205761241f612fb3565b5b600061242e84828501612150565b91505092915050565b60006020828403121561244d5761244c612fb3565b5b600061245b84828501612165565b91505092915050565b60006020828403121561247a57612479612fb3565b5b600082013567ffffffffffffffff81111561249857612497612fae565b5b6124a4848285016121a8565b91505092915050565b6000602082840312156124c3576124c2612fb3565b5b60006124d1848285016121d6565b91505092915050565b6124e381612d79565b82525050565b6124f281612d8b565b82525050565b600061250382612c75565b61250d8185612c8b565b935061251d818560208601612e09565b61252681612fb8565b840191505092915050565b600061253c82612c80565b6125468185612c9c565b9350612556818560208601612e09565b61255f81612fb8565b840191505092915050565b600061257582612c80565b61257f8185612cad565b935061258f818560208601612e09565b80840191505092915050565b600081546125a881612e3c565b6125b28186612cad565b945060018216600081146125cd57600181146125de57612611565b60ff19831686528186019350612611565b6125e785612c60565b60005b83811015612609578154818901526001820191506020810190506125ea565b838801955050505b50505092915050565b6000612627602a83612c9c565b915061263282612fc9565b604082019050919050565b600061264a603283612c9c565b915061265582613018565b604082019050919050565b600061266d602683612c9c565b915061267882613067565b604082019050919050565b6000612690602583612c9c565b915061269b826130b6565b604082019050919050565b60006126b3601c83612c9c565b91506126be82613105565b602082019050919050565b60006126d6601983612c9c565b91506126e18261312e565b602082019050919050565b60006126f9602483612c9c565b915061270482613157565b604082019050919050565b600061271c601983612c9c565b9150612727826131a6565b602082019050919050565b600061273f602c83612c9c565b915061274a826131cf565b604082019050919050565b6000612762603883612c9c565b915061276d8261321e565b604082019050919050565b6000612785602a83612c9c565b91506127908261326d565b604082019050919050565b60006127a8602983612c9c565b91506127b3826132bc565b604082019050919050565b60006127cb602083612c9c565b91506127d68261330b565b602082019050919050565b60006127ee602c83612c9c565b91506127f982613334565b604082019050919050565b6000612811602683612c9c565b915061281c82613383565b604082019050919050565b6000612834602083612c9c565b915061283f826133d2565b602082019050919050565b6000612857602183612c9c565b9150612862826133fb565b604082019050919050565b600061287a603183612c9c565b91506128858261344a565b604082019050919050565b61289981612de3565b82525050565b60006128ab828461256a565b915081905092915050565b60006128c2828561259b565b91506128ce828461256a565b91508190509392505050565b60006020820190506128ef60008301846124da565b92915050565b600060808201905061290a60008301876124da565b61291760208301866124da565b6129246040830185612890565b818103606083015261293681846124f8565b905095945050505050565b600060208201905061295660008301846124e9565b92915050565b600060208201905081810360008301526129768184612531565b905092915050565b600060208201905081810360008301526129978161261a565b9050919050565b600060208201905081810360008301526129b78161263d565b9050919050565b600060208201905081810360008301526129d781612660565b9050919050565b600060208201905081810360008301526129f781612683565b9050919050565b60006020820190508181036000830152612a17816126a6565b9050919050565b60006020820190508181036000830152612a37816126c9565b9050919050565b60006020820190508181036000830152612a57816126ec565b9050919050565b60006020820190508181036000830152612a778161270f565b9050919050565b60006020820190508181036000830152612a9781612732565b9050919050565b60006020820190508181036000830152612ab781612755565b9050919050565b60006020820190508181036000830152612ad781612778565b9050919050565b60006020820190508181036000830152612af78161279b565b9050919050565b60006020820190508181036000830152612b17816127be565b9050919050565b60006020820190508181036000830152612b37816127e1565b9050919050565b60006020820190508181036000830152612b5781612804565b9050919050565b60006020820190508181036000830152612b7781612827565b9050919050565b60006020820190508181036000830152612b978161284a565b9050919050565b60006020820190508181036000830152612bb78161286d565b9050919050565b6000602082019050612bd36000830184612890565b92915050565b6000612be3612bf4565b9050612bef8282612e6e565b919050565b6000604051905090565b600067ffffffffffffffff821115612c1957612c18612f75565b5b612c2282612fb8565b9050602081019050919050565b600067ffffffffffffffff821115612c4a57612c49612f75565b5b612c5382612fb8565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612cc382612de3565b9150612cce83612de3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612d0357612d02612ee8565b5b828201905092915050565b6000612d1982612ded565b9150612d2483612ded565b92508260ff03821115612d3a57612d39612ee8565b5b828201905092915050565b6000612d5082612de3565b9150612d5b83612de3565b925082821015612d6e57612d6d612ee8565b5b828203905092915050565b6000612d8482612dc3565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015612e27578082015181840152602081019050612e0c565b83811115612e36576000848401525b50505050565b60006002820490506001821680612e5457607f821691505b60208210811415612e6857612e67612f17565b5b50919050565b612e7782612fb8565b810181811067ffffffffffffffff82111715612e9657612e95612f75565b5b80604052505050565b6000612eaa82612de3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612edd57612edc612ee8565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5375622d646f6d61696e20636f6e7461696e7320756e737570706f727465642060008201527f6368617261637465727300000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5375622d646f6d61696e2063616e6e6f74206265206e756c6c00000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5375622d646f6d61696e2068617320616c7265616479206265656e207265676960008201527f7374657265640000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6134a281612d79565b81146134ad57600080fd5b50565b6134b981612d8b565b81146134c457600080fd5b50565b6134d081612d97565b81146134db57600080fd5b50565b6134e781612de3565b81146134f257600080fd5b5056fea26469706673582212201d5cf14a2693b0a0532ef705fb56597230e9ea49b481f8c719067329ccef463764736f6c634300080700330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004568747470733a2f2f75732d63656e7472616c312d6d617469632d73657276696365732e636c6f756466756e6374696f6e732e6e65742f656363646f6d61696e733f656e733d000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061014d5760003560e01c8063461a4478116100c3578063a22cb4651161007c578063a22cb465146103d8578063b88d4fde146103f4578063c87b56dd14610410578063d402edc014610440578063e985e9c514610470578063f2fde38b146104a05761014d565b8063461a4478146103025780636352211e1461033257806370a0823114610362578063715018a6146103925780638da5cb5b1461039c57806395d89b41146103ba5761014d565b806317a48acb1161011557806317a48acb1461021c57806318160ddd1461024c5780631afeeece1461026a57806323b872dd1461029a57806330176e13146102b657806342842e0e146102e65761014d565b806301ffc9a714610152578063051a26641461018257806306fdde03146101b2578063081812fc146101d0578063095ea7b314610200575b600080fd5b61016c6004803603810190610167919061240a565b6104bc565b6040516101799190612941565b60405180910390f35b61019c600480360381019061019791906124ad565b61059e565b6040516101a9919061295c565b60405180910390f35b6101ba610644565b6040516101c7919061295c565b60405180910390f35b6101ea60048036038101906101e591906124ad565b6106d6565b6040516101f791906128da565b60405180910390f35b61021a600480360381019061021591906123ca565b61075b565b005b61023660048036038101906102319190612464565b610873565b6040516102439190612bbe565b60405180910390f35b6102546108a7565b6040516102619190612bbe565b60405180910390f35b610284600480360381019061027f919061236e565b6108c9565b6040516102919190612bbe565b60405180910390f35b6102b460048036038101906102af9190612258565b610a4d565b005b6102d060048036038101906102cb9190612464565b610aad565b6040516102dd919061295c565b60405180910390f35b61030060048036038101906102fb9190612258565b610bd4565b005b61031c60048036038101906103179190612464565b610bf4565b60405161032991906128da565b60405180910390f35b61034c600480360381019061034791906124ad565b610c6f565b60405161035991906128da565b60405180910390f35b61037c600480360381019061037791906121eb565b610d21565b6040516103899190612bbe565b60405180910390f35b61039a610dd9565b005b6103a4610e61565b6040516103b191906128da565b60405180910390f35b6103c2610e8b565b6040516103cf919061295c565b60405180910390f35b6103f260048036038101906103ed919061232e565b610f1d565b005b61040e600480360381019061040991906122ab565b610f33565b005b61042a600480360381019061042591906124ad565b610f95565b604051610437919061295c565b60405180910390f35b61045a60048036038101906104559190612464565b61106b565b6040516104679190612941565b60405180910390f35b61048a60048036038101906104859190612218565b61118e565b6040516104979190612941565b60405180910390f35b6104ba60048036038101906104b591906121eb565b611222565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061058757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610597575061059682611330565b5b9050919050565b600a6020528060005260406000206000915090508060000180546105c190612e3c565b80601f01602080910402602001604051908101604052809291908181526020018280546105ed90612e3c565b801561063a5780601f1061060f5761010080835404028352916020019161063a565b820191906000526020600020905b81548152906001019060200180831161061d57829003601f168201915b5050505050905081565b60606000805461065390612e3c565b80601f016020809104026020016040519081016040528092919081815260200182805461067f90612e3c565b80156106cc5780601f106106a1576101008083540402835291602001916106cc565b820191906000526020600020905b8154815290600101906020018083116106af57829003601f168201915b5050505050905090565b60006106e18261139a565b610720576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071790612b1e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061076682610c6f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ce90612b7e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107f6611406565b73ffffffffffffffffffffffffffffffffffffffff16148061082557506108248161081f611406565b61118e565b5b610864576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085b90612a9e565b60405180910390fd5b61086e838361140e565b505050565b6009818051602081018201805184825260208301602085012081835280955050505050506000915090508060000154905081565b60008060016108b660076114c7565b6108c09190612d45565b90508091505090565b6000806108d5836114d5565b905060006108e360076114c7565b905060006009836040516108f7919061289f565b90815260200160405180910390206000015414610949576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094090612b3e565b60405180910390fd5b60008251141561098e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098590612a1e565b60405180910390fd5b6001151561099b8361106b565b1515146109dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d49061297e565b60405180910390fd5b806009836040516109ee919061289f565b90815260200160405180910390206000018190555081600a60008381526020019081526020016000206000019080519060200190610a2d929190611fff565b50610a38858261168d565b610a42600761131a565b809250505092915050565b610a5e610a58611406565b82611867565b610a9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9490612b9e565b60405180910390fd5b610aa8838383611945565b505050565b6060610ab7611406565b73ffffffffffffffffffffffffffffffffffffffff16610ad5610e61565b73ffffffffffffffffffffffffffffffffffffffff1614610b2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2290612b5e565b60405180910390fd5b8160089080519060200190610b41929190611fff565b5060088054610b4f90612e3c565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7b90612e3c565b8015610bc85780601f10610b9d57610100808354040283529160200191610bc8565b820191906000526020600020905b815481529060010190602001808311610bab57829003601f168201915b50505050509050919050565b610bef83838360405180602001604052806000815250610f33565b505050565b600080610c00836114d5565b90506000600982604051610c14919061289f565b9081526020016040518091039020600001541415610c36576000915050610c6a565b6000610c62600983604051610c4b919061289f565b908152602001604051809103902060000154610c6f565b905080925050505b919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0f90612ade565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8990612abe565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610de1611406565b73ffffffffffffffffffffffffffffffffffffffff16610dff610e61565b73ffffffffffffffffffffffffffffffffffffffff1614610e55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4c90612b5e565b60405180910390fd5b610e5f6000611bac565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610e9a90612e3c565b80601f0160208091040260200160405190810160405280929190818152602001828054610ec690612e3c565b8015610f135780601f10610ee857610100808354040283529160200191610f13565b820191906000526020600020905b815481529060010190602001808311610ef657829003601f168201915b5050505050905090565b610f2f610f28611406565b8383611c72565b5050565b610f44610f3e611406565b83611867565b610f83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7a90612b9e565b60405180910390fd5b610f8f84848484611ddf565b50505050565b60606000600a60008481526020019081526020016000206000018054610fba90612e3c565b80601f0160208091040260200160405190810160405280929190818152602001828054610fe690612e3c565b80156110335780601f1061100857610100808354040283529160200191611033565b820191906000526020600020905b81548152906001019060200180831161101657829003601f168201915b5050505050905060006008826040516020016110509291906128b6565b60405160208183030381529060405290508092505050919050565b60008082905060005b815181101561118257600082828151811061109257611091612f46565b5b602001015160f81c60f81b9050602f60f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161180156110f95750603a60f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916105b15801561115d5750606060f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611801561115b5750607b60f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916105b155b1561116e5760009350505050611189565b50808061117a90612e9f565b915050611074565b5060019150505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61122a611406565b73ffffffffffffffffffffffffffffffffffffffff16611248610e61565b73ffffffffffffffffffffffffffffffffffffffff161461129e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129590612b5e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561130e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611305906129be565b60405180910390fd5b61131781611bac565b50565b6001816000016000828254019250508190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661148183610c6f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b606060008290506000815167ffffffffffffffff8111156114f9576114f8612f75565b5b6040519080825280601f01601f19166020018201604052801561152b5781602001600182028036833780820191505090505b50905060005b825181101561168257604183828151811061154f5761154e612f46565b5b602001015160f81c60f81b60f81c60ff16101580156115925750605a83828151811061157e5761157d612f46565b5b602001015160f81c60f81b60f81c60ff1611155b1561160e5760208382815181106115ac576115ab612f46565b5b602001015160f81c60f81b60f81c6115c49190612d0e565b60f81b8282815181106115da576115d9612f46565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061166f565b82818151811061162157611620612f46565b5b602001015160f81c60f81b82828151811061163f5761163e612f46565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b808061167a90612e9f565b915050611531565b508092505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f490612afe565b60405180910390fd5b6117068161139a565b15611746576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173d906129fe565b60405180910390fd5b61175260008383611e3b565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117a29190612cb8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461186360008383611e40565b5050565b60006118728261139a565b6118b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a890612a7e565b60405180910390fd5b60006118bc83610c6f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806118fe57506118fd818561118e565b5b8061193c57508373ffffffffffffffffffffffffffffffffffffffff16611924846106d6565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661196582610c6f565b73ffffffffffffffffffffffffffffffffffffffff16146119bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b2906129de565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2290612a3e565b60405180910390fd5b611a36838383611e3b565b611a4160008261140e565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a919190612d45565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ae89190612cb8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611ba7838383611e40565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611ce1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd890612a5e565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611dd29190612941565b60405180910390a3505050565b611dea848484611945565b611df684848484611e45565b611e35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2c9061299e565b60405180910390fd5b50505050565b505050565b505050565b6000611e668473ffffffffffffffffffffffffffffffffffffffff16611fdc565b15611fcf578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611e8f611406565b8786866040518563ffffffff1660e01b8152600401611eb194939291906128f5565b602060405180830381600087803b158015611ecb57600080fd5b505af1925050508015611efc57506040513d601f19601f82011682018060405250810190611ef99190612437565b60015b611f7f573d8060008114611f2c576040519150601f19603f3d011682016040523d82523d6000602084013e611f31565b606091505b50600081511415611f77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6e9061299e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611fd4565b600190505b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b82805461200b90612e3c565b90600052602060002090601f01602090048101928261202d5760008555612074565b82601f1061204657805160ff1916838001178555612074565b82800160010185558215612074579182015b82811115612073578251825591602001919060010190612058565b5b5090506120819190612085565b5090565b5b8082111561209e576000816000905550600101612086565b5090565b60006120b56120b084612bfe565b612bd9565b9050828152602081018484840111156120d1576120d0612fa9565b5b6120dc848285612dfa565b509392505050565b60006120f76120f284612c2f565b612bd9565b90508281526020810184848401111561211357612112612fa9565b5b61211e848285612dfa565b509392505050565b60008135905061213581613499565b92915050565b60008135905061214a816134b0565b92915050565b60008135905061215f816134c7565b92915050565b600081519050612174816134c7565b92915050565b600082601f83011261218f5761218e612fa4565b5b813561219f8482602086016120a2565b91505092915050565b600082601f8301126121bd576121bc612fa4565b5b81356121cd8482602086016120e4565b91505092915050565b6000813590506121e5816134de565b92915050565b60006020828403121561220157612200612fb3565b5b600061220f84828501612126565b91505092915050565b6000806040838503121561222f5761222e612fb3565b5b600061223d85828601612126565b925050602061224e85828601612126565b9150509250929050565b60008060006060848603121561227157612270612fb3565b5b600061227f86828701612126565b935050602061229086828701612126565b92505060406122a1868287016121d6565b9150509250925092565b600080600080608085870312156122c5576122c4612fb3565b5b60006122d387828801612126565b94505060206122e487828801612126565b93505060406122f5878288016121d6565b925050606085013567ffffffffffffffff81111561231657612315612fae565b5b6123228782880161217a565b91505092959194509250565b6000806040838503121561234557612344612fb3565b5b600061235385828601612126565b92505060206123648582860161213b565b9150509250929050565b6000806040838503121561238557612384612fb3565b5b600061239385828601612126565b925050602083013567ffffffffffffffff8111156123b4576123b3612fae565b5b6123c0858286016121a8565b9150509250929050565b600080604083850312156123e1576123e0612fb3565b5b60006123ef85828601612126565b9250506020612400858286016121d6565b9150509250929050565b6000602082840312156124205761241f612fb3565b5b600061242e84828501612150565b91505092915050565b60006020828403121561244d5761244c612fb3565b5b600061245b84828501612165565b91505092915050565b60006020828403121561247a57612479612fb3565b5b600082013567ffffffffffffffff81111561249857612497612fae565b5b6124a4848285016121a8565b91505092915050565b6000602082840312156124c3576124c2612fb3565b5b60006124d1848285016121d6565b91505092915050565b6124e381612d79565b82525050565b6124f281612d8b565b82525050565b600061250382612c75565b61250d8185612c8b565b935061251d818560208601612e09565b61252681612fb8565b840191505092915050565b600061253c82612c80565b6125468185612c9c565b9350612556818560208601612e09565b61255f81612fb8565b840191505092915050565b600061257582612c80565b61257f8185612cad565b935061258f818560208601612e09565b80840191505092915050565b600081546125a881612e3c565b6125b28186612cad565b945060018216600081146125cd57600181146125de57612611565b60ff19831686528186019350612611565b6125e785612c60565b60005b83811015612609578154818901526001820191506020810190506125ea565b838801955050505b50505092915050565b6000612627602a83612c9c565b915061263282612fc9565b604082019050919050565b600061264a603283612c9c565b915061265582613018565b604082019050919050565b600061266d602683612c9c565b915061267882613067565b604082019050919050565b6000612690602583612c9c565b915061269b826130b6565b604082019050919050565b60006126b3601c83612c9c565b91506126be82613105565b602082019050919050565b60006126d6601983612c9c565b91506126e18261312e565b602082019050919050565b60006126f9602483612c9c565b915061270482613157565b604082019050919050565b600061271c601983612c9c565b9150612727826131a6565b602082019050919050565b600061273f602c83612c9c565b915061274a826131cf565b604082019050919050565b6000612762603883612c9c565b915061276d8261321e565b604082019050919050565b6000612785602a83612c9c565b91506127908261326d565b604082019050919050565b60006127a8602983612c9c565b91506127b3826132bc565b604082019050919050565b60006127cb602083612c9c565b91506127d68261330b565b602082019050919050565b60006127ee602c83612c9c565b91506127f982613334565b604082019050919050565b6000612811602683612c9c565b915061281c82613383565b604082019050919050565b6000612834602083612c9c565b915061283f826133d2565b602082019050919050565b6000612857602183612c9c565b9150612862826133fb565b604082019050919050565b600061287a603183612c9c565b91506128858261344a565b604082019050919050565b61289981612de3565b82525050565b60006128ab828461256a565b915081905092915050565b60006128c2828561259b565b91506128ce828461256a565b91508190509392505050565b60006020820190506128ef60008301846124da565b92915050565b600060808201905061290a60008301876124da565b61291760208301866124da565b6129246040830185612890565b818103606083015261293681846124f8565b905095945050505050565b600060208201905061295660008301846124e9565b92915050565b600060208201905081810360008301526129768184612531565b905092915050565b600060208201905081810360008301526129978161261a565b9050919050565b600060208201905081810360008301526129b78161263d565b9050919050565b600060208201905081810360008301526129d781612660565b9050919050565b600060208201905081810360008301526129f781612683565b9050919050565b60006020820190508181036000830152612a17816126a6565b9050919050565b60006020820190508181036000830152612a37816126c9565b9050919050565b60006020820190508181036000830152612a57816126ec565b9050919050565b60006020820190508181036000830152612a778161270f565b9050919050565b60006020820190508181036000830152612a9781612732565b9050919050565b60006020820190508181036000830152612ab781612755565b9050919050565b60006020820190508181036000830152612ad781612778565b9050919050565b60006020820190508181036000830152612af78161279b565b9050919050565b60006020820190508181036000830152612b17816127be565b9050919050565b60006020820190508181036000830152612b37816127e1565b9050919050565b60006020820190508181036000830152612b5781612804565b9050919050565b60006020820190508181036000830152612b7781612827565b9050919050565b60006020820190508181036000830152612b978161284a565b9050919050565b60006020820190508181036000830152612bb78161286d565b9050919050565b6000602082019050612bd36000830184612890565b92915050565b6000612be3612bf4565b9050612bef8282612e6e565b919050565b6000604051905090565b600067ffffffffffffffff821115612c1957612c18612f75565b5b612c2282612fb8565b9050602081019050919050565b600067ffffffffffffffff821115612c4a57612c49612f75565b5b612c5382612fb8565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612cc382612de3565b9150612cce83612de3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612d0357612d02612ee8565b5b828201905092915050565b6000612d1982612ded565b9150612d2483612ded565b92508260ff03821115612d3a57612d39612ee8565b5b828201905092915050565b6000612d5082612de3565b9150612d5b83612de3565b925082821015612d6e57612d6d612ee8565b5b828203905092915050565b6000612d8482612dc3565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015612e27578082015181840152602081019050612e0c565b83811115612e36576000848401525b50505050565b60006002820490506001821680612e5457607f821691505b60208210811415612e6857612e67612f17565b5b50919050565b612e7782612fb8565b810181811067ffffffffffffffff82111715612e9657612e95612f75565b5b80604052505050565b6000612eaa82612de3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612edd57612edc612ee8565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5375622d646f6d61696e20636f6e7461696e7320756e737570706f727465642060008201527f6368617261637465727300000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5375622d646f6d61696e2063616e6e6f74206265206e756c6c00000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5375622d646f6d61696e2068617320616c7265616479206265656e207265676960008201527f7374657265640000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6134a281612d79565b81146134ad57600080fd5b50565b6134b981612d8b565b81146134c457600080fd5b50565b6134d081612d97565b81146134db57600080fd5b50565b6134e781612de3565b81146134f257600080fd5b5056fea26469706673582212201d5cf14a2693b0a0532ef705fb56597230e9ea49b481f8c719067329ccef463764736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004568747470733a2f2f75732d63656e7472616c312d6d617469632d73657276696365732e636c6f756466756e6374696f6e732e6e65742f656363646f6d61696e733f656e733d000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : baseURI (string): https://us-central1-matic-services.cloudfunctions.net/eccdomains?ens=

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000045
Arg [2] : 68747470733a2f2f75732d63656e7472616c312d6d617469632d736572766963
Arg [3] : 65732e636c6f756466756e6374696f6e732e6e65742f656363646f6d61696e73
Arg [4] : 3f656e733d000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

38645:3114:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25530:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39088:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26475:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28035:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27558:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38996:42;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41590:164;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40098:690;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28785:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41100:188;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29195:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40796:292;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26169:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25899:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6113:103;;;:::i;:::-;;5462:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26644:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28328:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29451:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41298:282;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39743:343;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28554:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6371:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25530:305;25632:4;25684:25;25669:40;;;:11;:40;;;;:105;;;;25741:33;25726:48;;;:11;:48;;;;25669:105;:158;;;;25791:36;25815:11;25791:23;:36::i;:::-;25669:158;25649:178;;25530:305;;;:::o;39088:44::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26475:100::-;26529:13;26562:5;26555:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26475:100;:::o;28035:221::-;28111:7;28139:16;28147:7;28139;:16::i;:::-;28131:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28224:15;:24;28240:7;28224:24;;;;;;;;;;;;;;;;;;;;;28217:31;;28035:221;;;:::o;27558:411::-;27639:13;27655:23;27670:7;27655:14;:23::i;:::-;27639:39;;27703:5;27697:11;;:2;:11;;;;27689:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27797:5;27781:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27806:37;27823:5;27830:12;:10;:12::i;:::-;27806:16;:37::i;:::-;27781:62;27759:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;27940:21;27949:2;27953:7;27940:8;:21::i;:::-;27628:341;27558:411;;:::o;38996:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41590:164::-;41656:7;41682:14;41721:1;41699:19;:9;:17;:19::i;:::-;:23;;;;:::i;:::-;41682:40;;41740:6;41733:13;;;41590:164;:::o;40098:690::-;40204:7;40229:20;40252:19;40261:9;40252:8;:19::i;:::-;40229:42;;40282:17;40302:19;:9;:17;:19::i;:::-;40282:39;;40361:1;40340:6;40347;40340:14;;;;;;:::i;:::-;;;;;;;;;;;;;:17;;;:22;40332:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40448:1;40430:6;40424:20;:25;;40416:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;40526:4;40498:32;;:24;40515:6;40498:16;:24::i;:::-;:32;;;40490:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;40620:9;40600:6;40607;40600:14;;;;;;:::i;:::-;;;;;;;;;;;;;:17;;:29;;;;40668:6;40640;:17;40647:9;40640:17;;;;;;;;;;;:25;;:34;;;;;;;;;;;;:::i;:::-;;40687:32;40693:14;40709:9;40687:5;:32::i;:::-;40730:21;:9;:19;:21::i;:::-;40771:9;40764:16;;;;40098:690;;;;:::o;28785:339::-;28980:41;28999:12;:10;:12::i;:::-;29013:7;28980:18;:41::i;:::-;28972:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29088:28;29098:4;29104:2;29108:7;29088:9;:28::i;:::-;28785:339;;;:::o;41100:188::-;41195:13;5693:12;:10;:12::i;:::-;5682:23;;:7;:5;:7::i;:::-;:23;;;5674:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41242:7:::1;41226:13;:23;;;;;;;;;;;;:::i;:::-;;41267:13;41260:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41100:188:::0;;;:::o;29195:185::-;29333:39;29350:4;29356:2;29360:7;29333:39;;;;;;;;;;;;:16;:39::i;:::-;29195:185;;;:::o;40796:292::-;40879:7;40904:20;40927:19;40936:9;40927:8;:19::i;:::-;40904:42;;40981:1;40960:6;40967;40960:14;;;;;;:::i;:::-;;;;;;;;;;;;;:17;;;:22;40957:48;;;41001:1;40986:17;;;;;40957:48;41015:13;41031:26;41039:6;41046;41039:14;;;;;;:::i;:::-;;;;;;;;;;;;;:17;;;41031:7;:26::i;:::-;41015:42;;41075:5;41068:12;;;;40796:292;;;;:::o;26169:239::-;26241:7;26261:13;26277:7;:16;26285:7;26277:16;;;;;;;;;;;;;;;;;;;;;26261:32;;26329:1;26312:19;;:5;:19;;;;26304:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26395:5;26388:12;;;26169:239;;;:::o;25899:208::-;25971:7;26016:1;25999:19;;:5;:19;;;;25991:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;26083:9;:16;26093:5;26083:16;;;;;;;;;;;;;;;;26076:23;;25899:208;;;:::o;6113:103::-;5693:12;:10;:12::i;:::-;5682:23;;:7;:5;:7::i;:::-;:23;;;5674:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6178:30:::1;6205:1;6178:18;:30::i;:::-;6113:103::o:0;5462:87::-;5508:7;5535:6;;;;;;;;;;;5528:13;;5462:87;:::o;26644:104::-;26700:13;26733:7;26726:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26644:104;:::o;28328:155::-;28423:52;28442:12;:10;:12::i;:::-;28456:8;28466;28423:18;:52::i;:::-;28328:155;;:::o;29451:328::-;29626:41;29645:12;:10;:12::i;:::-;29659:7;29626:18;:41::i;:::-;29618:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29732:39;29746:4;29752:2;29756:7;29765:5;29732:13;:39::i;:::-;29451:328;;;;:::o;41298:282::-;41383:13;41415:20;41438:6;:15;41445:7;41438:15;;;;;;;;;;;:23;;41415:46;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41472:23;41522:13;41537:6;41505:39;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41472:73;;41563:9;41556:16;;;;41298:282;;;:::o;39743:343::-;39828:4;39850:14;39873:3;39850:27;;39892:6;39888:169;39902:1;:8;39900:1;:10;39888:169;;;39937:11;39951:1;39953;39951:4;;;;;;;;:::i;:::-;;;;;;;;;;39937:18;;39978:4;39971:11;;:4;:11;;;;:26;;;;;39993:4;39986:11;;:4;:11;;;;39971:26;39969:29;:62;;;;;40011:4;40004:11;;:4;:11;;;;:26;;;;;40026:4;40019:11;;:4;:11;;;;40004:26;40002:29;39969:62;39966:79;;;40040:5;40033:12;;;;;;;39966:79;39926:131;39912:3;;;;;:::i;:::-;;;;39888:169;;;;40074:4;40067:11;;;39743:343;;;;:::o;28554:164::-;28651:4;28675:18;:25;28694:5;28675:25;;;;;;;;;;;;;;;:35;28701:8;28675:35;;;;;;;;;;;;;;;;;;;;;;;;;28668:42;;28554:164;;;;:::o;6371:201::-;5693:12;:10;:12::i;:::-;5682:23;;:7;:5;:7::i;:::-;:23;;;5674:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6480:1:::1;6460:22;;:8;:22;;;;6452:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6536:28;6555:8;6536:18;:28::i;:::-;6371:201:::0;:::o;912:127::-;1019:1;1001:7;:14;;;:19;;;;;;;;;;;912:127;:::o;18269:157::-;18354:4;18393:25;18378:40;;;:11;:40;;;;18371:47;;18269:157;;;:::o;31289:127::-;31354:4;31406:1;31378:30;;:7;:16;31386:7;31378:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31371:37;;31289:127;;;:::o;4186:98::-;4239:7;4266:10;4259:17;;4186:98;:::o;35435:174::-;35537:2;35510:15;:24;35526:7;35510:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35593:7;35589:2;35555:46;;35564:23;35579:7;35564:14;:23::i;:::-;35555:46;;;;;;;;;;;;35435:174;;:::o;790:114::-;855:7;882;:14;;;875:21;;790:114;;;:::o;39143:592::-;39222:13;39254:17;39280:3;39254:30;;39295:19;39327:4;:11;39317:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39295:44;;39355:6;39350:346;39371:4;:11;39367:1;:15;39350:346;;;39466:2;39454:4;39459:1;39454:7;;;;;;;;:::i;:::-;;;;;;;;;;39448:14;;:20;;;;39447:48;;;;;39492:2;39480:4;39485:1;39480:7;;;;;;;;:::i;:::-;;;;;;;;;;39474:14;;:20;;;;39447:48;39443:242;;;39606:2;39595:4;39600:1;39595:7;;;;;;;;:::i;:::-;;;;;;;;;;39589:14;;:19;;;;:::i;:::-;39582:27;;39570:6;39577:1;39570:9;;;;;;;;:::i;:::-;;;;;:39;;;;;;;;;;;39443:242;;;39662:4;39667:1;39662:7;;;;;;;;:::i;:::-;;;;;;;;;;39650:6;39657:1;39650:9;;;;;;;;:::i;:::-;;;;;:19;;;;;;;;;;;39443:242;39384:3;;;;;:::i;:::-;;;;39350:346;;;;39720:6;39706:21;;;;39143:592;;;:::o;33267:439::-;33361:1;33347:16;;:2;:16;;;;33339:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33420:16;33428:7;33420;:16::i;:::-;33419:17;33411:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33482:45;33511:1;33515:2;33519:7;33482:20;:45::i;:::-;33557:1;33540:9;:13;33550:2;33540:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33588:2;33569:7;:16;33577:7;33569:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33633:7;33629:2;33608:33;;33625:1;33608:33;;;;;;;;;;;;33654:44;33682:1;33686:2;33690:7;33654:19;:44::i;:::-;33267:439;;:::o;31583:348::-;31676:4;31701:16;31709:7;31701;:16::i;:::-;31693:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31777:13;31793:23;31808:7;31793:14;:23::i;:::-;31777:39;;31846:5;31835:16;;:7;:16;;;:52;;;;31855:32;31872:5;31879:7;31855:16;:32::i;:::-;31835:52;:87;;;;31915:7;31891:31;;:20;31903:7;31891:11;:20::i;:::-;:31;;;31835:87;31827:96;;;31583:348;;;;:::o;34692:625::-;34851:4;34824:31;;:23;34839:7;34824:14;:23::i;:::-;:31;;;34816:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;34930:1;34916:16;;:2;:16;;;;34908:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34986:39;35007:4;35013:2;35017:7;34986:20;:39::i;:::-;35090:29;35107:1;35111:7;35090:8;:29::i;:::-;35151:1;35132:9;:15;35142:4;35132:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;35180:1;35163:9;:13;35173:2;35163:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35211:2;35192:7;:16;35200:7;35192:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35250:7;35246:2;35231:27;;35240:4;35231:27;;;;;;;;;;;;35271:38;35291:4;35297:2;35301:7;35271:19;:38::i;:::-;34692:625;;;:::o;6732:191::-;6806:16;6825:6;;;;;;;;;;;6806:25;;6851:8;6842:6;;:17;;;;;;;;;;;;;;;;;;6906:8;6875:40;;6896:8;6875:40;;;;;;;;;;;;6795:128;6732:191;:::o;35751:315::-;35906:8;35897:17;;:5;:17;;;;35889:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;35993:8;35955:18;:25;35974:5;35955:25;;;;;;;;;;;;;;;:35;35981:8;35955:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;36039:8;36017:41;;36032:5;36017:41;;;36049:8;36017:41;;;;;;:::i;:::-;;;;;;;;35751:315;;;:::o;30661:::-;30818:28;30828:4;30834:2;30838:7;30818:9;:28::i;:::-;30865:48;30888:4;30894:2;30898:7;30907:5;30865:22;:48::i;:::-;30857:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;30661:315;;;;:::o;38002:126::-;;;;:::o;38513:125::-;;;;:::o;36631:799::-;36786:4;36807:15;:2;:13;;;:15::i;:::-;36803:620;;;36859:2;36843:36;;;36880:12;:10;:12::i;:::-;36894:4;36900:7;36909:5;36843:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36839:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37102:1;37085:6;:13;:18;37081:272;;;37128:60;;;;;;;;;;:::i;:::-;;;;;;;;37081:272;37303:6;37297:13;37288:6;37284:2;37280:15;37273:38;36839:529;36976:41;;;36966:51;;;:6;:51;;;;36959:58;;;;;36803:620;37407:4;37400:11;;36631:799;;;;;;;:::o;8163:326::-;8223:4;8480:1;8458:7;:19;;;:23;8451:30;;8163:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:654::-;5218:6;5226;5275:2;5263:9;5254:7;5250:23;5246:32;5243:119;;;5281:79;;:::i;:::-;5243:119;5401:1;5426:53;5471:7;5462:6;5451:9;5447:22;5426:53;:::i;:::-;5416:63;;5372:117;5556:2;5545:9;5541:18;5528:32;5587:18;5579:6;5576:30;5573:117;;;5609:79;;:::i;:::-;5573:117;5714:63;5769:7;5760:6;5749:9;5745:22;5714:63;:::i;:::-;5704:73;;5499:288;5140:654;;;;;:::o;5800:474::-;5868:6;5876;5925:2;5913:9;5904:7;5900:23;5896:32;5893:119;;;5931:79;;:::i;:::-;5893:119;6051:1;6076:53;6121:7;6112:6;6101:9;6097:22;6076:53;:::i;:::-;6066:63;;6022:117;6178:2;6204:53;6249:7;6240:6;6229:9;6225:22;6204:53;:::i;:::-;6194:63;;6149:118;5800:474;;;;;:::o;6280:327::-;6338:6;6387:2;6375:9;6366:7;6362:23;6358:32;6355:119;;;6393:79;;:::i;:::-;6355:119;6513:1;6538:52;6582:7;6573:6;6562:9;6558:22;6538:52;:::i;:::-;6528:62;;6484:116;6280:327;;;;:::o;6613:349::-;6682:6;6731:2;6719:9;6710:7;6706:23;6702:32;6699:119;;;6737:79;;:::i;:::-;6699:119;6857:1;6882:63;6937:7;6928:6;6917:9;6913:22;6882:63;:::i;:::-;6872:73;;6828:127;6613:349;;;;:::o;6968:509::-;7037:6;7086:2;7074:9;7065:7;7061:23;7057:32;7054:119;;;7092:79;;:::i;:::-;7054:119;7240:1;7229:9;7225:17;7212:31;7270:18;7262:6;7259:30;7256:117;;;7292:79;;:::i;:::-;7256:117;7397:63;7452:7;7443:6;7432:9;7428:22;7397:63;:::i;:::-;7387:73;;7183:287;6968:509;;;;:::o;7483:329::-;7542:6;7591:2;7579:9;7570:7;7566:23;7562:32;7559:119;;;7597:79;;:::i;:::-;7559:119;7717:1;7742:53;7787:7;7778:6;7767:9;7763:22;7742:53;:::i;:::-;7732:63;;7688:117;7483:329;;;;:::o;7818:118::-;7905:24;7923:5;7905:24;:::i;:::-;7900:3;7893:37;7818:118;;:::o;7942:109::-;8023:21;8038:5;8023:21;:::i;:::-;8018:3;8011:34;7942:109;;:::o;8057:360::-;8143:3;8171:38;8203:5;8171:38;:::i;:::-;8225:70;8288:6;8283:3;8225:70;:::i;:::-;8218:77;;8304:52;8349:6;8344:3;8337:4;8330:5;8326:16;8304:52;:::i;:::-;8381:29;8403:6;8381:29;:::i;:::-;8376:3;8372:39;8365:46;;8147:270;8057:360;;;;:::o;8423:364::-;8511:3;8539:39;8572:5;8539:39;:::i;:::-;8594:71;8658:6;8653:3;8594:71;:::i;:::-;8587:78;;8674:52;8719:6;8714:3;8707:4;8700:5;8696:16;8674:52;:::i;:::-;8751:29;8773:6;8751:29;:::i;:::-;8746:3;8742:39;8735:46;;8515:272;8423:364;;;;:::o;8793:377::-;8899:3;8927:39;8960:5;8927:39;:::i;:::-;8982:89;9064:6;9059:3;8982:89;:::i;:::-;8975:96;;9080:52;9125:6;9120:3;9113:4;9106:5;9102:16;9080:52;:::i;:::-;9157:6;9152:3;9148:16;9141:23;;8903:267;8793:377;;;;:::o;9200:845::-;9303:3;9340:5;9334:12;9369:36;9395:9;9369:36;:::i;:::-;9421:89;9503:6;9498:3;9421:89;:::i;:::-;9414:96;;9541:1;9530:9;9526:17;9557:1;9552:137;;;;9703:1;9698:341;;;;9519:520;;9552:137;9636:4;9632:9;9621;9617:25;9612:3;9605:38;9672:6;9667:3;9663:16;9656:23;;9552:137;;9698:341;9765:38;9797:5;9765:38;:::i;:::-;9825:1;9839:154;9853:6;9850:1;9847:13;9839:154;;;9927:7;9921:14;9917:1;9912:3;9908:11;9901:35;9977:1;9968:7;9964:15;9953:26;;9875:4;9872:1;9868:12;9863:17;;9839:154;;;10022:6;10017:3;10013:16;10006:23;;9705:334;;9519:520;;9307:738;;9200:845;;;;:::o;10051:366::-;10193:3;10214:67;10278:2;10273:3;10214:67;:::i;:::-;10207:74;;10290:93;10379:3;10290:93;:::i;:::-;10408:2;10403:3;10399:12;10392:19;;10051:366;;;:::o;10423:::-;10565:3;10586:67;10650:2;10645:3;10586:67;:::i;:::-;10579:74;;10662:93;10751:3;10662:93;:::i;:::-;10780:2;10775:3;10771:12;10764:19;;10423:366;;;:::o;10795:::-;10937:3;10958:67;11022:2;11017:3;10958:67;:::i;:::-;10951:74;;11034:93;11123:3;11034:93;:::i;:::-;11152:2;11147:3;11143:12;11136:19;;10795:366;;;:::o;11167:::-;11309:3;11330:67;11394:2;11389:3;11330:67;:::i;:::-;11323:74;;11406:93;11495:3;11406:93;:::i;:::-;11524:2;11519:3;11515:12;11508:19;;11167:366;;;:::o;11539:::-;11681:3;11702:67;11766:2;11761:3;11702:67;:::i;:::-;11695:74;;11778:93;11867:3;11778:93;:::i;:::-;11896:2;11891:3;11887:12;11880:19;;11539:366;;;:::o;11911:::-;12053:3;12074:67;12138:2;12133:3;12074:67;:::i;:::-;12067:74;;12150:93;12239:3;12150:93;:::i;:::-;12268:2;12263:3;12259:12;12252:19;;11911:366;;;:::o;12283:::-;12425:3;12446:67;12510:2;12505:3;12446:67;:::i;:::-;12439:74;;12522:93;12611:3;12522:93;:::i;:::-;12640:2;12635:3;12631:12;12624:19;;12283:366;;;:::o;12655:::-;12797:3;12818:67;12882:2;12877:3;12818:67;:::i;:::-;12811:74;;12894:93;12983:3;12894:93;:::i;:::-;13012:2;13007:3;13003:12;12996:19;;12655:366;;;:::o;13027:::-;13169:3;13190:67;13254:2;13249:3;13190:67;:::i;:::-;13183:74;;13266:93;13355:3;13266:93;:::i;:::-;13384:2;13379:3;13375:12;13368:19;;13027:366;;;:::o;13399:::-;13541:3;13562:67;13626:2;13621:3;13562:67;:::i;:::-;13555:74;;13638:93;13727:3;13638:93;:::i;:::-;13756:2;13751:3;13747:12;13740:19;;13399:366;;;:::o;13771:::-;13913:3;13934:67;13998:2;13993:3;13934:67;:::i;:::-;13927:74;;14010:93;14099:3;14010:93;:::i;:::-;14128:2;14123:3;14119:12;14112:19;;13771:366;;;:::o;14143:::-;14285:3;14306:67;14370:2;14365:3;14306:67;:::i;:::-;14299:74;;14382:93;14471:3;14382:93;:::i;:::-;14500:2;14495:3;14491:12;14484:19;;14143:366;;;:::o;14515:::-;14657:3;14678:67;14742:2;14737:3;14678:67;:::i;:::-;14671:74;;14754:93;14843:3;14754:93;:::i;:::-;14872:2;14867:3;14863:12;14856:19;;14515:366;;;:::o;14887:::-;15029:3;15050:67;15114:2;15109:3;15050:67;:::i;:::-;15043:74;;15126:93;15215:3;15126:93;:::i;:::-;15244:2;15239:3;15235:12;15228:19;;14887:366;;;:::o;15259:::-;15401:3;15422:67;15486:2;15481:3;15422:67;:::i;:::-;15415:74;;15498:93;15587:3;15498:93;:::i;:::-;15616:2;15611:3;15607:12;15600:19;;15259:366;;;:::o;15631:::-;15773:3;15794:67;15858:2;15853:3;15794:67;:::i;:::-;15787:74;;15870:93;15959:3;15870:93;:::i;:::-;15988:2;15983:3;15979:12;15972:19;;15631:366;;;:::o;16003:::-;16145:3;16166:67;16230:2;16225:3;16166:67;:::i;:::-;16159:74;;16242:93;16331:3;16242:93;:::i;:::-;16360:2;16355:3;16351:12;16344:19;;16003:366;;;:::o;16375:::-;16517:3;16538:67;16602:2;16597:3;16538:67;:::i;:::-;16531:74;;16614:93;16703:3;16614:93;:::i;:::-;16732:2;16727:3;16723:12;16716:19;;16375:366;;;:::o;16747:118::-;16834:24;16852:5;16834:24;:::i;:::-;16829:3;16822:37;16747:118;;:::o;16871:275::-;17003:3;17025:95;17116:3;17107:6;17025:95;:::i;:::-;17018:102;;17137:3;17130:10;;16871:275;;;;:::o;17152:429::-;17329:3;17351:92;17439:3;17430:6;17351:92;:::i;:::-;17344:99;;17460:95;17551:3;17542:6;17460:95;:::i;:::-;17453:102;;17572:3;17565:10;;17152:429;;;;;:::o;17587:222::-;17680:4;17718:2;17707:9;17703:18;17695:26;;17731:71;17799:1;17788:9;17784:17;17775:6;17731:71;:::i;:::-;17587:222;;;;:::o;17815:640::-;18010:4;18048:3;18037:9;18033:19;18025:27;;18062:71;18130:1;18119:9;18115:17;18106:6;18062:71;:::i;:::-;18143:72;18211:2;18200:9;18196:18;18187:6;18143:72;:::i;:::-;18225;18293:2;18282:9;18278:18;18269:6;18225:72;:::i;:::-;18344:9;18338:4;18334:20;18329:2;18318:9;18314:18;18307:48;18372:76;18443:4;18434:6;18372:76;:::i;:::-;18364:84;;17815:640;;;;;;;:::o;18461:210::-;18548:4;18586:2;18575:9;18571:18;18563:26;;18599:65;18661:1;18650:9;18646:17;18637:6;18599:65;:::i;:::-;18461:210;;;;:::o;18677:313::-;18790:4;18828:2;18817:9;18813:18;18805:26;;18877:9;18871:4;18867:20;18863:1;18852:9;18848:17;18841:47;18905:78;18978:4;18969:6;18905:78;:::i;:::-;18897:86;;18677:313;;;;:::o;18996:419::-;19162:4;19200:2;19189:9;19185:18;19177:26;;19249:9;19243:4;19239:20;19235:1;19224:9;19220:17;19213:47;19277:131;19403:4;19277:131;:::i;:::-;19269:139;;18996:419;;;:::o;19421:::-;19587:4;19625:2;19614:9;19610:18;19602:26;;19674:9;19668:4;19664:20;19660:1;19649:9;19645:17;19638:47;19702:131;19828:4;19702:131;:::i;:::-;19694:139;;19421:419;;;:::o;19846:::-;20012:4;20050:2;20039:9;20035:18;20027:26;;20099:9;20093:4;20089:20;20085:1;20074:9;20070:17;20063:47;20127:131;20253:4;20127:131;:::i;:::-;20119:139;;19846:419;;;:::o;20271:::-;20437:4;20475:2;20464:9;20460:18;20452:26;;20524:9;20518:4;20514:20;20510:1;20499:9;20495:17;20488:47;20552:131;20678:4;20552:131;:::i;:::-;20544:139;;20271:419;;;:::o;20696:::-;20862:4;20900:2;20889:9;20885:18;20877:26;;20949:9;20943:4;20939:20;20935:1;20924:9;20920:17;20913:47;20977:131;21103:4;20977:131;:::i;:::-;20969:139;;20696:419;;;:::o;21121:::-;21287:4;21325:2;21314:9;21310:18;21302:26;;21374:9;21368:4;21364:20;21360:1;21349:9;21345:17;21338:47;21402:131;21528:4;21402:131;:::i;:::-;21394:139;;21121:419;;;:::o;21546:::-;21712:4;21750:2;21739:9;21735:18;21727:26;;21799:9;21793:4;21789:20;21785:1;21774:9;21770:17;21763:47;21827:131;21953:4;21827:131;:::i;:::-;21819:139;;21546:419;;;:::o;21971:::-;22137:4;22175:2;22164:9;22160:18;22152:26;;22224:9;22218:4;22214:20;22210:1;22199:9;22195:17;22188:47;22252:131;22378:4;22252:131;:::i;:::-;22244:139;;21971:419;;;:::o;22396:::-;22562:4;22600:2;22589:9;22585:18;22577:26;;22649:9;22643:4;22639:20;22635:1;22624:9;22620:17;22613:47;22677:131;22803:4;22677:131;:::i;:::-;22669:139;;22396:419;;;:::o;22821:::-;22987:4;23025:2;23014:9;23010:18;23002:26;;23074:9;23068:4;23064:20;23060:1;23049:9;23045:17;23038:47;23102:131;23228:4;23102:131;:::i;:::-;23094:139;;22821:419;;;:::o;23246:::-;23412:4;23450:2;23439:9;23435:18;23427:26;;23499:9;23493:4;23489:20;23485:1;23474:9;23470:17;23463:47;23527:131;23653:4;23527:131;:::i;:::-;23519:139;;23246:419;;;:::o;23671:::-;23837:4;23875:2;23864:9;23860:18;23852:26;;23924:9;23918:4;23914:20;23910:1;23899:9;23895:17;23888:47;23952:131;24078:4;23952:131;:::i;:::-;23944:139;;23671:419;;;:::o;24096:::-;24262:4;24300:2;24289:9;24285:18;24277:26;;24349:9;24343:4;24339:20;24335:1;24324:9;24320:17;24313:47;24377:131;24503:4;24377:131;:::i;:::-;24369:139;;24096:419;;;:::o;24521:::-;24687:4;24725:2;24714:9;24710:18;24702:26;;24774:9;24768:4;24764:20;24760:1;24749:9;24745:17;24738:47;24802:131;24928:4;24802:131;:::i;:::-;24794:139;;24521:419;;;:::o;24946:::-;25112:4;25150:2;25139:9;25135:18;25127:26;;25199:9;25193:4;25189:20;25185:1;25174:9;25170:17;25163:47;25227:131;25353:4;25227:131;:::i;:::-;25219:139;;24946:419;;;:::o;25371:::-;25537:4;25575:2;25564:9;25560:18;25552:26;;25624:9;25618:4;25614:20;25610:1;25599:9;25595:17;25588:47;25652:131;25778:4;25652:131;:::i;:::-;25644:139;;25371:419;;;:::o;25796:::-;25962:4;26000:2;25989:9;25985:18;25977:26;;26049:9;26043:4;26039:20;26035:1;26024:9;26020:17;26013:47;26077:131;26203:4;26077:131;:::i;:::-;26069:139;;25796:419;;;:::o;26221:::-;26387:4;26425:2;26414:9;26410:18;26402:26;;26474:9;26468:4;26464:20;26460:1;26449:9;26445:17;26438:47;26502:131;26628:4;26502:131;:::i;:::-;26494:139;;26221:419;;;:::o;26646:222::-;26739:4;26777:2;26766:9;26762:18;26754:26;;26790:71;26858:1;26847:9;26843:17;26834:6;26790:71;:::i;:::-;26646:222;;;;:::o;26874:129::-;26908:6;26935:20;;:::i;:::-;26925:30;;26964:33;26992:4;26984:6;26964:33;:::i;:::-;26874:129;;;:::o;27009:75::-;27042:6;27075:2;27069:9;27059:19;;27009:75;:::o;27090:307::-;27151:4;27241:18;27233:6;27230:30;27227:56;;;27263:18;;:::i;:::-;27227:56;27301:29;27323:6;27301:29;:::i;:::-;27293:37;;27385:4;27379;27375:15;27367:23;;27090:307;;;:::o;27403:308::-;27465:4;27555:18;27547:6;27544:30;27541:56;;;27577:18;;:::i;:::-;27541:56;27615:29;27637:6;27615:29;:::i;:::-;27607:37;;27699:4;27693;27689:15;27681:23;;27403:308;;;:::o;27717:141::-;27766:4;27789:3;27781:11;;27812:3;27809:1;27802:14;27846:4;27843:1;27833:18;27825:26;;27717:141;;;:::o;27864:98::-;27915:6;27949:5;27943:12;27933:22;;27864:98;;;:::o;27968:99::-;28020:6;28054:5;28048:12;28038:22;;27968:99;;;:::o;28073:168::-;28156:11;28190:6;28185:3;28178:19;28230:4;28225:3;28221:14;28206:29;;28073:168;;;;:::o;28247:169::-;28331:11;28365:6;28360:3;28353:19;28405:4;28400:3;28396:14;28381:29;;28247:169;;;;:::o;28422:148::-;28524:11;28561:3;28546:18;;28422:148;;;;:::o;28576:305::-;28616:3;28635:20;28653:1;28635:20;:::i;:::-;28630:25;;28669:20;28687:1;28669:20;:::i;:::-;28664:25;;28823:1;28755:66;28751:74;28748:1;28745:81;28742:107;;;28829:18;;:::i;:::-;28742:107;28873:1;28870;28866:9;28859:16;;28576:305;;;;:::o;28887:237::-;28925:3;28944:18;28960:1;28944:18;:::i;:::-;28939:23;;28976:18;28992:1;28976:18;:::i;:::-;28971:23;;29066:1;29060:4;29056:12;29053:1;29050:19;29047:45;;;29072:18;;:::i;:::-;29047:45;29116:1;29113;29109:9;29102:16;;28887:237;;;;:::o;29130:191::-;29170:4;29190:20;29208:1;29190:20;:::i;:::-;29185:25;;29224:20;29242:1;29224:20;:::i;:::-;29219:25;;29263:1;29260;29257:8;29254:34;;;29268:18;;:::i;:::-;29254:34;29313:1;29310;29306:9;29298:17;;29130:191;;;;:::o;29327:96::-;29364:7;29393:24;29411:5;29393:24;:::i;:::-;29382:35;;29327:96;;;:::o;29429:90::-;29463:7;29506:5;29499:13;29492:21;29481:32;;29429:90;;;:::o;29525:149::-;29561:7;29601:66;29594:5;29590:78;29579:89;;29525:149;;;:::o;29680:126::-;29717:7;29757:42;29750:5;29746:54;29735:65;;29680:126;;;:::o;29812:77::-;29849:7;29878:5;29867:16;;29812:77;;;:::o;29895:86::-;29930:7;29970:4;29963:5;29959:16;29948:27;;29895:86;;;:::o;29987:154::-;30071:6;30066:3;30061;30048:30;30133:1;30124:6;30119:3;30115:16;30108:27;29987:154;;;:::o;30147:307::-;30215:1;30225:113;30239:6;30236:1;30233:13;30225:113;;;30324:1;30319:3;30315:11;30309:18;30305:1;30300:3;30296:11;30289:39;30261:2;30258:1;30254:10;30249:15;;30225:113;;;30356:6;30353:1;30350:13;30347:101;;;30436:1;30427:6;30422:3;30418:16;30411:27;30347:101;30196:258;30147:307;;;:::o;30460:320::-;30504:6;30541:1;30535:4;30531:12;30521:22;;30588:1;30582:4;30578:12;30609:18;30599:81;;30665:4;30657:6;30653:17;30643:27;;30599:81;30727:2;30719:6;30716:14;30696:18;30693:38;30690:84;;;30746:18;;:::i;:::-;30690:84;30511:269;30460:320;;;:::o;30786:281::-;30869:27;30891:4;30869:27;:::i;:::-;30861:6;30857:40;30999:6;30987:10;30984:22;30963:18;30951:10;30948:34;30945:62;30942:88;;;31010:18;;:::i;:::-;30942:88;31050:10;31046:2;31039:22;30829:238;30786:281;;:::o;31073:233::-;31112:3;31135:24;31153:5;31135:24;:::i;:::-;31126:33;;31181:66;31174:5;31171:77;31168:103;;;31251:18;;:::i;:::-;31168:103;31298:1;31291:5;31287:13;31280:20;;31073:233;;;:::o;31312:180::-;31360:77;31357:1;31350:88;31457:4;31454:1;31447:15;31481:4;31478:1;31471:15;31498:180;31546:77;31543:1;31536:88;31643:4;31640:1;31633:15;31667:4;31664:1;31657:15;31684:180;31732:77;31729:1;31722:88;31829:4;31826:1;31819:15;31853:4;31850:1;31843:15;31870:180;31918:77;31915:1;31908:88;32015:4;32012:1;32005:15;32039:4;32036:1;32029:15;32056:117;32165:1;32162;32155:12;32179:117;32288:1;32285;32278:12;32302:117;32411:1;32408;32401:12;32425:117;32534:1;32531;32524:12;32548:102;32589:6;32640:2;32636:7;32631:2;32624:5;32620:14;32616:28;32606:38;;32548:102;;;:::o;32656:229::-;32796:34;32792:1;32784:6;32780:14;32773:58;32865:12;32860:2;32852:6;32848:15;32841:37;32656:229;:::o;32891:237::-;33031:34;33027:1;33019:6;33015:14;33008:58;33100:20;33095:2;33087:6;33083:15;33076:45;32891:237;:::o;33134:225::-;33274:34;33270:1;33262:6;33258:14;33251:58;33343:8;33338:2;33330:6;33326:15;33319:33;33134:225;:::o;33365:224::-;33505:34;33501:1;33493:6;33489:14;33482:58;33574:7;33569:2;33561:6;33557:15;33550:32;33365:224;:::o;33595:178::-;33735:30;33731:1;33723:6;33719:14;33712:54;33595:178;:::o;33779:175::-;33919:27;33915:1;33907:6;33903:14;33896:51;33779:175;:::o;33960:223::-;34100:34;34096:1;34088:6;34084:14;34077:58;34169:6;34164:2;34156:6;34152:15;34145:31;33960:223;:::o;34189:175::-;34329:27;34325:1;34317:6;34313:14;34306:51;34189:175;:::o;34370:231::-;34510:34;34506:1;34498:6;34494:14;34487:58;34579:14;34574:2;34566:6;34562:15;34555:39;34370:231;:::o;34607:243::-;34747:34;34743:1;34735:6;34731:14;34724:58;34816:26;34811:2;34803:6;34799:15;34792:51;34607:243;:::o;34856:229::-;34996:34;34992:1;34984:6;34980:14;34973:58;35065:12;35060:2;35052:6;35048:15;35041:37;34856:229;:::o;35091:228::-;35231:34;35227:1;35219:6;35215:14;35208:58;35300:11;35295:2;35287:6;35283:15;35276:36;35091:228;:::o;35325:182::-;35465:34;35461:1;35453:6;35449:14;35442:58;35325:182;:::o;35513:231::-;35653:34;35649:1;35641:6;35637:14;35630:58;35722:14;35717:2;35709:6;35705:15;35698:39;35513:231;:::o;35750:225::-;35890:34;35886:1;35878:6;35874:14;35867:58;35959:8;35954:2;35946:6;35942:15;35935:33;35750:225;:::o;35981:182::-;36121:34;36117:1;36109:6;36105:14;36098:58;35981:182;:::o;36169:220::-;36309:34;36305:1;36297:6;36293:14;36286:58;36378:3;36373:2;36365:6;36361:15;36354:28;36169:220;:::o;36395:236::-;36535:34;36531:1;36523:6;36519:14;36512:58;36604:19;36599:2;36591:6;36587:15;36580:44;36395:236;:::o;36637:122::-;36710:24;36728:5;36710:24;:::i;:::-;36703:5;36700:35;36690:63;;36749:1;36746;36739:12;36690:63;36637:122;:::o;36765:116::-;36835:21;36850:5;36835:21;:::i;:::-;36828:5;36825:32;36815:60;;36871:1;36868;36861:12;36815:60;36765:116;:::o;36887:120::-;36959:23;36976:5;36959:23;:::i;:::-;36952:5;36949:34;36939:62;;36997:1;36994;36987:12;36939:62;36887:120;:::o;37013:122::-;37086:24;37104:5;37086:24;:::i;:::-;37079:5;37076:35;37066:63;;37125:1;37122;37115:12;37066:63;37013:122;:::o

Swarm Source

ipfs://1d5cf14a2693b0a0532ef705fb56597230e9ea49b481f8c719067329ccef4637
[ 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.