ETH Price: $3,917.80 (+0.84%)

Squid Game Card (SquidGameCard)
 

Overview

TokenID

225

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
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:
SquidGameCard

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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






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

/**
 * @title Squid Game Card NFT 
 * @dev forked from https://etherscan.io/address/0xff9c1b15b16263c61d017ee9f65c50e4ae0113d7#code
 * Added automated irregular tokenId pick
 * Holds for 6 hours after minting every 456th claim
 */

contract SquidGameCard is ERC721Enumerable, ReentrancyGuard, Ownable {

    uint8 private constant _PICKSIZE = 10;
    uint16 private constant _MAX_CLAIMS = 456 * 20;
    uint16 private constant _MAX_OWNER_CLAIMS = 456;
    uint16 private constant _TIMELOCK_COUNT = 456;
    uint private constant _TIMELOCK_DURATION = 6 hours;
    uint public constant _MINT_START_TIME = 1633823999; // October 9, 2021 11:59:59 PM GMT for celebrating the Hangul Day!
    uint private _totalClaims;    
    uint public claimTimeLock; 

    mapping(uint => uint) public _lastClaims; //pick index => last tokenId
    mapping(uint => uint) public _seeds;  //tokenId => seed

    string[15] private simpleConsonants = [
        "&#12593;", //0 ㄱ 
        "&#12596;", //1 ㄴ 
        "&#12599;", //2 ㄷ 
        "&#12601;", //3 ㄹ
        "&#12609;", //4 ㅁ
        "&#12610;", //5 ㅂ
        "&#12613;", //6 ㅅ
        "&#12615;", //7 o 
        "&#12616;", //8 ㅈ
        "&#12618;", //9 ㅊ
        "&#12619;", //10 ㅋ        
        "&#12620;", //11 ㅌ
        "&#12621;", //12 ㅍ
        "&#12622;", //13 ㅎ
        "&#12671;"  //14 triangle
    ];
    
    uint8[7] private baseGenes = [0, 1, 2, 3, 4, 5, 6];
    

    function genSeed(uint _tokenId) private pure returns (uint) {
        return uint256(keccak256(abi.encodePacked(_tokenId)));
    } 
    
    function getSeed(uint _tokenId) public view returns (uint) {
        return _seeds[_tokenId];
    }
    
    function getRand(uint _seed, uint _prefix) private pure returns (uint) {
        return uint256(keccak256(abi.encodePacked(_seed, _prefix)));
    }
    
    function mintPickSize() private onlyOwner {
        for (uint8 i=1; i <= _PICKSIZE; i++) {
            if (i == _PICKSIZE) {
                _lastClaims[0] = _PICKSIZE;
            } else {
                _lastClaims[i] = i;    
            }
            _seeds[i] = genSeed(i);
            require(safeMint(owner(), i), 'Minting failed');
        }
        _totalClaims = _PICKSIZE;
    }

    function pickTokenId() private returns (uint) {
        require(_totalClaims < _MAX_CLAIMS, 'All regular tokens already minted');
        uint tokenId;
        uint pickIndex = uint256(keccak256(abi.encodePacked(totalSupply(), blockhash(block.number-1)))) % _PICKSIZE;
        tokenId = _lastClaims[pickIndex] + _PICKSIZE;
        if (tokenId > _MAX_CLAIMS) {
            while (tokenId > _MAX_CLAIMS) {
                pickIndex = (pickIndex + 1) % _PICKSIZE;
                tokenId = _lastClaims[pickIndex] + _PICKSIZE;
            }
        }
        _lastClaims[pickIndex] += _PICKSIZE;        
        _totalClaims += 1;
        return tokenId;
    }

    function getGenes(uint256 _tokenId) public view returns (uint8[8] memory) {

        uint8[8] memory genes;
        uint seed = getSeed(_tokenId);
        if (seed == 0) {
            return [0,0,0,0,0,0,0,0];
        }
        uint number = getRand(seed, 20211009);

        for (uint8 i=0; i<8; i++) {
            uint8 output = uint8(number % 8);
            uint greatness = getRand(number, i) % 21;
            if (greatness > 16) {
                output += 1;
            } 
            if (greatness > 17) {
                output += 1;
            }
            if (greatness > 18) {
                output += 1;
            }
            if (output > 9) {
                output = 9;
            }            
            genes[i] = output;
            number = number / 10;
        }        
        return genes;
    }

    function getConsonants(uint256 _tokenId) public view returns (string[3] memory) {
    
        uint8[3] memory idx = getConsonantsIndex(_tokenId);
        string[3] memory consArray;
        consArray[0] = simpleConsonants[idx[0]];
        consArray[1] = simpleConsonants[idx[1]];
        consArray[2] = simpleConsonants[idx[2]];
        return consArray;
    }

    function getConsonantsIndex(uint256 _tokenId) public view returns (uint8[3] memory) {
        
        uint8[3] memory consArray;
        uint seed = getSeed(_tokenId);
        require(seed != 0);
        uint q = getRand(seed, 3) % 4;
        if (_tokenId <= _PICKSIZE || q == 0) {
            consArray[0] = 7;
            consArray[1] = 14;
            consArray[2] = 4; 
        } else {
            consArray[0] = uint8(getRand(seed, 11) % simpleConsonants.length);
            consArray[1] = uint8(getRand(seed, 12) % simpleConsonants.length);
            consArray[2] = uint8(getRand(seed, 13) % simpleConsonants.length);
        }
        return consArray;
    }

    function tokenURI(uint256 _tokenId) override public view returns (string memory) {
        
        string[9] memory parts;
        string[27] memory attrParts;
        string memory ojingeo;
        string memory sameConsonants;
        uint8[8] memory geneArray = getGenes(_tokenId);
        string[3] memory consArray = getConsonants(_tokenId);
        uint8[3] memory consIndex = getConsonantsIndex(_tokenId);        
        if (consIndex[0] == 7 && consIndex[1] == 14 && consIndex[2] == 4) {
            ojingeo = 'Y';
        } else {
            ojingeo = 'N';
        }
        if (consIndex[0] == consIndex[1] && consIndex[0] == consIndex[2]) {
            sameConsonants = 'Y';
        } else {
            sameConsonants = 'N';
        }

        parts[0] = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 220">';
        parts[1] = '<style>.base {font-family: Verdana; fill: black;}</style>';
        parts[2] = '<rect width="100%" height="100%" fill="#CF9857" />';
        parts[3] = '<text x="50%" y="100" dominant-baseline="middle" text-anchor="middle" class="base" style="font-size:700%; letter-spacing: -0.2em;">';
        parts[4] = string(abi.encodePacked(consArray[0], ' ', consArray[1], ' ', consArray[2]));
        parts[5] = '</text><text x="50%" y="180" dominant-baseline="middle" text-anchor="middle" class="base" style="font-size:150%;">&#937; ';
        parts[6] = string(abi.encodePacked(toString(geneArray[0]), toString(geneArray[1]), toString(geneArray[2]), toString(geneArray[3]), ' '));
        parts[7] = string(abi.encodePacked(toString(geneArray[4]), toString(geneArray[5]), toString(geneArray[6]), toString(geneArray[7]) ));
        parts[8] ='</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]));

        attrParts[0] = '[{"trait_type": "Left Consonant", "value": "';
        attrParts[1] = consArray[0];
        attrParts[2] = '"}, {"trait_type": "Center Consonant", "value": "';
        attrParts[3] = consArray[1];
        attrParts[4] = '"}, {"trait_type": "Right Consonant", "value": "';        
        attrParts[5] = consArray[2];
        attrParts[6] = '"}, {"trait_type": "Gene0", "value": "';
        attrParts[7] = toString(geneArray[0]);
        attrParts[8] = '"}, {"trait_type": "Gene1", "value": "';
        attrParts[9] = toString(geneArray[1]);
        attrParts[10] = '"}, {"trait_type": "Gene2", "value": "';        
        attrParts[11] = toString(geneArray[2]);
        attrParts[12] = '"}, {"trait_type": "Gene3", "value": "';        
        attrParts[13] = toString(geneArray[3]);
        attrParts[14] = '"}, {"trait_type": "Gene4", "value": "';        
        attrParts[15] = toString(geneArray[4]);
        attrParts[16] = '"}, {"trait_type": "Gene5", "value": "';        
        attrParts[17] = toString(geneArray[5]);
        attrParts[18] = '"}, {"trait_type": "Gene6", "value": "';        
        attrParts[19] = toString(geneArray[6]);
        attrParts[20] = '"}, {"trait_type": "Gene7", "value": "';        
        attrParts[21] = toString(geneArray[7]);
        attrParts[22] = '"}, {"trait_type": "Ojingeo", "value": "';        
        attrParts[23] = ojingeo;
        attrParts[24] = '"}, {"trait_type": "Same Consonants", "value": "';        
        attrParts[25] = sameConsonants;
        attrParts[26] = '"}]';
        
        string memory attrs = string(abi.encodePacked(attrParts[0], attrParts[1], attrParts[2], attrParts[3], attrParts[4], attrParts[5], attrParts[6], attrParts[7]));
        attrs = string(abi.encodePacked(attrs, attrParts[8], attrParts[9], attrParts[10], attrParts[11], attrParts[12], attrParts[13], attrParts[14]));        
        attrs = string(abi.encodePacked(attrs, attrParts[15], attrParts[16], attrParts[17], attrParts[18], attrParts[19], attrParts[20]));        
        attrs = string(abi.encodePacked(attrs, attrParts[21], attrParts[22], attrParts[23], attrParts[24], attrParts[25], attrParts[26]));        

        string memory json = Base64.encode(bytes(string(abi.encodePacked('{"name": "Squid Game Card NFT #', toString(_tokenId), '", "attributes": ', attrs ,', "description": "The squid game cards are invitation to enter the adventurous and mysterious metaverse games. Genes characteristics and other functionality are intentionally omitted for unlimited imagination and community-driven game development. Start your journey now!", "image": "data:image/svg+xml;base64,', Base64.encode(bytes(output)), '"}'))));
        output = string(abi.encodePacked('data:application/json;base64,', json));
        return output;
    }

    function safeMint(address _to, uint _amount) private returns (bool) {
        _safeMint(_to, _amount);
        return true;
    }

    function claim() external nonReentrant {
        require(_totalClaims < _MAX_CLAIMS, 'Regular claims are over');
        require(claimTimeLock < block.timestamp, 'Wait until the claimTimeLock passes');
        uint tokenId = pickTokenId();
        _seeds[tokenId] = genSeed(tokenId);
        require(safeMint(_msgSender(), tokenId), 'Minting failed');
        checkClaimLock();
    }
    
    function ownerClaim(uint256 _tokenId) external nonReentrant onlyOwner {
        require(_tokenId > _MAX_CLAIMS && _tokenId <= _MAX_CLAIMS + _MAX_OWNER_CLAIMS, "Token ID invalid");
        require(claimTimeLock < block.timestamp, 'Wait until the claimTimeLock passes');
        _seeds[_tokenId] = genSeed(_tokenId);
        require(safeMint(owner(), _tokenId), 'Minting failed');
        checkClaimLock();
    }
    
    function checkClaimLock() internal {
        if (totalSupply() % _TIMELOCK_COUNT == 0) {
            claimTimeLock = block.timestamp + _TIMELOCK_DURATION;
        } 
    }
    
    function isMintable() external view returns (bool) {
        if (_totalClaims >= _MAX_CLAIMS) return false;
        if (claimTimeLock >= block.timestamp) return false;
        return true;
    }
    
    function getMaxSupply() external pure returns (uint) {
        return _MAX_CLAIMS + _MAX_OWNER_CLAIMS;
    }    

    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);
    }
    
    constructor() ERC721("Squid Game Card", "SquidGameCard") Ownable() {
        mintPickSize();
        claimTimeLock = _MINT_START_TIME;
    }
}
/// [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":[],"name":"_MINT_START_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_lastClaims","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_seeds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimTimeLock","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":"getConsonants","outputs":[{"internalType":"string[3]","name":"","type":"string[3]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getConsonantsIndex","outputs":[{"internalType":"uint8[3]","name":"","type":"uint8[3]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getGenes","outputs":[{"internalType":"uint8[8]","name":"","type":"uint8[8]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getSeed","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":"isMintable","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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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"}]

