ETH Price: $3,592.58 (-2.76%)

Token

ERC-20: Thunderbirds: IRC Mint Pass (TBMP)
 

Overview

Max Total Supply

1,000 TBMP

Holders

1,000

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 TBMP
0x10efbe60e544c3aaf9a510e5e58fd68d9f1001cf
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MintPass

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 6 of 8: MintPass.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.16;

import "./ERC721.sol";
import "./Ownership.sol";

contract MintPass is ERC721, Ownership {
    // represents how many times a mint pass is redeemed.
    mapping(uint256 => uint8) private redeemedTimes;
    // contracts that can update mint pass uses, like when minting art, art nft will updated `redeemedTimes`
    mapping(address => bool) public isWhitelisted;
    // nonce to prevent replay attack on admin signature
    mapping(uint256 => bool) public isSignerNonceUsed;

    bool public mintStoppted; // when enabled no futher mint pass can be minted.
    uint256 public maxSupply; // max supply of mint pass
    bool public isPaused = false; // pause the contractn when something goes "really" wrong

    uint8 constant UINT8_MAX = 255;

    struct Signature {
        bytes32 r;
        bytes32 s;
        uint8 v;
    }

    event MintPassUpdated(
        uint256 tokenId,
        uint8 redeemedTimes,
        address updatedBy
    );

    event Paused(bool _isPaused);

    modifier canAcceptMintPass(address user) {
        require(balanceOf(user) == 0, "Only 1 mint pass allowed per user");
        _;
    }

    modifier mintAllowed() {
        require(!mintStoppted, "Minting stopped");
        _;
    }

    modifier notPaused() {
        require(!isPaused, "Contract paused");
        _;
    }

    constructor(string memory _baseTokenUri)
        ERC721("Thunderbirds: IRC Mint Pass", "TBMP", _baseTokenUri)
    {
        maxSupply = 1000;
    }

    function mint(
        address user,
        Signature memory adminSignature,
        uint256 signerNonce
    ) public canAcceptMintPass(user) mintAllowed notPaused {
        require(totalSupply() < maxSupply, "Max token minted");
        require(
            !isSignerNonceUsed[signerNonce],
            "Duplicate nonce in signature"
        );
        bytes32 hash = keccak256(
            abi.encodePacked(
                bytes4(keccak256("mint")),
                address(this),
                signerNonce,
                getChainID(),
                user
            )
        );
        address signer = getSigner(hash, adminSignature);
        require(isDeputyOwner[signer], "Invalid signature/message");
        isSignerNonceUsed[signerNonce] = true;
        string memory url = "QmXyV2HUP7hv8Xjx3X6ZLUUMHkxsdRuQhZ9DwpzZqH16jD";
        super.mint(user, totalSupply() + 1, url);
    }

    function batchMintByAdmin(address[] memory users) public mintAllowed onlyDeputyOrOwner {
        require(totalSupply() + users.length < maxSupply, "Max token minted");
        string memory url = "QmXyV2HUP7hv8Xjx3X6ZLUUMHkxsdRuQhZ9DwpzZqH16jD";
        for(uint8 i=0; i<users.length; i++) {
            require(balanceOf(users[i]) == 0, "Only 1 mint pass allowed per user");
            super.mint(users[i], totalSupply() + 1, url);
        }
    }

    function updateRedeemedTimes(uint256 tokenId, uint8 _redeemedTimes)
        public
        notPaused
    {
        require(isWhitelisted[msg.sender], "Caller not whitelisted");
        redeemedTimes[tokenId] = _redeemedTimes;
        emit MintPassUpdated(tokenId, _redeemedTimes, msg.sender);
    }

    function transferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    ) public override canAcceptMintPass(_to) notPaused {
        super._transferFrom(_from, _to, _tokenId);
    }

    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    ) public override canAcceptMintPass(_to) notPaused {
        super._safeTransferFrom(_from, _to, _tokenId, "0x");
    }

    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _tokenId,
        bytes memory _data
    ) public override canAcceptMintPass(_to) notPaused {
        super._safeTransferFrom(_from, _to, _tokenId, _data);
    }

    function burn(uint256 _tokenId) public override notPaused {
        super.burn(_tokenId);
    }
    

    function updateTokenUri(uint256 _tokenId, string memory _url)
        public
        onlyDeputyOrOwner
    {
        super._updateTokenUri(_tokenId, _url);
    }

    function updateBaseTokenUri(string memory _baseTokenUri) public onlyOwner {
        super._updateBaseTokenUri(_baseTokenUri);
    }

    function whitelistContract(address contractAddress) public onlyOwner {
        isWhitelisted[contractAddress] = true;
    }

    function removeFromWhitelist(address contractAddress) public onlyOwner {
        isWhitelisted[contractAddress] = false;
    }

    function disableMinting(bool shoudlStop) public onlyOwner {
        mintStoppted = shoudlStop;
    }

    function pauseContract(bool _isPaused) public onlyOwner returns (bool) {
        isPaused = _isPaused;
        emit Paused(_isPaused);
        return true;
    }

    function getSigner(bytes32 message, Signature memory sig)
        public
        pure
        returns (address)
    {
        bytes memory prefix = "\x19Ethereum Signed Message:\n32";
        bytes32 prefixedHash = keccak256(abi.encodePacked(prefix, message));
        address signer = ecrecover(prefixedHash, sig.v, sig.r, sig.s);
        return signer;
    }

    function getRedeemedTimes(uint256 tokenId) public view returns(uint8) {
        if(!exists(tokenId)) return UINT8_MAX;
        return redeemedTimes[tokenId];
    }

    function getChainID() internal view returns (uint256) {
        uint256 id;
        assembly {
            id := chainid()
        }
        return id;
    }
}

File 1 of 8: Addresses.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.16;

/**
 * Utility library of inline functions on addresses
 */
library Address {
    /**
     * Returns whether the target address is a contract
     * @dev This function will return false if invoked during the constructor of a contract,
     * as the code is not actually created until after the constructor finishes.
     * @param account address to check
     * @return whether the target address is a contract
     */
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            codehash := extcodehash(account)
        }
        return (codehash != accountHash && codehash != 0x0);
    }
}

File 2 of 8: BaseERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.16;

import "./Addresses.sol";
import "./Strings.sol";
import "./ERC721Receiver.sol";
import "./IERC721.sol";

abstract contract ERC721BasicToken is IERC721 {
    using Address for address;
    using Strings for uint256;

    bytes4 private constant InterfaceId_ERC721 = 0x80ac58cd;
    bytes4 private constant InterfaceId_ERC721Exists = 0x4f558e79;
    bytes4 private constant ERC721_RECEIVED = 0xf0b9e5ba;
    bytes4 private constant InterfaceId_ERC721Enumerable = 0x780e9d63;
    bytes4 private constant InterfaceId_ERC721Metadata = 0x5b5e139f;
    bytes4 private constant InterfaceId_ERC165 = 0x01ffc9a7;

    string internal name_;
    string internal symbol_;
    string public baseTokenURI;

    // Array with all token ids, used for enumeration
    uint256[] internal allTokens;

    // Mapping of interface id to whether or not it's supported
    mapping(bytes4 => bool) internal supportedInterfaces;

    // Mapping from owner to list of owned token IDs
    mapping(address => uint256[]) internal ownedTokens;

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

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

    // Mapping from token ID to owner
    mapping(uint256 => address) internal tokenOwner;

    // Mapping from token ID to approved address
    mapping(uint256 => address) internal tokenApprovals;

    // Mapping from owner to number of owned token
    mapping(address => uint256) internal ownedTokensCount;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) internal operatorApprovals;

    /**
     * @dev Guarantees msg.sender is owner of the given token
     * @param _tokenId uint256 ID of the token to validate its ownership belongs to msg.sender
     */
    modifier onlyOwnerOf(uint256 _tokenId) {
        require(ownerOf(_tokenId) == msg.sender, "Only asset owner is allowed");
        _;
    }

    /**
     * @dev Checks msg.sender can transfer a token, by being owner, approved, or operator
     * @param _tokenId uint256 ID of the token to validate
     */
    modifier canTransfer(uint256 _tokenId) {
        require(isApprovedOrOwner(msg.sender, _tokenId), "Can not transfer");
        _;
    }

    constructor(
        string memory _name,
        string memory _symbol,
        string memory _baseTokenUri
    ) {
        name_ = _name;
        symbol_ = _symbol;
        baseTokenURI = _baseTokenUri;

        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(InterfaceId_ERC721Enumerable);
        _registerInterface(InterfaceId_ERC721Metadata);
        _registerInterface(InterfaceId_ERC721);
        _registerInterface(InterfaceId_ERC721Exists);
        _registerInterface(InterfaceId_ERC165);
    }

    /**
     * @dev Gets the token name
     * @return string representing the token name
     */
    function name() external view returns (string memory) {
        return name_;
    }

    /**
     * @dev Gets the token symbol
     * @return string representing the token symbol
     */
    function symbol() external view returns (string memory) {
        return symbol_;
    }

    /**
     * @dev Returns an URI for a given token ID
     * Throws if the token ID does not exist. May return an empty string.
     * @param _tokenId uint256 ID of the token to query
     */
    function tokenURI(uint256 _tokenId)
        public
        view
        virtual
        returns (string memory)
    {
        require(exists(_tokenId), "Asset does not exist");
        return string(abi.encodePacked(baseTokenURI, _tokenId.toString()));
    }

    /**
     * @dev Gets the balance of the specified address
     * @param _owner address to query the balance of
     * @return uint256 representing the amount owned by the passed address
     */
    function balanceOf(address _owner) public view returns (uint256) {
        require(_owner != address(0), "Zero address not allowed");
        return ownedTokensCount[_owner];
    }

    /**
     * @dev Gets the owner of the specified token ID
     * @param _tokenId uint256 ID of the token to query the owner of
     * @return owner address currently marked as the owner of the given token ID
     */
    function ownerOf(uint256 _tokenId) public view returns (address) {
        address owner = tokenOwner[_tokenId];
        require(owner != address(0), "Zero address not allowed");
        return owner;
    }

    /**
     * @dev Returns whether the specified token exists
     * @param _tokenId uint256 ID of the token to query the existence of
     * @return whether the token exists
     */
    function exists(uint256 _tokenId) public view returns (bool) {
        address owner = tokenOwner[_tokenId];
        return owner != address(0);
    }

    /**
     * @dev Approves another address to transfer the given token ID
     * The zero address indicates there is no approved address.
     * There can only be one approved address per token at a given time.
     * Can only be called by the token owner or an approved operator.
     * @param _to address to be approved for the given token ID
     * @param _tokenId uint256 ID of the token to be approved
     */
    function _approve(address _to, uint256 _tokenId) internal {
        address owner = ownerOf(_tokenId);
        require(_to != owner, "Can not approve to self");
        require(
            msg.sender == owner || isApprovedForAll(owner, msg.sender),
            "Not allowed to update approvals"
        );

        tokenApprovals[_tokenId] = _to;
        emit Approval(owner, _to, _tokenId);
    }

    /**
     * @dev Gets the approved address for a token ID, or zero if no address set
     * @param _tokenId uint256 ID of the token to query the approval of
     * @return address currently approved for the given token ID
     */
    function getApproved(uint256 _tokenId) public view returns (address) {
        return tokenApprovals[_tokenId];
    }

    /**
     * @dev Sets or unsets the approval of a given operator
     * An operator is allowed to transfer all tokens of the sender on their behalf
     * @param _to operator address to set the approval
     * @param _approved representing the status of the approval to be set
     */
    function _setApprovalForAll(address _to, bool _approved) internal {
        require(_to != msg.sender, "Can not approve to self");
        operatorApprovals[msg.sender][_to] = _approved;
        emit ApprovalForAll(msg.sender, _to, _approved);
    }

    /**
     * @dev Tells whether an operator is approved by a given owner
     * @param _owner owner address which you want to query the approval of
     * @param _operator operator address which you want to query the approval of
     * @return bool whether the given operator is approved by the given owner
     */
    function isApprovedForAll(address _owner, address _operator)
        public
        view
        returns (bool)
    {
        return operatorApprovals[_owner][_operator];
    }

    /**
     * @dev Transfers the ownership of a given token ID to another address
     * Usage of this method is discouraged, use `safeTransferFrom` whenever possible
     * Requires the msg sender to be the owner, approved, or operator
     * @param _from current owner of the token
     * @param _to address to receive the ownership of the given token ID
     * @param _tokenId uint256 ID of the token to be transferred
     */
    function _transferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    ) internal canTransfer(_tokenId) {
        require(_from != address(0), "Zero address not allowed");
        require(_to != address(0), "Zero address not allowed");

        clearApproval(_from, _tokenId);
        removeTokenFrom(_from, _tokenId);
        addTokenTo(_to, _tokenId);

        emit Transfer(_from, _to, _tokenId);
    }

    /**
     * @dev Safely transfers the ownership of a given token ID to another address
     * If the target address is a contract, it must implement `onERC721Received`,
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     *
     * Requires the msg sender to be the owner, approved, or operator
     * @param _from current owner of the token
     * @param _to address to receive the ownership of the given token ID
     * @param _tokenId uint256 ID of the token to be transferred
     */
    function _safeTransferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    ) internal canTransfer(_tokenId) {
        // solium-disable-next-line arg-overflow
        _safeTransferFrom(_from, _to, _tokenId, "");
    }

    /**
     * @dev Safely transfers the ownership of a given token ID to another address
     * If the target address is a contract, it must implement `onERC721Received`,
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * Requires the msg sender to be the owner, approved, or operator
     * @param _from current owner of the token
     * @param _to address to receive the ownership of the given token ID
     * @param _tokenId uint256 ID of the token to be transferred
     * @param _data bytes data to send along with a safe transfer check
     */
    function _safeTransferFrom(
        address _from,
        address _to,
        uint256 _tokenId,
        bytes memory _data
    ) internal canTransfer(_tokenId) {
        _transferFrom(_from, _to, _tokenId);
        // solium-disable-next-line arg-overflow
        require(
            checkAndCallSafeTransfer(_from, _to, _tokenId, _data),
            "Safe Transfer failed"
        );
    }

    /**
     * @dev Returns whether the given spender can transfer a given token ID
     * @param _spender address of the spender to query
     * @param _tokenId uint256 ID of the token to be transferred
     * @return bool whether the msg.sender is approved for the given token ID,
     *  is an operator of the owner, or is the owner of the token
     */
    function isApprovedOrOwner(address _spender, uint256 _tokenId)
        internal
        view
        returns (bool)
    {
        address owner = ownerOf(_tokenId);
        // Disable solium check because of
        // https://github.com/duaraghav8/Solium/issues/175
        // solium-disable-next-line operator-whitespace
        return (_spender == owner ||
            getApproved(_tokenId) == _spender ||
            isApprovedForAll(owner, _spender));
    }

    /**
     * @dev Internal function to mint a new token
     * Reverts if the given token ID already exists
     * @param _to The address that will own the minted token
     * @param _tokenId uint256 ID of the token to be minted by the msg.sender
     */
    function _mint(address _to, uint256 _tokenId) internal {
        require(_to != address(0), "Zero address not allowed");
        addTokenTo(_to, _tokenId);
        allTokensIndex[_tokenId] = allTokens.length;
        allTokens.push(_tokenId);

        emit Transfer(address(0), _to, _tokenId);
    }

    /**
     * @dev Internal function to burn a specific token
     * Reverts if the token does not exist
     * @param _tokenId uint256 ID of the token being burned by the msg.sender
     */
    function _burn(address _owner, uint256 _tokenId)
        internal
        canTransfer(_tokenId)
    {
        clearApproval(_owner, _tokenId);
        removeTokenFrom(_owner, _tokenId);

        // Reorg all tokens array
        uint256 tokenIndex = allTokensIndex[_tokenId];
        uint256 lastTokenIndex = allTokens.length - 1;
        uint256 lastToken = allTokens[lastTokenIndex];

        allTokens[tokenIndex] = lastToken;
        delete allTokens[lastTokenIndex];

        //allTokens[lastTokenIndex] = 0;
        // allTokens.length--; // @TODO

        allTokensIndex[_tokenId] = 0;
        allTokensIndex[lastToken] = tokenIndex;
        emit Transfer(_owner, address(0), _tokenId);
    }

    /**
     * @dev Internal function to clear current approval of a given token ID
     * Reverts if the given address is not indeed the owner of the token
     * @param _owner owner of the token
     * @param _tokenId uint256 ID of the token to be transferred
     */
    function clearApproval(address _owner, uint256 _tokenId) internal {
        require(
            ownerOf(_tokenId) == _owner,
            "Asset does not belong to given owmer"
        );
        if (tokenApprovals[_tokenId] != address(0)) {
            tokenApprovals[_tokenId] = address(0);
            emit Approval(_owner, address(0), _tokenId);
        }
    }

    /**
     * @dev Internal function to add a token ID to the list of a given address
     * @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 addTokenTo(address _to, uint256 _tokenId) internal {
        require(tokenOwner[_tokenId] == address(0), "Asset already exists");
        tokenOwner[_tokenId] = _to;
        ownedTokensCount[_to] = ownedTokensCount[_to] + 1;
        uint256 length = ownedTokens[_to].length;
        ownedTokens[_to].push(_tokenId);
        ownedTokensIndex[_tokenId] = length;
    }

    /**
     * @dev Internal function to remove a token ID from the list of a given address
     * @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 removeTokenFrom(address _from, uint256 _tokenId) internal {
        require(
            ownerOf(_tokenId) == _from,
            "Asset does not belong to given owmer"
        );
        ownedTokensCount[_from] = ownedTokensCount[_from] - 1;
        tokenOwner[_tokenId] = address(0);
        uint256 tokenIndex = ownedTokensIndex[_tokenId];
        uint256 lastTokenIndex = ownedTokens[_from].length - 1;
        uint256 lastToken = ownedTokens[_from][lastTokenIndex];

        ownedTokens[_from][tokenIndex] = lastToken;
        ownedTokens[_from][lastTokenIndex] = 0;
        // Note that this will handle single-element arrays. In that case, both tokenIndex and lastTokenIndex are going to
        // be zero. Then we can make sure that we will remove _tokenId from the ownedTokens list since we are first swapping
        // the lastToken to the first position, and then dropping the element placed in the last position of the list

        //ownedTokens[_from].length--; @TODO
        ownedTokensIndex[_tokenId] = 0;
        ownedTokensIndex[lastToken] = tokenIndex;
    }

    /**
     * @dev Internal function to invoke `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 whether the call correctly returned the expected magic value
     */
    function checkAndCallSafeTransfer(
        address _from,
        address _to,
        uint256 _tokenId,
        bytes memory _data
    ) internal returns (bool) {
        if (!_to.isContract()) {
            return true;
        }
        bytes4 retval = ERC721Receiver(_to).onERC721Received(
            _from,
            _tokenId,
            _data
        );
        return (retval == ERC721_RECEIVED);
    }

    /**
     * @dev Gets the token ID at a given index of the tokens list of the requested owner
     * @param _owner address owning the tokens list to be accessed
     * @param _index uint256 representing the index to be accessed of the requested tokens list
     * @return uint256 token ID at the given index of the tokens list owned by the requested address
     */
    function tokenOfOwnerByIndex(address _owner, uint256 _index)
        public
        view
        returns (uint256)
    {
        require(_index < balanceOf(_owner), "Invalid index");
        return ownedTokens[_owner][_index];
    }

    /**
     * @dev Gets the total amount of tokens stored by the contract
     * @return uint256 representing the total amount of tokens
     */
    function totalSupply() public view returns (uint256) {
        return allTokens.length;
    }

    /**
     * @dev Gets the token ID at a given index of all the tokens in this contract
     * Reverts if the index is greater or equal to the total number of tokens
     * @param _index uint256 representing the index to be accessed of the tokens list
     * @return uint256 token ID at the given index of the tokens list
     */
    function tokenByIndex(uint256 _index) public view returns (uint256) {
        require(_index < totalSupply(), "Invalid index");
        return allTokens[_index];
    }

    function supportsInterface(bytes4 _interfaceId)
        external
        view
        returns (bool)
    {
        return supportedInterfaces[_interfaceId];
    }

    function _registerInterface(bytes4 _interfaceId) internal {
        require(_interfaceId != 0xffffffff);
        supportedInterfaces[_interfaceId] = true;
    }
}

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

