ETH Price: $3,140.97 (+1.17%)
Gas: 6 Gwei

Light Years (LIGHTYEARS)
 

Overview

TokenID

93

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Light Years is a project from generative artist Dmitri Cherniak in partnership with The Estate of László Moholy-Nagy. It is an homage to the photogram as a medium, but with a digitally native twist. Each of the 100 unique editions was created by a code-based generative system, then hand-prepared and printed to a film negative. A high definition scan of the negative was used to develop the image as a silver gelatin print which can be claimed by the first collector of the artwork.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
LightYears

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion, MIT license
File 1 of 16 : LICENSE.sol
// Copyright (c) 2022 Fellowship
// 
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
// documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies
// or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

File 2 of 16 : LightYears.sol
// SPDX-License-Identifier: MIT
// Copyright (c) 2022 Fellowship

pragma solidity ^0.8.7;

import "./TokenBase.sol";

contract LightYears is TokenBase {
    constructor(
        string memory name,
        string memory symbol,
        address royaltyReceiver,
        string memory baseURI_
    ) TokenBase(name, symbol, 1, 100, royaltyReceiver) {
        baseURI = baseURI_;
    }

    // MINTER FUNCTIONS

    /// @notice Mint an unclaimed token to the given address
    /// @dev Can only be called by the `minter` address
    /// @param to The new token owner that will receive the minted token
    /// @param tokenId The token being claimed. Reverts if invalid or already claimed.
    function mint(address to, uint256 tokenId) external onlyMinter {
        // CHECKS inputs
        require(tokenId != 0 && tokenId <= 100, "Invalid token ID");
        // CHECKS + EFFECTS (not _safeMint, so no interactions)
        _mint(to, tokenId);
        // More EFFECTS
        unchecked {
            totalSupply++;
        }
    }

    /// @notice Query if a contract implements an interface
    /// @dev Interface identification is specified in ERC-165. This function uses less than 30,000 gas.
    /// @param interfaceId The interface identifier, as specified in ERC-165
    /// @return `true` if the contract implements `interfaceID` and `interfaceID` is not 0xffffffff, `false` otherwise
    function supportsInterface(bytes4 interfaceId) public pure virtual override returns (bool) {
        return
            interfaceId == 0x40c10f19 || // Selector for: mint(address, uint256)
            super.supportsInterface(interfaceId);
    }
}

File 3 of 16 : TokenBase.sol
// SPDX-License-Identifier: MIT
// Copyright (c) 2022 Fellowship

pragma solidity ^0.8.7;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol";
import "@openzeppelin/contracts/utils/math/Math.sol";
import "./TimeLimitedOperatorFilter.sol";

/// @title Token Base
/// @notice Shared logic for token contracts
abstract contract TokenBase is ERC721, Ownable, TimeLimitedOperatorFilter {
    using Strings for uint256;

    uint256 private immutable MIN_ID;
    uint256 private immutable MAX_ID;

    address public royaltyReceiver;
    address public minter;
    address public metadataContract;

    uint256 public royaltyFraction = 10;
    uint256 public royaltyDenominator = 100;

    /// @notice Count of valid NFTs tracked by this contract
    /// @dev Contracts that extend TokenBase must manually manage this number
    uint256 public totalSupply;

    /// @notice Return the baseURI used for computing `tokenURI` values
    string public baseURI;

    error OnlyMinter();

    /// @dev This event emits when the metadata of a token is changed. Anyone aware of ERC-4906 can update cached
    ///  attributes related to a given `tokenId`.
    event MetadataUpdate(uint256 tokenId);

    /// @dev This event emits when the metadata of a range of tokens is changed. mAnyone aware of ERC-4906 can update
    ///  cached attributes for tokens in the designated range.
    event BatchMetadataUpdate(uint256 fromTokenId, uint256 toTokenId);

    constructor(
        string memory name,
        string memory symbol,
        uint256 minId,
        uint256 maxId,
        address royaltyReceiver_
    ) ERC721(name, symbol) {
        // CHECKS inputs
        require(minId <= maxId, "Invalid token ID range");
        require(royaltyReceiver_ != address(0), "Royalty receiver must not be the zero address");
        // EFFECTS
        MIN_ID = minId;
        MAX_ID = maxId;
        royaltyReceiver = royaltyReceiver_;
    }

    modifier onlyMinter() {
        if (msg.sender != minter) revert OnlyMinter();
        _;
    }

    // HOLDER FUNCTIONS

    /// @notice Enable or disable approval for an `operator` to manage all assets belonging to the sender
    /// @dev Emits the ApprovalForAll event. The contract MUST allow multiple operators per owner.
    /// @param operator Address to add to the set of authorized operators
    /// @param approved True to grant approval, false to revoke approval
    function setApprovalForAll(address operator, bool approved) public virtual override {
        // CHECKS inputs
        if (approved && !operatorAllowed(operator)) revert OperatorNotAllowed(operator);
        // CHECKS + EFFECTS
        super.setApprovalForAll(operator, approved);
    }

    // OWNER FUNCTIONS

    /// @notice Set the `minter` address
    /// @dev Can only be called by the contract `owner`
    function setMinter(address minter_) external onlyOwner {
        minter = minter_;
    }

    /// @notice Set the `royaltyReceiver` address
    /// @dev Can only be called by the contract `owner`
    function setRoyaltyReceiver(address royaltyReceiver_) external onlyOwner {
        // CHECKS inputs
        require(royaltyReceiver_ != address(0), "Royalty receiver must not be the zero address");
        // EFFECTS
        royaltyReceiver = royaltyReceiver_;
    }

    /// @notice Update the royalty fraction
    /// @dev Can only be called by the contract `owner`
    function setRoyaltyFraction(uint256 royaltyFraction_, uint256 royaltyDenominator_) external onlyOwner {
        // CHECKS inputs
        require(royaltyDenominator_ != 0, "Royalty denominator must not be zero");
        require(royaltyFraction_ <= royaltyDenominator_, "Royalty fraction must not be greater than 100%");
        // EFFECTS
        royaltyFraction = royaltyFraction_;
        royaltyDenominator = royaltyDenominator_;
    }

    /// @notice Update the baseURI for all metadata
    /// @dev Can only be called by the contract `owner`. Emits an ERC-4906 event.
    /// @param baseURI_ The new URI base. When specified, token URIs are created by concatenating the baseURI,
    ///  token ID, and ".json".
    function updateBaseURI(string calldata baseURI_) external onlyOwner {
        // CHECKS inputs
        require(bytes(baseURI_).length > 0, "New base URI must be provided");

        // EFFECTS
        baseURI = baseURI_;
        metadataContract = address(0);

        emit BatchMetadataUpdate(MIN_ID, MAX_ID);
    }

    /// @notice Delegate all `tokenURI` calls to another contract
    /// @dev Can only be called by the contract `owner`. Emits an ERC-4906 event.
    /// @param delegate The contract that will handle `tokenURI` responses
    function delegateTokenURIs(address delegate) external onlyOwner {
        // CHECKS inputs
        require(delegate != address(0), "New metadata delegate must not be the zero address");
        require(delegate.code.length > 0, "New metadata delegate must be a contract");

        // EFFECTS
        baseURI = "";
        metadataContract = delegate;

        emit BatchMetadataUpdate(MIN_ID, MAX_ID);
    }

    // VIEW FUNCTIONS

    /// @notice The URI for the given token
    /// @dev Throws if `tokenId` is not valid or has not been minted
    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        _requireMinted(tokenId);

        if (address(metadataContract) != address(0)) {
            return IERC721Metadata(metadataContract).tokenURI(tokenId);
        }

        if (bytes(baseURI).length > 0) {
            return string(abi.encodePacked(baseURI, tokenId.toString(), ".json"));
        }

        revert("tokenURI not configured");
    }

    /// @notice Return whether the given tokenId has been minted yet
    function exists(uint256 tokenId) external view returns (bool) {
        return _exists(tokenId);
    }

    /// @notice Calculate how much royalty is owed and to whom
    /// @param salePrice - the sale price of the NFT asset
    /// @return receiver - address of where the royalty payment should be sent
    /// @return royaltyAmount - the royalty payment amount for salePrice
    function royaltyInfo(uint256, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount) {
        receiver = royaltyReceiver;
        // Use OpenZeppelin math utils for full precision multiply and divide without overflow.
        royaltyAmount = Math.mulDiv(salePrice, royaltyFraction, royaltyDenominator, Math.Rounding.Up);
    }

    /// @notice Query if a contract implements an interface
    /// @dev Interface identification is specified in ERC-165. This function uses less than 30,000 gas.
    /// @param interfaceId The interface identifier, as specified in ERC-165
    /// @return `true` if the contract implements `interfaceID` and `interfaceID` is not 0xffffffff, `false` otherwise
    function supportsInterface(bytes4 interfaceId) public pure virtual override returns (bool) {
        return
            interfaceId == 0x80ac58cd || // ERC-721 Non-Fungible Token Standard
            interfaceId == 0x5b5e139f || // ERC-721 Non-Fungible Token Standard - metadata extension
            interfaceId == 0x2a55205a || // ERC-2981 NFT Royalty Standard
            interfaceId == 0x49064906 || // ERC-4906 Metadata Update Extension
            interfaceId == 0x7f5828d0 || // ERC-173 Contract Ownership Standard
            interfaceId == 0x01ffc9a7; // ERC-165 Standard Interface Detection
    }

    // PRIVATE FUNCTIONS

    /// @dev OpenZeppelin hook that is called before any token transfer, including minting and burning
    function _beforeTokenTransfer(address from, address, uint256) internal virtual override {
        if (from != address(0) && from != msg.sender && !operatorAllowed(msg.sender)) {
            revert OperatorNotAllowed(msg.sender);
        }
    }
}

File 4 of 16 : TimeLimitedOperatorFilter.sol
// SPDX-License-Identifier: MIT
// Copyright (c) 2022 Fellowship

pragma solidity ^0.8.7;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address contract_, address operator) external view returns (bool);

    function registerAndSubscribe(address contract_, address subscription) external;
}