600861026081815267262331323539333b60c01b6102805260809081526102a082815267262331323539363b60c01b6102c05260a0526102e082815267262331323539393b60c01b6103005260c05261032082815267262331323630313b60c01b6103405260e05261036082815267262331323630393b60c01b61038052610100526103a082815267262331323631303b60c01b6103c052610120526103e082815267262331323631333b60c01b610400526101405261042082815267262331323631353b60c01b610440526101605261046082815267262331323631363b60c01b61048052610180526104a082815267262331323631383b60c01b6104c0526101a0526104e082815267262331323631393b60c01b610500526101c05261052082815267262331323632303b60c01b610540526101e05261056082815267262331323632313b60c01b61058052610200526105a082815267262331323632323b60c01b6105c052610220526106206040526105e091825267262331323637313b60c01b61060052610240919091526200019e90601090600f62000b13565b506040805160e08101825260008152600160208201526002918101919091526003606082015260046080820152600560a0820152600660c0820152620001e990601f90600762000b6a565b50348015620001f757600080fd5b50604080518082018252600f81526e14dc5d5a590811d85b594810d85c99608a1b60208083019182528351808501909452600d84526c14dc5d5a5911d85b5950d85c99609a1b908401528151919291620002549160009162000c00565b5080516200026a90600190602084019062000c00565b50506001600a55506200027d3362000295565b62000287620002e7565b6361622cff600d5562000e7c565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600b546001600160a01b03163314620003475760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b60015b600a60ff821611620004405760ff8116600a1415620003965760008052600e602052600a7fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881c55620003aa565b60ff81166000818152600e60205260409020555b620003b860ff821662000448565b60ff82166000908152600f6020526040902055620003ec620003e2600b546001600160a01b031690565b60ff83166200047c565b6200042b5760405162461bcd60e51b815260206004820152600e60248201526d135a5b9d1a5b99c819985a5b195960921b60448201526064016200033e565b80620004378162000d0d565b9150506200034a565b50600a600c55565b6000816040516020016200045e91815260200190565b60408051601f19818403018152919052805160209091012092915050565b60006200048a838362000493565b50600192915050565b620004b5828260405180602001604052806000815250620004b960201b60201c565b5050565b620004c5838362000531565b620004d4600084848462000687565b6200052c5760405162461bcd60e51b81526020600482015260326024820152600080516020620046ab83398151915260448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016200033e565b505050565b6001600160a01b038216620005895760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016200033e565b6000818152600260205260409020546001600160a01b031615620005f05760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016200033e565b620005fe60008383620007f0565b6001600160a01b03821660009081526003602052604081208054600192906200062990849062000d30565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000620006a8846001600160a01b0316620008cc60201b62001a001760201c565b15620007e457604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290620006e290339089908890889060040162000d4b565b602060405180830381600087803b158015620006fd57600080fd5b505af192505050801562000730575060408051601f3d908101601f191682019092526200072d9181019062000dc6565b60015b620007c9573d80801562000761576040519150601f19603f3d011682016040523d82523d6000602084013e62000766565b606091505b508051620007c15760405162461bcd60e51b81526020600482015260326024820152600080516020620046ab83398151915260448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084016200033e565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050620007e8565b5060015b949350505050565b620008088383836200052c60201b620006ff1760201c565b6001600160a01b03831662000866576200086081600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6200088c565b816001600160a01b0316836001600160a01b0316146200088c576200088c8382620008d2565b6001600160a01b038216620008a6576200052c816200097f565b826001600160a01b0316826001600160a01b0316146200052c576200052c828262000a39565b3b151590565b60006001620008ec8462000a8a60201b62000bb21760201c565b620008f8919062000df9565b6000838152600760205260409020549091508082146200094c576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090620009939060019062000df9565b60008381526009602052604081205460088054939450909284908110620009be57620009be62000e13565b906000526020600020015490508060088381548110620009e257620009e262000e13565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548062000a1d5762000a1d62000e29565b6001900381819060005260206000200160009055905550505050565b600062000a518362000a8a60201b62000bb21760201c565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60006001600160a01b03821662000af75760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016200033e565b506001600160a01b031660009081526003602052604090205490565b82600f810192821562000b58579160200282015b8281111562000b58578251805162000b4791849160209091019062000c00565b509160200191906001019062000b27565b5062000b6692915062000c7d565b5090565b60018301918390821562000bf25791602002820160005b8382111562000bc157835183826101000a81548160ff021916908360ff160217905550926020019260010160208160000104928301926001030262000b81565b801562000bf05782816101000a81549060ff021916905560010160208160000104928301926001030262000bc1565b505b5062000b6692915062000c9e565b82805462000c0e9062000e3f565b90600052602060002090601f01602090048101928262000c32576000855562000bf2565b82601f1062000c4d57805160ff191683800117855562000bf2565b8280016001018555821562000bf2579182015b8281111562000bf257825182559160200191906001019062000c60565b8082111562000b6657600062000c94828262000cb5565b5060010162000c7d565b5b8082111562000b66576000815560010162000c9f565b50805462000cc39062000e3f565b6000825580601f1062000cd4575050565b601f01602090049060005260206000209081019062000cf4919062000c9e565b50565b634e487b7160e01b600052601160045260246000fd5b600060ff821660ff81141562000d275762000d2762000cf7565b60010192915050565b6000821982111562000d465762000d4662000cf7565b500190565b600060018060a01b038087168352602081871681850152856040850152608060608501528451915081608085015260005b8281101562000d9a5785810182015185820160a00152810162000d7c565b8281111562000dad57600060a084870101525b5050601f01601f19169190910160a00195945050505050565b60006020828403121562000dd957600080fd5b81516001600160e01b03198116811462000df257600080fd5b9392505050565b60008282101562000e0e5762000e0e62000cf7565b500390565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b600181811c9082168062000e5457607f821691505b6020821081141562000e7657634e487b7160e01b600052602260045260246000fd5b50919050565b61381f8062000e8c6000396000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c80634f6ccce71161010f578063a2e4b12e116100a2578063cb8af74511610071578063cb8af74514610408578063e0d4ea3714610428578063e985e9c514610448578063f2fde38b1461048457600080fd5b8063a2e4b12e146103a2578063b88d4fde146103c2578063ba89696d146103d5578063c87b56dd146103f557600080fd5b8063887f2be4116100de578063887f2be41461036d5780638da5cb5b1461037657806395d89b4114610387578063a22cb4651461038f57600080fd5b80634f6ccce71461032c5780636352211e1461033f57806370a0823114610352578063715018a61461036557600080fd5b806323b872dd11610187578063434f48c411610156578063434f48c41461030157806346b45af7146103145780634c0f38c21461031c5780634e71d92d1461032457600080fd5b806323b872dd146102a85780632f745c59146102bb5780633669edd5146102ce57806342842e0e146102ee57600080fd5b8063081812fc116101c3578063081812fc14610255578063095ea7b3146102805780631496e3f41461029557806318160ddd146102a057600080fd5b806301ffc9a7146101ea578063035f0c871461021257806306fdde0314610240575b600080fd5b6101fd6101f8366004612802565b610497565b60405190151581526020015b60405180910390f35b610232610220366004612826565b600f6020526000908152604090205481565b604051908152602001610209565b6102486104c2565b6040516102099190612897565b610268610263366004612826565b610554565b6040516001600160a01b039091168152602001610209565b61029361028e3660046128c6565b6105ee565b005b6102326361622cff81565b600854610232565b6102936102b63660046128f0565b610704565b6102326102c93660046128c6565b610735565b6102326102dc366004612826565b600e6020526000908152604090205481565b6102936102fc3660046128f0565b6107cb565b61029361030f366004612826565b6107e6565b6101fd61096a565b610232610996565b6102936109af565b61023261033a366004612826565b610aa8565b61026861034d366004612826565b610b3b565b61023261036036600461292c565b610bb2565b610293610c39565b610232600d5481565b600b546001600160a01b0316610268565b610248610c6f565b61029361039d366004612947565b610c7e565b6103b56103b0366004612826565b610d43565b6040516102099190612983565b6102936103d03660046129ce565b610ea2565b6103e86103e3366004612826565b610eda565b6040516102099190612aaa565b610248610403366004612826565b611134565b61041b610416366004612826565b611893565b6040516102099190612af7565b610232610436366004612826565b6000908152600f602052604090205490565b6101fd610456366004612b22565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61029361049236600461292c565b611965565b60006001600160e01b0319821663780e9d6360e01b14806104bc57506104bc82611a06565b92915050565b6060600080546104d190612b55565b80601f01602080910402602001604051908101604052809291908181526020018280546104fd90612b55565b801561054a5780601f1061051f5761010080835404028352916020019161054a565b820191906000526020600020905b81548152906001019060200180831161052d57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166105d25760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006105f982610b3b565b9050806001600160a01b0316836001600160a01b031614156106675760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016105c9565b336001600160a01b038216148061068357506106838133610456565b6106f55760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016105c9565b6106ff8383611a56565b505050565b61070e3382611ac4565b61072a5760405162461bcd60e51b81526004016105c990612b90565b6106ff838383611bbb565b600061074083610bb2565b82106107a25760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016105c9565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6106ff83838360405180602001604052806000815250610ea2565b6002600a5414156108395760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016105c9565b6002600a55600b546001600160a01b031633146108685760405162461bcd60e51b81526004016105c990612be1565b6123a08111801561088a57506108826101c86123a0612c2c565b61ffff168111155b6108c95760405162461bcd60e51b815260206004820152601060248201526f151bdad95b881251081a5b9d985b1a5960821b60448201526064016105c9565b42600d54106108ea5760405162461bcd60e51b81526004016105c990612c52565b6108f381611d66565b6000828152600f602052604090205561091d610917600b546001600160a01b031690565b82611d99565b61095a5760405162461bcd60e51b815260206004820152600e60248201526d135a5b9d1a5b99c819985a5b195960921b60448201526064016105c9565b610962611dae565b506001600a55565b60006123a061ffff16600c54106109815750600090565b42600d54106109905750600090565b50600190565b60006109a66101c86123a0612c2c565b61ffff16905090565b6002600a541415610a025760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016105c9565b6002600a55600c546123a011610a5a5760405162461bcd60e51b815260206004820152601760248201527f526567756c617220636c61696d7320617265206f76657200000000000000000060448201526064016105c9565b42600d5410610a7b5760405162461bcd60e51b81526004016105c990612c52565b6000610a85611dd9565b9050610a9081611d66565b6000828152600f602052604090205561091d33610917565b6000610ab360085490565b8210610b165760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016105c9565b60088281548110610b2957610b29612c95565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806104bc5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016105c9565b60006001600160a01b038216610c1d5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016105c9565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b03163314610c635760405162461bcd60e51b81526004016105c990612be1565b610c6d6000611f49565b565b6060600180546104d190612b55565b6001600160a01b038216331415610cd75760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016105c9565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610d4b612752565b610d53612752565b6000838152600f602052604090205480610db05750506040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915292915050565b6000610dc0826301346541611f9b565b905060005b60088160ff161015610e98576000610dde600884612cc1565b905060006015610df1858560ff16611f9b565b610dfb9190612cc1565b90506010811115610e1457610e11600183612cd5565b91505b6011811115610e2b57610e28600183612cd5565b91505b6012811115610e4257610e3f600183612cd5565b91505b60098260ff161115610e5357600991505b81868460ff1660088110610e6957610e69612c95565b60ff9092166020929092020152610e81600a85612cfa565b935050508080610e9090612d0e565b915050610dc5565b5091949350505050565b610eac3383611ac4565b610ec85760405162461bcd60e51b81526004016105c990612b90565b610ed484848484611fc7565b50505050565b610ee2612771565b6000610eed83611893565b9050610ef7612771565b815160109060ff16600f8110610f0f57610f0f612c95565b018054610f1b90612b55565b80601f0160208091040260200160405190810160405280929190818152602001828054610f4790612b55565b8015610f945780601f10610f6957610100808354040283529160200191610f94565b820191906000526020600020905b815481529060010190602001808311610f7757829003601f168201915b505050505081600060038110610fac57610fac612c95565b60200201526010826001602002015160ff16600f8110610fce57610fce612c95565b018054610fda90612b55565b80601f016020809104026020016040519081016040528092919081815260200182805461100690612b55565b80156110535780601f1061102857610100808354040283529160200191611053565b820191906000526020600020905b81548152906001019060200180831161103657829003601f168201915b50505050508160016003811061106b5761106b612c95565b6020020152604082015160109060ff16600f811061108b5761108b612c95565b01805461109790612b55565b80601f01602080910402602001604051908101604052809291908181526020018280546110c390612b55565b80156111105780601f106110e557610100808354040283529160200191611110565b820191906000526020600020905b8154815290600101906020018083116110f357829003601f168201915b50505050508160026003811061112857611128612c95565b60200201529392505050565b606061113e612798565b6111466127b3565b606080600061115487610d43565b9050600061116188610eda565b9050600061116e89611893565b805190915060ff16600714801561118f5750806001602002015160ff16600e145b80156111a55750806002602002015160ff166004145b156111cb57604051806040016040528060018152602001605960f81b81525094506111e8565b604051806040016040528060018152602001602760f91b81525094505b6020810151815160ff908116911614801561120e57506040810151815160ff9081169116145b1561123457604051806040016040528060018152602001605960f81b8152509350611251565b604051806040016040528060018152602001602760f91b81525093505b6040518060a00160405280606281526020016137886062913987526040805160608101909152603980825261365d6020830139876001602002018190525060405180606001604052806032815260200161375660329139604080890191909152805160c0810190915260838082526135da60208301396060880152815160208381015160408086015190516112e7949301612d4a565b60408051808303601f190181529181526080890191909152805160a0810190915260798082526134ef602083013960a088015261132e8360005b602002015160ff16611ffa565b611339846001611321565b611344856002611321565b61134f866003611321565b6040516020016113629493929190612da4565b60408051808303601f1901815291905260c0880152611382836004611321565b61138d846005611321565b611398856006611321565b6113a3866007611321565b6040516020016113b69493929190612e07565b60408051808303601f1901815291815260e08901919091528051808201909152600d81526c1e17ba32bc3a1f1e17b9bb339f60991b60208201528760086020020152600087816020020151886001602002015189600260200201518a600360200201518b600460200201518c600560200201518d600660200201518e600760200201518f6008602002015160405160200161145999989796959493929190612e5e565b60408051601f1981840301815260608301909152602c8083529092506134836020830139875282516020808901919091526040805160608101909152603180825290916134529083013987600260200201528260016020020151876003602002018190525060405180606001604052806030815260200161342260309139608088015260408084015160a0890152805160608101909152602680825261358e602083013960c088015261150d846000611321565b60e0880152604080516060810190915260268082526136be602083013961010088015261153b846001611321565b61012088015260408051606081019091526026808252613568602083013961014088015261156a846002611321565b610160880152604080516060810190915260268082526135b46020830139610180880152611599846003611321565b6101a08801526040805160608101909152602680825261370a60208301396101c08801526115c8846004611321565b6101e0880152604080516060810190915260268082526133fc60208301396102008801526115f7846005611321565b610220880152604080516060810190915260268082526137306020830139610240880152611626846006611321565b610260880152604080516060810190915260268082526136e46020830139610280880152611655846007611321565b6102a08801526040805160608101909152602880825261369660208301396102c08801526102e08701869052604080516060810190915260308082526133cc60208301396103008801526103208701859052604080518082019091526003815262227d5d60e81b602082015287601a6020020152600087816020020151886001602002015189600260200201518a600360200201518b600460200201518c600560200201518d600660200201518e60076020020151604051602001611721989796959493929190612f1f565b60408051601f19818403018152919052905080886008602002015189600960200201518a600a60200201518b600b60200201518c600c60200201518d600d60200201518e600e6020020151604051602001611783989796959493929190612f1f565b60408051808303601f19018152908290526101e08a01516102008b01516102208c01516102408d01516102608e01516102808f01519597506117ca96889690602001612fc4565b60408051808303601f19018152908290526102a08a01516102c08b01516102e08c01516103008d01516103208e01516103408f015195975061181196889690602001612fc4565b604051602081830303815290604052905060006118606118308d611ffa565b8361183a866120f8565b60405160200161184c93929190613056565b6040516020818303038152906040526120f8565b9050806040516020016118739190613265565b60408051601f198184030181529190529c9b505050505050505050505050565b61189b6127ce565b6118a36127ce565b6000838152600f6020526040902054806118bc57600080fd5b600060046118cb836003611f9b565b6118d59190612cc1565b9050600a851115806118e5575080155b156119015760078352600e60208401526004604084015261195c565b600f61190e83600b611f9b565b6119189190612cc1565b60ff168352600f61192a83600c611f9b565b6119349190612cc1565b60ff166020840152600f61194983600d611f9b565b6119539190612cc1565b60ff1660408401525b50909392505050565b600b546001600160a01b0316331461198f5760405162461bcd60e51b81526004016105c990612be1565b6001600160a01b0381166119f45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105c9565b6119fd81611f49565b50565b3b151590565b60006001600160e01b031982166380ac58cd60e01b1480611a3757506001600160e01b03198216635b5e139f60e01b145b806104bc57506301ffc9a760e01b6001600160e01b03198316146104bc565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611a8b82610b3b565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611b3d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016105c9565b6000611b4883610b3b565b9050806001600160a01b0316846001600160a01b03161480611b835750836001600160a01b0316611b7884610554565b6001600160a01b0316145b80611bb357506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611bce82610b3b565b6001600160a01b031614611c365760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016105c9565b6001600160a01b038216611c985760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016105c9565b611ca383838361225e565b611cae600082611a56565b6001600160a01b0383166000908152600360205260408120805460019290611cd79084906132aa565b90915550506001600160a01b0382166000908152600360205260408120805460019290611d059084906132c1565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600081604051602001611d7b91815260200190565b60408051601f19818403018152919052805160209091012092915050565b6000611da58383612316565b50600192915050565b6101c8611dba60085490565b611dc49190612cc1565b610c6d57611dd4615460426132c1565b600d55565b60006123a061ffff16600c5410611e3c5760405162461bcd60e51b815260206004820152602160248201527f416c6c20726567756c617220746f6b656e7320616c7265616479206d696e74656044820152601960fa1b60648201526084016105c9565b600080600a611e4a60085490565b611e556001436132aa565b40604051602001611e70929190918252602082015260400190565b6040516020818303038152906040528051906020012060001c611e939190612cc1565b6000818152600e6020526040902054909150611eb190600a906132c1565b91506123a0821115611f04575b6123a0821115611f0457600a611ed58260016132c1565b611edf9190612cc1565b6000818152600e6020526040902054909150611efd90600a906132c1565b9150611ebe565b6000818152600e602052604081208054600a9290611f239084906132c1565b925050819055506001600c6000828254611f3d91906132c1565b90915550919392505050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b611fd2848484611bbb565b611fde84848484612334565b610ed45760405162461bcd60e51b81526004016105c9906132d9565b60608161201e5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561204857806120328161332b565b91506120419050600a83612cfa565b9150612022565b60008167ffffffffffffffff811115612063576120636129b8565b6040519080825280601f01601f19166020018201604052801561208d576020820181803683370190505b5090505b8415611bb3576120a26001836132aa565b91506120af600a86612cc1565b6120ba9060306132c1565b60f81b8183815181106120cf576120cf612c95565b60200101906001600160f81b031916908160001a9053506120f1600a86612cfa565b9450612091565b805160609080612118575050604080516020810190915260008152919050565b600060036121278360026132c1565b6121319190612cfa565b61213c906004613346565b9050600061214b8260206132c1565b67ffffffffffffffff811115612163576121636129b8565b6040519080825280601f01601f19166020018201604052801561218d576020820181803683370190505b50905060006040518060600160405280604081526020016134af604091399050600181016020830160005b86811015612219576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b8352600490920191016121b8565b506003860660018114612233576002811461224457612250565b613d3d60f01b600119830152612250565b603d60f81b6000198301525b505050918152949350505050565b6001600160a01b0383166122b9576122b481600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6122dc565b816001600160a01b0316836001600160a01b0316146122dc576122dc8382612441565b6001600160a01b0382166122f3576106ff816124de565b826001600160a01b0316826001600160a01b0316146106ff576106ff828261258d565b6123308282604051806020016040528060008152506125d1565b5050565b60006001600160a01b0384163b1561243657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612378903390899088908890600401613365565b602060405180830381600087803b15801561239257600080fd5b505af19250505080156123c2575060408051601f3d908101601f191682019092526123bf91810190613398565b60015b61241c573d8080156123f0576040519150601f19603f3d011682016040523d82523d6000602084013e6123f5565b606091505b5080516124145760405162461bcd60e51b81526004016105c9906132d9565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611bb3565b506001949350505050565b6000600161244e84610bb2565b61245891906132aa565b6000838152600760205260409020549091508082146124ab576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906124f0906001906132aa565b6000838152600960205260408120546008805493945090928490811061251857612518612c95565b90600052602060002001549050806008838154811061253957612539612c95565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612571576125716133b5565b6001900381819060005260206000200160009055905550505050565b600061259883610bb2565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6125db8383612604565b6125e86000848484612334565b6106ff5760405162461bcd60e51b81526004016105c9906132d9565b6001600160a01b03821661265a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016105c9565b6000818152600260205260409020546001600160a01b0316156126bf5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016105c9565b6126cb6000838361225e565b6001600160a01b03821660009081526003602052604081208054600192906126f49084906132c1565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6040518061010001604052806008906020820280368337509192915050565b60405180606001604052806003905b60608152602001906001900390816127805790505090565b60408051610120810190915260608152600860208201612780565b60408051610360810190915260608152601a60208201612780565b60405180606001604052806003906020820280368337509192915050565b6001600160e01b0319811681146119fd57600080fd5b60006020828403121561281457600080fd5b813561281f816127ec565b9392505050565b60006020828403121561283857600080fd5b5035919050565b60005b8381101561285a578181015183820152602001612842565b83811115610ed45750506000910152565b6000815180845261288381602086016020860161283f565b601f01601f19169290920160200192915050565b60208152600061281f602083018461286b565b80356001600160a01b03811681146128c157600080fd5b919050565b600080604083850312156128d957600080fd5b6128e2836128aa565b946020939093013593505050565b60008060006060848603121561290557600080fd5b61290e846128aa565b925061291c602085016128aa565b9150604084013590509250925092565b60006020828403121561293e57600080fd5b61281f826128aa565b6000806040838503121561295a57600080fd5b612963836128aa565b91506020830135801515811461297857600080fd5b809150509250929050565b6101008101818360005b60088110156129af57815160ff1683526020928301929091019060010161298d565b50505092915050565b634e487b7160e01b600052604160045260246000fd5b600080600080608085870312156129e457600080fd5b6129ed856128aa565b93506129fb602086016128aa565b925060408501359150606085013567ffffffffffffffff80821115612a1f57600080fd5b818701915087601f830112612a3357600080fd5b813581811115612a4557612a456129b8565b604051601f8201601f19908116603f01168101908382118183101715612a6d57612a6d6129b8565b816040528281528a6020848701011115612a8657600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60208082526000906080830183820185845b6003811015612aeb57601f19878503018352612ad984835161286b565b93509184019190840190600101612abc565b50919695505050505050565b60608101818360005b60038110156129af57815160ff16835260209283019290910190600101612b00565b60008060408385031215612b3557600080fd5b612b3e836128aa565b9150612b4c602084016128aa565b90509250929050565b600181811c90821680612b6957607f821691505b60208210811415612b8a57634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600061ffff808316818516808303821115612c4957612c49612c16565b01949350505050565b60208082526023908201527f5761697420756e74696c2074686520636c61696d54696d654c6f636b2070617360408201526273657360e81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b600082612cd057612cd0612cab565b500690565b600060ff821660ff84168060ff03821115612cf257612cf2612c16565b019392505050565b600082612d0957612d09612cab565b500490565b600060ff821660ff811415612d2557612d25612c16565b60010192915050565b60008151612d4081856020860161283f565b9290920192915050565b60008451612d5c81846020890161283f565b8083019050600160fd1b8082528551612d7c816001850160208a0161283f565b60019201918201528351612d9781600284016020880161283f565b0160020195945050505050565b60008551612db6818460208a0161283f565b855190830190612dca818360208a0161283f565b8551910190612ddd81836020890161283f565b8451910190612df081836020880161283f565b600160fd1b91019081526001019695505050505050565b60008551612e19818460208a0161283f565b855190830190612e2d818360208a0161283f565b8551910190612e4081836020890161283f565b8451910190612e5381836020880161283f565b019695505050505050565b60008a51612e70818460208f0161283f565b8a51612e828183860160208f0161283f565b8a519184010190612e97818360208e0161283f565b8951612ea98183850160208e0161283f565b8951929091010190612ebf818360208c0161283f565b8751612ed18183850160208c0161283f565b8751929091010190612ee7818360208a0161283f565b8551612ef98183850160208a0161283f565b8551929091010190612f0f81836020880161283f565b019b9a5050505050505050505050565b600089516020612f328285838f0161283f565b8a5191840191612f458184848f0161283f565b8a51920191612f578184848e0161283f565b8951920191612f698184848d0161283f565b8851920191612f7b8184848c0161283f565b8751920191612f8d8184848b0161283f565b8651920191612f9f8184848a0161283f565b8551920191612fb1818484890161283f565b919091019b9a5050505050505050505050565b600088516020612fd78285838e0161283f565b895191840191612fea8184848e0161283f565b8951920191612ffc8184848d0161283f565b885192019161300e8184848c0161283f565b87519201916130208184848b0161283f565b86519201916130328184848a0161283f565b8551920191613044818484890161283f565b919091019a9950505050505050505050565b7f7b226e616d65223a202253717569642047616d652043617264204e465420230081526000845161308e81601f85016020890161283f565b7001116101130ba3a3934b13aba32b9911d1607d1b601f9184019182015284516130bf81603084016020890161283f565b7f2c20226465736372697074696f6e223a20225468652073717569642067616d65603092909101918201527f2063617264732061726520696e7669746174696f6e20746f20656e746572207460508201527f686520616476656e7475726f757320616e64206d7973746572696f7573206d6560708201527f746176657273652067616d65732e2047656e657320636861726163746572697360908201527f7469637320616e64206f746865722066756e6374696f6e616c6974792061726560b08201527f20696e74656e74696f6e616c6c79206f6d697474656420666f7220756e6c696d60d08201527f6974656420696d6167696e6174696f6e20616e6420636f6d6d756e6974792d6460f08201527f726976656e2067616d6520646576656c6f706d656e742e20537461727420796f6101108201527f7572206a6f75726e6579206e6f7721222c2022696d616765223a202264617461610130820152750e9a5b5859d94bdcdd99cade1b5b0ed8985cd94d8d0b60521b61015082015261325b61324d610166830186612d2e565b61227d60f01b815260020190565b9695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161329d81601d85016020870161283f565b91909101601d0192915050565b6000828210156132bc576132bc612c16565b500390565b600082198211156132d4576132d4612c16565b500190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600060001982141561333f5761333f612c16565b5060010190565b600081600019048311821515161561336057613360612c16565b500290565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061325b9083018461286b565b6000602082840312156133aa57600080fd5b815161281f816127ec565b634e487b7160e01b600052603160045260246000fdfe227d2c207b2274726169745f74797065223a202253616d6520436f6e736f6e616e7473222c202276616c7565223a2022227d2c207b2274726169745f74797065223a202247656e6535222c202276616c7565223a2022227d2c207b2274726169745f74797065223a2022526967687420436f6e736f6e616e74222c202276616c7565223a2022227d2c207b2274726169745f74797065223a202243656e74657220436f6e736f6e616e74222c202276616c7565223a20225b7b2274726169745f74797065223a20224c65667420436f6e736f6e616e74222c202276616c7565223a20224142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d223530252220793d223138302220646f6d696e616e742d626173656c696e653d226d6964646c652220746578742d616e63686f723d226d6964646c652220636c6173733d226261736522207374796c653d22666f6e742d73697a653a313530253b223e26233933373b20227d2c207b2274726169745f74797065223a202247656e6532222c202276616c7565223a2022227d2c207b2274726169745f74797065223a202247656e6530222c202276616c7565223a2022227d2c207b2274726169745f74797065223a202247656e6533222c202276616c7565223a20223c7465787420783d223530252220793d223130302220646f6d696e616e742d626173656c696e653d226d6964646c652220746578742d616e63686f723d226d6964646c652220636c6173733d226261736522207374796c653d22666f6e742d73697a653a373030253b206c65747465722d73706163696e673a202d302e32656d3b223e3c7374796c653e2e62617365207b666f6e742d66616d696c793a2056657264616e613b2066696c6c3a20626c61636b3b7d3c2f7374796c653e227d2c207b2274726169745f74797065223a20224f6a696e67656f222c202276616c7565223a2022227d2c207b2274726169745f74797065223a202247656e6531222c202276616c7565223a2022227d2c207b2274726169745f74797065223a202247656e6537222c202276616c7565223a2022227d2c207b2274726169745f74797065223a202247656e6534222c202276616c7565223a2022227d2c207b2274726169745f74797065223a202247656e6536222c202276616c7565223a20223c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d222343463938353722202f3e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020323230223ea2646970667358221220f8dfb7d78791f87aa04e9062cbf7945bd93e991e057b6a6520ccf90955e8726864736f6c634300080900334552433732313a207472616e7366657220746f206e6f6e204552433732315265

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101e55760003560e01c80634f6ccce71161010f578063a2e4b12e116100a2578063cb8af74511610071578063cb8af74514610408578063e0d4ea3714610428578063e985e9c514610448578063f2fde38b1461048457600080fd5b8063a2e4b12e146103a2578063b88d4fde146103c2578063ba89696d146103d5578063c87b56dd146103f557600080fd5b8063887f2be4116100de578063887f2be41461036d5780638da5cb5b1461037657806395d89b4114610387578063a22cb4651461038f57600080fd5b80634f6ccce71461032c5780636352211e1461033f57806370a0823114610352578063715018a61461036557600080fd5b806323b872dd11610187578063434f48c411610156578063434f48c41461030157806346b45af7146103145780634c0f38c21461031c5780634e71d92d1461032457600080fd5b806323b872dd146102a85780632f745c59146102bb5780633669edd5146102ce57806342842e0e146102ee57600080fd5b8063081812fc116101c3578063081812fc14610255578063095ea7b3146102805780631496e3f41461029557806318160ddd146102a057600080fd5b806301ffc9a7146101ea578063035f0c871461021257806306fdde0314610240575b600080fd5b6101fd6101f8366004612802565b610497565b60405190151581526020015b60405180910390f35b610232610220366004612826565b600f6020526000908152604090205481565b604051908152602001610209565b6102486104c2565b6040516102099190612897565b610268610263366004612826565b610554565b6040516001600160a01b039091168152602001610209565b61029361028e3660046128c6565b6105ee565b005b6102326361622cff81565b600854610232565b6102936102b63660046128f0565b610704565b6102326102c93660046128c6565b610735565b6102326102dc366004612826565b600e6020526000908152604090205481565b6102936102fc3660046128f0565b6107cb565b61029361030f366004612826565b6107e6565b6101fd61096a565b610232610996565b6102936109af565b61023261033a366004612826565b610aa8565b61026861034d366004612826565b610b3b565b61023261036036600461292c565b610bb2565b610293610c39565b610232600d5481565b600b546001600160a01b0316610268565b610248610c6f565b61029361039d366004612947565b610c7e565b6103b56103b0366004612826565b610d43565b6040516102099190612983565b6102936103d03660046129ce565b610ea2565b6103e86103e3366004612826565b610eda565b6040516102099190612aaa565b610248610403366004612826565b611134565b61041b610416366004612826565b611893565b6040516102099190612af7565b610232610436366004612826565b6000908152600f602052604090205490565b6101fd610456366004612b22565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61029361049236600461292c565b611965565b60006001600160e01b0319821663780e9d6360e01b14806104bc57506104bc82611a06565b92915050565b6060600080546104d190612b55565b80601f01602080910402602001604051908101604052809291908181526020018280546104fd90612b55565b801561054a5780601f1061051f5761010080835404028352916020019161054a565b820191906000526020600020905b81548152906001019060200180831161052d57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166105d25760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006105f982610b3b565b9050806001600160a01b0316836001600160a01b031614156106675760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016105c9565b336001600160a01b038216148061068357506106838133610456565b6106f55760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016105c9565b6106ff8383611a56565b505050565b61070e3382611ac4565b61072a5760405162461bcd60e51b81526004016105c990612b90565b6106ff838383611bbb565b600061074083610bb2565b82106107a25760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016105c9565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6106ff83838360405180602001604052806000815250610ea2565b6002600a5414156108395760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016105c9565b6002600a55600b546001600160a01b031633146108685760405162461bcd60e51b81526004016105c990612be1565b6123a08111801561088a57506108826101c86123a0612c2c565b61ffff168111155b6108c95760405162461bcd60e51b815260206004820152601060248201526f151bdad95b881251081a5b9d985b1a5960821b60448201526064016105c9565b42600d54106108ea5760405162461bcd60e51b81526004016105c990612c52565b6108f381611d66565b6000828152600f602052604090205561091d610917600b546001600160a01b031690565b82611d99565b61095a5760405162461bcd60e51b815260206004820152600e60248201526d135a5b9d1a5b99c819985a5b195960921b60448201526064016105c9565b610962611dae565b506001600a55565b60006123a061ffff16600c54106109815750600090565b42600d54106109905750600090565b50600190565b60006109a66101c86123a0612c2c565b61ffff16905090565b6002600a541415610a025760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016105c9565b6002600a55600c546123a011610a5a5760405162461bcd60e51b815260206004820152601760248201527f526567756c617220636c61696d7320617265206f76657200000000000000000060448201526064016105c9565b42600d5410610a7b5760405162461bcd60e51b81526004016105c990612c52565b6000610a85611dd9565b9050610a9081611d66565b6000828152600f602052604090205561091d33610917565b6000610ab360085490565b8210610b165760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016105c9565b60088281548110610b2957610b29612c95565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806104bc5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016105c9565b60006001600160a01b038216610c1d5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016105c9565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b03163314610c635760405162461bcd60e51b81526004016105c990612be1565b610c6d6000611f49565b565b6060600180546104d190612b55565b6001600160a01b038216331415610cd75760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016105c9565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610d4b612752565b610d53612752565b6000838152600f602052604090205480610db05750506040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915292915050565b6000610dc0826301346541611f9b565b905060005b60088160ff161015610e98576000610dde600884612cc1565b905060006015610df1858560ff16611f9b565b610dfb9190612cc1565b90506010811115610e1457610e11600183612cd5565b91505b6011811115610e2b57610e28600183612cd5565b91505b6012811115610e4257610e3f600183612cd5565b91505b60098260ff161115610e5357600991505b81868460ff1660088110610e6957610e69612c95565b60ff9092166020929092020152610e81600a85612cfa565b935050508080610e9090612d0e565b915050610dc5565b5091949350505050565b610eac3383611ac4565b610ec85760405162461bcd60e51b81526004016105c990612b90565b610ed484848484611fc7565b50505050565b610ee2612771565b6000610eed83611893565b9050610ef7612771565b815160109060ff16600f8110610f0f57610f0f612c95565b018054610f1b90612b55565b80601f0160208091040260200160405190810160405280929190818152602001828054610f4790612b55565b8015610f945780601f10610f6957610100808354040283529160200191610f94565b820191906000526020600020905b815481529060010190602001808311610f7757829003601f168201915b505050505081600060038110610fac57610fac612c95565b60200201526010826001602002015160ff16600f8110610fce57610fce612c95565b018054610fda90612b55565b80601f016020809104026020016040519081016040528092919081815260200182805461100690612b55565b80156110535780601f1061102857610100808354040283529160200191611053565b820191906000526020600020905b81548152906001019060200180831161103657829003601f168201915b50505050508160016003811061106b5761106b612c95565b6020020152604082015160109060ff16600f811061108b5761108b612c95565b01805461109790612b55565b80601f01602080910402602001604051908101604052809291908181526020018280546110c390612b55565b80156111105780601f106110e557610100808354040283529160200191611110565b820191906000526020600020905b8154815290600101906020018083116110f357829003601f168201915b50505050508160026003811061112857611128612c95565b60200201529392505050565b606061113e612798565b6111466127b3565b606080600061115487610d43565b9050600061116188610eda565b9050600061116e89611893565b805190915060ff16600714801561118f5750806001602002015160ff16600e145b80156111a55750806002602002015160ff166004145b156111cb57604051806040016040528060018152602001605960f81b81525094506111e8565b604051806040016040528060018152602001602760f91b81525094505b6020810151815160ff908116911614801561120e57506040810151815160ff9081169116145b1561123457604051806040016040528060018152602001605960f81b8152509350611251565b604051806040016040528060018152602001602760f91b81525093505b6040518060a00160405280606281526020016137886062913987526040805160608101909152603980825261365d6020830139876001602002018190525060405180606001604052806032815260200161375660329139604080890191909152805160c0810190915260838082526135da60208301396060880152815160208381015160408086015190516112e7949301612d4a565b60408051808303601f190181529181526080890191909152805160a0810190915260798082526134ef602083013960a088015261132e8360005b602002015160ff16611ffa565b611339846001611321565b611344856002611321565b61134f866003611321565b6040516020016113629493929190612da4565b60408051808303601f1901815291905260c0880152611382836004611321565b61138d846005611321565b611398856006611321565b6113a3866007611321565b6040516020016113b69493929190612e07565b60408051808303601f1901815291815260e08901919091528051808201909152600d81526c1e17ba32bc3a1f1e17b9bb339f60991b60208201528760086020020152600087816020020151886001602002015189600260200201518a600360200201518b600460200201518c600560200201518d600660200201518e600760200201518f6008602002015160405160200161145999989796959493929190612e5e565b60408051601f1981840301815260608301909152602c8083529092506134836020830139875282516020808901919091526040805160608101909152603180825290916134529083013987600260200201528260016020020151876003602002018190525060405180606001604052806030815260200161342260309139608088015260408084015160a0890152805160608101909152602680825261358e602083013960c088015261150d846000611321565b60e0880152604080516060810190915260268082526136be602083013961010088015261153b846001611321565b61012088015260408051606081019091526026808252613568602083013961014088015261156a846002611321565b610160880152604080516060810190915260268082526135b46020830139610180880152611599846003611321565b6101a08801526040805160608101909152602680825261370a60208301396101c08801526115c8846004611321565b6101e0880152604080516060810190915260268082526133fc60208301396102008801526115f7846005611321565b610220880152604080516060810190915260268082526137306020830139610240880152611626846006611321565b610260880152604080516060810190915260268082526136e46020830139610280880152611655846007611321565b6102a08801526040805160608101909152602880825261369660208301396102c08801526102e08701869052604080516060810190915260308082526133cc60208301396103008801526103208701859052604080518082019091526003815262227d5d60e81b602082015287601a6020020152600087816020020151886001602002015189600260200201518a600360200201518b600460200201518c600560200201518d600660200201518e60076020020151604051602001611721989796959493929190612f1f565b60408051601f19818403018152919052905080886008602002015189600960200201518a600a60200201518b600b60200201518c600c60200201518d600d60200201518e600e6020020151604051602001611783989796959493929190612f1f565b60408051808303601f19018152908290526101e08a01516102008b01516102208c01516102408d01516102608e01516102808f01519597506117ca96889690602001612fc4565b60408051808303601f19018152908290526102a08a01516102c08b01516102e08c01516103008d01516103208e01516103408f015195975061181196889690602001612fc4565b604051602081830303815290604052905060006118606118308d611ffa565b8361183a866120f8565b60405160200161184c93929190613056565b6040516020818303038152906040526120f8565b9050806040516020016118739190613265565b60408051601f198184030181529190529c9b505050505050505050505050565b61189b6127ce565b6118a36127ce565b6000838152600f6020526040902054806118bc57600080fd5b600060046118cb836003611f9b565b6118d59190612cc1565b9050600a851115806118e5575080155b156119015760078352600e60208401526004604084015261195c565b600f61190e83600b611f9b565b6119189190612cc1565b60ff168352600f61192a83600c611f9b565b6119349190612cc1565b60ff166020840152600f61194983600d611f9b565b6119539190612cc1565b60ff1660408401525b50909392505050565b600b546001600160a01b0316331461198f5760405162461bcd60e51b81526004016105c990612be1565b6001600160a01b0381166119f45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105c9565b6119fd81611f49565b50565b3b151590565b60006001600160e01b031982166380ac58cd60e01b1480611a3757506001600160e01b03198216635b5e139f60e01b145b806104bc57506301ffc9a760e01b6001600160e01b03198316146104bc565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611a8b82610b3b565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611b3d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016105c9565b6000611b4883610b3b565b9050806001600160a01b0316846001600160a01b03161480611b835750836001600160a01b0316611b7884610554565b6001600160a01b0316145b80611bb357506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611bce82610b3b565b6001600160a01b031614611c365760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016105c9565b6001600160a01b038216611c985760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016105c9565b611ca383838361225e565b611cae600082611a56565b6001600160a01b0383166000908152600360205260408120805460019290611cd79084906132aa565b90915550506001600160a01b0382166000908152600360205260408120805460019290611d059084906132c1565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600081604051602001611d7b91815260200190565b60408051601f19818403018152919052805160209091012092915050565b6000611da58383612316565b50600192915050565b6101c8611dba60085490565b611dc49190612cc1565b610c6d57611dd4615460426132c1565b600d55565b60006123a061ffff16600c5410611e3c5760405162461bcd60e51b815260206004820152602160248201527f416c6c20726567756c617220746f6b656e7320616c7265616479206d696e74656044820152601960fa1b60648201526084016105c9565b600080600a611e4a60085490565b611e556001436132aa565b40604051602001611e70929190918252602082015260400190565b6040516020818303038152906040528051906020012060001c611e939190612cc1565b6000818152600e6020526040902054909150611eb190600a906132c1565b91506123a0821115611f04575b6123a0821115611f0457600a611ed58260016132c1565b611edf9190612cc1565b6000818152600e6020526040902054909150611efd90600a906132c1565b9150611ebe565b6000818152600e602052604081208054600a9290611f239084906132c1565b925050819055506001600c6000828254611f3d91906132c1565b90915550919392505050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b611fd2848484611bbb565b611fde84848484612334565b610ed45760405162461bcd60e51b81526004016105c9906132d9565b60608161201e5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561204857806120328161332b565b91506120419050600a83612cfa565b9150612022565b60008167ffffffffffffffff811115612063576120636129b8565b6040519080825280601f01601f19166020018201604052801561208d576020820181803683370190505b5090505b8415611bb3576120a26001836132aa565b91506120af600a86612cc1565b6120ba9060306132c1565b60f81b8183815181106120cf576120cf612c95565b60200101906001600160f81b031916908160001a9053506120f1600a86612cfa565b9450612091565b805160609080612118575050604080516020810190915260008152919050565b600060036121278360026132c1565b6121319190612cfa565b61213c906004613346565b9050600061214b8260206132c1565b67ffffffffffffffff811115612163576121636129b8565b6040519080825280601f01601f19166020018201604052801561218d576020820181803683370190505b50905060006040518060600160405280604081526020016134af604091399050600181016020830160005b86811015612219576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b8352600490920191016121b8565b506003860660018114612233576002811461224457612250565b613d3d60f01b600119830152612250565b603d60f81b6000198301525b505050918152949350505050565b6001600160a01b0383166122b9576122b481600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6122dc565b816001600160a01b0316836001600160a01b0316146122dc576122dc8382612441565b6001600160a01b0382166122f3576106ff816124de565b826001600160a01b0316826001600160a01b0316146106ff576106ff828261258d565b6123308282604051806020016040528060008152506125d1565b5050565b60006001600160a01b0384163b1561243657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612378903390899088908890600401613365565b602060405180830381600087803b15801561239257600080fd5b505af19250505080156123c2575060408051601f3d908101601f191682019092526123bf91810190613398565b60015b61241c573d8080156123f0576040519150601f19603f3d011682016040523d82523d6000602084013e6123f5565b606091505b5080516124145760405162461bcd60e51b81526004016105c9906132d9565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611bb3565b506001949350505050565b6000600161244e84610bb2565b61245891906132aa565b6000838152600760205260409020549091508082146124ab576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906124f0906001906132aa565b6000838152600960205260408120546008805493945090928490811061251857612518612c95565b90600052602060002001549050806008838154811061253957612539612c95565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612571576125716133b5565b6001900381819060005260206000200160009055905550505050565b600061259883610bb2565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6125db8383612604565b6125e86000848484612334565b6106ff5760405162461bcd60e51b81526004016105c9906132d9565b6001600160a01b03821661265a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016105c9565b6000818152600260205260409020546001600160a01b0316156126bf5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016105c9565b6126cb6000838361225e565b6001600160a01b03821660009081526003602052604081208054600192906126f49084906132c1565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6040518061010001604052806008906020820280368337509192915050565b60405180606001604052806003905b60608152602001906001900390816127805790505090565b60408051610120810190915260608152600860208201612780565b60408051610360810190915260608152601a60208201612780565b60405180606001604052806003906020820280368337509192915050565b6001600160e01b0319811681146119fd57600080fd5b60006020828403121561281457600080fd5b813561281f816127ec565b9392505050565b60006020828403121561283857600080fd5b5035919050565b60005b8381101561285a578181015183820152602001612842565b83811115610ed45750506000910152565b6000815180845261288381602086016020860161283f565b601f01601f19169290920160200192915050565b60208152600061281f602083018461286b565b80356001600160a01b03811681146128c157600080fd5b919050565b600080604083850312156128d957600080fd5b6128e2836128aa565b946020939093013593505050565b60008060006060848603121561290557600080fd5b61290e846128aa565b925061291c602085016128aa565b9150604084013590509250925092565b60006020828403121561293e57600080fd5b61281f826128aa565b6000806040838503121561295a57600080fd5b612963836128aa565b91506020830135801515811461297857600080fd5b809150509250929050565b6101008101818360005b60088110156129af57815160ff1683526020928301929091019060010161298d565b50505092915050565b634e487b7160e01b600052604160045260246000fd5b600080600080608085870312156129e457600080fd5b6129ed856128aa565b93506129fb602086016128aa565b925060408501359150606085013567ffffffffffffffff80821115612a1f57600080fd5b818701915087601f830112612a3357600080fd5b813581811115612a4557612a456129b8565b604051601f8201601f19908116603f01168101908382118183101715612a6d57612a6d6129b8565b816040528281528a6020848701011115612a8657600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60208082526000906080830183820185845b6003811015612aeb57601f19878503018352612ad984835161286b565b93509184019190840190600101612abc565b50919695505050505050565b60608101818360005b60038110156129af57815160ff16835260209283019290910190600101612b00565b60008060408385031215612b3557600080fd5b612b3e836128aa565b9150612b4c602084016128aa565b90509250929050565b600181811c90821680612b6957607f821691505b60208210811415612b8a57634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600061ffff808316818516808303821115612c4957612c49612c16565b01949350505050565b60208082526023908201527f5761697420756e74696c2074686520636c61696d54696d654c6f636b2070617360408201526273657360e81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b600082612cd057612cd0612cab565b500690565b600060ff821660ff84168060ff03821115612cf257612cf2612c16565b019392505050565b600082612d0957612d09612cab565b500490565b600060ff821660ff811415612d2557612d25612c16565b60010192915050565b60008151612d4081856020860161283f565b9290920192915050565b60008451612d5c81846020890161283f565b8083019050600160fd1b8082528551612d7c816001850160208a0161283f565b60019201918201528351612d9781600284016020880161283f565b0160020195945050505050565b60008551612db6818460208a0161283f565b855190830190612dca818360208a0161283f565b8551910190612ddd81836020890161283f565b8451910190612df081836020880161283f565b600160fd1b91019081526001019695505050505050565b60008551612e19818460208a0161283f565b855190830190612e2d818360208a0161283f565b8551910190612e4081836020890161283f565b8451910190612e5381836020880161283f565b019695505050505050565b60008a51612e70818460208f0161283f565b8a51612e828183860160208f0161283f565b8a519184010190612e97818360208e0161283f565b8951612ea98183850160208e0161283f565b8951929091010190612ebf818360208c0161283f565b8751612ed18183850160208c0161283f565b8751929091010190612ee7818360208a0161283f565b8551612ef98183850160208a0161283f565b8551929091010190612f0f81836020880161283f565b019b9a5050505050505050505050565b600089516020612f328285838f0161283f565b8a5191840191612f458184848f0161283f565b8a51920191612f578184848e0161283f565b8951920191612f698184848d0161283f565b8851920191612f7b8184848c0161283f565b8751920191612f8d8184848b0161283f565b8651920191612f9f8184848a0161283f565b8551920191612fb1818484890161283f565b919091019b9a5050505050505050505050565b600088516020612fd78285838e0161283f565b895191840191612fea8184848e0161283f565b8951920191612ffc8184848d0161283f565b885192019161300e8184848c0161283f565b87519201916130208184848b0161283f565b86519201916130328184848a0161283f565b8551920191613044818484890161283f565b919091019a9950505050505050505050565b7f7b226e616d65223a202253717569642047616d652043617264204e465420230081526000845161308e81601f85016020890161283f565b7001116101130ba3a3934b13aba32b9911d1607d1b601f9184019182015284516130bf81603084016020890161283f565b7f2c20226465736372697074696f6e223a20225468652073717569642067616d65603092909101918201527f2063617264732061726520696e7669746174696f6e20746f20656e746572207460508201527f686520616476656e7475726f757320616e64206d7973746572696f7573206d6560708201527f746176657273652067616d65732e2047656e657320636861726163746572697360908201527f7469637320616e64206f746865722066756e6374696f6e616c6974792061726560b08201527f20696e74656e74696f6e616c6c79206f6d697474656420666f7220756e6c696d60d08201527f6974656420696d6167696e6174696f6e20616e6420636f6d6d756e6974792d6460f08201527f726976656e2067616d6520646576656c6f706d656e742e20537461727420796f6101108201527f7572206a6f75726e6579206e6f7721222c2022696d616765223a202264617461610130820152750e9a5b5859d94bdcdd99cade1b5b0ed8985cd94d8d0b60521b61015082015261325b61324d610166830186612d2e565b61227d60f01b815260020190565b9695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161329d81601d85016020870161283f565b91909101601d0192915050565b6000828210156132bc576132bc612c16565b500390565b600082198211156132d4576132d4612c16565b500190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600060001982141561333f5761333f612c16565b5060010190565b600081600019048311821515161561336057613360612c16565b500290565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061325b9083018461286b565b6000602082840312156133aa57600080fd5b815161281f816127ec565b634e487b7160e01b600052603160045260246000fdfe227d2c207b2274726169745f74797065223a202253616d6520436f6e736f6e616e7473222c202276616c7565223a2022227d2c207b2274726169745f74797065223a202247656e6535222c202276616c7565223a2022227d2c207b2274726169745f74797065223a2022526967687420436f6e736f6e616e74222c202276616c7565223a2022227d2c207b2274726169745f74797065223a202243656e74657220436f6e736f6e616e74222c202276616c7565223a20225b7b2274726169745f74797065223a20224c65667420436f6e736f6e616e74222c202276616c7565223a20224142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d223530252220793d223138302220646f6d696e616e742d626173656c696e653d226d6964646c652220746578742d616e63686f723d226d6964646c652220636c6173733d226261736522207374796c653d22666f6e742d73697a653a313530253b223e26233933373b20227d2c207b2274726169745f74797065223a202247656e6532222c202276616c7565223a2022227d2c207b2274726169745f74797065223a202247656e6530222c202276616c7565223a2022227d2c207b2274726169745f74797065223a202247656e6533222c202276616c7565223a20223c7465787420783d223530252220793d223130302220646f6d696e616e742d626173656c696e653d226d6964646c652220746578742d616e63686f723d226d6964646c652220636c6173733d226261736522207374796c653d22666f6e742d73697a653a373030253b206c65747465722d73706163696e673a202d302e32656d3b223e3c7374796c653e2e62617365207b666f6e742d66616d696c793a2056657264616e613b2066696c6c3a20626c61636b3b7d3c2f7374796c653e227d2c207b2274726169745f74797065223a20224f6a696e67656f222c202276616c7565223a2022227d2c207b2274726169745f74797065223a202247656e6531222c202276616c7565223a2022227d2c207b2274726169745f74797065223a202247656e6537222c202276616c7565223a2022227d2c207b2274726169745f74797065223a202247656e6534222c202276616c7565223a2022227d2c207b2274726169745f74797065223a202247656e6536222c202276616c7565223a20223c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d222343463938353722202f3e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020323230223ea2646970667358221220f8dfb7d78791f87aa04e9062cbf7945bd93e991e057b6a6520ccf90955e8726864736f6c63430008090033

