ETH Price: $3,411.08 (+3.52%)

Token

GamePass (GPASS)
 

Overview

Max Total Supply

90 GPASS

Holders

52

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
templeofgoon.eth
Balance
1 GPASS
0xb506c02f6b5b84e630e21b56347f2ec1a293b29f
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:
GamePass

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

/**
 *Submitted for verification at Etherscan.io on 2021-08-27
*/

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

//File: contracts/Realms.sol

interface LootInterface {
    function ownerOf(uint256 tokenId) external view returns (address owner);
    function balanceOf(address owner) external view returns (uint256 balance);
    function tokenOfOwnerByIndex(address owner, uint256 index)
        external
        view
        returns (uint256 tokenId);
}


contract GamePass is ERC721Enumerable, ReentrancyGuard, Ownable {
    uint256 public constant ELITE_MINT_PRICE = 3133700000000000000; //elite eth

    string[] private priorityTypes = [
        "Standard",
        "Standard +",
        "Prestige",
        "Elite"        
    ];
    
    string[] private accessTypes = [
        "Alpha",
        "Beta",
        "Early bird",
        "Regular"        
    ];

    string[] private bonusTypes = [
        "Common",
        "Uncommon",
        "Epic",
        "Legendary",
        "Mythic",
        "Exotic",
        "Transcendent"
    ];
    
    string[] private seriesTypes = [
        "A",
        "B",
        "C",
        "D",
        "E",
        "F"        
    ];
    
    //Loot Contract
    address public lootAddress = 0xFF9C1b15B16263C61d017ee9F65C50e4AE0113D7;    
    address public blootAddress = 0x4F8730E0b32B04beaa5757e5aea3aeF970E5B613;
    LootInterface lootContract = LootInterface(lootAddress);
    LootInterface blootContract = LootInterface(blootAddress);
    
    uint private lootOwnersSupply = 0;
    uint private blootOwnersSupply = 0;
    uint private eliteOwnersSupply = 0;
    uint private maxSupply = 7773;
    
    function random(string memory input) internal pure returns (uint256) {
        return uint256(keccak256(abi.encodePacked(input)));
    }
    
    function getPriorityType(uint256 tokenId) public view returns (string memory) {
        uint256 rand = random(string(abi.encodePacked("PRIORITY", toString(tokenId))));
        uint256 priority = rand % 199;
        string memory output;

        if (priority > 197) {
            output = priorityTypes[3];
        } else if (priority > 187) {
            output = priorityTypes[2];
        } else if (priority > 121) {
            output = priorityTypes[1];
        } else {
            output = priorityTypes[0];
        }
        return output;
    }
    
    function getAccessType(uint256 tokenId) public view returns (string memory) {
        uint256 rand = random(string(abi.encodePacked("ACCESS", toString(tokenId))));
        uint256 accessType = rand % 21;
        string memory output;

        if (accessType > 19) {
            output = accessTypes[0];
        } else if (accessType > 17) {
            output = accessTypes[1];
        } else if (accessType > 14) {
            output = accessTypes[2];
        } else {
            output = accessTypes[3];
        }
        return output;
    }
    
    function getBonusType(uint256 tokenId) public view returns (string memory) {
        uint256 rand = random(string(abi.encodePacked("BONUS", toString(tokenId))));
        uint256 bonusType = rand % 997;
        string memory output;

        if (bonusType > 995) {
            output = bonusTypes[6];
        } else if (bonusType > 992) {
            output = bonusTypes[5];
        } else if (bonusType > 981) {
            output = bonusTypes[4];
        } else if (bonusType > 956) {
            output = bonusTypes[3];
        } else if (bonusType > 896) {
            output = bonusTypes[2];
        } else if (bonusType > 696) {
            output = bonusTypes[1];                    
        } else {
            output = bonusTypes[0];
        }
        return output;
    }
    
    function getSeriesType(uint256 tokenId) public view returns (string memory) {
        uint256 rand1 = random(string(abi.encodePacked("SERIES_ABCFAB", toString(tokenId))));
        uint256 rand2 = random(string(abi.encodePacked("SERIES_DFABEA", toString(tokenId))));
        uint256 rand3 = random(string(abi.encodePacked("SERIES_EEFACA", toString(tokenId))));
        uint256 seriesType1 = rand1 % 17;
        uint256 seriesType2 = rand2 % 17;
        uint256 seriesType3 = rand3 % 17;
        string memory output;

        if (seriesType1 > 15) {
            output = seriesTypes[6];
        } else if (seriesType1 > 12) {
            output = seriesTypes[5];
        } else if (seriesType1 > 10) {
            output = seriesTypes[4];
        } else if (seriesType1 > 8) {
            output = seriesTypes[3];
        } else if (seriesType1 > 6) {
            output = seriesTypes[2];
        } else if (seriesType1 > 4) {
            output = seriesTypes[1];                    
        } else {
            output = seriesTypes[0];
        }

        if (seriesType2 > 15) {
            output = string(abi.encodePacked(output, seriesTypes[6]));
        } else if (seriesType2 > 12) {
            output = string(abi.encodePacked(output, seriesTypes[5]));
        } else if (seriesType2 > 10) {
            output = string(abi.encodePacked(output, seriesTypes[4]));
        } else if (seriesType2 > 8) {
            output = string(abi.encodePacked(output, seriesTypes[3]));
        } else if (seriesType2 > 6) {
            output = string(abi.encodePacked(output, seriesTypes[2]));
        } else if (seriesType2 > 4) {
            output = string(abi.encodePacked(output, seriesTypes[1]));
        } else {
            output = string(abi.encodePacked(output, seriesTypes[0]));
        }

        if (seriesType3 > 15) {
            output = string(abi.encodePacked(output, seriesTypes[6]));
        } else if (seriesType3 > 12) {
            output = string(abi.encodePacked(output, seriesTypes[5]));
        } else if (seriesType3 > 10) {
            output = string(abi.encodePacked(output, seriesTypes[4]));
        } else if (seriesType3 > 8) {
            output = string(abi.encodePacked(output, seriesTypes[3]));
        } else if (seriesType3 > 6) {
            output = string(abi.encodePacked(output, seriesTypes[2]));
        } else if (seriesType3 > 4) {
            output = string(abi.encodePacked(output, seriesTypes[1]));
        } else {
            output = string(abi.encodePacked(output, seriesTypes[0]));
        }
        return output;
    }
    
    function tokenURI(uint256 tokenId) override public view returns (string memory) {
        string memory output = 
            string(abi.encodePacked(
                '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 300 100"><style>.base { fill: black; font-family: serif; font-size: 14px; }</style><rect width="100%" height="100%" fill="#ffffff" /><text x="10" y="20" class="base">Priority: ',
                getAccessType(tokenId),
                '</text><text x="10" y="40" class="base">Level: ',
                getPriorityType(tokenId),
                '</text><text x="10" y="60" class="base">Starting bonus: ',
                getBonusType(tokenId),
                '</text><text x="10" y="80" class="base">Key: ',
                getSeriesType(tokenId),
                '</text></svg>'
            ));

       
        
        string memory json = Base64.encode(bytes(string(abi.encodePacked('{"name": "GamePass #', toString(tokenId), '", "description": "GamePass is a randomized priority that grants players access to the games in *Loot metaverse. Feel free to use GamePass in any way you want.", "image": "data:image/svg+xml;base64,', Base64.encode(bytes(output)), '"}'))));
        output = string(abi.encodePacked('data:application/json;base64,', json));

        return output;
    }

    function lootOwnerFreeClaim() public nonReentrant {
        require(lootOwnersSupply < 3818, "No more loot owner claims");
        require(totalSupply() < maxSupply, "No more tokens to mint");
        require(lootContract.balanceOf(msg.sender) > 0, "Must own a loot to claim from this method");
        uint index = totalSupply();
        lootOwnersSupply = lootOwnersSupply + 1;
        _safeMint(_msgSender(), index);
    }
    
    function blootOwnerFreeClaim() public nonReentrant {
        require(blootOwnersSupply < 3818, "No more bloot owner claims");
        require(totalSupply() < maxSupply, "No more tokens to mint");
        require(blootContract.balanceOf(msg.sender) > 0, "Must own a bloot to claim from this method");
        uint index = totalSupply();
        blootOwnersSupply = blootOwnersSupply + 1;
        _safeMint(_msgSender(), index);
    }
    
    function eliteClaim() public nonReentrant payable {
        require(eliteOwnersSupply < 137, "No more tokens to mint");
        require(totalSupply() < maxSupply, "No more tokens to mint");
        require(msg.value >= ELITE_MINT_PRICE, "Payment too low, try 3.1337 eth");
        uint index = totalSupply();
        eliteOwnersSupply = eliteOwnersSupply + 1;
        _safeMint(_msgSender(), index);
    }
    
    function withdrawFunds() public onlyOwner {
        uint balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }
    
    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("GamePass", "GPASS") Ownable() {}
}

