ETH Price: $3,206.77 (+1.11%)

Token

Glitch (GLITCH)
 

Overview

Max Total Supply

6,118 GLITCH

Holders

1,796

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
12 GLITCH
0x4dacd010e15e220bc6c5c3210d166505d2b6c63a
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Glitch

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-11
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.6;

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

/**
 * @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`, 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 Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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

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

/**
 * @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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

/**
 * @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 `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

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

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 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);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private 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);
            }
        }
    }
}

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

/**
 * @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 overriden 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 {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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 || getApproved(tokenId) == spender || isApprovedForAll(owner, 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);
    }

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

    /**
     * @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 of token that is not own");
        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);
    }

    /**
     * @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 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(to).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 {}
}

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * 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 override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

contract Glitch is ERC721Enumerable, ReentrancyGuard, Ownable {
    address[] public requiredNfts;

    bool private constant onlyNftHolders = true;
    uint private ownerMintAmount = 188;
    uint private constant nftHolderTimeout = 45 minutes;

    uint public immutable deployedTime;

    string[] private morseCodes = [
    "|||||",
    "-||||",
    "--|||",
    "---||",
    "----|",
    "-----",
    "|----",
    "||---",
    "|||--",
    "||||-"
    ];


    uint8[] private units = [
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        10
    ];

    uint8[] private multipliers = [
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        0
    ];

    uint8[] private suffixes = [1, 2];

    function addRequiredNft(address _nft) external onlyOwner {
        requiredNfts.push(_nft);
    }

    function removeRequiredNft(uint256 _idx) external onlyOwner {
        requiredNfts[_idx] = requiredNfts[requiredNfts.length - 1];
        requiredNfts.pop();
    }

    function random(string memory input) internal pure returns (uint256) {
        return uint256(keccak256(abi.encodePacked(input)));
    }

    function getFirst(uint256 tokenId) public view returns (uint256) {
        return pluck(tokenId, "FIRST", units);
    }

    function getSecond(uint256 tokenId) public view returns (uint256) {
        return pluck(tokenId, "SECOND", units);
    }

    function getThird(uint256 tokenId) public view returns (uint256) {
        return pluck(tokenId, "THIRD", units);
    }

    function getFourth(uint256 tokenId) public view returns (uint256) {
        return pluck(tokenId, "FOURTH", units);
    }

    function getFifth(uint256 tokenId) public view returns (uint256) {
        return pluck(tokenId, "FIFTH", units);
    }

    function getSixth(uint256 tokenId) public view returns (uint256) {
        return pluck(tokenId, "SIXTH", units);
    }

    function getSeventh(uint256 tokenId) public view returns (uint256) {
        return pluck(tokenId, "SEVENTH", units);
    }

    function getEight(uint256 tokenId) public view returns (uint256) {
        return pluck(tokenId, "EIGHT", units);
    }

    function pluck(
        uint256 tokenId,
        string memory keyPrefix,
        uint8[] memory sourceArray
    ) internal view returns (uint256) {
        uint256 rand = random(string(abi.encodePacked(keyPrefix, toString(tokenId))));
        uint256 output = sourceArray[rand % sourceArray.length];
        uint256 luck = rand % 21;
        if (luck > 14) {
            output += suffixes[rand % suffixes.length];
        }
        if (luck >= 19) {
            if (luck == 19) {
                output = (output * multipliers[rand % multipliers.length]) + suffixes[rand % suffixes.length];
            } else {
                output = (output * multipliers[rand % multipliers.length]);
            }
        }
        return output;
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        string[17] memory parts;
        parts[
            0
          ] = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 350"> <style>.glow { fill: #01ff01; font-family: serif; font-size:69px; }</style><rect width="100%" height="100%" fill="black" /><text x="10" y="60" class="glow">';
        
        

        parts[1] = toMorse(getFirst(tokenId));

        parts[2] = '</text><text x="10" y="100" class="glow">';

        parts[3] = toMorse(getSecond(tokenId));

        parts[4] = '</text><text x="10" y="140" class="glow">';

        parts[5] = toMorse(getThird(tokenId));

        parts[6] = '</text><text x="10" y="180" class="glow">';

        parts[7] = toMorse(getFourth(tokenId));

        parts[8] = '</text><text x="10" y="220" class="glow">';

        parts[9] = toMorse(getFifth(tokenId));

        parts[10] = '</text><text x="10" y="260" class="glow">';

        parts[11] = toMorse(getSixth(tokenId));

        parts[12] = '</text><text x="10" y="300" class="glow">';

        parts[13] = toMorse(getSeventh(tokenId));

        parts[14] = '</text><text x="10" y="340" class="glow">';

        parts[15] = toMorse(getEight(tokenId));

        parts[16] = "</text></svg>";

        string memory output = string(
            abi.encodePacked(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6], parts[7], parts[8])
        );
        output = string(
            abi.encodePacked(
                output,
                parts[9],
                parts[10],
                parts[11],
                parts[12],
                parts[13],
                parts[14],
                parts[15],
                parts[16]
            )
        );

        string memory json = Base64.encode(
            bytes(
                string(
                    abi.encodePacked(
                        '{"name": "Glitch #',
                        toString(tokenId),
                        '", "description": "Is this reality in fact a simulation? A call... A routine... A bond... A dream... The subconscious instinct senses glitches in the matrix. Feel free to use the powers of your Glitch in any way you wish. What messages will you receive?", "image": "data:image/svg+xml;base64,',
                        Base64.encode(bytes(output)),
                        '"}'
                    )
                )
            )
        );
        output = string(abi.encodePacked("data:application/json;base64,", json));

        return output;
    }

    function claim(uint256 tokenId) public nonReentrant {
        require(tokenId > 0 && tokenId < 8889, "Token ID invalid");
        require(totalSupply() + ownerMintAmount < 8889, "No available NFT");
        if (onlyNftHolders && block.timestamp <= deployedTime + nftHolderTimeout) {
            bool canClaim = false;
            for (uint256 i = 0; i < requiredNfts.length; i += 1) {
                if (IERC721(requiredNfts[i]).balanceOf(msg.sender) > 0) {
                    canClaim = true;
                    break;
                }
            }
            require(canClaim, "Cannot claim");
        }
        _safeMint(_msgSender(), tokenId);
    }

    function ownerClaim(uint256 tokenId) external onlyOwner {
        require(tokenId > 0 && tokenId < 8889, "Token ID invalid");
        require(ownerMintAmount > 0, "No available Owner NFT");
        _safeMint(_msgSender(), tokenId);
        ownerMintAmount --;
    }

    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT license
        // 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);
    }

    function toMorse(uint256 value) internal view returns (string memory) {
        if (value < 10) {
            return morseCodes[value];
        }
        uint256 temp = value;
        uint256 digits;

        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        string memory res = "";
        while (value != 0) {
            digits -= 1;
            res = string(abi.encodePacked(morseCodes[value % 10], res));
            value /= 10;
        }
        return res;
    }

    constructor() ERC721("Glitch", "GLITCH") Ownable() {
        deployedTime = block.timestamp;
        requiredNfts.push(0x4F8730E0b32B04beaa5757e5aea3aeF970E5B613);
        requiredNfts.push(0xb2c02e550ad5845831D03aA38155FeE26931d33E);
        requiredNfts.push(0x3213e943a875C7B943608e990A91924692AB7494);
    }
}

/// [MIT License]
/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((len + 2) / 3);

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }

        return string(result);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":"address","name":"_nft","type":"address"}],"name":"addRequiredNft","outputs":[],"stateMutability":"nonpayable","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":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deployedTime","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":"uint256","name":"tokenId","type":"uint256"}],"name":"getEight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFifth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFirst","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFourth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSeventh","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSixth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getThird","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_idx","type":"uint256"}],"name":"removeRequiredNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"requiredNfts","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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"}]

60bc600d5560056101e0818152641f1f1f1f1f60da1b6102005260a0908152610220828152640b5f1f1f1f60da1b6102405260c052610260828152640b4b5f1f1f60da1b6102805260e0526102a0828152640b4b4b5f1f60da1b6102c052610100526102e0828152640b4b4b4b5f60da1b6103005261012052610320828152642d2d2d2d2d60d81b6103405261014052610360828152647c2d2d2d2d60d81b61038052610160526103a0828152647c7c2d2d2d60d81b6103c052610180526103e0828152647c7c7c2d2d60d81b610400526101a052610460604052610420918252647c7c7c7c2d60d81b610440526101c0919091526200010490600e90600a620006d8565b50604080516104a08101825260018082526002602083018190526003938301849052600460608401819052600560808501819052600660a08601819052600760c08701819052600860e08801819052600961010089018190526101208901889052610140890187905261016089018a905261018089018690526101a089018590526101c089018490526101e08901839052610200890182905261022089018190526102408901889052610260890187905261028089018a90526102a089018690526102c089018590526102e089018490526103008901839052610320890182905261034089018190526103608901979097526103808801959095526103a08701979097526103c08601929092526103e0850152610400840152610420830193909352610440820192909252610460810191909152600a6104808201526200025090600f9060256200073c565b5060408051610b0081018252600180825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e08101829052610200810182905261022081018290526102408101829052610260810182905261028081018290526102a081018290526102c081018290526102e08101829052610300810182905261032081018290526103408101829052610360810182905261038081018290526103a081018290526103c081018290526103e08101829052610400810182905261042081018290526104408101829052610460810182905261048081018290526104a081018290526104c081018290526104e08101829052610500810182905261052081018290526105408101829052610560810182905261058081018290526105a081018290526105c081018290526105e08101829052610600810182905261062081018290526106408101829052610660810182905261068081018290526106a081018290526106c081018290526106e08101829052610700810182905261072081018290526107408101829052610760810182905261078081018290526107a081018290526107c081018290526107e08101829052610800810182905261082081018290526108408101829052610860810182905261088081018290526108a081018290526108c081018290526108e08101829052610900810182905261092081018290526109408101829052610960810182905261098081018290526109a081018290526109c081018290526109e08101829052610a008101829052610a208101829052610a408101829052610a608101829052610a808101829052610aa08101829052610ac08101919091526000610ae0820152620005229060109060586200073c565b50604080518082019091526001815260026020820181905262000548916011916200073c565b503480156200055657600080fd5b506040518060400160405280600681526020016508ed8d2e8c6d60d31b8152506040518060400160405280600681526020016508e9892a886960d31b8152508160009080519060200190620005ad929190620007e5565b508051620005c3906001906020840190620007e5565b50506001600a5550620005d63362000686565b42608052600c80546001818101835560008390527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c791820180546001600160a01b0319908116734f8730e0b32b04beaa5757e5aea3aef970e5b613179091558354808301855583018054821673b2c02e550ad5845831d03aa38155fee26931d33e1790558354918201909355018054909116733213e943a875c7b943608e990a91924692ab749417905562000919565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280548282559060005260206000209081019282156200072a579160200282015b828111156200072a578251805162000719918491602090910190620007e5565b5091602001919060010190620006f9565b506200073892915062000862565b5090565b82805482825590600052602060002090601f01602090048101928215620007d75791602002820160005b83821115620007a657835183826101000a81548160ff021916908360ff160217905550926020019260010160208160000104928301926001030262000766565b8015620007d55782816101000a81549060ff0219169055600101602081600001049283019260010302620007a6565b505b506200073892915062000883565b828054620007f390620008dc565b90600052602060002090601f016020900481019282620008175760008555620007d7565b82601f106200083257805160ff1916838001178555620007d7565b82800160010185558215620007d7579182015b82811115620007d757825182559160200191906001019062000845565b80821115620007385760006200087982826200089a565b5060010162000862565b5b8082111562000738576000815560010162000884565b508054620008a890620008dc565b6000825580601f10620008b9575050565b601f016020900490600052602060002090810190620008d9919062000883565b50565b600181811c90821680620008f157607f821691505b602082108114156200091357634e487b7160e01b600052602260045260246000fd5b50919050565b6080516131626200093c600039600081816103430152610a4a01526131626000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c80636352211e1161011a578063948444cf116100ad578063b88d4fde1161007c578063b88d4fde14610444578063c87b56dd14610457578063e985e9c51461046a578063f2fde38b146104a6578063fa7f71b1146104b957600080fd5b8063948444cf1461040357806395d89b41146104165780639ec29b821461041e578063a22cb4651461043157600080fd5b80638aa001fc116100e95780638aa001fc146103b95780638c921d06146103cc5780638da5cb5b146103df5780639347e43f146103f057600080fd5b80636352211e14610378578063667386f71461038b57806370a082311461039e578063715018a6146103b157600080fd5b806323b872dd1161019257806342d9d8761161016157806342d9d87614610318578063434f48c41461032b578063461ac0191461033e5780634f6ccce71461036557600080fd5b806323b872dd146102cc5780632f745c59146102df578063379607f5146102f257806342842e0e1461030557600080fd5b8063081812fc116101ce578063081812fc1461027d578063095ea7b3146102905780630b2503a6146102a357806318160ddd146102c457600080fd5b80630136432b1461020057806301ffc9a714610230578063056f29fe1461025357806306fdde0314610268575b600080fd5b61021361020e3660046127ec565b6104cc565b6040516001600160a01b0390911681526020015b60405180910390f35b61024361023e3660046127b2565b6104f6565b6040519015158152602001610227565b6102666102613660046125df565b610521565b005b6102706105a6565b6040516102279190612c50565b61021361028b3660046127ec565b610638565b61026661029e366004612788565b6106cd565b6102b66102b13660046127ec565b6107e3565b604051908152602001610227565b6008546102b6565b6102666102da366004612634565b61087b565b6102b66102ed366004612788565b6108ac565b6102666103003660046127ec565b610942565b610266610313366004612634565b610b8e565b6102b66103263660046127ec565b610ba9565b6102666103393660046127ec565b610c25565b6102b67f000000000000000000000000000000000000000000000000000000000000000081565b6102b66103733660046127ec565b610d0b565b6102136103863660046127ec565b610d9e565b6102b66103993660046127ec565b610e15565b6102b66103ac3660046125df565b610e91565b610266610f18565b6102b66103c73660046127ec565b610f4e565b6102b66103da3660046127ec565b610fcb565b600b546001600160a01b0316610213565b6102b66103fe3660046127ec565b611049565b6102666104113660046127ec565b6110c5565b61027061119f565b6102b661042c3660046127ec565b6111ae565b61026661043f36600461274c565b61122b565b610266610452366004612670565b6112f0565b6102706104653660046127ec565b611328565b610243610478366004612601565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6102666104b43660046125df565b6115ed565b6102b66104c73660046127ec565b611688565b600c81815481106104dc57600080fd5b6000918252602090912001546001600160a01b0316905081565b60006001600160e01b0319821663780e9d6360e01b148061051b575061051b82611704565b92915050565b600b546001600160a01b031633146105545760405162461bcd60e51b815260040161054b90612cb5565b60405180910390fd5b600c80546001810182556000919091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080546105b590612de0565b80601f01602080910402602001604051908101604052809291908181526020018280546105e190612de0565b801561062e5780601f106106035761010080835404028352916020019161062e565b820191906000526020600020905b81548152906001019060200180831161061157829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166106b15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161054b565b506000908152600460205260409020546001600160a01b031690565b60006106d882610d9e565b9050806001600160a01b0316836001600160a01b031614156107465760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161054b565b336001600160a01b038216148061076257506107628133610478565b6107d45760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161054b565b6107de8383611754565b505050565b600061051b826040518060400160405280600581526020016408c928ca8960db1b815250600f80548060200260200160405190810160405280929190818152602001828054801561087157602002820191906000526020600020906000905b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116108425790505b50505050506117c2565b6108853382611989565b6108a15760405162461bcd60e51b815260040161054b90612cea565b6107de838383611a80565b60006108b783610e91565b82106109195760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161054b565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6002600a5414156109955760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161054b565b6002600a5580158015906109aa57506122b981105b6109e95760405162461bcd60e51b815260206004820152601060248201526f151bdad95b881251081a5b9d985b1a5960821b604482015260640161054b565b6122b9600d546109f860085490565b610a029190612d3b565b10610a425760405162461bcd60e51b815260206004820152601060248201526f139bc8185d985a5b18589b194813919560821b604482015260640161054b565b610a6e610a8c7f0000000000000000000000000000000000000000000000000000000000000000612d3b565b4211610b7b576000805b600c54811015610b3c576000600c8281548110610a9757610a97612e8c565b6000918252602090912001546040516370a0823160e01b81523360048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015610ae357600080fd5b505afa158015610af7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1b9190612805565b1115610b2a5760019150610b3c565b610b35600182612d3b565b9050610a78565b5080610b795760405162461bcd60e51b815260206004820152600c60248201526b43616e6e6f7420636c61696d60a01b604482015260640161054b565b505b610b86335b82611c2b565b506001600a55565b6107de838383604051806020016040528060008152506112f0565b600061051b82604051806040016040528060058152602001640a692b0a8960db1b815250600f805480602002602001604051908101604052809291908181526020018280548015610871576000918252602091829020805460ff16845290820283019290916001910180841161084257905050505050506117c2565b600b546001600160a01b03163314610c4f5760405162461bcd60e51b815260040161054b90612cb5565b600081118015610c6057506122b981105b610c9f5760405162461bcd60e51b815260206004820152601060248201526f151bdad95b881251081a5b9d985b1a5960821b604482015260640161054b565b6000600d5411610cea5760405162461bcd60e51b8152602060048201526016602482015275139bc8185d985a5b18589b194813dddb995c8813919560521b604482015260640161054b565b610cf333610b80565b600d8054906000610d0383612dc9565b919050555050565b6000610d1660085490565b8210610d795760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161054b565b60088281548110610d8c57610d8c612e8c565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b03168061051b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161054b565b600061051b826040518060400160405280600581526020016411925494d560da1b815250600f805480602002602001604051908101604052809291908181526020018280548015610871576000918252602091829020805460ff16845290820283019290916001910180841161084257905050505050506117c2565b60006001600160a01b038216610efc5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161054b565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b03163314610f425760405162461bcd60e51b815260040161054b90612cb5565b610f4c6000611c49565b565b600061051b826040518060400160405280600681526020016514d150d3d39160d21b815250600f805480602002602001604051908101604052809291908181526020018280548015610871576000918252602091829020805460ff16845290820283019290916001910180841161084257905050505050506117c2565b600061051b82604051806040016040528060078152602001660a68aac8a9ca8960cb1b815250600f805480602002602001604051908101604052809291908181526020018280548015610871576000918252602091829020805460ff16845290820283019290916001910180841161084257905050505050506117c2565b600061051b8260405180604001604052806005815260200164115251d21560da1b815250600f805480602002602001604051908101604052809291908181526020018280548015610871576000918252602091829020805460ff16845290820283019290916001910180841161084257905050505050506117c2565b600b546001600160a01b031633146110ef5760405162461bcd60e51b815260040161054b90612cb5565b600c80546110ff90600190612d86565b8154811061110f5761110f612e8c565b600091825260209091200154600c80546001600160a01b03909216918390811061113b5761113b612e8c565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600c80548061117a5761117a612e76565b600082815260209020810160001990810180546001600160a01b031916905501905550565b6060600180546105b590612de0565b600061051b826040518060400160405280600681526020016508c9eaaa4a8960d31b815250600f805480602002602001604051908101604052809291908181526020018280548015610871576000918252602091829020805460ff16845290820283019290916001910180841161084257905050505050506117c2565b6001600160a01b0382163314156112845760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161054b565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6112fa3383611989565b6113165760405162461bcd60e51b815260040161054b90612cea565b61132284848484611c9b565b50505050565b606061133261259b565b60405180610120016040528060ff8152602001612ecf60ff9139815261135f61135a84610e15565b611cce565b816001602002018190525060405180606001604052806029815260200161308960299139604082015261139461135a84610f4e565b6060808301919091526040805191820190526029808252612fce602083013960808201526113c461135a84611688565b60a0820152604080516060810190915260298082526130db602083013960c08201526113f261135a846111ae565b60e082015260408051606081019091526029808252613104602083013961010082015261142161135a846107e3565b61012082015260408051606081019091526029808252612ff7602083013961014082015261145161135a84610ba9565b61016082015260408051606081019091526029808252613020602083013961018082015261148161135a84610fcb565b6101a0820152604080516060810190915260298082526130b260208301396101c08201526114b161135a84611049565b6101e0820152604080518082018252600d81526c1e17ba32bc3a1f1e17b9bb339f60991b602080830191909152610200840191909152825181840151838501516060860151608087015160a088015160c089015160e08a01516101008b0151995160009a6115219a9091016128b1565b60408051808303601f19018152908290526101208401516101408501516101608601516101808701516101a08801516101c08901516101e08a01516102008b0151979950611574988a98906020016128b1565b604051602081830303815290604052905060006115c161159386611e30565b61159c84611f2e565b6040516020016115ad929190612a5d565b604051602081830303815290604052611f2e565b9050806040516020016115d49190612a18565b60408051601f1981840301815291905295945050505050565b600b546001600160a01b031633146116175760405162461bcd60e51b815260040161054b90612cb5565b6001600160a01b03811661167c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161054b565b61168581611c49565b50565b600061051b8260405180604001604052806005815260200164151212549160da1b815250600f805480602002602001604051908101604052809291908181526020018280548015610871576000918252602091829020805460ff16845290820283019290916001910180841161084257905050505050506117c2565b60006001600160e01b031982166380ac58cd60e01b148061173557506001600160e01b03198216635b5e139f60e01b145b8061051b57506301ffc9a760e01b6001600160e01b031983161461051b565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061178982610d9e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806117f7846117d287611e30565b6040516020016117e3929190612882565b604051602081830303815290604052612094565b90506000838451836118099190612e36565b8151811061181957611819612e8c565b602002602001015160ff16905060006015836118359190612e36565b9050600e811115611889576011805461184e9085612e36565b8154811061185e5761185e612e8c565b60009182526020918290209181049091015461188691601f166101000a900460ff1683612d3b565b91505b6013811061197f57806013141561193657601180546118a89085612e36565b815481106118b8576118b8612e8c565b90600052602060002090602091828204019190069054906101000a900460ff1660ff1660108080549050856118ed9190612e36565b815481106118fd576118fd612e8c565b60009182526020918290209181049091015461192591601f166101000a900460ff1684612d67565b61192f9190612d3b565b915061197f565b601080546119449085612e36565b8154811061195457611954612e8c565b60009182526020918290209181049091015461197c91601f166101000a900460ff1683612d67565b91505b5095945050505050565b6000818152600260205260408120546001600160a01b0316611a025760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161054b565b6000611a0d83610d9e565b9050806001600160a01b0316846001600160a01b03161480611a485750836001600160a01b0316611a3d84610638565b6001600160a01b0316145b80611a7857506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611a9382610d9e565b6001600160a01b031614611afb5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161054b565b6001600160a01b038216611b5d5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161054b565b611b688383836120c5565b611b73600082611754565b6001600160a01b0383166000908152600360205260408120805460019290611b9c908490612d86565b90915550506001600160a01b0382166000908152600360205260408120805460019290611bca908490612d3b565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b611c4582826040518060200160405280600081525061217d565b5050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611ca6848484611a80565b611cb2848484846121b0565b6113225760405162461bcd60e51b815260040161054b90612c63565b6060600a821015611d8657600e8281548110611cec57611cec612e8c565b906000526020600020018054611d0190612de0565b80601f0160208091040260200160405190810160405280929190818152602001828054611d2d90612de0565b8015611d7a5780601f10611d4f57610100808354040283529160200191611d7a565b820191906000526020600020905b815481529060010190602001808311611d5d57829003601f168201915b50505050509050919050565b8160005b8115611db05780611d9a81612e1b565b9150611da99050600a83612d53565b9150611d8a565b6040805160208101909152600081525b8415611a7857611dd1600183612d86565b9150600e611de0600a87612e36565b81548110611df057611df0612e8c565b9060005260206000200181604051602001611e0c929190612971565b60408051601f198184030181529190529050611e29600a86612d53565b9450611dc0565b606081611e545750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611e7e5780611e6881612e1b565b9150611e779050600a83612d53565b9150611e58565b60008167ffffffffffffffff811115611e9957611e99612ea2565b6040519080825280601f01601f191660200182016040528015611ec3576020820181803683370190505b5090505b8415611a7857611ed8600183612d86565b9150611ee5600a86612e36565b611ef0906030612d3b565b60f81b818381518110611f0557611f05612e8c565b60200101906001600160f81b031916908160001a905350611f27600a86612d53565b9450611ec7565b805160609080611f4e575050604080516020810190915260008152919050565b60006003611f5d836002612d3b565b611f679190612d53565b611f72906004612d67565b90506000611f81826020612d3b565b67ffffffffffffffff811115611f9957611f99612ea2565b6040519080825280601f01601f191660200182016040528015611fc3576020820181803683370190505b5090506000604051806060016040528060408152602001613049604091399050600181016020830160005b8681101561204f576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101611fee565b506003860660018114612069576002811461207a57612086565b613d3d60f01b600119830152612086565b603d60f81b6000198301525b505050918152949350505050565b6000816040516020016120a79190612866565b60408051601f19818403018152919052805160209091012092915050565b6001600160a01b0383166121205761211b81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612143565b816001600160a01b0316836001600160a01b0316146121435761214383826122bd565b6001600160a01b03821661215a576107de8161235a565b826001600160a01b0316826001600160a01b0316146107de576107de8282612409565b612187838361244d565b61219460008484846121b0565b6107de5760405162461bcd60e51b815260040161054b90612c63565b60006001600160a01b0384163b156122b257604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906121f4903390899088908890600401612c13565b602060405180830381600087803b15801561220e57600080fd5b505af192505050801561223e575060408051601f3d908101601f1916820190925261223b918101906127cf565b60015b612298573d80801561226c576040519150601f19603f3d011682016040523d82523d6000602084013e612271565b606091505b5080516122905760405162461bcd60e51b815260040161054b90612c63565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a78565b506001949350505050565b600060016122ca84610e91565b6122d49190612d86565b600083815260076020526040902054909150808214612327576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061236c90600190612d86565b6000838152600960205260408120546008805493945090928490811061239457612394612e8c565b9060005260206000200154905080600883815481106123b5576123b5612e8c565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806123ed576123ed612e76565b6001900381819060005260206000200160009055905550505050565b600061241483610e91565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166124a35760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161054b565b6000818152600260205260409020546001600160a01b0316156125085760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161054b565b612514600083836120c5565b6001600160a01b038216600090815260036020526040812080546001929061253d908490612d3b565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6040518061022001604052806011905b60608152602001906001900390816125ab5790505090565b80356001600160a01b03811681146125da57600080fd5b919050565b6000602082840312156125f157600080fd5b6125fa826125c3565b9392505050565b6000806040838503121561261457600080fd5b61261d836125c3565b915061262b602084016125c3565b90509250929050565b60008060006060848603121561264957600080fd5b612652846125c3565b9250612660602085016125c3565b9150604084013590509250925092565b6000806000806080858703121561268657600080fd5b61268f856125c3565b935061269d602086016125c3565b925060408501359150606085013567ffffffffffffffff808211156126c157600080fd5b818701915087601f8301126126d557600080fd5b8135818111156126e7576126e7612ea2565b604051601f8201601f19908116603f0116810190838211818310171561270f5761270f612ea2565b816040528281528a602084870101111561272857600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561275f57600080fd5b612768836125c3565b91506020830135801515811461277d57600080fd5b809150509250929050565b6000806040838503121561279b57600080fd5b6127a4836125c3565b946020939093013593505050565b6000602082840312156127c457600080fd5b81356125fa81612eb8565b6000602082840312156127e157600080fd5b81516125fa81612eb8565b6000602082840312156127fe57600080fd5b5035919050565b60006020828403121561281757600080fd5b5051919050565b60008151808452612836816020860160208601612d9d565b601f01601f19169290920160200192915050565b6000815161285c818560208601612d9d565b9290920192915050565b60008251612878818460208701612d9d565b9190910192915050565b60008351612894818460208801612d9d565b8351908301906128a8818360208801612d9d565b01949350505050565b60008a516128c3818460208f01612d9d565b8a516128d58183860160208f01612d9d565b8a5191840101906128ea818360208e01612d9d565b89516128fc8183850160208e01612d9d565b8951929091010190612912818360208c01612d9d565b8751910190612925818360208b01612d9d565b86516129378183850160208b01612d9d565b865192909101019061294d818360208901612d9d565b845161295f8183850160208901612d9d565b9101019b9a5050505050505050505050565b600080845481600182811c91508083168061298d57607f831692505b60208084108214156129ad57634e487b7160e01b86526022600452602486fd5b8180156129c157600181146129d2576129ff565b60ff198616895284890196506129ff565b60008b81526020902060005b868110156129f75781548b8201529085019083016129de565b505084890196505b505050505050612a0f818561284a565b95945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251612a5081601d850160208701612d9d565b91909101601d0192915050565b717b226e616d65223a2022476c69746368202360701b81528251600090612a8b816012850160208801612d9d565b7f222c20226465736372697074696f6e223a202249732074686973207265616c696012918401918201527f747920696e206661637420612073696d756c6174696f6e3f20412063616c6c2e60328201527f2e2e204120726f7574696e652e2e2e204120626f6e642e2e2e2041206472656160528201527f6d2e2e2e2054686520737562636f6e7363696f757320696e7374696e6374207360728201527f656e73657320676c69746368657320696e20746865206d61747269782e20466560928201527f656c206672656520746f207573652074686520706f77657273206f6620796f7560b28201527f7220476c6974636820696e20616e792077617920796f7520776973682e20576860d28201527f6174206d657373616765732077696c6c20796f7520726563656976653f222c2060f28201527f22696d616765223a2022646174613a696d6167652f7376672b786d6c3b62617361011282015263194d8d0b60e21b610132820152612a0f612c0561013683018661284a565b61227d60f01b815260020190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612c469083018461281e565b9695505050505050565b6020815260006125fa602083018461281e565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115612d4e57612d4e612e4a565b500190565b600082612d6257612d62612e60565b500490565b6000816000190483118215151615612d8157612d81612e4a565b500290565b600082821015612d9857612d98612e4a565b500390565b60005b83811015612db8578181015183820152602001612da0565b838111156113225750506000910152565b600081612dd857612dd8612e4a565b506000190190565b600181811c90821680612df457607f821691505b60208210811415612e1557634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612e2f57612e2f612e4a565b5060010190565b600082612e4557612e45612e60565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461168557600080fdfe3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e203c7374796c653e2e676c6f77207b2066696c6c3a20233031666630313b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a363970783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22626c61636b22202f3e3c7465787420783d2231302220793d2236302220636c6173733d22676c6f77223e3c2f746578743e3c7465787420783d2231302220793d223134302220636c6173733d22676c6f77223e3c2f746578743e3c7465787420783d2231302220793d223236302220636c6173733d22676c6f77223e3c2f746578743e3c7465787420783d2231302220793d223330302220636c6173733d22676c6f77223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d22676c6f77223e3c2f746578743e3c7465787420783d2231302220793d223334302220636c6173733d22676c6f77223e3c2f746578743e3c7465787420783d2231302220793d223138302220636c6173733d22676c6f77223e3c2f746578743e3c7465787420783d2231302220793d223232302220636c6173733d22676c6f77223ea26469706673582212206e998b32937e96207c0431f6a3e6f1c5b812f866d8107dac681f544743bc7e0864736f6c63430008060033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c80636352211e1161011a578063948444cf116100ad578063b88d4fde1161007c578063b88d4fde14610444578063c87b56dd14610457578063e985e9c51461046a578063f2fde38b146104a6578063fa7f71b1146104b957600080fd5b8063948444cf1461040357806395d89b41146104165780639ec29b821461041e578063a22cb4651461043157600080fd5b80638aa001fc116100e95780638aa001fc146103b95780638c921d06146103cc5780638da5cb5b146103df5780639347e43f146103f057600080fd5b80636352211e14610378578063667386f71461038b57806370a082311461039e578063715018a6146103b157600080fd5b806323b872dd1161019257806342d9d8761161016157806342d9d87614610318578063434f48c41461032b578063461ac0191461033e5780634f6ccce71461036557600080fd5b806323b872dd146102cc5780632f745c59146102df578063379607f5146102f257806342842e0e1461030557600080fd5b8063081812fc116101ce578063081812fc1461027d578063095ea7b3146102905780630b2503a6146102a357806318160ddd146102c457600080fd5b80630136432b1461020057806301ffc9a714610230578063056f29fe1461025357806306fdde0314610268575b600080fd5b61021361020e3660046127ec565b6104cc565b6040516001600160a01b0390911681526020015b60405180910390f35b61024361023e3660046127b2565b6104f6565b6040519015158152602001610227565b6102666102613660046125df565b610521565b005b6102706105a6565b6040516102279190612c50565b61021361028b3660046127ec565b610638565b61026661029e366004612788565b6106cd565b6102b66102b13660046127ec565b6107e3565b604051908152602001610227565b6008546102b6565b6102666102da366004612634565b61087b565b6102b66102ed366004612788565b6108ac565b6102666103003660046127ec565b610942565b610266610313366004612634565b610b8e565b6102b66103263660046127ec565b610ba9565b6102666103393660046127ec565b610c25565b6102b67f00000000000000000000000000000000000000000000000000000000613ccd2081565b6102b66103733660046127ec565b610d0b565b6102136103863660046127ec565b610d9e565b6102b66103993660046127ec565b610e15565b6102b66103ac3660046125df565b610e91565b610266610f18565b6102b66103c73660046127ec565b610f4e565b6102b66103da3660046127ec565b610fcb565b600b546001600160a01b0316610213565b6102b66103fe3660046127ec565b611049565b6102666104113660046127ec565b6110c5565b61027061119f565b6102b661042c3660046127ec565b6111ae565b61026661043f36600461274c565b61122b565b610266610452366004612670565b6112f0565b6102706104653660046127ec565b611328565b610243610478366004612601565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6102666104b43660046125df565b6115ed565b6102b66104c73660046127ec565b611688565b600c81815481106104dc57600080fd5b6000918252602090912001546001600160a01b0316905081565b60006001600160e01b0319821663780e9d6360e01b148061051b575061051b82611704565b92915050565b600b546001600160a01b031633146105545760405162461bcd60e51b815260040161054b90612cb5565b60405180910390fd5b600c80546001810182556000919091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080546105b590612de0565b80601f01602080910402602001604051908101604052809291908181526020018280546105e190612de0565b801561062e5780601f106106035761010080835404028352916020019161062e565b820191906000526020600020905b81548152906001019060200180831161061157829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166106b15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161054b565b506000908152600460205260409020546001600160a01b031690565b60006106d882610d9e565b9050806001600160a01b0316836001600160a01b031614156107465760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161054b565b336001600160a01b038216148061076257506107628133610478565b6107d45760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161054b565b6107de8383611754565b505050565b600061051b826040518060400160405280600581526020016408c928ca8960db1b815250600f80548060200260200160405190810160405280929190818152602001828054801561087157602002820191906000526020600020906000905b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116108425790505b50505050506117c2565b6108853382611989565b6108a15760405162461bcd60e51b815260040161054b90612cea565b6107de838383611a80565b60006108b783610e91565b82106109195760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161054b565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6002600a5414156109955760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161054b565b6002600a5580158015906109aa57506122b981105b6109e95760405162461bcd60e51b815260206004820152601060248201526f151bdad95b881251081a5b9d985b1a5960821b604482015260640161054b565b6122b9600d546109f860085490565b610a029190612d3b565b10610a425760405162461bcd60e51b815260206004820152601060248201526f139bc8185d985a5b18589b194813919560821b604482015260640161054b565b610a6e610a8c7f00000000000000000000000000000000000000000000000000000000613ccd20612d3b565b4211610b7b576000805b600c54811015610b3c576000600c8281548110610a9757610a97612e8c565b6000918252602090912001546040516370a0823160e01b81523360048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015610ae357600080fd5b505afa158015610af7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1b9190612805565b1115610b2a5760019150610b3c565b610b35600182612d3b565b9050610a78565b5080610b795760405162461bcd60e51b815260206004820152600c60248201526b43616e6e6f7420636c61696d60a01b604482015260640161054b565b505b610b86335b82611c2b565b506001600a55565b6107de838383604051806020016040528060008152506112f0565b600061051b82604051806040016040528060058152602001640a692b0a8960db1b815250600f805480602002602001604051908101604052809291908181526020018280548015610871576000918252602091829020805460ff16845290820283019290916001910180841161084257905050505050506117c2565b600b546001600160a01b03163314610c4f5760405162461bcd60e51b815260040161054b90612cb5565b600081118015610c6057506122b981105b610c9f5760405162461bcd60e51b815260206004820152601060248201526f151bdad95b881251081a5b9d985b1a5960821b604482015260640161054b565b6000600d5411610cea5760405162461bcd60e51b8152602060048201526016602482015275139bc8185d985a5b18589b194813dddb995c8813919560521b604482015260640161054b565b610cf333610b80565b600d8054906000610d0383612dc9565b919050555050565b6000610d1660085490565b8210610d795760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161054b565b60088281548110610d8c57610d8c612e8c565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b03168061051b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161054b565b600061051b826040518060400160405280600581526020016411925494d560da1b815250600f805480602002602001604051908101604052809291908181526020018280548015610871576000918252602091829020805460ff16845290820283019290916001910180841161084257905050505050506117c2565b60006001600160a01b038216610efc5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161054b565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b03163314610f425760405162461bcd60e51b815260040161054b90612cb5565b610f4c6000611c49565b565b600061051b826040518060400160405280600681526020016514d150d3d39160d21b815250600f805480602002602001604051908101604052809291908181526020018280548015610871576000918252602091829020805460ff16845290820283019290916001910180841161084257905050505050506117c2565b600061051b82604051806040016040528060078152602001660a68aac8a9ca8960cb1b815250600f805480602002602001604051908101604052809291908181526020018280548015610871576000918252602091829020805460ff16845290820283019290916001910180841161084257905050505050506117c2565b600061051b8260405180604001604052806005815260200164115251d21560da1b815250600f805480602002602001604051908101604052809291908181526020018280548015610871576000918252602091829020805460ff16845290820283019290916001910180841161084257905050505050506117c2565b600b546001600160a01b031633146110ef5760405162461bcd60e51b815260040161054b90612cb5565b600c80546110ff90600190612d86565b8154811061110f5761110f612e8c565b600091825260209091200154600c80546001600160a01b03909216918390811061113b5761113b612e8c565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600c80548061117a5761117a612e76565b600082815260209020810160001990810180546001600160a01b031916905501905550565b6060600180546105b590612de0565b600061051b826040518060400160405280600681526020016508c9eaaa4a8960d31b815250600f805480602002602001604051908101604052809291908181526020018280548015610871576000918252602091829020805460ff16845290820283019290916001910180841161084257905050505050506117c2565b6001600160a01b0382163314156112845760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161054b565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6112fa3383611989565b6113165760405162461bcd60e51b815260040161054b90612cea565b61132284848484611c9b565b50505050565b606061133261259b565b60405180610120016040528060ff8152602001612ecf60ff9139815261135f61135a84610e15565b611cce565b816001602002018190525060405180606001604052806029815260200161308960299139604082015261139461135a84610f4e565b6060808301919091526040805191820190526029808252612fce602083013960808201526113c461135a84611688565b60a0820152604080516060810190915260298082526130db602083013960c08201526113f261135a846111ae565b60e082015260408051606081019091526029808252613104602083013961010082015261142161135a846107e3565b61012082015260408051606081019091526029808252612ff7602083013961014082015261145161135a84610ba9565b61016082015260408051606081019091526029808252613020602083013961018082015261148161135a84610fcb565b6101a0820152604080516060810190915260298082526130b260208301396101c08201526114b161135a84611049565b6101e0820152604080518082018252600d81526c1e17ba32bc3a1f1e17b9bb339f60991b602080830191909152610200840191909152825181840151838501516060860151608087015160a088015160c089015160e08a01516101008b0151995160009a6115219a9091016128b1565b60408051808303601f19018152908290526101208401516101408501516101608601516101808701516101a08801516101c08901516101e08a01516102008b0151979950611574988a98906020016128b1565b604051602081830303815290604052905060006115c161159386611e30565b61159c84611f2e565b6040516020016115ad929190612a5d565b604051602081830303815290604052611f2e565b9050806040516020016115d49190612a18565b60408051601f1981840301815291905295945050505050565b600b546001600160a01b031633146116175760405162461bcd60e51b815260040161054b90612cb5565b6001600160a01b03811661167c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161054b565b61168581611c49565b50565b600061051b8260405180604001604052806005815260200164151212549160da1b815250600f805480602002602001604051908101604052809291908181526020018280548015610871576000918252602091829020805460ff16845290820283019290916001910180841161084257905050505050506117c2565b60006001600160e01b031982166380ac58cd60e01b148061173557506001600160e01b03198216635b5e139f60e01b145b8061051b57506301ffc9a760e01b6001600160e01b031983161461051b565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061178982610d9e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806117f7846117d287611e30565b6040516020016117e3929190612882565b604051602081830303815290604052612094565b90506000838451836118099190612e36565b8151811061181957611819612e8c565b602002602001015160ff16905060006015836118359190612e36565b9050600e811115611889576011805461184e9085612e36565b8154811061185e5761185e612e8c565b60009182526020918290209181049091015461188691601f166101000a900460ff1683612d3b565b91505b6013811061197f57806013141561193657601180546118a89085612e36565b815481106118b8576118b8612e8c565b90600052602060002090602091828204019190069054906101000a900460ff1660ff1660108080549050856118ed9190612e36565b815481106118fd576118fd612e8c565b60009182526020918290209181049091015461192591601f166101000a900460ff1684612d67565b61192f9190612d3b565b915061197f565b601080546119449085612e36565b8154811061195457611954612e8c565b60009182526020918290209181049091015461197c91601f166101000a900460ff1683612d67565b91505b5095945050505050565b6000818152600260205260408120546001600160a01b0316611a025760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161054b565b6000611a0d83610d9e565b9050806001600160a01b0316846001600160a01b03161480611a485750836001600160a01b0316611a3d84610638565b6001600160a01b0316145b80611a7857506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611a9382610d9e565b6001600160a01b031614611afb5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161054b565b6001600160a01b038216611b5d5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161054b565b611b688383836120c5565b611b73600082611754565b6001600160a01b0383166000908152600360205260408120805460019290611b9c908490612d86565b90915550506001600160a01b0382166000908152600360205260408120805460019290611bca908490612d3b565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b611c4582826040518060200160405280600081525061217d565b5050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611ca6848484611a80565b611cb2848484846121b0565b6113225760405162461bcd60e51b815260040161054b90612c63565b6060600a821015611d8657600e8281548110611cec57611cec612e8c565b906000526020600020018054611d0190612de0565b80601f0160208091040260200160405190810160405280929190818152602001828054611d2d90612de0565b8015611d7a5780601f10611d4f57610100808354040283529160200191611d7a565b820191906000526020600020905b815481529060010190602001808311611d5d57829003601f168201915b50505050509050919050565b8160005b8115611db05780611d9a81612e1b565b9150611da99050600a83612d53565b9150611d8a565b6040805160208101909152600081525b8415611a7857611dd1600183612d86565b9150600e611de0600a87612e36565b81548110611df057611df0612e8c565b9060005260206000200181604051602001611e0c929190612971565b60408051601f198184030181529190529050611e29600a86612d53565b9450611dc0565b606081611e545750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611e7e5780611e6881612e1b565b9150611e779050600a83612d53565b9150611e58565b60008167ffffffffffffffff811115611e9957611e99612ea2565b6040519080825280601f01601f191660200182016040528015611ec3576020820181803683370190505b5090505b8415611a7857611ed8600183612d86565b9150611ee5600a86612e36565b611ef0906030612d3b565b60f81b818381518110611f0557611f05612e8c565b60200101906001600160f81b031916908160001a905350611f27600a86612d53565b9450611ec7565b805160609080611f4e575050604080516020810190915260008152919050565b60006003611f5d836002612d3b565b611f679190612d53565b611f72906004612d67565b90506000611f81826020612d3b565b67ffffffffffffffff811115611f9957611f99612ea2565b6040519080825280601f01601f191660200182016040528015611fc3576020820181803683370190505b5090506000604051806060016040528060408152602001613049604091399050600181016020830160005b8681101561204f576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101611fee565b506003860660018114612069576002811461207a57612086565b613d3d60f01b600119830152612086565b603d60f81b6000198301525b505050918152949350505050565b6000816040516020016120a79190612866565b60408051601f19818403018152919052805160209091012092915050565b6001600160a01b0383166121205761211b81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612143565b816001600160a01b0316836001600160a01b0316146121435761214383826122bd565b6001600160a01b03821661215a576107de8161235a565b826001600160a01b0316826001600160a01b0316146107de576107de8282612409565b612187838361244d565b61219460008484846121b0565b6107de5760405162461bcd60e51b815260040161054b90612c63565b60006001600160a01b0384163b156122b257604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906121f4903390899088908890600401612c13565b602060405180830381600087803b15801561220e57600080fd5b505af192505050801561223e575060408051601f3d908101601f1916820190925261223b918101906127cf565b60015b612298573d80801561226c576040519150601f19603f3d011682016040523d82523d6000602084013e612271565b606091505b5080516122905760405162461bcd60e51b815260040161054b90612c63565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a78565b506001949350505050565b600060016122ca84610e91565b6122d49190612d86565b600083815260076020526040902054909150808214612327576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061236c90600190612d86565b6000838152600960205260408120546008805493945090928490811061239457612394612e8c565b9060005260206000200154905080600883815481106123b5576123b5612e8c565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806123ed576123ed612e76565b6001900381819060005260206000200160009055905550505050565b600061241483610e91565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166124a35760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161054b565b6000818152600260205260409020546001600160a01b0316156125085760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161054b565b612514600083836120c5565b6001600160a01b038216600090815260036020526040812080546001929061253d908490612d3b565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6040518061022001604052806011905b60608152602001906001900390816125ab5790505090565b80356001600160a01b03811681146125da57600080fd5b919050565b6000602082840312156125f157600080fd5b6125fa826125c3565b9392505050565b6000806040838503121561261457600080fd5b61261d836125c3565b915061262b602084016125c3565b90509250929050565b60008060006060848603121561264957600080fd5b612652846125c3565b9250612660602085016125c3565b9150604084013590509250925092565b6000806000806080858703121561268657600080fd5b61268f856125c3565b935061269d602086016125c3565b925060408501359150606085013567ffffffffffffffff808211156126c157600080fd5b818701915087601f8301126126d557600080fd5b8135818111156126e7576126e7612ea2565b604051601f8201601f19908116603f0116810190838211818310171561270f5761270f612ea2565b816040528281528a602084870101111561272857600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561275f57600080fd5b612768836125c3565b91506020830135801515811461277d57600080fd5b809150509250929050565b6000806040838503121561279b57600080fd5b6127a4836125c3565b946020939093013593505050565b6000602082840312156127c457600080fd5b81356125fa81612eb8565b6000602082840312156127e157600080fd5b81516125fa81612eb8565b6000602082840312156127fe57600080fd5b5035919050565b60006020828403121561281757600080fd5b5051919050565b60008151808452612836816020860160208601612d9d565b601f01601f19169290920160200192915050565b6000815161285c818560208601612d9d565b9290920192915050565b60008251612878818460208701612d9d565b9190910192915050565b60008351612894818460208801612d9d565b8351908301906128a8818360208801612d9d565b01949350505050565b60008a516128c3818460208f01612d9d565b8a516128d58183860160208f01612d9d565b8a5191840101906128ea818360208e01612d9d565b89516128fc8183850160208e01612d9d565b8951929091010190612912818360208c01612d9d565b8751910190612925818360208b01612d9d565b86516129378183850160208b01612d9d565b865192909101019061294d818360208901612d9d565b845161295f8183850160208901612d9d565b9101019b9a5050505050505050505050565b600080845481600182811c91508083168061298d57607f831692505b60208084108214156129ad57634e487b7160e01b86526022600452602486fd5b8180156129c157600181146129d2576129ff565b60ff198616895284890196506129ff565b60008b81526020902060005b868110156129f75781548b8201529085019083016129de565b505084890196505b505050505050612a0f818561284a565b95945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251612a5081601d850160208701612d9d565b91909101601d0192915050565b717b226e616d65223a2022476c69746368202360701b81528251600090612a8b816012850160208801612d9d565b7f222c20226465736372697074696f6e223a202249732074686973207265616c696012918401918201527f747920696e206661637420612073696d756c6174696f6e3f20412063616c6c2e60328201527f2e2e204120726f7574696e652e2e2e204120626f6e642e2e2e2041206472656160528201527f6d2e2e2e2054686520737562636f6e7363696f757320696e7374696e6374207360728201527f656e73657320676c69746368657320696e20746865206d61747269782e20466560928201527f656c206672656520746f207573652074686520706f77657273206f6620796f7560b28201527f7220476c6974636820696e20616e792077617920796f7520776973682e20576860d28201527f6174206d657373616765732077696c6c20796f7520726563656976653f222c2060f28201527f22696d616765223a2022646174613a696d6167652f7376672b786d6c3b62617361011282015263194d8d0b60e21b610132820152612a0f612c0561013683018661284a565b61227d60f01b815260020190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612c469083018461281e565b9695505050505050565b6020815260006125fa602083018461281e565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115612d4e57612d4e612e4a565b500190565b600082612d6257612d62612e60565b500490565b6000816000190483118215151615612d8157612d81612e4a565b500290565b600082821015612d9857612d98612e4a565b500390565b60005b83811015612db8578181015183820152602001612da0565b838111156113225750506000910152565b600081612dd857612dd8612e4a565b506000190190565b600181811c90821680612df457607f821691505b60208210811415612e1557634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612e2f57612e2f612e4a565b5060010190565b600082612e4557612e45612e60565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461168557600080fdfe3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e203c7374796c653e2e676c6f77207b2066696c6c3a20233031666630313b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a363970783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22626c61636b22202f3e3c7465787420783d2231302220793d2236302220636c6173733d22676c6f77223e3c2f746578743e3c7465787420783d2231302220793d223134302220636c6173733d22676c6f77223e3c2f746578743e3c7465787420783d2231302220793d223236302220636c6173733d22676c6f77223e3c2f746578743e3c7465787420783d2231302220793d223330302220636c6173733d22676c6f77223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d22676c6f77223e3c2f746578743e3c7465787420783d2231302220793d223334302220636c6173733d22676c6f77223e3c2f746578743e3c7465787420783d2231302220793d223138302220636c6173733d22676c6f77223e3c2f746578743e3c7465787420783d2231302220793d223232302220636c6173733d22676c6f77223ea26469706673582212206e998b32937e96207c0431f6a3e6f1c5b812f866d8107dac681f544743bc7e0864736f6c63430008060033

Deployed Bytecode Sourcemap

44374:9578:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44443:29;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;10043:32:1;;;10025:51;;10013:2;9998:18;44443:29:0;;;;;;;;38226:224;;;;;;:::i;:::-;;:::i;:::-;;;10745:14:1;;10738:22;10720:41;;10708:2;10693:18;38226:224:0;10675:92:1;46492:99:0;;;;;;:::i;:::-;;:::i;:::-;;25354:100;;;:::i;:::-;;;;;;;:::i;26913:221::-;;;;;;:::i;:::-;;:::i;26436:411::-;;;;;;:::i;:::-;;:::i;47439:121::-;;;;;;:::i;:::-;;:::i;:::-;;;19675:25:1;;;19663:2;19648:18;47439:121:0;19630:76:1;38866:113:0;38954:10;:17;38866:113;;27803:339;;;;;;:::i;:::-;;:::i;38534:256::-;;;;;;:::i;:::-;;:::i;51413:673::-;;;;;;:::i;:::-;;:::i;28213:185::-;;;;;;:::i;:::-;;:::i;47568:121::-;;;;;;:::i;:::-;;:::i;52094:270::-;;;;;;:::i;:::-;;:::i;44632:34::-;;;;;39056:233;;;;;;:::i;:::-;;:::i;25048:239::-;;;;;;:::i;:::-;;:::i;46919:121::-;;;;;;:::i;:::-;;:::i;24778:208::-;;;;;;:::i;:::-;;:::i;9818:94::-;;;:::i;47048:123::-;;;;;;:::i;:::-;;:::i;47697:125::-;;;;;;:::i;:::-;;:::i;9167:87::-;9240:6;;-1:-1:-1;;;;;9240:6:0;9167:87;;47830:121;;;;;;:::i;:::-;;:::i;46599:166::-;;;;;;:::i;:::-;;:::i;25523:104::-;;;:::i;47308:123::-;;;;;;:::i;:::-;;:::i;27206:295::-;;;;;;:::i;:::-;;:::i;28469:328::-;;;;;;:::i;:::-;;:::i;48728:2677::-;;;;;;:::i;:::-;;:::i;27572:164::-;;;;;;:::i;:::-;-1:-1:-1;;;;;27693:25:0;;;27669:4;27693:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;27572:164;10067:192;;;;;;:::i;:::-;;:::i;47179:121::-;;;;;;:::i;:::-;;:::i;44443:29::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44443:29:0;;-1:-1:-1;44443:29:0;:::o;38226:224::-;38328:4;-1:-1:-1;;;;;;38352:50:0;;-1:-1:-1;;;38352:50:0;;:90;;;38406:36;38430:11;38406:23;:36::i;:::-;38345:97;38226:224;-1:-1:-1;;38226:224:0:o;46492:99::-;9240:6;;-1:-1:-1;;;;;9240:6:0;8123:10;9387:23;9379:68;;;;-1:-1:-1;;;9379:68:0;;;;;;;:::i;:::-;;;;;;;;;46560:12:::1;:23:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;46560:23:0;;;;;::::1;::::0;;-1:-1:-1;;;;;;46560:23:0::1;-1:-1:-1::0;;;;;46560:23:0;;;::::1;::::0;;;::::1;::::0;;46492:99::o;25354:100::-;25408:13;25441:5;25434:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25354:100;:::o;26913:221::-;26989:7;30396:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30396:16:0;27009:73;;;;-1:-1:-1;;;27009:73:0;;15917:2:1;27009:73:0;;;15899:21:1;15956:2;15936:18;;;15929:30;15995:34;15975:18;;;15968:62;-1:-1:-1;;;16046:18:1;;;16039:42;16098:19;;27009:73:0;15889:234:1;27009:73:0;-1:-1:-1;27102:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;27102:24:0;;26913:221::o;26436:411::-;26517:13;26533:23;26548:7;26533:14;:23::i;:::-;26517:39;;26581:5;-1:-1:-1;;;;;26575:11:0;:2;-1:-1:-1;;;;;26575:11:0;;;26567:57;;;;-1:-1:-1;;;26567:57:0;;18138:2:1;26567:57:0;;;18120:21:1;18177:2;18157:18;;;18150:30;18216:34;18196:18;;;18189:62;-1:-1:-1;;;18267:18:1;;;18260:31;18308:19;;26567:57:0;18110:223:1;26567:57:0;8123:10;-1:-1:-1;;;;;26659:21:0;;;;:62;;-1:-1:-1;26684:37:0;26701:5;8123:10;27572:164;:::i;26684:37::-;26637:168;;;;-1:-1:-1;;;26637:168:0;;14310:2:1;26637:168:0;;;14292:21:1;14349:2;14329:18;;;14322:30;14388:34;14368:18;;;14361:62;14459:26;14439:18;;;14432:54;14503:19;;26637:168:0;14282:246:1;26637:168:0;26818:21;26827:2;26831:7;26818:8;:21::i;:::-;26506:341;26436:411;;:::o;47439:121::-;47495:7;47522:30;47528:7;47522:30;;;;;;;;;;;;;-1:-1:-1;;;47522:30:0;;;47546:5;47522:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:30::i;27803:339::-;27998:41;8123:10;28031:7;27998:18;:41::i;:::-;27990:103;;;;-1:-1:-1;;;27990:103:0;;;;;;;:::i;:::-;28106:28;28116:4;28122:2;28126:7;28106:9;:28::i;38534:256::-;38631:7;38667:23;38684:5;38667:16;:23::i;:::-;38659:5;:31;38651:87;;;;-1:-1:-1;;;38651:87:0;;11198:2:1;38651:87:0;;;11180:21:1;11237:2;11217:18;;;11210:30;11276:34;11256:18;;;11249:62;-1:-1:-1;;;11327:18:1;;;11320:41;11378:19;;38651:87:0;11170:233:1;38651:87:0;-1:-1:-1;;;;;;38756:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;38534:256::o;51413:673::-;12098:1;12694:7;;:19;;12686:63;;;;-1:-1:-1;;;12686:63:0;;19371:2:1;12686:63:0;;;19353:21:1;19410:2;19390:18;;;19383:30;19449:33;19429:18;;;19422:61;19500:18;;12686:63:0;19343:181:1;12686:63:0;12098:1;12827:7;:18;51484:11;;;;;:29:::1;;;51509:4;51499:7;:14;51484:29;51476:58;;;::::0;-1:-1:-1;;;51476:58:0;;16691:2:1;51476:58:0::1;::::0;::::1;16673:21:1::0;16730:2;16710:18;;;16703:30;-1:-1:-1;;;16749:18:1;;;16742:46;16805:18;;51476:58:0::1;16663:166:1::0;51476:58:0::1;51587:4;51569:15;;51553:13;38954:10:::0;:17;;38866:113;51553:13:::1;:31;;;;:::i;:::-;:38;51545:67;;;::::0;-1:-1:-1;;;51545:67:0;;13552:2:1;51545:67:0::1;::::0;::::1;13534:21:1::0;13591:2;13571:18;;;13564:30;-1:-1:-1;;;13610:18:1;;;13603:46;13666:18;;51545:67:0::1;13524:166:1::0;51545:67:0::1;51664:31;44613:10;51664:12;:31;:::i;:::-;51645:15;:50;51623:413;;51712:13;51753:9:::0;51748:229:::1;51772:12;:19:::0;51768:23;::::1;51748:229;;;51873:1;51832:12;51845:1;51832:15;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;51824:46:::1;::::0;-1:-1:-1;;;51824:46:0;;51859:10:::1;51824:46;::::0;::::1;10025:51:1::0;-1:-1:-1;;;;;51832:15:0;;::::1;::::0;51824:34:::1;::::0;9998:18:1;;51824:46:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;51820:142;;;51910:4;51899:15;;51937:5;;51820:142;51793:6;51798:1;51793:6:::0;::::1;:::i;:::-;;;51748:229;;;;51999:8;51991:33;;;::::0;-1:-1:-1;;;51991:33:0;;17797:2:1;51991:33:0::1;::::0;::::1;17779:21:1::0;17836:2;17816:18;;;17809:30;-1:-1:-1;;;17855:18:1;;;17848:42;17907:18;;51991:33:0::1;17769:162:1::0;51991:33:0::1;51697:339;51623:413;52046:32;8123:10:::0;52056:12:::1;52070:7;52046:9;:32::i;:::-;-1:-1:-1::0;12054:1:0;13006:7;:22;51413:673::o;28213:185::-;28351:39;28368:4;28374:2;28378:7;28351:39;;;;;;;;;;;;:16;:39::i;47568:121::-;47624:7;47651:30;47657:7;47651:30;;;;;;;;;;;;;-1:-1:-1;;;47651:30:0;;;47675:5;47651:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:30::i;52094:270::-;9240:6;;-1:-1:-1;;;;;9240:6:0;8123:10;9387:23;9379:68;;;;-1:-1:-1;;;9379:68:0;;;;;;;:::i;:::-;52179:1:::1;52169:7;:11;:29;;;;;52194:4;52184:7;:14;52169:29;52161:58;;;::::0;-1:-1:-1;;;52161:58:0;;16691:2:1;52161:58:0::1;::::0;::::1;16673:21:1::0;16730:2;16710:18;;;16703:30;-1:-1:-1;;;16749:18:1;;;16742:46;16805:18;;52161:58:0::1;16663:166:1::0;52161:58:0::1;52256:1;52238:15;;:19;52230:54;;;::::0;-1:-1:-1;;;52230:54:0;;17036:2:1;52230:54:0::1;::::0;::::1;17018:21:1::0;17075:2;17055:18;;;17048:30;-1:-1:-1;;;17094:18:1;;;17087:52;17156:18;;52230:54:0::1;17008:172:1::0;52230:54:0::1;52295:32;8123:10:::0;52305:12:::1;8043:98:::0;52295:32:::1;52338:15;:18:::0;;;:15:::1;:18;::::0;::::1;:::i;:::-;;;;;;52094:270:::0;:::o;39056:233::-;39131:7;39167:30;38954:10;:17;;38866:113;39167:30;39159:5;:38;39151:95;;;;-1:-1:-1;;;39151:95:0;;18958:2:1;39151:95:0;;;18940:21:1;18997:2;18977:18;;;18970:30;19036:34;19016:18;;;19009:62;-1:-1:-1;;;19087:18:1;;;19080:42;19139:19;;39151:95:0;18930:234:1;39151:95:0;39264:10;39275:5;39264:17;;;;;;;;:::i;:::-;;;;;;;;;39257:24;;39056:233;;;:::o;25048:239::-;25120:7;25156:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25156:16:0;25191:19;25183:73;;;;-1:-1:-1;;;25183:73:0;;15146:2:1;25183:73:0;;;15128:21:1;15185:2;15165:18;;;15158:30;15224:34;15204:18;;;15197:62;-1:-1:-1;;;15275:18:1;;;15268:39;15324:19;;25183:73:0;15118:231:1;46919:121:0;46975:7;47002:30;47008:7;47002:30;;;;;;;;;;;;;-1:-1:-1;;;47002:30:0;;;47026:5;47002:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:30::i;24778:208::-;24850:7;-1:-1:-1;;;;;24878:19:0;;24870:74;;;;-1:-1:-1;;;24870:74:0;;14735:2:1;24870:74:0;;;14717:21:1;14774:2;14754:18;;;14747:30;14813:34;14793:18;;;14786:62;-1:-1:-1;;;14864:18:1;;;14857:40;14914:19;;24870:74:0;14707:232:1;24870:74:0;-1:-1:-1;;;;;;24962:16:0;;;;;:9;:16;;;;;;;24778:208::o;9818:94::-;9240:6;;-1:-1:-1;;;;;9240:6:0;8123:10;9387:23;9379:68;;;;-1:-1:-1;;;9379:68:0;;;;;;;:::i;:::-;9883:21:::1;9901:1;9883:9;:21::i;:::-;9818:94::o:0;47048:123::-;47105:7;47132:31;47138:7;47132:31;;;;;;;;;;;;;-1:-1:-1;;;47132:31:0;;;47157:5;47132:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:31::i;47697:125::-;47755:7;47782:32;47788:7;47782:32;;;;;;;;;;;;;-1:-1:-1;;;47782:32:0;;;47808:5;47782:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:32::i;47830:121::-;47886:7;47913:30;47919:7;47913:30;;;;;;;;;;;;;-1:-1:-1;;;47913:30:0;;;47937:5;47913:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:30::i;46599:166::-;9240:6;;-1:-1:-1;;;;;9240:6:0;8123:10;9387:23;9379:68;;;;-1:-1:-1;;;9379:68:0;;;;;;;:::i;:::-;46691:12:::1;46704:19:::0;;:23:::1;::::0;46726:1:::1;::::0;46704:23:::1;:::i;:::-;46691:37;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;46670:12:::1;:18:::0;;-1:-1:-1;;;;;46691:37:0;;::::1;::::0;46683:4;;46670:18;::::1;;;;;:::i;:::-;;;;;;;;;:58;;;;;-1:-1:-1::0;;;;;46670:58:0::1;;;;;-1:-1:-1::0;;;;;46670:58:0::1;;;;;;46739:12;:18;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;46739:18:0;;;;;-1:-1:-1;;;;;;46739:18:0::1;::::0;;;;;-1:-1:-1;46599:166:0:o;25523:104::-;25579:13;25612:7;25605:14;;;;;:::i;47308:123::-;47365:7;47392:31;47398:7;47392:31;;;;;;;;;;;;;-1:-1:-1;;;47392:31:0;;;47417:5;47392:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:31::i;27206:295::-;-1:-1:-1;;;;;27309:24:0;;8123:10;27309:24;;27301:62;;;;-1:-1:-1;;;27301:62:0;;13198:2:1;27301:62:0;;;13180:21:1;13237:2;13217:18;;;13210:30;13276:27;13256:18;;;13249:55;13321:18;;27301:62:0;13170:175:1;27301:62:0;8123:10;27376:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;27376:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;27376:53:0;;;;;;;;;;27445:48;;10720:41:1;;;27376:42:0;;8123:10;27445:48;;10693:18:1;27445:48:0;;;;;;;27206:295;;:::o;28469:328::-;28644:41;8123:10;28677:7;28644:18;:41::i;:::-;28636:103;;;;-1:-1:-1;;;28636:103:0;;;;;;;:::i;:::-;28750:39;28764:4;28770:2;28774:7;28783:5;28750:13;:39::i;:::-;28469:328;;;;:::o;48728:2677::-;48793:13;48819:23;;:::i;:::-;48853:294;;;;;;;;;;;;;;;;;;;49191:26;49199:17;49208:7;49199:8;:17::i;:::-;49191:7;:26::i;:::-;49180:5;49186:1;49180:8;;;:37;;;;49230:54;;;;;;;;;;;;;;;;;:8;;;:54;49308:27;49316:18;49326:7;49316:9;:18::i;49308:27::-;49297:8;;;;:38;;;;49348:54;;;;;;;;;;;;;49297:8;49348:54;;;:8;;;:54;49426:26;49434:17;49443:7;49434:8;:17::i;49426:26::-;49415:8;;;:37;49465:54;;;;;;;;;;;;;;49415:8;49465:54;;;:8;;;:54;49543:27;49551:18;49561:7;49551:9;:18::i;49543:27::-;49532:8;;;:38;49583:54;;;;;;;;;;;;;;49532:8;49583:54;;;:8;;;:54;49661:26;49669:17;49678:7;49669:8;:17::i;49661:26::-;49650:8;;;:37;49700:55;;;;;;;;;;;;;;49650:8;49700:55;;;:9;;;:55;49780:26;49788:17;49797:7;49788:8;:17::i;49780:26::-;49768:9;;;:38;49819:55;;;;;;;;;;;;;;49768:9;49819:55;;;:9;;;:55;49899:28;49907:19;49918:7;49907:10;:19::i;49899:28::-;49887:9;;;:40;49940:55;;;;;;;;;;;;;;49887:9;49940:55;;;:9;;;:55;50020:26;50028:17;50037:7;50028:8;:17::i;50020:26::-;50008:9;;;:38;50059:27;;;;;;;;;;;-1:-1:-1;;;50008:9:0;50059:27;;;;;;;:9;;;:27;;;;50160:8;;50170;;;;50180;;;;50190;;;;50200;;;;50210;;;;50220;;;;50230;;;;50240;;;;50143:106;;-1:-1:-1;;50143:106:0;;50240:8;;50143:106;;:::i;:::-;;;;;;;-1:-1:-1;;50143:106:0;;;;;;;50361:8;;;;50388:9;;;;50416;;;;50444;;;;50472;;;;50500;;;;50528;;;;50556;;;;50143:106;;-1:-1:-1;50301:279:0;;50143:106;;50556:9;50361:8;50301:279;;:::i;:::-;;;;;;;;;;;;;50271:320;;50604:18;50625:663;50796:17;50805:7;50796:8;:17::i;:::-;51161:28;51181:6;51161:13;:28::i;:::-;50706:537;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50625:13;:663::i;:::-;50604:684;;51365:4;51315:55;;;;;;;;:::i;:::-;;;;-1:-1:-1;;51315:55:0;;;;;;;;;;48728:2677;-1:-1:-1;;;;;48728:2677:0:o;10067:192::-;9240:6;;-1:-1:-1;;;;;9240:6:0;8123:10;9387:23;9379:68;;;;-1:-1:-1;;;9379:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10156:22:0;::::1;10148:73;;;::::0;-1:-1:-1;;;10148:73:0;;12029:2:1;10148:73:0::1;::::0;::::1;12011:21:1::0;12068:2;12048:18;;;12041:30;12107:34;12087:18;;;12080:62;-1:-1:-1;;;12158:18:1;;;12151:36;12204:19;;10148:73:0::1;12001:228:1::0;10148:73:0::1;10232:19;10242:8;10232:9;:19::i;:::-;10067:192:::0;:::o;47179:121::-;47235:7;47262:30;47268:7;47262:30;;;;;;;;;;;;;-1:-1:-1;;;47262:30:0;;;47286:5;47262:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:30::i;24409:305::-;24511:4;-1:-1:-1;;;;;;24548:40:0;;-1:-1:-1;;;24548:40:0;;:105;;-1:-1:-1;;;;;;;24605:48:0;;-1:-1:-1;;;24605:48:0;24548:105;:158;;;-1:-1:-1;;;;;;;;;;23127:40:0;;;24670:36;23018:157;34289:174;34364:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;34364:29:0;-1:-1:-1;;;;;34364:29:0;;;;;;;;:24;;34418:23;34364:24;34418:14;:23::i;:::-;-1:-1:-1;;;;;34409:46:0;;;;;;;;;;;34289:174;;:::o;47959:761::-;48101:7;48121:12;48136:62;48167:9;48178:17;48187:7;48178:8;:17::i;:::-;48150:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48136:6;:62::i;:::-;48121:77;;48209:14;48226:11;48245;:18;48238:4;:25;;;;:::i;:::-;48226:38;;;;;;;;:::i;:::-;;;;;;;48209:55;;;;48275:12;48297:2;48290:4;:9;;;;:::i;:::-;48275:24;;48321:2;48314:4;:9;48310:84;;;48350:8;48366:15;;48359:22;;:4;:22;:::i;:::-;48350:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;48340:42;;48350:32;;;;;;;;48340:42;;:::i;:::-;;;48310:84;48416:2;48408:4;:10;48404:285;;48439:4;48447:2;48439:10;48435:243;;;48531:8;48547:15;;48540:22;;:4;:22;:::i;:::-;48531:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;48479:84;;48489:11;48508;:18;;;;48501:4;:25;;;;:::i;:::-;48489:38;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;48480:47;;48489:38;;;;;;;;48480:6;:47;:::i;:::-;48479:84;;;;:::i;:::-;48470:93;;48435:243;;;48623:11;48642:18;;48635:25;;:4;:25;:::i;:::-;48623:38;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;48614:47;;48623:38;;;;;;;;48614:6;:47;:::i;:::-;48604:58;;48435:243;-1:-1:-1;48706:6:0;47959:761;-1:-1:-1;;;;;47959:761:0:o;30601:348::-;30694:4;30396:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30396:16:0;30711:73;;;;-1:-1:-1;;;30711:73:0;;13897:2:1;30711:73:0;;;13879:21:1;13936:2;13916:18;;;13909:30;13975:34;13955:18;;;13948:62;-1:-1:-1;;;14026:18:1;;;14019:42;14078:19;;30711:73:0;13869:234:1;30711:73:0;30795:13;30811:23;30826:7;30811:14;:23::i;:::-;30795:39;;30864:5;-1:-1:-1;;;;;30853:16:0;:7;-1:-1:-1;;;;;30853:16:0;;:51;;;;30897:7;-1:-1:-1;;;;;30873:31:0;:20;30885:7;30873:11;:20::i;:::-;-1:-1:-1;;;;;30873:31:0;;30853:51;:87;;;-1:-1:-1;;;;;;27693:25:0;;;27669:4;27693:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;30908:32;30845:96;30601:348;-1:-1:-1;;;;30601:348:0:o;33593:578::-;33752:4;-1:-1:-1;;;;;33725:31:0;:23;33740:7;33725:14;:23::i;:::-;-1:-1:-1;;;;;33725:31:0;;33717:85;;;;-1:-1:-1;;;33717:85:0;;17387:2:1;33717:85:0;;;17369:21:1;17426:2;17406:18;;;17399:30;17465:34;17445:18;;;17438:62;-1:-1:-1;;;17516:18:1;;;17509:39;17565:19;;33717:85:0;17359:231:1;33717:85:0;-1:-1:-1;;;;;33821:16:0;;33813:65;;;;-1:-1:-1;;;33813:65:0;;12793:2:1;33813:65:0;;;12775:21:1;12832:2;12812:18;;;12805:30;12871:34;12851:18;;;12844:62;-1:-1:-1;;;12922:18:1;;;12915:34;12966:19;;33813:65:0;12765:226:1;33813:65:0;33891:39;33912:4;33918:2;33922:7;33891:20;:39::i;:::-;33995:29;34012:1;34016:7;33995:8;:29::i;:::-;-1:-1:-1;;;;;34037:15:0;;;;;;:9;:15;;;;;:20;;34056:1;;34037:15;:20;;34056:1;;34037:20;:::i;:::-;;;;-1:-1:-1;;;;;;;34068:13:0;;;;;;:9;:13;;;;;:18;;34085:1;;34068:13;:18;;34085:1;;34068:18;:::i;:::-;;;;-1:-1:-1;;34097:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34097:21:0;-1:-1:-1;;;;;34097:21:0;;;;;;;;;34136:27;;34097:16;;34136:27;;;;;;;33593:578;;;:::o;31291:110::-;31367:26;31377:2;31381:7;31367:26;;;;;;;;;;;;:9;:26::i;:::-;31291:110;;:::o;10267:173::-;10342:6;;;-1:-1:-1;;;;;10359:17:0;;;-1:-1:-1;;;;;;10359:17:0;;;;;;;10392:40;;10342:6;;;10359:17;10342:6;;10392:40;;10323:16;;10392:40;10312:128;10267:173;:::o;29679:315::-;29836:28;29846:4;29852:2;29856:7;29836:9;:28::i;:::-;29883:48;29906:4;29912:2;29916:7;29925:5;29883:22;:48::i;:::-;29875:111;;;;-1:-1:-1;;;29875:111:0;;;;;;;:::i;53103:522::-;53158:13;53196:2;53188:5;:10;53184:67;;;53222:10;53233:5;53222:17;;;;;;;;:::i;:::-;;;;;;;;53215:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53103:522;;;:::o;53184:67::-;53276:5;53261:12;53319:78;53326:9;;53319:78;;53352:8;;;;:::i;:::-;;-1:-1:-1;53375:10:0;;-1:-1:-1;53383:2:0;53375:10;;:::i;:::-;;;53319:78;;;53407:22;;;;;;;;;:17;:22;;53440:157;53447:10;;53440:157;;53474:11;53484:1;53474:11;;:::i;:::-;;-1:-1:-1;53530:10:0;53541;53549:2;53541:5;:10;:::i;:::-;53530:22;;;;;;;;:::i;:::-;;;;;;;;53554:3;53513:45;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;53513:45:0;;;;;;;;;;-1:-1:-1;53574:11:0;53583:2;53574:11;;:::i;:::-;;;53440:157;;52372:723;52428:13;52649:10;52645:53;;-1:-1:-1;;52676:10:0;;;;;;;;;;;;-1:-1:-1;;;52676:10:0;;;;;52372:723::o;52645:53::-;52723:5;52708:12;52764:78;52771:9;;52764:78;;52797:8;;;;:::i;:::-;;-1:-1:-1;52820:10:0;;-1:-1:-1;52828:2:0;52820:10;;:::i;:::-;;;52764:78;;;52852:19;52884:6;52874:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52874:17:0;;52852:39;;52902:154;52909:10;;52902:154;;52936:11;52946:1;52936:11;;:::i;:::-;;-1:-1:-1;53005:10:0;53013:2;53005:5;:10;:::i;:::-;52992:24;;:2;:24;:::i;:::-;52979:39;;52962:6;52969;52962:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;52962:56:0;;;;;;;;-1:-1:-1;53033:11:0;53042:2;53033:11;;:::i;:::-;;;52902:154;;54303:1607;54401:11;;54361:13;;54427:8;54423:23;;-1:-1:-1;;54437:9:0;;;;;;;;;-1:-1:-1;54437:9:0;;;54303:1607;-1:-1:-1;54303:1607:0:o;54423:23::-;54498:18;54536:1;54525:7;:3;54531:1;54525:7;:::i;:::-;54524:13;;;;:::i;:::-;54519:19;;:1;:19;:::i;:::-;54498:40;-1:-1:-1;54596:19:0;54628:15;54498:40;54641:2;54628:15;:::i;:::-;54618:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54618:26:0;;54596:48;;54657:18;54678:5;;;;;;;;;;;;;;;;;54657:26;;54747:1;54740:5;54736:13;54792:2;54784:6;54780:15;54843:1;54811:777;54866:3;54863:1;54860:10;54811:777;;;54921:1;54964:12;;;;;54958:19;55059:4;55047:2;55043:14;;;;;55025:40;;55019:47;55168:2;55164:14;;;55160:25;;55146:40;;55140:47;55297:1;55293:13;;;55289:24;;55275:39;;55269:46;55417:16;;;;55403:31;;55397:38;55095:1;55091:11;;;55189:4;55136:58;;;55127:68;55220:11;;55265:57;;;55256:67;;;;55348:11;;55393:49;;55384:59;55472:3;55468:13;55501:22;;55571:1;55556:17;;;;54914:9;54811:777;;;54815:44;55620:1;55615:3;55611:11;55641:1;55636:84;;;;55739:1;55734:82;;;;55604:212;;55636:84;-1:-1:-1;;;;;55669:17:0;;55662:43;55636:84;;55734:82;-1:-1:-1;;;;;55767:17:0;;55760:41;55604:212;-1:-1:-1;;;55832:26:0;;;55839:6;54303:1607;-1:-1:-1;;;;54303:1607:0:o;46773:138::-;46833:7;46895:5;46878:23;;;;;;;;:::i;:::-;;;;-1:-1:-1;;46878:23:0;;;;;;;;;46868:34;;46878:23;46868:34;;;;;46773:138;-1:-1:-1;;46773:138:0:o;39902:589::-;-1:-1:-1;;;;;40108:18:0;;40104:187;;40143:40;40175:7;41318:10;:17;;41291:24;;;;:15;:24;;;;;:44;;;41346:24;;;;;;;;;;;;41214:164;40143:40;40104:187;;;40213:2;-1:-1:-1;;;;;40205:10:0;:4;-1:-1:-1;;;;;40205:10:0;;40201:90;;40232:47;40265:4;40271:7;40232:32;:47::i;:::-;-1:-1:-1;;;;;40305:16:0;;40301:183;;40338:45;40375:7;40338:36;:45::i;40301:183::-;40411:4;-1:-1:-1;;;;;40405:10:0;:2;-1:-1:-1;;;;;40405:10:0;;40401:83;;40432:40;40460:2;40464:7;40432:27;:40::i;31628:321::-;31758:18;31764:2;31768:7;31758:5;:18::i;:::-;31809:54;31840:1;31844:2;31848:7;31857:5;31809:22;:54::i;:::-;31787:154;;;;-1:-1:-1;;;31787:154:0;;;;;;;:::i;35028:803::-;35183:4;-1:-1:-1;;;;;35204:13:0;;15529:20;15577:8;35200:624;;35240:72;;-1:-1:-1;;;35240:72:0;;-1:-1:-1;;;;;35240:36:0;;;;;:72;;8123:10;;35291:4;;35297:7;;35306:5;;35240:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35240:72:0;;;;;;;;-1:-1:-1;;35240:72:0;;;;;;;;;;;;:::i;:::-;;;35236:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35486:13:0;;35482:272;;35529:60;;-1:-1:-1;;;35529:60:0;;;;;;;:::i;35482:272::-;35704:6;35698:13;35689:6;35685:2;35681:15;35674:38;35236:533;-1:-1:-1;;;;;;35363:55:0;-1:-1:-1;;;35363:55:0;;-1:-1:-1;35356:62:0;;35200:624;-1:-1:-1;35808:4:0;35028:803;;;;;;:::o;42005:988::-;42271:22;42321:1;42296:22;42313:4;42296:16;:22::i;:::-;:26;;;;:::i;:::-;42333:18;42354:26;;;:17;:26;;;;;;42271:51;;-1:-1:-1;42487:28:0;;;42483:328;;-1:-1:-1;;;;;42554:18:0;;42532:19;42554:18;;;:12;:18;;;;;;;;:34;;;;;;;;;42605:30;;;;;;:44;;;42722:30;;:17;:30;;;;;:43;;;42483:328;-1:-1:-1;42907:26:0;;;;:17;:26;;;;;;;;42900:33;;;-1:-1:-1;;;;;42951:18:0;;;;;:12;:18;;;;;:34;;;;;;;42944:41;42005:988::o;43288:1079::-;43566:10;:17;43541:22;;43566:21;;43586:1;;43566:21;:::i;:::-;43598:18;43619:24;;;:15;:24;;;;;;43992:10;:26;;43541:46;;-1:-1:-1;43619:24:0;;43541:46;;43992:26;;;;;;:::i;:::-;;;;;;;;;43970:48;;44056:11;44031:10;44042;44031:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;44136:28;;;:15;:28;;;;;;;:41;;;44308:24;;;;;44301:31;44343:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;43359:1008;;;43288:1079;:::o;40792:221::-;40877:14;40894:20;40911:2;40894:16;:20::i;:::-;-1:-1:-1;;;;;40925:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;40970:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;40792:221:0:o;32285:382::-;-1:-1:-1;;;;;32365:16:0;;32357:61;;;;-1:-1:-1;;;32357:61:0;;15556:2:1;32357:61:0;;;15538:21:1;;;15575:18;;;15568:30;15634:34;15614:18;;;15607:62;15686:18;;32357:61:0;15528:182:1;32357:61:0;30372:4;30396:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30396:16:0;:30;32429:58;;;;-1:-1:-1;;;32429:58:0;;12436:2:1;32429:58:0;;;12418:21:1;12475:2;12455:18;;;12448:30;12514;12494:18;;;12487:58;12562:18;;32429:58:0;12408:178:1;32429:58:0;32500:45;32529:1;32533:2;32537:7;32500:20;:45::i;:::-;-1:-1:-1;;;;;32558:13:0;;;;;;:9;:13;;;;;:18;;32575:1;;32558:13;:18;;32575:1;;32558:18;:::i;:::-;;;;-1:-1:-1;;32587:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32587:21:0;-1:-1:-1;;;;;32587:21:0;;;;;;;;32626:33;;32587:16;;;32626:33;;32587:16;;32626:33;32285:382;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:2;;;320:1;317;310:12;272:2;343:29;362:9;343:29;:::i;:::-;333:39;262:116;-1:-1:-1;;;262:116:1:o;383:260::-;451:6;459;512:2;500:9;491:7;487:23;483:32;480:2;;;528:1;525;518:12;480:2;551:29;570:9;551:29;:::i;:::-;541:39;;599:38;633:2;622:9;618:18;599:38;:::i;:::-;589:48;;470:173;;;;;:::o;648:328::-;725:6;733;741;794:2;782:9;773:7;769:23;765:32;762:2;;;810:1;807;800:12;762:2;833:29;852:9;833:29;:::i;:::-;823:39;;881:38;915:2;904:9;900:18;881:38;:::i;:::-;871:48;;966:2;955:9;951:18;938:32;928:42;;752:224;;;;;:::o;981:1138::-;1076:6;1084;1092;1100;1153:3;1141:9;1132:7;1128:23;1124:33;1121:2;;;1170:1;1167;1160:12;1121:2;1193:29;1212:9;1193:29;:::i;:::-;1183:39;;1241:38;1275:2;1264:9;1260:18;1241:38;:::i;:::-;1231:48;;1326:2;1315:9;1311:18;1298:32;1288:42;;1381:2;1370:9;1366:18;1353:32;1404:18;1445:2;1437:6;1434:14;1431:2;;;1461:1;1458;1451:12;1431:2;1499:6;1488:9;1484:22;1474:32;;1544:7;1537:4;1533:2;1529:13;1525:27;1515:2;;1566:1;1563;1556:12;1515:2;1602;1589:16;1624:2;1620;1617:10;1614:2;;;1630:18;;:::i;:::-;1705:2;1699:9;1673:2;1759:13;;-1:-1:-1;;1755:22:1;;;1779:2;1751:31;1747:40;1735:53;;;1803:18;;;1823:22;;;1800:46;1797:2;;;1849:18;;:::i;:::-;1889:10;1885:2;1878:22;1924:2;1916:6;1909:18;1964:7;1959:2;1954;1950;1946:11;1942:20;1939:33;1936:2;;;1985:1;1982;1975:12;1936:2;2041;2036;2032;2028:11;2023:2;2015:6;2011:15;1998:46;2086:1;2081:2;2076;2068:6;2064:15;2060:24;2053:35;2107:6;2097:16;;;;;;;1111:1008;;;;;;;:::o;2124:347::-;2189:6;2197;2250:2;2238:9;2229:7;2225:23;2221:32;2218:2;;;2266:1;2263;2256:12;2218:2;2289:29;2308:9;2289:29;:::i;:::-;2279:39;;2368:2;2357:9;2353:18;2340:32;2415:5;2408:13;2401:21;2394:5;2391:32;2381:2;;2437:1;2434;2427:12;2381:2;2460:5;2450:15;;;2208:263;;;;;:::o;2476:254::-;2544:6;2552;2605:2;2593:9;2584:7;2580:23;2576:32;2573:2;;;2621:1;2618;2611:12;2573:2;2644:29;2663:9;2644:29;:::i;:::-;2634:39;2720:2;2705:18;;;;2692:32;;-1:-1:-1;;;2563:167:1:o;2735:245::-;2793:6;2846:2;2834:9;2825:7;2821:23;2817:32;2814:2;;;2862:1;2859;2852:12;2814:2;2901:9;2888:23;2920:30;2944:5;2920:30;:::i;2985:249::-;3054:6;3107:2;3095:9;3086:7;3082:23;3078:32;3075:2;;;3123:1;3120;3113:12;3075:2;3155:9;3149:16;3174:30;3198:5;3174:30;:::i;3239:180::-;3298:6;3351:2;3339:9;3330:7;3326:23;3322:32;3319:2;;;3367:1;3364;3357:12;3319:2;-1:-1:-1;3390:23:1;;3309:110;-1:-1:-1;3309:110:1:o;3424:184::-;3494:6;3547:2;3535:9;3526:7;3522:23;3518:32;3515:2;;;3563:1;3560;3553:12;3515:2;-1:-1:-1;3586:16:1;;3505:103;-1:-1:-1;3505:103:1:o;3613:257::-;3654:3;3692:5;3686:12;3719:6;3714:3;3707:19;3735:63;3791:6;3784:4;3779:3;3775:14;3768:4;3761:5;3757:16;3735:63;:::i;:::-;3852:2;3831:15;-1:-1:-1;;3827:29:1;3818:39;;;;3859:4;3814:50;;3662:208;-1:-1:-1;;3662:208:1:o;3875:185::-;3917:3;3955:5;3949:12;3970:52;4015:6;4010:3;4003:4;3996:5;3992:16;3970:52;:::i;:::-;4038:16;;;;;3925:135;-1:-1:-1;;3925:135:1:o;4195:276::-;4326:3;4364:6;4358:13;4380:53;4426:6;4421:3;4414:4;4406:6;4402:17;4380:53;:::i;:::-;4449:16;;;;;4334:137;-1:-1:-1;;4334:137:1:o;4476:470::-;4655:3;4693:6;4687:13;4709:53;4755:6;4750:3;4743:4;4735:6;4731:17;4709:53;:::i;:::-;4825:13;;4784:16;;;;4847:57;4825:13;4784:16;4881:4;4869:17;;4847:57;:::i;:::-;4920:20;;4663:283;-1:-1:-1;;;;4663:283:1:o;4951:1776::-;5466:3;5504:6;5498:13;5520:53;5566:6;5561:3;5554:4;5546:6;5542:17;5520:53;:::i;:::-;5604:6;5598:13;5620:68;5679:8;5670:6;5665:3;5661:16;5654:4;5646:6;5642:17;5620:68;:::i;:::-;5766:13;;5714:16;;;5710:31;;5788:57;5766:13;5710:31;5822:4;5810:17;;5788:57;:::i;:::-;5876:6;5870:13;5892:72;5955:8;5944;5937:5;5933:20;5926:4;5918:6;5914:17;5892:72;:::i;:::-;6046:13;;5990:20;;;;5986:35;;6068:57;6046:13;5986:35;6102:4;6090:17;;6068:57;:::i;:::-;6192:13;;6147:20;;;6214:57;6192:13;6147:20;6248:4;6236:17;;6214:57;:::i;:::-;6302:6;6296:13;6318:72;6381:8;6370;6363:5;6359:20;6352:4;6344:6;6340:17;6318:72;:::i;:::-;6472:13;;6416:20;;;;6412:35;;6494:57;6472:13;6412:35;6528:4;6516:17;;6494:57;:::i;:::-;6582:6;6576:13;6598:72;6661:8;6650;6643:5;6639:20;6632:4;6624:6;6620:17;6598:72;:::i;:::-;6690:20;;6686:35;;5474:1253;-1:-1:-1;;;;;;;;;;;5474:1253:1:o;6732:1174::-;6908:3;6937:1;6970:6;6964:13;7000:3;7022:1;7050:9;7046:2;7042:18;7032:28;;7110:2;7099:9;7095:18;7132;7122:2;;7176:4;7168:6;7164:17;7154:27;;7122:2;7202;7250;7242:6;7239:14;7219:18;7216:38;7213:2;;;-1:-1:-1;;;7277:33:1;;7333:4;7330:1;7323:15;7363:4;7284:3;7351:17;7213:2;7394:18;7421:104;;;;7539:1;7534:320;;;;7387:467;;7421:104;-1:-1:-1;;7454:24:1;;7442:37;;7499:16;;;;-1:-1:-1;7421:104:1;;7534:320;19784:1;19777:14;;;19821:4;19808:18;;7629:1;7643:165;7657:6;7654:1;7651:13;7643:165;;;7735:14;;7722:11;;;7715:35;7778:16;;;;7672:10;;7643:165;;;7647:3;;7837:6;7832:3;7828:16;7821:23;;7387:467;;;;;;;7870:30;7896:3;7888:6;7870:30;:::i;:::-;7863:37;6916:990;-1:-1:-1;;;;;6916:990:1:o;7911:448::-;8173:31;8168:3;8161:44;8143:3;8234:6;8228:13;8250:62;8305:6;8300:2;8295:3;8291:12;8284:4;8276:6;8272:17;8250:62;:::i;:::-;8332:16;;;;8350:2;8328:25;;8151:208;-1:-1:-1;;8151:208:1:o;8364:1510::-;-1:-1:-1;;;8864:61:1;;8948:13;;8846:3;;8970:62;8948:13;9020:2;9011:12;;9004:4;8992:17;;8970:62;:::i;:::-;9096:66;9091:2;9051:16;;;9083:11;;;9076:87;9192:34;9187:2;9179:11;;9172:55;9256:34;9251:2;9243:11;;9236:55;9321:34;9315:3;9307:12;;9300:56;9386:34;9380:3;9372:12;;9365:56;9451:34;9445:3;9437:12;;9430:56;9516:34;9510:3;9502:12;;9495:56;9581:66;9575:3;9567:12;;9560:88;9678:66;9672:3;9664:12;;9657:88;-1:-1:-1;;;9769:3:1;9761:12;;9754:28;9798:70;9828:39;9862:3;9854:12;;9846:6;9828:39;:::i;:::-;-1:-1:-1;;;4130:27:1;;4182:1;4173:11;;4120:70;10087:488;-1:-1:-1;;;;;10356:15:1;;;10338:34;;10408:15;;10403:2;10388:18;;10381:43;10455:2;10440:18;;10433:34;;;10503:3;10498:2;10483:18;;10476:31;;;10281:4;;10524:45;;10549:19;;10541:6;10524:45;:::i;:::-;10516:53;10290:285;-1:-1:-1;;;;;;10290:285:1:o;10772:219::-;10921:2;10910:9;10903:21;10884:4;10941:44;10981:2;10970:9;10966:18;10958:6;10941:44;:::i;11408:414::-;11610:2;11592:21;;;11649:2;11629:18;;;11622:30;11688:34;11683:2;11668:18;;11661:62;-1:-1:-1;;;11754:2:1;11739:18;;11732:48;11812:3;11797:19;;11582:240::o;16128:356::-;16330:2;16312:21;;;16349:18;;;16342:30;16408:34;16403:2;16388:18;;16381:62;16475:2;16460:18;;16302:182::o;18338:413::-;18540:2;18522:21;;;18579:2;18559:18;;;18552:30;18618:34;18613:2;18598:18;;18591:62;-1:-1:-1;;;18684:2:1;18669:18;;18662:47;18741:3;18726:19;;18512:239::o;19837:128::-;19877:3;19908:1;19904:6;19901:1;19898:13;19895:2;;;19914:18;;:::i;:::-;-1:-1:-1;19950:9:1;;19885:80::o;19970:120::-;20010:1;20036;20026:2;;20041:18;;:::i;:::-;-1:-1:-1;20075:9:1;;20016:74::o;20095:168::-;20135:7;20201:1;20197;20193:6;20189:14;20186:1;20183:21;20178:1;20171:9;20164:17;20160:45;20157:2;;;20208:18;;:::i;:::-;-1:-1:-1;20248:9:1;;20147:116::o;20268:125::-;20308:4;20336:1;20333;20330:8;20327:2;;;20341:18;;:::i;:::-;-1:-1:-1;20378:9:1;;20317:76::o;20398:258::-;20470:1;20480:113;20494:6;20491:1;20488:13;20480:113;;;20570:11;;;20564:18;20551:11;;;20544:39;20516:2;20509:10;20480:113;;;20611:6;20608:1;20605:13;20602:2;;;-1:-1:-1;;20646:1:1;20628:16;;20621:27;20451:205::o;20661:136::-;20700:3;20728:5;20718:2;;20737:18;;:::i;:::-;-1:-1:-1;;;20773:18:1;;20708:89::o;20802:380::-;20881:1;20877:12;;;;20924;;;20945:2;;20999:4;20991:6;20987:17;20977:27;;20945:2;21052;21044:6;21041:14;21021:18;21018:38;21015:2;;;21098:10;21093:3;21089:20;21086:1;21079:31;21133:4;21130:1;21123:15;21161:4;21158:1;21151:15;21015:2;;20857:325;;;:::o;21187:135::-;21226:3;-1:-1:-1;;21247:17:1;;21244:2;;;21267:18;;:::i;:::-;-1:-1:-1;21314:1:1;21303:13;;21234:88::o;21327:112::-;21359:1;21385;21375:2;;21390:18;;:::i;:::-;-1:-1:-1;21424:9:1;;21365:74::o;21444:127::-;21505:10;21500:3;21496:20;21493:1;21486:31;21536:4;21533:1;21526:15;21560:4;21557:1;21550:15;21576:127;21637:10;21632:3;21628:20;21625:1;21618:31;21668:4;21665:1;21658:15;21692:4;21689:1;21682:15;21708:127;21769:10;21764:3;21760:20;21757:1;21750:31;21800:4;21797:1;21790:15;21824:4;21821:1;21814:15;21840:127;21901:10;21896:3;21892:20;21889:1;21882:31;21932:4;21929:1;21922:15;21956:4;21953:1;21946:15;21972:127;22033:10;22028:3;22024:20;22021:1;22014:31;22064:4;22061:1;22054:15;22088:4;22085:1;22078:15;22104:131;-1:-1:-1;;;;;;22178:32:1;;22168:43;;22158:2;;22225:1;22222;22215:12

Swarm Source

ipfs://6e998b32937e96207c0431f6a3e6f1c5b812f866d8107dac681f544743bc7e08
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.