ETH Price: $3,171.56 (+2.08%)

Token

Spiral Frequencies (GCP1)
 

Overview

Max Total Supply

6,315 GCP1

Holders

2,929

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
mexy.eth
Balance
5 GCP1
0x89d5ac566d4d0bf14dad8b0531dd4b3de47f9424
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Next Gen NFT Platform.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SpiralFrequencies

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 20 runs

Other Settings:
default evmVersion, MIT license
File 1 of 21 : SpiralFrequencies.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./GeneticChainMetadata.sol";

/**
 * @title Spiral Frequenceies
 * GeneticChain - Project #1 - Spiral Frequencies
 */
contract SpiralFrequencies is GeneticChainMetadata {

    struct ArtState {
        string t;
        uint256 speed;
    }

    // Token State
    mapping(uint256 => ArtState) _state;

    // StateChange
    event StateChange(address indexed owner, uint256 tokenId, ArtState state);

    constructor(
        string memory name_,
        string memory symbol_,
        uint256 projectId_,
        string memory artist_,
        string memory description_,
        string memory code_,
        string memory baseUri_,
        uint256 publicMax_,
        uint256 privateMax_,
        uint256 seed_,
        address proxyRegistryAddress)
        GeneticChainMetadata(
          name_,
          symbol_,
          projectId_,
          artist_,
          description_,
          code_,
          baseUri_,
          publicMax_,
          privateMax_,
          seed_,
          proxyRegistryAddress)
    {
    }

    function state(uint256 tokenId)
        public
        view
        validTokenId(tokenId)
        returns (string memory t, uint256 speed)
    {
        if (bytes(_state[tokenId].t).length == 0) {
            t      = "0";
            speed  = 5;
        } else {
            t      = _state[tokenId].t;
            speed  = _state[tokenId].speed;
        }
    }

    /**
     * Updates state of token, only owner or approved is allowed.
     * @param tokenId - token to update state on
     * @param t - float encoded as string
     * @param speed - speed to run at; 0-10
     *
     * Emits a {StateUpdated} event.
     */
    function updateState(uint256 tokenId, string memory t, uint256 speed)
        public
        approvedOrOwner(_msgSender(), tokenId)
    {
        require(0 <= speed && speed <= 10, "SpiralFrequencies: Invalid speed only 0-10 allowed.");
        _state[tokenId].t     = t;
        _state[tokenId].speed = speed;

        emit StateChange(msg.sender, tokenId, _state[tokenId]);
    }

}

File 2 of 21 : Ownable.sol
// SPDX-License-Identifier: MIT

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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

File 3 of 21 : ERC721.sol
// SPDX-License-Identifier: MIT

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: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

    /**
     * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(address from, address to, uint256 tokenId) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
        private returns (bool)
    {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    // solhint-disable-next-line no-inline-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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { }
}

File 4 of 21 : IERC721.sol
// SPDX-License-Identifier: MIT

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

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

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

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

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

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

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

File 5 of 21 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT

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

File 6 of 21 : ERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../ERC721.sol";
import "./IERC721Enumerable.sol";

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 7 of 21 : IERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

File 8 of 21 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT

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 21 : Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 10 of 21 : Context.sol
// SPDX-License-Identifier: MIT

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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

File 11 of 21 : Strings.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

}

File 12 of 21 : ECDSA.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        // Divide the signature in r, s and v variables
        bytes32 r;
        bytes32 s;
        uint8 v;

        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            // solhint-disable-next-line no-inline-assembly
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
        } else if (signature.length == 64) {
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            // solhint-disable-next-line no-inline-assembly
            assembly {
                let vs := mload(add(signature, 0x40))
                r := mload(add(signature, 0x20))
                s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
                v := add(shr(255, vs), 27)
            }
        } else {
            revert("ECDSA: invalid signature length");
        }

        return recover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "ECDSA: invalid signature 's' value");
        require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value");

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        require(signer != address(0), "ECDSA: invalid signature");

        return signer;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

File 13 of 21 : ERC165.sol
// SPDX-License-Identifier: MIT

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 21 : IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

File 15 of 21 : SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

File 16 of 21 : GeneticChain721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "openzeppelin-solidity/contracts/token/ERC721/ERC721.sol";
import "openzeppelin-solidity/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "openzeppelin-solidity/contracts/access/Ownable.sol";
import "openzeppelin-solidity/contracts/utils/cryptography/ECDSA.sol";
import "openzeppelin-solidity/contracts/utils/Strings.sol";

import "./common/meta-transactions/ContentMixin.sol";
import "./common/meta-transactions/NativeMetaTransaction.sol";

contract OwnableDelegateProxy {}

contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

/**
 * @title GeneticChain721
 * GeneticChainBase - ERC721 contract that whitelists a trading address, and has
 *  minting functionality.
 */
abstract contract GeneticChain721 is
    ContextMixin,
    ERC721Enumerable,
    NativeMetaTransaction,
    Ownable
{
    using ECDSA for bytes32;

    // mapping from token id to token hash
    mapping (uint256 => bytes32) private _hash;

    // only allow nonces to be used once
    mapping(string => bool) private _usedNonces;

    // track mint count per address
    mapping (address => uint256) private _mints;

    address _proxyRegistryAddress;
    uint256 private _currentTokenId = 0;
    uint256 private _seed;

    // message signer
    address private _signer = 0x9bf0E17205F269494DFc7957b9Da48f4F088478d;

    // token limits
    uint256 public publicMax;
    uint256 public privateMax;
    uint256 public tokenMax;
    uint256 public publicMinted = 0;
    uint256 public privateMinted = 0;

    modifier validTokenId(uint256 tokenId) {
        require(_exists(tokenId), "invalid token");
        _;
    }

    modifier approvedOrOwner(address operator, uint256 tokenId) {
        require(_isApprovedOrOwner(operator, tokenId));
        _;
    }

    constructor(
        string memory name,
        string memory symbol,
        uint256 publicMax_,
        uint256 privateMax_,
        uint256 seed,
        address proxyRegistryAddress)
        ERC721(name, symbol)
    {
        publicMax             = publicMax_;
        privateMax            = privateMax_;
        tokenMax              = publicMax_ + privateMax_;
        _seed                 = seed;
        _proxyRegistryAddress = proxyRegistryAddress;
        _initializeEIP712(name);
    }

    /**
     * Validate hash contains input data.
     */
    function validateHash(bytes32 msgHash, address sender, uint256 allocation, uint256 count, string memory nonce)
        private
        pure
        returns(bool)
    {
          return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32",
            keccak256(abi.encodePacked(sender, allocation, count, nonce)))) == msgHash;
    }

    /**
     * Validate message was signed by signer.
     */
    function validateSigner(bytes32 msgHash, bytes memory signature)
        private
        view
        returns(bool)
    {
        return msgHash.recover(signature) == _signer;
    }

    /**
     * @dev Mints a token to an address.
     * @param _to address of the future owner of the token
     */
    function mintTo(address _to)
        external
        onlyOwner
    {
        require(totalSupply() + 1 <= tokenMax, "exceed token supply");
        require(privateMinted + 1 <= privateMax, "exceed private supply");
        ++privateMinted;
        _mintTo(_to);
    }

    /**
     * @dev Mints multiple tokens to an address.
     * @param _to address of the future owner of the token
     */
    function batchMint(address _to, uint256 count)
        external
        onlyOwner
    {
        require(totalSupply() + count <= tokenMax, "exceed token supply");
        require(privateMinted + count <= privateMax, "exceed private supply");
        privateMinted += count;
        for (uint256 i = 0; i < count; ++i) {
            _mintTo(_to);
        }
    }

    /**
     * Mint count tokens using securely signed message.
     */
    function secureMint(bytes32 msgHash, bytes memory signature, uint256 allocation, uint256 count, string memory nonce)
        external
    {
        require(!_usedNonces[nonce], "invalid nonce");
        require(totalSupply() < tokenMax, "all tokens minted");
        require(totalSupply() + count <= tokenMax, "exceed token supply");
        require(publicMinted + count <= publicMax, "exceed public supply");
        require(_mints[msg.sender] + count <= allocation, "exceed allocation");
        require(validateSigner(msgHash, signature), "invalid signer");
        require(validateHash(msgHash, msg.sender, allocation, count, nonce), "invalid hash");
        publicMinted += count;
        _mints[msg.sender] += count;
        _usedNonces[nonce] = true;
        for (uint256 i = 0; i < count; ++i) {
            _mintTo(msg.sender);
        }
    }

    /**
     * @dev Mints a token to an address with a tokenURI.
     * @param _to address of the future owner of the token
     */
    function _mintTo(address _to)
        internal
    {
        uint256 newTokenId = totalSupply() + 1;
        _safeMint(_to, newTokenId);
        _hash[newTokenId] = _randomHash(_to, newTokenId);
    }

    function baseTokenURI()
        virtual
        public
        view
        returns (string memory);

    /**
     * @dev Returns uri of a token.  Not guarenteed token exists.
     */
    function tokenURI(uint256 tokenId)
        override
        public
        view
        returns (string memory)
    {
        return string(abi.encodePacked(baseTokenURI(), "/", Strings.toString(tokenId), "/meta"));
    }

    /**
     * @return randomly generated hash associated with valid a token.
     */
    function tokenHash(uint256 tokenId)
        public
        view
        validTokenId(tokenId)
        returns (bytes32)
    {
        return _hash[tokenId];
    }

    /**
     * Pull all money out of this contract.
     */
    function withdraw(address to, uint256 amount)
        public
        onlyOwner
    {
        require(amount > 0, "amount empty");
        require(amount <= address(this).balance, "amount exceeds balance");
        require(to != address(0), "address null");
        payable(to).transfer(amount);
    }

    /**
     * @dev Pseudo-random number generator.
     */
    function _randomHash(address _to, uint256 tokenId)
        internal
        returns (bytes32)
    {
      bytes32 hash = keccak256(
          abi.encodePacked(
              blockhash(block.number - 1),
              msg.sender,
              _seed,
              tokenId,
              _to));
      _seed = uint256(hash);
      return hash;
    }

    /**
     * Override isApprovedForAll to whitelist user's OpenSea proxy accounts
     *  to enable gas-less listings.
     */
    function isApprovedForAll(address owner, address operator)
        override
        public
        view
        returns (bool)
    {
        // whitelist OpenSea proxy contract for easy trading.
        ProxyRegistry proxyRegistry = ProxyRegistry(_proxyRegistryAddress);
        if (address(proxyRegistry.proxies(owner)) == operator) {
            return true;
        }

        return super.isApprovedForAll(owner, operator);
    }

    /**
     * This is used instead of msg.sender as transactions won't be sent by
     *  the original token owner, but by OpenSea.
     */
    function _msgSender()
        internal
        override
        view
        returns (address sender)
    {
        return ContextMixin.msgSender();
    }

}

File 17 of 21 : GeneticChainMetadata.sol
// SPDX-License-Identifier: MIT

import "./GeneticChain721.sol";

pragma solidity ^0.8.0;

/**
 * @title GeneticChainMetadata
 * Holds all required metadata for genetic chain projects.
 */
abstract contract GeneticChainMetadata is GeneticChain721 {

    uint256 public projectId;
    string public artist;
    string public description;
    string public code;
    string private _baseUri;

    constructor(
        string memory name_,
        string memory symbol_,
        uint256 projectId_,
        string memory artist_,
        string memory description_,
        string memory code_,
        string memory baseUri_,
        uint256 publicMax_,
        uint256 privateMax_,
        uint256 seed_,
        address proxyRegistryAddress)
        GeneticChain721(
          name_,
          symbol_,
          publicMax_,
          privateMax_,
          seed_,
          proxyRegistryAddress)
    {
        projectId   = projectId_;
        artist      = artist_;
        description = description_;
        code        = code_;
        _baseUri    = baseUri_;
    }

    function setProjectId(uint256 projectId_)
        public
        onlyOwner
    {
        projectId = projectId_;
    }

    function setArtist(string memory artist_)
        public
        onlyOwner
    {
        artist = artist_;
    }

    function setDescription(string memory description_)
        public
        onlyOwner
    {
        description = description_;
    }

    function setCode(string memory code_)
        public
        onlyOwner
    {
        code = code_;
    }

    function baseTokenURI()
        override
        public
        view
        returns (string memory)
    {
        return string(abi.encodePacked(_baseUri, "/api/project/", Strings.toString(projectId), "/token"));
    }

    function contractURI()
        public
        view
        returns (string memory)
    {
        return string(abi.encodePacked(_baseUri, "/api/project/", Strings.toString(projectId), "/contract"));
    }

}

File 18 of 21 : ContentMixin.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

abstract contract ContextMixin {
    function msgSender()
        internal
        view
        returns (address payable sender)
    {
        if (msg.sender == address(this)) {
            bytes memory array = msg.data;
            uint256 index = msg.data.length;
            assembly {
                // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those.
                sender := and(
                    mload(add(array, index)),
                    0xffffffffffffffffffffffffffffffffffffffff
                )
            }
        } else {
            sender = payable(msg.sender);
        }
        return sender;
    }
}

File 19 of 21 : EIP712Base.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import {Initializable} from "./Initializable.sol";

contract EIP712Base is Initializable {
    struct EIP712Domain {
        string name;
        string version;
        address verifyingContract;
        bytes32 salt;
    }

    string constant public ERC712_VERSION = "1";

    bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256(
        bytes(
            "EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)"
        )
    );
    bytes32 internal domainSeperator;

    // supposed to be called once while initializing.
    // one of the contracts that inherits this contract follows proxy pattern
    // so it is not possible to do this in a constructor
    function _initializeEIP712(
        string memory name
    )
        internal
        initializer
    {
        _setDomainSeperator(name);
    }

    function _setDomainSeperator(string memory name) internal {
        domainSeperator = keccak256(
            abi.encode(
                EIP712_DOMAIN_TYPEHASH,
                keccak256(bytes(name)),
                keccak256(bytes(ERC712_VERSION)),
                address(this),
                bytes32(getChainId())
            )
        );
    }

    function getDomainSeperator() public view returns (bytes32) {
        return domainSeperator;
    }

    function getChainId() public view returns (uint256) {
        uint256 id;
        assembly {
            id := chainid()
        }
        return id;
    }

    /**
     * Accept message hash and returns hash message in EIP712 compatible form
     * So that it can be used to recover signer from signature signed using EIP712 formatted data
     * https://eips.ethereum.org/EIPS/eip-712
     * "\\x19" makes the encoding deterministic
     * "\\x01" is the version byte to make it compatible to EIP-191
     */
    function toTypedMessageHash(bytes32 messageHash)
        internal
        view
        returns (bytes32)
    {
        return
            keccak256(
                abi.encodePacked("\x19\x01", getDomainSeperator(), messageHash)
            );
    }
}

File 20 of 21 : Initializable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

contract Initializable {
    bool inited = false;

    modifier initializer() {
        require(!inited, "already inited");
        _;
        inited = true;
    }
}

File 21 of 21 : NativeMetaTransaction.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import {SafeMath} from  "openzeppelin-solidity/contracts/utils/math/SafeMath.sol";
import {EIP712Base} from "./EIP712Base.sol";

contract NativeMetaTransaction is EIP712Base {
    using SafeMath for uint256;
    bytes32 private constant META_TRANSACTION_TYPEHASH = keccak256(
        bytes(
            "MetaTransaction(uint256 nonce,address from,bytes functionSignature)"
        )
    );
    event MetaTransactionExecuted(
        address userAddress,
        address payable relayerAddress,
        bytes functionSignature
    );
    mapping(address => uint256) nonces;

    /*
     * Meta transaction structure.
     * No point of including value field here as if user is doing value transfer then he has the funds to pay for gas
     * He should call the desired function directly in that case.
     */
    struct MetaTransaction {
        uint256 nonce;
        address from;
        bytes functionSignature;
    }

    function executeMetaTransaction(
        address userAddress,
        bytes memory functionSignature,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) public payable returns (bytes memory) {
        MetaTransaction memory metaTx = MetaTransaction({
            nonce: nonces[userAddress],
            from: userAddress,
            functionSignature: functionSignature
        });

        require(
            verify(userAddress, metaTx, sigR, sigS, sigV),
            "Signer and signature do not match"
        );

        // increase nonce for user (to avoid re-use)
        nonces[userAddress] = nonces[userAddress].add(1);

        emit MetaTransactionExecuted(
            userAddress,
            payable(msg.sender),
            functionSignature
        );

        // Append userAddress and relayer address at the end to extract it from calling context
        (bool success, bytes memory returnData) = address(this).call(
            abi.encodePacked(functionSignature, userAddress)
        );
        require(success, "Function call not successful");

        return returnData;
    }

    function hashMetaTransaction(MetaTransaction memory metaTx)
        internal
        pure
        returns (bytes32)
    {
        return
            keccak256(
                abi.encode(
                    META_TRANSACTION_TYPEHASH,
                    metaTx.nonce,
                    metaTx.from,
                    keccak256(metaTx.functionSignature)
                )
            );
    }

    function getNonce(address user) public view returns (uint256 nonce) {
        nonce = nonces[user];
    }

    function verify(
        address signer,
        MetaTransaction memory metaTx,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) internal view returns (bool) {
        require(signer != address(0), "NativeMetaTransaction: INVALID_SIGNER");
        return
            signer ==
            ecrecover(
                toTypedMessageHash(hashMetaTransaction(metaTx)),
                sigV,
                sigR,
                sigS
            );
    }
}

