ETH Price: $2,417.43 (-9.28%)

Token

The Feast Days (TFD)
 

Overview

Max Total Supply

1,415 TFD

Holders

19

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
ken-malibu.eth
0x88d08Cf7c7608E6d6774Fc12afBBd79653248C0d
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:
TheFeastDays

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 12 : TheFeastDays.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

import "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Strings.sol";                                           

contract TheFeastDays is ERC1155Supply, Ownable {

    string collectionURI = "";
    string private name_;
    string private symbol_; 
    uint256 public tokenQty;
    uint256 public currentTokenId;

    constructor() ERC1155(collectionURI) {
        name_ = "The Feast Days";
        symbol_ = "TFD";
        tokenQty = 5;
        currentTokenId = 1;
    }
    
    function name() public view returns (string memory) {
      return name_;
    }

    function symbol() public view returns (string memory) {
      return symbol_;
    }

    //=============================================================================
    // Private Functions
    //=============================================================================

    function privateMint() public onlyOwner {
        _mint(msg.sender, currentTokenId, tokenQty, "");
        currentTokenId++;
    }

    function setCollectionURI(string memory newCollectionURI) public onlyOwner {
        collectionURI = newCollectionURI;
    }

    function getCollectionURI() public view returns(string memory) {
        return collectionURI;
    }

    function setTokenQty(uint256 qty) public onlyOwner {
        tokenQty = qty;
    }

    function setCurrentTokenId(uint256 id) public onlyOwner {
        currentTokenId = id;
    }

    //=============================================================================
    // Override Functions
    //=============================================================================
    
    function _beforeTokenTransfer(address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data) internal override(ERC1155Supply) {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
    }

    function uri(uint256 _tokenId) public override view returns (string memory) {
        return string(abi.encodePacked(collectionURI, Strings.toString(_tokenId), ".json"));
    }    
}

File 2 of 12 : ERC1155Supply.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155Supply.sol)

pragma solidity ^0.8.0;

import "../ERC1155.sol";

/**
 * @dev Extension of ERC1155 that adds tracking of total supply per id.
 *
 * Useful for scenarios where Fungible and Non-fungible tokens have to be
 * clearly identified. Note: While a totalSupply of 1 might mean the
 * corresponding is an NFT, there is no guarantees that no other token with the
 * same id are not going to be minted.
 */