pragma solidity 0.8.16;

import "./BaseERC721.sol";

contract ERC721 is ERC721BasicToken {
    mapping(uint256 => string) internal _tokenUri;

    event TokenURIUpdated(uint256 tokenId, string _url);
    event BaseTokenURIUpdated(string _baseUrl);

    constructor(
        string memory _name,
        string memory _symbol,
        string memory _baseTokenUri
    ) ERC721BasicToken(_name, _symbol, _baseTokenUri) {
        emit BaseTokenURIUpdated(_baseTokenUri);
    }

    function approve(address _to, uint256 _tokenId) public {
        super._approve(_to, _tokenId);
    }

    function setApprovalForAll(address _to, bool _approved) public {
        super._setApprovalForAll(_to, _approved);
    }

    function transferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    ) public virtual {
        super._transferFrom(_from, _to, _tokenId);
    }

    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    ) public virtual {
        super._safeTransferFrom(_from, _to, _tokenId, "0x");
    }

    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _tokenId,
        bytes memory _data
    ) public virtual {
        super._safeTransferFrom(_from, _to, _tokenId, _data);
    }

    function _updateTokenUri(uint256 _tokenId, string memory _url) internal {
        _tokenUri[_tokenId] = _url;
        emit TokenURIUpdated(_tokenId, _url);
    }

    function _updateBaseTokenUri(string memory _baseTokenUri) internal {
        baseTokenURI = _baseTokenUri;
        emit BaseTokenURIUpdated(_baseTokenUri);
    }

    function mint(
        address _to,
        uint256 _tokenId,
        string memory _url
    ) internal {
        _updateTokenUri(_tokenId, _url);
        super._mint(_to, _tokenId);
    }

    function burn(uint256 _tokenId) public virtual {
        super._burn(ownerOf(_tokenId), _tokenId);
    }

    function tokenURI(uint256 _tokenId)
        public
        view
        override
        returns (string memory)
    {
        require(exists(_tokenId), "Asset does not exist");
        return string(abi.encodePacked(baseTokenURI, _tokenUri[_tokenId]));
    }
}

File 4 of 8: ERC721Receiver.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.16;

/**
 * @title ERC721 token receiver interface
 * @author Prashant Prabhakar Singh [[email protected]]
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
abstract contract ERC721Receiver {
    /**
     * @dev Magic value to be returned upon successful reception of an NFT
     *  Equals to `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`,
     *  which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`
     */
    bytes4 internal constant ERC721_RECEIVED = 0xf0b9e5ba;

    /**
     * @notice Handle the receipt of an NFT
     * @dev The ERC721 smart contract calls this function on the recipient
     * after a `safetransfer`. This function MAY throw to revert and reject the
     * transfer. This function MUST use 50,000 gas or less. Return of other
     * than the magic value MUST result in the transaction being reverted.
     * Note: the contract address is always the message sender.
     * @param _from The sending address
     * @param _tokenId The NFT identifier which is being transfered
     * @param _data Additional data with no specified format
     * @return `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`
     */
    function onERC721Received(
        address _from,
        uint256 _tokenId,
        bytes memory _data
    ) public virtual returns (bytes4);
}

File 5 of 8: IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.16;

/**
 * @title ERC721 Non-Fungible Token Standard basic interface
 * @author Prashant Prabhakar Singh [[email protected]]
 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
interface IERC721 {
    event Transfer(
        address indexed _from,
        address indexed _to,
        uint256 indexed _tokenId
    );
    event Approval(
        address indexed _owner,
        address indexed _approved,
        uint256 indexed _tokenId
    );
    event ApprovalForAll(
        address indexed _owner,
        address indexed _operator,
        bool _approved
    );

    function balanceOf(address _owner) external view returns (uint256 _balance);

    function ownerOf(uint256 _tokenId) external view returns (address _owner);

    function exists(uint256 _tokenId) external view returns (bool _exists);

    function approve(address _to, uint256 _tokenId) external;

    function getApproved(uint256 _tokenId)
        external
        view
        returns (address _operator);

    function setApprovalForAll(address _operator, bool _approved) external;

    function isApprovedForAll(address _owner, address _operator)
        external
        view
        returns (bool);

    function transferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    ) external;

    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    ) external;

    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _tokenId,
        bytes memory _data
    ) external;

    function name() external view returns (string memory _name);

    function symbol() external view returns (string memory _symbol);

    function tokenURI(uint256 _tokenId) external view returns (string memory);

    function totalSupply() external view returns (uint256);

    function tokenOfOwnerByIndex(address _owner, uint256 _index)
        external
        view
        returns (uint256 _tokenId);

    function tokenByIndex(uint256 _index) external view returns (uint256);

    function supportsInterface(bytes4 _interfaceId)
        external
        view
        returns (bool);
}

File 7 of 8: Ownership.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.16;

contract Ownership {
    address public owner;
    address[] public deputyOwners;

    mapping(address => bool) public isDeputyOwner;

    event OwnershipUpdated(address oldOwner, address newOwner);
    event DeputyOwnerUpdated(address _do, bool _isAdded);

    constructor() {
        owner = msg.sender;
        addDeputyOwner(msg.sender);
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "Caller is not owner");
        _;
    }

    modifier onlyDeputyOrOwner() {
        require(
            msg.sender == owner || isDeputyOwner[msg.sender],
            "Caller is not owner or deputy"
        );
        _;
    }

    /**
     * @dev Transfer the ownership to some other address.
     * new owner can not be a zero address.
     * Only owner can call this function
     * @param _newOwner Address to which ownership is being transferred
     */
    function updateOwner(address _newOwner) public onlyOwner {
        require(_newOwner != address(0x0), "Invalid address");
        owner = _newOwner;
        emit OwnershipUpdated(msg.sender, owner);
    }

    /**
     * @dev Add new deputy owner.
     * Only Owner can call this function
     * New Deputy should not be zero address
     * New Deputy should not be be already exisitng
     * emit DeputyOwnerUdpatd event
     * @param _newDO Address of new deputy owner
     */
    function addDeputyOwner(address _newDO) public onlyOwner {
        require(!isDeputyOwner[_newDO], "Deputy Owner already exists");
        deputyOwners.push(_newDO);
        isDeputyOwner[_newDO] = true;
        emit DeputyOwnerUpdated(_newDO, true);
    }

    /**
     * @dev Remove an existing deputy owner.
     * Only Owner can call this function
     * Given address should be a deputy owner
     * emit DeputyOwnerUdpatd event
     * @param _existingDO Address of existing deputy owner
     */
    function removeDeputyOwner(address _existingDO) public onlyOwner {
        require(isDeputyOwner[_existingDO], "Deputy Owner does not exits");
        uint256 existingId;
        for (uint256 i = 0; i < deputyOwners.length; i++) {
            if (deputyOwners[i] == _existingDO) existingId = i;
        }

        // swap this with last element
        deputyOwners[existingId] = deputyOwners[deputyOwners.length - 1];
        delete deputyOwners[deputyOwners.length - 1];
        isDeputyOwner[_existingDO] = false;
        emit DeputyOwnerUpdated(_existingDO, false);
    }

    /**
     * @dev Renounce the ownership.
     * This will leave the contract without any owner.
     * Only owner can call this function
     * @param _validationCode A code to prevent accidental calling of this function
     */
    function renounceOwnership(uint256 _validationCode) public onlyOwner {
        require(_validationCode == 123456789, "Invalid code");
        owner = address(0);
        emit OwnershipUpdated(msg.sender, owner);
    }
}

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

pragma solidity 0.8.16;

/**
 * @dev String operations.
 */