/// [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":"ELITE_MINT_PRICE","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":"blootAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blootOwnerFreeClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"eliteClaim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getAccessType","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"getBonusType","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getPriorityType","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSeriesType","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"lootAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lootOwnerFreeClaim","outputs":[],"stateMutability":"nonpayable","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":"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"},{"inputs":[],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60086101008181526714dd185b99185c9960c21b610120526080908152600a610140908152695374616e64617264202b60b01b6101605260a05261018091825267507265737469676560c01b6101a05260c09190915261020060405260056101c090815264456c69746560d81b6101e05260e0526200008390600c90600462000438565b50604051806080016040528060405180604001604052806005815260200164416c70686160d81b8152508152602001604051806040016040528060048152602001634265746160e01b81525081526020016040518060400160405280600a81526020016911585c9b1e48189a5c9960b21b8152508152602001604051806040016040528060078152602001662932b3bab630b960c91b815250815250600d9060046200013192919062000438565b506040805161012081018252600660e082018181526521b7b6b6b7b760d11b61010084015282528251808401845260088152672ab731b7b6b6b7b760c11b602082810191909152808401919091528351808501855260048152634570696360e01b81830152838501528351808501855260098152684c6567656e6461727960b81b81830152606084015283518085018552828152654d797468696360d01b818301526080840152835180850185529182526545786f74696360d01b8282015260a08301919091528251808401909352600c83526b151c985b9cd8d95b99195b9d60a21b9083015260c08101919091526200023090600e9060076200049c565b506040805161010081018252600160c08201818152604160f81b60e0840152825282518084018452818152602160f91b6020828101919091528084019190915283518085018552828152604360f81b818301528385015283518085018552828152601160fa1b81830152606084015283518085018552828152604560f81b8183015260808401528351808501909452908352602360f91b9083015260a0810191909152620002e390600f906006620004ee565b506010805473ff9c1b15b16263c61d017ee9f65c50e4ae0113d76001600160a01b0319918216811790925560118054734f8730e0b32b04beaa5757e5aea3aef970e5b6139083168117909155601280548316909317909255601380549091169091179055600060148190556015819055601655611e5d6017553480156200036957600080fd5b50604080518082018252600881526747616d655061737360c01b602080830191825283518085019094526005845264475041535360d81b908401528151919291620003b79160009162000540565b508051620003cd90600190602084019062000540565b50506001600a5550620003e033620003e6565b62000682565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280548282559060005260206000209081019282156200048a579160200282015b828111156200048a57825180516200047991849160209091019062000540565b509160200191906001019062000459565b5062000498929150620005cb565b5090565b8280548282559060005260206000209081019282156200048a579160200282015b828111156200048a5782518051620004dd91849160209091019062000540565b5091602001919060010190620004bd565b8280548282559060005260206000209081019282156200048a579160200282015b828111156200048a57825180516200052f91849160209091019062000540565b50916020019190600101906200050f565b8280546200054e9062000645565b90600052602060002090601f016020900481019282620005725760008555620005bd565b82601f106200058d57805160ff1916838001178555620005bd565b82800160010185558215620005bd579182015b82811115620005bd578251825591602001919060010190620005a0565b5062000498929150620005ec565b8082111562000498576000620005e2828262000603565b50600101620005cb565b5b80821115620004985760008155600101620005ed565b508054620006119062000645565b6000825580601f1062000622575050565b601f016020900490600052602060002090810190620006429190620005ec565b50565b600181811c908216806200065a57607f821691505b602082108114156200067c57634e487b7160e01b600052602260045260246000fd5b50919050565b61316a80620006926000396000f3fe6080604052600436106101cd5760003560e01c80636352211e116100f7578063b8c0e61011610095578063e985e9c511610064578063e985e9c5146104f8578063f2fde38b14610541578063f3db682b14610561578063fed862d71461058157600080fd5b8063b8c0e61014610494578063c33fd59d1461049c578063c87b56dd146104b8578063d80678f1146104d857600080fd5b80638da5cb5b116100d15780638da5cb5b1461042157806395d89b411461043f578063a22cb46514610454578063b88d4fde1461047457600080fd5b80636352211e146103cc57806370a08231146103ec578063715018a61461040c57600080fd5b806324600fc31161016f57806333b668281161013e57806333b668281461035757806342842e0e146103775780634f6ccce714610397578063584b931a146103b757600080fd5b806324600fc3146102e25780632e24a2c0146102f75780632f745c591461031757806332798ff01461033757600080fd5b8063095ea7b3116101ab578063095ea7b3146102615780630e4393261461028357806318160ddd146102a357806323b872dd146102c257600080fd5b806301ffc9a7146101d257806306fdde0314610207578063081812fc14610229575b600080fd5b3480156101de57600080fd5b506101f26101ed366004612753565b610596565b60405190151581526020015b60405180910390f35b34801561021357600080fd5b5061021c6105c1565b6040516101fe9190612e26565b34801561023557600080fd5b5061024961024436600461278d565b610653565b6040516001600160a01b0390911681526020016101fe565b34801561026d57600080fd5b5061028161027c366004612729565b6106ed565b005b34801561028f57600080fd5b50601054610249906001600160a01b031681565b3480156102af57600080fd5b506008545b6040519081526020016101fe565b3480156102ce57600080fd5b506102816102dd3660046125d5565b610803565b3480156102ee57600080fd5b50610281610834565b34801561030357600080fd5b5061021c61031236600461278d565b610891565b34801561032357600080fd5b506102b4610332366004612729565b610a7b565b34801561034357600080fd5b5061021c61035236600461278d565b610b11565b34801561036357600080fd5b5061021c61037236600461278d565b610fee565b34801561038357600080fd5b506102816103923660046125d5565b61108c565b3480156103a357600080fd5b506102b46103b236600461278d565b6110a7565b3480156103c357600080fd5b5061028161113a565b3480156103d857600080fd5b506102496103e736600461278d565b6112e6565b3480156103f857600080fd5b506102b4610407366004612580565b61135d565b34801561041857600080fd5b506102816113e4565b34801561042d57600080fd5b50600b546001600160a01b0316610249565b34801561044b57600080fd5b5061021c61141a565b34801561046057600080fd5b5061028161046f3660046126ed565b611429565b34801561048057600080fd5b5061028161048f366004612611565b6114ee565b610281611526565b3480156104a857600080fd5b506102b4672b7d238c04a4400081565b3480156104c457600080fd5b5061021c6104d336600461278d565b611613565b3480156104e457600080fd5b5061021c6104f336600461278d565b6116c6565b34801561050457600080fd5b506101f26105133660046125a2565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561054d57600080fd5b5061028161055c366004612580565b6117c2565b34801561056d57600080fd5b50601154610249906001600160a01b031681565b34801561058d57600080fd5b5061028161185d565b60006001600160e01b0319821663780e9d6360e01b14806105bb57506105bb826119fe565b92915050565b6060600080546105d090613006565b80601f01602080910402602001604051908101604052809291908181526020018280546105fc90613006565b80156106495780601f1061061e57610100808354040283529160200191610649565b820191906000526020600020905b81548152906001019060200180831161062c57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166106d15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006106f8826112e6565b9050806001600160a01b0316836001600160a01b031614156107665760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016106c8565b336001600160a01b038216148061078257506107828133610513565b6107f45760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016106c8565b6107fe8383611a4e565b505050565b61080d3382611abc565b6108295760405162461bcd60e51b81526004016106c890612ef0565b6107fe838383611baf565b600b546001600160a01b0316331461085e5760405162461bcd60e51b81526004016106c890612ebb565b6040514790339082156108fc029083906000818181858888f1935050505015801561088d573d6000803e3d6000fd5b5050565b606060006108c56108a184611d5a565b6040516020016108b191906128d4565b604051602081830303815290604052611e58565b905060006108d460158361305c565b90506060601382111561098f57600d6000815481106108f5576108f56130b2565b90600052602060002001805461090a90613006565b80601f016020809104026020016040519081016040528092919081815260200182805461093690613006565b80156109835780601f1061095857610100808354040283529160200191610983565b820191906000526020600020905b81548152906001019060200180831161096657829003601f168201915b50505050509050610a73565b60118211156109ac57600d6001815481106108f5576108f56130b2565b600e8211156109c957600d6002815481106108f5576108f56130b2565b600d6003815481106109dd576109dd6130b2565b9060005260206000200180546109f290613006565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1e90613006565b8015610a6b5780601f10610a4057610100808354040283529160200191610a6b565b820191906000526020600020905b815481529060010190602001808311610a4e57829003601f168201915b505050505090505b949350505050565b6000610a868361135d565b8210610ae85760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016106c8565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b60606000610b31610b2184611d5a565b6040516020016108b19190612bff565b90506000610b51610b4185611d5a565b6040516020016108b19190612c6c565b90506000610b71610b6186611d5a565b6040516020016108b19190612932565b90506000610b8060118561305c565b90506000610b8f60118561305c565b90506000610b9e60118561305c565b90506060600f841115610c5957600f600681548110610bbf57610bbf6130b2565b906000526020600020018054610bd490613006565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0090613006565b8015610c4d5780601f10610c2257610100808354040283529160200191610c4d565b820191906000526020600020905b815481529060010190602001808311610c3057829003601f168201915b50505050509050610d94565b600c841115610c7657600f600581548110610bbf57610bbf6130b2565b600a841115610c9357600f600481548110610bbf57610bbf6130b2565b6008841115610cb057600f600381548110610bbf57610bbf6130b2565b6006841115610ccd57600f600281548110610bbf57610bbf6130b2565b6004841115610cea57600f600181548110610bbf57610bbf6130b2565b600f600081548110610cfe57610cfe6130b2565b906000526020600020018054610d1390613006565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3f90613006565b8015610d8c5780601f10610d6157610100808354040283529160200191610d8c565b820191906000526020600020905b815481529060010190602001808311610d6f57829003601f168201915b505050505090505b600f831115610de35780600f600681548110610db257610db26130b2565b90600052602060002001604051602001610dcd929190612823565b6040516020818303038152906040529050610ebb565b600c831115610e015780600f600581548110610db257610db26130b2565b600a831115610e1f5780600f600481548110610db257610db26130b2565b6008831115610e3d5780600f600381548110610db257610db26130b2565b6006831115610e5b5780600f600281548110610db257610db26130b2565b6004831115610e795780600f600181548110610db257610db26130b2565b80600f600081548110610e8e57610e8e6130b2565b90600052602060002001604051602001610ea9929190612823565b60405160208183030381529060405290505b600f821115610f0a5780600f600681548110610ed957610ed96130b2565b90600052602060002001604051602001610ef4929190612823565b6040516020818303038152906040529050610fe2565b600c821115610f285780600f600581548110610ed957610ed96130b2565b600a821115610f465780600f600481548110610ed957610ed96130b2565b6008821115610f645780600f600381548110610ed957610ed96130b2565b6006821115610f825780600f600281548110610ed957610ed96130b2565b6004821115610fa05780600f600181548110610ed957610ed96130b2565b80600f600081548110610fb557610fb56130b2565b90600052602060002001604051602001610fd0929190612823565b60405160208183030381529060405290505b98975050505050505050565b6060600061100e610ffe84611d5a565b6040516020016108b19190612902565b9050600061101d60c78361305c565b9050606060c582111561103e57600c6003815481106108f5576108f56130b2565b60bb82111561105b57600c6002815481106108f5576108f56130b2565b607982111561107857600c6001815481106108f5576108f56130b2565b600c6000815481106109dd576109dd6130b2565b6107fe838383604051806020016040528060008152506114ee565b60006110b260085490565b82106111155760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016106c8565b60088281548110611128576111286130b2565b90600052602060002001549050919050565b6002600a54141561115d5760405162461bcd60e51b81526004016106c890612f41565b6002600a55601554610eea116111b55760405162461bcd60e51b815260206004820152601a60248201527f4e6f206d6f726520626c6f6f74206f776e657220636c61696d7300000000000060448201526064016106c8565b601754600854106111d85760405162461bcd60e51b81526004016106c890612e8b565b6013546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561121c57600080fd5b505afa158015611230573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125491906127a6565b116112b45760405162461bcd60e51b815260206004820152602a60248201527f4d757374206f776e206120626c6f6f7420746f20636c61696d2066726f6d20746044820152691a1a5cc81b595d1a1bd960b21b60648201526084016106c8565b60006112bf60085490565b905060155460016112d09190612f78565b6015556112de335b82611e89565b506001600a55565b6000818152600260205260408120546001600160a01b0316806105bb5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016106c8565b60006001600160a01b0382166113c85760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016106c8565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b0316331461140e5760405162461bcd60e51b81526004016106c890612ebb565b6114186000611ea3565b565b6060600180546105d090613006565b6001600160a01b0382163314156114825760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016106c8565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6114f83383611abc565b6115145760405162461bcd60e51b81526004016106c890612ef0565b61152084848484611ef5565b50505050565b6002600a5414156115495760405162461bcd60e51b81526004016106c890612f41565b6002600a556016546089116115705760405162461bcd60e51b81526004016106c890612e8b565b601754600854106115935760405162461bcd60e51b81526004016106c890612e8b565b672b7d238c04a440003410156115eb5760405162461bcd60e51b815260206004820152601f60248201527f5061796d656e7420746f6f206c6f772c2074727920332e31333337206574680060448201526064016106c8565b60006115f660085490565b905060165460016116079190612f78565b6016556112de336112d8565b6060600061162083610891565b61162984610fee565b611632856116c6565b61163b86610b11565b60405160200161164e9493929190612967565b6040516020818303038152906040529050600061169b61166d85611d5a565b61167684611f28565b604051602001611687929190612c94565b604051602081830303815290604052611f28565b9050806040516020016116ae9190612c27565b60408051601f19818403018152919052949350505050565b606060006116e66116d684611d5a565b6040516020016108b19190612bd2565b905060006116f66103e58361305c565b905060606103e382111561171857600e6006815481106108f5576108f56130b2565b6103e082111561173657600e6005815481106108f5576108f56130b2565b6103d582111561175457600e6004815481106108f5576108f56130b2565b6103bc82111561177257600e6003815481106108f5576108f56130b2565b61038082111561179057600e6002815481106108f5576108f56130b2565b6102b88211156117ae57600e6001815481106108f5576108f56130b2565b600e6000815481106109dd576109dd6130b2565b600b546001600160a01b031633146117ec5760405162461bcd60e51b81526004016106c890612ebb565b6001600160a01b0381166118515760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106c8565b61185a81611ea3565b50565b6002600a5414156118805760405162461bcd60e51b81526004016106c890612f41565b6002600a55601454610eea116118d85760405162461bcd60e51b815260206004820152601960248201527f4e6f206d6f7265206c6f6f74206f776e657220636c61696d730000000000000060448201526064016106c8565b601754600854106118fb5760405162461bcd60e51b81526004016106c890612e8b565b6012546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561193f57600080fd5b505afa158015611953573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197791906127a6565b116119d65760405162461bcd60e51b815260206004820152602960248201527f4d757374206f776e2061206c6f6f7420746f20636c61696d2066726f6d2074686044820152681a5cc81b595d1a1bd960ba1b60648201526084016106c8565b60006119e160085490565b905060145460016119f29190612f78565b6014556112de336112d8565b60006001600160e01b031982166380ac58cd60e01b1480611a2f57506001600160e01b03198216635b5e139f60e01b145b806105bb57506301ffc9a760e01b6001600160e01b03198316146105bb565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611a83826112e6565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611b355760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016106c8565b6000611b40836112e6565b9050806001600160a01b0316846001600160a01b03161480611b7b5750836001600160a01b0316611b7084610653565b6001600160a01b0316145b80610a7357506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16610a73565b826001600160a01b0316611bc2826112e6565b6001600160a01b031614611c2a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016106c8565b6001600160a01b038216611c8c5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016106c8565b611c9783838361208e565b611ca2600082611a4e565b6001600160a01b0383166000908152600360205260408120805460019290611ccb908490612fc3565b90915550506001600160a01b0382166000908152600360205260408120805460019290611cf9908490612f78565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b606081611d7e5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611da85780611d9281613041565b9150611da19050600a83612f90565b9150611d82565b60008167ffffffffffffffff811115611dc357611dc36130c8565b6040519080825280601f01601f191660200182016040528015611ded576020820181803683370190505b5090505b8415610a7357611e02600183612fc3565b9150611e0f600a8661305c565b611e1a906030612f78565b60f81b818381518110611e2f57611e2f6130b2565b60200101906001600160f81b031916908160001a905350611e51600a86612f90565b9450611df1565b600081604051602001611e6b9190612807565b60408051601f19818403018152919052805160209091012092915050565b61088d828260405180602001604052806000815250612146565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611f00848484611baf565b611f0c84848484612179565b6115205760405162461bcd60e51b81526004016106c890612e39565b805160609080611f48575050604080516020810190915260008152919050565b60006003611f57836002612f78565b611f619190612f90565b611f6c906004612fa4565b90506000611f7b826020612f78565b67ffffffffffffffff811115611f9357611f936130c8565b6040519080825280601f01601f191660200182016040528015611fbd576020820181803683370190505b50905060006040518060600160405280604081526020016130f5604091399050600181016020830160005b86811015612049576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101611fe8565b506003860660018114612063576002811461207457612080565b613d3d60f01b600119830152612080565b603d60f81b6000198301525b505050918152949350505050565b6001600160a01b0383166120e9576120e481600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61210c565b816001600160a01b0316836001600160a01b03161461210c5761210c8382612286565b6001600160a01b038216612123576107fe81612323565b826001600160a01b0316826001600160a01b0316146107fe576107fe82826123d2565b6121508383612416565b61215d6000848484612179565b6107fe5760405162461bcd60e51b81526004016106c890612e39565b60006001600160a01b0384163b1561227b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906121bd903390899088908890600401612de9565b602060405180830381600087803b1580156121d757600080fd5b505af1925050508015612207575060408051601f3d908101601f1916820190925261220491810190612770565b60015b612261573d808015612235576040519150601f19603f3d011682016040523d82523d6000602084013e61223a565b606091505b5080516122595760405162461bcd60e51b81526004016106c890612e39565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610a73565b506001949350505050565b600060016122938461135d565b61229d9190612fc3565b6000838152600760205260409020549091508082146122f0576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061233590600190612fc3565b6000838152600960205260408120546008805493945090928490811061235d5761235d6130b2565b90600052602060002001549050806008838154811061237e5761237e6130b2565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806123b6576123b661309c565b6001900381819060005260206000200160009055905550505050565b60006123dd8361135d565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b03821661246c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016106c8565b6000818152600260205260409020546001600160a01b0316156124d15760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016106c8565b6124dd6000838361208e565b6001600160a01b0382166000908152600360205260408120805460019290612506908490612f78565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b80356001600160a01b038116811461257b57600080fd5b919050565b60006020828403121561259257600080fd5b61259b82612564565b9392505050565b600080604083850312156125b557600080fd5b6125be83612564565b91506125cc60208401612564565b90509250929050565b6000806000606084860312156125ea57600080fd5b6125f384612564565b925061260160208501612564565b9150604084013590509250925092565b6000806000806080858703121561262757600080fd5b61263085612564565b935061263e60208601612564565b925060408501359150606085013567ffffffffffffffff8082111561266257600080fd5b818701915087601f83011261267657600080fd5b813581811115612688576126886130c8565b604051601f8201601f19908116603f011681019083821181831017156126b0576126b06130c8565b816040528281528a60208487010111156126c957600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561270057600080fd5b61270983612564565b91506020830135801515811461271e57600080fd5b809150509250929050565b6000806040838503121561273c57600080fd5b61274583612564565b946020939093013593505050565b60006020828403121561276557600080fd5b813561259b816130de565b60006020828403121561278257600080fd5b815161259b816130de565b60006020828403121561279f57600080fd5b5035919050565b6000602082840312156127b857600080fd5b5051919050565b600081518084526127d7816020860160208601612fda565b601f01601f19169290920160200192915050565b600081516127fd818560208601612fda565b9290920192915050565b60008251612819818460208701612fda565b9190910192915050565b6000835160206128368285838901612fda565b845491840191600090600181811c908083168061285457607f831692505b85831081141561287257634e487b7160e01b85526022600452602485fd5b8080156128865760018114612897576128c4565b60ff198516885283880195506128c4565b60008b81526020902060005b858110156128bc5781548a8201529084019088016128a3565b505083880195505b50939a9950505050505050505050565b6541434345535360d01b8152600082516128f5816006850160208701612fda565b9190910160060192915050565b675052494f5249545960c01b815260008251612925816008850160208701612fda565b9190910160080192915050565b6c5345524945535f45454641434160981b81526000825161295a81600d850160208701612fda565b91909101600d0192915050565b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323081527f30302f73766722207072657365727665417370656374526174696f3d22784d6960208201527f6e594d696e206d656574222076696577426f783d22302030203330302031303060408201527f223e3c7374796c653e2e62617365207b2066696c6c3a20626c61636b3b20666f60608201527f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a2031347060808201527f783b207d3c2f7374796c653e3c726563742077696474683d223130302522206860a08201527f65696768743d2231303025222066696c6c3d222366666666666622202f3e3c7460c08201527f65787420783d2231302220793d2232302220636c6173733d2262617365223e5060e08201526803934b7b934ba3c9d160bd1b61010082015260006101098651612abe8183860160208b01612fda565b610fe2612bb9612bb3612b74612b6e612b1f612b1988888c01017f3c2f746578743e3c7465787420783d2231302220793d2234302220636c61737381526e01e913130b9b2911f2632bb32b61d1608d1b6020820152602f0190565b8d6127eb565b7f3c2f746578743e3c7465787420783d2231302220793d2236302220636c61737381527f3d2262617365223e5374617274696e6720626f6e75733a200000000000000000602082015260380190565b8a6127eb565b7f3c2f746578743e3c7465787420783d2231302220793d2238302220636c61737381526c01e913130b9b2911f25b2bc9d1609d1b6020820152602d0190565b876127eb565b6c1e17ba32bc3a1f1e17b9bb339f60991b8152600d0190565b64424f4e555360d81b815260008251612bf2816005850160208701612fda565b9190910160050192915050565b6c29a2a924a2a9afa0a121a320a160991b81526000825161295a81600d850160208701612fda565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251612c5f81601d850160208701612fda565b91909101601d0192915050565b6c5345524945535f44464142454160981b81526000825161295a81600d850160208701612fda565b737b226e616d65223a202247616d6550617373202360601b81528251600090612cc4816014850160208801612fda565b7f222c20226465736372697074696f6e223a202247616d655061737320697320616014918401918201527f2072616e646f6d697a6564207072696f726974792074686174206772616e747360348201527f20706c61796572732061636365737320746f207468652067616d657320696e2060548201527f2a4c6f6f74206d65746176657273652e204665656c206672656520746f20757360748201527f652047616d655061737320696e20616e792077617920796f752077616e742e2260948201527f2c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b6260b482015265185cd94d8d0b60d21b60d48201528351612dce8160da840160208801612fda565b61227d60f01b60da929091019182015260dc01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612e1c908301846127bf565b9695505050505050565b60208152600061259b60208301846127bf565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b602080825260169082015275139bc81b5bdc99481d1bdad95b9cc81d1bc81b5a5b9d60521b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60008219821115612f8b57612f8b613070565b500190565b600082612f9f57612f9f613086565b500490565b6000816000190483118215151615612fbe57612fbe613070565b500290565b600082821015612fd557612fd5613070565b500390565b60005b83811015612ff5578181015183820152602001612fdd565b838111156115205750506000910152565b600181811c9082168061301a57607f821691505b6020821081141561303b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561305557613055613070565b5060010190565b60008261306b5761306b613086565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461185a57600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212200701ea50b66a3442fc9de999be1d5c6705b6b1f8c89607810426987888ff7aa664736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101cd5760003560e01c80636352211e116100f7578063b8c0e61011610095578063e985e9c511610064578063e985e9c5146104f8578063f2fde38b14610541578063f3db682b14610561578063fed862d71461058157600080fd5b8063b8c0e61014610494578063c33fd59d1461049c578063c87b56dd146104b8578063d80678f1146104d857600080fd5b80638da5cb5b116100d15780638da5cb5b1461042157806395d89b411461043f578063a22cb46514610454578063b88d4fde1461047457600080fd5b80636352211e146103cc57806370a08231146103ec578063715018a61461040c57600080fd5b806324600fc31161016f57806333b668281161013e57806333b668281461035757806342842e0e146103775780634f6ccce714610397578063584b931a146103b757600080fd5b806324600fc3146102e25780632e24a2c0146102f75780632f745c591461031757806332798ff01461033757600080fd5b8063095ea7b3116101ab578063095ea7b3146102615780630e4393261461028357806318160ddd146102a357806323b872dd146102c257600080fd5b806301ffc9a7146101d257806306fdde0314610207578063081812fc14610229575b600080fd5b3480156101de57600080fd5b506101f26101ed366004612753565b610596565b60405190151581526020015b60405180910390f35b34801561021357600080fd5b5061021c6105c1565b6040516101fe9190612e26565b34801561023557600080fd5b5061024961024436600461278d565b610653565b6040516001600160a01b0390911681526020016101fe565b34801561026d57600080fd5b5061028161027c366004612729565b6106ed565b005b34801561028f57600080fd5b50601054610249906001600160a01b031681565b3480156102af57600080fd5b506008545b6040519081526020016101fe565b3480156102ce57600080fd5b506102816102dd3660046125d5565b610803565b3480156102ee57600080fd5b50610281610834565b34801561030357600080fd5b5061021c61031236600461278d565b610891565b34801561032357600080fd5b506102b4610332366004612729565b610a7b565b34801561034357600080fd5b5061021c61035236600461278d565b610b11565b34801561036357600080fd5b5061021c61037236600461278d565b610fee565b34801561038357600080fd5b506102816103923660046125d5565b61108c565b3480156103a357600080fd5b506102b46103b236600461278d565b6110a7565b3480156103c357600080fd5b5061028161113a565b3480156103d857600080fd5b506102496103e736600461278d565b6112e6565b3480156103f857600080fd5b506102b4610407366004612580565b61135d565b34801561041857600080fd5b506102816113e4565b34801561042d57600080fd5b50600b546001600160a01b0316610249565b34801561044b57600080fd5b5061021c61141a565b34801561046057600080fd5b5061028161046f3660046126ed565b611429565b34801561048057600080fd5b5061028161048f366004612611565b6114ee565b610281611526565b3480156104a857600080fd5b506102b4672b7d238c04a4400081565b3480156104c457600080fd5b5061021c6104d336600461278d565b611613565b3480156104e457600080fd5b5061021c6104f336600461278d565b6116c6565b34801561050457600080fd5b506101f26105133660046125a2565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561054d57600080fd5b5061028161055c366004612580565b6117c2565b34801561056d57600080fd5b50601154610249906001600160a01b031681565b34801561058d57600080fd5b5061028161185d565b60006001600160e01b0319821663780e9d6360e01b14806105bb57506105bb826119fe565b92915050565b6060600080546105d090613006565b80601f01602080910402602001604051908101604052809291908181526020018280546105fc90613006565b80156106495780601f1061061e57610100808354040283529160200191610649565b820191906000526020600020905b81548152906001019060200180831161062c57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166106d15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006106f8826112e6565b9050806001600160a01b0316836001600160a01b031614156107665760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016106c8565b336001600160a01b038216148061078257506107828133610513565b6107f45760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016106c8565b6107fe8383611a4e565b505050565b61080d3382611abc565b6108295760405162461bcd60e51b81526004016106c890612ef0565b6107fe838383611baf565b600b546001600160a01b0316331461085e5760405162461bcd60e51b81526004016106c890612ebb565b6040514790339082156108fc029083906000818181858888f1935050505015801561088d573d6000803e3d6000fd5b5050565b606060006108c56108a184611d5a565b6040516020016108b191906128d4565b604051602081830303815290604052611e58565b905060006108d460158361305c565b90506060601382111561098f57600d6000815481106108f5576108f56130b2565b90600052602060002001805461090a90613006565b80601f016020809104026020016040519081016040528092919081815260200182805461093690613006565b80156109835780601f1061095857610100808354040283529160200191610983565b820191906000526020600020905b81548152906001019060200180831161096657829003601f168201915b50505050509050610a73565b60118211156109ac57600d6001815481106108f5576108f56130b2565b600e8211156109c957600d6002815481106108f5576108f56130b2565b600d6003815481106109dd576109dd6130b2565b9060005260206000200180546109f290613006565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1e90613006565b8015610a6b5780601f10610a4057610100808354040283529160200191610a6b565b820191906000526020600020905b815481529060010190602001808311610a4e57829003601f168201915b505050505090505b949350505050565b6000610a868361135d565b8210610ae85760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016106c8565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b60606000610b31610b2184611d5a565b6040516020016108b19190612bff565b90506000610b51610b4185611d5a565b6040516020016108b19190612c6c565b90506000610b71610b6186611d5a565b6040516020016108b19190612932565b90506000610b8060118561305c565b90506000610b8f60118561305c565b90506000610b9e60118561305c565b90506060600f841115610c5957600f600681548110610bbf57610bbf6130b2565b906000526020600020018054610bd490613006565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0090613006565b8015610c4d5780601f10610c2257610100808354040283529160200191610c4d565b820191906000526020600020905b815481529060010190602001808311610c3057829003601f168201915b50505050509050610d94565b600c841115610c7657600f600581548110610bbf57610bbf6130b2565b600a841115610c9357600f600481548110610bbf57610bbf6130b2565b6008841115610cb057600f600381548110610bbf57610bbf6130b2565b6006841115610ccd57600f600281548110610bbf57610bbf6130b2565b6004841115610cea57600f600181548110610bbf57610bbf6130b2565b600f600081548110610cfe57610cfe6130b2565b906000526020600020018054610d1390613006565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3f90613006565b8015610d8c5780601f10610d6157610100808354040283529160200191610d8c565b820191906000526020600020905b815481529060010190602001808311610d6f57829003601f168201915b505050505090505b600f831115610de35780600f600681548110610db257610db26130b2565b90600052602060002001604051602001610dcd929190612823565b6040516020818303038152906040529050610ebb565b600c831115610e015780600f600581548110610db257610db26130b2565b600a831115610e1f5780600f600481548110610db257610db26130b2565b6008831115610e3d5780600f600381548110610db257610db26130b2565b6006831115610e5b5780600f600281548110610db257610db26130b2565b6004831115610e795780600f600181548110610db257610db26130b2565b80600f600081548110610e8e57610e8e6130b2565b90600052602060002001604051602001610ea9929190612823565b60405160208183030381529060405290505b600f821115610f0a5780600f600681548110610ed957610ed96130b2565b90600052602060002001604051602001610ef4929190612823565b6040516020818303038152906040529050610fe2565b600c821115610f285780600f600581548110610ed957610ed96130b2565b600a821115610f465780600f600481548110610ed957610ed96130b2565b6008821115610f645780600f600381548110610ed957610ed96130b2565b6006821115610f825780600f600281548110610ed957610ed96130b2565b6004821115610fa05780600f600181548110610ed957610ed96130b2565b80600f600081548110610fb557610fb56130b2565b90600052602060002001604051602001610fd0929190612823565b60405160208183030381529060405290505b98975050505050505050565b6060600061100e610ffe84611d5a565b6040516020016108b19190612902565b9050600061101d60c78361305c565b9050606060c582111561103e57600c6003815481106108f5576108f56130b2565b60bb82111561105b57600c6002815481106108f5576108f56130b2565b607982111561107857600c6001815481106108f5576108f56130b2565b600c6000815481106109dd576109dd6130b2565b6107fe838383604051806020016040528060008152506114ee565b60006110b260085490565b82106111155760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016106c8565b60088281548110611128576111286130b2565b90600052602060002001549050919050565b6002600a54141561115d5760405162461bcd60e51b81526004016106c890612f41565b6002600a55601554610eea116111b55760405162461bcd60e51b815260206004820152601a60248201527f4e6f206d6f726520626c6f6f74206f776e657220636c61696d7300000000000060448201526064016106c8565b601754600854106111d85760405162461bcd60e51b81526004016106c890612e8b565b6013546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561121c57600080fd5b505afa158015611230573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125491906127a6565b116112b45760405162461bcd60e51b815260206004820152602a60248201527f4d757374206f776e206120626c6f6f7420746f20636c61696d2066726f6d20746044820152691a1a5cc81b595d1a1bd960b21b60648201526084016106c8565b60006112bf60085490565b905060155460016112d09190612f78565b6015556112de335b82611e89565b506001600a55565b6000818152600260205260408120546001600160a01b0316806105bb5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016106c8565b60006001600160a01b0382166113c85760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016106c8565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b0316331461140e5760405162461bcd60e51b81526004016106c890612ebb565b6114186000611ea3565b565b6060600180546105d090613006565b6001600160a01b0382163314156114825760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016106c8565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6114f83383611abc565b6115145760405162461bcd60e51b81526004016106c890612ef0565b61152084848484611ef5565b50505050565b6002600a5414156115495760405162461bcd60e51b81526004016106c890612f41565b6002600a556016546089116115705760405162461bcd60e51b81526004016106c890612e8b565b601754600854106115935760405162461bcd60e51b81526004016106c890612e8b565b672b7d238c04a440003410156115eb5760405162461bcd60e51b815260206004820152601f60248201527f5061796d656e7420746f6f206c6f772c2074727920332e31333337206574680060448201526064016106c8565b60006115f660085490565b905060165460016116079190612f78565b6016556112de336112d8565b6060600061162083610891565b61162984610fee565b611632856116c6565b61163b86610b11565b60405160200161164e9493929190612967565b6040516020818303038152906040529050600061169b61166d85611d5a565b61167684611f28565b604051602001611687929190612c94565b604051602081830303815290604052611f28565b9050806040516020016116ae9190612c27565b60408051601f19818403018152919052949350505050565b606060006116e66116d684611d5a565b6040516020016108b19190612bd2565b905060006116f66103e58361305c565b905060606103e382111561171857600e6006815481106108f5576108f56130b2565b6103e082111561173657600e6005815481106108f5576108f56130b2565b6103d582111561175457600e6004815481106108f5576108f56130b2565b6103bc82111561177257600e6003815481106108f5576108f56130b2565b61038082111561179057600e6002815481106108f5576108f56130b2565b6102b88211156117ae57600e6001815481106108f5576108f56130b2565b600e6000815481106109dd576109dd6130b2565b600b546001600160a01b031633146117ec5760405162461bcd60e51b81526004016106c890612ebb565b6001600160a01b0381166118515760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106c8565b61185a81611ea3565b50565b6002600a5414156118805760405162461bcd60e51b81526004016106c890612f41565b6002600a55601454610eea116118d85760405162461bcd60e51b815260206004820152601960248201527f4e6f206d6f7265206c6f6f74206f776e657220636c61696d730000000000000060448201526064016106c8565b601754600854106118fb5760405162461bcd60e51b81526004016106c890612e8b565b6012546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561193f57600080fd5b505afa158015611953573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197791906127a6565b116119d65760405162461bcd60e51b815260206004820152602960248201527f4d757374206f776e2061206c6f6f7420746f20636c61696d2066726f6d2074686044820152681a5cc81b595d1a1bd960ba1b60648201526084016106c8565b60006119e160085490565b905060145460016119f29190612f78565b6014556112de336112d8565b60006001600160e01b031982166380ac58cd60e01b1480611a2f57506001600160e01b03198216635b5e139f60e01b145b806105bb57506301ffc9a760e01b6001600160e01b03198316146105bb565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611a83826112e6565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611b355760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016106c8565b6000611b40836112e6565b9050806001600160a01b0316846001600160a01b03161480611b7b5750836001600160a01b0316611b7084610653565b6001600160a01b0316145b80610a7357506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16610a73565b826001600160a01b0316611bc2826112e6565b6001600160a01b031614611c2a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016106c8565b6001600160a01b038216611c8c5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016106c8565b611c9783838361208e565b611ca2600082611a4e565b6001600160a01b0383166000908152600360205260408120805460019290611ccb908490612fc3565b90915550506001600160a01b0382166000908152600360205260408120805460019290611cf9908490612f78565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b606081611d7e5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611da85780611d9281613041565b9150611da19050600a83612f90565b9150611d82565b60008167ffffffffffffffff811115611dc357611dc36130c8565b6040519080825280601f01601f191660200182016040528015611ded576020820181803683370190505b5090505b8415610a7357611e02600183612fc3565b9150611e0f600a8661305c565b611e1a906030612f78565b60f81b818381518110611e2f57611e2f6130b2565b60200101906001600160f81b031916908160001a905350611e51600a86612f90565b9450611df1565b600081604051602001611e6b9190612807565b60408051601f19818403018152919052805160209091012092915050565b61088d828260405180602001604052806000815250612146565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611f00848484611baf565b611f0c84848484612179565b6115205760405162461bcd60e51b81526004016106c890612e39565b805160609080611f48575050604080516020810190915260008152919050565b60006003611f57836002612f78565b611f619190612f90565b611f6c906004612fa4565b90506000611f7b826020612f78565b67ffffffffffffffff811115611f9357611f936130c8565b6040519080825280601f01601f191660200182016040528015611fbd576020820181803683370190505b50905060006040518060600160405280604081526020016130f5604091399050600181016020830160005b86811015612049576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101611fe8565b506003860660018114612063576002811461207457612080565b613d3d60f01b600119830152612080565b603d60f81b6000198301525b505050918152949350505050565b6001600160a01b0383166120e9576120e481600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61210c565b816001600160a01b0316836001600160a01b03161461210c5761210c8382612286565b6001600160a01b038216612123576107fe81612323565b826001600160a01b0316826001600160a01b0316146107fe576107fe82826123d2565b6121508383612416565b61215d6000848484612179565b6107fe5760405162461bcd60e51b81526004016106c890612e39565b60006001600160a01b0384163b1561227b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906121bd903390899088908890600401612de9565b602060405180830381600087803b1580156121d757600080fd5b505af1925050508015612207575060408051601f3d908101601f1916820190925261220491810190612770565b60015b612261573d808015612235576040519150601f19603f3d011682016040523d82523d6000602084013e61223a565b606091505b5080516122595760405162461bcd60e51b81526004016106c890612e39565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610a73565b506001949350505050565b600060016122938461135d565b61229d9190612fc3565b6000838152600760205260409020549091508082146122f0576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061233590600190612fc3565b6000838152600960205260408120546008805493945090928490811061235d5761235d6130b2565b90600052602060002001549050806008838154811061237e5761237e6130b2565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806123b6576123b661309c565b6001900381819060005260206000200160009055905550505050565b60006123dd8361135d565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b03821661246c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016106c8565b6000818152600260205260409020546001600160a01b0316156124d15760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016106c8565b6124dd6000838361208e565b6001600160a01b0382166000908152600360205260408120805460019290612506908490612f78565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b80356001600160a01b038116811461257b57600080fd5b919050565b60006020828403121561259257600080fd5b61259b82612564565b9392505050565b600080604083850312156125b557600080fd5b6125be83612564565b91506125cc60208401612564565b90509250929050565b6000806000606084860312156125ea57600080fd5b6125f384612564565b925061260160208501612564565b9150604084013590509250925092565b6000806000806080858703121561262757600080fd5b61263085612564565b935061263e60208601612564565b925060408501359150606085013567ffffffffffffffff8082111561266257600080fd5b818701915087601f83011261267657600080fd5b813581811115612688576126886130c8565b604051601f8201601f19908116603f011681019083821181831017156126b0576126b06130c8565b816040528281528a60208487010111156126c957600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561270057600080fd5b61270983612564565b91506020830135801515811461271e57600080fd5b809150509250929050565b6000806040838503121561273c57600080fd5b61274583612564565b946020939093013593505050565b60006020828403121561276557600080fd5b813561259b816130de565b60006020828403121561278257600080fd5b815161259b816130de565b60006020828403121561279f57600080fd5b5035919050565b6000602082840312156127b857600080fd5b5051919050565b600081518084526127d7816020860160208601612fda565b601f01601f19169290920160200192915050565b600081516127fd818560208601612fda565b9290920192915050565b60008251612819818460208701612fda565b9190910192915050565b6000835160206128368285838901612fda565b845491840191600090600181811c908083168061285457607f831692505b85831081141561287257634e487b7160e01b85526022600452602485fd5b8080156128865760018114612897576128c4565b60ff198516885283880195506128c4565b60008b81526020902060005b858110156128bc5781548a8201529084019088016128a3565b505083880195505b50939a9950505050505050505050565b6541434345535360d01b8152600082516128f5816006850160208701612fda565b9190910160060192915050565b675052494f5249545960c01b815260008251612925816008850160208701612fda565b9190910160080192915050565b6c5345524945535f45454641434160981b81526000825161295a81600d850160208701612fda565b91909101600d0192915050565b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323081527f30302f73766722207072657365727665417370656374526174696f3d22784d6960208201527f6e594d696e206d656574222076696577426f783d22302030203330302031303060408201527f223e3c7374796c653e2e62617365207b2066696c6c3a20626c61636b3b20666f60608201527f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a2031347060808201527f783b207d3c2f7374796c653e3c726563742077696474683d223130302522206860a08201527f65696768743d2231303025222066696c6c3d222366666666666622202f3e3c7460c08201527f65787420783d2231302220793d2232302220636c6173733d2262617365223e5060e08201526803934b7b934ba3c9d160bd1b61010082015260006101098651612abe8183860160208b01612fda565b610fe2612bb9612bb3612b74612b6e612b1f612b1988888c01017f3c2f746578743e3c7465787420783d2231302220793d2234302220636c61737381526e01e913130b9b2911f2632bb32b61d1608d1b6020820152602f0190565b8d6127eb565b7f3c2f746578743e3c7465787420783d2231302220793d2236302220636c61737381527f3d2262617365223e5374617274696e6720626f6e75733a200000000000000000602082015260380190565b8a6127eb565b7f3c2f746578743e3c7465787420783d2231302220793d2238302220636c61737381526c01e913130b9b2911f25b2bc9d1609d1b6020820152602d0190565b876127eb565b6c1e17ba32bc3a1f1e17b9bb339f60991b8152600d0190565b64424f4e555360d81b815260008251612bf2816005850160208701612fda565b9190910160050192915050565b6c29a2a924a2a9afa0a121a320a160991b81526000825161295a81600d850160208701612fda565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251612c5f81601d850160208701612fda565b91909101601d0192915050565b6c5345524945535f44464142454160981b81526000825161295a81600d850160208701612fda565b737b226e616d65223a202247616d6550617373202360601b81528251600090612cc4816014850160208801612fda565b7f222c20226465736372697074696f6e223a202247616d655061737320697320616014918401918201527f2072616e646f6d697a6564207072696f726974792074686174206772616e747360348201527f20706c61796572732061636365737320746f207468652067616d657320696e2060548201527f2a4c6f6f74206d65746176657273652e204665656c206672656520746f20757360748201527f652047616d655061737320696e20616e792077617920796f752077616e742e2260948201527f2c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b6260b482015265185cd94d8d0b60d21b60d48201528351612dce8160da840160208801612fda565b61227d60f01b60da929091019182015260dc01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612e1c908301846127bf565b9695505050505050565b60208152600061259b60208301846127bf565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b602080825260169082015275139bc81b5bdc99481d1bdad95b9cc81d1bc81b5a5b9d60521b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60008219821115612f8b57612f8b613070565b500190565b600082612f9f57612f9f613086565b500490565b6000816000190483118215151615612fbe57612fbe613070565b500290565b600082821015612fd557612fd5613070565b500390565b60005b83811015612ff5578181015183820152602001612fdd565b838111156115205750506000910152565b600181811c9082168061301a57607f821691505b6020821081141561303b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561305557613055613070565b5060010190565b60008261306b5761306b613086565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461185a57600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212200701ea50b66a3442fc9de999be1d5c6705b6b1f8c89607810426987888ff7aa664736f6c63430008070033