abstract contract ERC1155Supply is ERC1155 {
    mapping(uint256 => uint256) private _totalSupply;

    /**
     * @dev Total amount of tokens in with a given id.
     */
    function totalSupply(uint256 id) public view virtual returns (uint256) {
        return _totalSupply[id];
    }

    /**
     * @dev Indicates whether any token exist with a given id, or not.
     */
    function exists(uint256 id) public view virtual returns (bool) {
        return ERC1155Supply.totalSupply(id) > 0;
    }

    /**
     * @dev See {ERC1155-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);

        if (from == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                _totalSupply[ids[i]] += amounts[i];
            }
        }

        if (to == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                uint256 id = ids[i];
                uint256 amount = amounts[i];
                uint256 supply = _totalSupply[id];
                require(supply >= amount, "ERC1155: burn amount exceeds totalSupply");
                unchecked {
                    _totalSupply[id] = supply - amount;
                }
            }
        }
    }
}

File 3 of 12 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

File 5 of 12 : ERC1155.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;

import "./IERC1155.sol";
import "./IERC1155Receiver.sol";
import "./extensions/IERC1155MetadataURI.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/introspection/ERC165.sol";

/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: balance query for the zero address");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

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

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

File 6 of 12 : IERC1155.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;

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

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

File 7 of 12 : IERC1155Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;

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

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

File 8 of 12 : IERC1155MetadataURI.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;

import "../IERC1155.sol";

/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

File 9 of 12 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

pragma solidity ^0.8.0;

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCollectionURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","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":[],"name":"privateMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newCollectionURI","type":"string"}],"name":"setCollectionURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"setCurrentTokenId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"setTokenQty","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":[],"name":"tokenQty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60a06040819052600060808190526200001b91600591620001ba565b503480156200002957600080fd5b5060058054620000399062000260565b80601f0160208091040260200160405190810160405280929190818152602001828054620000679062000260565b8015620000b85780601f106200008c57610100808354040283529160200191620000b8565b820191906000526020600020905b8154815290600101906020018083116200009a57829003601f168201915b5050505050620000ce816200014f60201b60201c565b50620000da3362000168565b60408051808201909152600e8082526d546865204665617374204461797360901b60209092019182526200011191600691620001ba565b506040805180820190915260038082526215119160ea1b60209092019182526200013e91600791620001ba565b50600560085560016009556200029d565b805162000164906002906020840190620001ba565b5050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001c89062000260565b90600052602060002090601f016020900481019282620001ec576000855562000237565b82601f106200020757805160ff191683800117855562000237565b8280016001018555821562000237579182015b82811115620002375782518255916020019190600101906200021a565b506200024592915062000249565b5090565b5b808211156200024557600081556001016200024a565b600181811c908216806200027557607f821691505b602082108114156200029757634e487b7160e01b600052602260045260246000fd5b50919050565b611e2f80620002ad6000396000f3fe608060405234801561001057600080fd5b50600436106101405760003560e01c80634f558e79116100b8578063a22cb4651161007c578063a22cb4651461028b578063bd85b0391461029e578063cfb5bb1f146102be578063e985e9c5146102c6578063f242432a14610302578063f2fde38b1461031557600080fd5b80634f558e791461022b578063715018a61461024d5780638329de2f146102555780638da5cb5b1461026857806395d89b411461028357600080fd5b80631eac06911161010a5780631eac0691146101bf578063236effd9146101c85780632639f460146101dd5780632eb2c2d6146101f05780633f5ab224146102035780634e1273f41461020b57600080fd5b80629a9b7b14610145578062fdd58e1461016157806301ffc9a71461017457806306fdde03146101975780630e89341c146101ac575b600080fd5b61014e60095481565b6040519081526020015b60405180910390f35b61014e61016f3660046116e8565b610328565b6101876101823660046117e3565b6103bf565b6040519015158152602001610158565b61019f610411565b6040516101589190611a98565b61019f6101ba366004611866565b6104a3565b61014e60085481565b6101db6101d6366004611866565b6104d7565b005b6101db6101eb36600461181d565b610506565b6101db6101fe36600461159d565b610547565b6101db6105de565b61021e610219366004611712565b61063e565b6040516101589190611a60565b610187610239366004611866565b600090815260036020526040902054151590565b6101db610768565b6101db610263366004611866565b61079e565b6004546040516001600160a01b039091168152602001610158565b61019f6107cd565b6101db6102993660046116ac565b6107dc565b61014e6102ac366004611866565b60009081526003602052604090205490565b61019f6107e7565b6101876102d436600461156a565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6101db610310366004611647565b6107f6565b6101db61032336600461154f565b61087d565b60006001600160a01b0383166103995760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b14806103f057506001600160e01b031982166303a24d0760e21b145b8061040b57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606006805461042090611c4e565b80601f016020809104026020016040519081016040528092919081815260200182805461044c90611c4e565b80156104995780601f1061046e57610100808354040283529160200191610499565b820191906000526020600020905b81548152906001019060200180831161047c57829003601f168201915b5050505050905090565b606060056104b083610918565b6040516020016104c1929190611902565b6040516020818303038152906040529050919050565b6004546001600160a01b031633146105015760405162461bcd60e51b815260040161039090611b82565b600855565b6004546001600160a01b031633146105305760405162461bcd60e51b815260040161039090611b82565b805161054390600590602084019061139e565b5050565b6001600160a01b038516331480610563575061056385336102d4565b6105ca5760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610390565b6105d78585858585610a1e565b5050505050565b6004546001600160a01b031633146106085760405162461bcd60e51b815260040161039090611b82565b6106273360095460085460405180602001604052806000815250610c09565b6009805490600061063783611cb6565b9190505550565b606081518351146106a35760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610390565b6000835167ffffffffffffffff8111156106bf576106bf611d27565b6040519080825280602002602001820160405280156106e8578160200160208202803683370190505b50905060005b84518110156107605761073385828151811061070c5761070c611d11565b602002602001015185838151811061072657610726611d11565b6020026020010151610328565b82828151811061074557610745611d11565b602090810291909101015261075981611cb6565b90506106ee565b509392505050565b6004546001600160a01b031633146107925760405162461bcd60e51b815260040161039090611b82565b61079c6000610d2c565b565b6004546001600160a01b031633146107c85760405162461bcd60e51b815260040161039090611b82565b600955565b60606007805461042090611c4e565b610543338383610d7e565b60606005805461042090611c4e565b6001600160a01b038516331480610812575061081285336102d4565b6108705760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b6064820152608401610390565b6105d78585858585610e5f565b6004546001600160a01b031633146108a75760405162461bcd60e51b815260040161039090611b82565b6001600160a01b03811661090c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610390565b61091581610d2c565b50565b60608161093c5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115610966578061095081611cb6565b915061095f9050600a83611bf3565b9150610940565b60008167ffffffffffffffff81111561098157610981611d27565b6040519080825280601f01601f1916602001820160405280156109ab576020820181803683370190505b5090505b8415610a16576109c0600183611c07565b91506109cd600a86611cd1565b6109d8906030611bdb565b60f81b8183815181106109ed576109ed611d11565b60200101906001600160f81b031916908160001a905350610a0f600a86611bf3565b94506109af565b949350505050565b8151835114610a805760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608401610390565b6001600160a01b038416610aa65760405162461bcd60e51b815260040161039090611af3565b33610ab5818787878787610f97565b60005b8451811015610b9b576000858281518110610ad557610ad5611d11565b602002602001015190506000858381518110610af357610af3611d11565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015610b435760405162461bcd60e51b815260040161039090611b38565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290610b80908490611bdb565b9250508190555050505080610b9490611cb6565b9050610ab8565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610beb929190611a73565b60405180910390a4610c01818787878787610fa5565b505050505050565b6001600160a01b038416610c695760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610390565b336000610c7585611110565b90506000610c8285611110565b9050610c9383600089858589610f97565b6000868152602081815260408083206001600160a01b038b16845290915281208054879290610cc3908490611bdb565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610d238360008989898961115b565b50505050505050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415610df25760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610390565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038416610e855760405162461bcd60e51b815260040161039090611af3565b336000610e9185611110565b90506000610e9e85611110565b9050610eae838989858589610f97565b6000868152602081815260408083206001600160a01b038c16845290915290205485811015610eef5760405162461bcd60e51b815260040161039090611b38565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290610f2c908490611bdb565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610f8c848a8a8a8a8a61115b565b505050505050505050565b610c01868686868686611225565b6001600160a01b0384163b15610c015760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190610fe990899089908890889088906004016119bd565b602060405180830381600087803b15801561100357600080fd5b505af1925050508015611033575060408051601f3d908101601f1916820190925261103091810190611800565b60015b6110e05761103f611d3d565b806308c379a014156110795750611054611d59565b8061105f575061107b565b8060405162461bcd60e51b81526004016103909190611a98565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610390565b6001600160e01b0319811663bc197c8160e01b14610d235760405162461bcd60e51b815260040161039090611aab565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061114a5761114a611d11565b602090810291909101015292915050565b6001600160a01b0384163b15610c015760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061119f9089908990889088908890600401611a1b565b602060405180830381600087803b1580156111b957600080fd5b505af19250505080156111e9575060408051601f3d908101601f191682019092526111e691810190611800565b60015b6111f55761103f611d3d565b6001600160e01b0319811663f23a6e6160e01b14610d235760405162461bcd60e51b815260040161039090611aab565b6001600160a01b0385166112ac5760005b83518110156112aa5782818151811061125157611251611d11565b60200260200101516003600086848151811061126f5761126f611d11565b6020026020010151815260200190815260200160002060008282546112949190611bdb565b909155506112a3905081611cb6565b9050611236565b505b6001600160a01b038416610c015760005b8351811015610d235760008482815181106112da576112da611d11565b6020026020010151905060008483815181106112f8576112f8611d11565b602002602001015190506000600360008481526020019081526020016000205490508181101561137b5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b6064820152608401610390565b6000928352600360205260409092209103905561139781611cb6565b90506112bd565b8280546113aa90611c4e565b90600052602060002090601f0160209004810192826113cc5760008555611412565b82601f106113e557805160ff1916838001178555611412565b82800160010185558215611412579182015b828111156114125782518255916020019190600101906113f7565b5061141e929150611422565b5090565b5b8082111561141e5760008155600101611423565b600067ffffffffffffffff83111561145157611451611d27565b604051611468601f8501601f191660200182611c89565b80915083815284848401111561147d57600080fd5b83836020830137600060208583010152509392505050565b80356001600160a01b03811681146114ac57600080fd5b919050565b600082601f8301126114c257600080fd5b813560206114cf82611bb7565b6040516114dc8282611c89565b8381528281019150858301600585901b870184018810156114fc57600080fd5b60005b8581101561151b578135845292840192908401906001016114ff565b5090979650505050505050565b600082601f83011261153957600080fd5b61154883833560208501611437565b9392505050565b60006020828403121561156157600080fd5b61154882611495565b6000806040838503121561157d57600080fd5b61158683611495565b915061159460208401611495565b90509250929050565b600080600080600060a086880312156115b557600080fd5b6115be86611495565b94506115cc60208701611495565b9350604086013567ffffffffffffffff808211156115e957600080fd5b6115f589838a016114b1565b9450606088013591508082111561160b57600080fd5b61161789838a016114b1565b9350608088013591508082111561162d57600080fd5b5061163a88828901611528565b9150509295509295909350565b600080600080600060a0868803121561165f57600080fd5b61166886611495565b945061167660208701611495565b93506040860135925060608601359150608086013567ffffffffffffffff8111156116a057600080fd5b61163a88828901611528565b600080604083850312156116bf57600080fd5b6116c883611495565b9150602083013580151581146116dd57600080fd5b809150509250929050565b600080604083850312156116fb57600080fd5b61170483611495565b946020939093013593505050565b6000806040838503121561172557600080fd5b823567ffffffffffffffff8082111561173d57600080fd5b818501915085601f83011261175157600080fd5b8135602061175e82611bb7565b60405161176b8282611c89565b8381528281019150858301600585901b870184018b101561178b57600080fd5b600096505b848710156117b5576117a181611495565b835260019690960195918301918301611790565b50965050860135925050808211156117cc57600080fd5b506117d9858286016114b1565b9150509250929050565b6000602082840312156117f557600080fd5b813561154881611de3565b60006020828403121561181257600080fd5b815161154881611de3565b60006020828403121561182f57600080fd5b813567ffffffffffffffff81111561184657600080fd5b8201601f8101841361185757600080fd5b610a1684823560208401611437565b60006020828403121561187857600080fd5b5035919050565b600081518084526020808501945080840160005b838110156118af57815187529582019590820190600101611893565b509495945050505050565b600081518084526118d2816020860160208601611c1e565b601f01601f19169290920160200192915050565b600081516118f8818560208601611c1e565b9290920192915050565b600080845481600182811c91508083168061191e57607f831692505b602080841082141561193e57634e487b7160e01b86526022600452602486fd5b818015611952576001811461196357611990565b60ff19861689528489019650611990565b60008b81526020902060005b868110156119885781548b82015290850190830161196f565b505084890196505b5050505050506119b46119a382866118e6565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b0386811682528516602082015260a0604082018190526000906119e99083018661187f565b82810360608401526119fb818661187f565b90508281036080840152611a0f81856118ba565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090611a55908301846118ba565b979650505050505050565b602081526000611548602083018461187f565b604081526000611a86604083018561187f565b82810360208401526119b4818561187f565b60208152600061154860208301846118ba565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600067ffffffffffffffff821115611bd157611bd1611d27565b5060051b60200190565b60008219821115611bee57611bee611ce5565b500190565b600082611c0257611c02611cfb565b500490565b600082821015611c1957611c19611ce5565b500390565b60005b83811015611c39578181015183820152602001611c21565b83811115611c48576000848401525b50505050565b600181811c90821680611c6257607f821691505b60208210811415611c8357634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f1916810167ffffffffffffffff81118282101715611caf57611caf611d27565b6040525050565b6000600019821415611cca57611cca611ce5565b5060010190565b600082611ce057611ce0611cfb565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115611d565760046000803e5060005160e01c5b90565b600060443d1015611d675790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715611d9757505050505090565b8285019150815181811115611daf5750505050505090565b843d8701016020828501011115611dc95750505050505090565b611dd860208286010187611c89565b509095945050505050565b6001600160e01b03198116811461091557600080fdfea2646970667358221220830bbda7ef645fe45580ca570a3156e56cacdad2b76637c19fd62d7a80473bae64736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101405760003560e01c80634f558e79116100b8578063a22cb4651161007c578063a22cb4651461028b578063bd85b0391461029e578063cfb5bb1f146102be578063e985e9c5146102c6578063f242432a14610302578063f2fde38b1461031557600080fd5b80634f558e791461022b578063715018a61461024d5780638329de2f146102555780638da5cb5b1461026857806395d89b411461028357600080fd5b80631eac06911161010a5780631eac0691146101bf578063236effd9146101c85780632639f460146101dd5780632eb2c2d6146101f05780633f5ab224146102035780634e1273f41461020b57600080fd5b80629a9b7b14610145578062fdd58e1461016157806301ffc9a71461017457806306fdde03146101975780630e89341c146101ac575b600080fd5b61014e60095481565b6040519081526020015b60405180910390f35b61014e61016f3660046116e8565b610328565b6101876101823660046117e3565b6103bf565b6040519015158152602001610158565b61019f610411565b6040516101589190611a98565b61019f6101ba366004611866565b6104a3565b61014e60085481565b6101db6101d6366004611866565b6104d7565b005b6101db6101eb36600461181d565b610506565b6101db6101fe36600461159d565b610547565b6101db6105de565b61021e610219366004611712565b61063e565b6040516101589190611a60565b610187610239366004611866565b600090815260036020526040902054151590565b6101db610768565b6101db610263366004611866565b61079e565b6004546040516001600160a01b039091168152602001610158565b61019f6107cd565b6101db6102993660046116ac565b6107dc565b61014e6102ac366004611866565b60009081526003602052604090205490565b61019f6107e7565b6101876102d436600461156a565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6101db610310366004611647565b6107f6565b6101db61032336600461154f565b61087d565b60006001600160a01b0383166103995760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b14806103f057506001600160e01b031982166303a24d0760e21b145b8061040b57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606006805461042090611c4e565b80601f016020809104026020016040519081016040528092919081815260200182805461044c90611c4e565b80156104995780601f1061046e57610100808354040283529160200191610499565b820191906000526020600020905b81548152906001019060200180831161047c57829003601f168201915b5050505050905090565b606060056104b083610918565b6040516020016104c1929190611902565b6040516020818303038152906040529050919050565b6004546001600160a01b031633146105015760405162461bcd60e51b815260040161039090611b82565b600855565b6004546001600160a01b031633146105305760405162461bcd60e51b815260040161039090611b82565b805161054390600590602084019061139e565b5050565b6001600160a01b038516331480610563575061056385336102d4565b6105ca5760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610390565b6105d78585858585610a1e565b5050505050565b6004546001600160a01b031633146106085760405162461bcd60e51b815260040161039090611b82565b6106273360095460085460405180602001604052806000815250610c09565b6009805490600061063783611cb6565b9190505550565b606081518351146106a35760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610390565b6000835167ffffffffffffffff8111156106bf576106bf611d27565b6040519080825280602002602001820160405280156106e8578160200160208202803683370190505b50905060005b84518110156107605761073385828151811061070c5761070c611d11565b602002602001015185838151811061072657610726611d11565b6020026020010151610328565b82828151811061074557610745611d11565b602090810291909101015261075981611cb6565b90506106ee565b509392505050565b6004546001600160a01b031633146107925760405162461bcd60e51b815260040161039090611b82565b61079c6000610d2c565b565b6004546001600160a01b031633146107c85760405162461bcd60e51b815260040161039090611b82565b600955565b60606007805461042090611c4e565b610543338383610d7e565b60606005805461042090611c4e565b6001600160a01b038516331480610812575061081285336102d4565b6108705760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b6064820152608401610390565b6105d78585858585610e5f565b6004546001600160a01b031633146108a75760405162461bcd60e51b815260040161039090611b82565b6001600160a01b03811661090c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610390565b61091581610d2c565b50565b60608161093c5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115610966578061095081611cb6565b915061095f9050600a83611bf3565b9150610940565b60008167ffffffffffffffff81111561098157610981611d27565b6040519080825280601f01601f1916602001820160405280156109ab576020820181803683370190505b5090505b8415610a16576109c0600183611c07565b91506109cd600a86611cd1565b6109d8906030611bdb565b60f81b8183815181106109ed576109ed611d11565b60200101906001600160f81b031916908160001a905350610a0f600a86611bf3565b94506109af565b949350505050565b8151835114610a805760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608401610390565b6001600160a01b038416610aa65760405162461bcd60e51b815260040161039090611af3565b33610ab5818787878787610f97565b60005b8451811015610b9b576000858281518110610ad557610ad5611d11565b602002602001015190506000858381518110610af357610af3611d11565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015610b435760405162461bcd60e51b815260040161039090611b38565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290610b80908490611bdb565b9250508190555050505080610b9490611cb6565b9050610ab8565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610beb929190611a73565b60405180910390a4610c01818787878787610fa5565b505050505050565b6001600160a01b038416610c695760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610390565b336000610c7585611110565b90506000610c8285611110565b9050610c9383600089858589610f97565b6000868152602081815260408083206001600160a01b038b16845290915281208054879290610cc3908490611bdb565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610d238360008989898961115b565b50505050505050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415610df25760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610390565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038416610e855760405162461bcd60e51b815260040161039090611af3565b336000610e9185611110565b90506000610e9e85611110565b9050610eae838989858589610f97565b6000868152602081815260408083206001600160a01b038c16845290915290205485811015610eef5760405162461bcd60e51b815260040161039090611b38565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290610f2c908490611bdb565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610f8c848a8a8a8a8a61115b565b505050505050505050565b610c01868686868686611225565b6001600160a01b0384163b15610c015760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190610fe990899089908890889088906004016119bd565b602060405180830381600087803b15801561100357600080fd5b505af1925050508015611033575060408051601f3d908101601f1916820190925261103091810190611800565b60015b6110e05761103f611d3d565b806308c379a014156110795750611054611d59565b8061105f575061107b565b8060405162461bcd60e51b81526004016103909190611a98565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610390565b6001600160e01b0319811663bc197c8160e01b14610d235760405162461bcd60e51b815260040161039090611aab565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061114a5761114a611d11565b602090810291909101015292915050565b6001600160a01b0384163b15610c015760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061119f9089908990889088908890600401611a1b565b602060405180830381600087803b1580156111b957600080fd5b505af19250505080156111e9575060408051601f3d908101601f191682019092526111e691810190611800565b60015b6111f55761103f611d3d565b6001600160e01b0319811663f23a6e6160e01b14610d235760405162461bcd60e51b815260040161039090611aab565b6001600160a01b0385166112ac5760005b83518110156112aa5782818151811061125157611251611d11565b60200260200101516003600086848151811061126f5761126f611d11565b6020026020010151815260200190815260200160002060008282546112949190611bdb565b909155506112a3905081611cb6565b9050611236565b505b6001600160a01b038416610c015760005b8351811015610d235760008482815181106112da576112da611d11565b6020026020010151905060008483815181106112f8576112f8611d11565b602002602001015190506000600360008481526020019081526020016000205490508181101561137b5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b6064820152608401610390565b6000928352600360205260409092209103905561139781611cb6565b90506112bd565b8280546113aa90611c4e565b90600052602060002090601f0160209004810192826113cc5760008555611412565b82601f106113e557805160ff1916838001178555611412565b82800160010185558215611412579182015b828111156114125782518255916020019190600101906113f7565b5061141e929150611422565b5090565b5b8082111561141e5760008155600101611423565b600067ffffffffffffffff83111561145157611451611d27565b604051611468601f8501601f191660200182611c89565b80915083815284848401111561147d57600080fd5b83836020830137600060208583010152509392505050565b80356001600160a01b03811681146114ac57600080fd5b919050565b600082601f8301126114c257600080fd5b813560206114cf82611bb7565b6040516114dc8282611c89565b8381528281019150858301600585901b870184018810156114fc57600080fd5b60005b8581101561151b578135845292840192908401906001016114ff565b5090979650505050505050565b600082601f83011261153957600080fd5b61154883833560208501611437565b9392505050565b60006020828403121561156157600080fd5b61154882611495565b6000806040838503121561157d57600080fd5b61158683611495565b915061159460208401611495565b90509250929050565b600080600080600060a086880312156115b557600080fd5b6115be86611495565b94506115cc60208701611495565b9350604086013567ffffffffffffffff808211156115e957600080fd5b6115f589838a016114b1565b9450606088013591508082111561160b57600080fd5b61161789838a016114b1565b9350608088013591508082111561162d57600080fd5b5061163a88828901611528565b9150509295509295909350565b600080600080600060a0868803121561165f57600080fd5b61166886611495565b945061167660208701611495565b93506040860135925060608601359150608086013567ffffffffffffffff8111156116a057600080fd5b61163a88828901611528565b600080604083850312156116bf57600080fd5b6116c883611495565b9150602083013580151581146116dd57600080fd5b809150509250929050565b600080604083850312156116fb57600080fd5b61170483611495565b946020939093013593505050565b6000806040838503121561172557600080fd5b823567ffffffffffffffff8082111561173d57600080fd5b818501915085601f83011261175157600080fd5b8135602061175e82611bb7565b60405161176b8282611c89565b8381528281019150858301600585901b870184018b101561178b57600080fd5b600096505b848710156117b5576117a181611495565b835260019690960195918301918301611790565b50965050860135925050808211156117cc57600080fd5b506117d9858286016114b1565b9150509250929050565b6000602082840312156117f557600080fd5b813561154881611de3565b60006020828403121561181257600080fd5b815161154881611de3565b60006020828403121561182f57600080fd5b813567ffffffffffffffff81111561184657600080fd5b8201601f8101841361185757600080fd5b610a1684823560208401611437565b60006020828403121561187857600080fd5b5035919050565b600081518084526020808501945080840160005b838110156118af57815187529582019590820190600101611893565b509495945050505050565b600081518084526118d2816020860160208601611c1e565b601f01601f19169290920160200192915050565b600081516118f8818560208601611c1e565b9290920192915050565b600080845481600182811c91508083168061191e57607f831692505b602080841082141561193e57634e487b7160e01b86526022600452602486fd5b818015611952576001811461196357611990565b60ff19861689528489019650611990565b60008b81526020902060005b868110156119885781548b82015290850190830161196f565b505084890196505b5050505050506119b46119a382866118e6565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b0386811682528516602082015260a0604082018190526000906119e99083018661187f565b82810360608401526119fb818661187f565b90508281036080840152611a0f81856118ba565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090611a55908301846118ba565b979650505050505050565b602081526000611548602083018461187f565b604081526000611a86604083018561187f565b82810360208401526119b4818561187f565b60208152600061154860208301846118ba565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600067ffffffffffffffff821115611bd157611bd1611d27565b5060051b60200190565b60008219821115611bee57611bee611ce5565b500190565b600082611c0257611c02611cfb565b500490565b600082821015611c1957611c19611ce5565b500390565b60005b83811015611c39578181015183820152602001611c21565b83811115611c48576000848401525b50505050565b600181811c90821680611c6257607f821691505b60208210811415611c8357634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f1916810167ffffffffffffffff81118282101715611caf57611caf611d27565b6040525050565b6000600019821415611cca57611cca611ce5565b5060010190565b600082611ce057611ce0611cfb565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115611d565760046000803e5060005160e01c5b90565b600060443d1015611d675790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715611d9757505050505090565b8285019150815181811115611daf5750505050505090565b843d8701016020828501011115611dc95750505050505090565b611dd860208286010187611c89565b509095945050505050565b6001600160e01b03198116811461091557600080fdfea2646970667358221220830bbda7ef645fe45580ca570a3156e56cacdad2b76637c19fd62d7a80473bae64736f6c63430008070033

Deployed Bytecode Sourcemap

283:1939:11:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;453:29;;;;;;;;;17538:25:12;;;17526:2;17511:18;453:29:11;;;;;;;;2185:228:1;;;;;;:::i;:::-;;:::i;1236:305::-;;;;;;:::i;:::-;;:::i;:::-;;;11445:14:12;;11438:22;11420:41;;11408:2;11393:18;1236:305:1;11280:187:12;652:79:11;;;:::i;:::-;;;;;;;:::i;2040:176::-;;;;;;:::i;:::-;;:::i;424:23::-;;;;;;1392:82;;;;;;:::i;:::-;;:::i;:::-;;1156:124;;;;;;:::i;:::-;;:::i;4060:430:1:-;;;;;;:::i;:::-;;:::i;1020:130:11:-;;;:::i;2570:508:1:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;901:120:4:-;;;;;;:::i;:::-;958:4;785:16;;;:12;:16;;;;;;-1:-1:-1;;;901:120:4;1668:101:0;;;:::i;1480:92:11:-;;;;;;:::i;:::-;;:::i;1036:85:0:-;1108:6;;1036:85;;-1:-1:-1;;;;;1108:6:0;;;9086:51:12;;9074:2;9059:18;1036:85:0;8940:203:12;737:83:11;;;:::i;3146:153:1:-;;;;;;:::i;:::-;;:::i;697:111:4:-;;;;;;:::i;:::-;759:7;785:16;;;:12;:16;;;;;;;697:111;1286:100:11;;;:::i;3366:166:1:-;;;;;;:::i;:::-;-1:-1:-1;;;;;3488:27:1;;;3465:4;3488:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;3366:166;3599:389;;;;;;:::i;:::-;;:::i;1918:198:0:-;;;;;;:::i;:::-;;:::i;2185:228:1:-;2271:7;-1:-1:-1;;;;;2298:21:1;;2290:77;;;;-1:-1:-1;;;2290:77:1;;12728:2:12;2290:77:1;;;12710:21:12;12767:2;12747:18;;;12740:30;12806:34;12786:18;;;12779:62;-1:-1:-1;;;12857:18:12;;;12850:41;12908:19;;2290:77:1;;;;;;;;;-1:-1:-1;2384:9:1;:13;;;;;;;;;;;-1:-1:-1;;;;;2384:22:1;;;;;;;;;;;;2185:228::o;1236:305::-;1338:4;-1:-1:-1;;;;;;1373:41:1;;-1:-1:-1;;;1373:41:1;;:109;;-1:-1:-1;;;;;;;1430:52:1;;-1:-1:-1;;;1430:52:1;1373:109;:161;;;-1:-1:-1;;;;;;;;;;937:40:9;;;1498:36:1;1354:180;1236:305;-1:-1:-1;;1236:305:1:o;652:79:11:-;689:13;719:5;712:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;652:79;:::o;2040:176::-;2101:13;2157;2172:26;2189:8;2172:16;:26::i;:::-;2140:68;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2126:83;;2040:176;;;:::o;1392:82::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:7;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;1453:8:11::1;:14:::0;1392:82::o;1156:124::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:7;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;1241:32:11;;::::1;::::0;:13:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;:::-;;1156:124:::0;:::o;4060:430:1:-;-1:-1:-1;;;;;4285:20:1;;719:10:7;4285:20:1;;:60;;-1:-1:-1;4309:36:1;4326:4;719:10:7;3366:166:1;:::i;4309:36::-;4264:157;;;;-1:-1:-1;;;4264:157:1;;14363:2:12;4264:157:1;;;14345:21:12;14402:2;14382:18;;;14375:30;14441:34;14421:18;;;14414:62;-1:-1:-1;;;14492:18:12;;;14485:48;14550:19;;4264:157:1;14161:414:12;4264:157:1;4431:52;4454:4;4460:2;4464:3;4469:7;4478:4;4431:22;:52::i;:::-;4060:430;;;;;:::o;1020:130:11:-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:7;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;1070:47:11::1;1076:10;1088:14;;1104:8;;1070:47;;;;;;;;;;;::::0;:5:::1;:47::i;:::-;1127:14;:16:::0;;;:14:::1;:16;::::0;::::1;:::i;:::-;;;;;;1020:130::o:0;2570:508:1:-;2721:16;2780:3;:10;2761:8;:15;:29;2753:83;;;;-1:-1:-1;;;2753:83:1;;16373:2:12;2753:83:1;;;16355:21:12;16412:2;16392:18;;;16385:30;16451:34;16431:18;;;16424:62;-1:-1:-1;;;16502:18:12;;;16495:39;16551:19;;2753:83:1;16171:405:12;2753:83:1;2847:30;2894:8;:15;2880:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2880:30:1;;2847:63;;2926:9;2921:120;2945:8;:15;2941:1;:19;2921:120;;;3000:30;3010:8;3019:1;3010:11;;;;;;;;:::i;:::-;;;;;;;3023:3;3027:1;3023:6;;;;;;;;:::i;:::-;;;;;;;3000:9;:30::i;:::-;2981:13;2995:1;2981:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;2962:3;;;:::i;:::-;;;2921:120;;;-1:-1:-1;3058:13:1;2570:508;-1:-1:-1;;;2570:508:1:o;1668:101:0:-;1108:6;;-1:-1:-1;;;;;1108:6:0;719:10:7;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;1732:30:::1;1759:1;1732:18;:30::i;:::-;1668:101::o:0;1480:92:11:-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:7;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;1546:14:11::1;:19:::0;1480:92::o;737:83::-;776:13;806:7;799:14;;;;;:::i;3146:153:1:-;3240:52;719:10:7;3273:8:1;3283;3240:18;:52::i;1286:100:11:-;1334:13;1366;1359:20;;;;;:::i;3599:389:1:-;-1:-1:-1;;;;;3799:20:1;;719:10:7;3799:20:1;;:60;;-1:-1:-1;3823:36:1;3840:4;719:10:7;3366:166:1;:::i;3823:36::-;3778:148;;;;-1:-1:-1;;;3778:148:1;;13547:2:12;3778:148:1;;;13529:21:12;13586:2;13566:18;;;13559:30;13625:34;13605:18;;;13598:62;-1:-1:-1;;;13676:18:12;;;13669:39;13725:19;;3778:148:1;13345:405:12;3778:148:1;3936:45;3954:4;3960:2;3964;3968:6;3976:4;3936:17;:45::i;1918:198:0:-;1108:6;;-1:-1:-1;;;;;1108:6:0;719:10:7;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2006:22:0;::::1;1998:73;;;::::0;-1:-1:-1;;;1998:73:0;;13140:2:12;1998:73:0::1;::::0;::::1;13122:21:12::0;13179:2;13159:18;;;13152:30;13218:34;13198:18;;;13191:62;-1:-1:-1;;;13269:18:12;;;13262:36;13315:19;;1998:73:0::1;12938:402:12::0;1998:73:0::1;2081:28;2100:8;2081:18;:28::i;:::-;1918:198:::0;:::o;328:703:8:-;384:13;601:10;597:51;;-1:-1:-1;;627:10:8;;;;;;;;;;;;-1:-1:-1;;;627:10:8;;;;;328:703::o;597:51::-;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:8;;-1:-1:-1;773:2:8;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:8;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:8;953:2;945:5;:10;:::i;:::-;932:24;;:2;:24;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;902:56:8;;;;;;;;-1:-1:-1;972:11:8;981:2;972:11;;:::i;:::-;;;844:150;;;1017:6;328:703;-1:-1:-1;;;;328:703:8:o;6233:1115:1:-;6453:7;:14;6439:3;:10;:28;6431:81;;;;-1:-1:-1;;;6431:81:1;;16783:2:12;6431:81:1;;;16765:21:12;16822:2;16802:18;;;16795:30;16861:34;16841:18;;;16834:62;-1:-1:-1;;;16912:18:12;;;16905:38;16960:19;;6431:81:1;16581:404:12;6431:81:1;-1:-1:-1;;;;;6530:16:1;;6522:66;;;;-1:-1:-1;;;6522:66:1;;;;;;;:::i;:::-;719:10:7;6641:60:1;719:10:7;6672:4:1;6678:2;6682:3;6687:7;6696:4;6641:20;:60::i;:::-;6717:9;6712:411;6736:3;:10;6732:1;:14;6712:411;;;6767:10;6780:3;6784:1;6780:6;;;;;;;;:::i;:::-;;;;;;;6767:19;;6800:14;6817:7;6825:1;6817:10;;;;;;;;:::i;:::-;;;;;;;;;;;;6842:19;6864:13;;;;;;;;;;-1:-1:-1;;;;;6864:19:1;;;;;;;;;;;;6817:10;;-1:-1:-1;6905:21:1;;;;6897:76;;;;-1:-1:-1;;;6897:76:1;;;;;;;:::i;:::-;7015:9;:13;;;;;;;;;;;-1:-1:-1;;;;;7015:19:1;;;;;;;;;;7037:20;;;7015:42;;7085:17;;;;;;;:27;;7037:20;;7015:9;7085:27;;7037:20;;7085:27;:::i;:::-;;;;;;;;6753:370;;;6748:3;;;;:::i;:::-;;;6712:411;;;;7168:2;-1:-1:-1;;;;;7138:47:1;7162:4;-1:-1:-1;;;;;7138:47:1;7152:8;-1:-1:-1;;;;;7138:47:1;;7172:3;7177:7;7138:47;;;;;;;:::i;:::-;;;;;;;;7266:75;7302:8;7312:4;7318:2;7322:3;7327:7;7336:4;7266:35;:75::i;:::-;6421:927;6233:1115;;;;;:::o;8630:709::-;-1:-1:-1;;;;;8777:16:1;;8769:62;;;;-1:-1:-1;;;8769:62:1;;17192:2:12;8769:62:1;;;17174:21:12;17231:2;17211:18;;;17204:30;17270:34;17250:18;;;17243:62;-1:-1:-1;;;17321:18:12;;;17314:31;17362:19;;8769:62:1;16990:397:12;8769:62:1;719:10:7;8842:16:1;8906:21;8924:2;8906:17;:21::i;:::-;8883:44;;8937:24;8964:25;8982:6;8964:17;:25::i;:::-;8937:52;;9000:66;9021:8;9039:1;9043:2;9047:3;9052:7;9061:4;9000:20;:66::i;:::-;9077:9;:13;;;;;;;;;;;-1:-1:-1;;;;;9077:17:1;;;;;;;;;:27;;9098:6;;9077:9;:27;;9098:6;;9077:27;:::i;:::-;;;;-1:-1:-1;;9119:52:1;;;17748:25:12;;;17804:2;17789:18;;17782:34;;;-1:-1:-1;;;;;9119:52:1;;;;9152:1;;9119:52;;;;;;17721:18:12;9119:52:1;;;;;;;9258:74;9289:8;9307:1;9311:2;9315;9319:6;9327:4;9258:30;:74::i;:::-;8759:580;;;8630:709;;;;:::o;2270:187:0:-;2362:6;;;-1:-1:-1;;;;;2378:17:0;;;-1:-1:-1;;;;;;2378:17:0;;;;;;;2410:40;;2362:6;;;2378:17;2362:6;;2410:40;;2343:16;;2410:40;2333:124;2270:187;:::o;12773:323:1:-;12923:8;-1:-1:-1;;;;;12914:17:1;:5;-1:-1:-1;;;;;12914:17:1;;;12906:71;;;;-1:-1:-1;;;12906:71:1;;15963:2:12;12906:71:1;;;15945:21:12;16002:2;15982:18;;;15975:30;16041:34;16021:18;;;16014:62;-1:-1:-1;;;16092:18:12;;;16085:39;16141:19;;12906:71:1;15761:405:12;12906:71:1;-1:-1:-1;;;;;12987:25:1;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;12987:46:1;;;;;;;;;;13048:41;;11420::12;;;13048::1;;11393:18:12;13048:41:1;;;;;;;12773:323;;;:::o;4940:947::-;-1:-1:-1;;;;;5121:16:1;;5113:66;;;;-1:-1:-1;;;5113:66:1;;;;;;;:::i;:::-;719:10:7;5190:16:1;5254:21;5272:2;5254:17;:21::i;:::-;5231:44;;5285:24;5312:25;5330:6;5312:17;:25::i;:::-;5285:52;;5348:60;5369:8;5379:4;5385:2;5389:3;5394:7;5403:4;5348:20;:60::i;:::-;5419:19;5441:13;;;;;;;;;;;-1:-1:-1;;;;;5441:19:1;;;;;;;;;;5478:21;;;;5470:76;;;;-1:-1:-1;;;5470:76:1;;;;;;;:::i;:::-;5580:9;:13;;;;;;;;;;;-1:-1:-1;;;;;5580:19:1;;;;;;;;;;5602:20;;;5580:42;;5642:17;;;;;;;:27;;5602:20;;5580:9;5642:27;;5602:20;;5642:27;:::i;:::-;;;;-1:-1:-1;;5685:46:1;;;17748:25:12;;;17804:2;17789:18;;17782:34;;;-1:-1:-1;;;;;5685:46:1;;;;;;;;;;;;;;17721:18:12;5685:46:1;;;;;;;5812:68;5843:8;5853:4;5859:2;5863;5867:6;5875:4;5812:30;:68::i;:::-;5103:784;;;;4940:947;;;;;:::o;1777:257:11:-;1961:66;1988:8;1998:4;2004:2;2008:3;2013:7;2022:4;1961:26;:66::i;16127:792:1:-;-1:-1:-1;;;;;16359:13:1;;1465:19:6;:23;16355:558:1;;16394:79;;-1:-1:-1;;;16394:79:1;;-1:-1:-1;;;;;16394:43:1;;;;;:79;;16438:8;;16448:4;;16454:3;;16459:7;;16468:4;;16394:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16394:79:1;;;;;;;;-1:-1:-1;;16394:79:1;;;;;;;;;;;;:::i;:::-;;;16390:513;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;16779:6;16772:14;;-1:-1:-1;;;16772:14:1;;;;;;;;:::i;16390:513::-;;;16826:62;;-1:-1:-1;;;16826:62:1;;11898:2:12;16826:62:1;;;11880:21:12;11937:2;11917:18;;;11910:30;11976:34;11956:18;;;11949:62;-1:-1:-1;;;12027:18:12;;;12020:50;12087:19;;16826:62:1;11696:416:12;16390:513:1;-1:-1:-1;;;;;;16552:60:1;;-1:-1:-1;;;16552:60:1;16548:157;;16636:50;;-1:-1:-1;;;16636:50:1;;;;;;;:::i;16925:193::-;17044:16;;;17058:1;17044:16;;;;;;;;;16991;;17019:22;;17044:16;;;;;;;;;;;;-1:-1:-1;17044:16:1;17019:41;;17081:7;17070:5;17076:1;17070:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;17106:5;16925:193;-1:-1:-1;;16925:193:1:o;15396:725::-;-1:-1:-1;;;;;15603:13:1;;1465:19:6;:23;15599:516:1;;15638:72;;-1:-1:-1;;;15638:72:1;;-1:-1:-1;;;;;15638:38:1;;;;;:72;;15677:8;;15687:4;;15693:2;;15697:6;;15705:4;;15638:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15638:72:1;;;;;;;;-1:-1:-1;;15638:72:1;;;;;;;;;;;;:::i;:::-;;;15634:471;;;;:::i;:::-;-1:-1:-1;;;;;;15759:55:1;;-1:-1:-1;;;15759:55:1;15755:152;;15838:50;;-1:-1:-1;;;15838:50:1;;;;;;;:::i;1091:904:4:-;-1:-1:-1;;;;;1403:18:4;;1399:156;;1442:9;1437:108;1461:3;:10;1457:1;:14;1437:108;;;1520:7;1528:1;1520:10;;;;;;;;:::i;:::-;;;;;;;1496:12;:20;1509:3;1513:1;1509:6;;;;;;;;:::i;:::-;;;;;;;1496:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;1473:3:4;;-1:-1:-1;1473:3:4;;:::i;:::-;;;1437:108;;;;1399:156;-1:-1:-1;;;;;1569:16:4;;1565:424;;1606:9;1601:378;1625:3;:10;1621:1;:14;1601:378;;;1660:10;1673:3;1677:1;1673:6;;;;;;;;:::i;:::-;;;;;;;1660:19;;1697:14;1714:7;1722:1;1714:10;;;;;;;;:::i;:::-;;;;;;;1697:27;;1742:14;1759:12;:16;1772:2;1759:16;;;;;;;;;;;;1742:33;;1811:6;1801;:16;;1793:69;;;;-1:-1:-1;;;1793:69:4;;15554:2:12;1793:69:4;;;15536:21:12;15593:2;15573:18;;;15566:30;15632:34;15612:18;;;15605:62;-1:-1:-1;;;15683:18:12;;;15676:38;15731:19;;1793:69:4;15352:404:12;1793:69:4;1912:16;;;;:12;:16;;;;;;1931:15;;1912:34;;1637:3;;;:::i;:::-;;;1601:378;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:468:12;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;183:2;177:9;195:69;252:2;231:15;;-1:-1:-1;;227:29:12;258:4;223:40;177:9;195:69;:::i;:::-;282:6;273:15;;312:6;304;297:22;352:3;343:6;338:3;334:16;331:25;328:45;;;369:1;366;359:12;328:45;419:6;414:3;407:4;399:6;395:17;382:44;474:1;467:4;458:6;450;446:19;442:30;435:41;;14:468;;;;;:::o;487:173::-;555:20;;-1:-1:-1;;;;;604:31:12;;594:42;;584:70;;650:1;647;640:12;584:70;487:173;;;:::o;665:735::-;719:5;772:3;765:4;757:6;753:17;749:27;739:55;;790:1;787;780:12;739:55;826:6;813:20;852:4;875:43;915:2;875:43;:::i;:::-;947:2;941:9;959:31;987:2;979:6;959:31;:::i;:::-;1025:18;;;1059:15;;;;-1:-1:-1;1094:15:12;;;1144:1;1140:10;;;1128:23;;1124:32;;1121:41;-1:-1:-1;1118:61:12;;;1175:1;1172;1165:12;1118:61;1197:1;1207:163;1221:2;1218:1;1215:9;1207:163;;;1278:17;;1266:30;;1316:12;;;;1348;;;;1239:1;1232:9;1207:163;;;-1:-1:-1;1388:6:12;;665:735;-1:-1:-1;;;;;;;665:735:12:o;1405:220::-;1447:5;1500:3;1493:4;1485:6;1481:17;1477:27;1467:55;;1518:1;1515;1508:12;1467:55;1540:79;1615:3;1606:6;1593:20;1586:4;1578:6;1574:17;1540:79;:::i;:::-;1531:88;1405:220;-1:-1:-1;;;1405:220:12:o;1630:186::-;1689:6;1742:2;1730:9;1721:7;1717:23;1713:32;1710:52;;;1758:1;1755;1748:12;1710:52;1781:29;1800:9;1781:29;:::i;1821:260::-;1889:6;1897;1950:2;1938:9;1929:7;1925:23;1921:32;1918:52;;;1966:1;1963;1956:12;1918:52;1989:29;2008:9;1989:29;:::i;:::-;1979:39;;2037:38;2071:2;2060:9;2056:18;2037:38;:::i;:::-;2027:48;;1821:260;;;;;:::o;2086:943::-;2240:6;2248;2256;2264;2272;2325:3;2313:9;2304:7;2300:23;2296:33;2293:53;;;2342:1;2339;2332:12;2293:53;2365:29;2384:9;2365:29;:::i;:::-;2355:39;;2413:38;2447:2;2436:9;2432:18;2413:38;:::i;:::-;2403:48;;2502:2;2491:9;2487:18;2474:32;2525:18;2566:2;2558:6;2555:14;2552:34;;;2582:1;2579;2572:12;2552:34;2605:61;2658:7;2649:6;2638:9;2634:22;2605:61;:::i;:::-;2595:71;;2719:2;2708:9;2704:18;2691:32;2675:48;;2748:2;2738:8;2735:16;2732:36;;;2764:1;2761;2754:12;2732:36;2787:63;2842:7;2831:8;2820:9;2816:24;2787:63;:::i;:::-;2777:73;;2903:3;2892:9;2888:19;2875:33;2859:49;;2933:2;2923:8;2920:16;2917:36;;;2949:1;2946;2939:12;2917:36;;2972:51;3015:7;3004:8;2993:9;2989:24;2972:51;:::i;:::-;2962:61;;;2086:943;;;;;;;;:::o;3034:606::-;3138:6;3146;3154;3162;3170;3223:3;3211:9;3202:7;3198:23;3194:33;3191:53;;;3240:1;3237;3230:12;3191:53;3263:29;3282:9;3263:29;:::i;:::-;3253:39;;3311:38;3345:2;3334:9;3330:18;3311:38;:::i;:::-;3301:48;;3396:2;3385:9;3381:18;3368:32;3358:42;;3447:2;3436:9;3432:18;3419:32;3409:42;;3502:3;3491:9;3487:19;3474:33;3530:18;3522:6;3519:30;3516:50;;;3562:1;3559;3552:12;3516:50;3585:49;3626:7;3617:6;3606:9;3602:22;3585:49;:::i;3645:347::-;3710:6;3718;3771:2;3759:9;3750:7;3746:23;3742:32;3739:52;;;3787:1;3784;3777:12;3739:52;3810:29;3829:9;3810:29;:::i;:::-;3800:39;;3889:2;3878:9;3874:18;3861:32;3936:5;3929:13;3922:21;3915:5;3912:32;3902:60;;3958:1;3955;3948:12;3902:60;3981:5;3971:15;;;3645:347;;;;;:::o;3997:254::-;4065:6;4073;4126:2;4114:9;4105:7;4101:23;4097:32;4094:52;;;4142:1;4139;4132:12;4094:52;4165:29;4184:9;4165:29;:::i;:::-;4155:39;4241:2;4226:18;;;;4213:32;;-1:-1:-1;;;3997:254:12:o;4256:1219::-;4374:6;4382;4435:2;4423:9;4414:7;4410:23;4406:32;4403:52;;;4451:1;4448;4441:12;4403:52;4491:9;4478:23;4520:18;4561:2;4553:6;4550:14;4547:34;;;4577:1;4574;4567:12;4547:34;4615:6;4604:9;4600:22;4590:32;;4660:7;4653:4;4649:2;4645:13;4641:27;4631:55;;4682:1;4679;4672:12;4631:55;4718:2;4705:16;4740:4;4763:43;4803:2;4763:43;:::i;:::-;4835:2;4829:9;4847:31;4875:2;4867:6;4847:31;:::i;:::-;4913:18;;;4947:15;;;;-1:-1:-1;4982:11:12;;;5024:1;5020:10;;;5012:19;;5008:28;;5005:41;-1:-1:-1;5002:61:12;;;5059:1;5056;5049:12;5002:61;5081:1;5072:10;;5091:169;5105:2;5102:1;5099:9;5091:169;;;5162:23;5181:3;5162:23;:::i;:::-;5150:36;;5123:1;5116:9;;;;;5206:12;;;;5238;;5091:169;;;-1:-1:-1;5279:6:12;-1:-1:-1;;5323:18:12;;5310:32;;-1:-1:-1;;5354:16:12;;;5351:36;;;5383:1;5380;5373:12;5351:36;;5406:63;5461:7;5450:8;5439:9;5435:24;5406:63;:::i;:::-;5396:73;;;4256:1219;;;;;:::o;5480:245::-;5538:6;5591:2;5579:9;5570:7;5566:23;5562:32;5559:52;;;5607:1;5604;5597:12;5559:52;5646:9;5633:23;5665:30;5689:5;5665:30;:::i;5730:249::-;5799:6;5852:2;5840:9;5831:7;5827:23;5823:32;5820:52;;;5868:1;5865;5858:12;5820:52;5900:9;5894:16;5919:30;5943:5;5919:30;:::i;5984:450::-;6053:6;6106:2;6094:9;6085:7;6081:23;6077:32;6074:52;;;6122:1;6119;6112:12;6074:52;6162:9;6149:23;6195:18;6187:6;6184:30;6181:50;;;6227:1;6224;6217:12;6181:50;6250:22;;6303:4;6295:13;;6291:27;-1:-1:-1;6281:55:12;;6332:1;6329;6322:12;6281:55;6355:73;6420:7;6415:2;6402:16;6397:2;6393;6389:11;6355:73;:::i;6439:180::-;6498:6;6551:2;6539:9;6530:7;6526:23;6522:32;6519:52;;;6567:1;6564;6557:12;6519:52;-1:-1:-1;6590:23:12;;6439:180;-1:-1:-1;6439:180:12:o;6624:435::-;6677:3;6715:5;6709:12;6742:6;6737:3;6730:19;6768:4;6797:2;6792:3;6788:12;6781:19;;6834:2;6827:5;6823:14;6855:1;6865:169;6879:6;6876:1;6873:13;6865:169;;;6940:13;;6928:26;;6974:12;;;;7009:15;;;;6901:1;6894:9;6865:169;;;-1:-1:-1;7050:3:12;;6624:435;-1:-1:-1;;;;;6624:435:12:o;7064:257::-;7105:3;7143:5;7137:12;7170:6;7165:3;7158:19;7186:63;7242:6;7235:4;7230:3;7226:14;7219:4;7212:5;7208:16;7186:63;:::i;:::-;7303:2;7282:15;-1:-1:-1;;7278:29:12;7269:39;;;;7310:4;7265:50;;7064:257;-1:-1:-1;;7064:257:12:o;7326:185::-;7368:3;7406:5;7400:12;7421:52;7466:6;7461:3;7454:4;7447:5;7443:16;7421:52;:::i;:::-;7489:16;;;;;7326:185;-1:-1:-1;;7326:185:12:o;7634:1301::-;7911:3;7940:1;7973:6;7967:13;8003:3;8025:1;8053:9;8049:2;8045:18;8035:28;;8113:2;8102:9;8098:18;8135;8125:61;;8179:4;8171:6;8167:17;8157:27;;8125:61;8205:2;8253;8245:6;8242:14;8222:18;8219:38;8216:165;;;-1:-1:-1;;;8280:33:12;;8336:4;8333:1;8326:15;8366:4;8287:3;8354:17;8216:165;8397:18;8424:104;;;;8542:1;8537:320;;;;8390:467;;8424:104;-1:-1:-1;;8457:24:12;;8445:37;;8502:16;;;;-1:-1:-1;8424:104:12;;8537:320;18088:1;18081:14;;;18125:4;18112:18;;8632:1;8646:165;8660:6;8657:1;8654:13;8646:165;;;8738:14;;8725:11;;;8718:35;8781:16;;;;8675:10;;8646:165;;;8650:3;;8840:6;8835:3;8831:16;8824:23;;8390:467;;;;;;;8873:56;8898:30;8924:3;8916:6;8898:30;:::i;:::-;-1:-1:-1;;;7576:20:12;;7621:1;7612:11;;7516:113;8873:56;8866:63;7634:1301;-1:-1:-1;;;;;7634:1301:12:o;9148:826::-;-1:-1:-1;;;;;9545:15:12;;;9527:34;;9597:15;;9592:2;9577:18;;9570:43;9507:3;9644:2;9629:18;;9622:31;;;9470:4;;9676:57;;9713:19;;9705:6;9676:57;:::i;:::-;9781:9;9773:6;9769:22;9764:2;9753:9;9749:18;9742:50;9815:44;9852:6;9844;9815:44;:::i;:::-;9801:58;;9908:9;9900:6;9896:22;9890:3;9879:9;9875:19;9868:51;9936:32;9961:6;9953;9936:32;:::i;:::-;9928:40;9148:826;-1:-1:-1;;;;;;;;9148:826:12:o;9979:560::-;-1:-1:-1;;;;;10276:15:12;;;10258:34;;10328:15;;10323:2;10308:18;;10301:43;10375:2;10360:18;;10353:34;;;10418:2;10403:18;;10396:34;;;10238:3;10461;10446:19;;10439:32;;;10201:4;;10488:45;;10513:19;;10505:6;10488:45;:::i;:::-;10480:53;9979:560;-1:-1:-1;;;;;;;9979:560:12:o;10544:261::-;10723:2;10712:9;10705:21;10686:4;10743:56;10795:2;10784:9;10780:18;10772:6;10743:56;:::i;10810:465::-;11067:2;11056:9;11049:21;11030:4;11093:56;11145:2;11134:9;11130:18;11122:6;11093:56;:::i;:::-;11197:9;11189:6;11185:22;11180:2;11169:9;11165:18;11158:50;11225:44;11262:6;11254;11225:44;:::i;11472:219::-;11621:2;11610:9;11603:21;11584:4;11641:44;11681:2;11670:9;11666:18;11658:6;11641:44;:::i;12117:404::-;12319:2;12301:21;;;12358:2;12338:18;;;12331:30;12397:34;12392:2;12377:18;;12370:62;-1:-1:-1;;;12463:2:12;12448:18;;12441:38;12511:3;12496:19;;12117:404::o;13755:401::-;13957:2;13939:21;;;13996:2;13976:18;;;13969:30;14035:34;14030:2;14015:18;;14008:62;-1:-1:-1;;;14101:2:12;14086:18;;14079:35;14146:3;14131:19;;13755:401::o;14580:406::-;14782:2;14764:21;;;14821:2;14801:18;;;14794:30;14860:34;14855:2;14840:18;;14833:62;-1:-1:-1;;;14926:2:12;14911:18;;14904:40;14976:3;14961:19;;14580:406::o;14991:356::-;15193:2;15175:21;;;15212:18;;;15205:30;15271:34;15266:2;15251:18;;15244:62;15338:2;15323:18;;14991:356::o;17827:183::-;17887:4;17920:18;17912:6;17909:30;17906:56;;;17942:18;;:::i;:::-;-1:-1:-1;17987:1:12;17983:14;17999:4;17979:25;;17827:183::o;18141:128::-;18181:3;18212:1;18208:6;18205:1;18202:13;18199:39;;;18218:18;;:::i;:::-;-1:-1:-1;18254:9:12;;18141:128::o;18274:120::-;18314:1;18340;18330:35;;18345:18;;:::i;:::-;-1:-1:-1;18379:9:12;;18274:120::o;18399:125::-;18439:4;18467:1;18464;18461:8;18458:34;;;18472:18;;:::i;:::-;-1:-1:-1;18509:9:12;;18399:125::o;18529:258::-;18601:1;18611:113;18625:6;18622:1;18619:13;18611:113;;;18701:11;;;18695:18;18682:11;;;18675:39;18647:2;18640:10;18611:113;;;18742:6;18739:1;18736:13;18733:48;;;18777:1;18768:6;18763:3;18759:16;18752:27;18733:48;;18529:258;;;:::o;18792:380::-;18871:1;18867:12;;;;18914;;;18935:61;;18989:4;18981:6;18977:17;18967:27;;18935:61;19042:2;19034:6;19031:14;19011:18;19008:38;19005:161;;;19088:10;19083:3;19079:20;19076:1;19069:31;19123:4;19120:1;19113:15;19151:4;19148:1;19141:15;19005:161;;18792:380;;;:::o;19177:249::-;19287:2;19268:13;;-1:-1:-1;;19264:27:12;19252:40;;19322:18;19307:34;;19343:22;;;19304:62;19301:88;;;19369:18;;:::i;:::-;19405:2;19398:22;-1:-1:-1;;19177:249:12:o;19431:135::-;19470:3;-1:-1:-1;;19491:17:12;;19488:43;;;19511:18;;:::i;:::-;-1:-1:-1;19558:1:12;19547:13;;19431:135::o;19571:112::-;19603:1;19629;19619:35;;19634:18;;:::i;:::-;-1:-1:-1;19668:9:12;;19571:112::o;19688:127::-;19749:10;19744:3;19740:20;19737:1;19730:31;19780:4;19777:1;19770:15;19804:4;19801:1;19794:15;19820:127;19881:10;19876:3;19872:20;19869:1;19862:31;19912:4;19909:1;19902:15;19936:4;19933:1;19926:15;19952:127;20013:10;20008:3;20004:20;20001:1;19994:31;20044:4;20041:1;20034:15;20068:4;20065:1;20058:15;20084:127;20145:10;20140:3;20136:20;20133:1;20126:31;20176:4;20173:1;20166:15;20200:4;20197:1;20190:15;20216:179;20251:3;20293:1;20275:16;20272:23;20269:120;;;20339:1;20336;20333;20318:23;-1:-1:-1;20376:1:12;20370:8;20365:3;20361:18;20269:120;20216:179;:::o;20400:671::-;20439:3;20481:4;20463:16;20460:26;20457:39;;;20400:671;:::o;20457:39::-;20523:2;20517:9;-1:-1:-1;;20588:16:12;20584:25;;20581:1;20517:9;20560:50;20639:4;20633:11;20663:16;20698:18;20769:2;20762:4;20754:6;20750:17;20747:25;20742:2;20734:6;20731:14;20728:45;20725:58;;;20776:5;;;;;20400:671;:::o;20725:58::-;20813:6;20807:4;20803:17;20792:28;;20849:3;20843:10;20876:2;20868:6;20865:14;20862:27;;;20882:5;;;;;;20400:671;:::o;20862:27::-;20966:2;20947:16;20941:4;20937:27;20933:36;20926:4;20917:6;20912:3;20908:16;20904:27;20901:69;20898:82;;;20973:5;;;;;;20400:671;:::o;20898:82::-;20989:57;21040:4;21031:6;21023;21019:19;21015:30;21009:4;20989:57;:::i;:::-;-1:-1:-1;21062:3:12;;20400:671;-1:-1:-1;;;;;20400:671:12:o;21076:131::-;-1:-1:-1;;;;;;21150:32:12;;21140:43;;21130:71;;21197:1;21194;21187:12

Swarm Source

ipfs://830bbda7ef645fe45580ca570a3156e56cacdad2b76637c19fd62d7a80473bae
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.