library Strings {
    /**
     * @dev Converts a `uint256` to its ASCII `string` 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);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_baseTokenUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_baseUrl","type":"string"}],"name":"BaseTokenURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_do","type":"address"},{"indexed":false,"internalType":"bool","name":"_isAdded","type":"bool"}],"name":"DeputyOwnerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"redeemedTimes","type":"uint8"},{"indexed":false,"internalType":"address","name":"updatedBy","type":"address"}],"name":"MintPassUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_isPaused","type":"bool"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"_url","type":"string"}],"name":"TokenURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"_newDO","type":"address"}],"name":"addDeputyOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"}],"name":"batchMintByAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"deputyOwners","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"shoudlStop","type":"bool"}],"name":"disableMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getRedeemedTimes","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"message","type":"bytes32"},{"components":[{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"}],"internalType":"struct MintPass.Signature","name":"sig","type":"tuple"}],"name":"getSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isDeputyOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"isSignerNonceUsed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"components":[{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"}],"internalType":"struct MintPass.Signature","name":"adminSignature","type":"tuple"},{"internalType":"uint256","name":"signerNonce","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintStoppted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_isPaused","type":"bool"}],"name":"pauseContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_existingDO","type":"address"}],"name":"removeDeputyOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"removeFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_validationCode","type":"uint256"}],"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":"_to","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenUri","type":"string"}],"name":"updateBaseTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"updateOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint8","name":"_redeemedTimes","type":"uint8"}],"name":"updateRedeemedTimes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_url","type":"string"}],"name":"updateTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"whitelistContract","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526015805460ff191690553480156200001b57600080fd5b506040516200317f3803806200317f8339810160408190526200003e916200036e565b6040518060400160405280601b81526020017f5468756e64657262697264733a20495243204d696e742050617373000000000081525060405180604001604052806004815260200163054424d560e41b815250828282828260009081620000a69190620004b5565b506001620000b58382620004b5565b506002620000c48282620004b5565b50620000d763780e9d6360e01b6200018b565b620000e9635b5e139f60e01b6200018b565b620000fb6380ac58cd60e01b6200018b565b6200010d634f558e7960e01b6200018b565b6200011f6301ffc9a760e01b6200018b565b5050507fe6e4cd5c2dc7d2c20519b41832cd550fd3ea1186bf299d108179bf71fb8e00e58160405162000153919062000581565b60405180910390a15050600d80546001600160a01b031916339081179091556200017e9150620001c8565b506103e8601455620005b6565b6001600160e01b03198082169003620001a357600080fd5b6001600160e01b0319166000908152600460205260409020805460ff19166001179055565b600d546001600160a01b03163314620002285760405162461bcd60e51b815260206004820152601360248201527f43616c6c6572206973206e6f74206f776e65720000000000000000000000000060448201526064015b60405180910390fd5b6001600160a01b0381166000908152600f602052604090205460ff1615620002935760405162461bcd60e51b815260206004820152601b60248201527f446570757479204f776e657220616c726561647920657869737473000000000060448201526064016200021f565b600e805460018082019092557fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0180546001600160a01b0319166001600160a01b0384169081179091556000818152600f6020908152604091829020805460ff19168517905581519283528201929092527f3c3909677f69a0291b873bdd830b78dfb231df51c82872fde8d546da7cf85533910160405180910390a150565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620003655781810151838201526020016200034b565b50506000910152565b6000602082840312156200038157600080fd5b81516001600160401b03808211156200039957600080fd5b818401915084601f830112620003ae57600080fd5b815181811115620003c357620003c362000332565b604051601f8201601f19908116603f01168101908382118183101715620003ee57620003ee62000332565b816040528281528760208487010111156200040857600080fd5b6200041b83602083016020880162000348565b979650505050505050565b600181811c908216806200043b57607f821691505b6020821081036200045c57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620004b057600081815260208120601f850160051c810160208610156200048b5750805b601f850160051c820191505b81811015620004ac5782815560010162000497565b5050505b505050565b81516001600160401b03811115620004d157620004d162000332565b620004e981620004e2845462000426565b8462000462565b602080601f831160018114620005215760008415620005085750858301515b600019600386901b1c1916600185901b178555620004ac565b600085815260208120601f198616915b82811015620005525788860151825594840194600190910190840162000531565b5085821015620005715787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6020815260008251806020840152620005a281604085016020870162000348565b601f01601f19169190910160400192915050565b612bb980620005c66000396000f3fe608060405234801561001057600080fd5b506004361061025e5760003560e01c80638ab1d68111610146578063c87b56dd116100c3578063d734508311610087578063d734508314610581578063d76e87791461058e578063e272b892146105b1578063e985e9c5146105c4578063f9c67db4146105d7578063fef59ea5146105ea57600080fd5b8063c87b56dd14610537578063ca00043d1461054a578063d31af4841461055d578063d547cfb714610570578063d5abeb011461057857600080fd5b8063a22cb4651161010a578063a22cb465146104de578063a33cdc41146104f1578063b187bd2614610504578063b88d4fde14610511578063c400956a1461052457600080fd5b80638ab1d6811461048a5780638da5cb5b1461049d57806395d89b41146104b05780639a429a25146104b85780639c4d09a8146104cb57600080fd5b806342842e0e116101df5780636352211e116101a35780636352211e1461041857806370a082311461042b57806376c16f991461043e5780637d654c7f146104515780637da0349e14610464578063880cdc311461047757600080fd5b806342842e0e146103a157806342966c68146103b45780634f558e79146103c75780634f6ccce7146103f2578063558fc5e11461040557600080fd5b806318160ddd1161022657806318160ddd1461033357806323b872dd146103455780632f745c59146103585780633a0e6d431461036b5780633af32abf1461037e57600080fd5b806301ffc9a71461026357806306fdde03146102a5578063081812fc146102ba578063095ea7b3146102fb57806315761f0e14610310575b600080fd5b61029061027136600461221b565b6001600160e01b03191660009081526004602052604090205460ff1690565b60405190151581526020015b60405180910390f35b6102ad61060f565b60405161029c919061228f565b6102e36102c83660046122a2565b6000908152600960205260409020546001600160a01b031690565b6040516001600160a01b03909116815260200161029c565b61030e6103093660046122d2565b6106a1565b005b61029061031e3660046122fc565b600f6020526000908152604090205460ff1681565b6003545b60405190815260200161029c565b61030e610353366004612317565b6106af565b6103376103663660046122d2565b610713565b61030e6103793660046122fc565b61079a565b61029061038c3660046122fc565b60116020526000908152604090205460ff1681565b61030e6103af366004612317565b6107e8565b61030e6103c23660046122a2565b610858565b6102906103d53660046122a2565b6000908152600860205260409020546001600160a01b0316151590565b6103376104003660046122a2565b610887565b61030e610413366004612412565b6108f5565b6102e36104263660046122a2565b610928565b6103376104393660046122fc565b61095d565b61030e61044c3660046122fc565b6109a1565b61030e61045f3660046122a2565b610b9a565b61030e610472366004612447565b610c53565b61030e6104853660046122fc565b610e1d565b61030e6104983660046122fc565b610ee4565b600d546102e3906001600160a01b031681565b6102ad610f2f565b61030e6104c6366004612568565b610f3e565b61030e6104d93660046125a5565b6111a2565b61030e6104ec3660046125e1565b61127a565b61030e6104ff3660046122fc565b611284565b6015546102909060ff1681565b61030e61051f36600461260b565b6113b0565b6102e36105323660046122a2565b61140d565b6102ad6105453660046122a2565b611437565b6102e3610558366004612687565b6114d1565b61030e61056b3660046126ab565b6115ba565b6102ad611638565b61033760145481565b6013546102909060ff1681565b61029061059c3660046122a2565b60126020526000908152604090205460ff1681565b6102906105bf3660046126f2565b6116c6565b6102906105d236600461270d565b611740565b61030e6105e53660046126f2565b61176e565b6105fd6105f83660046122a2565b6117ab565b60405160ff909116815260200161029c565b60606000805461061e90612737565b80601f016020809104026020016040519081016040528092919081815260200182805461064a90612737565b80156106975780601f1061066c57610100808354040283529160200191610697565b820191906000526020600020905b81548152906001019060200180831161067a57829003601f168201915b5050505050905090565b6106ab82826117e5565b5050565b816106b98161095d565b156106df5760405162461bcd60e51b81526004016106d690612771565b60405180910390fd5b60155460ff16156107025760405162461bcd60e51b81526004016106d6906127b2565b61070d848484611911565b50505050565b600061071e8361095d565b821061075c5760405162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b60448201526064016106d6565b6001600160a01b0383166000908152600560205260409020805483908110610786576107866127db565b906000526020600020015490505b92915050565b600d546001600160a01b031633146107c45760405162461bcd60e51b81526004016106d6906127f1565b6001600160a01b03166000908152601160205260409020805460ff19166001179055565b816107f28161095d565b1561080f5760405162461bcd60e51b81526004016106d690612771565b60155460ff16156108325760405162461bcd60e51b81526004016106d6906127b2565b61070d84848460405180604001604052806002815260200161060f60f31b8152506119e9565b60155460ff161561087b5760405162461bcd60e51b81526004016106d6906127b2565b61088481611a6a565b50565b600061089260035490565b82106108d05760405162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b60448201526064016106d6565b600382815481106108e3576108e36127db565b90600052602060002001549050919050565b600d546001600160a01b0316331461091f5760405162461bcd60e51b81526004016106d6906127f1565b61088481611a7c565b6000818152600860205260408120546001600160a01b0316806107945760405162461bcd60e51b81526004016106d69061281e565b60006001600160a01b0382166109855760405162461bcd60e51b81526004016106d69061281e565b506001600160a01b03166000908152600a602052604090205490565b600d546001600160a01b031633146109cb5760405162461bcd60e51b81526004016106d6906127f1565b6001600160a01b0381166000908152600f602052604090205460ff16610a335760405162461bcd60e51b815260206004820152601b60248201527f446570757479204f776e657220646f6573206e6f74206578697473000000000060448201526064016106d6565b6000805b600e54811015610a8e57826001600160a01b0316600e8281548110610a5e57610a5e6127db565b6000918252602090912001546001600160a01b031603610a7c578091505b80610a868161286b565b915050610a37565b50600e8054610a9f90600190612884565b81548110610aaf57610aaf6127db565b600091825260209091200154600e80546001600160a01b039092169183908110610adb57610adb6127db565b600091825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055600e8054610b1490600190612884565b81548110610b2457610b246127db565b600091825260208083209190910180546001600160a01b03191690556001600160a01b038416808352600f82526040808420805460ff191690558051918252918101929092527f3c3909677f69a0291b873bdd830b78dfb231df51c82872fde8d546da7cf8553391015b60405180910390a15050565b600d546001600160a01b03163314610bc45760405162461bcd60e51b81526004016106d6906127f1565b8063075bcd1514610c065760405162461bcd60e51b815260206004820152600c60248201526b496e76616c696420636f646560a01b60448201526064016106d6565b600d80546001600160a01b031916905560408051338152600060208201527f4c19d31874b3f8325813d90efdd10758f703ab99b84367f07276ecd2cd69c95d91015b60405180910390a150565b60135460ff1615610c985760405162461bcd60e51b815260206004820152600f60248201526e135a5b9d1a5b99c81cdd1bdc1c1959608a1b60448201526064016106d6565b600d546001600160a01b0316331480610cc05750336000908152600f602052604090205460ff165b610d0c5760405162461bcd60e51b815260206004820152601d60248201527f43616c6c6572206973206e6f74206f776e6572206f722064657075747900000060448201526064016106d6565b6014548151600354610d1e9190612897565b10610d5e5760405162461bcd60e51b815260206004820152601060248201526f13585e081d1bdad95b881b5a5b9d195960821b60448201526064016106d6565b60006040518060600160405280602e8152602001612b56602e9139905060005b82518160ff161015610e1857610daf838260ff1681518110610da257610da26127db565b602002602001015161095d565b15610dcc5760405162461bcd60e51b81526004016106d690612771565b610e06838260ff1681518110610de457610de46127db565b6020026020010151610df560035490565b610e00906001612897565b84611ab8565b80610e10816128aa565b915050610d7e565b505050565b600d546001600160a01b03163314610e475760405162461bcd60e51b81526004016106d6906127f1565b6001600160a01b038116610e8f5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b60448201526064016106d6565b600d80546001600160a01b0319166001600160a01b0383169081179091556040805133815260208101929092527f4c19d31874b3f8325813d90efdd10758f703ab99b84367f07276ecd2cd69c95d9101610c48565b600d546001600160a01b03163314610f0e5760405162461bcd60e51b81526004016106d6906127f1565b6001600160a01b03166000908152601160205260409020805460ff19169055565b60606001805461061e90612737565b82610f488161095d565b15610f655760405162461bcd60e51b81526004016106d690612771565b60135460ff1615610faa5760405162461bcd60e51b815260206004820152600f60248201526e135a5b9d1a5b99c81cdd1bdc1c1959608a1b60448201526064016106d6565b60155460ff1615610fcd5760405162461bcd60e51b81526004016106d6906127b2565b601454600354106110135760405162461bcd60e51b815260206004820152601060248201526f13585e081d1bdad95b881b5a5b9d195960821b60448201526064016106d6565b60008281526012602052604090205460ff16156110725760405162461bcd60e51b815260206004820152601c60248201527f4475706c6963617465206e6f6e636520696e207369676e61747572650000000060448201526064016106d6565b6040805163daf0b3c560e01b6020808301919091526bffffffffffffffffffffffff1930606090811b821660248501526038840187905246605885015288901b1660788301528251808303606c018152608c909201909252805191012060006110db82866114d1565b6001600160a01b0381166000908152600f602052604090205490915060ff166111465760405162461bcd60e51b815260206004820152601960248201527f496e76616c6964207369676e61747572652f6d6573736167650000000000000060448201526064016106d6565b6000848152601260209081526040808320805460ff19166001179055805160608101909152602e8082529091612b569083013990506111998761118860035490565b611193906001612897565b83611ab8565b50505050505050565b60155460ff16156111c55760405162461bcd60e51b81526004016106d6906127b2565b3360009081526011602052604090205460ff1661121d5760405162461bcd60e51b815260206004820152601660248201527510d85b1b195c881b9bdd081dda1a5d195b1a5cdd195960521b60448201526064016106d6565b600082815260106020908152604091829020805460ff191660ff851690811790915582518581529182015233918101919091527ff8fa114c2a702f597cbc7426fcd7e5b18937b14664cc15c313dbe300accc69ee90606001610b8e565b6106ab8282611acc565b600d546001600160a01b031633146112ae5760405162461bcd60e51b81526004016106d6906127f1565b6001600160a01b0381166000908152600f602052604090205460ff16156113175760405162461bcd60e51b815260206004820152601b60248201527f446570757479204f776e657220616c726561647920657869737473000000000060448201526064016106d6565b600e805460018082019092557fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0180546001600160a01b0319166001600160a01b0384169081179091556000818152600f6020908152604091829020805460ff19168517905581519283528201929092527f3c3909677f69a0291b873bdd830b78dfb231df51c82872fde8d546da7cf855339101610c48565b826113ba8161095d565b156113d75760405162461bcd60e51b81526004016106d690612771565b60155460ff16156113fa5760405162461bcd60e51b81526004016106d6906127b2565b611406858585856119e9565b5050505050565b600e818154811061141d57600080fd5b6000918252602090912001546001600160a01b0316905081565b6000818152600860205260409020546060906001600160a01b03166114955760405162461bcd60e51b8152602060048201526014602482015273105cdcd95d08191bd95cc81b9bdd08195e1a5cdd60621b60448201526064016106d6565b6002600c60008481526020019081526020016000206040516020016114bb92919061293c565b6040516020818303038152906040529050919050565b6000806040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250905060008185604051602001611521929190612951565b604051602081830303815290604052805190602001209050600060018286604001518760000151886020015160405160008152602001604052604051611583949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa1580156115a5573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b600d546001600160a01b03163314806115e25750336000908152600f602052604090205460ff165b61162e5760405162461bcd60e51b815260206004820152601d60248201527f43616c6c6572206973206e6f74206f776e6572206f722064657075747900000060448201526064016106d6565b6106ab8282611b8a565b6002805461164590612737565b80601f016020809104026020016040519081016040528092919081815260200182805461167190612737565b80156116be5780601f10611693576101008083540402835291602001916116be565b820191906000526020600020905b8154815290600101906020018083116116a157829003601f168201915b505050505081565b600d546000906001600160a01b031633146116f35760405162461bcd60e51b81526004016106d6906127f1565b6015805460ff19168315159081179091556040519081527f0e2fb031ee032dc02d8011dc50b816eb450cf856abd8261680dac74f72165bd29060200160405180910390a15060015b919050565b6001600160a01b039182166000908152600b6020908152604080832093909416825291909152205460ff1690565b600d546001600160a01b031633146117985760405162461bcd60e51b81526004016106d6906127f1565b6013805460ff1916911515919091179055565b6000818152600860205260408120546001600160a01b03166117cf575060ff919050565b5060009081526010602052604090205460ff1690565b60006117f082610928565b9050806001600160a01b0316836001600160a01b03160361184d5760405162461bcd60e51b815260206004820152601760248201527621b0b7103737ba1030b8383937bb32903a379039b2b63360491b60448201526064016106d6565b336001600160a01b038216148061186957506118698133611740565b6118b55760405162461bcd60e51b815260206004820152601f60248201527f4e6f7420616c6c6f77656420746f2075706461746520617070726f76616c730060448201526064016106d6565b60008281526009602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b8061191c3382611bd4565b6119385760405162461bcd60e51b81526004016106d690612973565b6001600160a01b03841661195e5760405162461bcd60e51b81526004016106d69061281e565b6001600160a01b0383166119845760405162461bcd60e51b81526004016106d69061281e565b61198e8483611c33565b6119988483611cde565b6119a28383611e6b565b81836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b816119f43382611bd4565b611a105760405162461bcd60e51b81526004016106d690612973565b611a1b858585611911565b611a2785858585611f51565b6114065760405162461bcd60e51b815260206004820152601460248201527314d8599948151c985b9cd9995c8819985a5b195960621b60448201526064016106d6565b610884611a7682610928565b82612005565b6002611a8882826129eb565b507fe6e4cd5c2dc7d2c20519b41832cd550fd3ea1186bf299d108179bf71fb8e00e581604051610c48919061228f565b611ac28282611b8a565b610e18838361211e565b336001600160a01b03831603611b1e5760405162461bcd60e51b815260206004820152601760248201527621b0b7103737ba1030b8383937bb32903a379039b2b63360491b60448201526064016106d6565b336000818152600b602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000828152600c60205260409020611ba282826129eb565b507f931f495b9a8e5d8e61946ea5d61e021f636cfe213a801f97589c18c152e408bd8282604051610b8e929190612aab565b600080611be083610928565b9050806001600160a01b0316846001600160a01b03161480611c1b57506000838152600960205260409020546001600160a01b038581169116145b80611c2b5750611c2b8185611740565b949350505050565b816001600160a01b0316611c4682610928565b6001600160a01b031614611c6c5760405162461bcd60e51b81526004016106d690612ac4565b6000818152600960205260409020546001600160a01b0316156106ab5760008181526009602052604080822080546001600160a01b0319169055518291906001600160a01b038516907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925908390a45050565b816001600160a01b0316611cf182610928565b6001600160a01b031614611d175760405162461bcd60e51b81526004016106d690612ac4565b6001600160a01b0382166000908152600a6020526040902054611d3c90600190612884565b6001600160a01b0383166000818152600a60209081526040808320949094558482526008815283822080546001600160a01b031916905560068152838220549282526005905291822054909190611d9590600190612884565b6001600160a01b03851660009081526005602052604081208054929350909183908110611dc457611dc46127db565b906000526020600020015490508060056000876001600160a01b03166001600160a01b031681526020019081526020016000208481548110611e0857611e086127db565b60009182526020808320909101929092556001600160a01b0387168152600590915260408120805484908110611e4057611e406127db565b6000918252602080832090910192909255948552600690526040808520859055908452909220555050565b6000818152600860205260409020546001600160a01b031615611ec75760405162461bcd60e51b8152602060048201526014602482015273417373657420616c72656164792065786973747360601b60448201526064016106d6565b600081815260086020908152604080832080546001600160a01b0319166001600160a01b0387169081179091558352600a909152902054611f09906001612897565b6001600160a01b039092166000908152600a60209081526040808320949094556005815283822080546001810182559083528183208101849055928252600690529190912055565b6000611f65846001600160a01b03166121cc565b611f7157506001611c2b565b60405163785cf2dd60e11b81526000906001600160a01b0386169063f0b9e5ba90611fa490899088908890600401612b08565b6020604051808303816000875af1158015611fc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fe79190612b38565b6001600160e01b03191663785cf2dd60e11b14915050949350505050565b806120103382611bd4565b61202c5760405162461bcd60e51b81526004016106d690612973565b6120368383611c33565b6120408383611cde565b60008281526007602052604081205460035490919061206190600190612884565b9050600060038281548110612078576120786127db565b906000526020600020015490508060038481548110612099576120996127db565b9060005260206000200181905550600382815481106120ba576120ba6127db565b60009182526020808320909101829055868252600790526040808220829055828252808220859055518691906001600160a01b038916907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a4505050505050565b6001600160a01b0382166121445760405162461bcd60e51b81526004016106d69061281e565b61214e8282611e6b565b600380546000838152600760205260408082208390556001830184559281527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b909101839055905182916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611c2b575050151592915050565b6001600160e01b03198116811461088457600080fd5b60006020828403121561222d57600080fd5b813561223881612205565b9392505050565b60005b8381101561225a578181015183820152602001612242565b50506000910152565b6000815180845261227b81602086016020860161223f565b601f01601f19169290920160200192915050565b6020815260006122386020830184612263565b6000602082840312156122b457600080fd5b5035919050565b80356001600160a01b038116811461173b57600080fd5b600080604083850312156122e557600080fd5b6122ee836122bb565b946020939093013593505050565b60006020828403121561230e57600080fd5b612238826122bb565b60008060006060848603121561232c57600080fd5b612335846122bb565b9250612343602085016122bb565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561239257612392612353565b604052919050565b600067ffffffffffffffff8311156123b4576123b4612353565b6123c7601f8401601f1916602001612369565b90508281528383830111156123db57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261240357600080fd5b6122388383356020850161239a565b60006020828403121561242457600080fd5b813567ffffffffffffffff81111561243b57600080fd5b611c2b848285016123f2565b6000602080838503121561245a57600080fd5b823567ffffffffffffffff8082111561247257600080fd5b818501915085601f83011261248657600080fd5b81358181111561249857612498612353565b8060051b91506124a9848301612369565b81815291830184019184810190888411156124c357600080fd5b938501935b838510156124e8576124d9856122bb565b825293850193908501906124c8565b98975050505050505050565b803560ff8116811461173b57600080fd5b60006060828403121561251757600080fd5b6040516060810181811067ffffffffffffffff8211171561253a5761253a612353565b8060405250809150823581526020830135602082015261255c604084016124f4565b60408201525092915050565b600080600060a0848603121561257d57600080fd5b612586846122bb565b92506125958560208601612505565b9150608084013590509250925092565b600080604083850312156125b857600080fd5b823591506125c8602084016124f4565b90509250929050565b8035801515811461173b57600080fd5b600080604083850312156125f457600080fd5b6125fd836122bb565b91506125c8602084016125d1565b6000806000806080858703121561262157600080fd5b61262a856122bb565b9350612638602086016122bb565b925060408501359150606085013567ffffffffffffffff81111561265b57600080fd5b8501601f8101871361266c57600080fd5b61267b8782356020840161239a565b91505092959194509250565b6000806080838503121561269a57600080fd5b823591506125c88460208501612505565b600080604083850312156126be57600080fd5b82359150602083013567ffffffffffffffff8111156126dc57600080fd5b6126e8858286016123f2565b9150509250929050565b60006020828403121561270457600080fd5b612238826125d1565b6000806040838503121561272057600080fd5b612729836122bb565b91506125c8602084016122bb565b600181811c9082168061274b57607f821691505b60208210810361276b57634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526021908201527f4f6e6c792031206d696e74207061737320616c6c6f77656420706572207573656040820152603960f91b606082015260800190565b6020808252600f908201526e10dbdb9d1c9858dd081c185d5cd959608a1b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60208082526013908201527221b0b63632b91034b9903737ba1037bbb732b960691b604082015260600190565b60208082526018908201527f5a65726f2061646472657373206e6f7420616c6c6f7765640000000000000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60006001820161287d5761287d612855565b5060010190565b8181038181111561079457610794612855565b8082018082111561079457610794612855565b600060ff821660ff81036128c0576128c0612855565b60010192915050565b600081546128d681612737565b600182811680156128ee576001811461290357612932565b60ff1984168752821515830287019450612932565b8560005260208060002060005b858110156129295781548a820152908401908201612910565b50505082870194505b5050505092915050565b6000611c2b61294b83866128c9565b846128c9565b6000835161296381846020880161223f565b9190910191825250602001919050565b60208082526010908201526f21b0b7103737ba103a3930b739b332b960811b604082015260600190565b601f821115610e1857600081815260208120601f850160051c810160208610156129c45750805b601f850160051c820191505b818110156129e3578281556001016129d0565b505050505050565b815167ffffffffffffffff811115612a0557612a05612353565b612a1981612a138454612737565b8461299d565b602080601f831160018114612a4e5760008415612a365750858301515b600019600386901b1c1916600185901b1785556129e3565b600085815260208120601f198616915b82811015612a7d57888601518255948401946001909101908401612a5e565b5085821015612a9b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b828152604060208201526000611c2b6040830184612263565b60208082526024908201527f417373657420646f6573206e6f742062656c6f6e6720746f20676976656e206f6040820152633bb6b2b960e11b606082015260800190565b60018060a01b0384168152826020820152606060408201526000612b2f6060830184612263565b95945050505050565b600060208284031215612b4a57600080fd5b81516122388161220556fe516d5879563248555037687638586a783358365a4c55554d486b787364527551685a394477707a5a714831366a44a264697066735822122005c34c2317476cebbf44a2a9259f839740e5aeb2f2c84ecd93ff594547bc57f464736f6c6343000810003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000007697066733a2f2f00000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061025e5760003560e01c80638ab1d68111610146578063c87b56dd116100c3578063d734508311610087578063d734508314610581578063d76e87791461058e578063e272b892146105b1578063e985e9c5146105c4578063f9c67db4146105d7578063fef59ea5146105ea57600080fd5b8063c87b56dd14610537578063ca00043d1461054a578063d31af4841461055d578063d547cfb714610570578063d5abeb011461057857600080fd5b8063a22cb4651161010a578063a22cb465146104de578063a33cdc41146104f1578063b187bd2614610504578063b88d4fde14610511578063c400956a1461052457600080fd5b80638ab1d6811461048a5780638da5cb5b1461049d57806395d89b41146104b05780639a429a25146104b85780639c4d09a8146104cb57600080fd5b806342842e0e116101df5780636352211e116101a35780636352211e1461041857806370a082311461042b57806376c16f991461043e5780637d654c7f146104515780637da0349e14610464578063880cdc311461047757600080fd5b806342842e0e146103a157806342966c68146103b45780634f558e79146103c75780634f6ccce7146103f2578063558fc5e11461040557600080fd5b806318160ddd1161022657806318160ddd1461033357806323b872dd146103455780632f745c59146103585780633a0e6d431461036b5780633af32abf1461037e57600080fd5b806301ffc9a71461026357806306fdde03146102a5578063081812fc146102ba578063095ea7b3146102fb57806315761f0e14610310575b600080fd5b61029061027136600461221b565b6001600160e01b03191660009081526004602052604090205460ff1690565b60405190151581526020015b60405180910390f35b6102ad61060f565b60405161029c919061228f565b6102e36102c83660046122a2565b6000908152600960205260409020546001600160a01b031690565b6040516001600160a01b03909116815260200161029c565b61030e6103093660046122d2565b6106a1565b005b61029061031e3660046122fc565b600f6020526000908152604090205460ff1681565b6003545b60405190815260200161029c565b61030e610353366004612317565b6106af565b6103376103663660046122d2565b610713565b61030e6103793660046122fc565b61079a565b61029061038c3660046122fc565b60116020526000908152604090205460ff1681565b61030e6103af366004612317565b6107e8565b61030e6103c23660046122a2565b610858565b6102906103d53660046122a2565b6000908152600860205260409020546001600160a01b0316151590565b6103376104003660046122a2565b610887565b61030e610413366004612412565b6108f5565b6102e36104263660046122a2565b610928565b6103376104393660046122fc565b61095d565b61030e61044c3660046122fc565b6109a1565b61030e61045f3660046122a2565b610b9a565b61030e610472366004612447565b610c53565b61030e6104853660046122fc565b610e1d565b61030e6104983660046122fc565b610ee4565b600d546102e3906001600160a01b031681565b6102ad610f2f565b61030e6104c6366004612568565b610f3e565b61030e6104d93660046125a5565b6111a2565b61030e6104ec3660046125e1565b61127a565b61030e6104ff3660046122fc565b611284565b6015546102909060ff1681565b61030e61051f36600461260b565b6113b0565b6102e36105323660046122a2565b61140d565b6102ad6105453660046122a2565b611437565b6102e3610558366004612687565b6114d1565b61030e61056b3660046126ab565b6115ba565b6102ad611638565b61033760145481565b6013546102909060ff1681565b61029061059c3660046122a2565b60126020526000908152604090205460ff1681565b6102906105bf3660046126f2565b6116c6565b6102906105d236600461270d565b611740565b61030e6105e53660046126f2565b61176e565b6105fd6105f83660046122a2565b6117ab565b60405160ff909116815260200161029c565b60606000805461061e90612737565b80601f016020809104026020016040519081016040528092919081815260200182805461064a90612737565b80156106975780601f1061066c57610100808354040283529160200191610697565b820191906000526020600020905b81548152906001019060200180831161067a57829003601f168201915b5050505050905090565b6106ab82826117e5565b5050565b816106b98161095d565b156106df5760405162461bcd60e51b81526004016106d690612771565b60405180910390fd5b60155460ff16156107025760405162461bcd60e51b81526004016106d6906127b2565b61070d848484611911565b50505050565b600061071e8361095d565b821061075c5760405162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b60448201526064016106d6565b6001600160a01b0383166000908152600560205260409020805483908110610786576107866127db565b906000526020600020015490505b92915050565b600d546001600160a01b031633146107c45760405162461bcd60e51b81526004016106d6906127f1565b6001600160a01b03166000908152601160205260409020805460ff19166001179055565b816107f28161095d565b1561080f5760405162461bcd60e51b81526004016106d690612771565b60155460ff16156108325760405162461bcd60e51b81526004016106d6906127b2565b61070d84848460405180604001604052806002815260200161060f60f31b8152506119e9565b60155460ff161561087b5760405162461bcd60e51b81526004016106d6906127b2565b61088481611a6a565b50565b600061089260035490565b82106108d05760405162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b60448201526064016106d6565b600382815481106108e3576108e36127db565b90600052602060002001549050919050565b600d546001600160a01b0316331461091f5760405162461bcd60e51b81526004016106d6906127f1565b61088481611a7c565b6000818152600860205260408120546001600160a01b0316806107945760405162461bcd60e51b81526004016106d69061281e565b60006001600160a01b0382166109855760405162461bcd60e51b81526004016106d69061281e565b506001600160a01b03166000908152600a602052604090205490565b600d546001600160a01b031633146109cb5760405162461bcd60e51b81526004016106d6906127f1565b6001600160a01b0381166000908152600f602052604090205460ff16610a335760405162461bcd60e51b815260206004820152601b60248201527f446570757479204f776e657220646f6573206e6f74206578697473000000000060448201526064016106d6565b6000805b600e54811015610a8e57826001600160a01b0316600e8281548110610a5e57610a5e6127db565b6000918252602090912001546001600160a01b031603610a7c578091505b80610a868161286b565b915050610a37565b50600e8054610a9f90600190612884565b81548110610aaf57610aaf6127db565b600091825260209091200154600e80546001600160a01b039092169183908110610adb57610adb6127db565b600091825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055600e8054610b1490600190612884565b81548110610b2457610b246127db565b600091825260208083209190910180546001600160a01b03191690556001600160a01b038416808352600f82526040808420805460ff191690558051918252918101929092527f3c3909677f69a0291b873bdd830b78dfb231df51c82872fde8d546da7cf8553391015b60405180910390a15050565b600d546001600160a01b03163314610bc45760405162461bcd60e51b81526004016106d6906127f1565b8063075bcd1514610c065760405162461bcd60e51b815260206004820152600c60248201526b496e76616c696420636f646560a01b60448201526064016106d6565b600d80546001600160a01b031916905560408051338152600060208201527f4c19d31874b3f8325813d90efdd10758f703ab99b84367f07276ecd2cd69c95d91015b60405180910390a150565b60135460ff1615610c985760405162461bcd60e51b815260206004820152600f60248201526e135a5b9d1a5b99c81cdd1bdc1c1959608a1b60448201526064016106d6565b600d546001600160a01b0316331480610cc05750336000908152600f602052604090205460ff165b610d0c5760405162461bcd60e51b815260206004820152601d60248201527f43616c6c6572206973206e6f74206f776e6572206f722064657075747900000060448201526064016106d6565b6014548151600354610d1e9190612897565b10610d5e5760405162461bcd60e51b815260206004820152601060248201526f13585e081d1bdad95b881b5a5b9d195960821b60448201526064016106d6565b60006040518060600160405280602e8152602001612b56602e9139905060005b82518160ff161015610e1857610daf838260ff1681518110610da257610da26127db565b602002602001015161095d565b15610dcc5760405162461bcd60e51b81526004016106d690612771565b610e06838260ff1681518110610de457610de46127db565b6020026020010151610df560035490565b610e00906001612897565b84611ab8565b80610e10816128aa565b915050610d7e565b505050565b600d546001600160a01b03163314610e475760405162461bcd60e51b81526004016106d6906127f1565b6001600160a01b038116610e8f5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b60448201526064016106d6565b600d80546001600160a01b0319166001600160a01b0383169081179091556040805133815260208101929092527f4c19d31874b3f8325813d90efdd10758f703ab99b84367f07276ecd2cd69c95d9101610c48565b600d546001600160a01b03163314610f0e5760405162461bcd60e51b81526004016106d6906127f1565b6001600160a01b03166000908152601160205260409020805460ff19169055565b60606001805461061e90612737565b82610f488161095d565b15610f655760405162461bcd60e51b81526004016106d690612771565b60135460ff1615610faa5760405162461bcd60e51b815260206004820152600f60248201526e135a5b9d1a5b99c81cdd1bdc1c1959608a1b60448201526064016106d6565b60155460ff1615610fcd5760405162461bcd60e51b81526004016106d6906127b2565b601454600354106110135760405162461bcd60e51b815260206004820152601060248201526f13585e081d1bdad95b881b5a5b9d195960821b60448201526064016106d6565b60008281526012602052604090205460ff16156110725760405162461bcd60e51b815260206004820152601c60248201527f4475706c6963617465206e6f6e636520696e207369676e61747572650000000060448201526064016106d6565b6040805163daf0b3c560e01b6020808301919091526bffffffffffffffffffffffff1930606090811b821660248501526038840187905246605885015288901b1660788301528251808303606c018152608c909201909252805191012060006110db82866114d1565b6001600160a01b0381166000908152600f602052604090205490915060ff166111465760405162461bcd60e51b815260206004820152601960248201527f496e76616c6964207369676e61747572652f6d6573736167650000000000000060448201526064016106d6565b6000848152601260209081526040808320805460ff19166001179055805160608101909152602e8082529091612b569083013990506111998761118860035490565b611193906001612897565b83611ab8565b50505050505050565b60155460ff16156111c55760405162461bcd60e51b81526004016106d6906127b2565b3360009081526011602052604090205460ff1661121d5760405162461bcd60e51b815260206004820152601660248201527510d85b1b195c881b9bdd081dda1a5d195b1a5cdd195960521b60448201526064016106d6565b600082815260106020908152604091829020805460ff191660ff851690811790915582518581529182015233918101919091527ff8fa114c2a702f597cbc7426fcd7e5b18937b14664cc15c313dbe300accc69ee90606001610b8e565b6106ab8282611acc565b600d546001600160a01b031633146112ae5760405162461bcd60e51b81526004016106d6906127f1565b6001600160a01b0381166000908152600f602052604090205460ff16156113175760405162461bcd60e51b815260206004820152601b60248201527f446570757479204f776e657220616c726561647920657869737473000000000060448201526064016106d6565b600e805460018082019092557fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0180546001600160a01b0319166001600160a01b0384169081179091556000818152600f6020908152604091829020805460ff19168517905581519283528201929092527f3c3909677f69a0291b873bdd830b78dfb231df51c82872fde8d546da7cf855339101610c48565b826113ba8161095d565b156113d75760405162461bcd60e51b81526004016106d690612771565b60155460ff16156113fa5760405162461bcd60e51b81526004016106d6906127b2565b611406858585856119e9565b5050505050565b600e818154811061141d57600080fd5b6000918252602090912001546001600160a01b0316905081565b6000818152600860205260409020546060906001600160a01b03166114955760405162461bcd60e51b8152602060048201526014602482015273105cdcd95d08191bd95cc81b9bdd08195e1a5cdd60621b60448201526064016106d6565b6002600c60008481526020019081526020016000206040516020016114bb92919061293c565b6040516020818303038152906040529050919050565b6000806040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250905060008185604051602001611521929190612951565b604051602081830303815290604052805190602001209050600060018286604001518760000151886020015160405160008152602001604052604051611583949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa1580156115a5573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b600d546001600160a01b03163314806115e25750336000908152600f602052604090205460ff165b61162e5760405162461bcd60e51b815260206004820152601d60248201527f43616c6c6572206973206e6f74206f776e6572206f722064657075747900000060448201526064016106d6565b6106ab8282611b8a565b6002805461164590612737565b80601f016020809104026020016040519081016040528092919081815260200182805461167190612737565b80156116be5780601f10611693576101008083540402835291602001916116be565b820191906000526020600020905b8154815290600101906020018083116116a157829003601f168201915b505050505081565b600d546000906001600160a01b031633146116f35760405162461bcd60e51b81526004016106d6906127f1565b6015805460ff19168315159081179091556040519081527f0e2fb031ee032dc02d8011dc50b816eb450cf856abd8261680dac74f72165bd29060200160405180910390a15060015b919050565b6001600160a01b039182166000908152600b6020908152604080832093909416825291909152205460ff1690565b600d546001600160a01b031633146117985760405162461bcd60e51b81526004016106d6906127f1565b6013805460ff1916911515919091179055565b6000818152600860205260408120546001600160a01b03166117cf575060ff919050565b5060009081526010602052604090205460ff1690565b60006117f082610928565b9050806001600160a01b0316836001600160a01b03160361184d5760405162461bcd60e51b815260206004820152601760248201527621b0b7103737ba1030b8383937bb32903a379039b2b63360491b60448201526064016106d6565b336001600160a01b038216148061186957506118698133611740565b6118b55760405162461bcd60e51b815260206004820152601f60248201527f4e6f7420616c6c6f77656420746f2075706461746520617070726f76616c730060448201526064016106d6565b60008281526009602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b8061191c3382611bd4565b6119385760405162461bcd60e51b81526004016106d690612973565b6001600160a01b03841661195e5760405162461bcd60e51b81526004016106d69061281e565b6001600160a01b0383166119845760405162461bcd60e51b81526004016106d69061281e565b61198e8483611c33565b6119988483611cde565b6119a28383611e6b565b81836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b816119f43382611bd4565b611a105760405162461bcd60e51b81526004016106d690612973565b611a1b858585611911565b611a2785858585611f51565b6114065760405162461bcd60e51b815260206004820152601460248201527314d8599948151c985b9cd9995c8819985a5b195960621b60448201526064016106d6565b610884611a7682610928565b82612005565b6002611a8882826129eb565b507fe6e4cd5c2dc7d2c20519b41832cd550fd3ea1186bf299d108179bf71fb8e00e581604051610c48919061228f565b611ac28282611b8a565b610e18838361211e565b336001600160a01b03831603611b1e5760405162461bcd60e51b815260206004820152601760248201527621b0b7103737ba1030b8383937bb32903a379039b2b63360491b60448201526064016106d6565b336000818152600b602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000828152600c60205260409020611ba282826129eb565b507f931f495b9a8e5d8e61946ea5d61e021f636cfe213a801f97589c18c152e408bd8282604051610b8e929190612aab565b600080611be083610928565b9050806001600160a01b0316846001600160a01b03161480611c1b57506000838152600960205260409020546001600160a01b038581169116145b80611c2b5750611c2b8185611740565b949350505050565b816001600160a01b0316611c4682610928565b6001600160a01b031614611c6c5760405162461bcd60e51b81526004016106d690612ac4565b6000818152600960205260409020546001600160a01b0316156106ab5760008181526009602052604080822080546001600160a01b0319169055518291906001600160a01b038516907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925908390a45050565b816001600160a01b0316611cf182610928565b6001600160a01b031614611d175760405162461bcd60e51b81526004016106d690612ac4565b6001600160a01b0382166000908152600a6020526040902054611d3c90600190612884565b6001600160a01b0383166000818152600a60209081526040808320949094558482526008815283822080546001600160a01b031916905560068152838220549282526005905291822054909190611d9590600190612884565b6001600160a01b03851660009081526005602052604081208054929350909183908110611dc457611dc46127db565b906000526020600020015490508060056000876001600160a01b03166001600160a01b031681526020019081526020016000208481548110611e0857611e086127db565b60009182526020808320909101929092556001600160a01b0387168152600590915260408120805484908110611e4057611e406127db565b6000918252602080832090910192909255948552600690526040808520859055908452909220555050565b6000818152600860205260409020546001600160a01b031615611ec75760405162461bcd60e51b8152602060048201526014602482015273417373657420616c72656164792065786973747360601b60448201526064016106d6565b600081815260086020908152604080832080546001600160a01b0319166001600160a01b0387169081179091558352600a909152902054611f09906001612897565b6001600160a01b039092166000908152600a60209081526040808320949094556005815283822080546001810182559083528183208101849055928252600690529190912055565b6000611f65846001600160a01b03166121cc565b611f7157506001611c2b565b60405163785cf2dd60e11b81526000906001600160a01b0386169063f0b9e5ba90611fa490899088908890600401612b08565b6020604051808303816000875af1158015611fc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fe79190612b38565b6001600160e01b03191663785cf2dd60e11b14915050949350505050565b806120103382611bd4565b61202c5760405162461bcd60e51b81526004016106d690612973565b6120368383611c33565b6120408383611cde565b60008281526007602052604081205460035490919061206190600190612884565b9050600060038281548110612078576120786127db565b906000526020600020015490508060038481548110612099576120996127db565b9060005260206000200181905550600382815481106120ba576120ba6127db565b60009182526020808320909101829055868252600790526040808220829055828252808220859055518691906001600160a01b038916907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a4505050505050565b6001600160a01b0382166121445760405162461bcd60e51b81526004016106d69061281e565b61214e8282611e6b565b600380546000838152600760205260408082208390556001830184559281527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b909101839055905182916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611c2b575050151592915050565b6001600160e01b03198116811461088457600080fd5b60006020828403121561222d57600080fd5b813561223881612205565b9392505050565b60005b8381101561225a578181015183820152602001612242565b50506000910152565b6000815180845261227b81602086016020860161223f565b601f01601f19169290920160200192915050565b6020815260006122386020830184612263565b6000602082840312156122b457600080fd5b5035919050565b80356001600160a01b038116811461173b57600080fd5b600080604083850312156122e557600080fd5b6122ee836122bb565b946020939093013593505050565b60006020828403121561230e57600080fd5b612238826122bb565b60008060006060848603121561232c57600080fd5b612335846122bb565b9250612343602085016122bb565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561239257612392612353565b604052919050565b600067ffffffffffffffff8311156123b4576123b4612353565b6123c7601f8401601f1916602001612369565b90508281528383830111156123db57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261240357600080fd5b6122388383356020850161239a565b60006020828403121561242457600080fd5b813567ffffffffffffffff81111561243b57600080fd5b611c2b848285016123f2565b6000602080838503121561245a57600080fd5b823567ffffffffffffffff8082111561247257600080fd5b818501915085601f83011261248657600080fd5b81358181111561249857612498612353565b8060051b91506124a9848301612369565b81815291830184019184810190888411156124c357600080fd5b938501935b838510156124e8576124d9856122bb565b825293850193908501906124c8565b98975050505050505050565b803560ff8116811461173b57600080fd5b60006060828403121561251757600080fd5b6040516060810181811067ffffffffffffffff8211171561253a5761253a612353565b8060405250809150823581526020830135602082015261255c604084016124f4565b60408201525092915050565b600080600060a0848603121561257d57600080fd5b612586846122bb565b92506125958560208601612505565b9150608084013590509250925092565b600080604083850312156125b857600080fd5b823591506125c8602084016124f4565b90509250929050565b8035801515811461173b57600080fd5b600080604083850312156125f457600080fd5b6125fd836122bb565b91506125c8602084016125d1565b6000806000806080858703121561262157600080fd5b61262a856122bb565b9350612638602086016122bb565b925060408501359150606085013567ffffffffffffffff81111561265b57600080fd5b8501601f8101871361266c57600080fd5b61267b8782356020840161239a565b91505092959194509250565b6000806080838503121561269a57600080fd5b823591506125c88460208501612505565b600080604083850312156126be57600080fd5b82359150602083013567ffffffffffffffff8111156126dc57600080fd5b6126e8858286016123f2565b9150509250929050565b60006020828403121561270457600080fd5b612238826125d1565b6000806040838503121561272057600080fd5b612729836122bb565b91506125c8602084016122bb565b600181811c9082168061274b57607f821691505b60208210810361276b57634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526021908201527f4f6e6c792031206d696e74207061737320616c6c6f77656420706572207573656040820152603960f91b606082015260800190565b6020808252600f908201526e10dbdb9d1c9858dd081c185d5cd959608a1b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60208082526013908201527221b0b63632b91034b9903737ba1037bbb732b960691b604082015260600190565b60208082526018908201527f5a65726f2061646472657373206e6f7420616c6c6f7765640000000000000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60006001820161287d5761287d612855565b5060010190565b8181038181111561079457610794612855565b8082018082111561079457610794612855565b600060ff821660ff81036128c0576128c0612855565b60010192915050565b600081546128d681612737565b600182811680156128ee576001811461290357612932565b60ff1984168752821515830287019450612932565b8560005260208060002060005b858110156129295781548a820152908401908201612910565b50505082870194505b5050505092915050565b6000611c2b61294b83866128c9565b846128c9565b6000835161296381846020880161223f565b9190910191825250602001919050565b60208082526010908201526f21b0b7103737ba103a3930b739b332b960811b604082015260600190565b601f821115610e1857600081815260208120601f850160051c810160208610156129c45750805b601f850160051c820191505b818110156129e3578281556001016129d0565b505050505050565b815167ffffffffffffffff811115612a0557612a05612353565b612a1981612a138454612737565b8461299d565b602080601f831160018114612a4e5760008415612a365750858301515b600019600386901b1c1916600185901b1785556129e3565b600085815260208120601f198616915b82811015612a7d57888601518255948401946001909101908401612a5e565b5085821015612a9b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b828152604060208201526000611c2b6040830184612263565b60208082526024908201527f417373657420646f6573206e6f742062656c6f6e6720746f20676976656e206f6040820152633bb6b2b960e11b606082015260800190565b60018060a01b0384168152826020820152606060408201526000612b2f6060830184612263565b95945050505050565b600060208284031215612b4a57600080fd5b81516122388161220556fe516d5879563248555037687638586a783358365a4c55554d486b787364527551685a394477707a5a714831366a44a264697066735822122005c34c2317476cebbf44a2a9259f839740e5aeb2f2c84ecd93ff594547bc57f464736f6c63430008100033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000007697066733a2f2f00000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _baseTokenUri (string): ipfs://

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [2] : 697066733a2f2f00000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

115:5581:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17697:168:1;;;;;;:::i;:::-;-1:-1:-1;;;;;;17824:33:1;17795:4;17824:33;;;:19;:33;;;;;;;;;17697:168;;;;565:14:8;;558:22;540:41;;528:2;513:18;17697:168:1;;;;;;;;3128:85;;;:::i;:::-;;;;;;;:::i;6162:119::-;;;;;;:::i;:::-;6222:7;6249:24;;;:14;:24;;;;;;-1:-1:-1;;;;;6249:24:1;;6162:119;;;;-1:-1:-1;;;;;1697:32:8;;;1679:51;;1667:2;1652:18;6162:119:1;1533:203:8;531:103:2;;;;;;:::i;:::-;;:::i;:::-;;153:45:6;;;;;;:::i;:::-;;;;;;;;;;;;;;;;17078:95:1;17149:9;:16;17078:95;;;2515:25:8;;;2503:2;2488:18;17078:95:1;2369:177:8;3286:211:5;;;;;;:::i;:::-;;:::i;16681:239:1:-;;;;;;:::i;:::-;;:::i;4427:125:5:-;;;;;;:::i;:::-;;:::i;384:45::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;3505:225;;;;;;:::i;:::-;;:::i;4001:97::-;;;;;;:::i;:::-;;:::i;4922:153:1:-;;;;;;:::i;:::-;4977:4;5010:20;;;:10;:20;;;;;;-1:-1:-1;;;;;5010:20:1;5048:19;;;4922:153;17519:170;;;;;;:::i;:::-;;:::i;4286:133:5:-;;;;;;:::i;:::-;;:::i;4515:210:1:-;;;;;;:::i;:::-;;:::i;4100:183::-;;;;;;:::i;:::-;;:::i;1988:587:6:-;;;;;;:::i;:::-;;:::i;2821:221::-;;;;;;:::i;:::-;;:::i;2509:456:5:-;;;;;;:::i;:::-;;:::i;972:208:6:-;;;;;;:::i;:::-;;:::i;4560:128:5:-;;;;;;:::i;:::-;;:::i;88:20:6:-;;;;;-1:-1:-1;;;;;88:20:6;;;3327:89:1;;;:::i;1580:921:5:-;;;;;;:::i;:::-;;:::i;2973:305::-;;;;;;:::i;:::-;;:::i;642:122:2:-;;;;;;:::i;:::-;;:::i;1469:261:6:-;;;;;;:::i;:::-;;:::i;692:28:5:-;;;;;;;;;3738:255;;;;;;:::i;:::-;;:::i;115:29:6:-;;;;;;:::i;:::-;;:::i;2046:267:2:-;;;;;;:::i;:::-;;:::i;4979:369:5:-;;;;;;:::i;:::-;;:::i;4112:166::-;;;;;;:::i;:::-;;:::i;745:26:1:-;;;:::i;634:24:5:-;;;;;;552;;;;;;;;;494:49;;;;;;:::i;:::-;;;;;;;;;;;;;;;;4806:165;;;;;;:::i;:::-;;:::i;7167:182:1:-;;;;;;:::i;:::-;;:::i;4696:102:5:-;;;;;;:::i;:::-;;:::i;5356:166::-;;;;;;:::i;:::-;;:::i;:::-;;;8982:4:8;8970:17;;;8952:36;;8940:2;8925:18;5356:166:5;8810:184:8;3128:85:1;3167:13;3200:5;3193:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3128:85;:::o;531:103:2:-;597:29;612:3;617:8;597:14;:29::i;:::-;531:103;;:::o;3286:211:5:-;3422:3;1135:15;1145:4;1135:9;:15::i;:::-;:20;1127:66;;;;-1:-1:-1;;;1127:66:5;;;;;;;:::i;:::-;;;;;;;;;1365:8:::1;::::0;::::1;;1364:9;1356:37;;;;-1:-1:-1::0;;;1356:37:5::1;;;;;;;:::i;:::-;3448:41:::2;3468:5;3475:3;3480:8;3448:19;:41::i;:::-;3286:211:::0;;;;:::o;16681:239:1:-;16790:7;16832:17;16842:6;16832:9;:17::i;:::-;16823:6;:26;16815:52;;;;-1:-1:-1;;;16815:52:1;;10332:2:8;16815:52:1;;;10314:21:8;10371:2;10351:18;;;10344:30;-1:-1:-1;;;10390:18:8;;;10383:43;10443:18;;16815:52:1;10130:337:8;16815:52:1;-1:-1:-1;;;;;16885:19:1;;;;;;:11;:19;;;;;:27;;16905:6;;16885:27;;;;;;:::i;:::-;;;;;;;;;16878:34;;16681:239;;;;;:::o;4427:125:5:-;483:5:6;;-1:-1:-1;;;;;483:5:6;469:10;:19;461:51;;;;-1:-1:-1;;;461:51:6;;;;;;;:::i;:::-;-1:-1:-1;;;;;4507:30:5::1;;::::0;;;:13:::1;:30;::::0;;;;:37;;-1:-1:-1;;4507:37:5::1;4540:4;4507:37;::::0;;4427:125::o;3505:225::-;3645:3;1135:15;1145:4;1135:9;:15::i;:::-;:20;1127:66;;;;-1:-1:-1;;;1127:66:5;;;;;;;:::i;:::-;1365:8:::1;::::0;::::1;;1364:9;1356:37;;;;-1:-1:-1::0;;;1356:37:5::1;;;;;;;:::i;:::-;3671:51:::2;3695:5;3702:3;3707:8;3671:51;;;;;;;;;;;;;-1:-1:-1::0;;;3671:51:5::2;;::::0;:23:::2;:51::i;4001:97::-:0;1365:8;;;;1364:9;1356:37;;;;-1:-1:-1;;;1356:37:5;;;;;;;:::i;:::-;4070:20:::1;4081:8;4070:10;:20::i;:::-;4001:97:::0;:::o;17519:170:1:-;17578:7;17615:13;17149:9;:16;;17078:95;17615:13;17606:6;:22;17598:48;;;;-1:-1:-1;;;17598:48:1;;10332:2:8;17598:48:1;;;10314:21:8;10371:2;10351:18;;;10344:30;-1:-1:-1;;;10390:18:8;;;10383:43;10443:18;;17598:48:1;10130:337:8;17598:48:1;17664:9;17674:6;17664:17;;;;;;;;:::i;:::-;;;;;;;;;17657:24;;17519:170;;;:::o;4286:133:5:-;483:5:6;;-1:-1:-1;;;;;483:5:6;469:10;:19;461:51;;;;-1:-1:-1;;;461:51:6;;;;;;;:::i;:::-;4371:40:5::1;4397:13;4371:25;:40::i;4515:210:1:-:0;4571:7;4607:20;;;:10;:20;;;;;;-1:-1:-1;;;;;4607:20:1;;4638:56;;;;-1:-1:-1;;;4638:56:1;;;;;;;:::i;4100:183::-;4156:7;-1:-1:-1;;;;;4184:20:1;;4176:57;;;;-1:-1:-1;;;4176:57:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;;4251:24:1;;;;;:16;:24;;;;;;;4100:183::o;1988:587:6:-;483:5;;-1:-1:-1;;;;;483:5:6;469:10;:19;461:51;;;;-1:-1:-1;;;461:51:6;;;;;;;:::i;:::-;-1:-1:-1;;;;;2072:26:6;::::1;;::::0;;;:13:::1;:26;::::0;;;;;::::1;;2064:66;;;::::0;-1:-1:-1;;;2064:66:6;;11507:2:8;2064:66:6::1;::::0;::::1;11489:21:8::0;11546:2;11526:18;;;11519:30;11585:29;11565:18;;;11558:57;11632:18;;2064:66:6::1;11305:351:8::0;2064:66:6::1;2141:18;::::0;2170:127:::1;2194:12;:19:::0;2190:23;::::1;2170:127;;;2258:11;-1:-1:-1::0;;;;;2239:30:6::1;:12;2252:1;2239:15;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;2239:15:6::1;:30:::0;2235:50:::1;;2284:1;2271:14;;2235:50;2215:3:::0;::::1;::::0;::::1;:::i;:::-;;;;2170:127;;;-1:-1:-1::0;2376:12:6::1;2389:19:::0;;:23:::1;::::0;2411:1:::1;::::0;2389:23:::1;:::i;:::-;2376:37;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;2349:12:::1;:24:::0;;-1:-1:-1;;;;;2376:37:6;;::::1;::::0;2362:10;;2349:24;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:64:::0;;-1:-1:-1;;;;;;2349:64:6::1;-1:-1:-1::0;;;;;2349:64:6;;;::::1;::::0;;;::::1;::::0;;2431:12:::1;2444:19:::0;;:23:::1;::::0;-1:-1:-1;;2444:23:6::1;:::i;:::-;2431:37;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;2424:44:::0;;-1:-1:-1;;;;;;2424:44:6::1;::::0;;-1:-1:-1;;;;;2479:26:6;::::1;::::0;;;:13:::1;:26:::0;;;;;;:34;;-1:-1:-1;;2479:34:6::1;::::0;;2529:38;;12234:51:8;;;12301:18;;;12294:50;;;;2529:38:6::1;::::0;12207:18:8;2529:38:6::1;;;;;;;;2053:522;1988:587:::0;:::o;2821:221::-;483:5;;-1:-1:-1;;;;;483:5:6;469:10;:19;461:51;;;;-1:-1:-1;;;461:51:6;;;;;;;:::i;:::-;2909:15:::1;2928:9;2909:28;2901:53;;;::::0;-1:-1:-1;;;2901:53:6;;12557:2:8;2901:53:6::1;::::0;::::1;12539:21:8::0;12596:2;12576:18;;;12569:30;-1:-1:-1;;;12615:18:8;;;12608:42;12667:18;;2901:53:6::1;12355:336:8::0;2901:53:6::1;2965:5;:18:::0;;-1:-1:-1;;;;;;2965:18:6::1;::::0;;2999:35:::1;::::0;;3016:10:::1;12908:34:8::0;;-1:-1:-1;12973:2:8;12958:18;;12951:43;2999:35:6::1;::::0;12843:18:8;2999:35:6::1;;;;;;;;2821:221:::0;:::o;2509:456:5:-;1264:12;;;;1263:13;1255:41;;;;-1:-1:-1;;;1255:41:5;;13207:2:8;1255:41:5;;;13189:21:8;13246:2;13226:18;;;13219:30;-1:-1:-1;;;13265:18:8;;;13258:45;13320:18;;1255:41:5;13005:339:8;1255:41:5;616:5:6::1;::::0;-1:-1:-1;;;;;616:5:6::1;602:10;:19;::::0;:48:::1;;-1:-1:-1::0;639:10:6::1;625:25;::::0;;;:13:::1;:25;::::0;;;;;::::1;;602:48;580:127;;;::::0;-1:-1:-1;;;580:127:6;;13551:2:8;580:127:6::1;::::0;::::1;13533:21:8::0;13590:2;13570:18;;;13563:30;13629:31;13609:18;;;13602:59;13678:18;;580:127:6::1;13349:353:8::0;580:127:6::1;2646:9:5::2;::::0;2631:12;;17149:9:1;:16;2615:28:5::2;;;;:::i;:::-;:40;2607:69;;;::::0;-1:-1:-1;;;2607:69:5;;14039:2:8;2607:69:5::2;::::0;::::2;14021:21:8::0;14078:2;14058:18;;;14051:30;-1:-1:-1;;;14097:18:8;;;14090:46;14153:18;;2607:69:5::2;13837:340:8::0;2607:69:5::2;2687:17;:68;;;;;;;;;;;;;;;;;;;2770:7;2766:192;2783:5;:12;2781:1;:14;;;2766:192;;;2825:19;2835:5;2841:1;2835:8;;;;;;;;;;:::i;:::-;;;;;;;2825:9;:19::i;:::-;:24:::0;2817:70:::2;;;;-1:-1:-1::0;;;2817:70:5::2;;;;;;;:::i;:::-;2902:44;2913:5;2919:1;2913:8;;;;;;;;;;:::i;:::-;;;;;;;2923:13;17149:9:1::0;:16;;17078:95;2923:13:5::2;:17;::::0;2939:1:::2;2923:17;:::i;:::-;2942:3;2902:10;:44::i;:::-;2797:3:::0;::::2;::::0;::::2;:::i;:::-;;;;2766:192;;;;2596:369;2509:456:::0;:::o;972:208:6:-;483:5;;-1:-1:-1;;;;;483:5:6;469:10;:19;461:51;;;;-1:-1:-1;;;461:51:6;;;;;;;:::i;:::-;-1:-1:-1;;;;;1048:25:6;::::1;1040:53;;;::::0;-1:-1:-1;;;1040:53:6;;14564:2:8;1040:53:6::1;::::0;::::1;14546:21:8::0;14603:2;14583:18;;;14576:30;-1:-1:-1;;;14622:18:8;;;14615:45;14677:18;;1040:53:6::1;14362:339:8::0;1040:53:6::1;1104:5;:17:::0;;-1:-1:-1;;;;;;1104:17:6::1;-1:-1:-1::0;;;;;1104:17:6;::::1;::::0;;::::1;::::0;;;1137:35:::1;::::0;;1154:10:::1;12908:34:8::0;;12973:2;12958:18;;12951:43;;;;1137:35:6::1;::::0;12843:18:8;1137:35:6::1;12696:304:8::0;4560:128:5;483:5:6;;-1:-1:-1;;;;;483:5:6;469:10;:19;461:51;;;;-1:-1:-1;;;461:51:6;;;;;;;:::i;:::-;-1:-1:-1;;;;;4642:30:5::1;4675:5;4642:30:::0;;;:13:::1;:30;::::0;;;;:38;;-1:-1:-1;;4642:38:5::1;::::0;;4560:128::o;3327:89:1:-;3368:13;3401:7;3394:14;;;;;:::i;1580:921:5:-;1721:4;1135:15;1145:4;1135:9;:15::i;:::-;:20;1127:66;;;;-1:-1:-1;;;1127:66:5;;;;;;;:::i;:::-;1264:12:::1;::::0;::::1;;1263:13;1255:41;;;::::0;-1:-1:-1;;;1255:41:5;;13207:2:8;1255:41:5::1;::::0;::::1;13189:21:8::0;13246:2;13226:18;;;13219:30;-1:-1:-1;;;13265:18:8;;;13258:45;13320:18;;1255:41:5::1;13005:339:8::0;1255:41:5::1;1365:8:::2;::::0;::::2;;1364:9;1356:37;;;;-1:-1:-1::0;;;1356:37:5::2;;;;;;;:::i;:::-;1784:9:::3;::::0;17149::1;:16;1768:25:5::3;1760:54;;;::::0;-1:-1:-1;;;1760:54:5;;14039:2:8;1760:54:5::3;::::0;::::3;14021:21:8::0;14078:2;14058:18;;;14051:30;-1:-1:-1;;;14097:18:8;;;14090:46;14153:18;;1760:54:5::3;13837:340:8::0;1760:54:5::3;1848:30;::::0;;;:17:::3;:30;::::0;;;;;::::3;;1847:31;1825:109;;;::::0;-1:-1:-1;;;1825:109:5;;14908:2:8;1825:109:5::3;::::0;::::3;14890:21:8::0;14947:2;14927:18;;;14920:30;14986;14966:18;;;14959:58;15034:18;;1825:109:5::3;14706:352:8::0;1825:109:5::3;1984:191;::::0;;-1:-1:-1;;;1984:191:5::3;::::0;;::::3;15302:46:8::0;;;;-1:-1:-1;;2071:4:5::3;15435:2:8::0;15431:15;;;15427:24;;15414:11;;;15407:45;15468:12;;;15461:28;;;5646:9:5;15505:12:8;;;15498:28;15560:15;;;15556:24;15542:12;;;15535:46;1984:191:5;;;;;;;;;15597:13:8;;;;1984:191:5;;;1960:226;;;::::3;::::0;-1:-1:-1;2214:31:5::3;1960:226:::0;2230:14;2214:9:::3;:31::i;:::-;-1:-1:-1::0;;;;;2264:21:5;::::3;;::::0;;;:13:::3;:21;::::0;;;;;2197:48;;-1:-1:-1;2264:21:5::3;;2256:59;;;::::0;-1:-1:-1;;;2256:59:5;;15823:2:8;2256:59:5::3;::::0;::::3;15805:21:8::0;15862:2;15842:18;;;15835:30;15901:27;15881:18;;;15874:55;15946:18;;2256:59:5::3;15621:349:8::0;2256:59:5::3;2326:30;::::0;;;:17:::3;:30;::::0;;;;;;;:37;;-1:-1:-1;;2326:37:5::3;2359:4;2326:37;::::0;;2374:68;;::::3;::::0;::::3;::::0;;;::::3;::::0;;;;;::::3;::::0;;::::3;;;;2453:40;2464:4;2470:13;17149:9:1::0;:16;;17078:95;2470:13:5::3;:17;::::0;2486:1:::3;2470:17;:::i;:::-;2489:3;2453:10;:40::i;:::-;1749:752;;;1580:921:::0;;;;:::o;2973:305::-;1365:8;;;;1364:9;1356:37;;;;-1:-1:-1;;;1356:37:5;;;;;;;:::i;:::-;3114:10:::1;3100:25;::::0;;;:13:::1;:25;::::0;;;;;::::1;;3092:60;;;::::0;-1:-1:-1;;;3092:60:5;;16177:2:8;3092:60:5::1;::::0;::::1;16159:21:8::0;16216:2;16196:18;;;16189:30;-1:-1:-1;;;16235:18:8;;;16228:52;16297:18;;3092:60:5::1;15975:346:8::0;3092:60:5::1;3163:22;::::0;;;:13:::1;:22;::::0;;;;;;;;:39;;-1:-1:-1;;3163:39:5::1;;::::0;::::1;::::0;;::::1;::::0;;;3218:52;;16524:25:8;;;16565:18;;;16558:45;3259:10:5::1;16619:18:8::0;;;16612:60;;;;3218:52:5::1;::::0;16512:2:8;16497:18;3218:52:5::1;16326:352:8::0;642:122:2;716:40;741:3;746:9;716:24;:40::i;1469:261:6:-;483:5;;-1:-1:-1;;;;;483:5:6;469:10;:19;461:51;;;;-1:-1:-1;;;461:51:6;;;;;;;:::i;:::-;-1:-1:-1;;;;;1546:21:6;::::1;;::::0;;;:13:::1;:21;::::0;;;;;::::1;;1545:22;1537:62;;;::::0;-1:-1:-1;;;1537:62:6;;16885:2:8;1537:62:6::1;::::0;::::1;16867:21:8::0;16924:2;16904:18;;;16897:30;16963:29;16943:18;;;16936:57;17010:18;;1537:62:6::1;16683:351:8::0;1537:62:6::1;1610:12;:25:::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;;1610:25:6::1;-1:-1:-1::0;;;;;1610:25:6;::::1;::::0;;::::1;::::0;;;-1:-1:-1;1646:21:6;;;:13:::1;1610:25;1646:21:::0;;;;;;;;:28;;-1:-1:-1;;1646:28:6::1;::::0;::::1;::::0;;1690:32;;12234:51:8;;;12301:18;;12294:50;;;;1690:32:6::1;::::0;12207:18:8;1690:32:6::1;12066:284:8::0;3738:255:5;3907:3;1135:15;1145:4;1135:9;:15::i;:::-;:20;1127:66;;;;-1:-1:-1;;;1127:66:5;;;;;;;:::i;:::-;1365:8:::1;::::0;::::1;;1364:9;1356:37;;;;-1:-1:-1::0;;;1356:37:5::1;;;;;;;:::i;:::-;3933:52:::2;3957:5;3964:3;3969:8;3979:5;3933:23;:52::i;:::-;3738:255:::0;;;;;:::o;115:29:6:-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;115:29:6;;-1:-1:-1;115:29:6;:::o;2046:267:2:-;4977:4:1;5010:20;;;:10;:20;;;;;;2148:13:2;;-1:-1:-1;;;;;5010:20:1;2179:49:2;;;;-1:-1:-1;;;2179:49:2;;17241:2:8;2179:49:2;;;17223:21:8;17280:2;17260:18;;;17253:30;-1:-1:-1;;;17299:18:8;;;17292:50;17359:18;;2179:49:2;17039:344:8;2179:49:2;2270:12;2284:9;:19;2294:8;2284:19;;;;;;;;;;;2253:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2239:66;;2046:267;;;:::o;4979:369:5:-;5085:7;5110:19;:56;;;;;;;;;;;;;;;;;;;5177:20;5227:6;5235:7;5210:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5200:44;;;;;;5177:67;;5255:14;5272:44;5282:12;5296:3;:5;;;5303:3;:5;;;5310:3;:5;;;5272:44;;;;;;;;;;;;;;;;;19138:25:8;;;19211:4;19199:17;;;;19194:2;19179:18;;19172:45;19248:2;19233:18;;19226:34;19291:2;19276:18;;19269:34;19125:3;19110:19;;18911:398;5272:44:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5272:44:5;;-1:-1:-1;;5272:44:5;;;4979:369;-1:-1:-1;;;;;;;4979:369:5:o;4112:166::-;616:5:6;;-1:-1:-1;;;;;616:5:6;602:10;:19;;:48;;-1:-1:-1;639:10:6;625:25;;;;:13;:25;;;;;;;;602:48;580:127;;;;-1:-1:-1;;;580:127:6;;13551:2:8;580:127:6;;;13533:21:8;13590:2;13570:18;;;13563:30;13629:31;13609:18;;;13602:59;13678:18;;580:127:6;13349:353:8;580:127:6;4233:37:5::1;4255:8;4265:4;4233:21;:37::i;745:26:1:-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4806:165:5:-;483:5:6;;4871:4:5;;-1:-1:-1;;;;;483:5:6;469:10;:19;461:51;;;;-1:-1:-1;;;461:51:6;;;;;;;:::i;:::-;4888:8:5::1;:20:::0;;-1:-1:-1;;4888:20:5::1;::::0;::::1;;::::0;;::::1;::::0;;;4924:17:::1;::::0;540:41:8;;;4924:17:5::1;::::0;528:2:8;513:18;4924:17:5::1;;;;;;;-1:-1:-1::0;4959:4:5::1;523:1:6;4806:165:5::0;;;:::o;7167:182:1:-;-1:-1:-1;;;;;7305:25:1;;;7276:4;7305:25;;;:17;:25;;;;;;;;:36;;;;;;;;;;;;;;;7167:182::o;4696:102:5:-;483:5:6;;-1:-1:-1;;;;;483:5:6;469:10;:19;461:51;;;;-1:-1:-1;;;461:51:6;;;;;;;:::i;:::-;4765:12:5::1;:25:::0;;-1:-1:-1;;4765:25:5::1;::::0;::::1;;::::0;;;::::1;::::0;;4696:102::o;5356:166::-;5419:5;5010:20:1;;;:10;:20;;;;;;-1:-1:-1;;;;;5010:20:1;5437:37:5;;-1:-1:-1;814:3:5;;5356:166;-1:-1:-1;5356:166:5:o;5437:37::-;-1:-1:-1;5492:22:5;;;;:13;:22;;;;;;;;;5356:166::o;5508:408:1:-;5577:13;5593:17;5601:8;5593:7;:17::i;:::-;5577:33;;5636:5;-1:-1:-1;;;;;5629:12:1;:3;-1:-1:-1;;;;;5629:12:1;;5621:48;;;;-1:-1:-1;;;5621:48:1;;19516:2:8;5621:48:1;;;19498:21:8;19555:2;19535:18;;;19528:30;-1:-1:-1;;;19574:18:8;;;19567:53;19637:18;;5621:48:1;19314:347:8;5621:48:1;5702:10;-1:-1:-1;;;;;5702:19:1;;;;:58;;;5725:35;5742:5;5749:10;5725:16;:35::i;:::-;5680:139;;;;-1:-1:-1;;;5680:139:1;;19868:2:8;5680:139:1;;;19850:21:8;19907:2;19887:18;;;19880:30;19946:33;19926:18;;;19919:61;19997:18;;5680:139:1;19666:355:8;5680:139:1;5832:24;;;;:14;:24;;;;;;:30;;-1:-1:-1;;;;;;5832:30:1;-1:-1:-1;;;;;5832:30:1;;;;;;;;;5878;;5832:24;;5878:30;;;;;;;5566:350;5508:408;;:::o;7796:444::-;7920:8;2363:39;2381:10;2393:8;2363:17;:39::i;:::-;2355:68;;;;-1:-1:-1;;;2355:68:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;7949:19:1;::::1;7941:56;;;;-1:-1:-1::0;;;7941:56:1::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;8016:17:1;::::1;8008:54;;;;-1:-1:-1::0;;;8008:54:1::1;;;;;;;:::i;:::-;8075:30;8089:5;8096:8;8075:13;:30::i;:::-;8116:32;8132:5;8139:8;8116:15;:32::i;:::-;8159:25;8170:3;8175:8;8159:10;:25::i;:::-;8223:8;8218:3;-1:-1:-1::0;;;;;8202:30:1::1;8211:5;-1:-1:-1::0;;;;;8202:30:1::1;;;;;;;;;;;7796:444:::0;;;;:::o;9853:405::-;10010:8;2363:39;2381:10;2393:8;2363:17;:39::i;:::-;2355:68;;;;-1:-1:-1;;;2355:68:1;;;;;;;:::i;:::-;10031:35:::1;10045:5;10052:3;10057:8;10031:13;:35::i;:::-;10149:53;10174:5;10181:3;10186:8;10196:5;10149:24;:53::i;:::-;10127:123;;;::::0;-1:-1:-1;;;10127:123:1;;20573:2:8;10127:123:1::1;::::0;::::1;20555:21:8::0;20612:2;20592:18;;;20585:30;-1:-1:-1;;;20631:18:8;;;20624:50;20691:18;;10127:123:1::1;20371:344:8::0;1932:106:2;1990:40;2002:17;2010:8;2002:7;:17::i;:::-;2021:8;1990:11;:40::i;1557:164::-;1635:12;:28;1650:13;1635:12;:28;:::i;:::-;;1679:34;1699:13;1679:34;;;;;;:::i;1729:195::-;1848:31;1864:8;1874:4;1848:15;:31::i;:::-;1890:26;1902:3;1907:8;1890:11;:26::i;6583:253:1:-;6675:10;-1:-1:-1;;;;;6668:17:1;;;6660:53;;;;-1:-1:-1;;;6660:53:1;;19516:2:8;6660:53:1;;;19498:21:8;19555:2;19535:18;;;19528:30;-1:-1:-1;;;19574:18:8;;;19567:53;19637:18;;6660:53:1;19314:347:8;6660:53:1;6742:10;6724:29;;;;:17;:29;;;;;;;;-1:-1:-1;;;;;6724:34:1;;;;;;;;;;;;:46;;-1:-1:-1;;6724:46:1;;;;;;;;;;6786:42;;540:41:8;;;6724:34:1;;6742:10;6786:42;;513:18:8;6786:42:1;;;;;;;6583:253;;:::o;1385:164:2:-;1468:19;;;;:9;:19;;;;;:26;1490:4;1468:19;:26;:::i;:::-;;1510:31;1526:8;1536:4;1510:31;;;;;;;:::i;10630:474:1:-;10743:4;10765:13;10781:17;10789:8;10781:7;:17::i;:::-;10765:33;;10990:5;-1:-1:-1;;;;;10978:17:1;:8;-1:-1:-1;;;;;10978:17:1;;:67;;;-1:-1:-1;6222:7:1;6249:24;;;:14;:24;;;;;;-1:-1:-1;;;;;11012:33:1;;;6249:24;;11012:33;10978:67;:117;;;;11062:33;11079:5;11086:8;11062:16;:33::i;:::-;10970:126;10630:474;-1:-1:-1;;;;10630:474:1:o;12890:374::-;13010:6;-1:-1:-1;;;;;12989:27:1;:17;12997:8;12989:7;:17::i;:::-;-1:-1:-1;;;;;12989:27:1;;12967:113;;;;-1:-1:-1;;;12967:113:1;;;;;;;:::i;:::-;13131:1;13095:24;;;:14;:24;;;;;;-1:-1:-1;;;;;13095:24:1;:38;13091:166;;13185:1;13150:24;;;:14;:24;;;;;;:37;;-1:-1:-1;;;;;;13150:37:1;;;13207:38;13165:8;;13185:1;-1:-1:-1;;;;;13207:38:1;;;;;13185:1;;13207:38;12890:374;;:::o;14226:1107::-;14347:5;-1:-1:-1;;;;;14326:26:1;:17;14334:8;14326:7;:17::i;:::-;-1:-1:-1;;;;;14326:26:1;;14304:112;;;;-1:-1:-1;;;14304:112:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;14453:23:1;;;;;;:16;:23;;;;;;:27;;14479:1;;14453:27;:::i;:::-;-1:-1:-1;;;;;14427:23:1;;;;;;:16;:23;;;;;;;;:53;;;;14491:20;;;:10;:20;;;;;:33;;-1:-1:-1;;;;;;14491:33:1;;;14556:16;:26;;;;;;14618:18;;;:11;:18;;;;;:25;14556:26;;14427:23;14618:29;;14491:33;;14618:29;:::i;:::-;-1:-1:-1;;;;;14678:18:1;;14658:17;14678:18;;;:11;:18;;;;;:34;;14593:54;;-1:-1:-1;14658:17:1;;14593:54;;14678:34;;;;;;:::i;:::-;;;;;;;;;14658:54;;14758:9;14725:11;:18;14737:5;-1:-1:-1;;;;;14725:18:1;-1:-1:-1;;;;;14725:18:1;;;;;;;;;;;;14744:10;14725:30;;;;;;;;:::i;:::-;;;;;;;;;;;;:42;;;;-1:-1:-1;;;;;14778:18:1;;;;:11;:18;;;;;;:34;;14797:14;;14778:34;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;15244:26;;;:16;:26;;;;;;:30;;;15285:27;;;;;;:40;-1:-1:-1;;14226:1107:1:o;13546:382::-;13657:1;13625:20;;;:10;:20;;;;;;-1:-1:-1;;;;;13625:20:1;:34;13617:67;;;;-1:-1:-1;;;13617:67:1;;23701:2:8;13617:67:1;;;23683:21:8;23740:2;23720:18;;;23713:30;-1:-1:-1;;;23759:18:8;;;23752:50;23819:18;;13617:67:1;23499:344:8;13617:67:1;13695:20;;;;:10;:20;;;;;;;;:26;;-1:-1:-1;;;;;;13695:26:1;-1:-1:-1;;;;;13695:26:1;;;;;;;;13756:21;;:16;:21;;;;;;:25;;-1:-1:-1;13756:25:1;:::i;:::-;-1:-1:-1;;;;;13732:21:1;;;;;;;:16;:21;;;;;;;;:49;;;;13809:11;:16;;;;;:23;;13843:31;;;;;;;;;;;;;;;;13885:26;;;:16;:26;;;;;;:35;13546:382::o;15870:428::-;16031:4;16053:16;:3;-1:-1:-1;;;;;16053:14:1;;:16::i;:::-;16048:61;;-1:-1:-1;16093:4:1;16086:11;;16048:61;16135:110;;-1:-1:-1;;;16135:110:1;;16119:13;;-1:-1:-1;;;;;16135:36:1;;;;;:110;;16186:5;;16206:8;;16229:5;;16135:110;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;16264:25:1;-1:-1:-1;;;16264:25:1;;-1:-1:-1;;15870:428:1;;;;;;:::o;11886:720::-;11974:8;2363:39;2381:10;2393:8;2363:17;:39::i;:::-;2355:68;;;;-1:-1:-1;;;2355:68:1;;;;;;;:::i;:::-;12000:31:::1;12014:6;12022:8;12000:13;:31::i;:::-;12042:33;12058:6;12066:8;12042:15;:33::i;:::-;12123:18;12144:24:::0;;;:14:::1;:24;::::0;;;;;12204:9:::1;:16:::0;12144:24;;12123:18;12204:20:::1;::::0;12223:1:::1;::::0;12204:20:::1;:::i;:::-;12179:45;;12235:17;12255:9;12265:14;12255:25;;;;;;;;:::i;:::-;;;;;;;;;12235:45;;12317:9;12293;12303:10;12293:21;;;;;;;;:::i;:::-;;;;;;;;:33;;;;12344:9;12354:14;12344:25;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;12337:32:::0;;;12467:24;;;:14:::1;:24:::0;;;;;;:28;;;12506:25;;;;;;:38;;;12560;12482:8;;12344:25;-1:-1:-1;;;;;12560:38:1;::::1;::::0;::::1;::::0;12344:25;;12560:38:::1;11989:617;;;11886:720:::0;;;:::o;11375:306::-;-1:-1:-1;;;;;11449:17:1;;11441:54;;;;-1:-1:-1;;;11441:54:1;;;;;;;:::i;:::-;11506:25;11517:3;11522:8;11506:10;:25::i;:::-;11569:9;:16;;11542:24;;;;:14;:24;;;;;;:43;;;11596:24;;;;;;;;;;;;;;;11638:35;;11557:8;;-1:-1:-1;;;;;11638:35:1;;;;;11542:24;;11638:35;11375:306;;:::o;496:641:0:-;556:4;1037:20;;867:66;1086:23;;;;;;:42;;-1:-1:-1;;1113:15:0;;;1078:51;-1:-1:-1;;496:641:0:o;14:131:8:-;-1:-1:-1;;;;;;88:32:8;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:8:o;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:8;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:8;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:8:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:8;;1348:180;-1:-1:-1;1348:180:8:o;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:8;;1848:42;;1838:70;;1904:1;1901;1894:12;1919:254;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:8:o;2178:186::-;2237:6;2290:2;2278:9;2269:7;2265:23;2261:32;2258:52;;;2306:1;2303;2296:12;2258:52;2329:29;2348:9;2329:29;:::i;2551:328::-;2628:6;2636;2644;2697:2;2685:9;2676:7;2672:23;2668:32;2665:52;;;2713:1;2710;2703:12;2665:52;2736:29;2755:9;2736:29;:::i;:::-;2726:39;;2784:38;2818:2;2807:9;2803:18;2784:38;:::i;:::-;2774:48;;2869:2;2858:9;2854:18;2841:32;2831:42;;2551:328;;;;;:::o;2884:127::-;2945:10;2940:3;2936:20;2933:1;2926:31;2976:4;2973:1;2966:15;3000:4;2997:1;2990:15;3016:275;3087:2;3081:9;3152:2;3133:13;;-1:-1:-1;;3129:27:8;3117:40;;3187:18;3172:34;;3208:22;;;3169:62;3166:88;;;3234:18;;:::i;:::-;3270:2;3263:22;3016:275;;-1:-1:-1;3016:275:8:o;3296:407::-;3361:5;3395:18;3387:6;3384:30;3381:56;;;3417:18;;:::i;:::-;3455:57;3500:2;3479:15;;-1:-1:-1;;3475:29:8;3506:4;3471:40;3455:57;:::i;:::-;3446:66;;3535:6;3528:5;3521:21;3575:3;3566:6;3561:3;3557:16;3554:25;3551:45;;;3592:1;3589;3582:12;3551:45;3641:6;3636:3;3629:4;3622:5;3618:16;3605:43;3695:1;3688:4;3679:6;3672:5;3668:18;3664:29;3657:40;3296:407;;;;;:::o;3708:222::-;3751:5;3804:3;3797:4;3789:6;3785:17;3781:27;3771:55;;3822:1;3819;3812:12;3771:55;3844:80;3920:3;3911:6;3898:20;3891:4;3883:6;3879:17;3844:80;:::i;3935:322::-;4004:6;4057:2;4045:9;4036:7;4032:23;4028:32;4025:52;;;4073:1;4070;4063:12;4025:52;4113:9;4100:23;4146:18;4138:6;4135:30;4132:50;;;4178:1;4175;4168:12;4132:50;4201;4243:7;4234:6;4223:9;4219:22;4201:50;:::i;4262:952::-;4346:6;4377:2;4420;4408:9;4399:7;4395:23;4391:32;4388:52;;;4436:1;4433;4426:12;4388:52;4476:9;4463:23;4505:18;4546:2;4538:6;4535:14;4532:34;;;4562:1;4559;4552:12;4532:34;4600:6;4589:9;4585:22;4575:32;;4645:7;4638:4;4634:2;4630:13;4626:27;4616:55;;4667:1;4664;4657:12;4616:55;4703:2;4690:16;4725:2;4721;4718:10;4715:36;;;4731:18;;:::i;:::-;4777:2;4774:1;4770:10;4760:20;;4800:28;4824:2;4820;4816:11;4800:28;:::i;:::-;4862:15;;;4932:11;;;4928:20;;;4893:12;;;;4960:19;;;4957:39;;;4992:1;4989;4982:12;4957:39;5016:11;;;;5036:148;5052:6;5047:3;5044:15;5036:148;;;5118:23;5137:3;5118:23;:::i;:::-;5106:36;;5069:12;;;;5162;;;;5036:148;;;5203:5;4262:952;-1:-1:-1;;;;;;;;4262:952:8:o;5219:156::-;5285:20;;5345:4;5334:16;;5324:27;;5314:55;;5365:1;5362;5355:12;5380:544;5436:5;5484:4;5472:9;5467:3;5463:19;5459:30;5456:50;;;5502:1;5499;5492:12;5456:50;5535:2;5529:9;5577:4;5569:6;5565:17;5648:6;5636:10;5633:22;5612:18;5600:10;5597:34;5594:62;5591:88;;;5659:18;;:::i;:::-;5699:10;5695:2;5688:22;;5728:6;5719:15;;5771:9;5758:23;5750:6;5743:39;5843:2;5832:9;5828:18;5815:32;5810:2;5802:6;5798:15;5791:57;5881:36;5913:2;5902:9;5898:18;5881:36;:::i;:::-;5876:2;5868:6;5864:15;5857:61;;5380:544;;;;:::o;5929:375::-;6033:6;6041;6049;6102:3;6090:9;6081:7;6077:23;6073:33;6070:53;;;6119:1;6116;6109:12;6070:53;6142:29;6161:9;6142:29;:::i;:::-;6132:39;;6190:56;6238:7;6233:2;6222:9;6218:18;6190:56;:::i;:::-;6180:66;;6293:3;6282:9;6278:19;6265:33;6255:43;;5929:375;;;;;:::o;6309:250::-;6375:6;6383;6436:2;6424:9;6415:7;6411:23;6407:32;6404:52;;;6452:1;6449;6442:12;6404:52;6488:9;6475:23;6465:33;;6517:36;6549:2;6538:9;6534:18;6517:36;:::i;:::-;6507:46;;6309:250;;;;;:::o;6564:160::-;6629:20;;6685:13;;6678:21;6668:32;;6658:60;;6714:1;6711;6704:12;6729:254;6794:6;6802;6855:2;6843:9;6834:7;6830:23;6826:32;6823:52;;;6871:1;6868;6861:12;6823:52;6894:29;6913:9;6894:29;:::i;:::-;6884:39;;6942:35;6973:2;6962:9;6958:18;6942:35;:::i;6988:667::-;7083:6;7091;7099;7107;7160:3;7148:9;7139:7;7135:23;7131:33;7128:53;;;7177:1;7174;7167:12;7128:53;7200:29;7219:9;7200:29;:::i;:::-;7190:39;;7248:38;7282:2;7271:9;7267:18;7248:38;:::i;:::-;7238:48;;7333:2;7322:9;7318:18;7305:32;7295:42;;7388:2;7377:9;7373:18;7360:32;7415:18;7407:6;7404:30;7401:50;;;7447:1;7444;7437:12;7401:50;7470:22;;7523:4;7515:13;;7511:27;-1:-1:-1;7501:55:8;;7552:1;7549;7542:12;7501:55;7575:74;7641:7;7636:2;7623:16;7618:2;7614;7610:11;7575:74;:::i;:::-;7565:84;;;6988:667;;;;;;;:::o;7660:300::-;7755:6;7763;7816:3;7804:9;7795:7;7791:23;7787:33;7784:53;;;7833:1;7830;7823:12;7784:53;7869:9;7856:23;7846:33;;7898:56;7946:7;7941:2;7930:9;7926:18;7898:56;:::i;7965:390::-;8043:6;8051;8104:2;8092:9;8083:7;8079:23;8075:32;8072:52;;;8120:1;8117;8110:12;8072:52;8156:9;8143:23;8133:33;;8217:2;8206:9;8202:18;8189:32;8244:18;8236:6;8233:30;8230:50;;;8276:1;8273;8266:12;8230:50;8299;8341:7;8332:6;8321:9;8317:22;8299:50;:::i;:::-;8289:60;;;7965:390;;;;;:::o;8360:180::-;8416:6;8469:2;8457:9;8448:7;8444:23;8440:32;8437:52;;;8485:1;8482;8475:12;8437:52;8508:26;8524:9;8508:26;:::i;8545:260::-;8613:6;8621;8674:2;8662:9;8653:7;8649:23;8645:32;8642:52;;;8690:1;8687;8680:12;8642:52;8713:29;8732:9;8713:29;:::i;:::-;8703:39;;8761:38;8795:2;8784:9;8780:18;8761:38;:::i;8999:380::-;9078:1;9074:12;;;;9121;;;9142:61;;9196:4;9188:6;9184:17;9174:27;;9142:61;9249:2;9241:6;9238:14;9218:18;9215:38;9212:161;;9295:10;9290:3;9286:20;9283:1;9276:31;9330:4;9327:1;9320:15;9358:4;9355:1;9348:15;9212:161;;8999:380;;;:::o;9384:397::-;9586:2;9568:21;;;9625:2;9605:18;;;9598:30;9664:34;9659:2;9644:18;;9637:62;-1:-1:-1;;;9730:2:8;9715:18;;9708:31;9771:3;9756:19;;9384:397::o;9786:339::-;9988:2;9970:21;;;10027:2;10007:18;;;10000:30;-1:-1:-1;;;10061:2:8;10046:18;;10039:45;10116:2;10101:18;;9786:339::o;10472:127::-;10533:10;10528:3;10524:20;10521:1;10514:31;10564:4;10561:1;10554:15;10588:4;10585:1;10578:15;10604:343;10806:2;10788:21;;;10845:2;10825:18;;;10818:30;-1:-1:-1;;;10879:2:8;10864:18;;10857:49;10938:2;10923:18;;10604:343::o;10952:348::-;11154:2;11136:21;;;11193:2;11173:18;;;11166:30;11232:26;11227:2;11212:18;;11205:54;11291:2;11276:18;;10952:348::o;11661:127::-;11722:10;11717:3;11713:20;11710:1;11703:31;11753:4;11750:1;11743:15;11777:4;11774:1;11767:15;11793:135;11832:3;11853:17;;;11850:43;;11873:18;;:::i;:::-;-1:-1:-1;11920:1:8;11909:13;;11793:135::o;11933:128::-;12000:9;;;12021:11;;;12018:37;;;12035:18;;:::i;13707:125::-;13772:9;;;13793:10;;;13790:36;;;13806:18;;:::i;14182:175::-;14219:3;14263:4;14256:5;14252:16;14292:4;14283:7;14280:17;14277:43;;14300:18;;:::i;:::-;14349:1;14336:15;;14182:175;-1:-1:-1;;14182:175:8:o;17514:722::-;17564:3;17605:5;17599:12;17634:36;17660:9;17634:36;:::i;:::-;17689:1;17706:18;;;17733:133;;;;17880:1;17875:355;;;;17699:531;;17733:133;-1:-1:-1;;17766:24:8;;17754:37;;17839:14;;17832:22;17820:35;;17811:45;;;-1:-1:-1;17733:133:8;;17875:355;17906:5;17903:1;17896:16;17935:4;17980:2;17977:1;17967:16;18005:1;18019:165;18033:6;18030:1;18027:13;18019:165;;;18111:14;;18098:11;;;18091:35;18154:16;;;;18048:10;;18019:165;;;18023:3;;;18213:6;18208:3;18204:16;18197:23;;17699:531;;;;;17514:722;;;;:::o;18241:277::-;18414:3;18439:73;18473:38;18507:3;18499:6;18473:38;:::i;:::-;18465:6;18439:73;:::i;18523:383::-;18680:3;18718:6;18712:13;18734:66;18793:6;18788:3;18781:4;18773:6;18769:17;18734:66;:::i;:::-;18822:16;;;;18847:21;;;-1:-1:-1;18895:4:8;18884:16;;18523:383;-1:-1:-1;18523:383:8:o;20026:340::-;20228:2;20210:21;;;20267:2;20247:18;;;20240:30;-1:-1:-1;;;20301:2:8;20286:18;;20279:46;20357:2;20342:18;;20026:340::o;20720:545::-;20822:2;20817:3;20814:11;20811:448;;;20858:1;20883:5;20879:2;20872:17;20928:4;20924:2;20914:19;20998:2;20986:10;20982:19;20979:1;20975:27;20969:4;20965:38;21034:4;21022:10;21019:20;21016:47;;;-1:-1:-1;21057:4:8;21016:47;21112:2;21107:3;21103:12;21100:1;21096:20;21090:4;21086:31;21076:41;;21167:82;21185:2;21178:5;21175:13;21167:82;;;21230:17;;;21211:1;21200:13;21167:82;;;21171:3;;;20720:545;;;:::o;21441:1352::-;21567:3;21561:10;21594:18;21586:6;21583:30;21580:56;;;21616:18;;:::i;:::-;21645:97;21735:6;21695:38;21727:4;21721:11;21695:38;:::i;:::-;21689:4;21645:97;:::i;:::-;21797:4;;21861:2;21850:14;;21878:1;21873:663;;;;22580:1;22597:6;22594:89;;;-1:-1:-1;22649:19:8;;;22643:26;22594:89;-1:-1:-1;;21398:1:8;21394:11;;;21390:24;21386:29;21376:40;21422:1;21418:11;;;21373:57;22696:81;;21843:944;;21873:663;17461:1;17454:14;;;17498:4;17485:18;;-1:-1:-1;;21909:20:8;;;22027:236;22041:7;22038:1;22035:14;22027:236;;;22130:19;;;22124:26;22109:42;;22222:27;;;;22190:1;22178:14;;;;22057:19;;22027:236;;;22031:3;22291:6;22282:7;22279:19;22276:201;;;22352:19;;;22346:26;-1:-1:-1;;22435:1:8;22431:14;;;22447:3;22427:24;22423:37;22419:42;22404:58;22389:74;;22276:201;-1:-1:-1;;;;;22523:1:8;22507:14;;;22503:22;22490:36;;-1:-1:-1;21441:1352:8:o;22798:291::-;22975:6;22964:9;22957:25;23018:2;23013;23002:9;22998:18;22991:30;22938:4;23038:45;23079:2;23068:9;23064:18;23056:6;23038:45;:::i;23094:400::-;23296:2;23278:21;;;23335:2;23315:18;;;23308:30;23374:34;23369:2;23354:18;;23347:62;-1:-1:-1;;;23440:2:8;23425:18;;23418:34;23484:3;23469:19;;23094:400::o;23848:386::-;24080:1;24076;24071:3;24067:11;24063:19;24055:6;24051:32;24040:9;24033:51;24120:6;24115:2;24104:9;24100:18;24093:34;24163:2;24158;24147:9;24143:18;24136:30;24014:4;24183:45;24224:2;24213:9;24209:18;24201:6;24183:45;:::i;:::-;24175:53;23848:386;-1:-1:-1;;;;;23848:386:8:o;24239:249::-;24308:6;24361:2;24349:9;24340:7;24336:23;24332:32;24329:52;;;24377:1;24374;24367:12;24329:52;24409:9;24403:16;24428:30;24452:5;24428:30;:::i

Swarm Source

ipfs://05c34c2317476cebbf44a2a9259f839740e5aeb2f2c84ecd93ff594547bc57f4
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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