ETH Price: $3,448.46 (+6.20%)
Gas: 7 Gwei

EntropySeeds (HSEED)
 

Overview

TokenID

2472

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

EntropySeeds is generative AI Artwork. Chaos into beauty.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
HSeedsRecurve

Compiler Version
v0.8.2+commit.661d1103

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 14 of 15: seeds_recurve.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.2;

import "./Ownable.sol";
import "./ERC721Enumerable.sol";
import "./IERC721Receiver.sol";
import "./IERC721.sol";
import "./ReentrancyGuard.sol";

// previous contract
contract PreviousContract {
    //function setApprovalForAll(address, uint256) public {}
    function balanceOf(address) public returns (uint256) {}
    function tokenOfOwnerByIndex(address, uint256) public returns (uint256) {}
    function safeTransferFrom(address, address, uint256, bytes memory) public {}
}

contract HSeedsRecurve is ERC721Enumerable, IERC721Receiver, Ownable, ReentrancyGuard {
    // Previous contract we deployed. Respnsible for first sales.
    PreviousContract private PREVIOUS_CONTRACT;

    // The address of the previous contract.
    string public constant PREVIOUS_CONTRACT_ADDR = "0xDc31e48b66A1364BFea922bfc2972AB5C286F9fe";
    
    // last token sold on previous contract.
    uint256 public constant FINAL_TOKEN_ID = 1724;
    
    // indicies coverred by the first level [0-1499]
    uint256 public constant LAST_TOKEN_ID_FIRST_LEVEL = 1499;

    // indicies reserved from first sale. Do not resell these indicies [0-1949].
    uint256 public constant RESERVED_TOKEN_ID = FINAL_TOKEN_ID + (FINAL_TOKEN_ID - LAST_TOKEN_ID_FIRST_LEVEL);
    
    // number of tokens we owe to those that bought in 0.6 range, our "airdrops".
    uint256 private AIRDROPS_CLAIMED = FINAL_TOKEN_ID - LAST_TOKEN_ID_FIRST_LEVEL;

    // track the total number of tokens claimed (included airdrops).
    uint256 public TOTAL_CLAIMED = 0;
    
    // This is the provenance record of all artwork in existence
    string public constant ENTROPYSEEDS_PROVENANCE = "51aab9a30a64f0b1f8325ccfa7e80cbcc20b9dbab4b4e6765c3e5178e507d210";

    // opens Mar 11 2021 15:00:00 GMT+0000
    uint256 public constant SALE_START_TIMESTAMP = 1615474800;

    // Time after which we randomly assign and allotted (s*m*h*d)
    // sale lasts for 21 days
    uint256 public constant REVEAL_TIMESTAMP = SALE_START_TIMESTAMP + (60*60*24*21);

    uint256 public constant MAX_NFT_SUPPLY = 8275;

    uint256 public startingIndexBlock;

    uint256 public startingIndex;

    bool private halt_mint = false;
    bool private halt_claim = false;

    // Mapping from token ID to whether the Entropyseed was minted before reveal
    mapping (uint256 => bool) private _mintedBeforeReveal;

    /*================================================================================
    //================================================================================
    //================================================================================
    //===============================================================================*/
    
    constructor(address previous) public ERC721("EntropySeeds", "HSEED") {
        PREVIOUS_CONTRACT = PreviousContract(previous);
    }
    
    /**
     * @dev - we use this to compute the mintIndex. We reserve the token up to FINAL_TOKEN for
     * buyers on the previous contract.
     **/
    function totalSupply() public view override returns (uint256) {
        uint256 supply = super.totalSupply();
        uint256 remaining_claims = (RESERVED_TOKEN_ID + 1) - TOTAL_CLAIMED;
        return supply + remaining_claims; // so we mint after
    }

    /**
    * @dev - Only accept if the tokenId is below the final one
    * and it comes from the last contract.
    **/
    function onERC721Received(address, address, uint256 tokenId, bytes calldata) public override returns (bytes4) {
            require(msg.sender == address(PREVIOUS_CONTRACT), "Request must come from previous contract address");
            require(tokenId <= FINAL_TOKEN_ID, "We are not accepting tokens past the cutoff");
            return IERC721Receiver.onERC721Received.selector;
    }
    
    function claimMyTokens(uint256 numberOfNfts) public nonReentrant {
        require(halt_claim == false, "Claims have been halted");
        require(numberOfNfts <= 10, "Max of 10 at a time");
        require(numberOfNfts > 0, "Need to claim something");

        require(TOTAL_CLAIMED <= (RESERVED_TOKEN_ID+1), "All claims have been filled."); 
        require((TOTAL_CLAIMED + numberOfNfts) <= (RESERVED_TOKEN_ID+1), "Claimed exceeds reserved.");
        
        uint256 balance = PREVIOUS_CONTRACT.balanceOf(msg.sender);
        require(balance > 0, "You own no tokens");
        require(numberOfNfts <= balance, "Claiming too many tokens");

        for (uint i = 0; i < numberOfNfts; ) {
            // has to be 0 because as we transfer the tokens the next one becomes 0.
            // need this info to understand how we handle the token (where it sold before).
            uint256 tokenId = PREVIOUS_CONTRACT.tokenOfOwnerByIndex(msg.sender, 0); 

            // It *might* be out of order and they can still buy from the previous contract
            // [0,1724] INCLUSIVE.
            // Should be handled by the onERC721Received but should be fine doing it this way
            if (tokenId > FINAL_TOKEN_ID) {
                unchecked{i++;}
                continue;
            }
            
            // mint a new one under this smart contact
            unchecked{TOTAL_CLAIMED = TOTAL_CLAIMED + 1;} // @dev save gas 
            if (block.timestamp < REVEAL_TIMESTAMP) {
                _mintedBeforeReveal[tokenId] = true;
            }
            _safeMint(msg.sender, tokenId);

            // if they bought after the 0.2 level, at 0.6, we want to airdrop them
            // another token since this price level is now 0.3.
            if (tokenId > LAST_TOKEN_ID_FIRST_LEVEL) {
                // because we want to preserve the order for previous holders
                // we mint after the FINAL_TOKEN.
                uint256 mintIndex = FINAL_TOKEN_ID + AIRDROPS_CLAIMED;
                unchecked{TOTAL_CLAIMED = TOTAL_CLAIMED + 1;} // @dev save gas
                if (block.timestamp < REVEAL_TIMESTAMP) {
                    _mintedBeforeReveal[mintIndex] = true;
                }
                AIRDROPS_CLAIMED = AIRDROPS_CLAIMED - 1;
                require(AIRDROPS_CLAIMED >= 0, "Oversold.");

                _safeMint(msg.sender, mintIndex);
            }

            // Here we are "burning" the old tokens. They will stay in this contract forever.
            // stops ppl from using the old ones after.
            PREVIOUS_CONTRACT.safeTransferFrom(msg.sender, address(this), tokenId, "");

            unchecked{i++;} // @dev save gas
        }
    }

    /**
     * @dev Returns if the NFT has been minted before reveal phase
     */
    function isMintedBeforeReveal(uint256 index) public view returns (bool) {
        return _mintedBeforeReveal[index];
    }
    
    /**
     * @dev Gets current price level
     */
    function getNFTPrice() public view returns (uint256) {
        require(block.timestamp >= SALE_START_TIMESTAMP, "Sale has not started");
        require(totalSupply() < MAX_NFT_SUPPLY, "Sale has already ended");

        uint256 currentSupply = totalSupply();
        if (currentSupply >= 8270) {
            return 5000000000000000000; // 8270 - 8275 5 ETH
        } else if (currentSupply >= 8250) {
            return 3000000000000000000; // 8250 - 8269 3 ETH
        } else if (currentSupply >= 8200) {
            return 1000000000000000000; // 8200  - 8249  1 ETH
        } else if (currentSupply >= 7000) {
            return 500000000000000000; // 7000 - 8199 0.5 ETH
        } else if (currentSupply >= 4500) {
            return 400000000000000000; // 4500 - 6999 0.4 ETH
        } else if (currentSupply >= 1500) {
            return 300000000000000000; // 1500 - 4499 0.3 ETH
        } else {
            return 200000000000000000; // 0 - 1499 0.2 ETH 
        }
    }
    
    /**
    * @dev Mints numberOfNfts Entropyseeds
    * Price slippage is okay between levels. Known "bug".
    * Minting starts above RESERVED_TOKEN_ID 
    */
    function mintNFT(uint256 numberOfNfts) public payable nonReentrant {
        require(halt_mint == false, "Minting has been halted.");
        require(totalSupply() < MAX_NFT_SUPPLY, "Sale has already ended");
        require(numberOfNfts > 0, "numberOfNfts cannot be 0");
        require(numberOfNfts <= 10, "You may not buy more than 10 NFTs at once");
        require((totalSupply() + numberOfNfts) <= MAX_NFT_SUPPLY, "Exceeds MAX_NFT_SUPPLY");
        require((getNFTPrice() * numberOfNfts) == msg.value, "Ether value sent is not correct");

        for (uint i = 0; i < numberOfNfts; i++) {
            uint256 mintIndex = totalSupply(); 
            if (block.timestamp < REVEAL_TIMESTAMP) {
                _mintedBeforeReveal[mintIndex] = true;
            }
            _safeMint(msg.sender, mintIndex);
        }

        /**
        * Source of "randomness". Theoretically miners could influence this but not worried for the scope of this project
        */
        if (startingIndexBlock == 0 && (totalSupply() == MAX_NFT_SUPPLY || block.timestamp >= REVEAL_TIMESTAMP)) {
            startingIndexBlock = block.number;
        }
    }
    
    /**
     * @dev Called after the sale ends or reveal period is over
     */
    function finalizeStartingIndex() public {
        require(startingIndex == 0, "Starting index is already set");
        require(startingIndexBlock != 0, "Starting index block must be set");
        

        uint256 _start = uint256(blockhash(startingIndexBlock)) % MAX_NFT_SUPPLY;
        if ((block.number - _start) > 255) {
            _start = uint256(blockhash(block.number-1)) % MAX_NFT_SUPPLY;
        }
        if (_start == 0) {
            _start = _start + 1;
        }
        
        startingIndex = _start;
    }

    /**
     * @dev Admin only mint function. Last resort to fix any issues after deployment
    **/
    function mint(address to, uint256 idx) public onlyOwner nonReentrant {
        _safeMint(to, idx);
    }

    /**
     * @dev Admin only burn function. Last resort to fix any issues after deployment
    **/
    function burn(uint256 idx) public onlyOwner nonReentrant {
        _burn(idx);
    }
    
    /**
     * @dev Withdraw ether from this contract (Callable by owner)
    */
    function withdraw() public onlyOwner {
        uint balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

    /**
     * @dev Halt minting 
    */
    function setHaltMint(bool v) public onlyOwner {
        halt_mint = v;
    }

    /**
     * @dev Halt claims 
    */
    function setHaltClaim(bool v) public onlyOwner {
        halt_claim = v;
    }
}

File 1 of 15: 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 2 of 15: 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 3 of 15: 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 4 of 15: ERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./IERC721Enumerable.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./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 || ERC721.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 || ERC721.isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     d*
     * - `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 5 of 15: 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 6 of 15: 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 7 of 15: IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./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 8 of 15: 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 9 of 15: 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 10 of 15: 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 11 of 15: Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./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 12 of 15: ReentrancyGuard.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor () {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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


File 13 of 15: 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 15 of 15: 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);
    }

}


Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"previous","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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ENTROPYSEEDS_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FINAL_TOKEN_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LAST_TOKEN_ID_FIRST_LEVEL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_NFT_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PREVIOUS_CONTRACT_ADDR","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVED_TOKEN_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REVEAL_TIMESTAMP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SALE_START_TIMESTAMP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_CLAIMED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"idx","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfNfts","type":"uint256"}],"name":"claimMyTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"finalizeStartingIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNFTPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"isMintedBeforeReveal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"idx","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfNfts","type":"uint256"}],"name":"mintNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"v","type":"bool"}],"name":"setHaltClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"v","type":"bool"}],"name":"setHaltMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startingIndexBlock","outputs":[{"internalType":"uint256","name":"","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":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052620000146105db6106bc62000226565b600d556000600e556011805461ffff191690553480156200003457600080fd5b50604051620030cd380380620030cd8339810160408190526200005791620001f6565b604080518082018252600c81526b456e74726f7079536565647360a01b6020808301918252835180850190945260058452641214d1515160da1b908401528151919291620000a89160009162000150565b508051620000be90600190602084019062000150565b5050506000620000d36200014c60201b60201c565b600a80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600b55600c80546001600160a01b0319166001600160a01b039290921691909117905562000287565b3390565b8280546200015e906200024a565b90600052602060002090601f016020900481019282620001825760008555620001cd565b82601f106200019d57805160ff1916838001178555620001cd565b82800160010185558215620001cd579182015b82811115620001cd578251825591602001919060010190620001b0565b50620001db929150620001df565b5090565b5b80821115620001db5760008155600101620001e0565b60006020828403121562000208578081fd5b81516001600160a01b03811681146200021f578182fd5b9392505050565b6000828210156200024557634e487b7160e01b81526011600452602481fd5b500390565b6002810460018216806200025f57607f821691505b602082108114156200028157634e487b7160e01b600052602260045260246000fd5b50919050565b612e3680620002976000396000f3fe6080604052600436106102465760003560e01c806374df39c911610139578063c87b56dd116100b6578063e36d64981161007a578063e36d649814610672578063e887f3fa14610688578063e985e9c5146106a8578063f11b7d32146106f1578063f2fde38b14610706578063fb107a4f1461072657610246565b8063c87b56dd146105f2578063cb774d4714610612578063d540c52714610628578063e04f7ed71461063d578063e322ef4c1461065d57610246565b8063a22cb465116100fd578063a22cb46514610556578063b5077f4414610576578063b88d4fde1461058c578063bbc7b1cc146105ac578063bc28d702146105c257610246565b806374df39c9146104e35780638da5cb5b146104f85780639264274414610516578063946807fd1461052957806395d89b411461054157610246565b80633ccfd60b116101c75780634f6ccce71161018b5780634f6ccce7146104585780636352211e146104785780636c4029e81461049857806370a08231146104ae578063715018a6146104ce57610246565b80633ccfd60b146103c357806340c10f19146103d857806342842e0e146103f857806342966c68146104185780634bbf65fe1461043857610246565b8063150b7a021161020e578063150b7a021461032057806318160ddd1461035957806318e20a381461036e57806323b872dd146103835780632f745c59146103a357610246565b806301ffc9a71461024b57806306fdde0314610280578063081812fc146102a2578063095ea7b3146102da57806312644576146102fc575b600080fd5b34801561025757600080fd5b5061026b610266366004612a21565b61073b565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b50610295610768565b6040516102779190612b21565b3480156102ae57600080fd5b506102c26102bd366004612a59565b6107fb565b6040516001600160a01b039091168152602001610277565b3480156102e657600080fd5b506102fa6102f53660046129de565b610895565b005b34801561030857600080fd5b50610312600e5481565b604051908152602001610277565b34801561032c57600080fd5b5061034061033b36600461284a565b6109ab565b6040516001600160e01b03199091168152602001610277565b34801561036557600080fd5b50610312610a99565b34801561037a57600080fd5b50610312610af0565b34801561038f57600080fd5b506102fa61039e36600461280f565b610b04565b3480156103af57600080fd5b506103126103be3660046129de565b610b35565b3480156103cf57600080fd5b506102fa610bcb565b3480156103e457600080fd5b506102fa6103f33660046129de565b610c28565b34801561040457600080fd5b506102fa61041336600461280f565b610c8d565b34801561042457600080fd5b506102fa610433366004612a59565b610ca8565b34801561044457600080fd5b506102fa610453366004612a59565b610d0b565b34801561046457600080fd5b50610312610473366004612a59565b61121d565b34801561048457600080fd5b506102c2610493366004612a59565b6112be565b3480156104a457600080fd5b506103126105db81565b3480156104ba57600080fd5b506103126104c93660046127c3565b611335565b3480156104da57600080fd5b506102fa6113bc565b3480156104ef57600080fd5b506102fa611430565b34801561050457600080fd5b50600a546001600160a01b03166102c2565b6102fa610524366004612a59565b61152b565b34801561053557600080fd5b5061031263604a307081565b34801561054d57600080fd5b50610295611812565b34801561056257600080fd5b506102fa6105713660046129b5565b611821565b34801561058257600080fd5b5061031261205381565b34801561059857600080fd5b506102fa6105a73660046128e0565b6118f3565b3480156105b857600080fd5b506103126106bc81565b3480156105ce57600080fd5b5061026b6105dd366004612a59565b60009081526012602052604090205460ff1690565b3480156105fe57600080fd5b5061029561060d366004612a59565b61192b565b34801561061e57600080fd5b5061031260105481565b34801561063457600080fd5b50610295611a13565b34801561064957600080fd5b506102fa610658366004612a07565b611a2f565b34801561066957600080fd5b50610295611a6c565b34801561067e57600080fd5b50610312600f5481565b34801561069457600080fd5b506102fa6106a3366004612a07565b611a88565b3480156106b457600080fd5b5061026b6106c33660046127dd565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106fd57600080fd5b50610312611acc565b34801561071257600080fd5b506102fa6107213660046127c3565b611ae6565b34801561073257600080fd5b50610312611bd1565b60006001600160e01b0319821663780e9d6360e01b1480610760575061076082611d28565b90505b919050565b60606000805461077790612cd1565b80601f01602080910402602001604051908101604052809291908181526020018280546107a390612cd1565b80156107f05780601f106107c5576101008083540402835291602001916107f0565b820191906000526020600020905b8154815290600101906020018083116107d357829003601f168201915b505050505090505b90565b6000818152600260205260408120546001600160a01b03166108795760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006108a0826112be565b9050806001600160a01b0316836001600160a01b0316141561090e5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610870565b336001600160a01b038216148061092a575061092a81336106c3565b61099c5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610870565b6109a68383611d78565b505050565b600c546000906001600160a01b03163314610a215760405162461bcd60e51b815260206004820152603060248201527f52657175657374206d75737420636f6d652066726f6d2070726576696f75732060448201526f636f6e7472616374206164647265737360801b6064820152608401610870565b6106bc841115610a875760405162461bcd60e51b815260206004820152602b60248201527f576520617265206e6f7420616363657074696e6720746f6b656e73207061737460448201526a103a34329031baba37b33360a91b6064820152608401610870565b50630a85bd0160e11b95945050505050565b600080610aa560085490565b90506000600e546105db6106bc610abc9190612c8e565b610ac8906106bc612c43565b610ad3906001612c43565b610add9190612c8e565b9050610ae98183612c43565b9250505090565b610b0163604a3070621baf80612c43565b81565b610b0e3382611de6565b610b2a5760405162461bcd60e51b815260040161087090612bbb565b6109a6838383611edd565b6000610b4083611335565b8210610ba25760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610870565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610bf55760405162461bcd60e51b815260040161087090612b86565b6040514790339082156108fc029083906000818181858888f19350505050158015610c24573d6000803e3d6000fd5b5050565b600a546001600160a01b03163314610c525760405162461bcd60e51b815260040161087090612b86565b6002600b541415610c755760405162461bcd60e51b815260040161087090612c0c565b6002600b55610c848282612088565b50506001600b55565b6109a6838383604051806020016040528060008152506118f3565b600a546001600160a01b03163314610cd25760405162461bcd60e51b815260040161087090612b86565b6002600b541415610cf55760405162461bcd60e51b815260040161087090612c0c565b6002600b55610d03816120a2565b506001600b55565b6002600b541415610d2e5760405162461bcd60e51b815260040161087090612c0c565b6002600b55601154610100900460ff1615610d8b5760405162461bcd60e51b815260206004820152601760248201527f436c61696d732068617665206265656e2068616c7465640000000000000000006044820152606401610870565b600a811115610dd25760405162461bcd60e51b81526020600482015260136024820152724d6178206f6620313020617420612074696d6560681b6044820152606401610870565b60008111610e225760405162461bcd60e51b815260206004820152601760248201527f4e65656420746f20636c61696d20736f6d657468696e670000000000000000006044820152606401610870565b610e306105db6106bc612c8e565b610e3c906106bc612c43565b610e47906001612c43565b600e541115610e985760405162461bcd60e51b815260206004820152601c60248201527f416c6c20636c61696d732068617665206265656e2066696c6c65642e000000006044820152606401610870565b610ea66105db6106bc612c8e565b610eb2906106bc612c43565b610ebd906001612c43565b81600e54610ecb9190612c43565b1115610f195760405162461bcd60e51b815260206004820152601960248201527f436c61696d656420657863656564732072657365727665642e000000000000006044820152606401610870565b600c546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381600087803b158015610f5f57600080fd5b505af1158015610f73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f979190612a71565b905060008111610fdd5760405162461bcd60e51b8152602060048201526011602482015270596f75206f776e206e6f20746f6b656e7360781b6044820152606401610870565b8082111561102d5760405162461bcd60e51b815260206004820152601860248201527f436c61696d696e6720746f6f206d616e7920746f6b656e7300000000000000006044820152606401610870565b60005b8281101561121357600c54604051632f745c5960e01b8152336004820152600060248201819052916001600160a01b031690632f745c5990604401602060405180830381600087803b15801561108557600080fd5b505af1158015611099573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110bd9190612a71565b90506106bc8111156110d2575060010161120e565b600e805460010190556110ec63604a3070621baf80612c43565b42101561110d576000818152601260205260409020805460ff191660011790555b6111173382612088565b6105db81111561118e576000600d546106bc6111339190612c43565b600e80546001019055905061114f63604a3070621baf80612c43565b421015611170576000818152601260205260409020805460ff191660011790555b6001600d5461117f9190612c8e565b600d5561118c3382612088565b505b600c54604051635c46a7ef60e11b81523360048201523060248201526044810183905260806064820152600060848201526001600160a01b039091169063b88d4fde9060a401600060405180830381600087803b1580156111ee57600080fd5b505af1158015611202573d6000803e3d6000fd5b50506001909301925050505b611030565b50506001600b5550565b600061122860085490565b821061128b5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610870565b600882815481106112ac57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806107605760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610870565b60006001600160a01b0382166113a05760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610870565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146113e65760405162461bcd60e51b815260040161087090612b86565b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b601054156114805760405162461bcd60e51b815260206004820152601d60248201527f5374617274696e6720696e64657820697320616c7265616479207365740000006044820152606401610870565b600f546114cf5760405162461bcd60e51b815260206004820181905260248201527f5374617274696e6720696e64657820626c6f636b206d757374206265207365746044820152606401610870565b600f546000906114e3906120539040612d27565b905060ff6114f18243612c8e565b111561151357612053611505600143612c8e565b611510919040612d27565b90505b8061152657611523816001612c43565b90505b601055565b6002600b54141561154e5760405162461bcd60e51b815260040161087090612c0c565b6002600b5560115460ff16156115a65760405162461bcd60e51b815260206004820152601860248201527f4d696e74696e6720686173206265656e2068616c7465642e00000000000000006044820152606401610870565b6120536115b1610a99565b106115f75760405162461bcd60e51b815260206004820152601660248201527514d85b19481a185cc8185b1c9958591e48195b99195960521b6044820152606401610870565b600081116116475760405162461bcd60e51b815260206004820152601860248201527f6e756d6265724f664e6674732063616e6e6f74206265203000000000000000006044820152606401610870565b600a8111156116aa5760405162461bcd60e51b815260206004820152602960248201527f596f75206d6179206e6f7420627579206d6f7265207468616e203130204e465460448201526873206174206f6e636560b81b6064820152608401610870565b612053816116b6610a99565b6116c09190612c43565b11156117075760405162461bcd60e51b815260206004820152601660248201527545786365656473204d41585f4e46545f535550504c5960501b6044820152606401610870565b3481611711611bd1565b61171b9190612c6f565b146117685760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610870565b60005b818110156117ce57600061177d610a99565b905061179063604a3070621baf80612c43565b4210156117b1576000818152601260205260409020805460ff191660011790555b6117bb3382612088565b50806117c681612d0c565b91505061176b565b50600f5415801561180157506120536117e5610a99565b148061180157506117fd63604a3070621baf80612c43565b4210155b15610d035743600f55506001600b55565b60606001805461077790612cd1565b6001600160a01b03821633141561187a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610870565b3360008181526005602090815260408083206001600160a01b0387168085529252909120805460ff1916841515179055906001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118e7911515815260200190565b60405180910390a35050565b6118fd3383611de6565b6119195760405162461bcd60e51b815260040161087090612bbb565b61192584848484612149565b50505050565b6000818152600260205260409020546060906001600160a01b03166119aa5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610870565b60006119c160408051602081019091526000815290565b905060008151116119e15760405180602001604052806000815250611a0c565b806119eb8461217c565b6040516020016119fc929190612ab5565b6040516020818303038152906040525b9392505050565b6040518060600160405280602a8152602001612dd7602a913981565b600a546001600160a01b03163314611a595760405162461bcd60e51b815260040161087090612b86565b6011805460ff1916911515919091179055565b604051806060016040528060408152602001612d976040913981565b600a546001600160a01b03163314611ab25760405162461bcd60e51b815260040161087090612b86565b601180549115156101000261ff0019909216919091179055565b611ada6105db6106bc612c8e565b610b01906106bc612c43565b600a546001600160a01b03163314611b105760405162461bcd60e51b815260040161087090612b86565b6001600160a01b038116611b755760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610870565b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b600063604a3070421015611c1e5760405162461bcd60e51b815260206004820152601460248201527314d85b19481a185cc81b9bdd081cdd185c9d195960621b6044820152606401610870565b612053611c29610a99565b10611c6f5760405162461bcd60e51b815260206004820152601660248201527514d85b19481a185cc8185b1c9958591e48195b99195960521b6044820152606401610870565b6000611c79610a99565b905061204e8110611c9557674563918244f400009150506107f8565b61203a8110611caf576729a2241af62c00009150506107f8565b6120088110611cc957670de0b6b3a76400009150506107f8565b611b588110611ce3576706f05b59d3b200009150506107f8565b6111948110611cfd5767058d15e1762800009150506107f8565b6105dc8110611d1757670429d069189e00009150506107f8565b6702c68af0bb1400009150506107f8565b60006001600160e01b031982166380ac58cd60e01b1480611d5957506001600160e01b03198216635b5e139f60e01b145b8061076057506301ffc9a760e01b6001600160e01b0319831614610760565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611dad826112be565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611e5f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610870565b6000611e6a836112be565b9050806001600160a01b0316846001600160a01b03161480611ea55750836001600160a01b0316611e9a846107fb565b6001600160a01b0316145b80611ed557506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611ef0826112be565b6001600160a01b031614611f585760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610870565b6001600160a01b038216611fba5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610870565b611fc5838383612297565b611fd0600082611d78565b6001600160a01b0383166000908152600360205260408120805460019290611ff9908490612c8e565b90915550506001600160a01b0382166000908152600360205260408120805460019290612027908490612c43565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610c24828260405180602001604052806000815250612354565b60006120ad826112be565b90506120bb81600084612297565b6120c6600083611d78565b6001600160a01b03811660009081526003602052604081208054600192906120ef908490612c8e565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b612154848484611edd565b61216084848484612387565b6119255760405162461bcd60e51b815260040161087090612b34565b6060816121a157506040805180820190915260018152600360fc1b6020820152610763565b8160005b81156121cb57806121b581612d0c565b91506121c49050600a83612c5b565b91506121a5565b60008167ffffffffffffffff8111156121f457634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561221e576020820181803683370190505b5090505b8415611ed557612233600183612c8e565b9150612240600a86612d27565b61224b906030612c43565b60f81b81838151811061226e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612290600a86612c5b565b9450612222565b6001600160a01b0383166122f2576122ed81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612315565b816001600160a01b0316836001600160a01b031614612315576123158382612494565b6001600160a01b0382166123315761232c81612531565b6109a6565b826001600160a01b0316826001600160a01b0316146109a6576109a6828261260a565b61235e838361264e565b61236b6000848484612387565b6109a65760405162461bcd60e51b815260040161087090612b34565b60006001600160a01b0384163b1561248957604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906123cb903390899088908890600401612ae4565b602060405180830381600087803b1580156123e557600080fd5b505af1925050508015612415575060408051601f3d908101601f1916820190925261241291810190612a3d565b60015b61246f573d808015612443576040519150601f19603f3d011682016040523d82523d6000602084013e612448565b606091505b5080516124675760405162461bcd60e51b815260040161087090612b34565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611ed5565b506001949350505050565b600060016124a184611335565b6124ab9190612c8e565b6000838152600760205260409020549091508082146124fe576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061254390600190612c8e565b6000838152600960205260408120546008805493945090928490811061257957634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080600883815481106125a857634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806125ee57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061261583611335565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166126a45760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610870565b6000818152600260205260409020546001600160a01b0316156127095760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610870565b61271560008383612297565b6001600160a01b038216600090815260036020526040812080546001929061273e908490612c43565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b80356001600160a01b038116811461076357600080fd5b8035801515811461076357600080fd5b6000602082840312156127d4578081fd5b611a0c8261279c565b600080604083850312156127ef578081fd5b6127f88361279c565b91506128066020840161279c565b90509250929050565b600080600060608486031215612823578081fd5b61282c8461279c565b925061283a6020850161279c565b9150604084013590509250925092565b600080600080600060808688031215612861578081fd5b61286a8661279c565b94506128786020870161279c565b935060408601359250606086013567ffffffffffffffff8082111561289b578283fd5b818801915088601f8301126128ae578283fd5b8135818111156128bc578384fd5b8960208285010111156128cd578384fd5b9699959850939650602001949392505050565b600080600080608085870312156128f5578384fd5b6128fe8561279c565b935061290c6020860161279c565b925060408501359150606085013567ffffffffffffffff8082111561292f578283fd5b818701915087601f830112612942578283fd5b81358181111561295457612954612d67565b604051601f8201601f19908116603f0116810190838211818310171561297c5761297c612d67565b816040528281528a6020848701011115612994578586fd5b82602086016020830137918201602001949094529598949750929550505050565b600080604083850312156129c7578182fd5b6129d08361279c565b9150612806602084016127b3565b600080604083850312156129f0578182fd5b6129f98361279c565b946020939093013593505050565b600060208284031215612a18578081fd5b611a0c826127b3565b600060208284031215612a32578081fd5b8135611a0c81612d7d565b600060208284031215612a4e578081fd5b8151611a0c81612d7d565b600060208284031215612a6a578081fd5b5035919050565b600060208284031215612a82578081fd5b5051919050565b60008151808452612aa1816020860160208601612ca5565b601f01601f19169290920160200192915050565b60008351612ac7818460208801612ca5565b835190830190612adb818360208801612ca5565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b1790830184612a89565b9695505050505050565b600060208252611a0c6020830184612a89565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60008219821115612c5657612c56612d3b565b500190565b600082612c6a57612c6a612d51565b500490565b6000816000190483118215151615612c8957612c89612d3b565b500290565b600082821015612ca057612ca0612d3b565b500390565b60005b83811015612cc0578181015183820152602001612ca8565b838111156119255750506000910152565b600281046001821680612ce557607f821691505b60208210811415612d0657634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612d2057612d20612d3b565b5060010190565b600082612d3657612d36612d51565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114612d9357600080fd5b5056fe35316161623961333061363466306231663833323563636661376538306362636332306239646261623462346536373635633365353137386535303764323130307844633331653438623636413133363442466561393232626663323937324142354332383646396665a2646970667358221220c0c1cdcdd0a532dc4fbd947a8e01897f105d98c5644538cea1e6fb0be682250164736f6c63430008020033000000000000000000000000dc31e48b66a1364bfea922bfc2972ab5c286f9fe

Deployed Bytecode

0x6080604052600436106102465760003560e01c806374df39c911610139578063c87b56dd116100b6578063e36d64981161007a578063e36d649814610672578063e887f3fa14610688578063e985e9c5146106a8578063f11b7d32146106f1578063f2fde38b14610706578063fb107a4f1461072657610246565b8063c87b56dd146105f2578063cb774d4714610612578063d540c52714610628578063e04f7ed71461063d578063e322ef4c1461065d57610246565b8063a22cb465116100fd578063a22cb46514610556578063b5077f4414610576578063b88d4fde1461058c578063bbc7b1cc146105ac578063bc28d702146105c257610246565b806374df39c9146104e35780638da5cb5b146104f85780639264274414610516578063946807fd1461052957806395d89b411461054157610246565b80633ccfd60b116101c75780634f6ccce71161018b5780634f6ccce7146104585780636352211e146104785780636c4029e81461049857806370a08231146104ae578063715018a6146104ce57610246565b80633ccfd60b146103c357806340c10f19146103d857806342842e0e146103f857806342966c68146104185780634bbf65fe1461043857610246565b8063150b7a021161020e578063150b7a021461032057806318160ddd1461035957806318e20a381461036e57806323b872dd146103835780632f745c59146103a357610246565b806301ffc9a71461024b57806306fdde0314610280578063081812fc146102a2578063095ea7b3146102da57806312644576146102fc575b600080fd5b34801561025757600080fd5b5061026b610266366004612a21565b61073b565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b50610295610768565b6040516102779190612b21565b3480156102ae57600080fd5b506102c26102bd366004612a59565b6107fb565b6040516001600160a01b039091168152602001610277565b3480156102e657600080fd5b506102fa6102f53660046129de565b610895565b005b34801561030857600080fd5b50610312600e5481565b604051908152602001610277565b34801561032c57600080fd5b5061034061033b36600461284a565b6109ab565b6040516001600160e01b03199091168152602001610277565b34801561036557600080fd5b50610312610a99565b34801561037a57600080fd5b50610312610af0565b34801561038f57600080fd5b506102fa61039e36600461280f565b610b04565b3480156103af57600080fd5b506103126103be3660046129de565b610b35565b3480156103cf57600080fd5b506102fa610bcb565b3480156103e457600080fd5b506102fa6103f33660046129de565b610c28565b34801561040457600080fd5b506102fa61041336600461280f565b610c8d565b34801561042457600080fd5b506102fa610433366004612a59565b610ca8565b34801561044457600080fd5b506102fa610453366004612a59565b610d0b565b34801561046457600080fd5b50610312610473366004612a59565b61121d565b34801561048457600080fd5b506102c2610493366004612a59565b6112be565b3480156104a457600080fd5b506103126105db81565b3480156104ba57600080fd5b506103126104c93660046127c3565b611335565b3480156104da57600080fd5b506102fa6113bc565b3480156104ef57600080fd5b506102fa611430565b34801561050457600080fd5b50600a546001600160a01b03166102c2565b6102fa610524366004612a59565b61152b565b34801561053557600080fd5b5061031263604a307081565b34801561054d57600080fd5b50610295611812565b34801561056257600080fd5b506102fa6105713660046129b5565b611821565b34801561058257600080fd5b5061031261205381565b34801561059857600080fd5b506102fa6105a73660046128e0565b6118f3565b3480156105b857600080fd5b506103126106bc81565b3480156105ce57600080fd5b5061026b6105dd366004612a59565b60009081526012602052604090205460ff1690565b3480156105fe57600080fd5b5061029561060d366004612a59565b61192b565b34801561061e57600080fd5b5061031260105481565b34801561063457600080fd5b50610295611a13565b34801561064957600080fd5b506102fa610658366004612a07565b611a2f565b34801561066957600080fd5b50610295611a6c565b34801561067e57600080fd5b50610312600f5481565b34801561069457600080fd5b506102fa6106a3366004612a07565b611a88565b3480156106b457600080fd5b5061026b6106c33660046127dd565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106fd57600080fd5b50610312611acc565b34801561071257600080fd5b506102fa6107213660046127c3565b611ae6565b34801561073257600080fd5b50610312611bd1565b60006001600160e01b0319821663780e9d6360e01b1480610760575061076082611d28565b90505b919050565b60606000805461077790612cd1565b80601f01602080910402602001604051908101604052809291908181526020018280546107a390612cd1565b80156107f05780601f106107c5576101008083540402835291602001916107f0565b820191906000526020600020905b8154815290600101906020018083116107d357829003601f168201915b505050505090505b90565b6000818152600260205260408120546001600160a01b03166108795760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006108a0826112be565b9050806001600160a01b0316836001600160a01b0316141561090e5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610870565b336001600160a01b038216148061092a575061092a81336106c3565b61099c5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610870565b6109a68383611d78565b505050565b600c546000906001600160a01b03163314610a215760405162461bcd60e51b815260206004820152603060248201527f52657175657374206d75737420636f6d652066726f6d2070726576696f75732060448201526f636f6e7472616374206164647265737360801b6064820152608401610870565b6106bc841115610a875760405162461bcd60e51b815260206004820152602b60248201527f576520617265206e6f7420616363657074696e6720746f6b656e73207061737460448201526a103a34329031baba37b33360a91b6064820152608401610870565b50630a85bd0160e11b95945050505050565b600080610aa560085490565b90506000600e546105db6106bc610abc9190612c8e565b610ac8906106bc612c43565b610ad3906001612c43565b610add9190612c8e565b9050610ae98183612c43565b9250505090565b610b0163604a3070621baf80612c43565b81565b610b0e3382611de6565b610b2a5760405162461bcd60e51b815260040161087090612bbb565b6109a6838383611edd565b6000610b4083611335565b8210610ba25760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610870565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610bf55760405162461bcd60e51b815260040161087090612b86565b6040514790339082156108fc029083906000818181858888f19350505050158015610c24573d6000803e3d6000fd5b5050565b600a546001600160a01b03163314610c525760405162461bcd60e51b815260040161087090612b86565b6002600b541415610c755760405162461bcd60e51b815260040161087090612c0c565b6002600b55610c848282612088565b50506001600b55565b6109a6838383604051806020016040528060008152506118f3565b600a546001600160a01b03163314610cd25760405162461bcd60e51b815260040161087090612b86565b6002600b541415610cf55760405162461bcd60e51b815260040161087090612c0c565b6002600b55610d03816120a2565b506001600b55565b6002600b541415610d2e5760405162461bcd60e51b815260040161087090612c0c565b6002600b55601154610100900460ff1615610d8b5760405162461bcd60e51b815260206004820152601760248201527f436c61696d732068617665206265656e2068616c7465640000000000000000006044820152606401610870565b600a811115610dd25760405162461bcd60e51b81526020600482015260136024820152724d6178206f6620313020617420612074696d6560681b6044820152606401610870565b60008111610e225760405162461bcd60e51b815260206004820152601760248201527f4e65656420746f20636c61696d20736f6d657468696e670000000000000000006044820152606401610870565b610e306105db6106bc612c8e565b610e3c906106bc612c43565b610e47906001612c43565b600e541115610e985760405162461bcd60e51b815260206004820152601c60248201527f416c6c20636c61696d732068617665206265656e2066696c6c65642e000000006044820152606401610870565b610ea66105db6106bc612c8e565b610eb2906106bc612c43565b610ebd906001612c43565b81600e54610ecb9190612c43565b1115610f195760405162461bcd60e51b815260206004820152601960248201527f436c61696d656420657863656564732072657365727665642e000000000000006044820152606401610870565b600c546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381600087803b158015610f5f57600080fd5b505af1158015610f73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f979190612a71565b905060008111610fdd5760405162461bcd60e51b8152602060048201526011602482015270596f75206f776e206e6f20746f6b656e7360781b6044820152606401610870565b8082111561102d5760405162461bcd60e51b815260206004820152601860248201527f436c61696d696e6720746f6f206d616e7920746f6b656e7300000000000000006044820152606401610870565b60005b8281101561121357600c54604051632f745c5960e01b8152336004820152600060248201819052916001600160a01b031690632f745c5990604401602060405180830381600087803b15801561108557600080fd5b505af1158015611099573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110bd9190612a71565b90506106bc8111156110d2575060010161120e565b600e805460010190556110ec63604a3070621baf80612c43565b42101561110d576000818152601260205260409020805460ff191660011790555b6111173382612088565b6105db81111561118e576000600d546106bc6111339190612c43565b600e80546001019055905061114f63604a3070621baf80612c43565b421015611170576000818152601260205260409020805460ff191660011790555b6001600d5461117f9190612c8e565b600d5561118c3382612088565b505b600c54604051635c46a7ef60e11b81523360048201523060248201526044810183905260806064820152600060848201526001600160a01b039091169063b88d4fde9060a401600060405180830381600087803b1580156111ee57600080fd5b505af1158015611202573d6000803e3d6000fd5b50506001909301925050505b611030565b50506001600b5550565b600061122860085490565b821061128b5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610870565b600882815481106112ac57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806107605760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610870565b60006001600160a01b0382166113a05760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610870565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146113e65760405162461bcd60e51b815260040161087090612b86565b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b601054156114805760405162461bcd60e51b815260206004820152601d60248201527f5374617274696e6720696e64657820697320616c7265616479207365740000006044820152606401610870565b600f546114cf5760405162461bcd60e51b815260206004820181905260248201527f5374617274696e6720696e64657820626c6f636b206d757374206265207365746044820152606401610870565b600f546000906114e3906120539040612d27565b905060ff6114f18243612c8e565b111561151357612053611505600143612c8e565b611510919040612d27565b90505b8061152657611523816001612c43565b90505b601055565b6002600b54141561154e5760405162461bcd60e51b815260040161087090612c0c565b6002600b5560115460ff16156115a65760405162461bcd60e51b815260206004820152601860248201527f4d696e74696e6720686173206265656e2068616c7465642e00000000000000006044820152606401610870565b6120536115b1610a99565b106115f75760405162461bcd60e51b815260206004820152601660248201527514d85b19481a185cc8185b1c9958591e48195b99195960521b6044820152606401610870565b600081116116475760405162461bcd60e51b815260206004820152601860248201527f6e756d6265724f664e6674732063616e6e6f74206265203000000000000000006044820152606401610870565b600a8111156116aa5760405162461bcd60e51b815260206004820152602960248201527f596f75206d6179206e6f7420627579206d6f7265207468616e203130204e465460448201526873206174206f6e636560b81b6064820152608401610870565b612053816116b6610a99565b6116c09190612c43565b11156117075760405162461bcd60e51b815260206004820152601660248201527545786365656473204d41585f4e46545f535550504c5960501b6044820152606401610870565b3481611711611bd1565b61171b9190612c6f565b146117685760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610870565b60005b818110156117ce57600061177d610a99565b905061179063604a3070621baf80612c43565b4210156117b1576000818152601260205260409020805460ff191660011790555b6117bb3382612088565b50806117c681612d0c565b91505061176b565b50600f5415801561180157506120536117e5610a99565b148061180157506117fd63604a3070621baf80612c43565b4210155b15610d035743600f55506001600b55565b60606001805461077790612cd1565b6001600160a01b03821633141561187a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610870565b3360008181526005602090815260408083206001600160a01b0387168085529252909120805460ff1916841515179055906001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118e7911515815260200190565b60405180910390a35050565b6118fd3383611de6565b6119195760405162461bcd60e51b815260040161087090612bbb565b61192584848484612149565b50505050565b6000818152600260205260409020546060906001600160a01b03166119aa5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610870565b60006119c160408051602081019091526000815290565b905060008151116119e15760405180602001604052806000815250611a0c565b806119eb8461217c565b6040516020016119fc929190612ab5565b6040516020818303038152906040525b9392505050565b6040518060600160405280602a8152602001612dd7602a913981565b600a546001600160a01b03163314611a595760405162461bcd60e51b815260040161087090612b86565b6011805460ff1916911515919091179055565b604051806060016040528060408152602001612d976040913981565b600a546001600160a01b03163314611ab25760405162461bcd60e51b815260040161087090612b86565b601180549115156101000261ff0019909216919091179055565b611ada6105db6106bc612c8e565b610b01906106bc612c43565b600a546001600160a01b03163314611b105760405162461bcd60e51b815260040161087090612b86565b6001600160a01b038116611b755760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610870565b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b600063604a3070421015611c1e5760405162461bcd60e51b815260206004820152601460248201527314d85b19481a185cc81b9bdd081cdd185c9d195960621b6044820152606401610870565b612053611c29610a99565b10611c6f5760405162461bcd60e51b815260206004820152601660248201527514d85b19481a185cc8185b1c9958591e48195b99195960521b6044820152606401610870565b6000611c79610a99565b905061204e8110611c9557674563918244f400009150506107f8565b61203a8110611caf576729a2241af62c00009150506107f8565b6120088110611cc957670de0b6b3a76400009150506107f8565b611b588110611ce3576706f05b59d3b200009150506107f8565b6111948110611cfd5767058d15e1762800009150506107f8565b6105dc8110611d1757670429d069189e00009150506107f8565b6702c68af0bb1400009150506107f8565b60006001600160e01b031982166380ac58cd60e01b1480611d5957506001600160e01b03198216635b5e139f60e01b145b8061076057506301ffc9a760e01b6001600160e01b0319831614610760565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611dad826112be565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611e5f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610870565b6000611e6a836112be565b9050806001600160a01b0316846001600160a01b03161480611ea55750836001600160a01b0316611e9a846107fb565b6001600160a01b0316145b80611ed557506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611ef0826112be565b6001600160a01b031614611f585760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610870565b6001600160a01b038216611fba5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610870565b611fc5838383612297565b611fd0600082611d78565b6001600160a01b0383166000908152600360205260408120805460019290611ff9908490612c8e565b90915550506001600160a01b0382166000908152600360205260408120805460019290612027908490612c43565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610c24828260405180602001604052806000815250612354565b60006120ad826112be565b90506120bb81600084612297565b6120c6600083611d78565b6001600160a01b03811660009081526003602052604081208054600192906120ef908490612c8e565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b612154848484611edd565b61216084848484612387565b6119255760405162461bcd60e51b815260040161087090612b34565b6060816121a157506040805180820190915260018152600360fc1b6020820152610763565b8160005b81156121cb57806121b581612d0c565b91506121c49050600a83612c5b565b91506121a5565b60008167ffffffffffffffff8111156121f457634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561221e576020820181803683370190505b5090505b8415611ed557612233600183612c8e565b9150612240600a86612d27565b61224b906030612c43565b60f81b81838151811061226e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612290600a86612c5b565b9450612222565b6001600160a01b0383166122f2576122ed81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612315565b816001600160a01b0316836001600160a01b031614612315576123158382612494565b6001600160a01b0382166123315761232c81612531565b6109a6565b826001600160a01b0316826001600160a01b0316146109a6576109a6828261260a565b61235e838361264e565b61236b6000848484612387565b6109a65760405162461bcd60e51b815260040161087090612b34565b60006001600160a01b0384163b1561248957604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906123cb903390899088908890600401612ae4565b602060405180830381600087803b1580156123e557600080fd5b505af1925050508015612415575060408051601f3d908101601f1916820190925261241291810190612a3d565b60015b61246f573d808015612443576040519150601f19603f3d011682016040523d82523d6000602084013e612448565b606091505b5080516124675760405162461bcd60e51b815260040161087090612b34565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611ed5565b506001949350505050565b600060016124a184611335565b6124ab9190612c8e565b6000838152600760205260409020549091508082146124fe576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061254390600190612c8e565b6000838152600960205260408120546008805493945090928490811061257957634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080600883815481106125a857634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806125ee57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061261583611335565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166126a45760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610870565b6000818152600260205260409020546001600160a01b0316156127095760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610870565b61271560008383612297565b6001600160a01b038216600090815260036020526040812080546001929061273e908490612c43565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b80356001600160a01b038116811461076357600080fd5b8035801515811461076357600080fd5b6000602082840312156127d4578081fd5b611a0c8261279c565b600080604083850312156127ef578081fd5b6127f88361279c565b91506128066020840161279c565b90509250929050565b600080600060608486031215612823578081fd5b61282c8461279c565b925061283a6020850161279c565b9150604084013590509250925092565b600080600080600060808688031215612861578081fd5b61286a8661279c565b94506128786020870161279c565b935060408601359250606086013567ffffffffffffffff8082111561289b578283fd5b818801915088601f8301126128ae578283fd5b8135818111156128bc578384fd5b8960208285010111156128cd578384fd5b9699959850939650602001949392505050565b600080600080608085870312156128f5578384fd5b6128fe8561279c565b935061290c6020860161279c565b925060408501359150606085013567ffffffffffffffff8082111561292f578283fd5b818701915087601f830112612942578283fd5b81358181111561295457612954612d67565b604051601f8201601f19908116603f0116810190838211818310171561297c5761297c612d67565b816040528281528a6020848701011115612994578586fd5b82602086016020830137918201602001949094529598949750929550505050565b600080604083850312156129c7578182fd5b6129d08361279c565b9150612806602084016127b3565b600080604083850312156129f0578182fd5b6129f98361279c565b946020939093013593505050565b600060208284031215612a18578081fd5b611a0c826127b3565b600060208284031215612a32578081fd5b8135611a0c81612d7d565b600060208284031215612a4e578081fd5b8151611a0c81612d7d565b600060208284031215612a6a578081fd5b5035919050565b600060208284031215612a82578081fd5b5051919050565b60008151808452612aa1816020860160208601612ca5565b601f01601f19169290920160200192915050565b60008351612ac7818460208801612ca5565b835190830190612adb818360208801612ca5565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b1790830184612a89565b9695505050505050565b600060208252611a0c6020830184612a89565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60008219821115612c5657612c56612d3b565b500190565b600082612c6a57612c6a612d51565b500490565b6000816000190483118215151615612c8957612c89612d3b565b500290565b600082821015612ca057612ca0612d3b565b500390565b60005b83811015612cc0578181015183820152602001612ca8565b838111156119255750506000910152565b600281046001821680612ce557607f821691505b60208210811415612d0657634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612d2057612d20612d3b565b5060010190565b600082612d3657612d36612d51565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114612d9357600080fd5b5056fe35316161623961333061363466306231663833323563636661376538306362636332306239646261623462346536373635633365353137386535303764323130307844633331653438623636413133363442466561393232626663323937324142354332383646396665a2646970667358221220c0c1cdcdd0a532dc4fbd947a8e01897f105d98c5644538cea1e6fb0be682250164736f6c63430008020033

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

000000000000000000000000dc31e48b66a1364bfea922bfc2972ab5c286f9fe

-----Decoded View---------------
Arg [0] : previous (address): 0xDc31e48b66A1364BFea922bfc2972AB5C286F9fe

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000dc31e48b66a1364bfea922bfc2972ab5c286f9fe


Deployed Bytecode Sourcemap

542:10061:14:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;909:234:4;;;;;;;;;;-1:-1:-1;909:234:4;;;;;:::i;:::-;;:::i;:::-;;;7331:14:15;;7324:22;7306:41;;7294:2;7279:18;909:234:4;;;;;;;;2377:98:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3796:217::-;;;;;;;;;;-1:-1:-1;3796:217:3;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;5779:32:15;;;5761:51;;5749:2;5734:18;3796:217:3;5716:102:15;3340:395:3;;;;;;;;;;-1:-1:-1;3340:395:3;;;;;:::i;:::-;;:::i;:::-;;1546:32:14;;;;;;;;;;;;;;;;;;;22376:25:15;;;22364:2;22349:18;1546:32:14;22331:76:15;3436:389:14;;;;;;;;;;-1:-1:-1;3436:389:14;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;;7520:33:15;;;7502:52;;7490:2;7475:18;3436:389:14;7457:103:15;3055:253:14;;;;;;;;;;;;;:::i;1979:79::-;;;;;;;;;;;;;:::i;4660:300:3:-;;;;;;;;;;-1:-1:-1;4660:300:3;;;;;:::i;:::-;;:::i;1222:253:4:-;;;;;;;;;;-1:-1:-1;1222:253:4;;;;;:::i;:::-;;:::i;10217:137:14:-;;;;;;;;;;;;;:::i;9831:104::-;;;;;;;;;;-1:-1:-1;9831:104:14;;;;;:::i;:::-;;:::i;5026:149:3:-;;;;;;;;;;-1:-1:-1;5026:149:3;;;;;:::i;:::-;;:::i;10042:84:14:-;;;;;;;;;;-1:-1:-1;10042:84:14;;;;;:::i;:::-;;:::i;3835:2701::-;;;;;;;;;;-1:-1:-1;3835:2701:14;;;;;:::i;:::-;;:::i;1729:230:4:-;;;;;;;;;;-1:-1:-1;1729:230:4;;;;;:::i;:::-;;:::i;2080:235:3:-;;;;;;;;;;-1:-1:-1;2080:235:3;;;;;:::i;:::-;;:::i;1051:56:14:-;;;;;;;;;;;;1103:4;1051:56;;1818:205:3;;;;;;;;;;-1:-1:-1;1818:205:3;;;;;:::i;:::-;;:::i;1693:145:10:-;;;;;;;;;;;;;:::i;9197:527:14:-;;;;;;;;;;;;;:::i;1061:85:10:-;;;;;;;;;;-1:-1:-1;1133:6:10;;-1:-1:-1;;;;;1133:6:10;1061:85;;7962:1145:14;;;;;;:::i;:::-;;:::i;1819:57::-;;;;;;;;;;;;1866:10;1819:57;;2539:102:3;;;;;;;;;;;;;:::i;4080:290::-;;;;;;;;;;-1:-1:-1;4080:290:3;;;;;:::i;:::-;;:::i;2065:45:14:-;;;;;;;;;;;;2106:4;2065:45;;5241:282:3;;;;;;;;;;-1:-1:-1;5241:282:3;;;;;:::i;:::-;;:::i;942:45:14:-;;;;;;;;;;;;983:4;942:45;;6625:122;;;;;;;;;;-1:-1:-1;6625:122:14;;;;;:::i;:::-;6691:4;6714:26;;;:19;:26;;;;;;;;;6625:122;2707:353:3;;;;;;;;;;-1:-1:-1;2707:353:3;;;;;:::i;:::-;;:::i;2157:28:14:-;;;;;;;;;;;;;;;;794:92;;;;;;;;;;;;;:::i;10401:76::-;;;;;;;;;;-1:-1:-1;10401:76:14;;;;;:::i;:::-;;:::i;1654:115::-;;;;;;;;;;;;;:::i;2117:33::-;;;;;;;;;;;;;;;;10523:78;;;;;;;;;;-1:-1:-1;10523:78:14;;;;;:::i;:::-;;:::i;4436:162:3:-;;;;;;;;;;-1:-1:-1;4436:162:3;;;;;:::i;:::-;-1:-1:-1;;;;;4556:25:3;;;4533:4;4556:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4436:162;1195:105:14;;;;;;;;;;;;;:::i;1987:240:10:-;;;;;;;;;;-1:-1:-1;1987:240:10;;;;;:::i;:::-;;:::i;6810:980:14:-;;;;;;;;;;;;;:::i;909:234:4:-;1011:4;-1:-1:-1;;;;;;1034:50:4;;-1:-1:-1;;;1034:50:4;;:102;;;1100:36;1124:11;1100:23;:36::i;:::-;1027:109;;909:234;;;;:::o;2377:98:3:-;2431:13;2463:5;2456:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2377:98;;:::o;3796:217::-;3872:7;7045:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7045:16:3;3891:73;;;;-1:-1:-1;;;3891:73:3;;15549:2:15;3891:73:3;;;15531:21:15;15588:2;15568:18;;;15561:30;15627:34;15607:18;;;15600:62;-1:-1:-1;;;15678:18:15;;;15671:42;15730:19;;3891:73:3;;;;;;;;;-1:-1:-1;3982:24:3;;;;:15;:24;;;;;;-1:-1:-1;;;;;3982:24:3;;3796:217::o;3340:395::-;3420:13;3436:23;3451:7;3436:14;:23::i;:::-;3420:39;;3483:5;-1:-1:-1;;;;;3477:11:3;:2;-1:-1:-1;;;;;3477:11:3;;;3469:57;;;;-1:-1:-1;;;3469:57:3;;18324:2:15;3469:57:3;;;18306:21:15;18363:2;18343:18;;;18336:30;18402:34;18382:18;;;18375:62;-1:-1:-1;;;18453:18:15;;;18446:31;18494:19;;3469:57:3;18296:223:15;3469:57:3;665:10:1;-1:-1:-1;;;;;3545:21:3;;;;:69;;-1:-1:-1;3570:44:3;3594:5;665:10:1;3601:12:3;586:96:1;3570:44:3;3537:159;;;;-1:-1:-1;;;3537:159:3;;13239:2:15;3537:159:3;;;13221:21:15;13278:2;13258:18;;;13251:30;13317:34;13297:18;;;13290:62;13388:26;13368:18;;;13361:54;13432:19;;3537:159:3;13211:246:15;3537:159:3;3707:21;3716:2;3720:7;3707:8;:21::i;:::-;3340:395;;;:::o;3436:389:14:-;3590:17;;3538:6;;-1:-1:-1;;;;;3590:17:14;3568:10;:40;3560:101;;;;-1:-1:-1;;;3560:101:14;;16671:2:15;3560:101:14;;;16653:21:15;16710:2;16690:18;;;16683:30;16749:34;16729:18;;;16722:62;-1:-1:-1;;;16800:18:15;;;16793:46;16856:19;;3560:101:14;16643:238:15;3560:101:14;983:4;3683:7;:25;;3675:81;;;;-1:-1:-1;;;3675:81:14;;20209:2:15;3675:81:14;;;20191:21:15;20248:2;20228:18;;;20221:30;20287:34;20267:18;;;20260:62;-1:-1:-1;;;20338:18:15;;;20331:41;20389:19;;3675:81:14;20181:233:15;3675:81:14;-1:-1:-1;;;;3436:389:14;;;;;;;:::o;3055:253::-;3108:7;3127:14;3144:19;1633:10:4;:17;1546:111;;3144:19:14;3127:36;;3173:24;3226:13;;1103:4;983;1257:42;;;;:::i;:::-;1239:61;;983:4;1239:61;:::i;:::-;3201:21;;3221:1;3201:21;:::i;:::-;3200:39;;;;:::i;:::-;3173:66;-1:-1:-1;3256:25:14;3173:66;3256:6;:25;:::i;:::-;3249:32;;;;3055:253;:::o;1979:79::-;2022:36;1866:10;2046:11;2022:36;:::i;:::-;1979:79;:::o;4660:300:3:-;4819:41;665:10:1;4852:7:3;4819:18;:41::i;:::-;4811:103;;;;-1:-1:-1;;;4811:103:3;;;;;;;:::i;:::-;4925:28;4935:4;4941:2;4945:7;4925:9;:28::i;1222:253:4:-;1319:7;1354:23;1371:5;1354:16;:23::i;:::-;1346:5;:31;1338:87;;;;-1:-1:-1;;;1338:87:4;;7991:2:15;1338:87:4;;;7973:21:15;8030:2;8010:18;;;8003:30;8069:34;8049:18;;;8042:62;-1:-1:-1;;;8120:18:15;;;8113:41;8171:19;;1338:87:4;7963:233:15;1338:87:4;-1:-1:-1;;;;;;1442:19:4;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1222:253::o;10217:137:14:-;1133:6:10;;-1:-1:-1;;;;;1133:6:10;665:10:1;1273:23:10;1265:68;;;;-1:-1:-1;;;1265:68:10;;;;;;;:::i;:::-;10310:37:14::1;::::0;10279:21:::1;::::0;10318:10:::1;::::0;10310:37;::::1;;;::::0;10279:21;;10264:12:::1;10310:37:::0;10264:12;10310:37;10279:21;10318:10;10310:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;1343:1:10;10217:137:14:o:0;9831:104::-;1133:6:10;;-1:-1:-1;;;;;1133:6:10;665:10:1;1273:23:10;1265:68;;;;-1:-1:-1;;;1265:68:10;;;;;;;:::i;:::-;1680:1:11::1;2260:7;;:19;;2252:63;;;;-1:-1:-1::0;;;2252:63:11::1;;;;;;;:::i;:::-;1680:1;2390:7;:18:::0;9910::14::2;9920:2:::0;9924:3;9910:9:::2;:18::i;:::-;-1:-1:-1::0;;1637:1:11::1;2563:7;:22:::0;9831:104:14:o;5026:149:3:-;5129:39;5146:4;5152:2;5156:7;5129:39;;;;;;;;;;;;:16;:39::i;10042:84:14:-;1133:6:10;;-1:-1:-1;;;;;1133:6:10;665:10:1;1273:23:10;1265:68;;;;-1:-1:-1;;;1265:68:10;;;;;;;:::i;:::-;1680:1:11::1;2260:7;;:19;;2252:63;;;;-1:-1:-1::0;;;2252:63:11::1;;;;;;;:::i;:::-;1680:1;2390:7;:18:::0;10109:10:14::2;10115:3:::0;10109:5:::2;:10::i;:::-;-1:-1:-1::0;1637:1:11::1;2563:7;:22:::0;10042:84:14:o;3835:2701::-;1680:1:11;2260:7;;:19;;2252:63;;;;-1:-1:-1;;;2252:63:11;;;;;;;:::i;:::-;1680:1;2390:7;:18;3918:10:14::1;::::0;::::1;::::0;::::1;;;:19;3910:55;;;::::0;-1:-1:-1;;;3910:55:14;;21371:2:15;3910:55:14::1;::::0;::::1;21353:21:15::0;21410:2;21390:18;;;21383:30;21449:25;21429:18;;;21422:53;21492:18;;3910:55:14::1;21343:173:15::0;3910:55:14::1;3999:2;3983:12;:18;;3975:50;;;::::0;-1:-1:-1;;;3975:50:14;;15962:2:15;3975:50:14::1;::::0;::::1;15944:21:15::0;16001:2;15981:18;;;15974:30;-1:-1:-1;;;16020:18:15;;;16013:49;16079:18;;3975:50:14::1;15934:169:15::0;3975:50:14::1;4058:1;4043:12;:16;4035:52;;;::::0;-1:-1:-1;;;4035:52:14;;10291:2:15;4035:52:14::1;::::0;::::1;10273:21:15::0;10330:2;10310:18;;;10303:30;10369:25;10349:18;;;10342:53;10412:18;;4035:52:14::1;10263:173:15::0;4035:52:14::1;1257:42;1103:4;983;1257:42;:::i;:::-;1239:61;::::0;983:4:::1;1239:61;:::i;:::-;4124:19;::::0;4142:1:::1;4124:19;:::i;:::-;4106:13;;:38;;4098:79;;;::::0;-1:-1:-1;;;4098:79:14;;14485:2:15;4098:79:14::1;::::0;::::1;14467:21:15::0;14524:2;14504:18;;;14497:30;14563;14543:18;;;14536:58;14611:18;;4098:79:14::1;14457:178:15::0;4098:79:14::1;1257:42;1103:4;983;1257:42;:::i;:::-;1239:61;::::0;983:4:::1;1239:61;:::i;:::-;4231:19;::::0;4249:1:::1;4231:19;:::i;:::-;4213:12;4197:13;;:28;;;;:::i;:::-;4196:55;;4188:93;;;::::0;-1:-1:-1;;;4188:93:14;;9229:2:15;4188:93:14::1;::::0;::::1;9211:21:15::0;9268:2;9248:18;;;9241:30;9307:27;9287:18;;;9280:55;9352:18;;4188:93:14::1;9201:175:15::0;4188:93:14::1;4318:17;::::0;:39:::1;::::0;-1:-1:-1;;;4318:39:14;;4346:10:::1;4318:39;::::0;::::1;5761:51:15::0;4300:15:14::1;::::0;-1:-1:-1;;;;;4318:17:14::1;::::0;:27:::1;::::0;5734:18:15;;4318:39:14::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4300:57;;4385:1;4375:7;:11;4367:41;;;::::0;-1:-1:-1;;;4367:41:14;;15203:2:15;4367:41:14::1;::::0;::::1;15185:21:15::0;15242:2;15222:18;;;15215:30;-1:-1:-1;;;15261:18:15;;;15254:47;15318:18;;4367:41:14::1;15175:167:15::0;4367:41:14::1;4442:7;4426:12;:23;;4418:60;;;::::0;-1:-1:-1;;;4418:60:14;;12528:2:15;4418:60:14::1;::::0;::::1;12510:21:15::0;12567:2;12547:18;;;12540:30;12606:26;12586:18;;;12579:54;12650:18;;4418:60:14::1;12500:174:15::0;4418:60:14::1;4494:6;4489:2041;4510:12;4506:1;:16;4489:2041;;;4735:17;::::0;:52:::1;::::0;-1:-1:-1;;;4735:52:14;;4773:10:::1;4735:52;::::0;::::1;7061:51:15::0;4717:15:14::1;7128:18:15::0;;;7121:34;;;4717:15:14;-1:-1:-1;;;;;4735:17:14::1;::::0;:37:::1;::::0;7034:18:15;;4735:52:14::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4717:70;;983:4;5028:7;:24;5024:103;;;-1:-1:-1::0;5082:3:14::1;;5104:8;;5024:103;5234:13;::::0;;5250:1:::1;5234:17;5218:33:::0;;2022:36:::1;1866:10;2046:11;2022:36;:::i;:::-;5288:15;:34;5284:108;;;5342:28;::::0;;;:19:::1;:28;::::0;;;;:35;;-1:-1:-1;;5342:35:14::1;5373:4;5342:35;::::0;;5284:108:::1;5405:30;5415:10;5427:7;5405:9;:30::i;:::-;1103:4;5601:7;:35;5597:638;;;5784:17;5821:16;;983:4;5804:33;;;;:::i;:::-;5881:13;::::0;;5897:1:::1;5881:17;5865:33:::0;;5784:53;-1:-1:-1;2022:36:14::1;1866:10;2046:11;2022:36;:::i;:::-;5938:15;:34;5934:118;;;5996:30;::::0;;;:19:::1;:30;::::0;;;;:37;;-1:-1:-1;;5996:37:14::1;6029:4;5996:37;::::0;;5934:118:::1;6107:1;6088:16;;:20;;;;:::i;:::-;6069:16;:39:::0;6188:32:::1;6198:10;6210:9;6188;:32::i;:::-;5597:638;;6399:17;::::0;:74:::1;::::0;-1:-1:-1;;;6399:74:14;;6434:10:::1;6399:74;::::0;::::1;6621:34:15::0;6454:4:14::1;6671:18:15::0;;;6664:43;6723:18;;;6716:34;;;6786:3;6766:18;;;6759:31;-1:-1:-1;6806:19:15;;;6799:33;-1:-1:-1;;;;;6399:17:14;;::::1;::::0;:34:::1;::::0;6849:19:15;;6399:74:14::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;6498:3:14::1;::::0;;::::1;::::0;-1:-1:-1;;;4489:2041:14::1;;;;-1:-1:-1::0;;1637:1:11;2563:7;:22;-1:-1:-1;3835:2701:14:o;1729:230:4:-;1804:7;1839:30;1633:10;:17;1546:111;;1839:30;1831:5;:38;1823:95;;;;-1:-1:-1;;;1823:95:4;;20958:2:15;1823:95:4;;;20940:21:15;20997:2;20977:18;;;20970:30;21036:34;21016:18;;;21009:62;-1:-1:-1;;;21087:18:15;;;21080:42;21139:19;;1823:95:4;20930:234:15;1823:95:4;1935:10;1946:5;1935:17;;;;;;-1:-1:-1;;;1935:17:4;;;;;;;;;;;;;;;;;1928:24;;1729:230;;;:::o;2080:235:3:-;2152:7;2187:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2187:16:3;2221:19;2213:73;;;;-1:-1:-1;;;2213:73:3;;14075:2:15;2213:73:3;;;14057:21:15;14114:2;14094:18;;;14087:30;14153:34;14133:18;;;14126:62;-1:-1:-1;;;14204:18:15;;;14197:39;14253:19;;2213:73:3;14047:231:15;1818:205:3;1890:7;-1:-1:-1;;;;;1917:19:3;;1909:74;;;;-1:-1:-1;;;1909:74:3;;13664:2:15;1909:74:3;;;13646:21:15;13703:2;13683:18;;;13676:30;13742:34;13722:18;;;13715:62;-1:-1:-1;;;13793:18:15;;;13786:40;13843:19;;1909:74:3;13636:232:15;1909:74:3;-1:-1:-1;;;;;;2000:16:3;;;;;:9;:16;;;;;;;1818:205::o;1693:145:10:-;1133:6;;-1:-1:-1;;;;;1133:6:10;665:10:1;1273:23:10;1265:68;;;;-1:-1:-1;;;1265:68:10;;;;;;;:::i;:::-;1783:6:::1;::::0;1762:40:::1;::::0;1799:1:::1;::::0;-1:-1:-1;;;;;1783:6:10::1;::::0;1762:40:::1;::::0;1799:1;;1762:40:::1;1812:6;:19:::0;;-1:-1:-1;;;;;;1812:19:10::1;::::0;;1693:145::o;9197:527:14:-;9255:13;;:18;9247:60;;;;-1:-1:-1;;;9247:60:14;;12881:2:15;9247:60:14;;;12863:21:15;12920:2;12900:18;;;12893:30;12959:31;12939:18;;;12932:59;13008:18;;9247:60:14;12853:179:15;9247:60:14;9325:18;;9317:68;;;;-1:-1:-1;;;9317:68:14;;19430:2:15;9317:68:14;;;19412:21:15;;;19449:18;;;19442:30;19508:34;19488:18;;;19481:62;19560:18;;9317:68:14;19402:182:15;9317:68:14;9440:18;;9405:14;;9422:55;;2106:4;;9430:29;9422:55;:::i;:::-;9405:72;-1:-1:-1;9517:3:14;9492:21;9405:72;9492:12;:21;:::i;:::-;9491:29;9487:120;;;2106:4;9563:14;9576:1;9563:12;:14;:::i;:::-;9545:51;;;9553:25;9545:51;:::i;:::-;9536:60;;9487:120;9620:11;9616:61;;9656:10;:6;9665:1;9656:10;:::i;:::-;9647:19;;9616:61;9695:13;:22;9197:527::o;7962:1145::-;1680:1:11;2260:7;;:19;;2252:63;;;;-1:-1:-1;;;2252:63:11;;;;;;;:::i;:::-;1680:1;2390:7;:18;8047:9:14::1;::::0;::::1;;:18;8039:55;;;::::0;-1:-1:-1;;;8039:55:14;;10643:2:15;8039:55:14::1;::::0;::::1;10625:21:15::0;10682:2;10662:18;;;10655:30;10721:26;10701:18;;;10694:54;10765:18;;8039:55:14::1;10615:174:15::0;8039:55:14::1;2106:4;8112:13;:11;:13::i;:::-;:30;8104:65;;;::::0;-1:-1:-1;;;8104:65:14;;18726:2:15;8104:65:14::1;::::0;::::1;18708:21:15::0;18765:2;18745:18;;;18738:30;-1:-1:-1;;;18784:18:15;;;18777:52;18846:18;;8104:65:14::1;18698:172:15::0;8104:65:14::1;8202:1;8187:12;:16;8179:53;;;::::0;-1:-1:-1;;;8179:53:14;;19077:2:15;8179:53:14::1;::::0;::::1;19059:21:15::0;19116:2;19096:18;;;19089:30;19155:26;19135:18;;;19128:54;19199:18;;8179:53:14::1;19049:174:15::0;8179:53:14::1;8266:2;8250:12;:18;;8242:72;;;::::0;-1:-1:-1;;;8242:72:14;;17914:2:15;8242:72:14::1;::::0;::::1;17896:21:15::0;17953:2;17933:18;;;17926:30;17992:34;17972:18;;;17965:62;-1:-1:-1;;;18043:18:15;;;18036:39;18092:19;;8242:72:14::1;17886:231:15::0;8242:72:14::1;2106:4;8349:12;8333:13;:11;:13::i;:::-;:28;;;;:::i;:::-;8332:48;;8324:83;;;::::0;-1:-1:-1;;;8324:83:14;;9940:2:15;8324:83:14::1;::::0;::::1;9922:21:15::0;9979:2;9959:18;;;9952:30;-1:-1:-1;;;9998:18:15;;;9991:52;10060:18;;8324:83:14::1;9912:172:15::0;8324:83:14::1;8459:9;8442:12;8426:13;:11;:13::i;:::-;:28;;;;:::i;:::-;8425:43;8417:87;;;::::0;-1:-1:-1;;;8417:87:14;;11755:2:15;8417:87:14::1;::::0;::::1;11737:21:15::0;11794:2;11774:18;;;11767:30;11833:33;11813:18;;;11806:61;11884:18;;8417:87:14::1;11727:181:15::0;8417:87:14::1;8520:6;8515:268;8536:12;8532:1;:16;8515:268;;;8569:17;8589:13;:11;:13::i;:::-;8569:33:::0;-1:-1:-1;2022:36:14::1;1866:10;2046:11;2022:36;:::i;:::-;8621:15;:34;8617:110;;;8675:30;::::0;;;:19:::1;:30;::::0;;;;:37;;-1:-1:-1;;8675:37:14::1;8708:4;8675:37;::::0;;8617:110:::1;8740:32;8750:10;8762:9;8740;:32::i;:::-;-1:-1:-1::0;8550:3:14;::::1;::::0;::::1;:::i;:::-;;;;8515:268;;;-1:-1:-1::0;8942:18:14::1;::::0;:23;:99;::::1;;;;2106:4;8970:13;:11;:13::i;:::-;:31;:70;;;-1:-1:-1::0;2022:36:14::1;1866:10;2046:11;2022:36;:::i;:::-;9005:15;:35;;8970:70;8938:163;;;9078:12;9057:18;:33:::0;-1:-1:-1;1637:1:11;2563:7;:22;7962:1145:14:o;2539:102:3:-;2595:13;2627:7;2620:14;;;;;:::i;4080:290::-;-1:-1:-1;;;;;4182:24:3;;665:10:1;4182:24:3;;4174:62;;;;-1:-1:-1;;;4174:62:3;;11401:2:15;4174:62:3;;;11383:21:15;11440:2;11420:18;;;11413:30;11479:27;11459:18;;;11452:55;11524:18;;4174:62:3;11373:175:15;4174:62:3;665:10:1;4247:32:3;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;4247:42:3;;;;;;;;;;:53;;-1:-1:-1;;4247:53:3;;;;;;;:42;-1:-1:-1;;;;;4315:48:3;;4354:8;4315:48;;;;7331:14:15;7324:22;7306:41;;7294:2;7279:18;;7261:92;4315:48:3;;;;;;;;4080:290;;:::o;5241:282::-;5372:41;665:10:1;5405:7:3;5372:18;:41::i;:::-;5364:103;;;;-1:-1:-1;;;5364:103:3;;;;;;;:::i;:::-;5477:39;5491:4;5497:2;5501:7;5510:5;5477:13;:39::i;:::-;5241:282;;;;:::o;2707:353::-;7022:4;7045:16;;;:7;:16;;;;;;2780:13;;-1:-1:-1;;;;;7045:16:3;2805:76;;;;-1:-1:-1;;;2805:76:3;;17498:2:15;2805:76:3;;;17480:21:15;17537:2;17517:18;;;17510:30;17576:34;17556:18;;;17549:62;-1:-1:-1;;;17627:18:15;;;17620:45;17682:19;;2805:76:3;17470:237:15;2805:76:3;2892:21;2916:10;3267:9;;;;;;;;;-1:-1:-1;3267:9:3;;3191:92;;2916:10;2892:34;;2967:1;2949:7;2943:21;:25;:110;;;;;;;;;;;;;;;;;3007:7;3016:18;:7;:16;:18::i;:::-;2990:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2943:110;2936:117;2707:353;-1:-1:-1;;;2707:353:3:o;794:92:14:-;;;;;;;;;;;;;;;;;;;:::o;10401:76::-;1133:6:10;;-1:-1:-1;;;;;1133:6:10;665:10:1;1273:23:10;1265:68;;;;-1:-1:-1;;;1265:68:10;;;;;;;:::i;:::-;10457:9:14::1;:13:::0;;-1:-1:-1;;10457:13:14::1;::::0;::::1;;::::0;;;::::1;::::0;;10401:76::o;1654:115::-;;;;;;;;;;;;;;;;;;;:::o;10523:78::-;1133:6:10;;-1:-1:-1;;;;;1133:6:10;665:10:1;1273:23:10;1265:68;;;;-1:-1:-1;;;1265:68:10;;;;;;;:::i;:::-;10580:10:14::1;:14:::0;;;::::1;;;;-1:-1:-1::0;;10580:14:14;;::::1;::::0;;;::::1;::::0;;10523:78::o;1195:105::-;1257:42;1103:4;983;1257:42;:::i;:::-;1239:61;;983:4;1239:61;:::i;1987:240:10:-;1133:6;;-1:-1:-1;;;;;1133:6:10;665:10:1;1273:23:10;1265:68;;;;-1:-1:-1;;;1265:68:10;;;;;;;:::i;:::-;-1:-1:-1;;;;;2075:22:10;::::1;2067:73;;;::::0;-1:-1:-1;;;2067:73:10;;8822:2:15;2067:73:10::1;::::0;::::1;8804:21:15::0;8861:2;8841:18;;;8834:30;8900:34;8880:18;;;8873:62;-1:-1:-1;;;8951:18:15;;;8944:36;8997:19;;2067:73:10::1;8794:228:15::0;2067:73:10::1;2176:6;::::0;2155:38:::1;::::0;-1:-1:-1;;;;;2155:38:10;;::::1;::::0;2176:6:::1;::::0;2155:38:::1;::::0;2176:6:::1;::::0;2155:38:::1;2203:6;:17:::0;;-1:-1:-1;;;;;;2203:17:10::1;-1:-1:-1::0;;;;;2203:17:10;;;::::1;::::0;;;::::1;::::0;;1987:240::o;6810:980:14:-;6854:7;1866:10;6881:15;:39;;6873:72;;;;-1:-1:-1;;;6873:72:14;;21723:2:15;6873:72:14;;;21705:21:15;21762:2;21742:18;;;21735:30;-1:-1:-1;;;21781:18:15;;;21774:50;21841:18;;6873:72:14;21695:170:15;6873:72:14;2106:4;6963:13;:11;:13::i;:::-;:30;6955:65;;;;-1:-1:-1;;;6955:65:14;;18726:2:15;6955:65:14;;;18708:21:15;18765:2;18745:18;;;18738:30;-1:-1:-1;;;18784:18:15;;;18777:52;18846:18;;6955:65:14;18698:172:15;6955:65:14;7031:21;7055:13;:11;:13::i;:::-;7031:37;;7099:4;7082:13;:21;7078:706;;7126:19;7119:26;;;;;7078:706;7204:4;7187:13;:21;7183:601;;7231:19;7224:26;;;;;7183:601;7309:4;7292:13;:21;7288:496;;7336:19;7329:26;;;;;7288:496;7416:4;7399:13;:21;7395:389;;7443:18;7436:25;;;;;7395:389;7522:4;7505:13;:21;7501:283;;7549:18;7542:25;;;;;7501:283;7628:4;7611:13;:21;7607:177;;7655:18;7648:25;;;;;7607:177;7734:18;7727:25;;;;;1471:288:3;1573:4;-1:-1:-1;;;;;;1596:40:3;;-1:-1:-1;;;1596:40:3;;:104;;-1:-1:-1;;;;;;;1652:48:3;;-1:-1:-1;;;1652:48:3;1596:104;:156;;;-1:-1:-1;;;;;;;;;;871:40:2;;;1716:36:3;763:155:2;10722:171:3;10796:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;10796:29:3;-1:-1:-1;;;;;10796:29:3;;;;;;;;:24;;10849:23;10796:24;10849:14;:23::i;:::-;-1:-1:-1;;;;;10840:46:3;;;;;;;;;;;10722:171;;:::o;7240:351::-;7333:4;7045:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7045:16:3;7349:73;;;;-1:-1:-1;;;7349:73:3;;12115:2:15;7349:73:3;;;12097:21:15;12154:2;12134:18;;;12127:30;12193:34;12173:18;;;12166:62;-1:-1:-1;;;12244:18:15;;;12237:42;12296:19;;7349:73:3;12087:234:15;7349:73:3;7432:13;7448:23;7463:7;7448:14;:23::i;:::-;7432:39;;7500:5;-1:-1:-1;;;;;7489:16:3;:7;-1:-1:-1;;;;;7489:16:3;;:51;;;;7533:7;-1:-1:-1;;;;;7509:31:3;:20;7521:7;7509:11;:20::i;:::-;-1:-1:-1;;;;;7509:31:3;;7489:51;:94;;;-1:-1:-1;;;;;;4556:25:3;;;4533:4;4556:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;7544:39;7481:103;7240:351;-1:-1:-1;;;;7240:351:3:o;10081:530::-;10205:4;-1:-1:-1;;;;;10178:31:3;:23;10193:7;10178:14;:23::i;:::-;-1:-1:-1;;;;;10178:31:3;;10170:85;;;;-1:-1:-1;;;10170:85:3;;17088:2:15;10170:85:3;;;17070:21:15;17127:2;17107:18;;;17100:30;17166:34;17146:18;;;17139:62;-1:-1:-1;;;17217:18:15;;;17210:39;17266:19;;10170:85:3;17060:231:15;10170:85:3;-1:-1:-1;;;;;10273:16:3;;10265:65;;;;-1:-1:-1;;;10265:65:3;;10996:2:15;10265:65:3;;;10978:21:15;11035:2;11015:18;;;11008:30;11074:34;11054:18;;;11047:62;-1:-1:-1;;;11125:18:15;;;11118:34;11169:19;;10265:65:3;10968:226:15;10265:65:3;10341:39;10362:4;10368:2;10372:7;10341:20;:39::i;:::-;10442:29;10459:1;10463:7;10442:8;:29::i;:::-;-1:-1:-1;;;;;10482:15:3;;;;;;:9;:15;;;;;:20;;10501:1;;10482:15;:20;;10501:1;;10482:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10512:13:3;;;;;;:9;:13;;;;;:18;;10529:1;;10512:13;:18;;10529:1;;10512:18;:::i;:::-;;;;-1:-1:-1;;10540:16:3;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10540:21:3;-1:-1:-1;;;;;10540:21:3;;;;;;;;;10577:27;;10540:16;;10577:27;;;;;;;10081:530;;;:::o;7922:108::-;7997:26;8007:2;8011:7;7997:26;;;;;;;;;;;;:9;:26::i;9409:348::-;9468:13;9484:23;9499:7;9484:14;:23::i;:::-;9468:39;;9518:48;9539:5;9554:1;9558:7;9518:20;:48::i;:::-;9604:29;9621:1;9625:7;9604:8;:29::i;:::-;-1:-1:-1;;;;;9644:16:3;;;;;;:9;:16;;;;;:21;;9664:1;;9644:16;:21;;9664:1;;9644:21;:::i;:::-;;;;-1:-1:-1;;9682:16:3;;;;:7;:16;;;;;;9675:23;;-1:-1:-1;;;;;;9675:23:3;;;9714:36;9690:7;;9682:16;-1:-1:-1;;;;;9714:36:3;;;;;9682:16;;9714:36;9409:348;;:::o;6385:269::-;6498:28;6508:4;6514:2;6518:7;6498:9;:28::i;:::-;6544:48;6567:4;6573:2;6577:7;6586:5;6544:22;:48::i;:::-;6536:111;;;;-1:-1:-1;;;6536:111:3;;;;;;;:::i;271:703:13:-;327:13;544:10;540:51;;-1:-1:-1;570:10:13;;;;;;;;;;;;-1:-1:-1;;;570:10:13;;;;;;540:51;615:5;600:12;654:75;661:9;;654:75;;686:8;;;;:::i;:::-;;-1:-1:-1;708:10:13;;-1:-1:-1;716:2:13;708:10;;:::i;:::-;;;654:75;;;738:19;770:6;760:17;;;;;;-1:-1:-1;;;760:17:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;760:17:13;;738:39;;787:150;794:10;;787:150;;820:11;830:1;820:11;;:::i;:::-;;-1:-1:-1;888:10:13;896:2;888:5;:10;:::i;:::-;875:24;;:2;:24;:::i;:::-;862:39;;845:6;852;845:14;;;;;;-1:-1:-1;;;845:14:13;;;;;;;;;;;;:56;-1:-1:-1;;;;;845:56:13;;;;;;;;-1:-1:-1;915:11:13;924:2;915:11;;:::i;:::-;;;787:150;;2555:542:4;-1:-1:-1;;;;;2724:18:4;;2720:183;;2758:40;2790:7;3906:10;:17;;3879:24;;;;:15;:24;;;;;:44;;;3933:24;;;;;;;;;;;;3803:161;2758:40;2720:183;;;2827:2;-1:-1:-1;;;;;2819:10:4;:4;-1:-1:-1;;;;;2819:10:4;;2815:88;;2845:47;2878:4;2884:7;2845:32;:47::i;:::-;-1:-1:-1;;;;;2916:16:4;;2912:179;;2948:45;2985:7;2948:36;:45::i;:::-;2912:179;;;3020:4;-1:-1:-1;;;;;3014:10:4;:2;-1:-1:-1;;;;;3014:10:4;;3010:81;;3040:40;3068:2;3072:7;3040:27;:40::i;8251:247:3:-;8346:18;8352:2;8356:7;8346:5;:18::i;:::-;8382:54;8413:1;8417:2;8421:7;8430:5;8382:22;:54::i;:::-;8374:117;;;;-1:-1:-1;;;8374:117:3;;;;;;;:::i;11446:824::-;11566:4;-1:-1:-1;;;;;11590:13:3;;1078:20:0;1116:8;11586:678:3;;11625:72;;-1:-1:-1;;;11625:72:3;;-1:-1:-1;;;;;11625:36:3;;;;;:72;;665:10:1;;11676:4:3;;11682:7;;11691:5;;11625:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11625:72:3;;;;;;;;-1:-1:-1;;11625:72:3;;;;;;;;;;;;:::i;:::-;;;11621:591;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11868:13:3;;11864:334;;11910:60;;-1:-1:-1;;;11910:60:3;;;;;;;:::i;11864:334::-;12150:6;12144:13;12135:6;12131:2;12127:15;12120:38;11621:591;-1:-1:-1;;;;;;11747:55:3;-1:-1:-1;;;11747:55:3;;-1:-1:-1;11740:62:3;;11586:678;-1:-1:-1;12249:4:3;11446:824;;;;;;:::o;4581:970:4:-;4843:22;4893:1;4868:22;4885:4;4868:16;:22::i;:::-;:26;;;;:::i;:::-;4904:18;4925:26;;;:17;:26;;;;;;4843:51;;-1:-1:-1;5055:28:4;;;5051:323;;-1:-1:-1;;;;;5121:18:4;;5099:19;5121:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5170:30;;;;;;:44;;;5286:30;;:17;:30;;;;;:43;;;5051:323;-1:-1:-1;5467:26:4;;;;:17;:26;;;;;;;;5460:33;;;-1:-1:-1;;;;;5510:18:4;;;;;:12;:18;;;;;:34;;;;;;;5503:41;4581:970::o;5839:1061::-;6113:10;:17;6088:22;;6113:21;;6133:1;;6113:21;:::i;:::-;6144:18;6165:24;;;:15;:24;;;;;;6533:10;:26;;6088:46;;-1:-1:-1;6165:24:4;;6088:46;;6533:26;;;;-1:-1:-1;;;6533:26:4;;;;;;;;;;;;;;;;;6511:48;;6595:11;6570:10;6581;6570:22;;;;;;-1:-1:-1;;;6570:22:4;;;;;;;;;;;;;;;;;;;;:36;;;;6674:28;;;:15;:28;;;;;;;:41;;;6843:24;;;;;6836:31;6877:10;:16;;;;;-1:-1:-1;;;6877:16:4;;;;;;;;;;;;;;;;;;;;;;;;;;5839:1061;;;;:::o;3391:217::-;3475:14;3492:20;3509:2;3492:16;:20::i;:::-;-1:-1:-1;;;;;3522:16:4;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3566:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3391:217:4:o;8820:372:3:-;-1:-1:-1;;;;;8899:16:3;;8891:61;;;;-1:-1:-1;;;8891:61:3;;14842:2:15;8891:61:3;;;14824:21:15;;;14861:18;;;14854:30;14920:34;14900:18;;;14893:62;14972:18;;8891:61:3;14814:182:15;8891:61:3;7022:4;7045:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7045:16:3;:30;8962:58;;;;-1:-1:-1;;;8962:58:3;;9583:2:15;8962:58:3;;;9565:21:15;9622:2;9602:18;;;9595:30;9661;9641:18;;;9634:58;9709:18;;8962:58:3;9555:178:15;8962:58:3;9031:45;9060:1;9064:2;9068:7;9031:20;:45::i;:::-;-1:-1:-1;;;;;9087:13:3;;;;;;:9;:13;;;;;:18;;9104:1;;9087:13;:18;;9104:1;;9087:18;:::i;:::-;;;;-1:-1:-1;;9115:16:3;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9115:21:3;-1:-1:-1;;;;;9115:21:3;;;;;;;;9152:33;;9115:16;;;9152:33;;9115:16;;9152:33;8820:372;;:::o;14:173:15:-;82:20;;-1:-1:-1;;;;;131:31:15;;121:42;;111:2;;177:1;174;167:12;192:160;257:20;;313:13;;306:21;296:32;;286:2;;342:1;339;332:12;357:196;;469:2;457:9;448:7;444:23;440:32;437:2;;;490:6;482;475:22;437:2;518:29;537:9;518:29;:::i;558:270::-;;;687:2;675:9;666:7;662:23;658:32;655:2;;;708:6;700;693:22;655:2;736:29;755:9;736:29;:::i;:::-;726:39;;784:38;818:2;807:9;803:18;784:38;:::i;:::-;774:48;;645:183;;;;;:::o;833:338::-;;;;979:2;967:9;958:7;954:23;950:32;947:2;;;1000:6;992;985:22;947:2;1028:29;1047:9;1028:29;:::i;:::-;1018:39;;1076:38;1110:2;1099:9;1095:18;1076:38;:::i;:::-;1066:48;;1161:2;1150:9;1146:18;1133:32;1123:42;;937:234;;;;;:::o;1176:858::-;;;;;;1358:3;1346:9;1337:7;1333:23;1329:33;1326:2;;;1380:6;1372;1365:22;1326:2;1408:29;1427:9;1408:29;:::i;:::-;1398:39;;1456:38;1490:2;1479:9;1475:18;1456:38;:::i;:::-;1446:48;;1541:2;1530:9;1526:18;1513:32;1503:42;;1596:2;1585:9;1581:18;1568:32;1619:18;1660:2;1652:6;1649:14;1646:2;;;1681:6;1673;1666:22;1646:2;1724:6;1713:9;1709:22;1699:32;;1769:7;1762:4;1758:2;1754:13;1750:27;1740:2;;1796:6;1788;1781:22;1740:2;1841;1828:16;1867:2;1859:6;1856:14;1853:2;;;1888:6;1880;1873:22;1853:2;1938:7;1933:2;1924:6;1920:2;1916:15;1912:24;1909:37;1906:2;;;1964:6;1956;1949:22;1906:2;1316:718;;;;-1:-1:-1;1316:718:15;;-1:-1:-1;2000:2:15;1992:11;;2022:6;1316:718;-1:-1:-1;;;1316:718:15:o;2039:1183::-;;;;;2211:3;2199:9;2190:7;2186:23;2182:33;2179:2;;;2233:6;2225;2218:22;2179:2;2261:29;2280:9;2261:29;:::i;:::-;2251:39;;2309:38;2343:2;2332:9;2328:18;2309:38;:::i;:::-;2299:48;;2394:2;2383:9;2379:18;2366:32;2356:42;;2449:2;2438:9;2434:18;2421:32;2472:18;2513:2;2505:6;2502:14;2499:2;;;2534:6;2526;2519:22;2499:2;2577:6;2566:9;2562:22;2552:32;;2622:7;2615:4;2611:2;2607:13;2603:27;2593:2;;2649:6;2641;2634:22;2593:2;2690;2677:16;2712:2;2708;2705:10;2702:2;;;2718:18;;:::i;:::-;2793:2;2787:9;2761:2;2847:13;;-1:-1:-1;;2843:22:15;;;2867:2;2839:31;2835:40;2823:53;;;2891:18;;;2911:22;;;2888:46;2885:2;;;2937:18;;:::i;:::-;2977:10;2973:2;2966:22;3012:2;3004:6;2997:18;3052:7;3047:2;3042;3038;3034:11;3030:20;3027:33;3024:2;;;3078:6;3070;3063:22;3024:2;3139;3134;3130;3126:11;3121:2;3113:6;3109:15;3096:46;3162:15;;;3179:2;3158:24;3151:40;;;;2169:1053;;;;-1:-1:-1;2169:1053:15;;-1:-1:-1;;;;2169:1053:15:o;3227:264::-;;;3353:2;3341:9;3332:7;3328:23;3324:32;3321:2;;;3374:6;3366;3359:22;3321:2;3402:29;3421:9;3402:29;:::i;:::-;3392:39;;3450:35;3481:2;3470:9;3466:18;3450:35;:::i;3496:264::-;;;3625:2;3613:9;3604:7;3600:23;3596:32;3593:2;;;3646:6;3638;3631:22;3593:2;3674:29;3693:9;3674:29;:::i;:::-;3664:39;3750:2;3735:18;;;;3722:32;;-1:-1:-1;;;3583:177:15:o;3765:190::-;;3874:2;3862:9;3853:7;3849:23;3845:32;3842:2;;;3895:6;3887;3880:22;3842:2;3923:26;3939:9;3923:26;:::i;3960:255::-;;4071:2;4059:9;4050:7;4046:23;4042:32;4039:2;;;4092:6;4084;4077:22;4039:2;4136:9;4123:23;4155:30;4179:5;4155:30;:::i;4220:259::-;;4342:2;4330:9;4321:7;4317:23;4313:32;4310:2;;;4363:6;4355;4348:22;4310:2;4400:9;4394:16;4419:30;4443:5;4419:30;:::i;4484:190::-;;4596:2;4584:9;4575:7;4571:23;4567:32;4564:2;;;4617:6;4609;4602:22;4564:2;-1:-1:-1;4645:23:15;;4554:120;-1:-1:-1;4554:120:15:o;4679:194::-;;4802:2;4790:9;4781:7;4777:23;4773:32;4770:2;;;4823:6;4815;4808:22;4770:2;-1:-1:-1;4851:16:15;;4760:113;-1:-1:-1;4760:113:15:o;4878:257::-;;4957:5;4951:12;4984:6;4979:3;4972:19;5000:63;5056:6;5049:4;5044:3;5040:14;5033:4;5026:5;5022:16;5000:63;:::i;:::-;5117:2;5096:15;-1:-1:-1;;5092:29:15;5083:39;;;;5124:4;5079:50;;4927:208;-1:-1:-1;;4927:208:15:o;5140:470::-;;5357:6;5351:13;5373:53;5419:6;5414:3;5407:4;5399:6;5395:17;5373:53;:::i;:::-;5489:13;;5448:16;;;;5511:57;5489:13;5448:16;5545:4;5533:17;;5511:57;:::i;:::-;5584:20;;5327:283;-1:-1:-1;;;;5327:283:15:o;5823:488::-;-1:-1:-1;;;;;6092:15:15;;;6074:34;;6144:15;;6139:2;6124:18;;6117:43;6191:2;6176:18;;6169:34;;;6239:3;6234:2;6219:18;;6212:31;;;5823:488;;6260:45;;6285:19;;6277:6;6260:45;:::i;:::-;6252:53;6026:285;-1:-1:-1;;;;;;6026:285:15:o;7565:219::-;;7714:2;7703:9;7696:21;7734:44;7774:2;7763:9;7759:18;7751:6;7734:44;:::i;8201:414::-;8403:2;8385:21;;;8442:2;8422:18;;;8415:30;8481:34;8476:2;8461:18;;8454:62;-1:-1:-1;;;8547:2:15;8532:18;;8525:48;8605:3;8590:19;;8375:240::o;16108:356::-;16310:2;16292:21;;;16329:18;;;16322:30;16388:34;16383:2;16368:18;;16361:62;16455:2;16440:18;;16282:182::o;19589:413::-;19791:2;19773:21;;;19830:2;19810:18;;;19803:30;19869:34;19864:2;19849:18;;19842:62;-1:-1:-1;;;19935:2:15;19920:18;;19913:47;19992:3;19977:19;;19763:239::o;21870:355::-;22072:2;22054:21;;;22111:2;22091:18;;;22084:30;22150:33;22145:2;22130:18;;22123:61;22216:2;22201:18;;22044:181::o;22412:128::-;;22483:1;22479:6;22476:1;22473:13;22470:2;;;22489:18;;:::i;:::-;-1:-1:-1;22525:9:15;;22460:80::o;22545:120::-;;22611:1;22601:2;;22616:18;;:::i;:::-;-1:-1:-1;22650:9:15;;22591:74::o;22670:168::-;;22776:1;22772;22768:6;22764:14;22761:1;22758:21;22753:1;22746:9;22739:17;22735:45;22732:2;;;22783:18;;:::i;:::-;-1:-1:-1;22823:9:15;;22722:116::o;22843:125::-;;22911:1;22908;22905:8;22902:2;;;22916:18;;:::i;:::-;-1:-1:-1;22953:9:15;;22892:76::o;22973:258::-;23045:1;23055:113;23069:6;23066:1;23063:13;23055:113;;;23145:11;;;23139:18;23126:11;;;23119:39;23091:2;23084:10;23055:113;;;23186:6;23183:1;23180:13;23177:2;;;-1:-1:-1;;23221:1:15;23203:16;;23196:27;23026:205::o;23236:380::-;23321:1;23311:12;;23368:1;23358:12;;;23379:2;;23433:4;23425:6;23421:17;23411:27;;23379:2;23486;23478:6;23475:14;23455:18;23452:38;23449:2;;;23532:10;23527:3;23523:20;23520:1;23513:31;23567:4;23564:1;23557:15;23595:4;23592:1;23585:15;23449:2;;23291:325;;;:::o;23621:135::-;;-1:-1:-1;;23681:17:15;;23678:2;;;23701:18;;:::i;:::-;-1:-1:-1;23748:1:15;23737:13;;23668:88::o;23761:112::-;;23819:1;23809:2;;23824:18;;:::i;:::-;-1:-1:-1;23858:9:15;;23799:74::o;23878:127::-;23939:10;23934:3;23930:20;23927:1;23920:31;23970:4;23967:1;23960:15;23994:4;23991:1;23984:15;24010:127;24071:10;24066:3;24062:20;24059:1;24052:31;24102:4;24099:1;24092:15;24126:4;24123:1;24116:15;24142:127;24203:10;24198:3;24194:20;24191:1;24184:31;24234:4;24231:1;24224:15;24258:4;24255:1;24248:15;24274:131;-1:-1:-1;;;;;;24348:32:15;;24338:43;;24328:2;;24395:1;24392;24385:12;24328:2;24318:87;:::o

Swarm Source

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

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