Settings
{
  "remappings": [],
  "optimizer": {
    "enabled": true,
    "runs": 20
  },
  "evmVersion": "london",
  "libraries": {},
  "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":"uint256","name":"projectId_","type":"uint256"},{"internalType":"string","name":"artist_","type":"string"},{"internalType":"string","name":"description_","type":"string"},{"internalType":"string","name":"code_","type":"string"},{"internalType":"string","name":"baseUri_","type":"string"},{"internalType":"uint256","name":"publicMax_","type":"uint256"},{"internalType":"uint256","name":"privateMax_","type":"uint256"},{"internalType":"uint256","name":"seed_","type":"uint256"},{"internalType":"address","name":"proxyRegistryAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","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":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"components":[{"internalType":"string","name":"t","type":"string"},{"internalType":"uint256","name":"speed","type":"uint256"}],"indexed":false,"internalType":"struct SpiralFrequencies.ArtState","name":"state","type":"tuple"}],"name":"StateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ERC712_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"artist","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"code","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"description","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDomainSeperator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"mintTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"projectId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"msgHash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"allocation","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"string","name":"nonce","type":"string"}],"name":"secureMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"artist_","type":"string"}],"name":"setArtist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"code_","type":"string"}],"name":"setCode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"description_","type":"string"}],"name":"setDescription","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"projectId_","type":"uint256"}],"name":"setProjectId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"state","outputs":[{"internalType":"string","name":"t","type":"string"},{"internalType":"uint256","name":"speed","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"t","type":"string"},{"internalType":"uint256","name":"speed","type":"uint256"}],"name":"updateState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600a805460ff1916905560006012819055601480546001600160a01b031916739bf0e17205f269494dfc7957b9da48f4f088478d17905560188190556019553480156200005057600080fd5b5060405162003de038038062003de08339810160408190526200007391620004d5565b8a8a8a8a8a8a8a8a8a8a8a8a8a85858585858581600090805190602001906200009e9291906200035b565b508051620000b49060019060208401906200035b565b5050506000620000c9620001da60201b60201c565b600d80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350601584905560168390556200012d838562000640565b6017556013829055601180546001600160a01b0319166001600160a01b0383161790556200015b86620001f6565b505050601a8c9055505088516200017b9150601b9060208b01906200035b565b5086516200019190601c9060208a01906200035b565b508551620001a790601d9060208901906200035b565b508451620001bd90601e9060208801906200035b565b5050505050505050505050505050505050505050505050620006ba565b6000620001f16200025a60201b62001c791760201c565b905090565b600a5460ff16156200023f5760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481a5b9a5d195960921b604482015260640160405180910390fd5b6200024a81620002b9565b50600a805460ff19166001179055565b600033301415620002b357600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b03169150620002b69050565b50335b90565b6040518060800160405280604f815260200162003d91604f9139805160209182012082519282019290922060408051808201825260018152603160f81b90840152805180840194909452838101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608401523060808401524660a0808501919091528151808503909101815260c090930190528151910120600b55565b828054620003699062000667565b90600052602060002090601f0160209004810192826200038d5760008555620003d8565b82601f10620003a857805160ff1916838001178555620003d8565b82800160010185558215620003d8579182015b82811115620003d8578251825591602001919060010190620003bb565b50620003e6929150620003ea565b5090565b5b80821115620003e65760008155600101620003eb565b80516001600160a01b03811681146200041957600080fd5b919050565b600082601f8301126200043057600080fd5b81516001600160401b03808211156200044d576200044d620006a4565b604051601f8301601f19908116603f01168101908282118183101715620004785762000478620006a4565b816040528381526020925086838588010111156200049557600080fd5b600091505b83821015620004b957858201830151818301840152908201906200049a565b83821115620004cb5760008385830101525b9695505050505050565b60008060008060008060008060008060006101608c8e031215620004f857600080fd5b8b516001600160401b038111156200050f57600080fd5b6200051d8e828f016200041e565b60208e0151909c5090506001600160401b038111156200053c57600080fd5b6200054a8e828f016200041e565b60408e015160608f0151919c509a5090506001600160401b038111156200057057600080fd5b6200057e8e828f016200041e565b60808e015190995090506001600160401b038111156200059d57600080fd5b620005ab8e828f016200041e565b60a08e015190985090506001600160401b03811115620005ca57600080fd5b620005d88e828f016200041e565b60c08e015190975090506001600160401b03811115620005f757600080fd5b620006058e828f016200041e565b95505060e08c015193506101008c015192506101208c015191506200062e6101408d0162000401565b90509295989b509295989b9093969950565b600082198211156200066257634e487b7160e01b600052601160045260246000fd5b500190565b600181811c908216806200067c57607f821691505b602082108114156200069e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b6136c780620006ca6000396000f3fe60806040526004361061021d5760003560e01c80637284e4161161011f5780637284e416146104fe578063729868ee14610513578063755edd171461053357806380a1962f146105535780638da5cb5b1461057357806390c3f38f1461058857806395d89b41146105a8578063a22cb465146105bd578063a3864397146105dd578063a4f4f8af146105fd578063a52e413814610613578063b88d4fde14610633578063c87b56dd14610653578063ce9246dd14610673578063d547cfb714610693578063e403f1a7146106a8578063e527c6dd146106c8578063e8a3d485146106de578063e985e9c5146106f3578063f2fde38b14610713578063f3fef3a314610733578063f4656c6e14610753578063f7ee70681461076957600080fd5b806301ffc9a71461022257806306fdde0314610257578063081812fc14610279578063095ea7b3146102a65780630c53c51c146102c85780630f7e5970146102db57806318160ddd1461030857806320379ee51461032757806323b872dd1461033c57806324c12bf61461035c5780632d0335ab146103715780632f745c59146103a75780633408e470146103c75780633e4f49e6146103da5780633fafa1271461040857806342842e0e1461041e57806343508b051461043e57806343bc16121461045e5780634f6ccce7146104735780635f78d07f146104935780636352211e146104a957806370a08231146104c9578063715018a6146104e9575b600080fd5b34801561022e57600080fd5b5061024261023d366004612f0f565b61077f565b60405190151581526020015b60405180910390f35b34801561026357600080fd5b5061026c6107aa565b60405161024e91906132b4565b34801561028557600080fd5b50610299610294366004612f9a565b61083c565b60405161024e9190613223565b3480156102b257600080fd5b506102c66102c1366004612e63565b6108c9565b005b61026c6102d6366004612de6565b6109ec565b3480156102e757600080fd5b5061026c604051806040016040528060018152602001603160f81b81525081565b34801561031457600080fd5b506008545b60405190815260200161024e565b34801561033357600080fd5b50600b54610319565b34801561034857600080fd5b506102c6610357366004612d07565b610bd5565b34801561036857600080fd5b5061026c610c0d565b34801561037d57600080fd5b5061031961038c366004612cb1565b6001600160a01b03166000908152600c602052604090205490565b3480156103b357600080fd5b506103196103c2366004612e63565b610c9b565b3480156103d357600080fd5b5046610319565b3480156103e657600080fd5b506103fa6103f5366004612f9a565b610d31565b60405161024e9291906132c7565b34801561041457600080fd5b50610319601a5481565b34801561042a57600080fd5b506102c6610439366004612d07565b610e57565b34801561044a57600080fd5b506102c6610459366004612e63565b610e72565b34801561046a57600080fd5b5061026c610f51565b34801561047f57600080fd5b5061031961048e366004612f9a565b610f5e565b34801561049f57600080fd5b5061031960195481565b3480156104b557600080fd5b506102996104c4366004612f9a565b610ff1565b3480156104d557600080fd5b506103196104e4366004612cb1565b611068565b3480156104f557600080fd5b506102c66110ef565b34801561050a57600080fd5b5061026c611178565b34801561051f57600080fd5b506102c661052e366004612fb3565b611185565b34801561053f57600080fd5b506102c661054e366004612cb1565b611285565b34801561055f57600080fd5b506102c661056e366004612e8f565b611341565b34801561057f57600080fd5b506102996115fc565b34801561059457600080fd5b506102c66105a3366004612f66565b61160b565b3480156105b457600080fd5b5061026c611661565b3480156105c957600080fd5b506102c66105d8366004612db3565b611670565b3480156105e957600080fd5b506103196105f8366004612f9a565b61176e565b34801561060957600080fd5b5061031960185481565b34801561061f57600080fd5b506102c661062e366004612f66565b6117ae565b34801561063f57600080fd5b506102c661064e366004612d48565b611800565b34801561065f57600080fd5b5061026c61066e366004612f9a565b61183f565b34801561067f57600080fd5b506102c661068e366004612f9a565b611879565b34801561069f57600080fd5b5061026c6118bd565b3480156106b457600080fd5b506102c66106c3366004612f66565b6118f1565b3480156106d457600080fd5b5061031960155481565b3480156106ea57600080fd5b5061026c611943565b3480156106ff57600080fd5b5061024261070e366004612cce565b611963565b34801561071f57600080fd5b506102c661072e366004612cb1565b611a37565b34801561073f57600080fd5b506102c661074e366004612e63565b611b37565b34801561075f57600080fd5b5061031960165481565b34801561077557600080fd5b5061031960175481565b60006001600160e01b0319821663780e9d6360e01b14806107a457506107a482611cd6565b92915050565b6060600080546107b990613551565b80601f01602080910402602001604051908101604052809291908181526020018280546107e590613551565b80156108325780601f1061080757610100808354040283529160200191610832565b820191906000526020600020905b81548152906001019060200180831161081557829003601f168201915b5050505050905090565b600061084782611d26565b6108ad5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006108d482610ff1565b9050806001600160a01b0316836001600160a01b031614156109425760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016108a4565b806001600160a01b0316610954611d43565b6001600160a01b0316148061097057506109708161070e611d43565b6109dd5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b60648201526084016108a4565b6109e78383611d52565b505050565b60408051606081810183526001600160a01b0388166000818152600c602090815290859020548452830152918101869052610a2a8782878787611dc0565b610a805760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b60648201526084016108a4565b6001600160a01b0387166000908152600c6020526040902054610aa4906001611ea4565b6001600160a01b0388166000908152600c60205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b90610af490899033908a90613237565b60405180910390a1600080306001600160a01b0316888a604051602001610b1c9291906130fe565b60408051601f1981840301815290829052610b36916130e2565b6000604051808303816000865af19150503d8060008114610b73576040519150601f19603f3d011682016040523d82523d6000602084013e610b78565b606091505b509150915081610bc95760405162461bcd60e51b815260206004820152601c60248201527b119d5b98dd1a5bdb8818d85b1b081b9bdd081cdd58d8d95cdcd99d5b60221b60448201526064016108a4565b98975050505050505050565b610be6610be0611d43565b82611eb7565b610c025760405162461bcd60e51b81526004016108a4906133c4565b6109e7838383611f79565b601d8054610c1a90613551565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4690613551565b8015610c935780601f10610c6857610100808354040283529160200191610c93565b820191906000526020600020905b815481529060010190602001808311610c7657829003601f168201915b505050505081565b6000610ca683611068565b8210610d085760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016108a4565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6060600082610d3f81611d26565b610d5b5760405162461bcd60e51b81526004016108a490613368565b6000848152601f602052604090208054610d7490613551565b15159050610da157604051806040016040528060018152602001600360fc1b815250925060059150610e51565b6000848152601f602052604090208054610dba90613551565b80601f0160208091040260200160405190810160405280929190818152602001828054610de690613551565b8015610e335780601f10610e0857610100808354040283529160200191610e33565b820191906000526020600020905b815481529060010190602001808311610e1657829003601f168201915b5050506000878152601f602052604090206001015492955091935050505b50915091565b6109e783838360405180602001604052806000815250611800565b610e7a611d43565b6001600160a01b0316610e8b6115fc565b6001600160a01b031614610eb15760405162461bcd60e51b81526004016108a49061338f565b60175481610ebe60085490565b610ec891906134e2565b1115610ee65760405162461bcd60e51b81526004016108a4906132e9565b60165481601954610ef791906134e2565b1115610f155760405162461bcd60e51b81526004016108a490613415565b8060196000828254610f2791906134e2565b90915550600090505b818110156109e757610f4183612124565b610f4a81613586565b9050610f30565b601b8054610c1a90613551565b6000610f6960085490565b8210610fcc5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016108a4565b60088281548110610fdf57610fdf6135f7565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806107a45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016108a4565b60006001600160a01b0382166110d35760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016108a4565b506001600160a01b031660009081526003602052604090205490565b6110f7611d43565b6001600160a01b03166111086115fc565b6001600160a01b03161461112e5760405162461bcd60e51b81526004016108a49061338f565b600d546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600d80546001600160a01b0319169055565b601c8054610c1a90613551565b61118d611d43565b836111988282611eb7565b6111a157600080fd5b600a83111561120e5760405162461bcd60e51b815260206004820152603360248201527f53706972616c4672657175656e636965733a20496e76616c69642073706565646044820152721037b7363c90181698981030b63637bbb2b21760691b60648201526084016108a4565b6000858152601f60209081526040909120855161122d92870190612b8c565b506000858152601f60205260409081902060018101859055905133917f3d4fad315e2275fb8c76f82b128886471b0e7b91c1f5b8c737114826601ed3fe91611276918991613444565b60405180910390a25050505050565b61128d611d43565b6001600160a01b031661129e6115fc565b6001600160a01b0316146112c45760405162461bcd60e51b81526004016108a49061338f565b6017546008546112d59060016134e2565b11156112f35760405162461bcd60e51b81526004016108a4906132e9565b6016546019546113049060016134e2565b11156113225760405162461bcd60e51b81526004016108a490613415565b60196000815461133190613586565b9091555061133e81612124565b50565b600f8160405161135191906130e2565b9081526040519081900360200190205460ff16156113a15760405162461bcd60e51b815260206004820152600d60248201526c696e76616c6964206e6f6e636560981b60448201526064016108a4565b601754600854106113e85760405162461bcd60e51b8152602060048201526011602482015270185b1b081d1bdad95b9cc81b5a5b9d1959607a1b60448201526064016108a4565b601754826113f560085490565b6113ff91906134e2565b111561141d5760405162461bcd60e51b81526004016108a4906132e9565b6015548260185461142e91906134e2565b11156114735760405162461bcd60e51b8152602060048201526014602482015273657863656564207075626c696320737570706c7960601b60448201526064016108a4565b3360009081526010602052604090205483906114909084906134e2565b11156114d25760405162461bcd60e51b815260206004820152601160248201527032bc31b2b2b21030b63637b1b0ba34b7b760791b60448201526064016108a4565b6114dc8585612163565b6115195760405162461bcd60e51b815260206004820152600e60248201526d34b73b30b634b21039b4b3b732b960911b60448201526064016108a4565b611526853385858561218d565b6115615760405162461bcd60e51b815260206004820152600c60248201526b0d2dcecc2d8d2c840d0c2e6d60a31b60448201526064016108a4565b816018600082825461157391906134e2565b909155505033600090815260106020526040812080548492906115979084906134e2565b925050819055506001600f826040516115b091906130e2565b908152604051908190036020019020805491151560ff1990921691909117905560005b828110156115f4576115e433612124565b6115ed81613586565b90506115d3565b505050505050565b600d546001600160a01b031690565b611613611d43565b6001600160a01b03166116246115fc565b6001600160a01b03161461164a5760405162461bcd60e51b81526004016108a49061338f565b805161165d90601c906020840190612b8c565b5050565b6060600180546107b990613551565b611678611d43565b6001600160a01b0316826001600160a01b031614156116d55760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b60448201526064016108a4565b80600560006116e2611d43565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611726611d43565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611762911515815260200190565b60405180910390a35050565b60008161177a81611d26565b6117965760405162461bcd60e51b81526004016108a490613368565b6000838152600e602052604090205491505b50919050565b6117b6611d43565b6001600160a01b03166117c76115fc565b6001600160a01b0316146117ed5760405162461bcd60e51b81526004016108a49061338f565b805161165d90601b906020840190612b8c565b61181161180b611d43565b83611eb7565b61182d5760405162461bcd60e51b81526004016108a4906133c4565b61183984848484612211565b50505050565b60606118496118bd565b61185283612244565b604051602001611863929190613130565b6040516020818303038152906040529050919050565b611881611d43565b6001600160a01b03166118926115fc565b6001600160a01b0316146118b85760405162461bcd60e51b81526004016108a49061338f565b601a55565b6060601e6118cc601a54612244565b6040516020016118dd92919061317e565b604051602081830303815290604052905090565b6118f9611d43565b6001600160a01b031661190a6115fc565b6001600160a01b0316146119305760405162461bcd60e51b81526004016108a49061338f565b805161165d90601d906020840190612b8c565b6060601e611952601a54612244565b6040516020016118dd9291906131cf565b60115460405163c455279160e01b81526000916001600160a01b039081169190841690829063c45527919061199c908890600401613223565b60206040518083038186803b1580156119b457600080fd5b505afa1580156119c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ec9190612f49565b6001600160a01b03161415611a055760019150506107a4565b6001600160a01b0380851660009081526005602090815260408083209387168352929052205460ff165b949350505050565b611a3f611d43565b6001600160a01b0316611a506115fc565b6001600160a01b031614611a765760405162461bcd60e51b81526004016108a49061338f565b6001600160a01b038116611adb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108a4565b600d546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600d80546001600160a01b0319166001600160a01b0392909216919091179055565b611b3f611d43565b6001600160a01b0316611b506115fc565b6001600160a01b031614611b765760405162461bcd60e51b81526004016108a49061338f565b60008111611bb55760405162461bcd60e51b815260206004820152600c60248201526b616d6f756e7420656d70747960a01b60448201526064016108a4565b47811115611bfe5760405162461bcd60e51b8152602060048201526016602482015275616d6f756e7420657863656564732062616c616e636560501b60448201526064016108a4565b6001600160a01b038216611c435760405162461bcd60e51b815260206004820152600c60248201526b1859191c995cdcc81b9d5b1b60a21b60448201526064016108a4565b6040516001600160a01b0383169082156108fc029083906000818181858888f193505050501580156109e7573d6000803e3d6000fd5b600033301415611cd057600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b03169150611cd39050565b50335b90565b60006001600160e01b031982166380ac58cd60e01b1480611d0757506001600160e01b03198216635b5e139f60e01b145b806107a457506301ffc9a760e01b6001600160e01b03198316146107a4565b6000908152600260205260409020546001600160a01b0316151590565b6000611d4d611c79565b905090565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611d8782610ff1565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006001600160a01b038616611e265760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201526424a3a722a960d91b60648201526084016108a4565b6001611e39611e3487612341565b6123be565b83868660405160008152602001604052604051611e599493929190613296565b6020604051602081039080840390855afa158015611e7b573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b6000611eb082846134e2565b9392505050565b6000611ec282611d26565b611f235760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108a4565b6000611f2e83610ff1565b9050806001600160a01b0316846001600160a01b03161480611f695750836001600160a01b0316611f5e8461083c565b6001600160a01b0316145b80611a2f5750611a2f8185611963565b826001600160a01b0316611f8c82610ff1565b6001600160a01b031614611ff45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016108a4565b6001600160a01b0382166120565760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016108a4565b6120618383836123ee565b61206c600082611d52565b6001600160a01b038316600090815260036020526040812080546001929061209590849061350e565b90915550506001600160a01b03821660009081526003602052604081208054600192906120c39084906134e2565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600061212f60085490565b61213a9060016134e2565b905061214682826124a6565b61215082826124c0565b6000918252600e60205260409091205550565b6014546000906001600160a01b031661217c8484612534565b6001600160a01b0316149392505050565b600085858585856040516020016121a7949392919061309d565b60408051601f198184030181529082905280516020918201207b0ca2ba3432b932bab69029b4b3b732b21026b2b9b9b0b3b29d05199960211b91830191909152603c820152605c016040516020818303038152906040528051906020012014905095945050505050565b61221c848484611f79565b612228848484846125ea565b6118395760405162461bcd60e51b81526004016108a490613316565b6060816122685750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612292578061227c81613586565b915061228b9050600a836134fa565b915061226c565b6000816001600160401b038111156122ac576122ac61360d565b6040519080825280601f01601f1916602001820160405280156122d6576020820181803683370190505b5090505b8415611a2f576122eb60018361350e565b91506122f8600a866135a1565b6123039060306134e2565b60f81b818381518110612318576123186135f7565b60200101906001600160f81b031916908160001a90535061233a600a866134fa565b94506122da565b600060405180608001604052806043815260200161364f60439139805160209182012083518483015160408087015180519086012090516123a1950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b60006123c9600b5490565b60405161190160f01b60208201526022810191909152604281018390526062016123a1565b6001600160a01b0383166124495761244481600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61246c565b816001600160a01b0316836001600160a01b03161461246c5761246c83826126fe565b6001600160a01b038216612483576109e78161279b565b826001600160a01b0316826001600160a01b0316146109e7576109e7828261284a565b61165d82826040518060200160405280600081525061288e565b6000806124ce60014361350e565b60135460408051924060208401526001600160601b031933606090811b82169285019290925260548401929092526074830186905286901b16609482015260a80160408051808303601f1901815291905280516020909101206013819055949350505050565b60008060008084516041141561255e5750505060208201516040830151606084015160001a6125d4565b84516040141561258c5750505060408201516020830151906001600160ff1b0381169060ff1c601b016125d4565b60405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016108a4565b6125e0868285856128c1565b9695505050505050565b60006001600160a01b0384163b156126f357836001600160a01b031663150b7a02612613611d43565b8786866040518563ffffffff1660e01b81526004016126359493929190613263565b602060405180830381600087803b15801561264f57600080fd5b505af192505050801561267f575060408051601f3d908101601f1916820190925261267c91810190612f2c565b60015b6126d9573d8080156126ad576040519150601f19603f3d011682016040523d82523d6000602084013e6126b2565b606091505b5080516126d15760405162461bcd60e51b81526004016108a490613316565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a2f565b506001949350505050565b6000600161270b84611068565b612715919061350e565b600083815260076020526040902054909150808214612768576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906127ad9060019061350e565b600083815260096020526040812054600880549394509092849081106127d5576127d56135f7565b9060005260206000200154905080600883815481106127f6576127f66135f7565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061282e5761282e6135e1565b6001900381819060005260206000200160009055905550505050565b600061285583611068565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6128988383612a4e565b6128a560008484846125ea565b6109e75760405162461bcd60e51b81526004016108a490613316565b60006fa2a8918ca85bafe22016d0b997e4df60600160ff1b038211156129345760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016108a4565b8360ff16601b148061294957508360ff16601c145b6129a05760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016108a4565b6000600186868686604051600081526020016040526040516129c59493929190613296565b6020604051602081039080840390855afa1580156129e7573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612a455760405162461bcd60e51b815260206004820152601860248201527745434453413a20696e76616c6964207369676e617475726560401b60448201526064016108a4565b95945050505050565b6001600160a01b038216612aa45760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016108a4565b612aad81611d26565b15612af95760405162461bcd60e51b815260206004820152601c60248201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b60448201526064016108a4565b612b05600083836123ee565b6001600160a01b0382166000908152600360205260408120805460019290612b2e9084906134e2565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054612b9890613551565b90600052602060002090601f016020900481019282612bba5760008555612c00565b82601f10612bd357805160ff1916838001178555612c00565b82800160010185558215612c00579182015b82811115612c00578251825591602001919060010190612be5565b50612c0c929150612c10565b5090565b5b80821115612c0c5760008155600101612c11565b600082601f830112612c3657600080fd5b81356001600160401b0380821115612c5057612c5061360d565b604051601f8301601f19908116603f01168101908282118183101715612c7857612c7861360d565b81604052838152866020858801011115612c9157600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060208284031215612cc357600080fd5b8135611eb081613623565b60008060408385031215612ce157600080fd5b8235612cec81613623565b91506020830135612cfc81613623565b809150509250929050565b600080600060608486031215612d1c57600080fd5b8335612d2781613623565b92506020840135612d3781613623565b929592945050506040919091013590565b60008060008060808587031215612d5e57600080fd5b8435612d6981613623565b93506020850135612d7981613623565b92506040850135915060608501356001600160401b03811115612d9b57600080fd5b612da787828801612c25565b91505092959194509250565b60008060408385031215612dc657600080fd5b8235612dd181613623565b915060208301358015158114612cfc57600080fd5b600080600080600060a08688031215612dfe57600080fd5b8535612e0981613623565b945060208601356001600160401b03811115612e2457600080fd5b612e3088828901612c25565b9450506040860135925060608601359150608086013560ff81168114612e5557600080fd5b809150509295509295909350565b60008060408385031215612e7657600080fd5b8235612e8181613623565b946020939093013593505050565b600080600080600060a08688031215612ea757600080fd5b8535945060208601356001600160401b0380821115612ec557600080fd5b612ed189838a01612c25565b955060408801359450606088013593506080880135915080821115612ef557600080fd5b50612f0288828901612c25565b9150509295509295909350565b600060208284031215612f2157600080fd5b8135611eb081613638565b600060208284031215612f3e57600080fd5b8151611eb081613638565b600060208284031215612f5b57600080fd5b8151611eb081613623565b600060208284031215612f7857600080fd5b81356001600160401b03811115612f8e57600080fd5b611a2f84828501612c25565b600060208284031215612fac57600080fd5b5035919050565b600080600060608486031215612fc857600080fd5b8335925060208401356001600160401b03811115612fe557600080fd5b612ff186828701612c25565b925050604084013590509250925092565b6000815180845261301a816020860160208601613525565b601f01601f19169290920160200192915050565b6000815461303b81613551565b60018281168015613053576001811461306457613093565b60ff19841687528287019450613093565b8560005260208060002060005b8581101561308a5781548a820152908401908201613071565b50505082870194505b5050505092915050565b606085901b6001600160601b0319168152601481018490526034810183905281516000906130d2816054850160208701613525565b9190910160540195945050505050565b600082516130f4818460208701613525565b9190910192915050565b60008351613110818460208801613525565b60609390931b6001600160601b0319169190920190815260140192915050565b60008351613142818460208801613525565b602f60f81b9083019081528351613160816001840160208801613525565b642f6d65746160d81b60019290910191820152600601949350505050565b600061318a828561302e565b6c2f6170692f70726f6a6563742f60981b815283516131b081600d840160208801613525565b6517ba37b5b2b760d11b600d9290910191820152601301949350505050565b60006131db828561302e565b6c2f6170692f70726f6a6563742f60981b8152835161320181600d840160208801613525565b680bd8dbdb9d1c9858dd60ba1b600d9290910191820152601601949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b03848116825283166020820152606060408201819052600090612a4590830184613002565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906125e090830184613002565b93845260ff9290921660208401526040830152606082015260800190565b602081526000611eb06020830184613002565b6040815260006132da6040830185613002565b90508260208301529392505050565b60208082526013908201527265786365656420746f6b656e20737570706c7960681b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252600d908201526c34b73b30b634b2103a37b5b2b760991b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b602080825260159082015274657863656564207072697661746520737570706c7960581b604082015260600190565b828152600060206040818401526040808401526000845461346481613551565b80608087015260a0600180841660008114613486576001811461349a576134c8565b60ff1985168984015260c0890195506134c8565b896000528660002060005b858110156134c05781548b82018601529083019088016134a5565b8a0184019650505b508089015460608901525050505080925050509392505050565b600082198211156134f5576134f56135b5565b500190565b600082613509576135096135cb565b500490565b600082821015613520576135206135b5565b500390565b60005b83811015613540578181015183820152602001613528565b838111156118395750506000910152565b600181811c9082168061356557607f821691505b602082108114156117a857634e487b7160e01b600052602260045260246000fd5b600060001982141561359a5761359a6135b5565b5060010190565b6000826135b0576135b06135cb565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461133e57600080fd5b6001600160e01b03198116811461133e57600080fdfe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a264697066735822122007d22529a9661eb78d852b8f35a53d689cb9c7f73a9b881614c9ab5c5dc3efe464736f6c63430008070033454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c7429000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000001b5800000000000000000000000000000000000000000000000000000000000001f41c4bb4e12e8d8f4d7e282729336e068465dfd247cc0b10c9725d671a44ffdb57000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1000000000000000000000000000000000000000000000000000000000000001253706972616c204672657175656e6369657300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004474350310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077061706176657200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b53706972616c73207477697374696e6720746865697220626561757479207468726f756768206879706e6f746963206672657175656e636965732e0000000000000000000000000000000000000000000000000000000000000000000000194d636f6e7374207536343d613d3e426967496e742e617355696e744e2836342c61292c726f746c3d28612c62293d3e75363428613c3c627c613e3e36346e2d62292c786f736869726f3235367374727374723d613d3e28293d3e7b636f6e737420623d75363428396e2a726f746c2875363428356e2a615b315d292c376e29293b6c657420633d75363428615b315d3c3c31376e293b72657475726e20615b325d5e3d615b305d2c615b335d5e3d615b315d2c615b315d5e3d615b325d2c615b305d5e3d615b335d2c615b325d5e3d632c615b335d3d726f746c28615b335d2c34356e292c627d2c72616e646f6d446563696d616c3d613d3e28293d3e7b636f6e737420623d6128293b72657475726e204e756d626572286225393030373139393235343734303939316e292f393030373139393235343734303939317d2c72616e646f6d4e756d6265723d633d3e28642c61293d3e642b28612d64292a6328292c72616e646f6d496e743d633d3e28642c61293d3e4d6174682e666c6f6f72286328642c612b3129292c6d6b52616e646f6d3d613d3e7b636f6e737420623d41727261792834292e66696c6c28292e6d61702828612c62293d3e31362a622b32292e6d617028623d3e75363428603078247b612e736c69636528622c622b3136297d6029292c633d786f736869726f3235367374727374722862292c643d72616e646f6d446563696d616c2863292c653d72616e646f6d4e756d6265722864292c663d72616e646f6d496e742865293b72657475726e5b642c652c665d7d2c73687566666c653d28612c62293d3e7b76617220633d4d6174682e666c6f6f723b666f72286c657420642c652c663d612e6c656e6774683b663b29653d63286228292a662d2d292c643d615b665d2c615b665d3d615b655d2c615b655d3d643b72657475726e20617d2c7265706561743d28612c62293d3e41727261792e66726f6d287b6c656e6774683a627d292e6d61702828293d3e61292c73656c65637452616e646f6d3d28612c62293d3e615b4d6174682e666c6f6f72286228292a612e6c656e677468295d2c73656c65637452616e646f6d446973743d28622c63293d3e7b636f6e737420613d4f626a6563742e6b6579732862292e7265647563652828632c61293d3e632e636f6e6361742872657065617428612c3130302a625b615d29292c5b5d293b72657475726e2073656c65637452616e646f6d2873687566666c6528612c63292c63297d2c746f4865783d613d3e612e746f537472696e67283136292e706164537461727428322c223022292c66726f6d4865783d613d3e7061727365496e7428612c3136292c636f6d706c656d656e743d613d3e7b636f6e737420633d612e6d61746368282f5e23285b302d39612d665d7b327d29285b302d39612d665d7b327d29285b302d39612d665d7b327d29242f69293b69662863297b636f6e737420613d746f486578283235352d66726f6d48657828635b315d29292c643d746f486578283235352d66726f6d48657828635b325d29292c653d746f486578283235352d66726f6d48657828635b335d29293b72657475726e6023247b617d247b647d247b657d607d7d2c67657450616c6c65743d28612c62293d3e7b7377697463682861297b6361736520373a72657475726e2073656c65637452616e646f6d2870616c6c657437732c62293b6361736520353a72657475726e2073656c65637452616e646f6d2870616c6c657435732c62293b6361736520333a72657475726e2073656c65637452616e646f6d2870616c6c657433732c62293b6361736520313a636f6e737420633d28293d3e746f486578284d6174682e666c6f6f72283235362a62282929292c643d6328292c653d6328292c663d6328293b72657475726e5b6023247b647d247b657d247b667d605d3b7d7d2c6765744c696e6557696474683d28612c62293d3e373d3d3d617c7c353d3d3d617c7c333d3d3d613f6228312c35293a313d3d3d613f6228312c33293a766f696420302c6765744261636b67726f756e643d28612c62293d3e7b696628313c612e6c656e677468297b636f6e737420633d6228312c3135292e746f537472696e67283136293b72657475726e6023247b72657065617428632c36292e6a6f696e282222297d607d72657475726e20636f6d706c656d656e7428615b305d297d2c61373d5b2223666630303030222c2223666661353030222c2223666666663030222c2223303066663030222c2223303030306666222c2223346230303832222c2223393430306433225d2c61353d5b2223663265333133222c2223663262373035222c2223613634663033222c2223353932323032222c2223306430303030225d2c62353d5b2223633730303131222c2223646232653130222c2223663036313133222c2223666638323031222c2223666661663231225d2c63353d5b2223653834353439222c2223663339363233222c2223666163353463222c2223386662653663222c2223336661613862225d2c64353d5b2223303132316661222c2223333937316530222c2223346239366635222c2223353761366530222c2223373064346635225d2c65353d5b2223643131626637222c2223383231386436222c2223356532366564222c2223316131386436222c2223316235336637225d2c66353d5b2223663266326632222c2223623562356235222c2223383038303830222c2223346634663466222c2223313231323132225d2c67353d5b2223313032363031222c2223316533343135222c2223316534383030222c2223333135613030222c2223343237323034225d2c68353d5b2223393830304145222c2223443931304234222c2223464645413035222c2223464343323031222c2223464639353030225d2c69353d5b2223303437376266222c2223303439646439222c2223303563376632222c2223663263363431222c2223463262343431225d2c6a353d5b2223313135333843222c2223313135443843222c2223463046314632222c2223303544424632222c2223303339364136225d2c6b353d5b2223303332383539222c2223303337333843222c2223303338433843222c2223463239393636222c2223463232443142225d2c6c353d5b2223424633303441222c2223303341364136222c2223463243423537222c2223373334463433222c2223463236343434225d2c6d353d5b2223373842464135222c2223463245334233222c2223463239423330222c2223463236413142222c2223353933443244225d2c6e353d5b2223443932423642222c2223343130373539222c2223323338433832222c2223463239453338222c2223463235433035225d2c6f353d5b2223424633363541222c2223443936323939222c2223463243454132222c2223463238313144222c2223384336453544225d2c70353d5b2223463236363939222c2223463231443831222c2223424632313642222c2223463242364432222c2223463246324632225d2c71353d5b2223334642464232222c2223323746323746222c2223383141363439222c2223443943453332222c2223343032303034225d2c72353d5b2223314430433539222c2223413841304439222c2223313731363430222c2223354135383843222c2223434643454632225d2c73353d5b2223616161616161222c2223626262626262222c2223636363636363222c2223646464646464222c2223656565656565225d2c61333d5b2223393041464335222c2223333336423837222c2223324133313332225d2c62333d5b2223363933443344222c2223424135353336222c2223413433383230225d2c63333d5b2223363838323945222c2223414542443338222c2223353938323334225d2c64333d5b2223324534363030222c2223343836423030222c2223413243353233225d2c65333d5b2223333735453937222c2223464236353432222c2223464642423030225d2c66333d5b2223383641433431222c2223333436373543222c2223374441334131225d2c67333d5b2223463443433730222c2223444537413232222c2223323039343842225d2c68333d5b2223384432333046222c2223394234463046222c2223433939453130225d2c69333d5b2223373542314139222c2223443942343441222c2223344636343537225d2c6a333d5b2223454238413434222c2223463944433234222c2223344237343437225d2c6b333d5b2223364536373032222c2223433035383035222c2223444239353031225d2c6c333d5b2223344438354244222c2223374341413244222c2223463545333536225d2c6d333d5b2223463542453431222c2223333141394238222c2223434633373231225d2c6e333d5b2223443045314639222c2223344436343844222c2223323833363535225d2c6f333d5b2223323734373733222c2223626333653365222c2223646563313165225d2c70333d5b2223303138353538222c2223626465393032222c2223666566303331225d2c71333d5b2223303338433843222c2223303332383539222c2223463232443142225d2c72333d5b2223463246324632222c2223394439443944222c2223304430443044225d2c73333d5b2223303033423030222c2223303038463131222c2223303046463431225d2c74333d5b2223306330653063222c2223643833323363222c2223656165626561225d2c70616c6c657437733d5b61375d2c70616c6c657435733d5b61352c62352c63352c64352c65352c66352c67352c68352e69352c6a352c6b352c6c352c6d352c6e352c6f352c70352c71352c72352c73355d2c70616c6c657433733d5b61332c62332c63332c64332c65332c66332c67332c68332c69332c6a332c6b332c6c332c6d332c6e332c6f332c70332c71332c72332c73332c74335d2c61726368696d656465616e3d28612c62293d3e622a612c6879706572626f6c69633d28612c62293d3e622f612c6665726d61743d28612c62293d3e622a4d6174682e737172742861292c6c69747575733d28612c62293d3e622f4d6174682e737172742861292c616c676f5365747570733d7b61726368696d656465616e3a7b616c676f3a61726368696d656465616e2c74686574613a7b73746172743a5b312c3530305d2c6d61783a5b35302c3130305d7d2c6c656e6774683a2e30317d2c6879706572626f6c69633a7b616c676f3a6879706572626f6c69632c74686574613a7b73746172743a5b31352c313430305d2c6d61783a5b35302c3130305d7d2c6c656e6774683a34382e357d2c6665726d61743a7b616c676f3a6665726d61742c74686574613a7b73746172743a5b312c3430305d2c6d61783a5b35302c3130305d7d2c6c656e6774683a2e31357d2c6c69747575733a7b616c676f3a6c69747575732c74686574613a7b73746172743a5b32352c313430305d2c6d61783a5b35302c3130305d7d2c6c656e6774683a362e357d7d2c616c676f446973743d7b61726368696d656465616e3a2e342c6879706572626f6c69633a2e332c6665726d61743a2e322c6c69747575733a2e317d2c70616c6c6574446973743d7b373a2e30312c353a2e32322c333a2e33332c313a2e34347d2c68617368546f5472616974733d613d3e7b636f6e73745b622c632c645d3d6d6b52616e646f6d2861292c653d73656c65637452616e646f6d4469737428616c676f446973742c62292c663d616c676f5365747570735b655d2c673d64282e2e2e662e74686574612e7374617274292c683d64282e2e2e662e74686574612e6d6178292c693d662e6c656e6774682a6328312c312e31292c6a3d3336302b6428312c3336292c6b3d7061727365496e742873656c65637452616e646f6d446973742870616c6c6574446973742c6229292c6c3d67657450616c6c6574286b2c62292c6d3d7b6267436f6c6f723a6765744261636b67726f756e64286c2c64292c6c696e65436f6c6f72733a6c2c6c696e6557696474683a6765744c696e655769647468286b2c63297d3b72657475726e7b616c676f4b65793a652c73657475703a662c746865746153746172743a672c74686574614d61783a682c6c656e6774683a692c73746570733a6a2c70616c6c65744e756d3a6b2c70616c6c65743a6c2c6f7074696f6e733a6d7d7d2c656c656d46726f6d54656d706c6174653d613d3e7b636f6e737420623d646f63756d656e742e637265617465456c656d656e74282274656d706c61746522293b72657475726e20622e696e6e657248544d4c3d612e7472696d28292c622e636f6e74656e742e66697273744368696c647d2c63726561746543616e7661733d28612c622c63293d3e7b72657475726e20656c656d46726f6d54656d706c61746528600a202020203c63616e7661732069643d22247b617d222077696474683d22247b627d22206865696768743d22247b637d223e60297d2c6b466974436f7665723d302c6b466974416c6c3d312c676574506978656c466163746f723d28612c62293d3e613d3d3d6b466974436f7665723f622e77696474683e622e6865696768743f622e77696474682f323a622e6865696768742f323a622e77696474683e622e6865696768743f622e6865696768742f323a622e77696474682f322c746f526164733d613d3e612a4d6174682e50492f3336302c6472617753706972616c3d28612c622c63293d3e7b636f6e737420643d612e676574436f6e746578742822326422292c653d612e77696474682f322c663d612e6865696768742f322c673d7b783a652c793a667d2c683d676574506978656c466163746f72286b466974436f7665722c61293b642e6c696e6557696474683d632e6c696e6557696474682f3235302a682c642e6c696e654361703d22726f756e64223b636f6e737420693d613d3e672e782b612a682c6a3d613d3e672e792b612a682c6b3d285b612c625d293d3e5b692861292c6a2862295d3b642e636c6561725265637428302c302c612e77696474682c612e686569676874292c642e7265637428302c302c612e77696474682c612e686569676874292c642e66696c6c5374796c653d632e6267436f6c6f722c642e66696c6c28293b636f6e7374206c3d613d3e7b636f6e737420623d632e6c696e65436f6c6f72732e6c656e6774683b72657475726e20632e6c696e65436f6c6f72735b6125625d7d3b622e666f72456163682828612c63293d3e7b303d3d637c7c28642e626567696e5061746828292c642e7374726f6b655374796c653d6c2863292c642e6d6f7665546f282e2e2e6b28625b632d315d29292c642e6c696e65546f282e2e2e6b286129292c642e7374726f6b652829297d297d2c67656e657261746553706972616c3d613d3e28622c632c64293d3e7b72657475726e2041727261792e66726f6d2841727261792864292e6b65797328292c643d3e7b636f6e737420653d642a746f526164732862292c663d6128652c63292c673d662a4d6174682e636f732865292c683d662a4d6174682e73696e2865293b72657475726e5b672c685d7d297d2c646f53706972616c3d28612c622c63293d3e7b636f6e73747b736565643a642c616c676f4b65793a652c73657475703a662c746865746153746172743a672c74686574614d61783a682c6c656e6774683a692c73746570733a6a2c70616c6c65744e756d3a6b2c70616c6c65743a6c2c6f7074696f6e733a6d7d3d68617368546f5472616974732862293b612e72656e6465723d28293d3e7b6c657420623d7061727365466c6f617428632e74297c7c303b636f6e737420643d672b28312b4d6174682e636f73286229292a682f322c653d67656e657261746553706972616c28662e616c676f2928642c692c6a293b6472617753706972616c28612c652c6d297d2c612e7570646174653d613d3e7b6c657420623d7061727365466c6f617428632e74297c7c303b636f6e737420643d31652d342a2828632e73706565642d35292f35292a613b623d28622b31652d342a612b64292528322a4d6174682e5049292c632e743d622e746f46697865642835297d2c612e6c6f6f703d623d3e7b612e72656e64657228292c612e6c6f6f7049643d72657175657374416e696d6174696f6e4672616d6528612e6c6f6f70293b636f6e737420643d622d28632e74737c7c30293b632e74733d622c30213d632e73706565642626612e7570646174652864297d2c612e6c6f6f7049643d72657175657374416e696d6174696f6e4672616d6528612e6c6f6f70297d2c736574757043616e7661733d28293d3e7b636f6e737420613d646f63756d656e742e717565727953656c6563746f722822626f647922292c623d63726561746543616e76617328226172742d63616e76617322293b72657475726e20612e617070656e644368696c642862292c73697a6543616e76617328292c627d2c73697a6543616e7661733d28293d3e7b76617220613d4d6174682e666c6f6f723b636f6e737420623d77696e646f772e696e6e657257696474682c633d77696e646f772e696e6e65724865696768742c643d77696e646f772e646576696365506978656c526174696f2c653d646f63756d656e742e717565727953656c6563746f722822236172742d63616e76617322293b652e77696474683d6128622a64292c652e6865696768743d6128632a64292c652e7374796c652e77696474683d622b227078222c652e7374796c652e6865696768743d632b227078227d2c72756e3d28612c62293d3e7b636f6e737420633d736574757043616e76617328293b646f53706972616c28632c612e686173682c62297d3b77696e646f772e6f6e6c6f61643d28293d3e72756e28746f6b656e446174612c746f6b656e5374617465292c77696e646f772e6f6e726573697a653d73697a6543616e7661733b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001768747470733a2f2f67656e65746963636861696e2e696f000000000000000000