Deployed Bytecode Sourcemap

44996:9630:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38492:224;;;;;;;;;;-1:-1:-1;38492:224:0;;;;;:::i;:::-;;:::i;:::-;;;13935:14:1;;13928:22;13910:41;;13898:2;13883:18;38492:224:0;;;;;;;;25606:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;27165:221::-;;;;;;;;;;-1:-1:-1;27165:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;13233:32:1;;;13215:51;;13203:2;13188:18;27165:221:0;13069:203:1;26688:411:0;;;;;;;;;;-1:-1:-1;26688:411:0;;;;;:::i;:::-;;:::i;:::-;;45783:71;;;;;;;;;;-1:-1:-1;45783:71:0;;;;-1:-1:-1;;;;;45783:71:0;;;39132:113;;;;;;;;;;-1:-1:-1;39220:10:0;:17;39132:113;;;23724:25:1;;;23712:2;23697:18;39132:113:0;23578:177:1;28055:339:0;;;;;;;;;;-1:-1:-1;28055:339:0;;;;;:::i;:::-;;:::i;53685:145::-;;;;;;;;;;;;;:::i;46970:560::-;;;;;;;;;;-1:-1:-1;46970:560:0;;;;;:::i;:::-;;:::i;38800:256::-;;;;;;;;;;-1:-1:-1;38800:256:0;;;;;:::i;:::-;;:::i;48356:2630::-;;;;;;;;;;-1:-1:-1;48356:2630:0;;;;;:::i;:::-;;:::i;46390:568::-;;;;;;;;;;-1:-1:-1;46390:568:0;;;;;:::i;:::-;;:::i;28465:185::-;;;;;;;;;;-1:-1:-1;28465:185:0;;;;;:::i;:::-;;:::i;39322:233::-;;;;;;;;;;-1:-1:-1;39322:233:0;;;;;:::i;:::-;;:::i;52810:439::-;;;;;;;;;;;;;:::i;25300:239::-;;;;;;;;;;-1:-1:-1;25300:239:0;;;;;:::i;:::-;;:::i;25030:208::-;;;;;;;;;;-1:-1:-1;25030:208:0;;;;;:::i;:::-;;:::i;9998:94::-;;;;;;;;;;;;;:::i;9347:87::-;;;;;;;;;;-1:-1:-1;9420:6:0;;-1:-1:-1;;;;;9420:6:0;9347:87;;25775:104;;;;;;;;;;;;;:::i;27458:295::-;;;;;;;;;;-1:-1:-1;27458:295:0;;;;;:::i;:::-;;:::i;28721:328::-;;;;;;;;;;-1:-1:-1;28721:328:0;;;;;:::i;:::-;;:::i;53261:412::-;;;:::i;45067:62::-;;;;;;;;;;;;45110:19;45067:62;;50998:1360;;;;;;;;;;-1:-1:-1;50998:1360:0;;;;;:::i;:::-;;:::i;47542:802::-;;;;;;;;;;-1:-1:-1;47542:802:0;;;;;:::i;:::-;;:::i;27824:164::-;;;;;;;;;;-1:-1:-1;27824:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;27945:25:0;;;27921:4;27945:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;27824:164;10247:192;;;;;;;;;;-1:-1:-1;10247:192:0;;;;;:::i;:::-;;:::i;45865:72::-;;;;;;;;;;-1:-1:-1;45865:72:0;;;;-1:-1:-1;;;;;45865:72:0;;;52366:432;;;;;;;;;;;;;:::i;38492:224::-;38594:4;-1:-1:-1;;;;;;38618:50:0;;-1:-1:-1;;;38618:50:0;;:90;;;38672:36;38696:11;38672:23;:36::i;:::-;38611:97;38492:224;-1:-1:-1;;38492:224:0:o;25606:100::-;25660:13;25693:5;25686:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25606:100;:::o;27165:221::-;27241:7;30648:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30648:16:0;27261:73;;;;-1:-1:-1;;;27261:73:0;;20232:2:1;27261:73:0;;;20214:21:1;20271:2;20251:18;;;20244:30;20310:34;20290:18;;;20283:62;-1:-1:-1;;;20361:18:1;;;20354:42;20413:19;;27261:73:0;;;;;;;;;-1:-1:-1;27354:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;27354:24:0;;27165:221::o;26688:411::-;26769:13;26785:23;26800:7;26785:14;:23::i;:::-;26769:39;;26833:5;-1:-1:-1;;;;;26827:11:0;:2;-1:-1:-1;;;;;26827:11:0;;;26819:57;;;;-1:-1:-1;;;26819:57:0;;21776:2:1;26819:57:0;;;21758:21:1;21815:2;21795:18;;;21788:30;21854:34;21834:18;;;21827:62;-1:-1:-1;;;21905:18:1;;;21898:31;21946:19;;26819:57:0;21574:397:1;26819:57:0;8287:10;-1:-1:-1;;;;;26911:21:0;;;;:62;;-1:-1:-1;26936:37:0;26953:5;8287:10;27824:164;:::i;26936:37::-;26889:168;;;;-1:-1:-1;;;26889:168:0;;18271:2:1;26889:168:0;;;18253:21:1;18310:2;18290:18;;;18283:30;18349:34;18329:18;;;18322:62;18420:26;18400:18;;;18393:54;18464:19;;26889:168:0;18069:420:1;26889:168:0;27070:21;27079:2;27083:7;27070:8;:21::i;:::-;26758:341;26688:411;;:::o;28055:339::-;28250:41;8287:10;28283:7;28250:18;:41::i;:::-;28242:103;;;;-1:-1:-1;;;28242:103:0;;;;;;;:::i;:::-;28358:28;28368:4;28374:2;28378:7;28358:9;:28::i;53685:145::-;9420:6;;-1:-1:-1;;;;;9420:6:0;8287:10;9567:23;9559:68;;;;-1:-1:-1;;;9559:68:0;;;;;;;:::i;:::-;53785:37:::1;::::0;53753:21:::1;::::0;53793:10:::1;::::0;53785:37;::::1;;;::::0;53753:21;;53738:12:::1;53785:37:::0;53738:12;53785:37;53753:21;53793:10;53785:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;53727:103;53685:145::o:0;46970:560::-;47031:13;47057:12;47072:61;47113:17;47122:7;47113:8;:17::i;:::-;47086:45;;;;;;;;:::i;:::-;;;;;;;;;;;;;47072:6;:61::i;:::-;47057:76;-1:-1:-1;47144:18:0;47165:9;47172:2;47057:76;47165:9;:::i;:::-;47144:30;;47185:20;47235:2;47222:10;:15;47218:281;;;47263:11;47275:1;47263:14;;;;;;;;:::i;:::-;;;;;;;;47254:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47218:281;;;47312:2;47299:10;:15;47295:204;;;47340:11;47352:1;47340:14;;;;;;;;:::i;47295:204::-;47389:2;47376:10;:15;47372:127;;;47417:11;47429:1;47417:14;;;;;;;;:::i;47372:127::-;47473:11;47485:1;47473:14;;;;;;;;:::i;:::-;;;;;;;;47464:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47372:127;47516:6;46970:560;-1:-1:-1;;;;46970:560:0:o;38800:256::-;38897:7;38933:23;38950:5;38933:16;:23::i;:::-;38925:5;:31;38917:87;;;;-1:-1:-1;;;38917:87:0;;14388:2:1;38917:87:0;;;14370:21:1;14427:2;14407:18;;;14400:30;14466:34;14446:18;;;14439:62;-1:-1:-1;;;14517:18:1;;;14510:41;14568:19;;38917:87:0;14186:407:1;38917:87:0;-1:-1:-1;;;;;;39022:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;38800:256::o;48356:2630::-;48417:13;48443;48459:68;48507:17;48516:7;48507:8;:17::i;:::-;48473:52;;;;;;;;:::i;48459:68::-;48443:84;;48538:13;48554:68;48602:17;48611:7;48602:8;:17::i;:::-;48568:52;;;;;;;;:::i;48554:68::-;48538:84;;48633:13;48649:68;48697:17;48706:7;48697:8;:17::i;:::-;48663:52;;;;;;;;:::i;48649:68::-;48633:84;-1:-1:-1;48728:19:0;48750:10;48758:2;48750:5;:10;:::i;:::-;48728:32;-1:-1:-1;48771:19:0;48793:10;48801:2;48793:5;:10;:::i;:::-;48771:32;-1:-1:-1;48814:19:0;48836:10;48844:2;48836:5;:10;:::i;:::-;48814:32;;48857:20;48908:2;48894:11;:16;48890:535;;;48936:11;48948:1;48936:14;;;;;;;;:::i;:::-;;;;;;;;48927:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48890:535;;;48986:2;48972:11;:16;48968:457;;;49014:11;49026:1;49014:14;;;;;;;;:::i;48968:457::-;49064:2;49050:11;:16;49046:379;;;49092:11;49104:1;49092:14;;;;;;;;:::i;49046:379::-;49142:1;49128:11;:15;49124:301;;;49169:11;49181:1;49169:14;;;;;;;;:::i;49124:301::-;49219:1;49205:11;:15;49201:224;;;49246:11;49258:1;49246:14;;;;;;;;:::i;49201:224::-;49296:1;49282:11;:15;49278:147;;;49323:11;49335:1;49323:14;;;;;;;;:::i;49278:147::-;49399:11;49411:1;49399:14;;;;;;;;:::i;:::-;;;;;;;;49390:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49278:147;49455:2;49441:11;:16;49437:753;;;49507:6;49515:11;49527:1;49515:14;;;;;;;;:::i;:::-;;;;;;;;49490:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49474:57;;49437:753;;;49567:2;49553:11;:16;49549:641;;;49619:6;49627:11;49639:1;49627:14;;;;;;;;:::i;49549:641::-;49679:2;49665:11;:16;49661:529;;;49731:6;49739:11;49751:1;49739:14;;;;;;;;:::i;49661:529::-;49791:1;49777:11;:15;49773:417;;;49842:6;49850:11;49862:1;49850:14;;;;;;;;:::i;49773:417::-;49902:1;49888:11;:15;49884:306;;;49953:6;49961:11;49973:1;49961:14;;;;;;;;:::i;49884:306::-;50013:1;49999:11;:15;49995:195;;;50064:6;50072:11;50084:1;50072:14;;;;;;;;:::i;49995:195::-;50154:6;50162:11;50174:1;50162:14;;;;;;;;:::i;:::-;;;;;;;;50137:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50121:57;;49995:195;50220:2;50206:11;:16;50202:753;;;50272:6;50280:11;50292:1;50280:14;;;;;;;;:::i;:::-;;;;;;;;50255:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50239:57;;50202:753;;;50332:2;50318:11;:16;50314:641;;;50384:6;50392:11;50404:1;50392:14;;;;;;;;:::i;50314:641::-;50444:2;50430:11;:16;50426:529;;;50496:6;50504:11;50516:1;50504:14;;;;;;;;:::i;50426:529::-;50556:1;50542:11;:15;50538:417;;;50607:6;50615:11;50627:1;50615:14;;;;;;;;:::i;50538:417::-;50667:1;50653:11;:15;50649:306;;;50718:6;50726:11;50738:1;50726:14;;;;;;;;:::i;50649:306::-;50778:1;50764:11;:15;50760:195;;;50829:6;50837:11;50849:1;50837:14;;;;;;;;:::i;50760:195::-;50919:6;50927:11;50939:1;50927:14;;;;;;;;:::i;:::-;;;;;;;;50902:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50886:57;;50760:195;50972:6;48356:2630;-1:-1:-1;;;;;;;;48356:2630:0:o;46390:568::-;46453:13;46479:12;46494:63;46537:17;46546:7;46537:8;:17::i;:::-;46508:47;;;;;;;;:::i;46494:63::-;46479:78;-1:-1:-1;46568:16:0;46587:10;46594:3;46479:78;46587:10;:::i;:::-;46568:29;;46608:20;46656:3;46645:8;:14;46641:286;;;46685:13;46699:1;46685:16;;;;;;;;:::i;46641:286::-;46734:3;46723:8;:14;46719:208;;;46763:13;46777:1;46763:16;;;;;;;;:::i;46719:208::-;46812:3;46801:8;:14;46797:130;;;46841:13;46855:1;46841:16;;;;;;;;:::i;46797:130::-;46899:13;46913:1;46899:16;;;;;;;;:::i;28465:185::-;28603:39;28620:4;28626:2;28630:7;28603:39;;;;;;;;;;;;:16;:39::i;39322:233::-;39397:7;39433:30;39220:10;:17;;39132:113;39433:30;39425:5;:38;39417:95;;;;-1:-1:-1;;;39417:95:0;;22596:2:1;39417:95:0;;;22578:21:1;22635:2;22615:18;;;22608:30;22674:34;22654:18;;;22647:62;-1:-1:-1;;;22725:18:1;;;22718:42;22777:19;;39417:95:0;22394:408:1;39417:95:0;39530:10;39541:5;39530:17;;;;;;;;:::i;:::-;;;;;;;;;39523:24;;39322:233;;;:::o;52810:439::-;12286:1;12882:7;;:19;;12874:63;;;;-1:-1:-1;;;12874:63:0;;;;;;;:::i;:::-;12286:1;13015:7;:18;52880:17:::1;::::0;52900:4:::1;-1:-1:-1::0;52872:63:0::1;;;::::0;-1:-1:-1;;;52872:63:0;;17916:2:1;52872:63:0::1;::::0;::::1;17898:21:1::0;17955:2;17935:18;;;17928:30;17994:28;17974:18;;;17967:56;18040:18;;52872:63:0::1;17714:350:1::0;52872:63:0::1;52970:9;::::0;39220:10;:17;52954:25:::1;52946:60;;;;-1:-1:-1::0;;;52946:60:0::1;;;;;;;:::i;:::-;53025:13;::::0;:35:::1;::::0;-1:-1:-1;;;53025:35:0;;53049:10:::1;53025:35;::::0;::::1;13215:51:1::0;53063:1:0::1;::::0;-1:-1:-1;;;;;53025:13:0::1;::::0;:23:::1;::::0;13188:18:1;;53025:35:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:39;53017:94;;;::::0;-1:-1:-1;;;53017:94:0;;23009:2:1;53017:94:0::1;::::0;::::1;22991:21:1::0;23048:2;23028:18;;;23021:30;23087:34;23067:18;;;23060:62;-1:-1:-1;;;23138:18:1;;;23131:40;23188:19;;53017:94:0::1;22807:406:1::0;53017:94:0::1;53122:10;53135:13;39220:10:::0;:17;;39132:113;53135:13:::1;53122:26;;53179:17;;53199:1;53179:21;;;;:::i;:::-;53159:17;:41:::0;53211:30:::1;8287:10:::0;53221:12:::1;53235:5;53211:9;:30::i;:::-;-1:-1:-1::0;12242:1:0;13194:7;:22;52810:439::o;25300:239::-;25372:7;25408:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25408:16:0;25443:19;25435:73;;;;-1:-1:-1;;;25435:73:0;;19107:2:1;25435:73:0;;;19089:21:1;19146:2;19126:18;;;19119:30;19185:34;19165:18;;;19158:62;-1:-1:-1;;;19236:18:1;;;19229:39;19285:19;;25435:73:0;18905:405:1;25030:208:0;25102:7;-1:-1:-1;;;;;25130:19:0;;25122:74;;;;-1:-1:-1;;;25122:74:0;;18696:2:1;25122:74:0;;;18678:21:1;18735:2;18715:18;;;18708:30;18774:34;18754:18;;;18747:62;-1:-1:-1;;;18825:18:1;;;18818:40;18875:19;;25122:74:0;18494:406:1;25122:74:0;-1:-1:-1;;;;;;25214:16:0;;;;;:9;:16;;;;;;;25030:208::o;9998:94::-;9420:6;;-1:-1:-1;;;;;9420:6:0;8287:10;9567:23;9559:68;;;;-1:-1:-1;;;9559:68:0;;;;;;;:::i;:::-;10063:21:::1;10081:1;10063:9;:21::i;:::-;9998:94::o:0;25775:104::-;25831:13;25864:7;25857:14;;;;;:::i;27458:295::-;-1:-1:-1;;;;;27561:24:0;;8287:10;27561:24;;27553:62;;;;-1:-1:-1;;;27553:62:0;;17149:2:1;27553:62:0;;;17131:21:1;17188:2;17168:18;;;17161:30;17227:27;17207:18;;;17200:55;17272:18;;27553:62:0;16947:349:1;27553:62:0;8287:10;27628:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;27628:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;27628:53:0;;;;;;;;;;27697:48;;13910:41:1;;;27628:42:0;;8287:10;27697:48;;13883:18:1;27697:48:0;;;;;;;27458:295;;:::o;28721:328::-;28896:41;8287:10;28929:7;28896:18;:41::i;:::-;28888:103;;;;-1:-1:-1;;;28888:103:0;;;;;;;:::i;:::-;29002:39;29016:4;29022:2;29026:7;29035:5;29002:13;:39::i;:::-;28721:328;;;;:::o;53261:412::-;12286:1;12882:7;;:19;;12874:63;;;;-1:-1:-1;;;12874:63:0;;;;;;;:::i;:::-;12286:1;13015:7;:18;53330:17:::1;::::0;53350:3:::1;-1:-1:-1::0;53322:58:0::1;;;;-1:-1:-1::0;;;53322:58:0::1;;;;;;;:::i;:::-;53415:9;::::0;39220:10;:17;53399:25:::1;53391:60;;;;-1:-1:-1::0;;;53391:60:0::1;;;;;;;:::i;:::-;45110:19;53470:9;:29;;53462:73;;;::::0;-1:-1:-1;;;53462:73:0;;21416:2:1;53462:73:0::1;::::0;::::1;21398:21:1::0;21455:2;21435:18;;;21428:30;21494:33;21474:18;;;21467:61;21545:18;;53462:73:0::1;21214:355:1::0;53462:73:0::1;53546:10;53559:13;39220:10:::0;:17;;39132:113;53559:13:::1;53546:26;;53603:17;;53623:1;53603:21;;;;:::i;:::-;53583:17;:41:::0;53635:30:::1;8287:10:::0;53645:12:::1;8207:98:::0;50998:1360;51063:13;51089:20;51454:22;51468:7;51454:13;:22::i;:::-;51563:24;51579:7;51563:15;:24::i;:::-;51683:21;51696:7;51683:12;:21::i;:::-;51789:22;51803:7;51789:13;:22::i;:::-;51133:727;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51089:772;;51893:18;51914:327;51982:17;51991:7;51982:8;:17::i;:::-;52203:28;52223:6;52203:13;:28::i;:::-;51941:297;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51914:13;:327::i;:::-;51893:348;;52318:4;52268:55;;;;;;;;:::i;:::-;;;;-1:-1:-1;;52268:55:0;;;;;;;;;;50998:1360;-1:-1:-1;;;;50998:1360:0:o;47542:802::-;47602:13;47628:12;47643:60;47683:17;47692:7;47683:8;:17::i;:::-;47657:44;;;;;;;;:::i;47643:60::-;47628:75;-1:-1:-1;47714:17:0;47734:10;47741:3;47628:75;47734:10;:::i;:::-;47714:30;;47755:20;47804:3;47792:9;:15;47788:525;;;47833:10;47844:1;47833:13;;;;;;;;:::i;47788:525::-;47880:3;47868:9;:15;47864:449;;;47909:10;47920:1;47909:13;;;;;;;;:::i;47864:449::-;47956:3;47944:9;:15;47940:373;;;47985:10;47996:1;47985:13;;;;;;;;:::i;47940:373::-;48032:3;48020:9;:15;48016:297;;;48061:10;48072:1;48061:13;;;;;;;;:::i;48016:297::-;48108:3;48096:9;:15;48092:221;;;48137:10;48148:1;48137:13;;;;;;;;:::i;48092:221::-;48184:3;48172:9;:15;48168:145;;;48213:10;48224:1;48213:13;;;;;;;;:::i;48168:145::-;48288:10;48299:1;48288:13;;;;;;;;:::i;10247:192::-;9420:6;;-1:-1:-1;;;;;9420:6:0;8287:10;9567:23;9559:68;;;;-1:-1:-1;;;9559:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10336:22:0;::::1;10328:73;;;::::0;-1:-1:-1;;;10328:73:0;;15219:2:1;10328:73:0::1;::::0;::::1;15201:21:1::0;15258:2;15238:18;;;15231:30;15297:34;15277:18;;;15270:62;-1:-1:-1;;;15348:18:1;;;15341:36;15394:19;;10328:73:0::1;15017:402:1::0;10328:73:0::1;10412:19;10422:8;10412:9;:19::i;:::-;10247:192:::0;:::o;52366:432::-;12286:1;12882:7;;:19;;12874:63;;;;-1:-1:-1;;;12874:63:0;;;;;;;:::i;:::-;12286:1;13015:7;:18;52435:16:::1;::::0;52454:4:::1;-1:-1:-1::0;52427:61:0::1;;;::::0;-1:-1:-1;;;52427:61:0;;19517:2:1;52427:61:0::1;::::0;::::1;19499:21:1::0;19556:2;19536:18;;;19529:30;19595:27;19575:18;;;19568:55;19640:18;;52427:61:0::1;19315:349:1::0;52427:61:0::1;52523:9;::::0;39220:10;:17;52507:25:::1;52499:60;;;;-1:-1:-1::0;;;52499:60:0::1;;;;;;;:::i;:::-;52578:12;::::0;:34:::1;::::0;-1:-1:-1;;;52578:34:0;;52601:10:::1;52578:34;::::0;::::1;13215:51:1::0;52615:1:0::1;::::0;-1:-1:-1;;;;;52578:12:0::1;::::0;:22:::1;::::0;13188:18:1;;52578:34:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:38;52570:92;;;::::0;-1:-1:-1;;;52570:92:0;;16334:2:1;52570:92:0::1;::::0;::::1;16316:21:1::0;16373:2;16353:18;;;16346:30;16412:34;16392:18;;;16385:62;-1:-1:-1;;;16463:18:1;;;16456:39;16512:19;;52570:92:0::1;16132:405:1::0;52570:92:0::1;52673:10;52686:13;39220:10:::0;:17;;39132:113;52686:13:::1;52673:26;;52729:16;;52748:1;52729:20;;;;:::i;:::-;52710:16;:39:::0;52760:30:::1;8287:10:::0;52770:12:::1;8207:98:::0;24661:305;24763:4;-1:-1:-1;;;;;;24800:40:0;;-1:-1:-1;;;24800:40:0;;:105;;-1:-1:-1;;;;;;;24857:48:0;;-1:-1:-1;;;24857:48:0;24800:105;:158;;;-1:-1:-1;;;;;;;;;;23377:40:0;;;24922:36;23268:157;34541:174;34616:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;34616:29:0;-1:-1:-1;;;;;34616:29:0;;;;;;;;:24;;34670:23;34616:24;34670:14;:23::i;:::-;-1:-1:-1;;;;;34661:46:0;;;;;;;;;;;34541:174;;:::o;30853:348::-;30946:4;30648:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30648:16:0;30963:73;;;;-1:-1:-1;;;30963:73:0;;17503:2:1;30963:73:0;;;17485:21:1;17542:2;17522:18;;;17515:30;17581:34;17561:18;;;17554:62;-1:-1:-1;;;17632:18:1;;;17625:42;17684:19;;30963:73:0;17301:408:1;30963:73:0;31047:13;31063:23;31078:7;31063:14;:23::i;:::-;31047:39;;31116:5;-1:-1:-1;;;;;31105:16:0;:7;-1:-1:-1;;;;;31105:16:0;;:51;;;;31149:7;-1:-1:-1;;;;;31125:31:0;:20;31137:7;31125:11;:20::i;:::-;-1:-1:-1;;;;;31125:31:0;;31105:51;:87;;;-1:-1:-1;;;;;;27945:25:0;;;27921:4;27945:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;31160:32;27824:164;33845:578;34004:4;-1:-1:-1;;;;;33977:31:0;:23;33992:7;33977:14;:23::i;:::-;-1:-1:-1;;;;;33977:31:0;;33969:85;;;;-1:-1:-1;;;33969:85:0;;21006:2:1;33969:85:0;;;20988:21:1;21045:2;21025:18;;;21018:30;21084:34;21064:18;;;21057:62;-1:-1:-1;;;21135:18:1;;;21128:39;21184:19;;33969:85:0;20804:405:1;33969:85:0;-1:-1:-1;;;;;34073:16:0;;34065:65;;;;-1:-1:-1;;;34065:65:0;;16744:2:1;34065:65:0;;;16726:21:1;16783:2;16763:18;;;16756:30;16822:34;16802:18;;;16795:62;-1:-1:-1;;;16873:18:1;;;16866:34;16917:19;;34065:65:0;16542:400:1;34065:65:0;34143:39;34164:4;34170:2;34174:7;34143:20;:39::i;:::-;34247:29;34264:1;34268:7;34247:8;:29::i;:::-;-1:-1:-1;;;;;34289:15:0;;;;;;:9;:15;;;;;:20;;34308:1;;34289:15;:20;;34308:1;;34289:20;:::i;:::-;;;;-1:-1:-1;;;;;;;34320:13:0;;;;;;:9;:13;;;;;:18;;34337:1;;34320:13;:18;;34337:1;;34320:18;:::i;:::-;;;;-1:-1:-1;;34349:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34349:21:0;-1:-1:-1;;;;;34349:21:0;;;;;;;;;34388:27;;34349:16;;34388:27;;;;;;;33845:578;;;:::o;53842:715::-;53898:13;54111:10;54107:53;;-1:-1:-1;;54138:10:0;;;;;;;;;;;;-1:-1:-1;;;54138:10:0;;;;;53842:715::o;54107:53::-;54185:5;54170:12;54226:78;54233:9;;54226:78;;54259:8;;;;:::i;:::-;;-1:-1:-1;54282:10:0;;-1:-1:-1;54290:2:0;54282:10;;:::i;:::-;;;54226:78;;;54314:19;54346:6;54336:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54336:17:0;;54314:39;;54364:154;54371:10;;54364:154;;54398:11;54408:1;54398:11;;:::i;:::-;;-1:-1:-1;54467:10:0;54475:2;54467:5;:10;:::i;:::-;54454:24;;:2;:24;:::i;:::-;54441:39;;54424:6;54431;54424:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;54424:56:0;;;;;;;;-1:-1:-1;54495:11:0;54504:2;54495:11;;:::i;:::-;;;54364:154;;46240:138;46300:7;46362:5;46345:23;;;;;;;;:::i;:::-;;;;-1:-1:-1;;46345:23:0;;;;;;;;;46335:34;;46345:23;46335:34;;;;;46240:138;-1:-1:-1;;46240:138:0:o;31543:110::-;31619:26;31629:2;31633:7;31619:26;;;;;;;;;;;;:9;:26::i;10447:173::-;10522:6;;;-1:-1:-1;;;;;10539:17:0;;;-1:-1:-1;;;;;;10539:17:0;;;;;;;10572:40;;10522:6;;;10539:17;10522:6;;10572:40;;10503:16;;10572:40;10492:128;10447:173;:::o;29931:315::-;30088:28;30098:4;30104:2;30108:7;30088:9;:28::i;:::-;30135:48;30158:4;30164:2;30168:7;30177:5;30135:22;:48::i;:::-;30127:111;;;;-1:-1:-1;;;30127:111:0;;;;;;;:::i;54977:1607::-;55075:11;;55035:13;;55101:8;55097:23;;-1:-1:-1;;55111:9:0;;;;;;;;;-1:-1:-1;55111:9:0;;;54977:1607;-1:-1:-1;54977:1607:0:o;55097:23::-;55172:18;55210:1;55199:7;:3;55205:1;55199:7;:::i;:::-;55198:13;;;;:::i;:::-;55193:19;;:1;:19;:::i;:::-;55172:40;-1:-1:-1;55270:19:0;55302:15;55172:40;55315:2;55302:15;:::i;:::-;55292:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55292:26:0;;55270:48;;55331:18;55352:5;;;;;;;;;;;;;;;;;55331:26;;55421:1;55414:5;55410:13;55466:2;55458:6;55454:15;55517:1;55485:777;55540:3;55537:1;55534:10;55485:777;;;55595:1;55638:12;;;;;55632:19;55733:4;55721:2;55717:14;;;;;55699:40;;55693:47;55842:2;55838:14;;;55834:25;;55820:40;;55814:47;55971:1;55967:13;;;55963:24;;55949:39;;55943:46;56091:16;;;;56077:31;;56071:38;55769:1;55765:11;;;55863:4;55810:58;;;55801:68;55894:11;;55939:57;;;55930:67;;;;56022:11;;56067:49;;56058:59;56146:3;56142:13;56175:22;;56245:1;56230:17;;;;55588:9;55485:777;;;55489:44;56294:1;56289:3;56285:11;56315:1;56310:84;;;;56413:1;56408:82;;;;56278:212;;56310:84;-1:-1:-1;;;;;56343:17:0;;56336:43;56310:84;;56408:82;-1:-1:-1;;;;;56441:17:0;;56434:41;56278:212;-1:-1:-1;;;56506:26:0;;;56513:6;54977:1607;-1:-1:-1;;;;54977:1607:0:o;40168:589::-;-1:-1:-1;;;;;40374:18:0;;40370:187;;40409:40;40441:7;41584:10;:17;;41557:24;;;;:15;:24;;;;;:44;;;41612:24;;;;;;;;;;;;41480:164;40409:40;40370:187;;;40479:2;-1:-1:-1;;;;;40471:10:0;:4;-1:-1:-1;;;;;40471:10:0;;40467:90;;40498:47;40531:4;40537:7;40498:32;:47::i;:::-;-1:-1:-1;;;;;40571:16:0;;40567:183;;40604:45;40641:7;40604:36;:45::i;40567:183::-;40677:4;-1:-1:-1;;;;;40671:10:0;:2;-1:-1:-1;;;;;40671:10:0;;40667:83;;40698:40;40726:2;40730:7;40698:27;:40::i;31880:321::-;32010:18;32016:2;32020:7;32010:5;:18::i;:::-;32061:54;32092:1;32096:2;32100:7;32109:5;32061:22;:54::i;:::-;32039:154;;;;-1:-1:-1;;;32039:154:0;;;;;;;:::i;35280:803::-;35435:4;-1:-1:-1;;;;;35456:13:0;;15763:20;15811:8;35452:624;;35492:72;;-1:-1:-1;;;35492:72:0;;-1:-1:-1;;;;;35492:36:0;;;;;:72;;8287:10;;35543:4;;35549:7;;35558:5;;35492:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35492:72:0;;;;;;;;-1:-1:-1;;35492:72:0;;;;;;;;;;;;:::i;:::-;;;35488:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35738:13:0;;35734:272;;35781:60;;-1:-1:-1;;;35781:60:0;;;;;;;:::i;35734:272::-;35956:6;35950:13;35941:6;35937:2;35933:15;35926:38;35488:533;-1:-1:-1;;;;;;35615:55:0;-1:-1:-1;;;35615:55:0;;-1:-1:-1;35608:62:0;;35452:624;-1:-1:-1;36060:4:0;35280:803;;;;;;:::o;42271:988::-;42537:22;42587:1;42562:22;42579:4;42562:16;:22::i;:::-;:26;;;;:::i;:::-;42599:18;42620:26;;;:17;:26;;;;;;42537:51;;-1:-1:-1;42753:28:0;;;42749:328;;-1:-1:-1;;;;;42820:18:0;;42798:19;42820:18;;;:12;:18;;;;;;;;:34;;;;;;;;;42871:30;;;;;;:44;;;42988:30;;:17;:30;;;;;:43;;;42749:328;-1:-1:-1;43173:26:0;;;;:17;:26;;;;;;;;43166:33;;;-1:-1:-1;;;;;43217:18:0;;;;;:12;:18;;;;;:34;;;;;;;43210:41;42271:988::o;43554:1079::-;43832:10;:17;43807:22;;43832:21;;43852:1;;43832:21;:::i;:::-;43864:18;43885:24;;;:15;:24;;;;;;44258:10;:26;;43807:46;;-1:-1:-1;43885:24:0;;43807:46;;44258:26;;;;;;:::i;:::-;;;;;;;;;44236:48;;44322:11;44297:10;44308;44297:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;44402:28;;;:15;:28;;;;;;;:41;;;44574:24;;;;;44567:31;44609:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;43625:1008;;;43554:1079;:::o;41058:221::-;41143:14;41160:20;41177:2;41160:16;:20::i;:::-;-1:-1:-1;;;;;41191:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;41236:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;41058:221:0:o;32537:382::-;-1:-1:-1;;;;;32617:16:0;;32609:61;;;;-1:-1:-1;;;32609:61:0;;19871:2:1;32609:61:0;;;19853:21:1;;;19890:18;;;19883:30;19949:34;19929:18;;;19922:62;20001:18;;32609:61:0;19669:356:1;32609:61:0;30624:4;30648:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30648:16:0;:30;32681:58;;;;-1:-1:-1;;;32681:58:0;;15626:2:1;32681:58:0;;;15608:21:1;15665:2;15645:18;;;15638:30;15704;15684:18;;;15677:58;15752:18;;32681:58:0;15424:352:1;32681:58:0;32752:45;32781:1;32785:2;32789:7;32752:20;:45::i;:::-;-1:-1:-1;;;;;32810:13:0;;;;;;:9;:13;;;;;:18;;32827:1;;32810:13;:18;;32827:1;;32810:18;:::i;:::-;;;;-1:-1:-1;;32839:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32839:21:0;-1:-1:-1;;;;;32839:21:0;;;;;;;;32878:33;;32839:16;;;32878:33;;32839:16;;32878:33;32537:382;;:::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;:::-;333:39;192:186;-1:-1:-1;;;192:186:1:o;383:260::-;451:6;459;512:2;500:9;491:7;487:23;483:32;480:52;;;528:1;525;518:12;480:52;551:29;570:9;551:29;:::i;:::-;541:39;;599:38;633:2;622:9;618:18;599:38;:::i;:::-;589:48;;383:260;;;;;:::o;648:328::-;725:6;733;741;794:2;782:9;773:7;769:23;765:32;762:52;;;810:1;807;800:12;762:52;833:29;852:9;833:29;:::i;:::-;823:39;;881:38;915:2;904:9;900:18;881:38;:::i;:::-;871:48;;966:2;955:9;951:18;938:32;928:42;;648:328;;;;;:::o;981:1138::-;1076:6;1084;1092;1100;1153:3;1141:9;1132:7;1128:23;1124:33;1121:53;;;1170:1;1167;1160:12;1121:53;1193:29;1212:9;1193:29;:::i;:::-;1183:39;;1241:38;1275:2;1264:9;1260:18;1241:38;:::i;:::-;1231:48;;1326:2;1315:9;1311:18;1298:32;1288:42;;1381:2;1370:9;1366:18;1353:32;1404:18;1445:2;1437:6;1434:14;1431:34;;;1461:1;1458;1451:12;1431:34;1499:6;1488:9;1484:22;1474:32;;1544:7;1537:4;1533:2;1529:13;1525:27;1515:55;;1566:1;1563;1556:12;1515:55;1602:2;1589:16;1624:2;1620;1617:10;1614:36;;;1630:18;;:::i;:::-;1705:2;1699:9;1673:2;1759:13;;-1:-1:-1;;1755:22:1;;;1779:2;1751:31;1747:40;1735:53;;;1803:18;;;1823:22;;;1800:46;1797:72;;;1849:18;;:::i;:::-;1889:10;1885:2;1878:22;1924:2;1916:6;1909:18;1964:7;1959:2;1954;1950;1946:11;1942:20;1939:33;1936:53;;;1985:1;1982;1975:12;1936:53;2041:2;2036;2032;2028:11;2023:2;2015:6;2011:15;1998:46;2086:1;2081:2;2076;2068:6;2064:15;2060:24;2053:35;2107:6;2097:16;;;;;;;981:1138;;;;;;;:::o;2124:347::-;2189:6;2197;2250:2;2238:9;2229:7;2225:23;2221:32;2218:52;;;2266:1;2263;2256:12;2218:52;2289:29;2308:9;2289:29;:::i;:::-;2279:39;;2368:2;2357:9;2353:18;2340:32;2415:5;2408:13;2401:21;2394:5;2391:32;2381:60;;2437:1;2434;2427:12;2381:60;2460:5;2450:15;;;2124:347;;;;;:::o;2476:254::-;2544:6;2552;2605:2;2593:9;2584:7;2580:23;2576:32;2573:52;;;2621:1;2618;2611:12;2573:52;2644:29;2663:9;2644:29;:::i;:::-;2634:39;2720:2;2705:18;;;;2692:32;;-1:-1:-1;;;2476:254:1:o;2735:245::-;2793:6;2846:2;2834:9;2825:7;2821:23;2817:32;2814:52;;;2862:1;2859;2852:12;2814:52;2901:9;2888:23;2920:30;2944:5;2920:30;:::i;2985:249::-;3054:6;3107:2;3095:9;3086:7;3082:23;3078:32;3075:52;;;3123:1;3120;3113:12;3075:52;3155:9;3149:16;3174:30;3198:5;3174:30;:::i;3239:180::-;3298:6;3351:2;3339:9;3330:7;3326:23;3322:32;3319:52;;;3367:1;3364;3357:12;3319:52;-1:-1:-1;3390:23:1;;3239:180;-1:-1:-1;3239:180:1:o;3424:184::-;3494:6;3547:2;3535:9;3526:7;3522:23;3518:32;3515:52;;;3563:1;3560;3553:12;3515:52;-1:-1:-1;3586:16:1;;3424:184;-1:-1:-1;3424:184:1:o;3613:257::-;3654:3;3692:5;3686:12;3719:6;3714:3;3707:19;3735:63;3791:6;3784:4;3779:3;3775:14;3768:4;3761:5;3757:16;3735:63;:::i;:::-;3852:2;3831:15;-1:-1:-1;;3827:29:1;3818:39;;;;3859:4;3814:50;;3613:257;-1:-1:-1;;3613:257:1:o;3875:185::-;3917:3;3955:5;3949:12;3970:52;4015:6;4010:3;4003:4;3996:5;3992:16;3970:52;:::i;:::-;4038:16;;;;;3875:185;-1:-1:-1;;3875:185:1:o;4985:276::-;5116:3;5154:6;5148:13;5170:53;5216:6;5211:3;5204:4;5196:6;5192:17;5170:53;:::i;:::-;5239:16;;;;;4985:276;-1:-1:-1;;4985:276:1:o;5266:1335::-;5442:3;5480:6;5474:13;5506:4;5519:51;5563:6;5558:3;5553:2;5545:6;5541:15;5519:51;:::i;:::-;5655:13;;5592:16;;;;5628:1;;5715;5737:18;;;;5790;;;;5817:93;;5895:4;5885:8;5881:19;5869:31;;5817:93;5958:2;5948:8;5945:16;5925:18;5922:40;5919:167;;;-1:-1:-1;;;5985:33:1;;6041:4;6038:1;6031:15;6071:4;5992:3;6059:17;5919:167;6102:18;6129:110;;;;6253:1;6248:328;;;;6095:481;;6129:110;-1:-1:-1;;6164:24:1;;6150:39;;6209:20;;;;-1:-1:-1;6129:110:1;;6248:328;23833:1;23826:14;;;23870:4;23857:18;;6343:1;6357:169;6371:8;6368:1;6365:15;6357:169;;;6453:14;;6438:13;;;6431:37;6496:16;;;;6388:10;;6357:169;;;6361:3;;6557:8;6550:5;6546:20;6539:27;;6095:481;-1:-1:-1;6592:3:1;;5266:1335;-1:-1:-1;;;;;;;;;;5266:1335:1:o;6606:423::-;-1:-1:-1;;;6863:3:1;6856:21;6838:3;6906:6;6900:13;6922:61;6976:6;6972:1;6967:3;6963:11;6956:4;6948:6;6944:17;6922:61;:::i;:::-;7003:16;;;;7021:1;6999:24;;6606:423;-1:-1:-1;;6606:423:1:o;7034:425::-;-1:-1:-1;;;7291:3:1;7284:23;7266:3;7336:6;7330:13;7352:61;7406:6;7402:1;7397:3;7393:11;7386:4;7378:6;7374:17;7352:61;:::i;:::-;7433:16;;;;7451:1;7429:24;;7034:425;-1:-1:-1;;7034:425:1:o;7464:432::-;-1:-1:-1;;;7721:3:1;7714:28;7696:3;7771:6;7765:13;7787:62;7842:6;7837:2;7832:3;7828:12;7821:4;7813:6;7809:17;7787:62;:::i;:::-;7869:16;;;;7887:2;7865:25;;7464:432;-1:-1:-1;;7464:432:1:o;7901:1950::-;8711:66;8706:3;8699:79;8808:66;8803:2;8798:3;8794:12;8787:88;8905:66;8900:2;8895:3;8891:12;8884:88;9002:66;8997:2;8992:3;8988:12;8981:88;9100:34;9094:3;9089;9085:13;9078:57;9166:66;9160:3;9155;9151:13;9144:89;9264:66;9258:3;9253;9249:13;9242:89;9362:66;9356:3;9351;9347:13;9340:89;-1:-1:-1;;;9454:3:1;9449;9445:13;9438:34;8681:3;9491;9523:6;9517:13;9539:60;9592:6;9587:2;9582:3;9578:12;9573:2;9565:6;9561:15;9539:60;:::i;:::-;9615:230;9645:199;9671:172;9701:141;9727:114;9757:83;9783:56;9835:2;9826:6;9821:3;9817:16;9813:25;4554:66;4542:79;;-1:-1:-1;;;4646:2:1;4637:12;;4630:64;4719:2;4710:12;;4477:251;9783:56;9775:6;9757:83;:::i;:::-;4142:66;4130:79;;4239:66;4234:2;4225:12;;4218:88;4331:2;4322:12;;4065:275;9727:114;9719:6;9701:141;:::i;:::-;4810:66;4798:79;;-1:-1:-1;;;4902:2:1;4893:12;;4886:60;4971:2;4962:12;;4733:247;9671:172;9663:6;9645:199;:::i;:::-;-1:-1:-1;;;4410:28:1;;4463:2;4454:12;;4345:127;9856:422;-1:-1:-1;;;10113:3:1;10106:20;10088:3;10155:6;10149:13;10171:61;10225:6;10221:1;10216:3;10212:11;10205:4;10197:6;10193:17;10171:61;:::i;:::-;10252:16;;;;10270:1;10248:24;;9856:422;-1:-1:-1;;9856:422:1:o;10283:432::-;-1:-1:-1;;;10540:3:1;10533:28;10515:3;10590:6;10584:13;10606:62;10661:6;10656:2;10651:3;10647:12;10640:4;10632:6;10628:17;10606:62;:::i;10720:448::-;10982:31;10977:3;10970:44;10952:3;11043:6;11037:13;11059:62;11114:6;11109:2;11104:3;11100:12;11093:4;11085:6;11081:17;11059:62;:::i;:::-;11141:16;;;;11159:2;11137:25;;10720:448;-1:-1:-1;;10720:448:1:o;11173:432::-;-1:-1:-1;;;11430:3:1;11423:28;11405:3;11480:6;11474:13;11496:62;11551:6;11546:2;11541:3;11537:12;11530:4;11522:6;11518:17;11496:62;:::i;11610:1454::-;-1:-1:-1;;;12110:64:1;;12197:13;;12092:3;;12219:62;12197:13;12269:2;12260:12;;12253:4;12241:17;;12219:62;:::i;:::-;12345:66;12340:2;12300:16;;;12332:11;;;12325:87;12441:34;12436:2;12428:11;;12421:55;12505:34;12500:2;12492:11;;12485:55;12570:34;12564:3;12556:12;;12549:56;12635:66;12629:3;12621:12;;12614:88;12732:66;12726:3;12718:12;;12711:88;-1:-1:-1;;;12823:3:1;12815:12;;12808:30;12863:13;;12885:64;12863:13;12934:3;12926:12;;12919:4;12907:17;;12885:64;:::i;:::-;-1:-1:-1;;;13009:3:1;12968:17;;;;13001:12;;;12994:36;13054:3;13046:12;;11610:1454;-1:-1:-1;;;;11610:1454:1:o;13277:488::-;-1:-1:-1;;;;;13546:15:1;;;13528:34;;13598:15;;13593:2;13578:18;;13571:43;13645:2;13630:18;;13623:34;;;13693:3;13688:2;13673:18;;13666:31;;;13471:4;;13714:45;;13739:19;;13731:6;13714:45;:::i;:::-;13706:53;13277:488;-1:-1:-1;;;;;;13277:488:1:o;13962:219::-;14111:2;14100:9;14093:21;14074:4;14131:44;14171:2;14160:9;14156:18;14148:6;14131:44;:::i;14598:414::-;14800:2;14782:21;;;14839:2;14819:18;;;14812:30;14878:34;14873:2;14858:18;;14851:62;-1:-1:-1;;;14944:2:1;14929:18;;14922:48;15002:3;14987:19;;14598:414::o;15781:346::-;15983:2;15965:21;;;16022:2;16002:18;;;15995:30;-1:-1:-1;;;16056:2:1;16041:18;;16034:52;16118:2;16103:18;;15781:346::o;20443:356::-;20645:2;20627:21;;;20664:18;;;20657:30;20723:34;20718:2;20703:18;;20696:62;20790:2;20775:18;;20443:356::o;21976:413::-;22178:2;22160:21;;;22217:2;22197:18;;;22190:30;22256:34;22251:2;22236:18;;22229:62;-1:-1:-1;;;22322:2:1;22307:18;;22300:47;22379:3;22364:19;;21976:413::o;23218:355::-;23420:2;23402:21;;;23459:2;23439:18;;;23432:30;23498:33;23493:2;23478:18;;23471:61;23564:2;23549:18;;23218:355::o;23886:128::-;23926:3;23957:1;23953:6;23950:1;23947:13;23944:39;;;23963:18;;:::i;:::-;-1:-1:-1;23999:9:1;;23886:128::o;24019:120::-;24059:1;24085;24075:35;;24090:18;;:::i;:::-;-1:-1:-1;24124:9:1;;24019:120::o;24144:168::-;24184:7;24250:1;24246;24242:6;24238:14;24235:1;24232:21;24227:1;24220:9;24213:17;24209:45;24206:71;;;24257:18;;:::i;:::-;-1:-1:-1;24297:9:1;;24144:168::o;24317:125::-;24357:4;24385:1;24382;24379:8;24376:34;;;24390:18;;:::i;:::-;-1:-1:-1;24427:9:1;;24317:125::o;24447:258::-;24519:1;24529:113;24543:6;24540:1;24537:13;24529:113;;;24619:11;;;24613:18;24600:11;;;24593:39;24565:2;24558:10;24529:113;;;24660:6;24657:1;24654:13;24651:48;;;-1:-1:-1;;24695:1:1;24677:16;;24670:27;24447:258::o;24710:380::-;24789:1;24785:12;;;;24832;;;24853:61;;24907:4;24899:6;24895:17;24885:27;;24853:61;24960:2;24952:6;24949:14;24929:18;24926:38;24923:161;;;25006:10;25001:3;24997:20;24994:1;24987:31;25041:4;25038:1;25031:15;25069:4;25066:1;25059:15;24923:161;;24710:380;;;:::o;25095:135::-;25134:3;-1:-1:-1;;25155:17:1;;25152:43;;;25175:18;;:::i;:::-;-1:-1:-1;25222:1:1;25211:13;;25095:135::o;25235:112::-;25267:1;25293;25283:35;;25298:18;;:::i;:::-;-1:-1:-1;25332:9:1;;25235:112::o;25352:127::-;25413:10;25408:3;25404:20;25401:1;25394:31;25444:4;25441:1;25434:15;25468:4;25465:1;25458:15;25484:127;25545:10;25540:3;25536:20;25533:1;25526:31;25576:4;25573:1;25566:15;25600:4;25597:1;25590:15;25616:127;25677:10;25672:3;25668:20;25665:1;25658:31;25708:4;25705:1;25698:15;25732:4;25729:1;25722:15;25748:127;25809:10;25804:3;25800:20;25797:1;25790:31;25840:4;25837:1;25830:15;25864:4;25861:1;25854:15;25880:127;25941:10;25936:3;25932:20;25929:1;25922:31;25972:4;25969:1;25962:15;25996:4;25993:1;25986:15;26012:131;-1:-1:-1;;;;;;26086:32:1;;26076:43;;26066:71;;26133:1;26130;26123:12

Swarm Source

ipfs://0701ea50b66a3442fc9de999be1d5c6705b6b1f8c89607810426987888ff7aa6
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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