contract TimeLimitedOperatorFilter {
    /// @notice The OpenSea OperatorFilterRegistry deployment
    IOperatorFilterRegistry private constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);
    uint256 private constant FILTER_END_DATE = 1675227600; // 2023-02-01 00:00:00 EST

    error OperatorNotAllowed(address operator);

    constructor() {
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            // Subscribe to the "OpenSea Curated Subscription Address"
            OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);
        }
    }

    function operatorAllowed(address operator) internal view returns (bool) {
        return
            block.timestamp >= FILTER_END_DATE ||
            address(OPERATOR_FILTER_REGISTRY).code.length == 0 ||
            OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator);
    }
}

File 5 of 16 : OPENZEPPELIN_LICENSE.sol
// OpenZeppelin Contracts
//
// Copyright (c) 2016-2022 zOS Global Limited and contributors
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
// documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
// Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

File 6 of 16 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

File 7 of 16 : ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./extensions/IERC721Metadata.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/Strings.sol";
import "../../utils/introspection/ERC165.sol";

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: address zero is not a valid owner");
        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: invalid token ID");
        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) {
        _requireMinted(tokenId);

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

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

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

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token 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: caller is not token 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) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

File 8 of 16 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

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

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

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

File 9 of 16 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

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

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

File 10 of 16 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

File 11 of 16 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 12 of 16 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 13 of 16 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 14 of 16 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

File 15 of 16 : Math.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. It the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`.
        // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`.
        // This gives `2**k < a <= 2**(k+1)` → `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`.
        // Using an algorithm similar to the msb conmputation, we are able to compute `result = 2**(k/2)` which is a
        // good first aproximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1;
        uint256 x = a;
        if (x >> 128 > 0) {
            x >>= 128;
            result <<= 64;
        }
        if (x >> 64 > 0) {
            x >>= 64;
            result <<= 32;
        }
        if (x >> 32 > 0) {
            x >>= 32;
            result <<= 16;
        }
        if (x >> 16 > 0) {
            x >>= 16;
            result <<= 8;
        }
        if (x >> 8 > 0) {
            x >>= 8;
            result <<= 4;
        }
        if (x >> 4 > 0) {
            x >>= 4;
            result <<= 2;
        }
        if (x >> 2 > 0) {
            result <<= 1;
        }

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        uint256 result = sqrt(a);
        if (rounding == Rounding.Up && result * result < a) {
            result += 1;
        }
        return result;
    }
}