Deployed Bytecode

0x60806040526004361061021d5760003560e01c80637284e4161161011f5780637284e416146104fe578063729868ee14610513578063755edd171461053357806380a1962f146105535780638da5cb5b1461057357806390c3f38f1461058857806395d89b41146105a8578063a22cb465146105bd578063a3864397146105dd578063a4f4f8af146105fd578063a52e413814610613578063b88d4fde14610633578063c87b56dd14610653578063ce9246dd14610673578063d547cfb714610693578063e403f1a7146106a8578063e527c6dd146106c8578063e8a3d485146106de578063e985e9c5146106f3578063f2fde38b14610713578063f3fef3a314610733578063f4656c6e14610753578063f7ee70681461076957600080fd5b806301ffc9a71461022257806306fdde0314610257578063081812fc14610279578063095ea7b3146102a65780630c53c51c146102c85780630f7e5970146102db57806318160ddd1461030857806320379ee51461032757806323b872dd1461033c57806324c12bf61461035c5780632d0335ab146103715780632f745c59146103a75780633408e470146103c75780633e4f49e6146103da5780633fafa1271461040857806342842e0e1461041e57806343508b051461043e57806343bc16121461045e5780634f6ccce7146104735780635f78d07f146104935780636352211e146104a957806370a08231146104c9578063715018a6146104e9575b600080fd5b34801561022e57600080fd5b5061024261023d366004612f0f565b61077f565b60405190151581526020015b60405180910390f35b34801561026357600080fd5b5061026c6107aa565b60405161024e91906132b4565b34801561028557600080fd5b50610299610294366004612f9a565b61083c565b60405161024e9190613223565b3480156102b257600080fd5b506102c66102c1366004612e63565b6108c9565b005b61026c6102d6366004612de6565b6109ec565b3480156102e757600080fd5b5061026c604051806040016040528060018152602001603160f81b81525081565b34801561031457600080fd5b506008545b60405190815260200161024e565b34801561033357600080fd5b50600b54610319565b34801561034857600080fd5b506102c6610357366004612d07565b610bd5565b34801561036857600080fd5b5061026c610c0d565b34801561037d57600080fd5b5061031961038c366004612cb1565b6001600160a01b03166000908152600c602052604090205490565b3480156103b357600080fd5b506103196103c2366004612e63565b610c9b565b3480156103d357600080fd5b5046610319565b3480156103e657600080fd5b506103fa6103f5366004612f9a565b610d31565b60405161024e9291906132c7565b34801561041457600080fd5b50610319601a5481565b34801561042a57600080fd5b506102c6610439366004612d07565b610e57565b34801561044a57600080fd5b506102c6610459366004612e63565b610e72565b34801561046a57600080fd5b5061026c610f51565b34801561047f57600080fd5b5061031961048e366004612f9a565b610f5e565b34801561049f57600080fd5b5061031960195481565b3480156104b557600080fd5b506102996104c4366004612f9a565b610ff1565b3480156104d557600080fd5b506103196104e4366004612cb1565b611068565b3480156104f557600080fd5b506102c66110ef565b34801561050a57600080fd5b5061026c611178565b34801561051f57600080fd5b506102c661052e366004612fb3565b611185565b34801561053f57600080fd5b506102c661054e366004612cb1565b611285565b34801561055f57600080fd5b506102c661056e366004612e8f565b611341565b34801561057f57600080fd5b506102996115fc565b34801561059457600080fd5b506102c66105a3366004612f66565b61160b565b3480156105b457600080fd5b5061026c611661565b3480156105c957600080fd5b506102c66105d8366004612db3565b611670565b3480156105e957600080fd5b506103196105f8366004612f9a565b61176e565b34801561060957600080fd5b5061031960185481565b34801561061f57600080fd5b506102c661062e366004612f66565b6117ae565b34801561063f57600080fd5b506102c661064e366004612d48565b611800565b34801561065f57600080fd5b5061026c61066e366004612f9a565b61183f565b34801561067f57600080fd5b506102c661068e366004612f9a565b611879565b34801561069f57600080fd5b5061026c6118bd565b3480156106b457600080fd5b506102c66106c3366004612f66565b6118f1565b3480156106d457600080fd5b5061031960155481565b3480156106ea57600080fd5b5061026c611943565b3480156106ff57600080fd5b5061024261070e366004612cce565b611963565b34801561071f57600080fd5b506102c661072e366004612cb1565b611a37565b34801561073f57600080fd5b506102c661074e366004612e63565b611b37565b34801561075f57600080fd5b5061031960165481565b34801561077557600080fd5b5061031960175481565b60006001600160e01b0319821663780e9d6360e01b14806107a457506107a482611cd6565b92915050565b6060600080546107b990613551565b80601f01602080910402602001604051908101604052809291908181526020018280546107e590613551565b80156108325780601f1061080757610100808354040283529160200191610832565b820191906000526020600020905b81548152906001019060200180831161081557829003601f168201915b5050505050905090565b600061084782611d26565b6108ad5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006108d482610ff1565b9050806001600160a01b0316836001600160a01b031614156109425760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016108a4565b806001600160a01b0316610954611d43565b6001600160a01b0316148061097057506109708161070e611d43565b6109dd5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b60648201526084016108a4565b6109e78383611d52565b505050565b60408051606081810183526001600160a01b0388166000818152600c602090815290859020548452830152918101869052610a2a8782878787611dc0565b610a805760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b60648201526084016108a4565b6001600160a01b0387166000908152600c6020526040902054610aa4906001611ea4565b6001600160a01b0388166000908152600c60205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b90610af490899033908a90613237565b60405180910390a1600080306001600160a01b0316888a604051602001610b1c9291906130fe565b60408051601f1981840301815290829052610b36916130e2565b6000604051808303816000865af19150503d8060008114610b73576040519150601f19603f3d011682016040523d82523d6000602084013e610b78565b606091505b509150915081610bc95760405162461bcd60e51b815260206004820152601c60248201527b119d5b98dd1a5bdb8818d85b1b081b9bdd081cdd58d8d95cdcd99d5b60221b60448201526064016108a4565b98975050505050505050565b610be6610be0611d43565b82611eb7565b610c025760405162461bcd60e51b81526004016108a4906133c4565b6109e7838383611f79565b601d8054610c1a90613551565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4690613551565b8015610c935780601f10610c6857610100808354040283529160200191610c93565b820191906000526020600020905b815481529060010190602001808311610c7657829003601f168201915b505050505081565b6000610ca683611068565b8210610d085760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016108a4565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6060600082610d3f81611d26565b610d5b5760405162461bcd60e51b81526004016108a490613368565b6000848152601f602052604090208054610d7490613551565b15159050610da157604051806040016040528060018152602001600360fc1b815250925060059150610e51565b6000848152601f602052604090208054610dba90613551565b80601f0160208091040260200160405190810160405280929190818152602001828054610de690613551565b8015610e335780601f10610e0857610100808354040283529160200191610e33565b820191906000526020600020905b815481529060010190602001808311610e1657829003601f168201915b5050506000878152601f602052604090206001015492955091935050505b50915091565b6109e783838360405180602001604052806000815250611800565b610e7a611d43565b6001600160a01b0316610e8b6115fc565b6001600160a01b031614610eb15760405162461bcd60e51b81526004016108a49061338f565b60175481610ebe60085490565b610ec891906134e2565b1115610ee65760405162461bcd60e51b81526004016108a4906132e9565b60165481601954610ef791906134e2565b1115610f155760405162461bcd60e51b81526004016108a490613415565b8060196000828254610f2791906134e2565b90915550600090505b818110156109e757610f4183612124565b610f4a81613586565b9050610f30565b601b8054610c1a90613551565b6000610f6960085490565b8210610fcc5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016108a4565b60088281548110610fdf57610fdf6135f7565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806107a45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016108a4565b60006001600160a01b0382166110d35760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016108a4565b506001600160a01b031660009081526003602052604090205490565b6110f7611d43565b6001600160a01b03166111086115fc565b6001600160a01b03161461112e5760405162461bcd60e51b81526004016108a49061338f565b600d546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600d80546001600160a01b0319169055565b601c8054610c1a90613551565b61118d611d43565b836111988282611eb7565b6111a157600080fd5b600a83111561120e5760405162461bcd60e51b815260206004820152603360248201527f53706972616c4672657175656e636965733a20496e76616c69642073706565646044820152721037b7363c90181698981030b63637bbb2b21760691b60648201526084016108a4565b6000858152601f60209081526040909120855161122d92870190612b8c565b506000858152601f60205260409081902060018101859055905133917f3d4fad315e2275fb8c76f82b128886471b0e7b91c1f5b8c737114826601ed3fe91611276918991613444565b60405180910390a25050505050565b61128d611d43565b6001600160a01b031661129e6115fc565b6001600160a01b0316146112c45760405162461bcd60e51b81526004016108a49061338f565b6017546008546112d59060016134e2565b11156112f35760405162461bcd60e51b81526004016108a4906132e9565b6016546019546113049060016134e2565b11156113225760405162461bcd60e51b81526004016108a490613415565b60196000815461133190613586565b9091555061133e81612124565b50565b600f8160405161135191906130e2565b9081526040519081900360200190205460ff16156113a15760405162461bcd60e51b815260206004820152600d60248201526c696e76616c6964206e6f6e636560981b60448201526064016108a4565b601754600854106113e85760405162461bcd60e51b8152602060048201526011602482015270185b1b081d1bdad95b9cc81b5a5b9d1959607a1b60448201526064016108a4565b601754826113f560085490565b6113ff91906134e2565b111561141d5760405162461bcd60e51b81526004016108a4906132e9565b6015548260185461142e91906134e2565b11156114735760405162461bcd60e51b8152602060048201526014602482015273657863656564207075626c696320737570706c7960601b60448201526064016108a4565b3360009081526010602052604090205483906114909084906134e2565b11156114d25760405162461bcd60e51b815260206004820152601160248201527032bc31b2b2b21030b63637b1b0ba34b7b760791b60448201526064016108a4565b6114dc8585612163565b6115195760405162461bcd60e51b815260206004820152600e60248201526d34b73b30b634b21039b4b3b732b960911b60448201526064016108a4565b611526853385858561218d565b6115615760405162461bcd60e51b815260206004820152600c60248201526b0d2dcecc2d8d2c840d0c2e6d60a31b60448201526064016108a4565b816018600082825461157391906134e2565b909155505033600090815260106020526040812080548492906115979084906134e2565b925050819055506001600f826040516115b091906130e2565b908152604051908190036020019020805491151560ff1990921691909117905560005b828110156115f4576115e433612124565b6115ed81613586565b90506115d3565b505050505050565b600d546001600160a01b031690565b611613611d43565b6001600160a01b03166116246115fc565b6001600160a01b03161461164a5760405162461bcd60e51b81526004016108a49061338f565b805161165d90601c906020840190612b8c565b5050565b6060600180546107b990613551565b611678611d43565b6001600160a01b0316826001600160a01b031614156116d55760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b60448201526064016108a4565b80600560006116e2611d43565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611726611d43565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611762911515815260200190565b60405180910390a35050565b60008161177a81611d26565b6117965760405162461bcd60e51b81526004016108a490613368565b6000838152600e602052604090205491505b50919050565b6117b6611d43565b6001600160a01b03166117c76115fc565b6001600160a01b0316146117ed5760405162461bcd60e51b81526004016108a49061338f565b805161165d90601b906020840190612b8c565b61181161180b611d43565b83611eb7565b61182d5760405162461bcd60e51b81526004016108a4906133c4565b61183984848484612211565b50505050565b60606118496118bd565b61185283612244565b604051602001611863929190613130565b6040516020818303038152906040529050919050565b611881611d43565b6001600160a01b03166118926115fc565b6001600160a01b0316146118b85760405162461bcd60e51b81526004016108a49061338f565b601a55565b6060601e6118cc601a54612244565b6040516020016118dd92919061317e565b604051602081830303815290604052905090565b6118f9611d43565b6001600160a01b031661190a6115fc565b6001600160a01b0316146119305760405162461bcd60e51b81526004016108a49061338f565b805161165d90601d906020840190612b8c565b6060601e611952601a54612244565b6040516020016118dd9291906131cf565b60115460405163c455279160e01b81526000916001600160a01b039081169190841690829063c45527919061199c908890600401613223565b60206040518083038186803b1580156119b457600080fd5b505afa1580156119c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ec9190612f49565b6001600160a01b03161415611a055760019150506107a4565b6001600160a01b0380851660009081526005602090815260408083209387168352929052205460ff165b949350505050565b611a3f611d43565b6001600160a01b0316611a506115fc565b6001600160a01b031614611a765760405162461bcd60e51b81526004016108a49061338f565b6001600160a01b038116611adb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108a4565b600d546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600d80546001600160a01b0319166001600160a01b0392909216919091179055565b611b3f611d43565b6001600160a01b0316611b506115fc565b6001600160a01b031614611b765760405162461bcd60e51b81526004016108a49061338f565b60008111611bb55760405162461bcd60e51b815260206004820152600c60248201526b616d6f756e7420656d70747960a01b60448201526064016108a4565b47811115611bfe5760405162461bcd60e51b8152602060048201526016602482015275616d6f756e7420657863656564732062616c616e636560501b60448201526064016108a4565b6001600160a01b038216611c435760405162461bcd60e51b815260206004820152600c60248201526b1859191c995cdcc81b9d5b1b60a21b60448201526064016108a4565b6040516001600160a01b0383169082156108fc029083906000818181858888f193505050501580156109e7573d6000803e3d6000fd5b600033301415611cd057600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b03169150611cd39050565b50335b90565b60006001600160e01b031982166380ac58cd60e01b1480611d0757506001600160e01b03198216635b5e139f60e01b145b806107a457506301ffc9a760e01b6001600160e01b03198316146107a4565b6000908152600260205260409020546001600160a01b0316151590565b6000611d4d611c79565b905090565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611d8782610ff1565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006001600160a01b038616611e265760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201526424a3a722a960d91b60648201526084016108a4565b6001611e39611e3487612341565b6123be565b83868660405160008152602001604052604051611e599493929190613296565b6020604051602081039080840390855afa158015611e7b573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b6000611eb082846134e2565b9392505050565b6000611ec282611d26565b611f235760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108a4565b6000611f2e83610ff1565b9050806001600160a01b0316846001600160a01b03161480611f695750836001600160a01b0316611f5e8461083c565b6001600160a01b0316145b80611a2f5750611a2f8185611963565b826001600160a01b0316611f8c82610ff1565b6001600160a01b031614611ff45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016108a4565b6001600160a01b0382166120565760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016108a4565b6120618383836123ee565b61206c600082611d52565b6001600160a01b038316600090815260036020526040812080546001929061209590849061350e565b90915550506001600160a01b03821660009081526003602052604081208054600192906120c39084906134e2565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600061212f60085490565b61213a9060016134e2565b905061214682826124a6565b61215082826124c0565b6000918252600e60205260409091205550565b6014546000906001600160a01b031661217c8484612534565b6001600160a01b0316149392505050565b600085858585856040516020016121a7949392919061309d565b60408051601f198184030181529082905280516020918201207b0ca2ba3432b932bab69029b4b3b732b21026b2b9b9b0b3b29d05199960211b91830191909152603c820152605c016040516020818303038152906040528051906020012014905095945050505050565b61221c848484611f79565b612228848484846125ea565b6118395760405162461bcd60e51b81526004016108a490613316565b6060816122685750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612292578061227c81613586565b915061228b9050600a836134fa565b915061226c565b6000816001600160401b038111156122ac576122ac61360d565b6040519080825280601f01601f1916602001820160405280156122d6576020820181803683370190505b5090505b8415611a2f576122eb60018361350e565b91506122f8600a866135a1565b6123039060306134e2565b60f81b818381518110612318576123186135f7565b60200101906001600160f81b031916908160001a90535061233a600a866134fa565b94506122da565b600060405180608001604052806043815260200161364f60439139805160209182012083518483015160408087015180519086012090516123a1950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b60006123c9600b5490565b60405161190160f01b60208201526022810191909152604281018390526062016123a1565b6001600160a01b0383166124495761244481600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61246c565b816001600160a01b0316836001600160a01b03161461246c5761246c83826126fe565b6001600160a01b038216612483576109e78161279b565b826001600160a01b0316826001600160a01b0316146109e7576109e7828261284a565b61165d82826040518060200160405280600081525061288e565b6000806124ce60014361350e565b60135460408051924060208401526001600160601b031933606090811b82169285019290925260548401929092526074830186905286901b16609482015260a80160408051808303601f1901815291905280516020909101206013819055949350505050565b60008060008084516041141561255e5750505060208201516040830151606084015160001a6125d4565b84516040141561258c5750505060408201516020830151906001600160ff1b0381169060ff1c601b016125d4565b60405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016108a4565b6125e0868285856128c1565b9695505050505050565b60006001600160a01b0384163b156126f357836001600160a01b031663150b7a02612613611d43565b8786866040518563ffffffff1660e01b81526004016126359493929190613263565b602060405180830381600087803b15801561264f57600080fd5b505af192505050801561267f575060408051601f3d908101601f1916820190925261267c91810190612f2c565b60015b6126d9573d8080156126ad576040519150601f19603f3d011682016040523d82523d6000602084013e6126b2565b606091505b5080516126d15760405162461bcd60e51b81526004016108a490613316565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a2f565b506001949350505050565b6000600161270b84611068565b612715919061350e565b600083815260076020526040902054909150808214612768576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906127ad9060019061350e565b600083815260096020526040812054600880549394509092849081106127d5576127d56135f7565b9060005260206000200154905080600883815481106127f6576127f66135f7565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061282e5761282e6135e1565b6001900381819060005260206000200160009055905550505050565b600061285583611068565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6128988383612a4e565b6128a560008484846125ea565b6109e75760405162461bcd60e51b81526004016108a490613316565b60006fa2a8918ca85bafe22016d0b997e4df60600160ff1b038211156129345760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016108a4565b8360ff16601b148061294957508360ff16601c145b6129a05760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016108a4565b6000600186868686604051600081526020016040526040516129c59493929190613296565b6020604051602081039080840390855afa1580156129e7573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612a455760405162461bcd60e51b815260206004820152601860248201527745434453413a20696e76616c6964207369676e617475726560401b60448201526064016108a4565b95945050505050565b6001600160a01b038216612aa45760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016108a4565b612aad81611d26565b15612af95760405162461bcd60e51b815260206004820152601c60248201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b60448201526064016108a4565b612b05600083836123ee565b6001600160a01b0382166000908152600360205260408120805460019290612b2e9084906134e2565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054612b9890613551565b90600052602060002090601f016020900481019282612bba5760008555612c00565b82601f10612bd357805160ff1916838001178555612c00565b82800160010185558215612c00579182015b82811115612c00578251825591602001919060010190612be5565b50612c0c929150612c10565b5090565b5b80821115612c0c5760008155600101612c11565b600082601f830112612c3657600080fd5b81356001600160401b0380821115612c5057612c5061360d565b604051601f8301601f19908116603f01168101908282118183101715612c7857612c7861360d565b81604052838152866020858801011115612c9157600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060208284031215612cc357600080fd5b8135611eb081613623565b60008060408385031215612ce157600080fd5b8235612cec81613623565b91506020830135612cfc81613623565b809150509250929050565b600080600060608486031215612d1c57600080fd5b8335612d2781613623565b92506020840135612d3781613623565b929592945050506040919091013590565b60008060008060808587031215612d5e57600080fd5b8435612d6981613623565b93506020850135612d7981613623565b92506040850135915060608501356001600160401b03811115612d9b57600080fd5b612da787828801612c25565b91505092959194509250565b60008060408385031215612dc657600080fd5b8235612dd181613623565b915060208301358015158114612cfc57600080fd5b600080600080600060a08688031215612dfe57600080fd5b8535612e0981613623565b945060208601356001600160401b03811115612e2457600080fd5b612e3088828901612c25565b9450506040860135925060608601359150608086013560ff81168114612e5557600080fd5b809150509295509295909350565b60008060408385031215612e7657600080fd5b8235612e8181613623565b946020939093013593505050565b600080600080600060a08688031215612ea757600080fd5b8535945060208601356001600160401b0380821115612ec557600080fd5b612ed189838a01612c25565b955060408801359450606088013593506080880135915080821115612ef557600080fd5b50612f0288828901612c25565b9150509295509295909350565b600060208284031215612f2157600080fd5b8135611eb081613638565b600060208284031215612f3e57600080fd5b8151611eb081613638565b600060208284031215612f5b57600080fd5b8151611eb081613623565b600060208284031215612f7857600080fd5b81356001600160401b03811115612f8e57600080fd5b611a2f84828501612c25565b600060208284031215612fac57600080fd5b5035919050565b600080600060608486031215612fc857600080fd5b8335925060208401356001600160401b03811115612fe557600080fd5b612ff186828701612c25565b925050604084013590509250925092565b6000815180845261301a816020860160208601613525565b601f01601f19169290920160200192915050565b6000815461303b81613551565b60018281168015613053576001811461306457613093565b60ff19841687528287019450613093565b8560005260208060002060005b8581101561308a5781548a820152908401908201613071565b50505082870194505b5050505092915050565b606085901b6001600160601b0319168152601481018490526034810183905281516000906130d2816054850160208701613525565b9190910160540195945050505050565b600082516130f4818460208701613525565b9190910192915050565b60008351613110818460208801613525565b60609390931b6001600160601b0319169190920190815260140192915050565b60008351613142818460208801613525565b602f60f81b9083019081528351613160816001840160208801613525565b642f6d65746160d81b60019290910191820152600601949350505050565b600061318a828561302e565b6c2f6170692f70726f6a6563742f60981b815283516131b081600d840160208801613525565b6517ba37b5b2b760d11b600d9290910191820152601301949350505050565b60006131db828561302e565b6c2f6170692f70726f6a6563742f60981b8152835161320181600d840160208801613525565b680bd8dbdb9d1c9858dd60ba1b600d9290910191820152601601949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b03848116825283166020820152606060408201819052600090612a4590830184613002565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906125e090830184613002565b93845260ff9290921660208401526040830152606082015260800190565b602081526000611eb06020830184613002565b6040815260006132da6040830185613002565b90508260208301529392505050565b60208082526013908201527265786365656420746f6b656e20737570706c7960681b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252600d908201526c34b73b30b634b2103a37b5b2b760991b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b602080825260159082015274657863656564207072697661746520737570706c7960581b604082015260600190565b828152600060206040818401526040808401526000845461346481613551565b80608087015260a0600180841660008114613486576001811461349a576134c8565b60ff1985168984015260c0890195506134c8565b896000528660002060005b858110156134c05781548b82018601529083019088016134a5565b8a0184019650505b508089015460608901525050505080925050509392505050565b600082198211156134f5576134f56135b5565b500190565b600082613509576135096135cb565b500490565b600082821015613520576135206135b5565b500390565b60005b83811015613540578181015183820152602001613528565b838111156118395750506000910152565b600181811c9082168061356557607f821691505b602082108114156117a857634e487b7160e01b600052602260045260246000fd5b600060001982141561359a5761359a6135b5565b5060010190565b6000826135b0576135b06135cb565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461133e57600080fd5b6001600160e01b03198116811461133e57600080fdfe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a264697066735822122007d22529a9661eb78d852b8f35a53d689cb9c7f73a9b881614c9ab5c5dc3efe464736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000001b5800000000000000000000000000000000000000000000000000000000000001f41c4bb4e12e8d8f4d7e282729336e068465dfd247cc0b10c9725d671a44ffdb57000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1000000000000000000000000000000000000000000000000000000000000001253706972616c204672657175656e6369657300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004474350310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077061706176657200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b53706972616c73207477697374696e6720746865697220626561757479207468726f756768206879706e6f746963206672657175656e636965732e0000000000000000000000000000000000000000000000000000000000000000000000194d636f6e7374207536343d613d3e426967496e742e617355696e744e2836342c61292c726f746c3d28612c62293d3e75363428613c3c627c613e3e36346e2d62292c786f736869726f3235367374727374723d613d3e28293d3e7b636f6e737420623d75363428396e2a726f746c2875363428356e2a615b315d292c376e29293b6c657420633d75363428615b315d3c3c31376e293b72657475726e20615b325d5e3d615b305d2c615b335d5e3d615b315d2c615b315d5e3d615b325d2c615b305d5e3d615b335d2c615b325d5e3d632c615b335d3d726f746c28615b335d2c34356e292c627d2c72616e646f6d446563696d616c3d613d3e28293d3e7b636f6e737420623d6128293b72657475726e204e756d626572286225393030373139393235343734303939316e292f393030373139393235343734303939317d2c72616e646f6d4e756d6265723d633d3e28642c61293d3e642b28612d64292a6328292c72616e646f6d496e743d633d3e28642c61293d3e4d6174682e666c6f6f72286328642c612b3129292c6d6b52616e646f6d3d613d3e7b636f6e737420623d41727261792834292e66696c6c28292e6d61702828612c62293d3e31362a622b32292e6d617028623d3e75363428603078247b612e736c69636528622c622b3136297d6029292c633d786f736869726f3235367374727374722862292c643d72616e646f6d446563696d616c2863292c653d72616e646f6d4e756d6265722864292c663d72616e646f6d496e742865293b72657475726e5b642c652c665d7d2c73687566666c653d28612c62293d3e7b76617220633d4d6174682e666c6f6f723b666f72286c657420642c652c663d612e6c656e6774683b663b29653d63286228292a662d2d292c643d615b665d2c615b665d3d615b655d2c615b655d3d643b72657475726e20617d2c7265706561743d28612c62293d3e41727261792e66726f6d287b6c656e6774683a627d292e6d61702828293d3e61292c73656c65637452616e646f6d3d28612c62293d3e615b4d6174682e666c6f6f72286228292a612e6c656e677468295d2c73656c65637452616e646f6d446973743d28622c63293d3e7b636f6e737420613d4f626a6563742e6b6579732862292e7265647563652828632c61293d3e632e636f6e6361742872657065617428612c3130302a625b615d29292c5b5d293b72657475726e2073656c65637452616e646f6d2873687566666c6528612c63292c63297d2c746f4865783d613d3e612e746f537472696e67283136292e706164537461727428322c223022292c66726f6d4865783d613d3e7061727365496e7428612c3136292c636f6d706c656d656e743d613d3e7b636f6e737420633d612e6d61746368282f5e23285b302d39612d665d7b327d29285b302d39612d665d7b327d29285b302d39612d665d7b327d29242f69293b69662863297b636f6e737420613d746f486578283235352d66726f6d48657828635b315d29292c643d746f486578283235352d66726f6d48657828635b325d29292c653d746f486578283235352d66726f6d48657828635b335d29293b72657475726e6023247b617d247b647d247b657d607d7d2c67657450616c6c65743d28612c62293d3e7b7377697463682861297b6361736520373a72657475726e2073656c65637452616e646f6d2870616c6c657437732c62293b6361736520353a72657475726e2073656c65637452616e646f6d2870616c6c657435732c62293b6361736520333a72657475726e2073656c65637452616e646f6d2870616c6c657433732c62293b6361736520313a636f6e737420633d28293d3e746f486578284d6174682e666c6f6f72283235362a62282929292c643d6328292c653d6328292c663d6328293b72657475726e5b6023247b647d247b657d247b667d605d3b7d7d2c6765744c696e6557696474683d28612c62293d3e373d3d3d617c7c353d3d3d617c7c333d3d3d613f6228312c35293a313d3d3d613f6228312c33293a766f696420302c6765744261636b67726f756e643d28612c62293d3e7b696628313c612e6c656e677468297b636f6e737420633d6228312c3135292e746f537472696e67283136293b72657475726e6023247b72657065617428632c36292e6a6f696e282222297d607d72657475726e20636f6d706c656d656e7428615b305d297d2c61373d5b2223666630303030222c2223666661353030222c2223666666663030222c2223303066663030222c2223303030306666222c2223346230303832222c2223393430306433225d2c61353d5b2223663265333133222c2223663262373035222c2223613634663033222c2223353932323032222c2223306430303030225d2c62353d5b2223633730303131222c2223646232653130222c2223663036313133222c2223666638323031222c2223666661663231225d2c63353d5b2223653834353439222c2223663339363233222c2223666163353463222c2223386662653663222c2223336661613862225d2c64353d5b2223303132316661222c2223333937316530222c2223346239366635222c2223353761366530222c2223373064346635225d2c65353d5b2223643131626637222c2223383231386436222c2223356532366564222c2223316131386436222c2223316235336637225d2c66353d5b2223663266326632222c2223623562356235222c2223383038303830222c2223346634663466222c2223313231323132225d2c67353d5b2223313032363031222c2223316533343135222c2223316534383030222c2223333135613030222c2223343237323034225d2c68353d5b2223393830304145222c2223443931304234222c2223464645413035222c2223464343323031222c2223464639353030225d2c69353d5b2223303437376266222c2223303439646439222c2223303563376632222c2223663263363431222c2223463262343431225d2c6a353d5b2223313135333843222c2223313135443843222c2223463046314632222c2223303544424632222c2223303339364136225d2c6b353d5b2223303332383539222c2223303337333843222c2223303338433843222c2223463239393636222c2223463232443142225d2c6c353d5b2223424633303441222c2223303341364136222c2223463243423537222c2223373334463433222c2223463236343434225d2c6d353d5b2223373842464135222c2223463245334233222c2223463239423330222c2223463236413142222c2223353933443244225d2c6e353d5b2223443932423642222c2223343130373539222c2223323338433832222c2223463239453338222c2223463235433035225d2c6f353d5b2223424633363541222c2223443936323939222c2223463243454132222c2223463238313144222c2223384336453544225d2c70353d5b2223463236363939222c2223463231443831222c2223424632313642222c2223463242364432222c2223463246324632225d2c71353d5b2223334642464232222c2223323746323746222c2223383141363439222c2223443943453332222c2223343032303034225d2c72353d5b2223314430433539222c2223413841304439222c2223313731363430222c2223354135383843222c2223434643454632225d2c73353d5b2223616161616161222c2223626262626262222c2223636363636363222c2223646464646464222c2223656565656565225d2c61333d5b2223393041464335222c2223333336423837222c2223324133313332225d2c62333d5b2223363933443344222c2223424135353336222c2223413433383230225d2c63333d5b2223363838323945222c2223414542443338222c2223353938323334225d2c64333d5b2223324534363030222c2223343836423030222c2223413243353233225d2c65333d5b2223333735453937222c2223464236353432222c2223464642423030225d2c66333d5b2223383641433431222c2223333436373543222c2223374441334131225d2c67333d5b2223463443433730222c2223444537413232222c2223323039343842225d2c68333d5b2223384432333046222c2223394234463046222c2223433939453130225d2c69333d5b2223373542314139222c2223443942343441222c2223344636343537225d2c6a333d5b2223454238413434222c2223463944433234222c2223344237343437225d2c6b333d5b2223364536373032222c2223433035383035222c2223444239353031225d2c6c333d5b2223344438354244222c2223374341413244222c2223463545333536225d2c6d333d5b2223463542453431222c2223333141394238222c2223434633373231225d2c6e333d5b2223443045314639222c2223344436343844222c2223323833363535225d2c6f333d5b2223323734373733222c2223626333653365222c2223646563313165225d2c70333d5b2223303138353538222c2223626465393032222c2223666566303331225d2c71333d5b2223303338433843222c2223303332383539222c2223463232443142225d2c72333d5b2223463246324632222c2223394439443944222c2223304430443044225d2c73333d5b2223303033423030222c2223303038463131222c2223303046463431225d2c74333d5b2223306330653063222c2223643833323363222c2223656165626561225d2c70616c6c657437733d5b61375d2c70616c6c657435733d5b61352c62352c63352c64352c65352c66352c67352c68352e69352c6a352c6b352c6c352c6d352c6e352c6f352c70352c71352c72352c73355d2c70616c6c657433733d5b61332c62332c63332c64332c65332c66332c67332c68332c69332c6a332c6b332c6c332c6d332c6e332c6f332c70332c71332c72332c73332c74335d2c61726368696d656465616e3d28612c62293d3e622a612c6879706572626f6c69633d28612c62293d3e622f612c6665726d61743d28612c62293d3e622a4d6174682e737172742861292c6c69747575733d28612c62293d3e622f4d6174682e737172742861292c616c676f5365747570733d7b61726368696d656465616e3a7b616c676f3a61726368696d656465616e2c74686574613a7b73746172743a5b312c3530305d2c6d61783a5b35302c3130305d7d2c6c656e6774683a2e30317d2c6879706572626f6c69633a7b616c676f3a6879706572626f6c69632c74686574613a7b73746172743a5b31352c313430305d2c6d61783a5b35302c3130305d7d2c6c656e6774683a34382e357d2c6665726d61743a7b616c676f3a6665726d61742c74686574613a7b73746172743a5b312c3430305d2c6d61783a5b35302c3130305d7d2c6c656e6774683a2e31357d2c6c69747575733a7b616c676f3a6c69747575732c74686574613a7b73746172743a5b32352c313430305d2c6d61783a5b35302c3130305d7d2c6c656e6774683a362e357d7d2c616c676f446973743d7b61726368696d656465616e3a2e342c6879706572626f6c69633a2e332c6665726d61743a2e322c6c69747575733a2e317d2c70616c6c6574446973743d7b373a2e30312c353a2e32322c333a2e33332c313a2e34347d2c68617368546f5472616974733d613d3e7b636f6e73745b622c632c645d3d6d6b52616e646f6d2861292c653d73656c65637452616e646f6d4469737428616c676f446973742c62292c663d616c676f5365747570735b655d2c673d64282e2e2e662e74686574612e7374617274292c683d64282e2e2e662e74686574612e6d6178292c693d662e6c656e6774682a6328312c312e31292c6a3d3336302b6428312c3336292c6b3d7061727365496e742873656c65637452616e646f6d446973742870616c6c6574446973742c6229292c6c3d67657450616c6c6574286b2c62292c6d3d7b6267436f6c6f723a6765744261636b67726f756e64286c2c64292c6c696e65436f6c6f72733a6c2c6c696e6557696474683a6765744c696e655769647468286b2c63297d3b72657475726e7b616c676f4b65793a652c73657475703a662c746865746153746172743a672c74686574614d61783a682c6c656e6774683a692c73746570733a6a2c70616c6c65744e756d3a6b2c70616c6c65743a6c2c6f7074696f6e733a6d7d7d2c656c656d46726f6d54656d706c6174653d613d3e7b636f6e737420623d646f63756d656e742e637265617465456c656d656e74282274656d706c61746522293b72657475726e20622e696e6e657248544d4c3d612e7472696d28292c622e636f6e74656e742e66697273744368696c647d2c63726561746543616e7661733d28612c622c63293d3e7b72657475726e20656c656d46726f6d54656d706c61746528600a202020203c63616e7661732069643d22247b617d222077696474683d22247b627d22206865696768743d22247b637d223e60297d2c6b466974436f7665723d302c6b466974416c6c3d312c676574506978656c466163746f723d28612c62293d3e613d3d3d6b466974436f7665723f622e77696474683e622e6865696768743f622e77696474682f323a622e6865696768742f323a622e77696474683e622e6865696768743f622e6865696768742f323a622e77696474682f322c746f526164733d613d3e612a4d6174682e50492f3336302c6472617753706972616c3d28612c622c63293d3e7b636f6e737420643d612e676574436f6e746578742822326422292c653d612e77696474682f322c663d612e6865696768742f322c673d7b783a652c793a667d2c683d676574506978656c466163746f72286b466974436f7665722c61293b642e6c696e6557696474683d632e6c696e6557696474682f3235302a682c642e6c696e654361703d22726f756e64223b636f6e737420693d613d3e672e782b612a682c6a3d613d3e672e792b612a682c6b3d285b612c625d293d3e5b692861292c6a2862295d3b642e636c6561725265637428302c302c612e77696474682c612e686569676874292c642e7265637428302c302c612e77696474682c612e686569676874292c642e66696c6c5374796c653d632e6267436f6c6f722c642e66696c6c28293b636f6e7374206c3d613d3e7b636f6e737420623d632e6c696e65436f6c6f72732e6c656e6774683b72657475726e20632e6c696e65436f6c6f72735b6125625d7d3b622e666f72456163682828612c63293d3e7b303d3d637c7c28642e626567696e5061746828292c642e7374726f6b655374796c653d6c2863292c642e6d6f7665546f282e2e2e6b28625b632d315d29292c642e6c696e65546f282e2e2e6b286129292c642e7374726f6b652829297d297d2c67656e657261746553706972616c3d613d3e28622c632c64293d3e7b72657475726e2041727261792e66726f6d2841727261792864292e6b65797328292c643d3e7b636f6e737420653d642a746f526164732862292c663d6128652c63292c673d662a4d6174682e636f732865292c683d662a4d6174682e73696e2865293b72657475726e5b672c685d7d297d2c646f53706972616c3d28612c622c63293d3e7b636f6e73747b736565643a642c616c676f4b65793a652c73657475703a662c746865746153746172743a672c74686574614d61783a682c6c656e6774683a692c73746570733a6a2c70616c6c65744e756d3a6b2c70616c6c65743a6c2c6f7074696f6e733a6d7d3d68617368546f5472616974732862293b612e72656e6465723d28293d3e7b6c657420623d7061727365466c6f617428632e74297c7c303b636f6e737420643d672b28312b4d6174682e636f73286229292a682f322c653d67656e657261746553706972616c28662e616c676f2928642c692c6a293b6472617753706972616c28612c652c6d297d2c612e7570646174653d613d3e7b6c657420623d7061727365466c6f617428632e74297c7c303b636f6e737420643d31652d342a2828632e73706565642d35292f35292a613b623d28622b31652d342a612b64292528322a4d6174682e5049292c632e743d622e746f46697865642835297d2c612e6c6f6f703d623d3e7b612e72656e64657228292c612e6c6f6f7049643d72657175657374416e696d6174696f6e4672616d6528612e6c6f6f70293b636f6e737420643d622d28632e74737c7c30293b632e74733d622c30213d632e73706565642626612e7570646174652864297d2c612e6c6f6f7049643d72657175657374416e696d6174696f6e4672616d6528612e6c6f6f70297d2c736574757043616e7661733d28293d3e7b636f6e737420613d646f63756d656e742e717565727953656c6563746f722822626f647922292c623d63726561746543616e76617328226172742d63616e76617322293b72657475726e20612e617070656e644368696c642862292c73697a6543616e76617328292c627d2c73697a6543616e7661733d28293d3e7b76617220613d4d6174682e666c6f6f723b636f6e737420623d77696e646f772e696e6e657257696474682c633d77696e646f772e696e6e65724865696768742c643d77696e646f772e646576696365506978656c526174696f2c653d646f63756d656e742e717565727953656c6563746f722822236172742d63616e76617322293b652e77696474683d6128622a64292c652e6865696768743d6128632a64292c652e7374796c652e77696474683d622b227078222c652e7374796c652e6865696768743d632b227078227d2c72756e3d28612c62293d3e7b636f6e737420633d736574757043616e76617328293b646f53706972616c28632c612e686173682c62297d3b77696e646f772e6f6e6c6f61643d28293d3e72756e28746f6b656e446174612c746f6b656e5374617465292c77696e646f772e6f6e726573697a653d73697a6543616e7661733b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001768747470733a2f2f67656e65746963636861696e2e696f000000000000000000