Deployed Bytecode Sourcemap

44737:11845:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38350:224;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;38350:224:0;;;;;;;;45346:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;923:25:1;;;911:2;896:18;45346:35:0;777:177:1;25464:100:0;;;:::i;:::-;;;;;;;:::i;27023:221::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1896:32:1;;;1878:51;;1866:2;1851:18;27023:221:0;1732:203:1;26546:411:0;;;;;;:::i;:::-;;:::i;:::-;;45075:50;;45115:10;45075:50;;38990:113;39078:10;:17;38990:113;;27913:339;;;;;;:::i;:::-;;:::i;38658:256::-;;;;;;:::i;:::-;;:::i;45270:40::-;;;;;;:::i;:::-;;;;;;;;;;;;;;28323:185;;;;;;:::i;:::-;;:::i;54762:416::-;;;;;;:::i;:::-;;:::i;55377:198::-;;;:::i;55587:110::-;;;:::i;54360:390::-;;;:::i;39180:233::-;;;;;;:::i;:::-;;:::i;25158:239::-;;;;;;:::i;:::-;;:::i;24888:208::-;;;;;;:::i;:::-;;:::i;9856:94::-;;;:::i;45235:25::-;;;;;;9205:87;9278:6;;-1:-1:-1;;;;;9278:6:0;9205:87;;25633:104;;;:::i;27316:295::-;;;;;;:::i;:::-;;:::i;47494:858::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;28579:328::-;;;;;;:::i;:::-;;:::i;48360:369::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;49431:4781::-;;;;;;:::i;:::-;;:::i;48737:686::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;46133:101::-;;;;;;:::i;:::-;46186:4;46210:16;;;:6;:16;;;;;;;46133:101;27682:164;;;;;;:::i;:::-;-1:-1:-1;;;;;27803:25:0;;;27779:4;27803:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;27682:164;10105:192;;;;;;:::i;:::-;;:::i;38350:224::-;38452:4;-1:-1:-1;;;;;;38476:50:0;;-1:-1:-1;;;38476:50:0;;:90;;;38530:36;38554:11;38530:23;:36::i;:::-;38469:97;38350:224;-1:-1:-1;;38350:224:0:o;25464:100::-;25518:13;25551:5;25544:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25464:100;:::o;27023:221::-;27099:7;30506:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30506:16:0;27119:73;;;;-1:-1:-1;;;27119:73:0;;7098:2:1;27119:73:0;;;7080:21:1;7137:2;7117:18;;;7110:30;7176:34;7156:18;;;7149:62;-1:-1:-1;;;7227:18:1;;;7220:42;7279:19;;27119:73:0;;;;;;;;;-1:-1:-1;27212:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;27212:24:0;;27023:221::o;26546:411::-;26627:13;26643:23;26658:7;26643:14;:23::i;:::-;26627:39;;26691:5;-1:-1:-1;;;;;26685:11:0;:2;-1:-1:-1;;;;;26685:11:0;;;26677:57;;;;-1:-1:-1;;;26677:57:0;;7511:2:1;26677:57:0;;;7493:21:1;7550:2;7530:18;;;7523:30;7589:34;7569:18;;;7562:62;-1:-1:-1;;;7640:18:1;;;7633:31;7681:19;;26677:57:0;7309:397:1;26677:57:0;8145:10;-1:-1:-1;;;;;26769:21:0;;;;:62;;-1:-1:-1;26794:37:0;26811:5;8145:10;27682:164;:::i;26794:37::-;26747:168;;;;-1:-1:-1;;;26747:168:0;;7913:2:1;26747:168:0;;;7895:21:1;7952:2;7932:18;;;7925:30;7991:34;7971:18;;;7964:62;8062:26;8042:18;;;8035:54;8106:19;;26747:168:0;7711:420:1;26747:168:0;26928:21;26937:2;26941:7;26928:8;:21::i;:::-;26616:341;26546:411;;:::o;27913:339::-;28108:41;8145:10;28141:7;28108:18;:41::i;:::-;28100:103;;;;-1:-1:-1;;;28100:103:0;;;;;;;:::i;:::-;28216:28;28226:4;28232:2;28236:7;28216:9;:28::i;38658:256::-;38755:7;38791:23;38808:5;38791:16;:23::i;:::-;38783:5;:31;38775:87;;;;-1:-1:-1;;;38775:87:0;;8756:2:1;38775:87:0;;;8738:21:1;8795:2;8775:18;;;8768:30;8834:34;8814:18;;;8807:62;-1:-1:-1;;;8885:18:1;;;8878:41;8936:19;;38775:87:0;8554:407:1;38775:87:0;-1:-1:-1;;;;;;38880:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;38658:256::o;28323:185::-;28461:39;28478:4;28484:2;28488:7;28461:39;;;;;;;;;;;;:16;:39::i;54762:416::-;12144:1;12740:7;;:19;;12732:63;;;;-1:-1:-1;;;12732:63:0;;9168:2:1;12732:63:0;;;9150:21:1;9207:2;9187:18;;;9180:30;9246:33;9226:18;;;9219:61;9297:18;;12732:63:0;8966:355:1;12732:63:0;12144:1;12873:7;:18;9278:6;;-1:-1:-1;;;;;9278:6:0;8145:10;9425:23:::1;9417:68;;;;-1:-1:-1::0;;;9417:68:0::1;;;;;;;:::i;:::-;44897:8:::2;54851:22:::0;::::2;:69:::0;::::2;;;-1:-1:-1::0;54889:31:0::2;44956:3;44897:8;54889:31;:::i;:::-;54877:43;;:8;:43;;54851:69;54843:98;;;::::0;-1:-1:-1;;;54843:98:0;;10250:2:1;54843:98:0::2;::::0;::::2;10232:21:1::0;10289:2;10269:18;;;10262:30;-1:-1:-1;;;10308:18:1;;;10301:46;10364:18;;54843:98:0::2;10048:340:1::0;54843:98:0::2;54976:15;54960:13;;:31;54952:79;;;;-1:-1:-1::0;;;54952:79:0::2;;;;;;;:::i;:::-;55061:17;55069:8;55061:7;:17::i;:::-;55042:16;::::0;;;:6:::2;:16;::::0;;;;:36;55097:27:::2;55106:7;9278:6:::0;;-1:-1:-1;;;;;9278:6:0;;9205:87;55106:7:::2;55115:8;55097;:27::i;:::-;55089:54;;;::::0;-1:-1:-1;;;55089:54:0;;10999:2:1;55089:54:0::2;::::0;::::2;10981:21:1::0;11038:2;11018:18;;;11011:30;-1:-1:-1;;;11057:18:1;;;11050:44;11111:18;;55089:54:0::2;10797:338:1::0;55089:54:0::2;55154:16;:14;:16::i;:::-;-1:-1:-1::0;12100:1:0;13052:7;:22;54762:416::o;55377:198::-;55422:4;44897:8;55443:27;;:12;;:27;55439:45;;-1:-1:-1;55479:5:0;;55377:198::o;55439:45::-;55516:15;55499:13;;:32;55495:50;;-1:-1:-1;55540:5:0;;55377:198::o;55495:50::-;-1:-1:-1;55563:4:0;;55377:198::o;55587:110::-;55634:4;55658:31;44956:3;44897:8;55658:31;:::i;:::-;55651:38;;;;55587:110;:::o;54360:390::-;12144:1;12740:7;;:19;;12732:63;;;;-1:-1:-1;;;12732:63:0;;9168:2:1;12732:63:0;;;9150:21:1;9207:2;9187:18;;;9180:30;9246:33;9226:18;;;9219:61;9297:18;;12732:63:0;8966:355:1;12732:63:0;12144:1;12873:7;:18;54418:12:::1;::::0;44897:8:::1;-1:-1:-1::0;54410:62:0::1;;;::::0;-1:-1:-1;;;54410:62:0;;11342:2:1;54410:62:0::1;::::0;::::1;11324:21:1::0;11381:2;11361:18;;;11354:30;11420:25;11400:18;;;11393:53;11463:18;;54410:62:0::1;11140:347:1::0;54410:62:0::1;54507:15;54491:13;;:31;54483:79;;;;-1:-1:-1::0;;;54483:79:0::1;;;;;;;:::i;:::-;54573:12;54588:13;:11;:13::i;:::-;54573:28;;54630:16;54638:7;54630;:16::i;:::-;54612:15;::::0;;;:6:::1;:15;::::0;;;;:34;54665:31:::1;8145:10:::0;54674:12:::1;8065:98:::0;39180:233;39255:7;39291:30;39078:10;:17;;38990:113;39291:30;39283:5;:38;39275:95;;;;-1:-1:-1;;;39275:95:0;;11694:2:1;39275:95:0;;;11676:21:1;11733:2;11713:18;;;11706:30;11772:34;11752:18;;;11745:62;-1:-1:-1;;;11823:18:1;;;11816:42;11875:19;;39275:95:0;11492:408:1;39275:95:0;39388:10;39399:5;39388:17;;;;;;;;:::i;:::-;;;;;;;;;39381:24;;39180:233;;;:::o;25158:239::-;25230:7;25266:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25266:16:0;25301:19;25293:73;;;;-1:-1:-1;;;25293:73:0;;12239:2:1;25293:73:0;;;12221:21:1;12278:2;12258:18;;;12251:30;12317:34;12297:18;;;12290:62;-1:-1:-1;;;12368:18:1;;;12361:39;12417:19;;25293:73:0;12037:405:1;24888:208:0;24960:7;-1:-1:-1;;;;;24988:19:0;;24980:74;;;;-1:-1:-1;;;24980:74:0;;12649:2:1;24980:74:0;;;12631:21:1;12688:2;12668:18;;;12661:30;12727:34;12707:18;;;12700:62;-1:-1:-1;;;12778:18:1;;;12771:40;12828:19;;24980:74:0;12447:406:1;24980:74:0;-1:-1:-1;;;;;;25072:16:0;;;;;:9;:16;;;;;;;24888:208::o;9856:94::-;9278:6;;-1:-1:-1;;;;;9278:6:0;8145:10;9425:23;9417:68;;;;-1:-1:-1;;;9417:68:0;;;;;;;:::i;:::-;9921:21:::1;9939:1;9921:9;:21::i;:::-;9856:94::o:0;25633:104::-;25689:13;25722:7;25715:14;;;;;:::i;27316:295::-;-1:-1:-1;;;;;27419:24:0;;8145:10;27419:24;;27411:62;;;;-1:-1:-1;;;27411:62:0;;13060:2:1;27411:62:0;;;13042:21:1;13099:2;13079:18;;;13072:30;13138:27;13118:18;;;13111:55;13183:18;;27411:62:0;12858:349:1;27411:62:0;8145:10;27486:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;27486:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;27486:53:0;;;;;;;;;;27555:48;;540:41:1;;;27486:42:0;;8145:10;27555:48;;513:18:1;27555:48:0;;;;;;;27316:295;;:::o;47494:858::-;47551:15;;:::i;:::-;47581:21;;:::i;:::-;47613:9;46210:16;;;:6;:16;;;;;;;47653:66;;-1:-1:-1;;47683:24:0;;;;;;;;-1:-1:-1;47683:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47494:858;-1:-1:-1;;47494:858:0:o;47653:66::-;47729:11;47743:23;47751:4;47757:8;47743:7;:23::i;:::-;47729:37;;47784:7;47779:535;47797:1;47795;:3;;;47779:535;;;47820:12;47841:10;47850:1;47841:6;:10;:::i;:::-;47820:32;;47867:14;47905:2;47884:18;47892:6;47900:1;47884:18;;:7;:18::i;:::-;:23;;;;:::i;:::-;47867:40;;47938:2;47926:9;:14;47922:66;;;47961:11;47971:1;47961:11;;:::i;:::-;;;47922:66;48019:2;48007:9;:14;48003:66;;;48042:11;48052:1;48042:11;;:::i;:::-;;;48003:66;48099:2;48087:9;:14;48083:66;;;48122:11;48132:1;48122:11;;:::i;:::-;;;48083:66;48176:1;48167:6;:10;;;48163:61;;;48207:1;48198:10;;48163:61;48261:6;48250:5;48256:1;48250:8;;;;;;;;;:::i;:::-;:17;;;;:8;;;;;;:17;48291:11;48300:2;48291:6;:11;:::i;:::-;48282:20;;47805:509;;47800:3;;;;;:::i;:::-;;;;47779:535;;;-1:-1:-1;48339:5:0;;47494:858;-1:-1:-1;;;;47494:858:0:o;28579:328::-;28754:41;8145:10;28787:7;28754:18;:41::i;:::-;28746:103;;;;-1:-1:-1;;;28746:103:0;;;;;;;:::i;:::-;28860:39;28874:4;28880:2;28884:7;28893:5;28860:13;:39::i;:::-;28579:328;;;;:::o;48360:369::-;48422:16;;:::i;:::-;48457:19;48479:28;48498:8;48479:18;:28::i;:::-;48457:50;;48518:26;;:::i;:::-;48587:6;;48570:16;;:24;;;;;;;;;:::i;:::-;;48555:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;48565:1;48555:12;;;;;;;:::i;:::-;;;;:39;48620:16;48637:3;48641:1;48637:6;;;;48620:24;;;;;;;;;:::i;:::-;;48605:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;48615:1;48605:12;;;;;;;:::i;:::-;;;;:39;48687:6;;;;48670:16;;:24;;;;;;;;;:::i;:::-;;48655:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;48665:1;48655:12;;;;;;;:::i;:::-;;;;:39;48712:9;48360:369;-1:-1:-1;;;48360:369:0:o;49431:4781::-;49497:13;49533:22;;:::i;:::-;49566:27;;:::i;:::-;49604:21;49636:28;49675:25;49703:18;49712:8;49703;:18::i;:::-;49675:46;;49732:26;49761:23;49775:8;49761:13;:23::i;:::-;49732:52;;49795:25;49823:28;49842:8;49823:18;:28::i;:::-;49874:12;;;;-1:-1:-1;49874:17:0;;49890:1;49874:17;:39;;;;-1:-1:-1;49895:9:0;49905:1;49895:12;;;;:18;;49911:2;49895:18;49874:39;:60;;;;-1:-1:-1;49917:9:0;49927:1;49917:12;;;;:17;;49933:1;49917:17;49874:60;49870:152;;;49951:13;;;;;;;;;;;;;-1:-1:-1;;;49951:13:0;;;;;49870:152;;;49997:13;;;;;;;;;;;;;-1:-1:-1;;;49997:13:0;;;;;49870:152;50052:12;;;;50036;;:28;;;;;;;:60;;;;-1:-1:-1;50084:12:0;;;;50068;;:28;;;;;;;50036:60;50032:166;;;50113:20;;;;;;;;;;;;;-1:-1:-1;;;50113:20:0;;;;;50032:166;;;50166:20;;;;;;;;;;;;;-1:-1:-1;;;50166:20:0;;;;;50032:166;50210:111;;;;;;;;;;;;;;;;;;;50332:70;;;;;;;;;;;;;;50210:8;50332:70;;;:5;50338:1;50332:8;;;:70;;;;50413:63;;;;;;;;;;;;;;;;;:8;;;;:63;;;;50487:144;;;;;;;;;;;;;50413:8;50487:144;;;:8;;;:144;50677:12;;50487:8;50696:12;;;;50715;;;;;50660:68;;;;50677:12;50660:68;;:::i;:::-;;;;;;;-1:-1:-1;;50660:68:0;;;;;;50642:8;;;:87;;;;50740:134;;;;;;;;;;;;;50642:8;50740:134;;;:8;;;:134;50920:22;50929:9;50939:1;50929:12;;;;;50920:22;;:8;:22::i;:::-;50944;50953:9;50963:1;50953:12;;50944:22;50968;50977:9;50987:1;50977:12;;50968:22;50992;51001:9;51011:1;51001:12;;50992:22;50903:117;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;50903:117:0;;;;;;50885:8;;;:136;51067:22;51076:9;51086:1;51076:12;;51067:22;51091;51100:9;51110:1;51100:12;;51091:22;51115;51124:9;51134:1;51124:12;;51115:22;51139;51148:9;51158:1;51148:12;;51139:22;51050:113;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;51050:113:0;;;;;;51032:8;;;:132;;;;51175:25;;;;;;;;;;;-1:-1:-1;;;51032:8:0;51175:25;;;51032:5;51181:1;51175:8;;;:25;51221:20;51268:5;51221:20;51268:8;;;;51278:5;51284:1;51278:8;;;;51288:5;51294:1;51288:8;;;;51298:5;51304:1;51298:8;;;;51308:5;51314:1;51308:8;;;;51318:5;51324:1;51318:8;;;;51328:5;51334:1;51328:8;;;;51338:5;51344:1;51338:8;;;;51348:5;51354:1;51348:8;;;;51251:106;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;51251:106:0;;;;;;51371:61;;;;;;;;;;51251:106;;-1:-1:-1;51371:61:0;51251:106;51371:61;;;;;51458:12;;51371;51443;;;:27;;;;51481:66;;;;;;;;;;;;;;;;;;;;:9;51491:1;51481:12;;;:66;51573:9;51583:1;51573:12;;;;51558:9;51568:1;51558:12;;;:27;;;;51596:65;;;;;;;;;;;;;;;;;:12;;;:65;51695:12;;;;;51680;;;:27;51718:55;;;;;;;;;;;;;51596:12;51718:55;;;:12;;;:55;51799:22;51808:9;51818:1;51808:12;;51799:22;51784:12;;;:37;51832:55;;;;;;;;;;;;;;51784:12;51832:55;;;:12;;;:55;51913:22;51922:9;51932:1;51922:12;;51913:22;51898:12;;;:37;51946:56;;;;;;;;;;;;;;51898:12;51946:56;;;:13;;;:56;52037:22;52046:9;52056:1;52046:12;;52037:22;52021:13;;;:38;52070:56;;;;;;;;;;;;;;52021:13;52070:56;;;:13;;;:56;52161:22;52170:9;52180:1;52170:12;;52161:22;52145:13;;;:38;52194:56;;;;;;;;;;;;;;52145:13;52194:56;;;:13;;;:56;52285:22;52294:9;52304:1;52294:12;;52285:22;52269:13;;;:38;52318:56;;;;;;;;;;;;;;52269:13;52318:56;;;:13;;;:56;52409:22;52418:9;52428:1;52418:12;;52409:22;52393:13;;;:38;52442:56;;;;;;;;;;;;;;52393:13;52442:56;;;:13;;;:56;52533:22;52542:9;52552:1;52542:12;;52533:22;52517:13;;;:38;52566:56;;;;;;;;;;;;;;52517:13;52566:56;;;:13;;;:56;52657:22;52666:9;52676:1;52666:12;;52657:22;52641:13;;;:38;52690:58;;;;;;;;;;;;;;52641:13;52690:58;;;:13;;;:58;52767:13;;;:23;;;52801:66;;;;;;;;;;;;;;52690:13;52801:66;;;:13;;;:66;52886:13;;;:30;;;52927:21;;;;;;;;;;;;-1:-1:-1;;;52801:13:0;52927:21;;;52801:9;52937:2;52927:13;;;:21;52969:19;53015:9;52969:19;53015:12;;;;53029:9;53039:1;53029:12;;;;53043:9;53053:1;53043:12;;;;53057:9;53067:1;53057:12;;;;53071:9;53081:1;53071:12;;;;53085:9;53095:1;53085:12;;;;53099:9;53109:1;53099:12;;;;53113:9;53123:1;53113:12;;;;52998:128;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;52998:128:0;;;;;;;;;;-1:-1:-1;52998:128:0;53177:9;53187:1;53177:12;;;;53191:9;53201:1;53191:12;;;;53205:9;53215:2;53205:13;;;;53220:9;53230:2;53220:13;;;;53235:9;53245:2;53235:13;;;;53250:9;53260:2;53250:13;;;;53265:9;53275:2;53265:13;;;;53153:126;;;;;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;53153:126:0;;;;;;;53338:13;;;;53353;;;;53368;;;;53383;;;;53398;;;;53413;;;;53153:126;;-1:-1:-1;53314:113:0;;53153:126;;53413:13;53338;53314:113;;:::i;:::-;;;;;;;-1:-1:-1;;53314:113:0;;;;;;;53486:13;;;;53501;;;;53516;;;;53531;;;;53546;;;;53561;;;;53314:113;;-1:-1:-1;53462:113:0;;53314;;53561:13;53486;53462:113;;:::i;:::-;;;;;;;;;;;;;53447:129;;53597:18;53618:479;53697:18;53706:8;53697;:18::i;:::-;53738:5;54059:28;54079:6;54059:13;:28::i;:::-;53645:449;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53618:13;:479::i;:::-;53597:500;;54174:4;54124:55;;;;;;;;:::i;:::-;;;;-1:-1:-1;;54124:55:0;;;;;;;;;;49431:4781;-1:-1:-1;;;;;;;;;;;;49431:4781:0:o;48737:686::-;48804:15;;:::i;:::-;48842:25;;:::i;:::-;48878:9;46210:16;;;:6;:16;;;;;;;48918:18;;;;;;48947:6;48975:1;48956:16;48964:4;48970:1;48956:7;:16::i;:::-;:20;;;;:::i;:::-;48947:29;-1:-1:-1;44850:2:0;48991:21;;;;:31;;-1:-1:-1;49016:6:0;;48991:31;48987:402;;;49054:1;49039:16;;49085:2;49039:12;49070;;:17;49117:1;49102:12;;;:16;48987:402;;;49193:23;49173:17;49181:4;49187:2;49173:7;:17::i;:::-;:43;;;;:::i;:::-;49152:65;;;;49273:23;49253:17;49261:4;49267:2;49253:7;:17::i;:::-;:43;;;;:::i;:::-;49232:65;;:12;;;:65;49353:23;49333:17;49341:4;49347:2;49333:7;:17::i;:::-;:43;;;;:::i;:::-;49312:65;;:12;;;:65;48987:402;-1:-1:-1;49406:9:0;;48737:686;-1:-1:-1;;;48737:686:0:o;10105:192::-;9278:6;;-1:-1:-1;;;;;9278:6:0;8145:10;9425:23;9417:68;;;;-1:-1:-1;;;9417:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10194:22:0;::::1;10186:73;;;::::0;-1:-1:-1;;;10186:73:0;;24567:2:1;10186:73:0::1;::::0;::::1;24549:21:1::0;24606:2;24586:18;;;24579:30;24645:34;24625:18;;;24618:62;-1:-1:-1;;;24696:18:1;;;24689:36;24742:19;;10186:73:0::1;24365:402:1::0;10186:73:0::1;10270:19;10280:8;10270:9;:19::i;:::-;10105:192:::0;:::o;15298:387::-;15621:20;15669:8;;;15298:387::o;24519:305::-;24621:4;-1:-1:-1;;;;;;24658:40:0;;-1:-1:-1;;;24658:40:0;;:105;;-1:-1:-1;;;;;;;24715:48:0;;-1:-1:-1;;;24715:48:0;24658:105;:158;;;-1:-1:-1;;;;;;;;;;23235:40:0;;;24780:36;23126:157;34399:174;34474:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;34474:29:0;-1:-1:-1;;;;;34474:29:0;;;;;;;;:24;;34528:23;34474:24;34528:14;:23::i;:::-;-1:-1:-1;;;;;34519:46:0;;;;;;;;;;;34399:174;;:::o;30711:348::-;30804:4;30506:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30506:16:0;30821:73;;;;-1:-1:-1;;;30821:73:0;;24974:2:1;30821:73:0;;;24956:21:1;25013:2;24993:18;;;24986:30;25052:34;25032:18;;;25025:62;-1:-1:-1;;;25103:18:1;;;25096:42;25155:19;;30821:73:0;24772:408:1;30821:73:0;30905:13;30921:23;30936:7;30921:14;:23::i;:::-;30905:39;;30974:5;-1:-1:-1;;;;;30963:16:0;:7;-1:-1:-1;;;;;30963:16:0;;:51;;;;31007:7;-1:-1:-1;;;;;30983:31:0;:20;30995:7;30983:11;:20::i;:::-;-1:-1:-1;;;;;30983:31:0;;30963:51;:87;;;-1:-1:-1;;;;;;27803:25:0;;;27779:4;27803:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;31018:32;30955:96;30711:348;-1:-1:-1;;;;30711:348:0:o;33703:578::-;33862:4;-1:-1:-1;;;;;33835:31:0;:23;33850:7;33835:14;:23::i;:::-;-1:-1:-1;;;;;33835:31:0;;33827:85;;;;-1:-1:-1;;;33827:85:0;;25387:2:1;33827:85:0;;;25369:21:1;25426:2;25406:18;;;25399:30;25465:34;25445:18;;;25438:62;-1:-1:-1;;;25516:18:1;;;25509:39;25565:19;;33827:85:0;25185:405:1;33827:85:0;-1:-1:-1;;;;;33931:16:0;;33923:65;;;;-1:-1:-1;;;33923:65:0;;25797:2:1;33923:65:0;;;25779:21:1;25836:2;25816:18;;;25809:30;25875:34;25855:18;;;25848:62;-1:-1:-1;;;25926:18:1;;;25919:34;25970:19;;33923:65:0;25595:400:1;33923:65:0;34001:39;34022:4;34028:2;34032:7;34001:20;:39::i;:::-;34105:29;34122:1;34126:7;34105:8;:29::i;:::-;-1:-1:-1;;;;;34147:15:0;;;;;;:9;:15;;;;;:20;;34166:1;;34147:15;:20;;34166:1;;34147:20;:::i;:::-;;;;-1:-1:-1;;;;;;;34178:13:0;;;;;;:9;:13;;;;;:18;;34195:1;;34178:13;:18;;34195:1;;34178:18;:::i;:::-;;;;-1:-1:-1;;34207:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34207:21:0;-1:-1:-1;;;;;34207:21:0;;;;;;;;;34246:27;;34207:16;;34246:27;;;;;;;33703:578;;;:::o;45988:132::-;46042:4;46101:8;46084:26;;;;;;26392:19:1;;26436:2;26427:12;;26263:182;46084:26:0;;;;-1:-1:-1;;46084:26:0;;;;;;;;;46074:37;;46084:26;46074:37;;;;;45988:132;-1:-1:-1;;45988:132:0:o;54220:::-;54282:4;54299:23;54309:3;54314:7;54299:9;:23::i;:::-;-1:-1:-1;54340:4:0;54220:132;;;;:::o;55190:175::-;45008:3;55240:13;39078:10;:17;;38990:113;55240:13;:31;;;;:::i;:::-;55236:121;;55309:36;45061:7;55309:15;:36;:::i;:::-;55293:13;:52;55190:175::o;46816:670::-;46856:4;44897:8;46881:26;;:12;;:26;46873:72;;;;-1:-1:-1;;;46873:72:0;;26652:2:1;46873:72:0;;;26634:21:1;26691:2;26671:18;;;26664:30;26730:34;26710:18;;;26703:62;-1:-1:-1;;;26781:18:1;;;26774:31;26822:19;;46873:72:0;26450:397:1;46873:72:0;46956:12;;44850:2;47031:13;39078:10;:17;;38990:113;47031:13;47056:14;47069:1;47056:12;:14;:::i;:::-;47046:25;47014:58;;;;;;;;27009:19:1;;;27053:2;27044:12;;27037:28;27090:2;27081:12;;26852:247;47014:58:0;;;;;;;;;;;;;47004:69;;;;;;46996:78;;:90;;;;:::i;:::-;47107:22;;;;:11;:22;;;;;;46979:107;;-1:-1:-1;47107:34:0;;44850:2;;47107:34;:::i;:::-;47097:44;-1:-1:-1;44897:8:0;47156:21;;47152:220;;;47194:167;44897:8;47201:21;;47194:167;;;44850:2;47256:13;:9;47268:1;47256:13;:::i;:::-;47255:27;;;;:::i;:::-;47311:22;;;;:11;:22;;;;;;47243:39;;-1:-1:-1;47311:34:0;;44850:2;;47311:34;:::i;:::-;47301:44;;47194:167;;;47382:22;;;;:11;:22;;;;;:35;;44850:2;;47382:22;:35;;44850:2;;47382:35;:::i;:::-;;;;;;;;47452:1;47436:12;;:17;;;;;;;:::i;:::-;;;;-1:-1:-1;47471:7:0;;46816:670;-1:-1:-1;;;46816:670:0:o;10305:173::-;10380:6;;;-1:-1:-1;;;;;10397:17:0;;;-1:-1:-1;;;;;;10397:17:0;;;;;;;10430:40;;10380:6;;;10397:17;10380:6;;10430:40;;10361:16;;10430:40;10350:128;10305:173;:::o;46246:149::-;46353:32;;;;;;;27009:19:1;;;;27044:12;;;27037:28;;;;46353:32:0;;;;;;;;;27081:12:1;;;;46353:32:0;;46343:43;;;;;;46246:149::o;29789:315::-;29946:28;29956:4;29962:2;29966:7;29946:9;:28::i;:::-;29993:48;30016:4;30022:2;30026:7;30035:5;29993:22;:48::i;:::-;29985:111;;;;-1:-1:-1;;;29985:111:0;;;;;;;:::i;55709:715::-;55765:13;55978:10;55974:53;;-1:-1:-1;;56005:10:0;;;;;;;;;;;;-1:-1:-1;;;56005:10:0;;;;;55709:715::o;55974:53::-;56052:5;56037:12;56093:78;56100:9;;56093:78;;56126:8;;;;:::i;:::-;;-1:-1:-1;56149:10:0;;-1:-1:-1;56157:2:0;56149:10;;:::i;:::-;;;56093:78;;;56181:19;56213:6;56203:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56203:17:0;;56181:39;;56231:154;56238:10;;56231:154;;56265:11;56275:1;56265:11;;:::i;:::-;;-1:-1:-1;56334:10:0;56342:2;56334:5;:10;:::i;:::-;56321:24;;:2;:24;:::i;:::-;56308:39;;56291:6;56298;56291:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;56291:56:0;;;;;;;;-1:-1:-1;56362:11:0;56371:2;56362:11;;:::i;:::-;;;56231:154;;56931:1607;57029:11;;56989:13;;57055:8;57051:23;;-1:-1:-1;;57065:9:0;;;;;;;;;-1:-1:-1;57065:9:0;;;56931:1607;-1:-1:-1;56931:1607:0:o;57051:23::-;57126:18;57164:1;57153:7;:3;57159:1;57153:7;:::i;:::-;57152:13;;;;:::i;:::-;57147:19;;:1;:19;:::i;:::-;57126:40;-1:-1:-1;57224:19:0;57256:15;57126:40;57269:2;57256:15;:::i;:::-;57246:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57246:26:0;;57224:48;;57285:18;57306:5;;;;;;;;;;;;;;;;;57285:26;;57375:1;57368:5;57364:13;57420:2;57412:6;57408:15;57471:1;57439:777;57494:3;57491:1;57488:10;57439:777;;;57549:1;57592:12;;;;;57586:19;57687:4;57675:2;57671:14;;;;;57653:40;;57647:47;57796:2;57792:14;;;57788:25;;57774:40;;57768:47;57925:1;57921:13;;;57917:24;;57903:39;;57897:46;58045:16;;;;58031:31;;58025:38;57723:1;57719:11;;;57817:4;57764:58;;;57755:68;57848:11;;57893:57;;;57884:67;;;;57976:11;;58021:49;;58012:59;58100:3;58096:13;58129:22;;58199:1;58184:17;;;;57542:9;57439:777;;;57443:44;58248:1;58243:3;58239:11;58269:1;58264:84;;;;58367:1;58362:82;;;;58232:212;;58264:84;-1:-1:-1;;;;;58297:17:0;;58290:43;58264:84;;58362:82;-1:-1:-1;;;;;58395:17:0;;58388:41;58232:212;-1:-1:-1;;;58460:26:0;;;58467:6;56931:1607;-1:-1:-1;;;;56931:1607:0:o;40026:589::-;-1:-1:-1;;;;;40232:18:0;;40228:187;;40267:40;40299:7;41442:10;:17;;41415:24;;;;:15;:24;;;;;:44;;;41470:24;;;;;;;;;;;;41338:164;40267:40;40228:187;;;40337:2;-1:-1:-1;;;;;40329:10:0;:4;-1:-1:-1;;;;;40329:10:0;;40325:90;;40356:47;40389:4;40395:7;40356:32;:47::i;:::-;-1:-1:-1;;;;;40429:16:0;;40425:183;;40462:45;40499:7;40462:36;:45::i;40425:183::-;40535:4;-1:-1:-1;;;;;40529:10:0;:2;-1:-1:-1;;;;;40529:10:0;;40525:83;;40556:40;40584:2;40588:7;40556:27;:40::i;31401:110::-;31477:26;31487:2;31491:7;31477:26;;;;;;;;;;;;:9;:26::i;:::-;31401:110;;:::o;35138:803::-;35293:4;-1:-1:-1;;;;;35314:13:0;;15621:20;15669:8;35310:624;;35350:72;;-1:-1:-1;;;35350:72:0;;-1:-1:-1;;;;;35350:36:0;;;;;:72;;8145:10;;35401:4;;35407:7;;35416:5;;35350:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35350:72:0;;;;;;;;-1:-1:-1;;35350:72:0;;;;;;;;;;;;:::i;:::-;;;35346:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35596:13:0;;35592:272;;35639:60;;-1:-1:-1;;;35639:60:0;;;;;;;:::i;35592:272::-;35814:6;35808:13;35799:6;35795:2;35791:15;35784:38;35346:533;-1:-1:-1;;;;;;35473:55:0;-1:-1:-1;;;35473:55:0;;-1:-1:-1;35466:62:0;;35310:624;-1:-1:-1;35918:4:0;35138:803;;;;;;:::o;42129:988::-;42395:22;42445:1;42420:22;42437:4;42420:16;:22::i;:::-;:26;;;;:::i;:::-;42457:18;42478:26;;;:17;:26;;;;;;42395:51;;-1:-1:-1;42611:28:0;;;42607:328;;-1:-1:-1;;;;;42678:18:0;;42656:19;42678:18;;;:12;:18;;;;;;;;:34;;;;;;;;;42729:30;;;;;;:44;;;42846:30;;:17;:30;;;;;:43;;;42607:328;-1:-1:-1;43031:26:0;;;;:17;:26;;;;;;;;43024:33;;;-1:-1:-1;;;;;43075:18:0;;;;;:12;:18;;;;;:34;;;;;;;43068:41;42129:988::o;43412:1079::-;43690:10;:17;43665:22;;43690:21;;43710:1;;43690:21;:::i;:::-;43722:18;43743:24;;;:15;:24;;;;;;44116:10;:26;;43665:46;;-1:-1:-1;43743:24:0;;43665:46;;44116:26;;;;;;:::i;:::-;;;;;;;;;44094:48;;44180:11;44155:10;44166;44155:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;44260:28;;;:15;:28;;;;;;;:41;;;44432:24;;;;;44425:31;44467:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;43483:1008;;;43412:1079;:::o;40916:221::-;41001:14;41018:20;41035:2;41018:16;:20::i;:::-;-1:-1:-1;;;;;41049:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;41094:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;40916:221:0:o;31738:321::-;31868:18;31874:2;31878:7;31868:5;:18::i;:::-;31919:54;31950:1;31954:2;31958:7;31967:5;31919:22;:54::i;:::-;31897:154;;;;-1:-1:-1;;;31897:154:0;;;;;;;:::i;32395:382::-;-1:-1:-1;;;;;32475:16:0;;32467:61;;;;-1:-1:-1;;;32467:61:0;;29181:2:1;32467:61:0;;;29163:21:1;;;29200:18;;;29193:30;29259:34;29239:18;;;29232:62;29311:18;;32467:61:0;28979:356:1;32467:61:0;30482:4;30506:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30506:16:0;:30;32539:58;;;;-1:-1:-1;;;32539:58:0;;29542:2:1;32539:58:0;;;29524:21:1;29581:2;29561:18;;;29554:30;29620;29600:18;;;29593:58;29668:18;;32539:58:0;29340:352:1;32539:58:0;32610:45;32639:1;32643:2;32647:7;32610:20;:45::i;:::-;-1:-1:-1;;;;;32668:13:0;;;;;;:9;:13;;;;;:18;;32685:1;;32668:13;:18;;32685:1;;32668:18;:::i;:::-;;;;-1:-1:-1;;32697:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32697:21:0;-1:-1:-1;;;;;32697:21:0;;;;;;;;32736:33;;32697:16;;;32736:33;;32697:16;;32736:33;32395:382;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:180::-;651:6;704:2;692:9;683:7;679:23;675:32;672:52;;;720:1;717;710:12;672:52;-1:-1:-1;743:23:1;;592:180;-1:-1:-1;592:180:1:o;959:258::-;1031:1;1041:113;1055:6;1052:1;1049:13;1041:113;;;1131:11;;;1125:18;1112:11;;;1105:39;1077:2;1070:10;1041:113;;;1172:6;1169:1;1166:13;1163:48;;;-1:-1:-1;;1207:1:1;1189:16;;1182:27;959:258::o;1222:269::-;1275:3;1313:5;1307:12;1340:6;1335:3;1328:19;1356:63;1412:6;1405:4;1400:3;1396:14;1389:4;1382:5;1378:16;1356:63;:::i;:::-;1473:2;1452:15;-1:-1:-1;;1448:29:1;1439:39;;;;1480:4;1435:50;;1222:269;-1:-1:-1;;1222:269:1:o;1496:231::-;1645:2;1634:9;1627:21;1608:4;1665:56;1717:2;1706:9;1702:18;1694:6;1665:56;:::i;1940:173::-;2008:20;;-1:-1:-1;;;;;2057:31:1;;2047:42;;2037:70;;2103:1;2100;2093:12;2037:70;1940:173;;;:::o;2118:254::-;2186:6;2194;2247:2;2235:9;2226:7;2222:23;2218:32;2215:52;;;2263:1;2260;2253:12;2215:52;2286:29;2305:9;2286:29;:::i;:::-;2276:39;2362:2;2347:18;;;;2334:32;;-1:-1:-1;;;2118:254:1:o;2377:328::-;2454:6;2462;2470;2523:2;2511:9;2502:7;2498:23;2494:32;2491:52;;;2539:1;2536;2529:12;2491:52;2562:29;2581:9;2562:29;:::i;:::-;2552:39;;2610:38;2644:2;2633:9;2629:18;2610:38;:::i;:::-;2600:48;;2695:2;2684:9;2680:18;2667:32;2657:42;;2377:328;;;;;:::o;2710:186::-;2769:6;2822:2;2810:9;2801:7;2797:23;2793:32;2790:52;;;2838:1;2835;2828:12;2790:52;2861:29;2880:9;2861:29;:::i;2901:347::-;2966:6;2974;3027:2;3015:9;3006:7;3002:23;2998:32;2995:52;;;3043:1;3040;3033:12;2995:52;3066:29;3085:9;3066:29;:::i;:::-;3056:39;;3145:2;3134:9;3130:18;3117:32;3192:5;3185:13;3178:21;3171:5;3168:32;3158:60;;3214:1;3211;3204:12;3158:60;3237:5;3227:15;;;2901:347;;;;;:::o;3253:502::-;3429:3;3414:19;;3418:9;3510:6;3387:4;3544:205;3558:4;3555:1;3552:11;3544:205;;;3621:13;;3636:4;3617:24;3605:37;;3665:4;3689:12;;;;3724:15;;;;3578:1;3571:9;3544:205;;;3548:3;;;3253:502;;;;:::o;3760:127::-;3821:10;3816:3;3812:20;3809:1;3802:31;3852:4;3849:1;3842:15;3876:4;3873:1;3866:15;3892:1138;3987:6;3995;4003;4011;4064:3;4052:9;4043:7;4039:23;4035:33;4032:53;;;4081:1;4078;4071:12;4032:53;4104:29;4123:9;4104:29;:::i;:::-;4094:39;;4152:38;4186:2;4175:9;4171:18;4152:38;:::i;:::-;4142:48;;4237:2;4226:9;4222:18;4209:32;4199:42;;4292:2;4281:9;4277:18;4264:32;4315:18;4356:2;4348:6;4345:14;4342:34;;;4372:1;4369;4362:12;4342:34;4410:6;4399:9;4395:22;4385:32;;4455:7;4448:4;4444:2;4440:13;4436:27;4426:55;;4477:1;4474;4467:12;4426:55;4513:2;4500:16;4535:2;4531;4528:10;4525:36;;;4541:18;;:::i;:::-;4616:2;4610:9;4584:2;4670:13;;-1:-1:-1;;4666:22:1;;;4690:2;4662:31;4658:40;4646:53;;;4714:18;;;4734:22;;;4711:46;4708:72;;;4760:18;;:::i;:::-;4800:10;4796:2;4789:22;4835:2;4827:6;4820:18;4875:7;4870:2;4865;4861;4857:11;4853:20;4850:33;4847:53;;;4896:1;4893;4886:12;4847:53;4952:2;4947;4943;4939:11;4934:2;4926:6;4922:15;4909:46;4997:1;4992:2;4987;4979:6;4975:15;4971:24;4964:35;5018:6;5008:16;;;;;;;3892:1138;;;;;;;:::o;5035:700::-;5222:2;5274:21;;;5193:4;;5381:3;5366:19;;5247:18;;;5408:6;5193:4;5442:264;5456:4;5453:1;5450:11;5442:264;;;5547:2;5543:7;5531:9;5523:6;5519:22;5515:36;5510:3;5503:49;5575:51;5619:6;5610;5604:13;5575:51;:::i;:::-;5565:61;-1:-1:-1;5684:12:1;;;;5649:15;;;;5476:1;5469:9;5442:264;;;-1:-1:-1;5723:6:1;;5035:700;-1:-1:-1;;;;;;5035:700:1:o;5740:501::-;5916:2;5901:18;;5905:9;5996:6;5874:4;6030:205;6044:4;6041:1;6038:11;6030:205;;;6107:13;;6122:4;6103:24;6091:37;;6151:4;6175:12;;;;6210:15;;;;6064:1;6057:9;6030:205;;6246:260;6314:6;6322;6375:2;6363:9;6354:7;6350:23;6346:32;6343:52;;;6391:1;6388;6381:12;6343:52;6414:29;6433:9;6414:29;:::i;:::-;6404:39;;6462:38;6496:2;6485:9;6481:18;6462:38;:::i;:::-;6452:48;;6246:260;;;;;:::o;6511:380::-;6590:1;6586:12;;;;6633;;;6654:61;;6708:4;6700:6;6696:17;6686:27;;6654:61;6761:2;6753:6;6750:14;6730:18;6727:38;6724:161;;;6807:10;6802:3;6798:20;6795:1;6788:31;6842:4;6839:1;6832:15;6870:4;6867:1;6860:15;6724:161;;6511:380;;;:::o;8136:413::-;8338:2;8320:21;;;8377:2;8357:18;;;8350:30;8416:34;8411:2;8396:18;;8389:62;-1:-1:-1;;;8482:2:1;8467:18;;8460:47;8539:3;8524:19;;8136:413::o;9326:356::-;9528:2;9510:21;;;9547:18;;;9540:30;9606:34;9601:2;9586:18;;9579:62;9673:2;9658:18;;9326:356::o;9687:127::-;9748:10;9743:3;9739:20;9736:1;9729:31;9779:4;9776:1;9769:15;9803:4;9800:1;9793:15;9819:224;9858:3;9886:6;9919:2;9916:1;9912:10;9949:2;9946:1;9942:10;9980:3;9976:2;9972:12;9967:3;9964:21;9961:47;;;9988:18;;:::i;:::-;10024:13;;9819:224;-1:-1:-1;;;;9819:224:1:o;10393:399::-;10595:2;10577:21;;;10634:2;10614:18;;;10607:30;10673:34;10668:2;10653:18;;10646:62;-1:-1:-1;;;10739:2:1;10724:18;;10717:33;10782:3;10767:19;;10393:399::o;11905:127::-;11966:10;11961:3;11957:20;11954:1;11947:31;11997:4;11994:1;11987:15;12021:4;12018:1;12011:15;13212:127;13273:10;13268:3;13264:20;13261:1;13254:31;13304:4;13301:1;13294:15;13328:4;13325:1;13318:15;13344:112;13376:1;13402;13392:35;;13407:18;;:::i;:::-;-1:-1:-1;13441:9:1;;13344:112::o;13461:204::-;13499:3;13535:4;13532:1;13528:12;13567:4;13564:1;13560:12;13602:3;13596:4;13592:14;13587:3;13584:23;13581:49;;;13610:18;;:::i;:::-;13646:13;;13461:204;-1:-1:-1;;;13461:204:1:o;13670:120::-;13710:1;13736;13726:35;;13741:18;;:::i;:::-;-1:-1:-1;13775:9:1;;13670:120::o;13795:175::-;13832:3;13876:4;13869:5;13865:16;13905:4;13896:7;13893:17;13890:43;;;13913:18;;:::i;:::-;13962:1;13949:15;;13795:175;-1:-1:-1;;13795:175:1:o;13975:185::-;14017:3;14055:5;14049:12;14070:52;14115:6;14110:3;14103:4;14096:5;14092:16;14070:52;:::i;:::-;14138:16;;;;;13975:185;-1:-1:-1;;13975:185:1:o;14165:960::-;14594:3;14632:6;14626:13;14648:53;14694:6;14689:3;14682:4;14674:6;14670:17;14648:53;:::i;:::-;14732:6;14727:3;14723:16;14710:29;;-1:-1:-1;;;14784:2:1;14777:5;14770:17;14818:6;14812:13;14834:65;14890:8;14886:1;14879:5;14875:13;14868:4;14860:6;14856:17;14834:65;:::i;:::-;14962:1;14918:20;;14954:10;;;14947:22;14994:13;;15016:62;14994:13;15065:1;15057:10;;15050:4;15038:17;;15016:62;:::i;:::-;15098:17;15117:1;15094:25;;14165:960;-1:-1:-1;;;;;14165:960:1:o;15130:1021::-;15506:3;15544:6;15538:13;15560:53;15606:6;15601:3;15594:4;15586:6;15582:17;15560:53;:::i;:::-;15676:13;;15635:16;;;;15698:57;15676:13;15635:16;15732:4;15720:17;;15698:57;:::i;:::-;15822:13;;15777:20;;;15844:57;15822:13;15777:20;15878:4;15866:17;;15844:57;:::i;:::-;15968:13;;15923:20;;;15990:57;15968:13;15923:20;16024:4;16012:17;;15990:57;:::i;:::-;-1:-1:-1;;;16069:20:1;;16098:18;;;16143:1;16132:13;;15130:1021;-1:-1:-1;;;;;;15130:1021:1:o;16156:858::-;16431:3;16469:6;16463:13;16485:53;16531:6;16526:3;16519:4;16511:6;16507:17;16485:53;:::i;:::-;16601:13;;16560:16;;;;16623:57;16601:13;16560:16;16657:4;16645:17;;16623:57;:::i;:::-;16747:13;;16702:20;;;16769:57;16747:13;16702:20;16803:4;16791:17;;16769:57;:::i;:::-;16893:13;;16848:20;;;16915:57;16893:13;16848:20;16949:4;16937:17;;16915:57;:::i;:::-;16988:20;;16156:858;-1:-1:-1;;;;;;16156:858:1:o;17019:1767::-;17534:3;17572:6;17566:13;17588:53;17634:6;17629:3;17622:4;17614:6;17610:17;17588:53;:::i;:::-;17672:6;17666:13;17688:68;17747:8;17738:6;17733:3;17729:16;17722:4;17714:6;17710:17;17688:68;:::i;:::-;17834:13;;17782:16;;;17778:31;;17856:57;17834:13;17778:31;17890:4;17878:17;;17856:57;:::i;:::-;17944:6;17938:13;17960:72;18023:8;18012;18005:5;18001:20;17994:4;17986:6;17982:17;17960:72;:::i;:::-;18114:13;;18058:20;;;;18054:35;;18136:57;18114:13;18054:35;18170:4;18158:17;;18136:57;:::i;:::-;18224:6;18218:13;18240:72;18303:8;18292;18285:5;18281:20;18274:4;18266:6;18262:17;18240:72;:::i;:::-;18394:13;;18338:20;;;;18334:35;;18416:57;18394:13;18334:35;18450:4;18438:17;;18416:57;:::i;:::-;18504:6;18498:13;18520:72;18583:8;18572;18565:5;18561:20;18554:4;18546:6;18542:17;18520:72;:::i;:::-;18671:13;;18615:20;;;;18611:35;;18693:54;18671:13;18611:35;18727:4;18715:17;;18693:54;:::i;:::-;18763:17;;17019:1767;-1:-1:-1;;;;;;;;;;;17019:1767:1:o;18791:1641::-;19258:3;19296:6;19290:13;19322:4;19335:51;19379:6;19374:3;19369:2;19361:6;19357:15;19335:51;:::i;:::-;19449:13;;19408:16;;;;19471:55;19449:13;19408:16;19493:15;;;19471:55;:::i;:::-;19593:13;;19548:20;;;19615:55;19593:13;19548:20;19637:15;;;19615:55;:::i;:::-;19737:13;;19692:20;;;19759:55;19737:13;19692:20;19781:15;;;19759:55;:::i;:::-;19881:13;;19836:20;;;19903:55;19881:13;19836:20;19925:15;;;19903:55;:::i;:::-;20025:13;;19980:20;;;20047:55;20025:13;19980:20;20069:15;;;20047:55;:::i;:::-;20169:13;;20124:20;;;20191:55;20169:13;20124:20;20213:15;;;20191:55;:::i;:::-;20313:13;;20268:20;;;20335:55;20313:13;20268:20;20357:15;;;20335:55;:::i;:::-;20406:20;;;;;18791:1641;-1:-1:-1;;;;;;;;;;;18791:1641:1:o;20437:1449::-;20856:3;20894:6;20888:13;20920:4;20933:51;20977:6;20972:3;20967:2;20959:6;20955:15;20933:51;:::i;:::-;21047:13;;21006:16;;;;21069:55;21047:13;21006:16;21091:15;;;21069:55;:::i;:::-;21191:13;;21146:20;;;21213:55;21191:13;21146:20;21235:15;;;21213:55;:::i;:::-;21335:13;;21290:20;;;21357:55;21335:13;21290:20;21379:15;;;21357:55;:::i;:::-;21479:13;;21434:20;;;21501:55;21479:13;21434:20;21523:15;;;21501:55;:::i;:::-;21623:13;;21578:20;;;21645:55;21623:13;21578:20;21667:15;;;21645:55;:::i;:::-;21767:13;;21722:20;;;21789:55;21767:13;21722:20;21811:15;;;21789:55;:::i;:::-;21860:20;;;;;20437:1449;-1:-1:-1;;;;;;;;;;20437:1449:1:o;22021:1886::-;22682:66;22677:3;22670:79;22652:3;22778:6;22772:13;22794:62;22849:6;22844:2;22839:3;22835:12;22828:4;22820:6;22816:17;22794:62;:::i;:::-;-1:-1:-1;;;22915:2:1;22875:16;;;22907:11;;;22900:67;22992:13;;23014:63;22992:13;23063:2;23055:11;;23048:4;23036:17;;23014:63;:::i;:::-;23142:66;23137:2;23096:17;;;;23129:11;;;23122:87;23238:34;23233:2;23225:11;;23218:55;23303:34;23297:3;23289:12;;23282:56;23368:34;23362:3;23354:12;;23347:56;23433:34;23427:3;23419:12;;23412:56;23498:34;23492:3;23484:12;;23477:56;23563:34;23557:3;23549:12;;23542:56;23628:34;23622:3;23614:12;;23607:56;23693:66;23687:3;23679:12;;23672:88;-1:-1:-1;;;23784:3:1;23776:12;;23769:46;23831:70;23861:39;23895:3;23887:12;;23879:6;23861:39;:::i;:::-;-1:-1:-1;;;21956:27:1;;22008:1;21999:11;;21891:125;23831:70;23824:77;22021:1886;-1:-1:-1;;;;;;22021:1886:1:o;23912:448::-;24174:31;24169:3;24162:44;24144:3;24235:6;24229:13;24251:62;24306:6;24301:2;24296:3;24292:12;24285:4;24277:6;24273:17;24251:62;:::i;:::-;24333:16;;;;24351:2;24329:25;;23912:448;-1:-1:-1;;23912:448:1:o;26000:125::-;26040:4;26068:1;26065;26062:8;26059:34;;;26073:18;;:::i;:::-;-1:-1:-1;26110:9:1;;26000:125::o;26130:128::-;26170:3;26201:1;26197:6;26194:1;26191:13;26188:39;;;26207:18;;:::i;:::-;-1:-1:-1;26243:9:1;;26130:128::o;27356:414::-;27558:2;27540:21;;;27597:2;27577:18;;;27570:30;27636:34;27631:2;27616:18;;27609:62;-1:-1:-1;;;27702:2:1;27687:18;;27680:48;27760:3;27745:19;;27356:414::o;27775:135::-;27814:3;-1:-1:-1;;27835:17:1;;27832:43;;;27855:18;;:::i;:::-;-1:-1:-1;27902:1:1;27891:13;;27775:135::o;27915:168::-;27955:7;28021:1;28017;28013:6;28009:14;28006:1;28003:21;27998:1;27991:9;27984:17;27980:45;27977:71;;;28028:18;;:::i;:::-;-1:-1:-1;28068:9:1;;27915:168::o;28088:500::-;-1:-1:-1;;;;;28357:15:1;;;28339:34;;28409:15;;28404:2;28389:18;;28382:43;28456:2;28441:18;;28434:34;;;28504:3;28499:2;28484:18;;28477:31;;;28282:4;;28525:57;;28562:19;;28554:6;28525:57;:::i;28593:249::-;28662:6;28715:2;28703:9;28694:7;28690:23;28686:32;28683:52;;;28731:1;28728;28721:12;28683:52;28763:9;28757:16;28782:30;28806:5;28782:30;:::i;28847:127::-;28908:10;28903:3;28899:20;28896:1;28889:31;28939:4;28936:1;28929:15;28963:4;28960:1;28953:15

Swarm Source

ipfs://f8dfb7d78791f87aa04e9062cbf7945bd93e991e057b6a6520ccf90955e87268
Loading...
Loading
Loading...
Loading
[ 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.