File 16 of 16 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @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 Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 1000
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"royaltyReceiver","type":"address"},{"internalType":"string","name":"baseURI_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"OnlyMinter","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"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":false,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"}],"name":"BatchMetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"MetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"delegate","type":"address"}],"name":"delegateTokenURIs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royaltyDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyFraction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter_","type":"address"}],"name":"setMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"royaltyFraction_","type":"uint256"},{"internalType":"uint256","name":"royaltyDenominator_","type":"uint256"}],"name":"setRoyaltyFraction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"royaltyReceiver_","type":"address"}],"name":"setRoyaltyReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"updateBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c0604052600a80556064600b553480156200001a57600080fd5b5060405162002a4738038062002a478339810160408190526200003d91620003f9565b83836001606485848481600090805190602001906200005e92919062000286565b5080516200007490600190602084019062000286565b505050620000916200008b6200023060201b60201c565b62000234565b6daaeb6d7670e522a718067333cd4e3b156200012257604051633e9f1edf60e11b8152306004820152733cc6cdda760b79bafa08df41ecfa224f810dceb660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe90604401600060405180830381600087803b1580156200010857600080fd5b505af11580156200011d573d6000803e3d6000fd5b505050505b81831115620001785760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420746f6b656e2049442072616e67650000000000000000000060448201526064015b60405180910390fd5b6001600160a01b038116620001e65760405162461bcd60e51b815260206004820152602d60248201527f526f79616c7479207265636569766572206d757374206e6f742062652074686560448201526c207a65726f206164647265737360981b60648201526084016200016f565b60809290925260a052600780546001600160a01b0319166001600160a01b03909216919091179055505080516200022590600d90602084019062000286565b5050505050620004e9565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200029490620004ac565b90600052602060002090601f016020900481019282620002b8576000855562000303565b82601f10620002d357805160ff191683800117855562000303565b8280016001018555821562000303579182015b8281111562000303578251825591602001919060010190620002e6565b506200031192915062000315565b5090565b5b8082111562000311576000815560010162000316565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200035457600080fd5b81516001600160401b03808211156200037157620003716200032c565b604051601f8301601f19908116603f011681019082821181831017156200039c576200039c6200032c565b81604052838152602092508683858801011115620003b957600080fd5b600091505b83821015620003dd5785820183015181830184015290820190620003be565b83821115620003ef5760008385830101525b9695505050505050565b600080600080608085870312156200041057600080fd5b84516001600160401b03808211156200042857600080fd5b620004368883890162000342565b955060208701519150808211156200044d57600080fd5b6200045b8883890162000342565b604088015190955091506001600160a01b03821682146200047b57600080fd5b6060870151919350808211156200049157600080fd5b50620004a08782880162000342565b91505092959194509250565b600181811c90821680620004c157607f821691505b60208210811415620004e357634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05161252a6200051d600039600081816108180152610cf30152600081816107f50152610cd0015261252a6000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c806370a082311161010f578063b88d4fde116100a2578063ecededad11610071578063ecededad1461043b578063f2fde38b1461044e578063fca3b5aa14610461578063fd8d7ed31461047457600080fd5b8063b88d4fde146103d0578063c87b56dd146103e3578063e7dee99f146103f6578063e985e9c5146103ff57600080fd5b8063931688cb116100de578063931688cb1461038f57806395d89b41146103a25780639fbc8713146103aa578063a22cb465146103bd57600080fd5b806370a0823114610350578063715018a6146103635780638da5cb5b1461036b5780638dc251e31461037c57600080fd5b806323b872dd1161018757806342842e0e1161015657806342842e0e1461030f5780634f558e79146103225780636352211e146103355780636c0360eb1461034857600080fd5b806323b872dd146102a45780632a55205a146102b757806335209821146102e957806340c10f19146102fc57600080fd5b8063081812fc116101c3578063081812fc14610252578063095ea7b314610265578063113b98e01461027a57806318160ddd1461028d57600080fd5b806301ffc9a7146101ea57806306fdde03146102125780630754617214610227575b600080fd5b6101fd6101f8366004611eca565b61047d565b60405190151581526020015b60405180910390f35b61021a6104c1565b6040516102099190611f3f565b60085461023a906001600160a01b031681565b6040516001600160a01b039091168152602001610209565b61023a610260366004611f52565b610553565b610278610273366004611f87565b61057a565b005b610278610288366004611fb1565b6106b1565b610296600c5481565b604051908152602001610209565b6102786102b2366004611fcc565b61086a565b6102ca6102c5366004612008565b6108f1565b604080516001600160a01b039093168352602083019190915201610209565b60095461023a906001600160a01b031681565b61027861030a366004611f87565b610920565b61027861031d366004611fcc565b6109d7565b6101fd610330366004611f52565b6109f2565b61023a610343366004611f52565b610a11565b61021a610a76565b61029661035e366004611fb1565b610b04565b610278610b9e565b6006546001600160a01b031661023a565b61027861038a366004611fb1565b610bb2565b61027861039d36600461202a565b610c58565b61021a610d46565b60075461023a906001600160a01b031681565b6102786103cb3660046120aa565b610d55565b6102786103de366004612150565b610d9f565b61021a6103f1366004611f52565b610e2d565b610296600a5481565b6101fd61040d3660046121fb565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610278610449366004612008565b610f73565b61027861045c366004611fb1565b61106e565b61027861046f366004611fb1565b6110fe565b610296600b5481565b60007f40c10f19000000000000000000000000000000000000000000000000000000006001600160e01b0319831614806104bb57506104bb82611128565b92915050565b6060600080546104d090612225565b80601f01602080910402602001604051908101604052809291908181526020018280546104fc90612225565b80156105495780601f1061051e57610100808354040283529160200191610549565b820191906000526020600020905b81548152906001019060200180831161052c57829003601f168201915b5050505050905090565b600061055e8261125d565b506000908152600460205260409020546001600160a01b031690565b600061058582610a11565b9050806001600160a01b0316836001600160a01b031614156106145760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b336001600160a01b03821614806106305750610630813361040d565b6106a25760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000606482015260840161060b565b6106ac83836112c1565b505050565b6106b961132f565b6001600160a01b0381166107355760405162461bcd60e51b815260206004820152603260248201527f4e6577206d657461646174612064656c6567617465206d757374206e6f74206260448201527f6520746865207a65726f20616464726573730000000000000000000000000000606482015260840161060b565b6000816001600160a01b03163b116107b55760405162461bcd60e51b815260206004820152602860248201527f4e6577206d657461646174612064656c6567617465206d75737420626520612060448201527f636f6e7472616374000000000000000000000000000000000000000000000000606482015260840161060b565b6040805160208101918290526000908190526107d391600d91611da7565b50600980546001600160a01b0319166001600160a01b038316179055604080517f000000000000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060208201527f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c910160405180910390a150565b6108743382611389565b6108e65760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206e6f7220617070726f766564000000000000000000000000000000000000606482015260840161060b565b6106ac838383611408565b600754600a54600b546001600160a01b03909216916000916109179185919060016115e0565b90509250929050565b6008546001600160a01b03163314610964576040517f9cdc2ed500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8015801590610974575060648111155b6109c05760405162461bcd60e51b815260206004820152601060248201527f496e76616c696420746f6b656e20494400000000000000000000000000000000604482015260640161060b565b6109ca828261163d565b5050600c80546001019055565b6106ac83838360405180602001604052806000815250610d9f565b6000818152600260205260408120546001600160a01b031615156104bb565b6000818152600260205260408120546001600160a01b0316806104bb5760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e2049440000000000000000604482015260640161060b565b600d8054610a8390612225565b80601f0160208091040260200160405190810160405280929190818152602001828054610aaf90612225565b8015610afc5780601f10610ad157610100808354040283529160200191610afc565b820191906000526020600020905b815481529060010190602001808311610adf57829003601f168201915b505050505081565b60006001600160a01b038216610b825760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e65720000000000000000000000000000000000000000000000606482015260840161060b565b506001600160a01b031660009081526003602052604090205490565b610ba661132f565b610bb0600061178b565b565b610bba61132f565b6001600160a01b038116610c365760405162461bcd60e51b815260206004820152602d60248201527f526f79616c7479207265636569766572206d757374206e6f742062652074686560448201527f207a65726f206164647265737300000000000000000000000000000000000000606482015260840161060b565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b610c6061132f565b80610cad5760405162461bcd60e51b815260206004820152601d60248201527f4e6577206261736520555249206d7573742062652070726f7669646564000000604482015260640161060b565b610cb9600d8383611e2b565b50600980546001600160a01b0319169055604080517f000000000000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060208201527f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c910160405180910390a15050565b6060600180546104d090612225565b808015610d685750610d66826117dd565b155b15610d9157604051633b79c77360e21b81526001600160a01b038316600482015260240161060b565b610d9b82826118a9565b5050565b610da93383611389565b610e1b5760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206e6f7220617070726f766564000000000000000000000000000000000000606482015260840161060b565b610e27848484846118b4565b50505050565b6060610e388261125d565b6009546001600160a01b031615610ee2576009546040517fc87b56dd000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b039091169063c87b56dd9060240160006040518083038186803b158015610ea657600080fd5b505afa158015610eba573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104bb9190810190612260565b6000600d8054610ef190612225565b90501115610f2b57600d610f048361193d565b604051602001610f159291906122ea565b6040516020818303038152906040529050919050565b60405162461bcd60e51b815260206004820152601760248201527f746f6b656e555249206e6f7420636f6e66696775726564000000000000000000604482015260640161060b565b610f7b61132f565b80610fed5760405162461bcd60e51b8152602060048201526024808201527f526f79616c74792064656e6f6d696e61746f72206d757374206e6f742062652060448201527f7a65726f00000000000000000000000000000000000000000000000000000000606482015260840161060b565b808211156110635760405162461bcd60e51b815260206004820152602e60248201527f526f79616c7479206672616374696f6e206d757374206e6f742062652067726560448201527f61746572207468616e2031303025000000000000000000000000000000000000606482015260840161060b565b600a91909155600b55565b61107661132f565b6001600160a01b0381166110f25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161060b565b6110fb8161178b565b50565b61110661132f565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60007f80ac58cd000000000000000000000000000000000000000000000000000000006001600160e01b03198316148061118b57507f5b5e139f000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b806111bf57507f2a55205a000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b806111f357507f49064906000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b8061122757507f7f5828d0000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b806104bb5750506001600160e01b0319167f01ffc9a7000000000000000000000000000000000000000000000000000000001490565b6000818152600260205260409020546001600160a01b03166110fb5760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e2049440000000000000000604482015260640161060b565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906112f682610a11565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6006546001600160a01b03163314610bb05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161060b565b60008061139583610a11565b9050806001600160a01b0316846001600160a01b031614806113dc57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806114005750836001600160a01b03166113f584610553565b6001600160a01b0316145b949350505050565b826001600160a01b031661141b82610a11565b6001600160a01b0316146114975760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e6572000000000000000000000000000000000000000000000000000000606482015260840161060b565b6001600160a01b0382166115125760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161060b565b61151d838383611a6f565b6115286000826112c1565b6001600160a01b03831660009081526003602052604081208054600192906115519084906123ca565b90915550506001600160a01b038216600090815260036020526040812080546001929061157f9084906123e1565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000806115ee868686611ac2565b90506001836002811115611604576116046123f9565b14801561162157506000848061161c5761161c61240f565b868809115b15611634576116316001826123e1565b90505b95945050505050565b6001600160a01b0382166116935760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161060b565b6000818152600260205260409020546001600160a01b0316156116f85760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161060b565b61170460008383611a6f565b6001600160a01b038216600090815260036020526040812080546001929061172d9084906123e1565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006363d9f1d0421015806117ff57506daaeb6d7670e522a718067333cd4e3b155b806104bb57506040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063c61711349060440160206040518083038186803b15801561187157600080fd5b505afa158015611885573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104bb9190612425565b610d9b338383611b78565b6118bf848484611408565b6118cb84848484611c47565b610e275760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161060b565b60608161197d57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156119a7578061199181612442565b91506119a09050600a8361245d565b9150611981565b60008167ffffffffffffffff8111156119c2576119c26120e1565b6040519080825280601f01601f1916602001820160405280156119ec576020820181803683370190505b5090505b841561140057611a016001836123ca565b9150611a0e600a86612471565b611a199060306123e1565b60f81b818381518110611a2e57611a2e612485565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611a68600a8661245d565b94506119f0565b6001600160a01b03831615801590611a9057506001600160a01b0383163314155b8015611aa25750611aa0336117dd565b155b156106ac57604051633b79c77360e21b815233600482015260240161060b565b600080806000198587098587029250828110838203039150508060001415611afd57838281611af357611af361240f565b0492505050611b71565b808411611b0957600080fd5b600084868809851960019081018716968790049682860381900495909211909303600082900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b816001600160a01b0316836001600160a01b03161415611bda5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161060b565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60006001600160a01b0384163b15611d9f57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611c8b90339089908890889060040161249b565b602060405180830381600087803b158015611ca557600080fd5b505af1925050508015611cd5575060408051601f3d908101601f19168201909252611cd2918101906124d7565b60015b611d85573d808015611d03576040519150601f19603f3d011682016040523d82523d6000602084013e611d08565b606091505b508051611d7d5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161060b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611400565b506001611400565b828054611db390612225565b90600052602060002090601f016020900481019282611dd55760008555611e1b565b82601f10611dee57805160ff1916838001178555611e1b565b82800160010185558215611e1b579182015b82811115611e1b578251825591602001919060010190611e00565b50611e27929150611e9f565b5090565b828054611e3790612225565b90600052602060002090601f016020900481019282611e595760008555611e1b565b82601f10611e725782800160ff19823516178555611e1b565b82800160010185558215611e1b579182015b82811115611e1b578235825591602001919060010190611e84565b5b80821115611e275760008155600101611ea0565b6001600160e01b0319811681146110fb57600080fd5b600060208284031215611edc57600080fd5b8135611b7181611eb4565b60005b83811015611f02578181015183820152602001611eea565b83811115610e275750506000910152565b60008151808452611f2b816020860160208601611ee7565b601f01601f19169290920160200192915050565b602081526000611b716020830184611f13565b600060208284031215611f6457600080fd5b5035919050565b80356001600160a01b0381168114611f8257600080fd5b919050565b60008060408385031215611f9a57600080fd5b611fa383611f6b565b946020939093013593505050565b600060208284031215611fc357600080fd5b611b7182611f6b565b600080600060608486031215611fe157600080fd5b611fea84611f6b565b9250611ff860208501611f6b565b9150604084013590509250925092565b6000806040838503121561201b57600080fd5b50508035926020909101359150565b6000806020838503121561203d57600080fd5b823567ffffffffffffffff8082111561205557600080fd5b818501915085601f83011261206957600080fd5b81358181111561207857600080fd5b86602082850101111561208a57600080fd5b60209290920196919550909350505050565b80151581146110fb57600080fd5b600080604083850312156120bd57600080fd5b6120c683611f6b565b915060208301356120d68161209c565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612120576121206120e1565b604052919050565b600067ffffffffffffffff821115612142576121426120e1565b50601f01601f191660200190565b6000806000806080858703121561216657600080fd5b61216f85611f6b565b935061217d60208601611f6b565b925060408501359150606085013567ffffffffffffffff8111156121a057600080fd5b8501601f810187136121b157600080fd5b80356121c46121bf82612128565b6120f7565b8181528860208385010111156121d957600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b6000806040838503121561220e57600080fd5b61221783611f6b565b915061091760208401611f6b565b600181811c9082168061223957607f821691505b6020821081141561225a57634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561227257600080fd5b815167ffffffffffffffff81111561228957600080fd5b8201601f8101841361229a57600080fd5b80516122a86121bf82612128565b8181528560208385010111156122bd57600080fd5b611634826020830160208601611ee7565b600081516122e0818560208601611ee7565b9290920192915050565b600080845481600182811c91508083168061230657607f831692505b602080841082141561232657634e487b7160e01b86526022600452602486fd5b81801561233a576001811461234b57612378565b60ff19861689528489019650612378565b60008b81526020902060005b868110156123705781548b820152908501908301612357565b505084890196505b50505050505061163461238b82866122ce565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815260050190565b634e487b7160e01b600052601160045260246000fd5b6000828210156123dc576123dc6123b4565b500390565b600082198211156123f4576123f46123b4565b500190565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b60006020828403121561243757600080fd5b8151611b718161209c565b6000600019821415612456576124566123b4565b5060010190565b60008261246c5761246c61240f565b500490565b6000826124805761248061240f565b500690565b634e487b7160e01b600052603260045260246000fd5b60006001600160a01b038087168352808616602084015250836040830152608060608301526124cd6080830184611f13565b9695505050505050565b6000602082840312156124e957600080fd5b8151611b7181611eb456fea2646970667358221220c456389cb5a5cb1fef762e8bbcee85b015385a7610dcb5cac73156507281fc6164736f6c63430008090033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000e38398a94b84e527114252a4b79bde3905c47f7a0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000b4c69676874205965617273000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4c49474854594541525300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d51616b64485637696255537036674d7537733445526473656272623631426674774177735a325174524c39322f00000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101e55760003560e01c806370a082311161010f578063b88d4fde116100a2578063ecededad11610071578063ecededad1461043b578063f2fde38b1461044e578063fca3b5aa14610461578063fd8d7ed31461047457600080fd5b8063b88d4fde146103d0578063c87b56dd146103e3578063e7dee99f146103f6578063e985e9c5146103ff57600080fd5b8063931688cb116100de578063931688cb1461038f57806395d89b41146103a25780639fbc8713146103aa578063a22cb465146103bd57600080fd5b806370a0823114610350578063715018a6146103635780638da5cb5b1461036b5780638dc251e31461037c57600080fd5b806323b872dd1161018757806342842e0e1161015657806342842e0e1461030f5780634f558e79146103225780636352211e146103355780636c0360eb1461034857600080fd5b806323b872dd146102a45780632a55205a146102b757806335209821146102e957806340c10f19146102fc57600080fd5b8063081812fc116101c3578063081812fc14610252578063095ea7b314610265578063113b98e01461027a57806318160ddd1461028d57600080fd5b806301ffc9a7146101ea57806306fdde03146102125780630754617214610227575b600080fd5b6101fd6101f8366004611eca565b61047d565b60405190151581526020015b60405180910390f35b61021a6104c1565b6040516102099190611f3f565b60085461023a906001600160a01b031681565b6040516001600160a01b039091168152602001610209565b61023a610260366004611f52565b610553565b610278610273366004611f87565b61057a565b005b610278610288366004611fb1565b6106b1565b610296600c5481565b604051908152602001610209565b6102786102b2366004611fcc565b61086a565b6102ca6102c5366004612008565b6108f1565b604080516001600160a01b039093168352602083019190915201610209565b60095461023a906001600160a01b031681565b61027861030a366004611f87565b610920565b61027861031d366004611fcc565b6109d7565b6101fd610330366004611f52565b6109f2565b61023a610343366004611f52565b610a11565b61021a610a76565b61029661035e366004611fb1565b610b04565b610278610b9e565b6006546001600160a01b031661023a565b61027861038a366004611fb1565b610bb2565b61027861039d36600461202a565b610c58565b61021a610d46565b60075461023a906001600160a01b031681565b6102786103cb3660046120aa565b610d55565b6102786103de366004612150565b610d9f565b61021a6103f1366004611f52565b610e2d565b610296600a5481565b6101fd61040d3660046121fb565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610278610449366004612008565b610f73565b61027861045c366004611fb1565b61106e565b61027861046f366004611fb1565b6110fe565b610296600b5481565b60007f40c10f19000000000000000000000000000000000000000000000000000000006001600160e01b0319831614806104bb57506104bb82611128565b92915050565b6060600080546104d090612225565b80601f01602080910402602001604051908101604052809291908181526020018280546104fc90612225565b80156105495780601f1061051e57610100808354040283529160200191610549565b820191906000526020600020905b81548152906001019060200180831161052c57829003601f168201915b5050505050905090565b600061055e8261125d565b506000908152600460205260409020546001600160a01b031690565b600061058582610a11565b9050806001600160a01b0316836001600160a01b031614156106145760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b336001600160a01b03821614806106305750610630813361040d565b6106a25760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000606482015260840161060b565b6106ac83836112c1565b505050565b6106b961132f565b6001600160a01b0381166107355760405162461bcd60e51b815260206004820152603260248201527f4e6577206d657461646174612064656c6567617465206d757374206e6f74206260448201527f6520746865207a65726f20616464726573730000000000000000000000000000606482015260840161060b565b6000816001600160a01b03163b116107b55760405162461bcd60e51b815260206004820152602860248201527f4e6577206d657461646174612064656c6567617465206d75737420626520612060448201527f636f6e7472616374000000000000000000000000000000000000000000000000606482015260840161060b565b6040805160208101918290526000908190526107d391600d91611da7565b50600980546001600160a01b0319166001600160a01b038316179055604080517f000000000000000000000000000000000000000000000000000000000000000181527f000000000000000000000000000000000000000000000000000000000000006460208201527f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c910160405180910390a150565b6108743382611389565b6108e65760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206e6f7220617070726f766564000000000000000000000000000000000000606482015260840161060b565b6106ac838383611408565b600754600a54600b546001600160a01b03909216916000916109179185919060016115e0565b90509250929050565b6008546001600160a01b03163314610964576040517f9cdc2ed500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8015801590610974575060648111155b6109c05760405162461bcd60e51b815260206004820152601060248201527f496e76616c696420746f6b656e20494400000000000000000000000000000000604482015260640161060b565b6109ca828261163d565b5050600c80546001019055565b6106ac83838360405180602001604052806000815250610d9f565b6000818152600260205260408120546001600160a01b031615156104bb565b6000818152600260205260408120546001600160a01b0316806104bb5760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e2049440000000000000000604482015260640161060b565b600d8054610a8390612225565b80601f0160208091040260200160405190810160405280929190818152602001828054610aaf90612225565b8015610afc5780601f10610ad157610100808354040283529160200191610afc565b820191906000526020600020905b815481529060010190602001808311610adf57829003601f168201915b505050505081565b60006001600160a01b038216610b825760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e65720000000000000000000000000000000000000000000000606482015260840161060b565b506001600160a01b031660009081526003602052604090205490565b610ba661132f565b610bb0600061178b565b565b610bba61132f565b6001600160a01b038116610c365760405162461bcd60e51b815260206004820152602d60248201527f526f79616c7479207265636569766572206d757374206e6f742062652074686560448201527f207a65726f206164647265737300000000000000000000000000000000000000606482015260840161060b565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b610c6061132f565b80610cad5760405162461bcd60e51b815260206004820152601d60248201527f4e6577206261736520555249206d7573742062652070726f7669646564000000604482015260640161060b565b610cb9600d8383611e2b565b50600980546001600160a01b0319169055604080517f000000000000000000000000000000000000000000000000000000000000000181527f000000000000000000000000000000000000000000000000000000000000006460208201527f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c910160405180910390a15050565b6060600180546104d090612225565b808015610d685750610d66826117dd565b155b15610d9157604051633b79c77360e21b81526001600160a01b038316600482015260240161060b565b610d9b82826118a9565b5050565b610da93383611389565b610e1b5760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206e6f7220617070726f766564000000000000000000000000000000000000606482015260840161060b565b610e27848484846118b4565b50505050565b6060610e388261125d565b6009546001600160a01b031615610ee2576009546040517fc87b56dd000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b039091169063c87b56dd9060240160006040518083038186803b158015610ea657600080fd5b505afa158015610eba573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104bb9190810190612260565b6000600d8054610ef190612225565b90501115610f2b57600d610f048361193d565b604051602001610f159291906122ea565b6040516020818303038152906040529050919050565b60405162461bcd60e51b815260206004820152601760248201527f746f6b656e555249206e6f7420636f6e66696775726564000000000000000000604482015260640161060b565b610f7b61132f565b80610fed5760405162461bcd60e51b8152602060048201526024808201527f526f79616c74792064656e6f6d696e61746f72206d757374206e6f742062652060448201527f7a65726f00000000000000000000000000000000000000000000000000000000606482015260840161060b565b808211156110635760405162461bcd60e51b815260206004820152602e60248201527f526f79616c7479206672616374696f6e206d757374206e6f742062652067726560448201527f61746572207468616e2031303025000000000000000000000000000000000000606482015260840161060b565b600a91909155600b55565b61107661132f565b6001600160a01b0381166110f25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161060b565b6110fb8161178b565b50565b61110661132f565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60007f80ac58cd000000000000000000000000000000000000000000000000000000006001600160e01b03198316148061118b57507f5b5e139f000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b806111bf57507f2a55205a000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b806111f357507f49064906000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b8061122757507f7f5828d0000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b806104bb5750506001600160e01b0319167f01ffc9a7000000000000000000000000000000000000000000000000000000001490565b6000818152600260205260409020546001600160a01b03166110fb5760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e2049440000000000000000604482015260640161060b565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906112f682610a11565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6006546001600160a01b03163314610bb05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161060b565b60008061139583610a11565b9050806001600160a01b0316846001600160a01b031614806113dc57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806114005750836001600160a01b03166113f584610553565b6001600160a01b0316145b949350505050565b826001600160a01b031661141b82610a11565b6001600160a01b0316146114975760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e6572000000000000000000000000000000000000000000000000000000606482015260840161060b565b6001600160a01b0382166115125760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161060b565b61151d838383611a6f565b6115286000826112c1565b6001600160a01b03831660009081526003602052604081208054600192906115519084906123ca565b90915550506001600160a01b038216600090815260036020526040812080546001929061157f9084906123e1565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000806115ee868686611ac2565b90506001836002811115611604576116046123f9565b14801561162157506000848061161c5761161c61240f565b868809115b15611634576116316001826123e1565b90505b95945050505050565b6001600160a01b0382166116935760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161060b565b6000818152600260205260409020546001600160a01b0316156116f85760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161060b565b61170460008383611a6f565b6001600160a01b038216600090815260036020526040812080546001929061172d9084906123e1565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006363d9f1d0421015806117ff57506daaeb6d7670e522a718067333cd4e3b155b806104bb57506040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063c61711349060440160206040518083038186803b15801561187157600080fd5b505afa158015611885573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104bb9190612425565b610d9b338383611b78565b6118bf848484611408565b6118cb84848484611c47565b610e275760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161060b565b60608161197d57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156119a7578061199181612442565b91506119a09050600a8361245d565b9150611981565b60008167ffffffffffffffff8111156119c2576119c26120e1565b6040519080825280601f01601f1916602001820160405280156119ec576020820181803683370190505b5090505b841561140057611a016001836123ca565b9150611a0e600a86612471565b611a199060306123e1565b60f81b818381518110611a2e57611a2e612485565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611a68600a8661245d565b94506119f0565b6001600160a01b03831615801590611a9057506001600160a01b0383163314155b8015611aa25750611aa0336117dd565b155b156106ac57604051633b79c77360e21b815233600482015260240161060b565b600080806000198587098587029250828110838203039150508060001415611afd57838281611af357611af361240f565b0492505050611b71565b808411611b0957600080fd5b600084868809851960019081018716968790049682860381900495909211909303600082900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b816001600160a01b0316836001600160a01b03161415611bda5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161060b565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60006001600160a01b0384163b15611d9f57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611c8b90339089908890889060040161249b565b602060405180830381600087803b158015611ca557600080fd5b505af1925050508015611cd5575060408051601f3d908101601f19168201909252611cd2918101906124d7565b60015b611d85573d808015611d03576040519150601f19603f3d011682016040523d82523d6000602084013e611d08565b606091505b508051611d7d5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161060b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611400565b506001611400565b828054611db390612225565b90600052602060002090601f016020900481019282611dd55760008555611e1b565b82601f10611dee57805160ff1916838001178555611e1b565b82800160010185558215611e1b579182015b82811115611e1b578251825591602001919060010190611e00565b50611e27929150611e9f565b5090565b828054611e3790612225565b90600052602060002090601f016020900481019282611e595760008555611e1b565b82601f10611e725782800160ff19823516178555611e1b565b82800160010185558215611e1b579182015b82811115611e1b578235825591602001919060010190611e84565b5b80821115611e275760008155600101611ea0565b6001600160e01b0319811681146110fb57600080fd5b600060208284031215611edc57600080fd5b8135611b7181611eb4565b60005b83811015611f02578181015183820152602001611eea565b83811115610e275750506000910152565b60008151808452611f2b816020860160208601611ee7565b601f01601f19169290920160200192915050565b602081526000611b716020830184611f13565b600060208284031215611f6457600080fd5b5035919050565b80356001600160a01b0381168114611f8257600080fd5b919050565b60008060408385031215611f9a57600080fd5b611fa383611f6b565b946020939093013593505050565b600060208284031215611fc357600080fd5b611b7182611f6b565b600080600060608486031215611fe157600080fd5b611fea84611f6b565b9250611ff860208501611f6b565b9150604084013590509250925092565b6000806040838503121561201b57600080fd5b50508035926020909101359150565b6000806020838503121561203d57600080fd5b823567ffffffffffffffff8082111561205557600080fd5b818501915085601f83011261206957600080fd5b81358181111561207857600080fd5b86602082850101111561208a57600080fd5b60209290920196919550909350505050565b80151581146110fb57600080fd5b600080604083850312156120bd57600080fd5b6120c683611f6b565b915060208301356120d68161209c565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612120576121206120e1565b604052919050565b600067ffffffffffffffff821115612142576121426120e1565b50601f01601f191660200190565b6000806000806080858703121561216657600080fd5b61216f85611f6b565b935061217d60208601611f6b565b925060408501359150606085013567ffffffffffffffff8111156121a057600080fd5b8501601f810187136121b157600080fd5b80356121c46121bf82612128565b6120f7565b8181528860208385010111156121d957600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b6000806040838503121561220e57600080fd5b61221783611f6b565b915061091760208401611f6b565b600181811c9082168061223957607f821691505b6020821081141561225a57634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561227257600080fd5b815167ffffffffffffffff81111561228957600080fd5b8201601f8101841361229a57600080fd5b80516122a86121bf82612128565b8181528560208385010111156122bd57600080fd5b611634826020830160208601611ee7565b600081516122e0818560208601611ee7565b9290920192915050565b600080845481600182811c91508083168061230657607f831692505b602080841082141561232657634e487b7160e01b86526022600452602486fd5b81801561233a576001811461234b57612378565b60ff19861689528489019650612378565b60008b81526020902060005b868110156123705781548b820152908501908301612357565b505084890196505b50505050505061163461238b82866122ce565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815260050190565b634e487b7160e01b600052601160045260246000fd5b6000828210156123dc576123dc6123b4565b500390565b600082198211156123f4576123f46123b4565b500190565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b60006020828403121561243757600080fd5b8151611b718161209c565b6000600019821415612456576124566123b4565b5060010190565b60008261246c5761246c61240f565b500490565b6000826124805761248061240f565b500690565b634e487b7160e01b600052603260045260246000fd5b60006001600160a01b038087168352808616602084015250836040830152608060608301526124cd6080830184611f13565b9695505050505050565b6000602082840312156124e957600080fd5b8151611b7181611eb456fea2646970667358221220c456389cb5a5cb1fef762e8bbcee85b015385a7610dcb5cac73156507281fc6164736f6c63430008090033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000e38398a94b84e527114252a4b79bde3905c47f7a0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000b4c69676874205965617273000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4c49474854594541525300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d51616b64485637696255537036674d7537733445526473656272623631426674774177735a325174524c39322f00000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Light Years
Arg [1] : symbol (string): LIGHTYEARS
Arg [2] : royaltyReceiver (address): 0xE38398A94B84e527114252a4B79bDe3905c47F7a
Arg [3] : baseURI_ (string): https://ipfs.io/ipfs/QmQakdHV7ibUSp6gMu7s4ERdsebrb61BftwAwsZ2QtRL92/