-----Decoded View---------------
Arg [0] : name_ (string): Spiral Frequencies
Arg [1] : symbol_ (string): GCP1
Arg [2] : projectId_ (uint256): 1
Arg [3] : artist_ (string): papaver
Arg [4] : description_ (string): Spirals twisting their beauty through hypnotic frequencies.
Arg [5] : code_ (string): const u64=a=>BigInt.asUintN(64,a),rotl=(a,b)=>u64(a<<b|a>>64n-b),xoshiro256strstr=a=>()=>{const b=u64(9n*rotl(u64(5n*a[1]),7n));let c=u64(a[1]<<17n);return a[2]^=a[0],a[3]^=a[1],a[1]^=a[2],a[0]^=a[3],a[2]^=c,a[3]=rotl(a[3],45n),b},randomDecimal=a=>()=>{const b=a();return Number(b%9007199254740991n)/9007199254740991},randomNumber=c=>(d,a)=>d+(a-d)*c(),randomInt=c=>(d,a)=>Math.floor(c(d,a+1)),mkRandom=a=>{const b=Array(4).fill().map((a,b)=>16*b+2).map(b=>u64(`0x${a.slice(b,b+16)}`)),c=xoshiro256strstr(b),d=randomDecimal(c),e=randomNumber(d),f=randomInt(e);return[d,e,f]},shuffle=(a,b)=>{var c=Math.floor;for(let d,e,f=a.length;f;)e=c(b()*f--),d=a[f],a[f]=a[e],a[e]=d;return a},repeat=(a,b)=>Array.from({length:b}).map(()=>a),selectRandom=(a,b)=>a[Math.floor(b()*a.length)],selectRandomDist=(b,c)=>{const a=Object.keys(b).reduce((c,a)=>c.concat(repeat(a,100*b[a])),[]);return selectRandom(shuffle(a,c),c)},toHex=a=>a.toString(16).padStart(2,"0"),fromHex=a=>parseInt(a,16),complement=a=>{const c=a.match(/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i);if(c){const a=toHex(255-fromHex(c[1])),d=toHex(255-fromHex(c[2])),e=toHex(255-fromHex(c[3]));return`#${a}${d}${e}`}},getPallet=(a,b)=>{switch(a){case 7:return selectRandom(pallet7s,b);case 5:return selectRandom(pallet5s,b);case 3:return selectRandom(pallet3s,b);case 1:const c=()=>toHex(Math.floor(256*b())),d=c(),e=c(),f=c();return[`#${d}${e}${f}`];}},getLineWidth=(a,b)=>7===a||5===a||3===a?b(1,5):1===a?b(1,3):void 0,getBackground=(a,b)=>{if(1<a.length){const c=b(1,15).toString(16);return`#${repeat(c,6).join("")}`}return complement(a[0])},a7=["#ff0000","#ffa500","#ffff00","#00ff00","#0000ff","#4b0082","#9400d3"],a5=["#f2e313","#f2b705","#a64f03","#592202","#0d0000"],b5=["#c70011","#db2e10","#f06113","#ff8201","#ffaf21"],c5=["#e84549","#f39623","#fac54c","#8fbe6c","#3faa8b"],d5=["#0121fa","#3971e0","#4b96f5","#57a6e0","#70d4f5"],e5=["#d11bf7","#8218d6","#5e26ed","#1a18d6","#1b53f7"],f5=["#f2f2f2","#b5b5b5","#808080","#4f4f4f","#121212"],g5=["#102601","#1e3415","#1e4800","#315a00","#427204"],h5=["#9800AE","#D910B4","#FFEA05","#FCC201","#FF9500"],i5=["#0477bf","#049dd9","#05c7f2","#f2c641","#F2b441"],j5=["#11538C","#115D8C","#F0F1F2","#05DBF2","#0396A6"],k5=["#032859","#03738C","#038C8C","#F29966","#F22D1B"],l5=["#BF304A","#03A6A6","#F2CB57","#734F43","#F26444"],m5=["#78BFA5","#F2E3B3","#F29B30","#F26A1B","#593D2D"],n5=["#D92B6B","#410759","#238C82","#F29E38","#F25C05"],o5=["#BF365A","#D96299","#F2CEA2","#F2811D","#8C6E5D"],p5=["#F26699","#F21D81","#BF216B","#F2B6D2","#F2F2F2"],q5=["#3FBFB2","#27F27F","#81A649","#D9CE32","#402004"],r5=["#1D0C59","#A8A0D9","#171640","#5A588C","#CFCEF2"],s5=["#aaaaaa","#bbbbbb","#cccccc","#dddddd","#eeeeee"],a3=["#90AFC5","#336B87","#2A3132"],b3=["#693D3D","#BA5536","#A43820"],c3=["#68829E","#AEBD38","#598234"],d3=["#2E4600","#486B00","#A2C523"],e3=["#375E97","#FB6542","#FFBB00"],f3=["#86AC41","#34675C","#7DA3A1"],g3=["#F4CC70","#DE7A22","#20948B"],h3=["#8D230F","#9B4F0F","#C99E10"],i3=["#75B1A9","#D9B44A","#4F6457"],j3=["#EB8A44","#F9DC24","#4B7447"],k3=["#6E6702","#C05805","#DB9501"],l3=["#4D85BD","#7CAA2D","#F5E356"],m3=["#F5BE41","#31A9B8","#CF3721"],n3=["#D0E1F9","#4D648D","#283655"],o3=["#274773","#bc3e3e","#dec11e"],p3=["#018558","#bde902","#fef031"],q3=["#038C8C","#032859","#F22D1B"],r3=["#F2F2F2","#9D9D9D","#0D0D0D"],s3=["#003B00","#008F11","#00FF41"],t3=["#0c0e0c","#d8323c","#eaebea"],pallet7s=[a7],pallet5s=[a5,b5,c5,d5,e5,f5,g5,h5.i5,j5,k5,l5,m5,n5,o5,p5,q5,r5,s5],pallet3s=[a3,b3,c3,d3,e3,f3,g3,h3,i3,j3,k3,l3,m3,n3,o3,p3,q3,r3,s3,t3],archimedean=(a,b)=>b*a,hyperbolic=(a,b)=>b/a,fermat=(a,b)=>b*Math.sqrt(a),lituus=(a,b)=>b/Math.sqrt(a),algoSetups={archimedean:{algo:archimedean,theta:{start:[1,500],max:[50,100]},length:.01},hyperbolic:{algo:hyperbolic,theta:{start:[15,1400],max:[50,100]},length:48.5},fermat:{algo:fermat,theta:{start:[1,400],max:[50,100]},length:.15},lituus:{algo:lituus,theta:{start:[25,1400],max:[50,100]},length:6.5}},algoDist={archimedean:.4,hyperbolic:.3,fermat:.2,lituus:.1},palletDist={7:.01,5:.22,3:.33,1:.44},hashToTraits=a=>{const[b,c,d]=mkRandom(a),e=selectRandomDist(algoDist,b),f=algoSetups[e],g=d(...f.theta.start),h=d(...f.theta.max),i=f.length*c(1,1.1),j=360+d(1,36),k=parseInt(selectRandomDist(palletDist,b)),l=getPallet(k,b),m={bgColor:getBackground(l,d),lineColors:l,lineWidth:getLineWidth(k,c)};return{algoKey:e,setup:f,thetaStart:g,thetaMax:h,length:i,steps:j,palletNum:k,pallet:l,options:m}},elemFromTemplate=a=>{const b=document.createElement("template");return b.innerHTML=a.trim(),b.content.firstChild},createCanvas=(a,b,c)=>{return elemFromTemplate(` <canvas id="${a}" width="${b}" height="${c}">`)},kFitCover=0,kFitAll=1,getPixelFactor=(a,b)=>a===kFitCover?b.width>b.height?b.width/2:b.height/2:b.width>b.height?b.height/2:b.width/2,toRads=a=>a*Math.PI/360,drawSpiral=(a,b,c)=>{const d=a.getContext("2d"),e=a.width/2,f=a.height/2,g={x:e,y:f},h=getPixelFactor(kFitCover,a);d.lineWidth=c.lineWidth/250*h,d.lineCap="round";const i=a=>g.x+a*h,j=a=>g.y+a*h,k=([a,b])=>[i(a),j(b)];d.clearRect(0,0,a.width,a.height),d.rect(0,0,a.width,a.height),d.fillStyle=c.bgColor,d.fill();const l=a=>{const b=c.lineColors.length;return c.lineColors[a%b]};b.forEach((a,c)=>{0==c||(d.beginPath(),d.strokeStyle=l(c),d.moveTo(...k(b[c-1])),d.lineTo(...k(a)),d.stroke())})},generateSpiral=a=>(b,c,d)=>{return Array.from(Array(d).keys(),d=>{const e=d*toRads(b),f=a(e,c),g=f*Math.cos(e),h=f*Math.sin(e);return[g,h]})},doSpiral=(a,b,c)=>{const{seed:d,algoKey:e,setup:f,thetaStart:g,thetaMax:h,length:i,steps:j,palletNum:k,pallet:l,options:m}=hashToTraits(b);a.render=()=>{let b=parseFloat(c.t)||0;const d=g+(1+Math.cos(b))*h/2,e=generateSpiral(f.algo)(d,i,j);drawSpiral(a,e,m)},a.update=a=>{let b=parseFloat(c.t)||0;const d=1e-4*((c.speed-5)/5)*a;b=(b+1e-4*a+d)%(2*Math.PI),c.t=b.toFixed(5)},a.loop=b=>{a.render(),a.loopId=requestAnimationFrame(a.loop);const d=b-(c.ts||0);c.ts=b,0!=c.speed&&a.update(d)},a.loopId=requestAnimationFrame(a.loop)},setupCanvas=()=>{const a=document.querySelector("body"),b=createCanvas("art-canvas");return a.appendChild(b),sizeCanvas(),b},sizeCanvas=()=>{var a=Math.floor;const b=window.innerWidth,c=window.innerHeight,d=window.devicePixelRatio,e=document.querySelector("#art-canvas");e.width=a(b*d),e.height=a(c*d),e.style.width=b+"px",e.style.height=c+"px"},run=(a,b)=>{const c=setupCanvas();doSpiral(c,a.hash,b)};window.onload=()=>run(tokenData,tokenState),window.onresize=sizeCanvas;
Arg [6] : baseUri_ (string): https://geneticchain.io
Arg [7] : publicMax_ (uint256): 7000
Arg [8] : privateMax_ (uint256): 500
Arg [9] : seed_ (uint256): 12798521675422859840517238516573899589114120347673142183589558790011467324247
Arg [10] : proxyRegistryAddress (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1

-----Encoded View---------------
226 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [1] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [3] : 00000000000000000000000000000000000000000000000000000000000001e0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000220
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000280
Arg [6] : 0000000000000000000000000000000000000000000000000000000000001c00
Arg [7] : 0000000000000000000000000000000000000000000000000000000000001b58
Arg [8] : 00000000000000000000000000000000000000000000000000000000000001f4
Arg [9] : 1c4bb4e12e8d8f4d7e282729336e068465dfd247cc0b10c9725d671a44ffdb57
Arg [10] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [12] : 53706972616c204672657175656e636965730000000000000000000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [14] : 4743503100000000000000000000000000000000000000000000000000000000
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [16] : 7061706176657200000000000000000000000000000000000000000000000000
Arg [17] : 000000000000000000000000000000000000000000000000000000000000003b
Arg [18] : 53706972616c73207477697374696e6720746865697220626561757479207468
Arg [19] : 726f756768206879706e6f746963206672657175656e636965732e0000000000
Arg [20] : 000000000000000000000000000000000000000000000000000000000000194d
Arg [21] : 636f6e7374207536343d613d3e426967496e742e617355696e744e2836342c61
Arg [22] : 292c726f746c3d28612c62293d3e75363428613c3c627c613e3e36346e2d6229
Arg [23] : 2c786f736869726f3235367374727374723d613d3e28293d3e7b636f6e737420
Arg [24] : 623d75363428396e2a726f746c2875363428356e2a615b315d292c376e29293b
Arg [25] : 6c657420633d75363428615b315d3c3c31376e293b72657475726e20615b325d
Arg [26] : 5e3d615b305d2c615b335d5e3d615b315d2c615b315d5e3d615b325d2c615b30
Arg [27] : 5d5e3d615b335d2c615b325d5e3d632c615b335d3d726f746c28615b335d2c34
Arg [28] : 356e292c627d2c72616e646f6d446563696d616c3d613d3e28293d3e7b636f6e
Arg [29] : 737420623d6128293b72657475726e204e756d62657228622539303037313939
Arg [30] : 3235343734303939316e292f393030373139393235343734303939317d2c7261
Arg [31] : 6e646f6d4e756d6265723d633d3e28642c61293d3e642b28612d64292a632829
Arg [32] : 2c72616e646f6d496e743d633d3e28642c61293d3e4d6174682e666c6f6f7228
Arg [33] : 6328642c612b3129292c6d6b52616e646f6d3d613d3e7b636f6e737420623d41
Arg [34] : 727261792834292e66696c6c28292e6d61702828612c62293d3e31362a622b32
Arg [35] : 292e6d617028623d3e75363428603078247b612e736c69636528622c622b3136
Arg [36] : 297d6029292c633d786f736869726f3235367374727374722862292c643d7261
Arg [37] : 6e646f6d446563696d616c2863292c653d72616e646f6d4e756d626572286429
Arg [38] : 2c663d72616e646f6d496e742865293b72657475726e5b642c652c665d7d2c73
Arg [39] : 687566666c653d28612c62293d3e7b76617220633d4d6174682e666c6f6f723b
Arg [40] : 666f72286c657420642c652c663d612e6c656e6774683b663b29653d63286228
Arg [41] : 292a662d2d292c643d615b665d2c615b665d3d615b655d2c615b655d3d643b72
Arg [42] : 657475726e20617d2c7265706561743d28612c62293d3e41727261792e66726f
Arg [43] : 6d287b6c656e6774683a627d292e6d61702828293d3e61292c73656c65637452
Arg [44] : 616e646f6d3d28612c62293d3e615b4d6174682e666c6f6f72286228292a612e
Arg [45] : 6c656e677468295d2c73656c65637452616e646f6d446973743d28622c63293d
Arg [46] : 3e7b636f6e737420613d4f626a6563742e6b6579732862292e72656475636528
Arg [47] : 28632c61293d3e632e636f6e6361742872657065617428612c3130302a625b61
Arg [48] : 5d29292c5b5d293b72657475726e2073656c65637452616e646f6d2873687566
Arg [49] : 666c6528612c63292c63297d2c746f4865783d613d3e612e746f537472696e67
Arg [50] : 283136292e706164537461727428322c223022292c66726f6d4865783d613d3e
Arg [51] : 7061727365496e7428612c3136292c636f6d706c656d656e743d613d3e7b636f
Arg [52] : 6e737420633d612e6d61746368282f5e23285b302d39612d665d7b327d29285b
Arg [53] : 302d39612d665d7b327d29285b302d39612d665d7b327d29242f69293b696628
Arg [54] : 63297b636f6e737420613d746f486578283235352d66726f6d48657828635b31
Arg [55] : 5d29292c643d746f486578283235352d66726f6d48657828635b325d29292c65
Arg [56] : 3d746f486578283235352d66726f6d48657828635b335d29293b72657475726e
Arg [57] : 6023247b617d247b647d247b657d607d7d2c67657450616c6c65743d28612c62
Arg [58] : 293d3e7b7377697463682861297b6361736520373a72657475726e2073656c65
Arg [59] : 637452616e646f6d2870616c6c657437732c62293b6361736520353a72657475
Arg [60] : 726e2073656c65637452616e646f6d2870616c6c657435732c62293b63617365
Arg [61] : 20333a72657475726e2073656c65637452616e646f6d2870616c6c657433732c
Arg [62] : 62293b6361736520313a636f6e737420633d28293d3e746f486578284d617468
Arg [63] : 2e666c6f6f72283235362a62282929292c643d6328292c653d6328292c663d63
Arg [64] : 28293b72657475726e5b6023247b647d247b657d247b667d605d3b7d7d2c6765
Arg [65] : 744c696e6557696474683d28612c62293d3e373d3d3d617c7c353d3d3d617c7c
Arg [66] : 333d3d3d613f6228312c35293a313d3d3d613f6228312c33293a766f69642030
Arg [67] : 2c6765744261636b67726f756e643d28612c62293d3e7b696628313c612e6c65
Arg [68] : 6e677468297b636f6e737420633d6228312c3135292e746f537472696e672831
Arg [69] : 36293b72657475726e6023247b72657065617428632c36292e6a6f696e282222
Arg [70] : 297d607d72657475726e20636f6d706c656d656e7428615b305d297d2c61373d
Arg [71] : 5b2223666630303030222c2223666661353030222c2223666666663030222c22
Arg [72] : 23303066663030222c2223303030306666222c2223346230303832222c222339
Arg [73] : 3430306433225d2c61353d5b2223663265333133222c2223663262373035222c
Arg [74] : 2223613634663033222c2223353932323032222c2223306430303030225d2c62
Arg [75] : 353d5b2223633730303131222c2223646232653130222c222366303631313322
Arg [76] : 2c2223666638323031222c2223666661663231225d2c63353d5b222365383435
Arg [77] : 3439222c2223663339363233222c2223666163353463222c2223386662653663
Arg [78] : 222c2223336661613862225d2c64353d5b2223303132316661222c2223333937
Arg [79] : 316530222c2223346239366635222c2223353761366530222c22233730643466
Arg [80] : 35225d2c65353d5b2223643131626637222c2223383231386436222c22233565
Arg [81] : 32366564222c2223316131386436222c2223316235336637225d2c66353d5b22
Arg [82] : 23663266326632222c2223623562356235222c2223383038303830222c222334
Arg [83] : 6634663466222c2223313231323132225d2c67353d5b2223313032363031222c
Arg [84] : 2223316533343135222c2223316534383030222c2223333135613030222c2223
Arg [85] : 343237323034225d2c68353d5b2223393830304145222c222344393130423422
Arg [86] : 2c2223464645413035222c2223464343323031222c2223464639353030225d2c
Arg [87] : 69353d5b2223303437376266222c2223303439646439222c2223303563376632
Arg [88] : 222c2223663263363431222c2223463262343431225d2c6a353d5b2223313135
Arg [89] : 333843222c2223313135443843222c2223463046314632222c22233035444246
Arg [90] : 32222c2223303339364136225d2c6b353d5b2223303332383539222c22233033
Arg [91] : 37333843222c2223303338433843222c2223463239393636222c222346323244
Arg [92] : 3142225d2c6c353d5b2223424633303441222c2223303341364136222c222346
Arg [93] : 3243423537222c2223373334463433222c2223463236343434225d2c6d353d5b
Arg [94] : 2223373842464135222c2223463245334233222c2223463239423330222c2223
Arg [95] : 463236413142222c2223353933443244225d2c6e353d5b222344393242364222
Arg [96] : 2c2223343130373539222c2223323338433832222c2223463239453338222c22
Arg [97] : 23463235433035225d2c6f353d5b2223424633363541222c2223443936323939
Arg [98] : 222c2223463243454132222c2223463238313144222c2223384336453544225d
Arg [99] : 2c70353d5b2223463236363939222c2223463231443831222c22234246323136
Arg [100] : 42222c2223463242364432222c2223463246324632225d2c71353d5b22233346
Arg [101] : 42464232222c2223323746323746222c2223383141363439222c222344394345
Arg [102] : 3332222c2223343032303034225d2c72353d5b2223314430433539222c222341
Arg [103] : 3841304439222c2223313731363430222c2223354135383843222c2223434643
Arg [104] : 454632225d2c73353d5b2223616161616161222c2223626262626262222c2223
Arg [105] : 636363636363222c2223646464646464222c2223656565656565225d2c61333d
Arg [106] : 5b2223393041464335222c2223333336423837222c2223324133313332225d2c
Arg [107] : 62333d5b2223363933443344222c2223424135353336222c2223413433383230
Arg [108] : 225d2c63333d5b2223363838323945222c2223414542443338222c2223353938
Arg [109] : 323334225d2c64333d5b2223324534363030222c2223343836423030222c2223
Arg [110] : 413243353233225d2c65333d5b2223333735453937222c222346423635343222
Arg [111] : 2c2223464642423030225d2c66333d5b2223383641433431222c222333343637
Arg [112] : 3543222c2223374441334131225d2c67333d5b2223463443433730222c222344
Arg [113] : 4537413232222c2223323039343842225d2c68333d5b2223384432333046222c
Arg [114] : 2223394234463046222c2223433939453130225d2c69333d5b22233735423141
Arg [115] : 39222c2223443942343441222c2223344636343537225d2c6a333d5b22234542
Arg [116] : 38413434222c2223463944433234222c2223344237343437225d2c6b333d5b22
Arg [117] : 23364536373032222c2223433035383035222c2223444239353031225d2c6c33
Arg [118] : 3d5b2223344438354244222c2223374341413244222c2223463545333536225d
Arg [119] : 2c6d333d5b2223463542453431222c2223333141394238222c22234346333732
Arg [120] : 31225d2c6e333d5b2223443045314639222c2223344436343844222c22233238
Arg [121] : 33363535225d2c6f333d5b2223323734373733222c2223626333653365222c22
Arg [122] : 23646563313165225d2c70333d5b2223303138353538222c2223626465393032
Arg [123] : 222c2223666566303331225d2c71333d5b2223303338433843222c2223303332
Arg [124] : 383539222c2223463232443142225d2c72333d5b2223463246324632222c2223
Arg [125] : 394439443944222c2223304430443044225d2c73333d5b222330303342303022
Arg [126] : 2c2223303038463131222c2223303046463431225d2c74333d5b222330633065
Arg [127] : 3063222c2223643833323363222c2223656165626561225d2c70616c6c657437
Arg [128] : 733d5b61375d2c70616c6c657435733d5b61352c62352c63352c64352c65352c
Arg [129] : 66352c67352c68352e69352c6a352c6b352c6c352c6d352c6e352c6f352c7035
Arg [130] : 2c71352c72352c73355d2c70616c6c657433733d5b61332c62332c63332c6433
Arg [131] : 2c65332c66332c67332c68332c69332c6a332c6b332c6c332c6d332c6e332c6f
Arg [132] : 332c70332c71332c72332c73332c74335d2c61726368696d656465616e3d2861
Arg [133] : 2c62293d3e622a612c6879706572626f6c69633d28612c62293d3e622f612c66
Arg [134] : 65726d61743d28612c62293d3e622a4d6174682e737172742861292c6c697475
Arg [135] : 75733d28612c62293d3e622f4d6174682e737172742861292c616c676f536574
Arg [136] : 7570733d7b61726368696d656465616e3a7b616c676f3a61726368696d656465
Arg [137] : 616e2c74686574613a7b73746172743a5b312c3530305d2c6d61783a5b35302c
Arg [138] : 3130305d7d2c6c656e6774683a2e30317d2c6879706572626f6c69633a7b616c
Arg [139] : 676f3a6879706572626f6c69632c74686574613a7b73746172743a5b31352c31
Arg [140] : 3430305d2c6d61783a5b35302c3130305d7d2c6c656e6774683a34382e357d2c
Arg [141] : 6665726d61743a7b616c676f3a6665726d61742c74686574613a7b7374617274
Arg [142] : 3a5b312c3430305d2c6d61783a5b35302c3130305d7d2c6c656e6774683a2e31
Arg [143] : 357d2c6c69747575733a7b616c676f3a6c69747575732c74686574613a7b7374
Arg [144] : 6172743a5b32352c313430305d2c6d61783a5b35302c3130305d7d2c6c656e67
Arg [145] : 74683a362e357d7d2c616c676f446973743d7b61726368696d656465616e3a2e
Arg [146] : 342c6879706572626f6c69633a2e332c6665726d61743a2e322c6c6974757573
Arg [147] : 3a2e317d2c70616c6c6574446973743d7b373a2e30312c353a2e32322c333a2e
Arg [148] : 33332c313a2e34347d2c68617368546f5472616974733d613d3e7b636f6e7374
Arg [149] : 5b622c632c645d3d6d6b52616e646f6d2861292c653d73656c65637452616e64
Arg [150] : 6f6d4469737428616c676f446973742c62292c663d616c676f5365747570735b
Arg [151] : 655d2c673d64282e2e2e662e74686574612e7374617274292c683d64282e2e2e
Arg [152] : 662e74686574612e6d6178292c693d662e6c656e6774682a6328312c312e3129
Arg [153] : 2c6a3d3336302b6428312c3336292c6b3d7061727365496e742873656c656374
Arg [154] : 52616e646f6d446973742870616c6c6574446973742c6229292c6c3d67657450
Arg [155] : 616c6c6574286b2c62292c6d3d7b6267436f6c6f723a6765744261636b67726f
Arg [156] : 756e64286c2c64292c6c696e65436f6c6f72733a6c2c6c696e6557696474683a
Arg [157] : 6765744c696e655769647468286b2c63297d3b72657475726e7b616c676f4b65
Arg [158] : 793a652c73657475703a662c746865746153746172743a672c74686574614d61
Arg [159] : 783a682c6c656e6774683a692c73746570733a6a2c70616c6c65744e756d3a6b
Arg [160] : 2c70616c6c65743a6c2c6f7074696f6e733a6d7d7d2c656c656d46726f6d5465
Arg [161] : 6d706c6174653d613d3e7b636f6e737420623d646f63756d656e742e63726561
Arg [162] : 7465456c656d656e74282274656d706c61746522293b72657475726e20622e69
Arg [163] : 6e6e657248544d4c3d612e7472696d28292c622e636f6e74656e742e66697273
Arg [164] : 744368696c647d2c63726561746543616e7661733d28612c622c63293d3e7b72
Arg [165] : 657475726e20656c656d46726f6d54656d706c61746528600a202020203c6361
Arg [166] : 6e7661732069643d22247b617d222077696474683d22247b627d222068656967
Arg [167] : 68743d22247b637d223e60297d2c6b466974436f7665723d302c6b466974416c
Arg [168] : 6c3d312c676574506978656c466163746f723d28612c62293d3e613d3d3d6b46
Arg [169] : 6974436f7665723f622e77696474683e622e6865696768743f622e7769647468
Arg [170] : 2f323a622e6865696768742f323a622e77696474683e622e6865696768743f62
Arg [171] : 2e6865696768742f323a622e77696474682f322c746f526164733d613d3e612a
Arg [172] : 4d6174682e50492f3336302c6472617753706972616c3d28612c622c63293d3e
Arg [173] : 7b636f6e737420643d612e676574436f6e746578742822326422292c653d612e
Arg [174] : 77696474682f322c663d612e6865696768742f322c673d7b783a652c793a667d
Arg [175] : 2c683d676574506978656c466163746f72286b466974436f7665722c61293b64
Arg [176] : 2e6c696e6557696474683d632e6c696e6557696474682f3235302a682c642e6c
Arg [177] : 696e654361703d22726f756e64223b636f6e737420693d613d3e672e782b612a
Arg [178] : 682c6a3d613d3e672e792b612a682c6b3d285b612c625d293d3e5b692861292c
Arg [179] : 6a2862295d3b642e636c6561725265637428302c302c612e77696474682c612e
Arg [180] : 686569676874292c642e7265637428302c302c612e77696474682c612e686569
Arg [181] : 676874292c642e66696c6c5374796c653d632e6267436f6c6f722c642e66696c
Arg [182] : 6c28293b636f6e7374206c3d613d3e7b636f6e737420623d632e6c696e65436f
Arg [183] : 6c6f72732e6c656e6774683b72657475726e20632e6c696e65436f6c6f72735b
Arg [184] : 6125625d7d3b622e666f72456163682828612c63293d3e7b303d3d637c7c2864
Arg [185] : 2e626567696e5061746828292c642e7374726f6b655374796c653d6c2863292c
Arg [186] : 642e6d6f7665546f282e2e2e6b28625b632d315d29292c642e6c696e65546f28
Arg [187] : 2e2e2e6b286129292c642e7374726f6b652829297d297d2c67656e6572617465
Arg [188] : 53706972616c3d613d3e28622c632c64293d3e7b72657475726e204172726179
Arg [189] : 2e66726f6d2841727261792864292e6b65797328292c643d3e7b636f6e737420
Arg [190] : 653d642a746f526164732862292c663d6128652c63292c673d662a4d6174682e
Arg [191] : 636f732865292c683d662a4d6174682e73696e2865293b72657475726e5b672c
Arg [192] : 685d7d297d2c646f53706972616c3d28612c622c63293d3e7b636f6e73747b73
Arg [193] : 6565643a642c616c676f4b65793a652c73657475703a662c7468657461537461
Arg [194] : 72743a672c74686574614d61783a682c6c656e6774683a692c73746570733a6a
Arg [195] : 2c70616c6c65744e756d3a6b2c70616c6c65743a6c2c6f7074696f6e733a6d7d
Arg [196] : 3d68617368546f5472616974732862293b612e72656e6465723d28293d3e7b6c
Arg [197] : 657420623d7061727365466c6f617428632e74297c7c303b636f6e737420643d
Arg [198] : 672b28312b4d6174682e636f73286229292a682f322c653d67656e6572617465
Arg [199] : 53706972616c28662e616c676f2928642c692c6a293b6472617753706972616c
Arg [200] : 28612c652c6d297d2c612e7570646174653d613d3e7b6c657420623d70617273
Arg [201] : 65466c6f617428632e74297c7c303b636f6e737420643d31652d342a2828632e
Arg [202] : 73706565642d35292f35292a613b623d28622b31652d342a612b64292528322a
Arg [203] : 4d6174682e5049292c632e743d622e746f46697865642835297d2c612e6c6f6f
Arg [204] : 703d623d3e7b612e72656e64657228292c612e6c6f6f7049643d726571756573
Arg [205] : 74416e696d6174696f6e4672616d6528612e6c6f6f70293b636f6e737420643d
Arg [206] : 622d28632e74737c7c30293b632e74733d622c30213d632e7370656564262661
Arg [207] : 2e7570646174652864297d2c612e6c6f6f7049643d72657175657374416e696d
Arg [208] : 6174696f6e4672616d6528612e6c6f6f70297d2c736574757043616e7661733d
Arg [209] : 28293d3e7b636f6e737420613d646f63756d656e742e717565727953656c6563
Arg [210] : 746f722822626f647922292c623d63726561746543616e76617328226172742d
Arg [211] : 63616e76617322293b72657475726e20612e617070656e644368696c64286229
Arg [212] : 2c73697a6543616e76617328292c627d2c73697a6543616e7661733d28293d3e
Arg [213] : 7b76617220613d4d6174682e666c6f6f723b636f6e737420623d77696e646f77
Arg [214] : 2e696e6e657257696474682c633d77696e646f772e696e6e6572486569676874
Arg [215] : 2c643d77696e646f772e646576696365506978656c526174696f2c653d646f63
Arg [216] : 756d656e742e717565727953656c6563746f722822236172742d63616e766173
Arg [217] : 22293b652e77696474683d6128622a64292c652e6865696768743d6128632a64
Arg [218] : 292c652e7374796c652e77696474683d622b227078222c652e7374796c652e68
Arg [219] : 65696768743d632b227078227d2c72756e3d28612c62293d3e7b636f6e737420
Arg [220] : 633d736574757043616e76617328293b646f53706972616c28632c612e686173
Arg [221] : 682c62297d3b77696e646f772e6f6e6c6f61643d28293d3e72756e28746f6b65
Arg [222] : 6e446174612c746f6b656e5374617465292c77696e646f772e6f6e726573697a
Arg [223] : 653d73697a6543616e7661733b00000000000000000000000000000000000000
Arg [224] : 0000000000000000000000000000000000000000000000000000000000000017
Arg [225] : 68747470733a2f2f67656e65746963636861696e2e696f000000000000000000


Deployed Bytecode Sourcemap

184:1928:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;910:234:11;;;;;;;;;;-1:-1:-1;910:234:11;;;;;:::i;:::-;;:::i;:::-;;;13767:14:21;;13760:22;13742:41;;13730:2;13715:18;910:234:11;;;;;;;;2408:98:8;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3820:217::-;;;;;;;;;;-1:-1:-1;3820:217:8;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3371:388::-;;;;;;;;;;-1:-1:-1;3371:388:8;;;;;:::i;:::-;;:::i;:::-;;984:1117:6;;;;;;:::i;:::-;;:::i;288:43:4:-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;288:43:4;;;;;1547:111:11;;;;;;;;;;-1:-1:-1;1634:10:11;:17;1547:111;;;13940:25:21;;;13928:2;13913:18;1547:111:11;13794:177:21;1264:99:4;;;;;;;;;;-1:-1:-1;1341:15:4;;1264:99;;4684:300:8;;;;;;;;;;-1:-1:-1;4684:300:8;;;;;:::i;:::-;;:::i;341:18:1:-;;;;;;;;;;;;;:::i;2509:105:6:-;;;;;;;;;;-1:-1:-1;2509:105:6;;;;;:::i;:::-;-1:-1:-1;;;;;2595:12:6;2562:13;2595:12;;;:6;:12;;;;;;;2509:105;1223:253:11;;;;;;;;;;-1:-1:-1;1223:253:11;;;;;:::i;:::-;;:::i;1369:155:4:-;;;;;;;;;;-1:-1:-1;1480:9:4;1369:155;;1098:363:2;;;;;;;;;;-1:-1:-1;1098:363:2;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;254:24:1:-;;;;;;;;;;;;;;;;5050:149:8;;;;;;;;;;-1:-1:-1;5050:149:8;;;;;:::i;:::-;;:::i;3524:361:0:-;;;;;;;;;;-1:-1:-1;3524:361:0;;;;;:::i;:::-;;:::i;284:20:1:-;;;;;;;;;;;;;:::i;1730:230:11:-;;;;;;;;;;-1:-1:-1;1730:230:11;;;;;:::i;:::-;;:::i;1556:32:0:-;;;;;;;;;;;;;;;;2111:235:8;;;;;;;;;;-1:-1:-1;2111:235:8;;;;;:::i;:::-;;:::i;1849:205::-;;;;;;;;;;-1:-1:-1;1849:205:8;;;;;:::i;:::-;;:::i;1700:145:7:-;;;;;;;;;;;;;:::i;310:25:1:-;;;;;;;;;;;;;:::i;1728:381:2:-;;;;;;;;;;-1:-1:-1;1728:381:2;;;;;:::i;:::-;;:::i;3126:268:0:-;;;;;;;;;;-1:-1:-1;3126:268:0;;;;;:::i;:::-;;:::i;3963:852::-;;;;;;;;;;-1:-1:-1;3963:852:0;;;;;:::i;:::-;;:::i;1068:85:7:-;;;;;;;;;;;;;:::i;1318:132:1:-;;;;;;;;;;-1:-1:-1;1318:132:1;;;;;:::i;:::-;;:::i;2570:102:8:-;;;;;;;;;;;;;:::i;4104:290::-;;;;;;;;;;-1:-1:-1;4104:290:8;;;;;:::i;:::-;;:::i;5660:162:0:-;;;;;;;;;;-1:-1:-1;5660:162:0;;;;;:::i;:::-;;:::i;1519:31::-;;;;;;;;;;;;;;;;1200:112:1;;;;;;;;;;-1:-1:-1;1200:112:1;;;;;:::i;:::-;;:::i;5265:282:8:-;;;;;;;;;;-1:-1:-1;5265:282:8;;;;;:::i;:::-;;:::i;5347:221:0:-;;;;;;;;;;-1:-1:-1;5347:221:0;;;;;:::i;:::-;;:::i;1076:118:1:-;;;;;;;;;;-1:-1:-1;1076:118:1;;;;;:::i;:::-;;:::i;1566:219::-;;;;;;;;;;;;;:::i;1456:104::-;;;;;;;;;;-1:-1:-1;1456:104:1;;;;;:::i;:::-;;:::i;1429:24:0:-;;;;;;;;;;;;;;;;1791:204:1;;;;;;;;;;;;;:::i;6736:433:0:-;;;;;;;;;;-1:-1:-1;6736:433:0;;;;;:::i;:::-;;:::i;1994:240:7:-;;;;;;;;;;-1:-1:-1;1994:240:7;;;;;:::i;:::-;;:::i;5888:300:0:-;;;;;;;;;;-1:-1:-1;5888:300:0;;;;;:::i;:::-;;:::i;1459:25::-;;;;;;;;;;;;;;;;1490:23;;;;;;;;;;;;;;;;910:234:11;1012:4;-1:-1:-1;;;;;;1035:50:11;;-1:-1:-1;;;1035:50:11;;:102;;;1101:36;1125:11;1101:23;:36::i;:::-;1028:109;910:234;-1:-1:-1;;910:234:11:o;2408:98:8:-;2462:13;2494:5;2487:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2408:98;:::o;3820:217::-;3896:7;3923:16;3931:7;3923;:16::i;:::-;3915:73;;;;-1:-1:-1;;;3915:73:8;;25928:2:21;3915:73:8;;;25910:21:21;25967:2;25947:18;;;25940:30;26006:34;25986:18;;;25979:62;-1:-1:-1;;;26057:18:21;;;26050:42;26109:19;;3915:73:8;;;;;;;;;-1:-1:-1;4006:24:8;;;;:15;:24;;;;;;-1:-1:-1;;;;;4006:24:8;;3820:217::o;3371:388::-;3451:13;3467:23;3482:7;3467:14;:23::i;:::-;3451:39;;3514:5;-1:-1:-1;;;;;3508:11:8;:2;-1:-1:-1;;;;;3508:11:8;;;3500:57;;;;-1:-1:-1;;;3500:57:8;;27514:2:21;3500:57:8;;;27496:21:21;27553:2;27533:18;;;27526:30;27592:34;27572:18;;;27565:62;-1:-1:-1;;;27643:18:21;;;27636:31;27684:19;;3500:57:8;27312:397:21;3500:57:8;3592:5;-1:-1:-1;;;;;3576:21:8;:12;:10;:12::i;:::-;-1:-1:-1;;;;;3576:21:8;;:62;;;;3601:37;3618:5;3625:12;:10;:12::i;3601:37::-;3568:152;;;;-1:-1:-1;;;3568:152:8;;23234:2:21;3568:152:8;;;23216:21:21;23273:2;23253:18;;;23246:30;23312:34;23292:18;;;23285:62;-1:-1:-1;;;23363:18:21;;;23356:54;23427:19;;3568:152:8;23032:420:21;3568:152:8;3731:21;3740:2;3744:7;3731:8;:21::i;:::-;3441:318;3371:388;;:::o;984:1117:6:-;1235:148;;;1179:12;1235:148;;;;;-1:-1:-1;;;;;1272:19:6;;1203:29;1272:19;;;:6;:19;;;;;;;;;1235:148;;;;;;;;;;;1415:45;1279:11;1235:148;1443:4;1449;1455;1415:6;:45::i;:::-;1394:125;;;;-1:-1:-1;;;1394:125:6;;27112:2:21;1394:125:6;;;27094:21:21;27151:2;27131:18;;;27124:30;27190:34;27170:18;;;27163:62;-1:-1:-1;;;27241:18:21;;;27234:31;27282:19;;1394:125:6;26910:397:21;1394:125:6;-1:-1:-1;;;;;1605:19:6;;;;;;:6;:19;;;;;;:26;;1629:1;1605:23;:26::i;:::-;-1:-1:-1;;;;;1583:19:6;;;;;;:6;:19;;;;;;;:48;;;;1647:122;;;;;1590:11;;1717:10;;1742:17;;1647:122;:::i;:::-;;;;;;;;1877:12;1891:23;1926:4;-1:-1:-1;;;;;1918:18:6;1967:17;1986:11;1950:48;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1950:48:6;;;;;;;;;;1918:90;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1876:132;;;;2026:7;2018:48;;;;-1:-1:-1;;;2018:48:6;;19506:2:21;2018:48:6;;;19488:21:21;19545:2;19525:18;;;19518:30;-1:-1:-1;;;19564:18:21;;;19557:58;19632:18;;2018:48:6;19304:352:21;2018:48:6;2084:10;984:1117;-1:-1:-1;;;;;;;;984:1117:6:o;4684:300:8:-;4843:41;4862:12;:10;:12::i;:::-;4876:7;4843:18;:41::i;:::-;4835:103;;;;-1:-1:-1;;;4835:103:8;;;;;;;:::i;:::-;4949:28;4959:4;4965:2;4969:7;4949:9;:28::i;341:18:1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1223:253:11:-;1320:7;1355:23;1372:5;1355:16;:23::i;:::-;1347:5;:31;1339:87;;;;-1:-1:-1;;;1339:87:11;;17156:2:21;1339:87:11;;;17138:21:21;17195:2;17175:18;;;17168:30;17234:34;17214:18;;;17207:62;-1:-1:-1;;;17285:18:21;;;17278:41;17336:19;;1339:87:11;16954:407:21;1339:87:11;-1:-1:-1;;;;;;1443:19:11;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1223:253::o;1098:363:2:-;1205:15;1222:13;1179:7;1652:16:0;1660:7;1652;:16::i;:::-;1644:42;;;;-1:-1:-1;;;1644:42:0;;;;;;;:::i;:::-;1261:15:2::1;::::0;;;:6:::1;:15;::::0;;;;1255:31;;::::1;::::0;::::1;:::i;:::-;:36:::0;1251:204:::1;::::0;-1:-1:-1;1251:204:2::1;;1307:12;;;;;;;;;;;;;-1:-1:-1::0;;;1307:12:2::1;;::::0;::::1;;1342:1;1333:10;;1251:204;;;1383:15;::::0;;;:6:::1;:15;::::0;;;;1374:26;;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;1423:15:2::1;::::0;;;:6:::1;:15;::::0;;;;:21:::1;;::::0;1374:26;;-1:-1:-1;1423:21:2;;-1:-1:-1;;;1251:204:2::1;1098:363:::0;;;;:::o;5050:149:8:-;5153:39;5170:4;5176:2;5180:7;5153:39;;;;;;;;;;;;:16;:39::i;3524:361:0:-;1291:12:7;:10;:12::i;:::-;-1:-1:-1;;;;;1280:23:7;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1280:23:7;;1272:68;;;;-1:-1:-1;;;1272:68:7;;;;;;;:::i;:::-;3653:8:0::1;;3644:5;3628:13;1634:10:11::0;:17;;1547:111;3628:13:0::1;:21;;;;:::i;:::-;:33;;3620:65;;;;-1:-1:-1::0;;;3620:65:0::1;;;;;;;:::i;:::-;3728:10;;3719:5;3703:13;;:21;;;;:::i;:::-;:35;;3695:69;;;;-1:-1:-1::0;;;3695:69:0::1;;;;;;;:::i;:::-;3791:5;3774:13;;:22;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;3811:9:0::1;::::0;-1:-1:-1;3806:73:0::1;3830:5;3826:1;:9;3806:73;;;3856:12;3864:3;3856:7;:12::i;:::-;3837:3;::::0;::::1;:::i;:::-;;;3806:73;;284:20:1::0;;;;;;;:::i;1730:230:11:-;1805:7;1840:30;1634:10;:17;;1547:111;1840:30;1832:5;:38;1824:95;;;;-1:-1:-1;;;1824:95:11;;28334:2:21;1824:95:11;;;28316:21:21;28373:2;28353:18;;;28346:30;28412:34;28392:18;;;28385:62;-1:-1:-1;;;28463:18:21;;;28456:42;28515:19;;1824:95:11;28132:408:21;1824:95:11;1936:10;1947:5;1936:17;;;;;;;;:::i;:::-;;;;;;;;;1929:24;;1730:230;;;:::o;2111:235:8:-;2183:7;2218:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2218:16:8;2252:19;2244:73;;;;-1:-1:-1;;;2244:73:8;;24412:2:21;2244:73:8;;;24394:21:21;24451:2;24431:18;;;24424:30;24490:34;24470:18;;;24463:62;-1:-1:-1;;;24541:18:21;;;24534:39;24590:19;;2244:73:8;24210:405:21;1849:205:8;1921:7;-1:-1:-1;;;;;1948:19:8;;1940:74;;;;-1:-1:-1;;;1940:74:8;;24001:2:21;1940:74:8;;;23983:21:21;24040:2;24020:18;;;24013:30;24079:34;24059:18;;;24052:62;-1:-1:-1;;;24130:18:21;;;24123:40;24180:19;;1940:74:8;23799:406:21;1940:74:8;-1:-1:-1;;;;;;2031:16:8;;;;;:9;:16;;;;;;;1849:205::o;1700:145:7:-;1291:12;:10;:12::i;:::-;-1:-1:-1;;;;;1280:23:7;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1280:23:7;;1272:68;;;;-1:-1:-1;;;1272:68:7;;;;;;;:::i;:::-;1790:6:::1;::::0;1769:40:::1;::::0;1806:1:::1;::::0;-1:-1:-1;;;;;1790:6:7::1;::::0;1769:40:::1;::::0;1806:1;;1769:40:::1;1819:6;:19:::0;;-1:-1:-1;;;;;;1819:19:7::1;::::0;;1700:145::o;310:25:1:-;;;;;;;:::i;1728:381:2:-;1837:12;:10;:12::i;:::-;1851:7;1788:37:0;1807:8;1817:7;1788:18;:37::i;:::-;1780:46;;;;;;1905:2:2::1;1896:5;:11;;1874:89;;;::::0;-1:-1:-1;;;1874:89:2;;18333:2:21;1874:89:2::1;::::0;::::1;18315:21:21::0;18372:2;18352:18;;;18345:30;18411:34;18391:18;;;18384:62;-1:-1:-1;;;18462:18:21;;;18455:49;18521:19;;1874:89:2::1;18131:415:21::0;1874:89:2::1;1973:15;::::0;;;:6:::1;:15;::::0;;;;;;;:25;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;2008:15:2::1;::::0;;;:6:::1;:15;::::0;;;;;;:21:::1;::::0;::::1;:29:::0;;;2053:49;;2065:10:::1;::::0;2053:49:::1;::::0;::::1;::::0;2015:7;;2053:49:::1;:::i;:::-;;;;;;;;1728:381:::0;;;;;:::o;3126:268:0:-;1291:12:7;:10;:12::i;:::-;-1:-1:-1;;;;;1280:23:7;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1280:23:7;;1272:68;;;;-1:-1:-1;;;1272:68:7;;;;;;;:::i;:::-;3233:8:0::1;::::0;1634:10:11;:17;3212::0::1;::::0;3228:1:::1;3212:17;:::i;:::-;:29;;3204:61;;;;-1:-1:-1::0;;;3204:61:0::1;;;;;;;:::i;:::-;3304:10;::::0;3283:13:::1;::::0;:17:::1;::::0;3299:1:::1;3283:17;:::i;:::-;:31;;3275:65;;;;-1:-1:-1::0;;;3275:65:0::1;;;;;;;:::i;:::-;3352:13;;3350:15;;;;;:::i;:::-;::::0;;;-1:-1:-1;3375:12:0::1;3383:3:::0;3375:7:::1;:12::i;:::-;3126:268:::0;:::o;3963:852::-;4120:11;4132:5;4120:18;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;4119:19;4111:45;;;;-1:-1:-1;;;4111:45:0;;23659:2:21;4111:45:0;;;23641:21:21;23698:2;23678:18;;;23671:30;-1:-1:-1;;;23717:18:21;;;23710:43;23770:18;;4111:45:0;23457:337:21;4111:45:0;4190:8;;1634:10:11;:17;4174:24:0;4166:54;;;;-1:-1:-1;;;4166:54:0;;18753:2:21;4166:54:0;;;18735:21:21;18792:2;18772:18;;;18765:30;-1:-1:-1;;;18811:18:21;;;18804:47;18868:18;;4166:54:0;18551:341:21;4166:54:0;4263:8;;4254:5;4238:13;1634:10:11;:17;;1547:111;4238:13:0;:21;;;;:::i;:::-;:33;;4230:65;;;;-1:-1:-1;;;4230:65:0;;;;;;;:::i;:::-;4337:9;;4328:5;4313:12;;:20;;;;:::i;:::-;:33;;4305:66;;;;-1:-1:-1;;;4305:66:0;;22885:2:21;4305:66:0;;;22867:21:21;22924:2;22904:18;;;22897:30;-1:-1:-1;;;22943:18:21;;;22936:50;23003:18;;4305:66:0;22683:344:21;4305:66:0;4396:10;4389:18;;;;:6;:18;;;;;;4419:10;;4389:26;;4410:5;;4389:26;:::i;:::-;:40;;4381:70;;;;-1:-1:-1;;;4381:70:0;;17568:2:21;4381:70:0;;;17550:21:21;17607:2;17587:18;;;17580:30;-1:-1:-1;;;17626:18:21;;;17619:47;17683:18;;4381:70:0;17366:341:21;4381:70:0;4469:34;4484:7;4493:9;4469:14;:34::i;:::-;4461:61;;;;-1:-1:-1;;;4461:61:0;;20561:2:21;4461:61:0;;;20543:21:21;20600:2;20580:18;;;20573:30;-1:-1:-1;;;20619:18:21;;;20612:44;20673:18;;4461:61:0;20359:338:21;4461:61:0;4540:59;4553:7;4562:10;4574;4586:5;4593;4540:12;:59::i;:::-;4532:84;;;;-1:-1:-1;;;4532:84:0;;28747:2:21;4532:84:0;;;28729:21:21;28786:2;28766:18;;;28759:30;-1:-1:-1;;;28805:18:21;;;28798:42;28857:18;;4532:84:0;28545:336:21;4532:84:0;4642:5;4626:12;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;4664:10:0;4657:18;;;;:6;:18;;;;;:27;;4679:5;;4657:18;:27;;4679:5;;4657:27;:::i;:::-;;;;;;;;4715:4;4694:11;4706:5;4694:18;;;;;;:::i;:::-;;;;;;;;;;;;;;:25;;;;;-1:-1:-1;;4694:25:0;;;;;;;;;:18;4729:80;4753:5;4749:1;:9;4729:80;;;4779:19;4787:10;4779:7;:19::i;:::-;4760:3;;;:::i;:::-;;;4729:80;;;;3963:852;;;;;:::o;1068:85:7:-;1140:6;;-1:-1:-1;;;;;1140:6:7;;1068:85::o;1318:132:1:-;1291:12:7;:10;:12::i;:::-;-1:-1:-1;;;;;1280:23:7;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1280:23:7;;1272:68;;;;-1:-1:-1;;;1272:68:7;;;;;;;:::i;:::-;1417:26:1;;::::1;::::0;:11:::1;::::0;:26:::1;::::0;::::1;::::0;::::1;:::i;:::-;;1318:132:::0;:::o;2570:102:8:-;2626:13;2658:7;2651:14;;;;;:::i;4104:290::-;4218:12;:10;:12::i;:::-;-1:-1:-1;;;;;4206:24:8;:8;-1:-1:-1;;;;;4206:24:8;;;4198:62;;;;-1:-1:-1;;;4198:62:8;;21309:2:21;4198:62:8;;;21291:21:21;21348:2;21328:18;;;21321:30;-1:-1:-1;;;21367:18:21;;;21360:55;21432:18;;4198:62:8;21107:349:21;4198:62:8;4316:8;4271:18;:32;4290:12;:10;:12::i;:::-;-1:-1:-1;;;;;4271:32:8;;;;;;;;;;;;;;;;;-1:-1:-1;4271:32:8;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;4271:53:8;;;;;;;;;;;4354:12;:10;:12::i;:::-;-1:-1:-1;;;;;4339:48:8;;4378:8;4339:48;;;;13767:14:21;13760:22;13742:41;;13730:2;13715:18;;13602:187;4339:48:8;;;;;;;;4104:290;;:::o;5660:162:0:-;5771:7;5745;1652:16;1660:7;1652;:16::i;:::-;1644:42;;;;-1:-1:-1;;;1644:42:0;;;;;;;:::i;:::-;5801:14:::1;::::0;;;:5:::1;:14;::::0;;;;;;-1:-1:-1;1696:1:0::1;5660:162:::0;;;;:::o;1200:112:1:-;1291:12:7;:10;:12::i;:::-;-1:-1:-1;;;;;1280:23:7;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1280:23:7;;1272:68;;;;-1:-1:-1;;;1272:68:7;;;;;;;:::i;:::-;1289:16:1;;::::1;::::0;:6:::1;::::0;:16:::1;::::0;::::1;::::0;::::1;:::i;5265:282:8:-:0;5396:41;5415:12;:10;:12::i;:::-;5429:7;5396:18;:41::i;:::-;5388:103;;;;-1:-1:-1;;;5388:103:8;;;;;;;:::i;:::-;5501:39;5515:4;5521:2;5525:7;5534:5;5501:13;:39::i;:::-;5265:282;;;;:::o;5347:221:0:-;5444:13;5504:14;:12;:14::i;:::-;5525:25;5542:7;5525:16;:25::i;:::-;5487:73;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5473:88;;5347:221;;;:::o;1076:118:1:-;1291:12:7;:10;:12::i;:::-;-1:-1:-1;;;;;1280:23:7;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1280:23:7;;1272:68;;;;-1:-1:-1;;;1272:68:7;;;;;;;:::i;:::-;1165:9:1::1;:22:::0;1076:118::o;1566:219::-;1652:13;1712:8;1739:27;1756:9;;1739:16;:27::i;:::-;1695:82;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1681:97;;1566:219;:::o;1456:104::-;1291:12:7;:10;:12::i;:::-;-1:-1:-1;;;;;1280:23:7;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1280:23:7;;1272:68;;;;-1:-1:-1;;;1272:68:7;;;;;;;:::i;:::-;1541:12:1;;::::1;::::0;:4:::1;::::0;:12:::1;::::0;::::1;::::0;::::1;:::i;1791:204::-:0;1859:13;1919:8;1946:27;1963:9;;1946:16;:27::i;:::-;1902:85;;;;;;;;;:::i;6736:433:0:-;6983:21;;7027:28;;-1:-1:-1;;;7027:28:0;;6857:4;;-1:-1:-1;;;;;6983:21:0;;;;7019:49;;;;6983:21;;7027;;:28;;7049:5;;7027:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;7019:49:0;;7015:91;;;7091:4;7084:11;;;;;7015:91;-1:-1:-1;;;;;4580:25:8;;;4557:4;4580:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;7123:39:0;7116:46;6736:433;-1:-1:-1;;;;6736:433:0:o;1994:240:7:-;1291:12;:10;:12::i;:::-;-1:-1:-1;;;;;1280:23:7;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1280:23:7;;1272:68;;;;-1:-1:-1;;;1272:68:7;;;;;;;:::i;:::-;-1:-1:-1;;;;;2082:22:7;::::1;2074:73;;;::::0;-1:-1:-1;;;2074:73:7;;19099:2:21;2074:73:7::1;::::0;::::1;19081:21:21::0;19138:2;19118:18;;;19111:30;19177:34;19157:18;;;19150:62;-1:-1:-1;;;19228:18:21;;;19221:36;19274:19;;2074:73:7::1;18897:402:21::0;2074:73:7::1;2183:6;::::0;2162:38:::1;::::0;-1:-1:-1;;;;;2162:38:7;;::::1;::::0;2183:6:::1;::::0;2162:38:::1;::::0;2183:6:::1;::::0;2162:38:::1;2210:6;:17:::0;;-1:-1:-1;;;;;;2210:17:7::1;-1:-1:-1::0;;;;;2210:17:7;;;::::1;::::0;;;::::1;::::0;;1994:240::o;5888:300:0:-;1291:12:7;:10;:12::i;:::-;-1:-1:-1;;;;;1280:23:7;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1280:23:7;;1272:68;;;;-1:-1:-1;;;1272:68:7;;;;;;;:::i;:::-;5998:1:0::1;5989:6;:10;5981:35;;;::::0;-1:-1:-1;;;5981:35:0;;19863:2:21;5981:35:0::1;::::0;::::1;19845:21:21::0;19902:2;19882:18;;;19875:30;-1:-1:-1;;;19921:18:21;;;19914:42;19973:18;;5981:35:0::1;19661:336:21::0;5981:35:0::1;6044:21;6034:6;:31;;6026:66;;;::::0;-1:-1:-1;;;6026:66:0;;16097:2:21;6026:66:0::1;::::0;::::1;16079:21:21::0;16136:2;16116:18;;;16109:30;-1:-1:-1;;;16155:18:21;;;16148:52;16217:18;;6026:66:0::1;15895:346:21::0;6026:66:0::1;-1:-1:-1::0;;;;;6110:16:0;::::1;6102:41;;;::::0;-1:-1:-1;;;6102:41:0;;29088:2:21;6102:41:0::1;::::0;::::1;29070:21:21::0;29127:2;29107:18;;;29100:30;-1:-1:-1;;;29146:18:21;;;29139:42;29198:18;;6102:41:0::1;28886:336:21::0;6102:41:0::1;6153:28;::::0;-1:-1:-1;;;;;6153:20:0;::::1;::::0;:28;::::1;;;::::0;6174:6;;6153:28:::1;::::0;;;6174:6;6153:20;:28;::::1;;;;;;;;;;;;;::::0;::::1;;;;95:631:3::0;163:22;205:10;227:4;205:27;201:496;;;248:18;269:8;;248:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;307:8:3;514:17;508:24;-1:-1:-1;;;;;483:131:3;;-1:-1:-1;201:496:3;;-1:-1:-1;201:496:3;;-1:-1:-1;675:10:3;201:496;95:631;:::o;1502:288:8:-;1604:4;-1:-1:-1;;;;;;1627:40:8;;-1:-1:-1;;;1627:40:8;;:104;;-1:-1:-1;;;;;;;1683:48:8;;-1:-1:-1;;;1683:48:8;1627:104;:156;;;-1:-1:-1;;;;;;;;;;871:40:18;;;1747:36:8;763:155:18;6981:125:8;7046:4;7069:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7069:16:8;:30;;;6981:125::o;7316:154:0:-;7402:14;7439:24;:22;:24::i;:::-;7432:31;;7316:154;:::o;10738:171:8:-;10812:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;10812:29:8;-1:-1:-1;;;;;10812:29:8;;;;;;;;:24;;10865:23;10812:24;10865:14;:23::i;:::-;-1:-1:-1;;;;;10856:46:8;;;;;;;;;;;10738:171;;:::o;2620:470:6:-;2792:4;-1:-1:-1;;;;;2816:20:6;;2808:70;;;;-1:-1:-1;;;2808:70:6;;22479:2:21;2808:70:6;;;22461:21:21;22518:2;22498:18;;;22491:30;22557:34;22537:18;;;22530:62;-1:-1:-1;;;22608:18:21;;;22601:35;22653:19;;2808:70:6;22277:401:21;2808:70:6;2929:154;2956:47;2975:27;2995:6;2975:19;:27::i;:::-;2956:18;:47::i;:::-;3021:4;3043;3065;2929:154;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2907:176:6;:6;-1:-1:-1;;;;;2907:176:6;;2888:195;;2620:470;;;;;;;:::o;2672:96:20:-;2730:7;2756:5;2760:1;2756;:5;:::i;:::-;2749:12;2672:96;-1:-1:-1;;;2672:96:20:o;7264:344:8:-;7357:4;7381:16;7389:7;7381;:16::i;:::-;7373:73;;;;-1:-1:-1;;;7373:73:8;;22066:2:21;7373:73:8;;;22048:21:21;22105:2;22085:18;;;22078:30;22144:34;22124:18;;;22117:62;-1:-1:-1;;;22195:18:21;;;22188:42;22247:19;;7373:73:8;21864:408:21;7373:73:8;7456:13;7472:23;7487:7;7472:14;:23::i;:::-;7456:39;;7524:5;-1:-1:-1;;;;;7513:16:8;:7;-1:-1:-1;;;;;7513:16:8;;:51;;;;7557:7;-1:-1:-1;;;;;7533:31:8;:20;7545:7;7533:11;:20::i;:::-;-1:-1:-1;;;;;7533:31:8;;7513:51;:87;;;;7568:32;7585:5;7592:7;7568:16;:32::i;10097:530::-;10221:4;-1:-1:-1;;;;;10194:31:8;:23;10209:7;10194:14;:23::i;:::-;-1:-1:-1;;;;;10194:31:8;;10186:85;;;;-1:-1:-1;;;10186:85:8;;26702:2:21;10186:85:8;;;26684:21:21;26741:2;26721:18;;;26714:30;26780:34;26760:18;;;26753:62;-1:-1:-1;;;26831:18:21;;;26824:39;26880:19;;10186:85:8;26500:405:21;10186:85:8;-1:-1:-1;;;;;10289:16:8;;10281:65;;;;-1:-1:-1;;;10281:65:8;;20904:2:21;10281:65:8;;;20886:21:21;20943:2;20923:18;;;20916:30;20982:34;20962:18;;;20955:62;-1:-1:-1;;;21033:18:21;;;21026:34;21077:19;;10281:65:8;20702:400:21;10281:65:8;10357:39;10378:4;10384:2;10388:7;10357:20;:39::i;:::-;10458:29;10475:1;10479:7;10458:8;:29::i;:::-;-1:-1:-1;;;;;10498:15:8;;;;;;:9;:15;;;;;:20;;10517:1;;10498:15;:20;;10517:1;;10498:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10528:13:8;;;;;;:9;:13;;;;;:18;;10545:1;;10528:13;:18;;10545:1;;10528:18;:::i;:::-;;;;-1:-1:-1;;10556:16:8;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10556:21:8;-1:-1:-1;;;;;10556:21:8;;;;;;;;;10593:27;;10556:16;;10593:27;;;;;;;10097:530;;;:::o;4953:200:0:-;5014:18;5035:13;1634:10:11;:17;;1547:111;5035:13:0;:17;;5051:1;5035:17;:::i;:::-;5014:38;;5062:26;5072:3;5077:10;5062:9;:26::i;:::-;5118:28;5130:3;5135:10;5118:11;:28::i;:::-;5098:17;;;;:5;:17;;;;;;:48;-1:-1:-1;4953:200:0:o;2823:181::-;2990:7;;2933:4;;-1:-1:-1;;;;;2990:7:0;2960:26;:7;2976:9;2960:15;:26::i;:::-;-1:-1:-1;;;;;2960:37:0;;;2823:181;-1:-1:-1;;;2823:181:0:o;2414:341::-;2570:4;2741:7;2701:6;2709:10;2721:5;2728;2684:50;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;2684:50:0;;;;;;;;;;2674:61;;2684:50;2674:61;;;;-1:-1:-1;;;2609:127:0;;;11912:80:21;;;;12008:12;;;12001:28;12045:12;;2609:127:0;;;;;;;;;;;;2599:138;;;;;;:149;2592:156;;2414:341;;;;;;;:::o;6409:269:8:-;6522:28;6532:4;6538:2;6542:7;6522:9;:28::i;:::-;6568:48;6591:4;6597:2;6601:7;6610:5;6568:22;:48::i;:::-;6560:111;;;;-1:-1:-1;;;6560:111:8;;;;;;;:::i;271:703:16:-;327:13;544:10;540:51;;-1:-1:-1;;570:10:16;;;;;;;;;;;;-1:-1:-1;;;570:10:16;;;;;271:703::o;540:51::-;615:5;600:12;654:75;661:9;;654:75;;686:8;;;;:::i;:::-;;-1:-1:-1;708:10:16;;-1:-1:-1;716:2:16;708:10;;:::i;:::-;;;654:75;;;738:19;770:6;-1:-1:-1;;;;;760:17:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;760:17:16;;738:39;;787:150;794:10;;787:150;;820:11;830:1;820:11;;:::i;:::-;;-1:-1:-1;888:10:16;896:2;888:5;:10;:::i;:::-;875:24;;:2;:24;:::i;:::-;862:39;;845:6;852;845:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;845:56:16;;;;;;;;-1:-1:-1;915:11:16;924:2;915:11;;:::i;:::-;;;787:150;;2107:396:6;2214:7;342:98;;;;;;;;;;;;;;;;;323:123;;;;;;;2362:12;;2396:11;;;;2439:24;;;;;2429:35;;;;;;2283:199;;;;;14207:25:21;;;14263:2;14248:18;;14241:34;;;;-1:-1:-1;;;;;14311:32:21;14306:2;14291:18;;14284:60;14375:2;14360:18;;14353:34;14194:3;14179:19;;13976:417;2283:199:6;;;;;;;;;;;;;2256:240;;;;;;2237:259;;2107:396;;;:::o;1884:249:4:-;1980:7;2078:20;1341:15;;;1264:99;2078:20;2049:63;;-1:-1:-1;;;2049:63:4;;;12326:27:21;12369:11;;;12362:27;;;;12405:12;;;12398:28;;;12442:12;;2049:63:4;12068:392:21;2556:542:11;-1:-1:-1;;;;;2725:18:11;;2721:183;;2759:40;2791:7;3907:10;:17;;3880:24;;;;:15;:24;;;;;:44;;;3934:24;;;;;;;;;;;;3804:161;2759:40;2721:183;;;2828:2;-1:-1:-1;;;;;2820:10:11;:4;-1:-1:-1;;;;;2820:10:11;;2816:88;;2846:47;2879:4;2885:7;2846:32;:47::i;:::-;-1:-1:-1;;;;;2917:16:11;;2913:179;;2949:45;2986:7;2949:36;:45::i;2913:179::-;3021:4;-1:-1:-1;;;;;3015:10:11;:2;-1:-1:-1;;;;;3015:10:11;;3011:81;;3041:40;3069:2;3073:7;3041:27;:40::i;7938:108:8:-;8013:26;8023:2;8027:7;8013:26;;;;;;;;;;;;:9;:26::i;6254:347:0:-;6339:7;;6438:16;6453:1;6438:12;:16;:::i;:::-;6497:5;;6396:149;;;6428:27;;6396:149;;;8252:19:21;-1:-1:-1;;;;;;6471:10:0;8302:2:21;8347:15;;;8343:24;;8329:12;;;8322:46;;;;8384:12;;;8377:28;;;;8421:12;;;8414:28;;;8477:15;;;8473:24;8458:13;;;8451:47;8514:13;;6396:149:0;;;;;;-1:-1:-1;;6396:149:0;;;;;;6375:171;;6396:149;6375:171;;;;6554:5;:21;;;6375:171;6254:347;-1:-1:-1;;;;6254:347:0:o;1064:1459:17:-;1142:7;1217:9;1236;1255:7;1470:9;:16;1490:2;1470:22;1466:1011;;;-1:-1:-1;;;1752:4:17;1737:20;;1731:27;1801:4;1786:20;;1780:27;1858:4;1843:20;;1837:27;1834:1;1829:36;1466:1011;;;1899:9;:16;1919:2;1899:22;1895:582;;;-1:-1:-1;;;2186:4:17;2171:20;;2165:27;2235:4;2220:20;;2214:27;;-1:-1:-1;;;;;2263:75:17;;;2368:3;2364:12;2378:2;2360:21;1895:582;;;2425:41;;-1:-1:-1;;;2425:41:17;;16796:2:21;2425:41:17;;;16778:21:21;16835:2;16815:18;;;16808:30;16874:33;16854:18;;;16847:61;16925:18;;2425:41:17;16594:355:21;1895:582:17;2494:22;2502:4;2508:1;2511;2514;2494:7;:22::i;:::-;2487:29;1064:1459;-1:-1:-1;;;;;;1064:1459:17:o;11462:824:8:-;11582:4;-1:-1:-1;;;;;11606:13:8;;1078:20:14;1116:8;11602:678:8;;11657:2;-1:-1:-1;;;;;11641:36:8;;11678:12;:10;:12::i;:::-;11692:4;11698:7;11707:5;11641:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11641:72:8;;;;;;;;-1:-1:-1;;11641:72:8;;;;;;;;;;;;:::i;:::-;;;11637:591;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11884:13:8;;11880:334;;11926:60;;-1:-1:-1;;;11926:60:8;;;;;;;:::i;11880:334::-;12166:6;12160:13;12151:6;12147:2;12143:15;12136:38;11637:591;-1:-1:-1;;;;;;11763:55:8;-1:-1:-1;;;11763:55:8;;-1:-1:-1;11756:62:8;;11602:678;-1:-1:-1;12265:4:8;11462:824;;;;;;:::o;4582:970:11:-;4844:22;4894:1;4869:22;4886:4;4869:16;:22::i;:::-;:26;;;;:::i;:::-;4905:18;4926:26;;;:17;:26;;;;;;4844:51;;-1:-1:-1;5056:28:11;;;5052:323;;-1:-1:-1;;;;;5122:18:11;;5100:19;5122:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5171:30;;;;;;:44;;;5287:30;;:17;:30;;;;;:43;;;5052:323;-1:-1:-1;5468:26:11;;;;:17;:26;;;;;;;;5461:33;;;-1:-1:-1;;;;;5511:18:11;;;;;:12;:18;;;;;:34;;;;;;;5504:41;4582:970::o;5840:1061::-;6114:10;:17;6089:22;;6114:21;;6134:1;;6114:21;:::i;:::-;6145:18;6166:24;;;:15;:24;;;;;;6534:10;:26;;6089:46;;-1:-1:-1;6166:24:11;;6089:46;;6534:26;;;;;;:::i;:::-;;;;;;;;;6512:48;;6596:11;6571:10;6582;6571:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;6675:28;;;:15;:28;;;;;;;:41;;;6844:24;;;;;6837:31;6878:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;5911:990;;;5840:1061;:::o;3392:217::-;3476:14;3493:20;3510:2;3493:16;:20::i;:::-;-1:-1:-1;;;;;3523:16:11;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3567:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3392:217:11:o;8267:247:8:-;8362:18;8368:2;8372:7;8362:5;:18::i;:::-;8398:54;8429:1;8433:2;8437:7;8446:5;8398:22;:54::i;:::-;8390:117;;;;-1:-1:-1;;;8390:117:8;;;;;;;:::i;2656:1414:17:-;2741:7;-1:-1:-1;;;;;3642:80:17;;;3634:127;;;;-1:-1:-1;;;3634:127:17;;21663:2:21;3634:127:17;;;21645:21:21;21702:2;21682:18;;;21675:30;21741:34;21721:18;;;21714:62;-1:-1:-1;;;21792:18:21;;;21785:32;21834:19;;3634:127:17;21461:398:21;3634:127:17;3779:1;:7;;3784:2;3779:7;:18;;;;3790:1;:7;;3795:2;3790:7;3779:18;3771:65;;;;-1:-1:-1;;;3771:65:17;;24822:2:21;3771:65:17;;;24804:21:21;24861:2;24841:18;;;24834:30;24900:34;24880:18;;;24873:62;-1:-1:-1;;;24951:18:21;;;24944:32;24993:19;;3771:65:17;24620:398:21;3771:65:17;3931:14;3948:24;3958:4;3964:1;3967;3970;3948:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3948:24:17;;-1:-1:-1;;3948:24:17;;;-1:-1:-1;;;;;;;3990:20:17;;3982:57;;;;-1:-1:-1;;;3982:57:17;;15744:2:21;3982:57:17;;;15726:21:21;15783:2;15763:18;;;15756:30;-1:-1:-1;;;15802:18:21;;;15795:54;15866:18;;3982:57:17;15542:348:21;3982:57:17;4057:6;2656:1414;-1:-1:-1;;;;;2656:1414:17:o;8836:372:8:-;-1:-1:-1;;;;;8915:16:8;;8907:61;;;;-1:-1:-1;;;8907:61:8;;25225:2:21;8907:61:8;;;25207:21:21;;;25244:18;;;25237:30;25303:34;25283:18;;;25276:62;25355:18;;8907:61:8;25023:356:21;8907:61:8;8987:16;8995:7;8987;:16::i;:::-;8986:17;8978:58;;;;-1:-1:-1;;;8978:58:8;;20204:2:21;8978:58:8;;;20186:21:21;20243:2;20223:18;;;20216:30;-1:-1:-1;;;20262:18:21;;;20255:58;20330:18;;8978:58:8;20002:352:21;8978:58:8;9047:45;9076:1;9080:2;9084:7;9047:20;:45::i;:::-;-1:-1:-1;;;;;9103:13:8;;;;;;:9;:13;;;;;:18;;9120:1;;9103:13;:18;;9120:1;;9103:18;:::i;:::-;;;;-1:-1:-1;;9131:16:8;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9131:21:8;-1:-1:-1;;;;;9131:21:8;;;;;;;;9168:33;;9131:16;;;9168:33;;9131:16;;9168:33;8836:372;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:718:21;56:5;109:3;102:4;94:6;90:17;86:27;76:55;;127:1;124;117:12;76:55;163:6;150:20;-1:-1:-1;;;;;226:2:21;222;219:10;216:36;;;232:18;;:::i;:::-;307:2;301:9;275:2;361:13;;-1:-1:-1;;357:22:21;;;381:2;353:31;349:40;337:53;;;405:18;;;425:22;;;402:46;399:72;;;451:18;;:::i;:::-;491:10;487:2;480:22;526:2;518:6;511:18;572:3;565:4;560:2;552:6;548:15;544:26;541:35;538:55;;;589:1;586;579:12;538:55;653:2;646:4;638:6;634:17;627:4;619:6;615:17;602:54;700:1;693:4;688:2;680:6;676:15;672:26;665:37;720:6;711:15;;;;;;14:718;;;;:::o;737:247::-;796:6;849:2;837:9;828:7;824:23;820:32;817:52;;;865:1;862;855:12;817:52;904:9;891:23;923:31;948:5;923:31;:::i;989:388::-;1057:6;1065;1118:2;1106:9;1097:7;1093:23;1089:32;1086:52;;;1134:1;1131;1124:12;1086:52;1173:9;1160:23;1192:31;1217:5;1192:31;:::i;:::-;1242:5;-1:-1:-1;1299:2:21;1284:18;;1271:32;1312:33;1271:32;1312:33;:::i;:::-;1364:7;1354:17;;;989:388;;;;;:::o;1382:456::-;1459:6;1467;1475;1528:2;1516:9;1507:7;1503:23;1499:32;1496:52;;;1544:1;1541;1534:12;1496:52;1583:9;1570:23;1602:31;1627:5;1602:31;:::i;:::-;1652:5;-1:-1:-1;1709:2:21;1694:18;;1681:32;1722:33;1681:32;1722:33;:::i;:::-;1382:456;;1774:7;;-1:-1:-1;;;1828:2:21;1813:18;;;;1800:32;;1382:456::o;1843:665::-;1938:6;1946;1954;1962;2015:3;2003:9;1994:7;1990:23;1986:33;1983:53;;;2032:1;2029;2022:12;1983:53;2071:9;2058:23;2090:31;2115:5;2090:31;:::i;:::-;2140:5;-1:-1:-1;2197:2:21;2182:18;;2169:32;2210:33;2169:32;2210:33;:::i;:::-;2262:7;-1:-1:-1;2316:2:21;2301:18;;2288:32;;-1:-1:-1;2371:2:21;2356:18;;2343:32;-1:-1:-1;;;;;2387:30:21;;2384:50;;;2430:1;2427;2420:12;2384:50;2453:49;2494:7;2485:6;2474:9;2470:22;2453:49;:::i;:::-;2443:59;;;1843:665;;;;;;;:::o;2513:416::-;2578:6;2586;2639:2;2627:9;2618:7;2614:23;2610:32;2607:52;;;2655:1;2652;2645:12;2607:52;2694:9;2681:23;2713:31;2738:5;2713:31;:::i;:::-;2763:5;-1:-1:-1;2820:2:21;2805:18;;2792:32;2862:15;;2855:23;2843:36;;2833:64;;2893:1;2890;2883:12;2934:758;3036:6;3044;3052;3060;3068;3121:3;3109:9;3100:7;3096:23;3092:33;3089:53;;;3138:1;3135;3128:12;3089:53;3177:9;3164:23;3196:31;3221:5;3196:31;:::i;:::-;3246:5;-1:-1:-1;3302:2:21;3287:18;;3274:32;-1:-1:-1;;;;;3318:30:21;;3315:50;;;3361:1;3358;3351:12;3315:50;3384:49;3425:7;3416:6;3405:9;3401:22;3384:49;:::i;:::-;3374:59;;;3480:2;3469:9;3465:18;3452:32;3442:42;;3531:2;3520:9;3516:18;3503:32;3493:42;;3587:3;3576:9;3572:19;3559:33;3636:4;3627:7;3623:18;3614:7;3611:31;3601:59;;3656:1;3653;3646:12;3601:59;3679:7;3669:17;;;2934:758;;;;;;;;:::o;3697:315::-;3765:6;3773;3826:2;3814:9;3805:7;3801:23;3797:32;3794:52;;;3842:1;3839;3832:12;3794:52;3881:9;3868:23;3900:31;3925:5;3900:31;:::i;:::-;3950:5;4002:2;3987:18;;;;3974:32;;-1:-1:-1;;;3697:315:21:o;4017:746::-;4131:6;4139;4147;4155;4163;4216:3;4204:9;4195:7;4191:23;4187:33;4184:53;;;4233:1;4230;4223:12;4184:53;4269:9;4256:23;4246:33;;4330:2;4319:9;4315:18;4302:32;-1:-1:-1;;;;;4394:2:21;4386:6;4383:14;4380:34;;;4410:1;4407;4400:12;4380:34;4433:49;4474:7;4465:6;4454:9;4450:22;4433:49;:::i;:::-;4423:59;;4529:2;4518:9;4514:18;4501:32;4491:42;;4580:2;4569:9;4565:18;4552:32;4542:42;;4637:3;4626:9;4622:19;4609:33;4593:49;;4667:2;4657:8;4654:16;4651:36;;;4683:1;4680;4673:12;4651:36;;4706:51;4749:7;4738:8;4727:9;4723:24;4706:51;:::i;:::-;4696:61;;;4017:746;;;;;;;;:::o;4768:245::-;4826:6;4879:2;4867:9;4858:7;4854:23;4850:32;4847:52;;;4895:1;4892;4885:12;4847:52;4934:9;4921:23;4953:30;4977:5;4953:30;:::i;5018:249::-;5087:6;5140:2;5128:9;5119:7;5115:23;5111:32;5108:52;;;5156:1;5153;5146:12;5108:52;5188:9;5182:16;5207:30;5231:5;5207:30;:::i;5272:277::-;5368:6;5421:2;5409:9;5400:7;5396:23;5392:32;5389:52;;;5437:1;5434;5427:12;5389:52;5469:9;5463:16;5488:31;5513:5;5488:31;:::i;5554:321::-;5623:6;5676:2;5664:9;5655:7;5651:23;5647:32;5644:52;;;5692:1;5689;5682:12;5644:52;5732:9;5719:23;-1:-1:-1;;;;;5757:6:21;5754:30;5751:50;;;5797:1;5794;5787:12;5751:50;5820:49;5861:7;5852:6;5841:9;5837:22;5820:49;:::i;5880:180::-;5939:6;5992:2;5980:9;5971:7;5967:23;5963:32;5960:52;;;6008:1;6005;5998:12;5960:52;-1:-1:-1;6031:23:21;;5880:180;-1:-1:-1;5880:180:21:o;6065:457::-;6152:6;6160;6168;6221:2;6209:9;6200:7;6196:23;6192:32;6189:52;;;6237:1;6234;6227:12;6189:52;6273:9;6260:23;6250:33;;6334:2;6323:9;6319:18;6306:32;-1:-1:-1;;;;;6353:6:21;6350:30;6347:50;;;6393:1;6390;6383:12;6347:50;6416:49;6457:7;6448:6;6437:9;6433:22;6416:49;:::i;:::-;6406:59;;;6512:2;6501:9;6497:18;6484:32;6474:42;;6065:457;;;;;:::o;6527:257::-;6568:3;6606:5;6600:12;6633:6;6628:3;6621:19;6649:63;6705:6;6698:4;6693:3;6689:14;6682:4;6675:5;6671:16;6649:63;:::i;:::-;6766:2;6745:15;-1:-1:-1;;6741:29:21;6732:39;;;;6773:4;6728:50;;6527:257;-1:-1:-1;;6527:257:21:o;6789:693::-;6839:3;6880:5;6874:12;6909:36;6935:9;6909:36;:::i;:::-;6964:1;6981:18;;;7008:104;;;;7126:1;7121:355;;;;6974:502;;7008:104;-1:-1:-1;;7041:24:21;;7029:37;;7086:16;;;;-1:-1:-1;7008:104:21;;7121:355;7152:5;7149:1;7142:16;7181:4;7226:2;7223:1;7213:16;7251:1;7265:165;7279:6;7276:1;7273:13;7265:165;;;7357:14;;7344:11;;;7337:35;7400:16;;;;7294:10;;7265:165;;;7269:3;;;7459:6;7454:3;7450:16;7443:23;;6974:502;;;;;6789:693;;;;:::o;7487:519::-;7765:2;7736:15;;;-1:-1:-1;;;;;;7732:45:21;7720:58;;7803:2;7794:12;;7787:28;;;7840:2;7831:12;;7824:28;;;7875:13;;-1:-1:-1;;7897:62:21;7875:13;7947:2;7938:12;;7931:4;7919:17;;7897:62;:::i;:::-;7979:16;;;;7997:2;7975:25;;7487:519;-1:-1:-1;;;;;7487:519:21:o;8538:274::-;8667:3;8705:6;8699:13;8721:53;8767:6;8762:3;8755:4;8747:6;8743:17;8721:53;:::i;:::-;8790:16;;;;;8538:274;-1:-1:-1;;8538:274:21:o;8817:407::-;8974:3;9012:6;9006:13;9028:53;9074:6;9069:3;9062:4;9054:6;9050:17;9028:53;:::i;:::-;9175:2;9146:15;;;;-1:-1:-1;;;;;;9142:45:21;9103:16;;;;9128:60;;;9215:2;9204:14;;8817:407;-1:-1:-1;;8817:407:21:o;9510:772::-;9891:3;9929:6;9923:13;9945:53;9991:6;9986:3;9979:4;9971:6;9967:17;9945:53;:::i;:::-;-1:-1:-1;;;10020:16:21;;;10045:18;;;10088:13;;10110:65;10088:13;10162:1;10151:13;;10144:4;10132:17;;10110:65;:::i;:::-;-1:-1:-1;;;10238:1:21;10194:20;;;;10230:10;;;10223:27;10274:1;10266:10;;9510:772;-1:-1:-1;;;;9510:772:21:o;10287:691::-;10665:3;10693:38;10727:3;10719:6;10693:38;:::i;:::-;-1:-1:-1;;;10747:2:21;10740:27;10796:6;10790:13;10812:61;10866:6;10861:2;10857;10853:11;10846:4;10838:6;10834:17;10812:61;:::i;:::-;-1:-1:-1;;;10931:2:21;10892:15;;;;10923:11;;;10916:29;10969:2;10961:11;;10287:691;-1:-1:-1;;;;10287:691:21:o;10983:694::-;11361:3;11389:38;11423:3;11415:6;11389:38;:::i;:::-;-1:-1:-1;;;11443:2:21;11436:27;11492:6;11486:13;11508:61;11562:6;11557:2;11553;11549:11;11542:4;11534:6;11530:17;11508:61;:::i;:::-;-1:-1:-1;;;11627:2:21;11588:15;;;;11619:11;;;11612:32;11668:2;11660:11;;10983:694;-1:-1:-1;;;;10983:694:21:o;12465:203::-;-1:-1:-1;;;;;12629:32:21;;;;12611:51;;12599:2;12584:18;;12465:203::o;12673:431::-;-1:-1:-1;;;;;12930:15:21;;;12912:34;;12982:15;;12977:2;12962:18;;12955:43;13034:2;13029;13014:18;;13007:30;;;12855:4;;13054:44;;13079:18;;13071:6;13054:44;:::i;13109:488::-;-1:-1:-1;;;;;13378:15:21;;;13360:34;;13430:15;;13425:2;13410:18;;13403:43;13477:2;13462:18;;13455:34;;;13525:3;13520:2;13505:18;;13498:31;;;13303:4;;13546:45;;13571:19;;13563:6;13546:45;:::i;14398:398::-;14625:25;;;14698:4;14686:17;;;;14681:2;14666:18;;14659:45;14735:2;14720:18;;14713:34;14778:2;14763:18;;14756:34;14612:3;14597:19;;14398:398::o;14801:217::-;14948:2;14937:9;14930:21;14911:4;14968:44;15008:2;14997:9;14993:18;14985:6;14968:44;:::i;15247:290::-;15424:2;15413:9;15406:21;15387:4;15444:44;15484:2;15473:9;15469:18;15461:6;15444:44;:::i;:::-;15436:52;;15524:6;15519:2;15508:9;15504:18;15497:34;15247:290;;;;;:::o;16246:343::-;16448:2;16430:21;;;16487:2;16467:18;;;16460:30;-1:-1:-1;;;16521:2:21;16506:18;;16499:49;16580:2;16565:18;;16246:343::o;17712:414::-;17914:2;17896:21;;;17953:2;17933:18;;;17926:30;17992:34;17987:2;17972:18;;17965:62;-1:-1:-1;;;18058:2:21;18043:18;;18036:48;18116:3;18101:19;;17712:414::o;25384:337::-;25586:2;25568:21;;;25625:2;25605:18;;;25598:30;-1:-1:-1;;;25659:2:21;25644:18;;25637:43;25712:2;25697:18;;25384:337::o;26139:356::-;26341:2;26323:21;;;26360:18;;;26353:30;26419:34;26414:2;26399:18;;26392:62;26486:2;26471:18;;26139:356::o;27714:413::-;27916:2;27898:21;;;27955:2;27935:18;;;27928:30;27994:34;27989:2;27974:18;;27967:62;-1:-1:-1;;;28060:2:21;28045:18;;28038:47;28117:3;28102:19;;27714:413::o;29227:345::-;29429:2;29411:21;;;29468:2;29448:18;;;29441:30;-1:-1:-1;;;29502:2:21;29487:18;;29480:51;29563:2;29548:18;;29227:345::o;29759:1128::-;29963:6;29952:9;29945:25;29926:4;29989:2;30027;30022;30011:9;30007:18;30000:30;30066:2;30061;30050:9;30046:18;30039:30;30089:1;30122:6;30116:13;30152:36;30178:9;30152:36;:::i;:::-;30225:6;30219:3;30208:9;30204:19;30197:35;30251:3;30273:1;30305:2;30294:9;30290:18;30322:1;30317:122;;;;30453:1;30448:354;;;;30283:519;;30317:122;-1:-1:-1;;30365:24:21;;30345:18;;;30338:52;30425:3;30410:19;;;-1:-1:-1;30317:122:21;;30448:354;30479:6;30476:1;30469:17;30527:2;30524:1;30514:16;30552:1;30566:180;30580:6;30577:1;30574:13;30566:180;;;30673:14;;30649:17;;;30645:26;;30638:50;30716:16;;;;30595:10;;30566:180;;;30770:17;;30766:26;;;-1:-1:-1;;30283:519:21;;30856:2;30848:6;30844:15;30838:22;30833:2;30822:9;30818:18;30811:50;;;;;30878:3;30870:11;;;;29759:1128;;;;;:::o;30892:128::-;30932:3;30963:1;30959:6;30956:1;30953:13;30950:39;;;30969:18;;:::i;:::-;-1:-1:-1;31005:9:21;;30892:128::o;31025:120::-;31065:1;31091;31081:35;;31096:18;;:::i;:::-;-1:-1:-1;31130:9:21;;31025:120::o;31150:125::-;31190:4;31218:1;31215;31212:8;31209:34;;;31223:18;;:::i;:::-;-1:-1:-1;31260:9:21;;31150:125::o;31280:258::-;31352:1;31362:113;31376:6;31373:1;31370:13;31362:113;;;31452:11;;;31446:18;31433:11;;;31426:39;31398:2;31391:10;31362:113;;;31493:6;31490:1;31487:13;31484:48;;;-1:-1:-1;;31528:1:21;31510:16;;31503:27;31280:258::o;31543:380::-;31622:1;31618:12;;;;31665;;;31686:61;;31740:4;31732:6;31728:17;31718:27;;31686:61;31793:2;31785:6;31782:14;31762:18;31759:38;31756:161;;;31839:10;31834:3;31830:20;31827:1;31820:31;31874:4;31871:1;31864:15;31902:4;31899:1;31892:15;31928:135;31967:3;-1:-1:-1;;31988:17:21;;31985:43;;;32008:18;;:::i;:::-;-1:-1:-1;32055:1:21;32044:13;;31928:135::o;32068:112::-;32100:1;32126;32116:35;;32131:18;;:::i;:::-;-1:-1:-1;32165:9:21;;32068:112::o;32185:127::-;32246:10;32241:3;32237:20;32234:1;32227:31;32277:4;32274:1;32267:15;32301:4;32298:1;32291:15;32317:127;32378:10;32373:3;32369:20;32366:1;32359:31;32409:4;32406:1;32399:15;32433:4;32430:1;32423:15;32449:127;32510:10;32505:3;32501:20;32498:1;32491:31;32541:4;32538:1;32531:15;32565:4;32562:1;32555:15;32581:127;32642:10;32637:3;32633:20;32630:1;32623:31;32673:4;32670:1;32663:15;32697:4;32694:1;32687:15;32713:127;32774:10;32769:3;32765:20;32762:1;32755:31;32805:4;32802:1;32795:15;32829:4;32826:1;32819:15;32845:131;-1:-1:-1;;;;;32920:31:21;;32910:42;;32900:70;;32966:1;32963;32956:12;32981:131;-1:-1:-1;;;;;;33055:32:21;;33045:43;;33035:71;;33102:1;33099;33092:12

Swarm Source

ipfs://07d22529a9661eb78d852b8f35a53d689cb9c7f73a9b881614c9ab5c5dc3efe4
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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