-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 000000000000000000000000e38398a94b84e527114252a4b79bde3905c47f7a
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [5] : 4c69676874205965617273000000000000000000000000000000000000000000
Arg [6] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [7] : 4c49474854594541525300000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000044
Arg [9] : 68747470733a2f2f697066732e696f2f697066732f516d51616b644856376962
Arg [10] : 55537036674d7537733445526473656272623631426674774177735a32517452
Arg [11] : 4c39322f00000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

118:1521:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1393:244;;;;;;:::i;:::-;;:::i;:::-;;;611:14:16;;604:22;586:41;;574:2;559:18;1393:244:13;;;;;;;;2470:98:2;;;:::i;:::-;;;;;;;:::i;669:21:15:-;;;;;-1:-1:-1;;;;;669:21:15;;;;;;-1:-1:-1;;;;;1575:55:16;;;1557:74;;1545:2;1530:18;669:21:15;1411:226:16;3935:167:2;;;;;;:::i;:::-;;:::i;3467:407::-;;;;;;:::i;:::-;;:::i;:::-;;4791:408:15;;;;;;:::i;:::-;;:::i;960:26::-;;;;;;;;;2624:25:16;;;2612:2;2597:18;960:26:15;2478:177:16;4612:327:2;;;;;;:::i;:::-;;:::i;6235:355:15:-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3438:55:16;;;3420:74;;3525:2;3510:18;;3503:34;;;;3393:18;6235:355:15;3246:297:16;696:31:15;;;;;-1:-1:-1;;;;;696:31:15;;;690:337:13;;;;;;:::i;:::-;;:::i;5005:179:2:-;;;;;;:::i;:::-;;:::i;5853:102:15:-;;;;;;:::i;:::-;;:::i;2190:218:2:-;;;;;;:::i;:::-;;:::i;1065:21:15:-;;;:::i;1929:204:2:-;;;;;;:::i;:::-;;:::i;1831:101:1:-;;;:::i;1201:85::-;1273:6;;-1:-1:-1;;;;;1273:6:1;1201:85;;3153:266:15;;;;;;:::i;:::-;;:::i;4246:316::-;;;;;;:::i;:::-;;:::i;2632:102:2:-;;;:::i;633:30:15:-;;;;;-1:-1:-1;;;;;633:30:15;;;2540:286;;;;;;:::i;:::-;;:::i;5250:315:2:-;;;;;;:::i;:::-;;:::i;5341:437:15:-;;;;;;:::i;:::-;;:::i;734:35::-;;;;;;4388:162:2;;;;;;:::i;:::-;-1:-1:-1;;;;;4508:25:2;;;4485:4;4508:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4388:162;3525:438:15;;;;;;:::i;:::-;;:::i;2081:198:1:-;;;;;;:::i;:::-;;:::i;2953:88:15:-;;;;;;:::i;:::-;;:::i;775:39::-;;;;;;1393:244:13;1478:4;1513:25;-1:-1:-1;;;;;;1513:25:13;;;;:117;;;1594:36;1618:11;1594:23;:36::i;:::-;1494:136;1393:244;-1:-1:-1;;1393:244:13:o;2470:98:2:-;2524:13;2556:5;2549:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2470:98;:::o;3935:167::-;4011:7;4030:23;4045:7;4030:14;:23::i;:::-;-1:-1:-1;4071:24:2;;;;:15;:24;;;;;;-1:-1:-1;;;;;4071:24:2;;3935:167::o;3467:407::-;3547:13;3563:23;3578:7;3563:14;:23::i;:::-;3547:39;;3610:5;-1:-1:-1;;;;;3604:11:2;:2;-1:-1:-1;;;;;3604:11:2;;;3596:57;;;;-1:-1:-1;;;3596:57:2;;7050:2:16;3596:57:2;;;7032:21:16;7089:2;7069:18;;;7062:30;7128:34;7108:18;;;7101:62;7199:3;7179:18;;;7172:31;7220:19;;3596:57:2;;;;;;;;;719:10:7;-1:-1:-1;;;;;3685:21:2;;;;:62;;-1:-1:-1;3710:37:2;3727:5;719:10:7;4388:162:2;:::i;3710:37::-;3664:171;;;;-1:-1:-1;;;3664:171:2;;7452:2:16;3664:171:2;;;7434:21:16;7491:2;7471:18;;;7464:30;7530:34;7510:18;;;7503:62;7601:32;7581:18;;;7574:60;7651:19;;3664:171:2;7250:426:16;3664:171:2;3846:21;3855:2;3859:7;3846:8;:21::i;:::-;3537:337;3467:407;;:::o;4791:408:15:-;1094:13:1;:11;:13::i;:::-;-1:-1:-1;;;;;4898:22:15;::::1;4890:85;;;::::0;-1:-1:-1;;;4890:85:15;;7883:2:16;4890:85:15::1;::::0;::::1;7865:21:16::0;7922:2;7902:18;;;7895:30;7961:34;7941:18;;;7934:62;8032:20;8012:18;;;8005:48;8070:19;;4890:85:15::1;7681:414:16::0;4890:85:15::1;5016:1;4993:8;-1:-1:-1::0;;;;;4993:20:15::1;;:24;4985:77;;;::::0;-1:-1:-1;;;4985:77:15;;8302:2:16;4985:77:15::1;::::0;::::1;8284:21:16::0;8341:2;8321:18;;;8314:30;8380:34;8360:18;;;8353:62;8451:10;8431:18;;;8424:38;8479:19;;4985:77:15::1;8100:404:16::0;4985:77:15::1;5092:12;::::0;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;5092:12:15;;;;::::1;::::0;:7:::1;::::0;:12:::1;:::i;:::-;-1:-1:-1::0;5114:16:15::1;:27:::0;;-1:-1:-1;;;;;;5114:27:15::1;-1:-1:-1::0;;;;;5114:27:15;::::1;;::::0;;5157:35:::1;::::0;;5177:6:::1;8683:25:16::0;;5185:6:15::1;8739:2:16::0;8724:18;;8717:34;5157:35:15::1;::::0;8656:18:16;5157:35:15::1;;;;;;;4791:408:::0;:::o;4612:327:2:-;4801:41;719:10:7;4834:7:2;4801:18;:41::i;:::-;4793:100;;;;-1:-1:-1;;;4793:100:2;;8964:2:16;4793:100:2;;;8946:21:16;9003:2;8983:18;;;8976:30;9042:34;9022:18;;;9015:62;9113:16;9093:18;;;9086:44;9147:19;;4793:100:2;8762:410:16;4793:100:2;4904:28;4914:4;4920:2;4924:7;4904:9;:28::i;6235:355:15:-;6369:15;;6529;;6546:18;;-1:-1:-1;;;;;6369:15:15;;;;6307:16;;6506:77;;6518:9;;6529:15;6369;6506:11;:77::i;:::-;6490:93;;6235:355;;;;;:::o;690:337:13:-;2112:6:15;;-1:-1:-1;;;;;2112:6:15;2098:10;:20;2094:45;;2127:12;;;;;;;;;;;;;;2094:45;796:12:13;;;::::1;::::0;:30:::1;;;823:3;812:7;:14;;796:30;788:59;;;::::0;-1:-1:-1;;;788:59:13;;9379:2:16;788:59:13::1;::::0;::::1;9361:21:16::0;9418:2;9398:18;;;9391:30;9457:18;9437;;;9430:46;9493:18;;788:59:13::1;9177:340:16::0;788:59:13::1;921:18;927:2;931:7;921:5;:18::i;:::-;-1:-1:-1::0;;997:11:13::1;:13:::0;;::::1;;::::0;;690:337::o;5005:179:2:-;5138:39;5155:4;5161:2;5165:7;5138:39;;;;;;;;;;;;:16;:39::i;5853:102:15:-;5909:4;7122:16:2;;;:7;:16;;;;;;-1:-1:-1;;;;;7122:16:2;:30;;5932:16:15;7034:125:2;2190:218;2262:7;2297:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2297:16:2;2331:19;2323:56;;;;-1:-1:-1;;;2323:56:2;;9724:2:16;2323:56:2;;;9706:21:16;9763:2;9743:18;;;9736:30;9802:26;9782:18;;;9775:54;9846:18;;2323:56:2;9522:348:16;1065:21:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1929:204:2:-;2001:7;-1:-1:-1;;;;;2028:19:2;;2020:73;;;;-1:-1:-1;;;2020:73:2;;10077:2:16;2020:73:2;;;10059:21:16;10116:2;10096:18;;;10089:30;10155:34;10135:18;;;10128:62;10226:11;10206:18;;;10199:39;10255:19;;2020:73:2;9875:405:16;2020:73:2;-1:-1:-1;;;;;;2110:16:2;;;;;:9;:16;;;;;;;1929:204::o;1831:101:1:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;3153:266:15:-;1094:13:1;:11;:13::i;:::-;-1:-1:-1;;;;;3269:30:15;::::1;3261:88;;;::::0;-1:-1:-1;;;3261:88:15;;10487:2:16;3261:88:15::1;::::0;::::1;10469:21:16::0;10526:2;10506:18;;;10499:30;10565:34;10545:18;;;10538:62;10636:15;10616:18;;;10609:43;10669:19;;3261:88:15::1;10285:409:16::0;3261:88:15::1;3378:15;:34:::0;;-1:-1:-1;;;;;;3378:34:15::1;-1:-1:-1::0;;;;;3378:34:15;;;::::1;::::0;;;::::1;::::0;;3153:266::o;4246:316::-;1094:13:1;:11;:13::i;:::-;4357:26:15;4349:68:::1;;;::::0;-1:-1:-1;;;4349:68:15;;10901:2:16;4349:68:15::1;::::0;::::1;10883:21:16::0;10940:2;10920:18;;;10913:30;10979:31;10959:18;;;10952:59;11028:18;;4349:68:15::1;10699:353:16::0;4349:68:15::1;4447:18;:7;4457:8:::0;;4447:18:::1;:::i;:::-;-1:-1:-1::0;4475:16:15::1;:29:::0;;-1:-1:-1;;;;;;4475:29:15::1;::::0;;4520:35:::1;::::0;;4540:6:::1;8683:25:16::0;;4548:6:15::1;8739:2:16::0;8724:18;;8717:34;4520:35:15::1;::::0;8656:18:16;4520:35:15::1;;;;;;;4246:316:::0;;:::o;2632:102:2:-;2688:13;2720:7;2713:14;;;;;:::i;2540:286:15:-;2663:8;:38;;;;;2676:25;2692:8;2676:15;:25::i;:::-;2675:26;2663:38;2659:79;;;2710:28;;-1:-1:-1;;;2710:28:15;;-1:-1:-1;;;;;1575:55:16;;2710:28:15;;;1557:74:16;1530:18;;2710:28:15;1411:226:16;2659:79:15;2776:43;2800:8;2810;2776:23;:43::i;:::-;2540:286;;:::o;5250:315:2:-;5418:41;719:10:7;5451:7:2;5418:18;:41::i;:::-;5410:100;;;;-1:-1:-1;;;5410:100:2;;8964:2:16;5410:100:2;;;8946:21:16;9003:2;8983:18;;;8976:30;9042:34;9022:18;;;9015:62;9113:16;9093:18;;;9086:44;9147:19;;5410:100:2;8762:410:16;5410:100:2;5520:38;5534:4;5540:2;5544:7;5553:4;5520:13;:38::i;:::-;5250:315;;;;:::o;5341:437:15:-;5406:13;5431:23;5446:7;5431:14;:23::i;:::-;5477:16;;-1:-1:-1;;;;;5477:16:15;5469:39;5465:128;;5547:16;;5531:51;;;;;;;;2624:25:16;;;-1:-1:-1;;;;;5547:16:15;;;;5531:42;;2597:18:16;;5531:51:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5531:51:15;;;;;;;;;;;;:::i;5465:128::-;5631:1;5613:7;5607:21;;;;;:::i;:::-;;;:25;5603:125;;;5679:7;5688:18;:7;:16;:18::i;:::-;5662:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5648:69;;5341:437;;;:::o;5603:125::-;5738:33;;-1:-1:-1;;;5738:33:15;;13696:2:16;5738:33:15;;;13678:21:16;13735:2;13715:18;;;13708:30;13774:25;13754:18;;;13747:53;13817:18;;5738:33:15;13494:347:16;3525:438:15;1094:13:1;:11;:13::i;:::-;3670:24:15;3662:73:::1;;;::::0;-1:-1:-1;;;3662:73:15;;14048:2:16;3662:73:15::1;::::0;::::1;14030:21:16::0;14087:2;14067:18;;;14060:30;14126:34;14106:18;;;14099:62;14197:6;14177:18;;;14170:34;14221:19;;3662:73:15::1;13846:400:16::0;3662:73:15::1;3773:19;3753:16;:39;;3745:98;;;::::0;-1:-1:-1;;;3745:98:15;;14453:2:16;3745:98:15::1;::::0;::::1;14435:21:16::0;14492:2;14472:18;;;14465:30;14531:34;14511:18;;;14504:62;14602:16;14582:18;;;14575:44;14636:19;;3745:98:15::1;14251:410:16::0;3745:98:15::1;3872:15;:34:::0;;;;3916:18:::1;:40:::0;3525:438::o;2081:198:1:-;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2169:22:1;::::1;2161:73;;;::::0;-1:-1:-1;;;2161:73:1;;14868:2:16;2161:73:1::1;::::0;::::1;14850:21:16::0;14907:2;14887:18;;;14880:30;14946:34;14926:18;;;14919:62;15017:8;14997:18;;;14990:36;15043:19;;2161:73:1::1;14666:402:16::0;2161:73:1::1;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;2953:88:15:-;1094:13:1;:11;:13::i;:::-;3018:6:15::1;:16:::0;;-1:-1:-1;;;;;;3018:16:15::1;-1:-1:-1::0;;;;;3018:16:15;;;::::1;::::0;;;::::1;::::0;;2953:88::o;6956:606::-;7041:4;7076:25;-1:-1:-1;;;;;;7076:25:15;;;;:105;;-1:-1:-1;7156:25:15;-1:-1:-1;;;;;;7156:25:15;;;7076:105;:206;;;-1:-1:-1;7257:25:15;-1:-1:-1;;;;;;7257:25:15;;;7076:206;:280;;;-1:-1:-1;7331:25:15;-1:-1:-1;;;;;;7331:25:15;;;7076:280;:359;;;-1:-1:-1;7410:25:15;-1:-1:-1;;;;;;7410:25:15;;;7076:359;:439;;;-1:-1:-1;;;;;;;;7490:25:15;;;;6956:606::o;11657:133:2:-;7099:4;7122:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7122:16:2;11730:53;;;;-1:-1:-1;;;11730:53:2;;9724:2:16;11730:53:2;;;9706:21:16;9763:2;9743:18;;;9736:30;9802:26;9782:18;;;9775:54;9846:18;;11730:53:2;9522:348:16;10959:171:2;11033:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11033:29:2;-1:-1:-1;;;;;11033:29:2;;;;;;;;:24;;11086:23;11033:24;11086:14;:23::i;:::-;-1:-1:-1;;;;;11077:46:2;;;;;;;;;;;10959:171;;:::o;1359:130:1:-;1273:6;;-1:-1:-1;;;;;1273:6:1;719:10:7;1422:23:1;1414:68;;;;-1:-1:-1;;;1414:68:1;;15275:2:16;1414:68:1;;;15257:21:16;;;15294:18;;;15287:30;15353:34;15333:18;;;15326:62;15405:18;;1414:68:1;15073:356:16;7317:261:2;7410:4;7426:13;7442:23;7457:7;7442:14;:23::i;:::-;7426:39;;7494:5;-1:-1:-1;;;;;7483:16:2;:7;-1:-1:-1;;;;;7483:16:2;;:52;;;-1:-1:-1;;;;;;4508:25:2;;;4485:4;4508:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;7503:32;7483:87;;;;7563:7;-1:-1:-1;;;;;7539:31:2;:20;7551:7;7539:11;:20::i;:::-;-1:-1:-1;;;;;7539:31:2;;7483:87;7475:96;7317:261;-1:-1:-1;;;;7317:261:2:o;10242:605::-;10396:4;-1:-1:-1;;;;;10369:31:2;:23;10384:7;10369:14;:23::i;:::-;-1:-1:-1;;;;;10369:31:2;;10361:81;;;;-1:-1:-1;;;10361:81:2;;15636:2:16;10361:81:2;;;15618:21:16;15675:2;15655:18;;;15648:30;15714:34;15694:18;;;15687:62;15785:7;15765:18;;;15758:35;15810:19;;10361:81:2;15434:401:16;10361:81:2;-1:-1:-1;;;;;10460:16:2;;10452:65;;;;-1:-1:-1;;;10452:65:2;;16042:2:16;10452:65:2;;;16024:21:16;16081:2;16061:18;;;16054:30;16120:34;16100:18;;;16093:62;16191:6;16171:18;;;16164:34;16215:19;;10452:65:2;15840:400:16;10452:65:2;10528:39;10549:4;10555:2;10559:7;10528:20;:39::i;:::-;10629:29;10646:1;10650:7;10629:8;:29::i;:::-;-1:-1:-1;;;;;10669:15:2;;;;;;:9;:15;;;;;:20;;10688:1;;10669:15;:20;;10688:1;;10669:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10699:13:2;;;;;;:9;:13;;;;;:18;;10716:1;;10699:13;:18;;10716:1;;10699:18;:::i;:::-;;;;-1:-1:-1;;10727:16:2;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10727:21:2;-1:-1:-1;;;;;10727:21:2;;;;;;;;;10764:27;;10727:16;;10764:27;;;;;;;3537:337;3467:407;;:::o;5725:337:11:-;5864:7;5883:14;5900:25;5907:1;5910;5913:11;5900:6;:25::i;:::-;5883:42;-1:-1:-1;5951:11:11;5939:8;:23;;;;;;;;:::i;:::-;;:56;;;;;5994:1;5979:11;5966:25;;;;;:::i;:::-;5976:1;5973;5966:25;:29;5939:56;5935:98;;;6011:11;6021:1;6011:11;;:::i;:::-;;;5935:98;6049:6;5725:337;-1:-1:-1;;;;;5725:337:11:o;8868:427:2:-;-1:-1:-1;;;;;8947:16:2;;8939:61;;;;-1:-1:-1;;;8939:61:2;;17277:2:16;8939:61:2;;;17259:21:16;;;17296:18;;;17289:30;17355:34;17335:18;;;17328:62;17407:18;;8939:61:2;17075:356:16;8939:61:2;7099:4;7122:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7122:16:2;:30;9010:58;;;;-1:-1:-1;;;9010:58:2;;17638:2:16;9010:58:2;;;17620:21:16;17677:2;17657:18;;;17650:30;17716;17696:18;;;17689:58;17764:18;;9010:58:2;17436:352:16;9010:58:2;9079:45;9108:1;9112:2;9116:7;9079:20;:45::i;:::-;-1:-1:-1;;;;;9135:13:2;;;;;;:9;:13;;;;;:18;;9152:1;;9135:13;:18;;9152:1;;9135:18;:::i;:::-;;;;-1:-1:-1;;9163:16:2;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9163:21:2;-1:-1:-1;;;;;9163:21:2;;;;;;;;9200:33;;9163:16;;;9200:33;;9163:16;;9200:33;2540:286:15;;:::o;2433:187:1:-;2525:6;;;-1:-1:-1;;;;;2541:17:1;;;-1:-1:-1;;;;;;2541:17:1;;;;;;;2573:40;;2525:6;;;2541:17;2525:6;;2573:40;;2506:16;;2573:40;2496:124;2433:187;:::o;993:291:14:-;1059:4;609:10;1094:15;:34;;:100;;;-1:-1:-1;517:42:14;1144:45;:50;1094:100;:183;;;-1:-1:-1;1210:67:14;;;;;1261:4;1210:67;;;18028:34:16;-1:-1:-1;;;;;18098:15:16;;18078:18;;;18071:43;517:42:14;;1210;;17940:18:16;;1210:67:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;4169:153:2:-;4263:52;719:10:7;4296:8:2;4306;4263:18;:52::i;6426:305::-;6576:28;6586:4;6592:2;6596:7;6576:9;:28::i;:::-;6622:47;6645:4;6651:2;6655:7;6664:4;6622:22;:47::i;:::-;6614:110;;;;-1:-1:-1;;;6614:110:2;;18577:2:16;6614:110:2;;;18559:21:16;18616:2;18596:18;;;18589:30;18655:34;18635:18;;;18628:62;18726:20;18706:18;;;18699:48;18764:19;;6614:110:2;18375:414:16;392:703:8;448:13;665:10;661:51;;-1:-1:-1;;691:10:8;;;;;;;;;;;;;;;;;;392:703::o;661:51::-;736:5;721:12;775:75;782:9;;775:75;;807:8;;;;:::i;:::-;;-1:-1:-1;829:10:8;;-1:-1:-1;837:2:8;829:10;;:::i;:::-;;;775:75;;;859:19;891:6;881:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;881:17:8;;859:39;;908:150;915:10;;908:150;;941:11;951:1;941:11;;:::i;:::-;;-1:-1:-1;1009:10:8;1017:2;1009:5;:10;:::i;:::-;996:24;;:2;:24;:::i;:::-;983:39;;966:6;973;966:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;1036:11:8;1045:2;1036:11;;:::i;:::-;;;908:150;;7697:244:15;-1:-1:-1;;;;;7799:18:15;;;;;;:40;;-1:-1:-1;;;;;;7821:18:15;;7829:10;7821:18;;7799:40;:72;;;;;7844:27;7860:10;7844:15;:27::i;:::-;7843:28;7799:72;7795:140;;;7894:30;;-1:-1:-1;;;7894:30:15;;7913:10;7894:30;;;1557:74:16;1530:18;;7894:30:15;1411:226:16;1668:3925:11;1780:14;;;-1:-1:-1;;2317:1:11;2314;2307:20;2360:1;2357;2353:9;2344:18;;2415:5;2411:2;2408:13;2400:5;2396:2;2392:14;2388:34;2379:43;;;2517:5;2526:1;2517:10;2513:75;;;2562:11;2554:5;:19;;;;;:::i;:::-;;2547:26;;;;;;2513:75;2712:5;2698:11;:19;2690:28;;;;;;2974:17;3109:11;3106:1;3103;3096:25;3642:12;;3657:1;3642:16;;;3627:32;;3762:22;;;;;3270:21;;;3860:16;;;3223:20;;;;3212:32;;;3612:12;4007;;;4003:23;;;;3999:31;;;4119:12;;;;4110:21;;;;4468:1;:15;;4487:1;4467:21;;;4720;;;4716:25;;4705:36;4789:21;;;4785:25;;4774:36;4859:21;;;4855:25;;4844:36;4929:21;;;4925:25;;4914:36;4999:21;;;4995:25;;4984:36;5070:21;;;5066:25;;;5055:36;5534:15;;-1:-1:-1;;1668:3925:11;;;;;;:::o;11266:307:2:-;11416:8;-1:-1:-1;;;;;11407:17:2;:5;-1:-1:-1;;;;;11407:17:2;;;11399:55;;;;-1:-1:-1;;;11399:55:2;;19567:2:16;11399:55:2;;;19549:21:16;19606:2;19586:18;;;19579:30;19645:27;19625:18;;;19618:55;19690:18;;11399:55:2;19365:349:16;11399:55:2;-1:-1:-1;;;;;11464:25:2;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;11464:46:2;;;;;;;;;;11525:41;;586::16;;;11525::2;;559:18:16;11525:41:2;;;;;;;11266:307;;;:::o;12342:831::-;12491:4;-1:-1:-1;;;;;12511:13:2;;1465:19:6;:23;12507:660:2;;12546:71;;-1:-1:-1;;;12546:71:2;;-1:-1:-1;;;;;12546:36:2;;;;;:71;;719:10:7;;12597:4:2;;12603:7;;12612:4;;12546:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12546:71:2;;;;;;;;-1:-1:-1;;12546:71:2;;;;;;;;;;;;:::i;:::-;;;12542:573;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12784:13:2;;12780:321;;12826:60;;-1:-1:-1;;;12826:60:2;;18577:2:16;12826:60:2;;;18559:21:16;18616:2;18596:18;;;18589:30;18655:34;18635:18;;;18628:62;18726:20;18706:18;;;18699:48;18764:19;;12826:60:2;18375:414:16;12780:321:2;13053:6;13047:13;13038:6;13034:2;13030:15;13023:38;12542:573;-1:-1:-1;;;;;;12667:51:2;-1:-1:-1;;;12667:51:2;;-1:-1:-1;12660:58:2;;12507:660;-1:-1:-1;13152:4:2;13145:11;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:177:16;-1:-1:-1;;;;;;92:5:16;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;638:258::-;710:1;720:113;734:6;731:1;728:13;720:113;;;810:11;;;804:18;791:11;;;784:39;756:2;749:10;720:113;;;851:6;848:1;845:13;842:48;;;-1:-1:-1;;886:1:16;868:16;;861:27;638:258::o;901:269::-;954:3;992:5;986:12;1019:6;1014:3;1007:19;1035:63;1091:6;1084:4;1079:3;1075:14;1068:4;1061:5;1057:16;1035:63;:::i;:::-;1152:2;1131:15;-1:-1:-1;;1127:29:16;1118:39;;;;1159:4;1114:50;;901:269;-1:-1:-1;;901:269:16:o;1175:231::-;1324:2;1313:9;1306:21;1287:4;1344:56;1396:2;1385:9;1381:18;1373:6;1344:56;:::i;1642:180::-;1701:6;1754:2;1742:9;1733:7;1729:23;1725:32;1722:52;;;1770:1;1767;1760:12;1722:52;-1:-1:-1;1793:23:16;;1642:180;-1:-1:-1;1642:180:16:o;1827:196::-;1895:20;;-1:-1:-1;;;;;1944:54:16;;1934:65;;1924:93;;2013:1;2010;2003:12;1924:93;1827:196;;;:::o;2028:254::-;2096:6;2104;2157:2;2145:9;2136:7;2132:23;2128:32;2125:52;;;2173:1;2170;2163:12;2125:52;2196:29;2215:9;2196:29;:::i;:::-;2186:39;2272:2;2257:18;;;;2244:32;;-1:-1:-1;;;2028:254:16:o;2287:186::-;2346:6;2399:2;2387:9;2378:7;2374:23;2370:32;2367:52;;;2415:1;2412;2405:12;2367:52;2438:29;2457:9;2438:29;:::i;2660:328::-;2737:6;2745;2753;2806:2;2794:9;2785:7;2781:23;2777:32;2774:52;;;2822:1;2819;2812:12;2774:52;2845:29;2864:9;2845:29;:::i;:::-;2835:39;;2893:38;2927:2;2916:9;2912:18;2893:38;:::i;:::-;2883:48;;2978:2;2967:9;2963:18;2950:32;2940:42;;2660:328;;;;;:::o;2993:248::-;3061:6;3069;3122:2;3110:9;3101:7;3097:23;3093:32;3090:52;;;3138:1;3135;3128:12;3090:52;-1:-1:-1;;3161:23:16;;;3231:2;3216:18;;;3203:32;;-1:-1:-1;2993:248:16:o;3548:592::-;3619:6;3627;3680:2;3668:9;3659:7;3655:23;3651:32;3648:52;;;3696:1;3693;3686:12;3648:52;3736:9;3723:23;3765:18;3806:2;3798:6;3795:14;3792:34;;;3822:1;3819;3812:12;3792:34;3860:6;3849:9;3845:22;3835:32;;3905:7;3898:4;3894:2;3890:13;3886:27;3876:55;;3927:1;3924;3917:12;3876:55;3967:2;3954:16;3993:2;3985:6;3982:14;3979:34;;;4009:1;4006;3999:12;3979:34;4054:7;4049:2;4040:6;4036:2;4032:15;4028:24;4025:37;4022:57;;;4075:1;4072;4065:12;4022:57;4106:2;4098:11;;;;;4128:6;;-1:-1:-1;3548:592:16;;-1:-1:-1;;;;3548:592:16:o;4145:118::-;4231:5;4224:13;4217:21;4210:5;4207:32;4197:60;;4253:1;4250;4243:12;4268:315;4333:6;4341;4394:2;4382:9;4373:7;4369:23;4365:32;4362:52;;;4410:1;4407;4400:12;4362:52;4433:29;4452:9;4433:29;:::i;:::-;4423:39;;4512:2;4501:9;4497:18;4484:32;4525:28;4547:5;4525:28;:::i;:::-;4572:5;4562:15;;;4268:315;;;;;:::o;4588:184::-;-1:-1:-1;;;4637:1:16;4630:88;4737:4;4734:1;4727:15;4761:4;4758:1;4751:15;4777:275;4848:2;4842:9;4913:2;4894:13;;-1:-1:-1;;4890:27:16;4878:40;;4948:18;4933:34;;4969:22;;;4930:62;4927:88;;;4995:18;;:::i;:::-;5031:2;5024:22;4777:275;;-1:-1:-1;4777:275:16:o;5057:186::-;5105:4;5138:18;5130:6;5127:30;5124:56;;;5160:18;;:::i;:::-;-1:-1:-1;5226:2:16;5205:15;-1:-1:-1;;5201:29:16;5232:4;5197:40;;5057:186::o;5248:888::-;5343:6;5351;5359;5367;5420:3;5408:9;5399:7;5395:23;5391:33;5388:53;;;5437:1;5434;5427:12;5388:53;5460:29;5479:9;5460:29;:::i;:::-;5450:39;;5508:38;5542:2;5531:9;5527:18;5508:38;:::i;:::-;5498:48;;5593:2;5582:9;5578:18;5565:32;5555:42;;5648:2;5637:9;5633:18;5620:32;5675:18;5667:6;5664:30;5661:50;;;5707:1;5704;5697:12;5661:50;5730:22;;5783:4;5775:13;;5771:27;-1:-1:-1;5761:55:16;;5812:1;5809;5802:12;5761:55;5848:2;5835:16;5873:48;5889:31;5917:2;5889:31;:::i;:::-;5873:48;:::i;:::-;5944:2;5937:5;5930:17;5984:7;5979:2;5974;5970;5966:11;5962:20;5959:33;5956:53;;;6005:1;6002;5995:12;5956:53;6060:2;6055;6051;6047:11;6042:2;6035:5;6031:14;6018:45;6104:1;6099:2;6094;6087:5;6083:14;6079:23;6072:34;6125:5;6115:15;;;;;5248:888;;;;;;;:::o;6141:260::-;6209:6;6217;6270:2;6258:9;6249:7;6245:23;6241:32;6238:52;;;6286:1;6283;6276:12;6238:52;6309:29;6328:9;6309:29;:::i;:::-;6299:39;;6357:38;6391:2;6380:9;6376:18;6357:38;:::i;6406:437::-;6485:1;6481:12;;;;6528;;;6549:61;;6603:4;6595:6;6591:17;6581:27;;6549:61;6656:2;6648:6;6645:14;6625:18;6622:38;6619:218;;;-1:-1:-1;;;6690:1:16;6683:88;6794:4;6791:1;6784:15;6822:4;6819:1;6812:15;6619:218;;6406:437;;;:::o;11057:635::-;11137:6;11190:2;11178:9;11169:7;11165:23;11161:32;11158:52;;;11206:1;11203;11196:12;11158:52;11239:9;11233:16;11272:18;11264:6;11261:30;11258:50;;;11304:1;11301;11294:12;11258:50;11327:22;;11380:4;11372:13;;11368:27;-1:-1:-1;11358:55:16;;11409:1;11406;11399:12;11358:55;11438:2;11432:9;11463:48;11479:31;11507:2;11479:31;:::i;11463:48::-;11534:2;11527:5;11520:17;11574:7;11569:2;11564;11560;11556:11;11552:20;11549:33;11546:53;;;11595:1;11592;11585:12;11546:53;11608:54;11659:2;11654;11647:5;11643:14;11638:2;11634;11630:11;11608:54;:::i;11823:185::-;11865:3;11903:5;11897:12;11918:52;11963:6;11958:3;11951:4;11944:5;11940:16;11918:52;:::i;:::-;11986:16;;;;;11823:185;-1:-1:-1;;11823:185:16:o;12131:1358::-;12408:3;12437:1;12470:6;12464:13;12500:3;12522:1;12550:9;12546:2;12542:18;12532:28;;12610:2;12599:9;12595:18;12632;12622:61;;12676:4;12668:6;12664:17;12654:27;;12622:61;12702:2;12750;12742:6;12739:14;12719:18;12716:38;12713:222;;;-1:-1:-1;;;12784:3:16;12777:90;12890:4;12887:1;12880:15;12920:4;12915:3;12908:17;12713:222;12951:18;12978:104;;;;13096:1;13091:320;;;;12944:467;;12978:104;-1:-1:-1;;13011:24:16;;12999:37;;13056:16;;;;-1:-1:-1;12978:104:16;;13091:320;11770:1;11763:14;;;11807:4;11794:18;;13186:1;13200:165;13214:6;13211:1;13208:13;13200:165;;;13292:14;;13279:11;;;13272:35;13335:16;;;;13229:10;;13200:165;;;13204:3;;13394:6;13389:3;13385:16;13378:23;;12944:467;;;;;;;13427:56;13452:30;13478:3;13470:6;13452:30;:::i;:::-;12085:7;12073:20;;12118:1;12109:11;;12013:113;16245:184;-1:-1:-1;;;16294:1:16;16287:88;16394:4;16391:1;16384:15;16418:4;16415:1;16408:15;16434:125;16474:4;16502:1;16499;16496:8;16493:34;;;16507:18;;:::i;:::-;-1:-1:-1;16544:9:16;;16434:125::o;16564:128::-;16604:3;16635:1;16631:6;16628:1;16625:13;16622:39;;;16641:18;;:::i;:::-;-1:-1:-1;16677:9:16;;16564:128::o;16697:184::-;-1:-1:-1;;;16746:1:16;16739:88;16846:4;16843:1;16836:15;16870:4;16867:1;16860:15;16886:184;-1:-1:-1;;;16935:1:16;16928:88;17035:4;17032:1;17025:15;17059:4;17056:1;17049:15;18125:245;18192:6;18245:2;18233:9;18224:7;18220:23;18216:32;18213:52;;;18261:1;18258;18251:12;18213:52;18293:9;18287:16;18312:28;18334:5;18312:28;:::i;18794:135::-;18833:3;-1:-1:-1;;18854:17:16;;18851:43;;;18874:18;;:::i;:::-;-1:-1:-1;18921:1:16;18910:13;;18794:135::o;18934:120::-;18974:1;19000;18990:35;;19005:18;;:::i;:::-;-1:-1:-1;19039:9:16;;18934:120::o;19059:112::-;19091:1;19117;19107:35;;19122:18;;:::i;:::-;-1:-1:-1;19156:9:16;;19059:112::o;19176:184::-;-1:-1:-1;;;19225:1:16;19218:88;19325:4;19322:1;19315:15;19349:4;19346:1;19339:15;19719:523;19913:4;-1:-1:-1;;;;;20023:2:16;20015:6;20011:15;20000:9;19993:34;20075:2;20067:6;20063:15;20058:2;20047:9;20043:18;20036:43;;20115:6;20110:2;20099:9;20095:18;20088:34;20158:3;20153:2;20142:9;20138:18;20131:31;20179:57;20231:3;20220:9;20216:19;20208:6;20179:57;:::i;:::-;20171:65;19719:523;-1:-1:-1;;;;;;19719:523:16:o;20247:249::-;20316:6;20369:2;20357:9;20348:7;20344:23;20340:32;20337:52;;;20385:1;20382;20375:12;20337:52;20417:9;20411:16;20436:30;20460:5;20436:30;:::i

Swarm Source

ipfs://c456389cb5a5cb1fef762e8bbcee85b015385a7610dcb5cac73156507281fc61
Loading...
Loading
[ Download: CSV Export  ]

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