ETH Price: $3,899.80 (+0.41%)

Token

Misfit University Official (MU)
 

Overview

Max Total Supply

0 MU

Holders

2,542

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
2 MU
0xbee1314a430d80aea224860b020dce7ec25eed98
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Misfit University is a collection of 10,000 NFTs

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Misfit_University_Official

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-06-24
*/

// Sources flattened with hardhat v2.3.3 https://hardhat.org

// File @openzeppelin/contracts/utils/introspection/[email protected]
// SPDX-License-Identifier: MIT


pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC721/[email protected]
pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


pragma solidity ^0.8.0;

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]


pragma solidity ^0.8.0;

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

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

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]


pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}


// File @openzeppelin/contracts/utils/[email protected]


pragma solidity ^0.8.0;

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

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

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

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

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

}


// File @openzeppelin/contracts/utils/introspection/[email protected]


pragma solidity ^0.8.0;

/**
 * @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 @openzeppelin/contracts/token/ERC721/[email protected]


pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


pragma solidity ^0.8.0;

/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping (uint256 => string) private _tokenURIs;

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

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

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}


// File @openzeppelin/contracts/utils/[email protected]


pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }
}


// File @openzeppelin/contracts/access/[email protected]


pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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


// File contracts/Misfit_University_Official.sol

pragma solidity ^0.8.0;




contract Misfit_University_Official is ERC721URIStorage, Ownable {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;

    uint public fee;

    uint public reserved;

    string public baseUri;

    event Minted(address to, uint id, string uri);

    event PriceUpdated(uint newPrice);

    constructor() ERC721("Misfit University Official", "MU") {
      fee = 80000000000000000 wei; //0.08 ETH
      baseUri = "ipfs://QmbumZq4f81hc2KsVWMMH2AmRpw7nSwX3KBsjABewabNnj/";
    }

    /**
     * @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);
    }

    /*
    * Mint Misfits
    */
    function mint(address player, uint numberOfMints)
        public payable
        returns (uint256)
    {
        require(_tokenIds.current() + numberOfMints <= 9900, "Maximum amount of Misfits already minted."); //10000 item cap (9900 public + 100 team mints)
        require(msg.value >= fee * numberOfMints, "Fee is not correct.");  //User must pay set fee.`
        require(numberOfMints <= 20, "You cant mint more than 20 at a time.");

        for(uint i = 0; i < numberOfMints; i++) {

            _tokenIds.increment();
            uint256 newItemId = _tokenIds.current();
            string memory tokenURI = string(abi.encodePacked(baseUri, toString(newItemId),  ".json"));
            _mint(player, newItemId);
            _setTokenURI(newItemId, tokenURI);

            //removed Mint event here bc of gas intensity.
        }

        return _tokenIds.current();
    }

    function getOwnerMintedTotal() public view returns(uint){
        return reserved;
    }

    function mintOwner(address player, string memory tokenURI)
        public onlyOwner
        returns (uint256)
    {
        require(reserved < 100); //owner can mint up to 100 for free. this can be handed over to a DAO too.

        require(_tokenIds.current() < 10000); //10000 item cap no matter what

        _tokenIds.increment();

        uint256 newItemId = _tokenIds.current();
        _mint(player, newItemId);
        _setTokenURI(newItemId, tokenURI);

        emit Minted(player, newItemId, tokenURI);

        reserved = reserved + 1;

        return newItemId;
    }

    function updateFee(uint newFee) public onlyOwner{
      fee = newFee;

      emit PriceUpdated(newFee);
    }

    function getFee() public view returns (uint) {
      return fee;
    }

    function cashOut() public onlyOwner{
        payable(msg.sender).transfer(address(this).balance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"string","name":"uri","type":"string"}],"name":"Minted","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":false,"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"PriceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cashOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwnerMintedTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"player","type":"address"},{"internalType":"uint256","name":"numberOfMints","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"player","type":"address"},{"internalType":"string","name":"tokenURI","type":"string"}],"name":"mintOwner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"updateFee","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50604080518082018252601a81527f4d697366697420556e6976657273697479204f6666696369616c0000000000006020808301918252835180850190945260028452614d5560f01b908401528151919291620000719160009162000130565b5080516200008790600190602084019062000130565b50505060006200009c6200012c60201b60201c565b600780546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35067011c37937e0800006009556040805160608101909152603680825262002445602083013980516200012591600b9160209091019062000130565b5062000213565b3390565b8280546200013e90620001d6565b90600052602060002090601f016020900481019282620001625760008555620001ad565b82601f106200017d57805160ff1916838001178555620001ad565b82800160010185558215620001ad579182015b82811115620001ad57825182559160200191906001019062000190565b50620001bb929150620001bf565b5090565b5b80821115620001bb5760008155600101620001c0565b600281046001821680620001eb57607f821691505b602082108114156200020d57634e487b7160e01b600052602260045260246000fd5b50919050565b61222280620002236000396000f3fe6080604052600436106101665760003560e01c80639012c4a8116100d1578063c87b56dd1161008a578063e985e9c511610064578063e985e9c5146103da578063f2fde38b146103fa578063f9b8c3bd1461041a578063fe60d12c1461043a57610166565b8063c87b56dd14610390578063ced72f87146103b0578063ddca3f43146103c557610166565b80639012c4a8146102f157806395d89b41146103115780639abc832014610326578063a22cb4651461033b578063b88d4fde1461035b578063bc6258c91461037b57610166565b806342842e0e1161012357806342842e0e146102525780636352211e1461027257806370a0823114610292578063715018a6146102b2578063793cd71e146102c75780638da5cb5b146102dc57610166565b806301ffc9a71461016b57806306fdde03146101a1578063081812fc146101c3578063095ea7b3146101f057806323b872dd1461021257806340c10f1914610232575b600080fd5b34801561017757600080fd5b5061018b6101863660046118ab565b61044f565b6040516101989190611aa9565b60405180910390f35b3480156101ad57600080fd5b506101b6610497565b6040516101989190611ab4565b3480156101cf57600080fd5b506101e36101de3660046118e3565b610529565b6040516101989190611a31565b3480156101fc57600080fd5b5061021061020b366004611882565b610575565b005b34801561021e57600080fd5b5061021061022d366004611735565b61060d565b610245610240366004611882565b610645565b6040516101989190612087565b34801561025e57600080fd5b5061021061026d366004611735565b610758565b34801561027e57600080fd5b506101e361028d3660046118e3565b610773565b34801561029e57600080fd5b506102456102ad3660046116e9565b6107a8565b3480156102be57600080fd5b506102106107ec565b3480156102d357600080fd5b50610210610875565b3480156102e857600080fd5b506101e36108e3565b3480156102fd57600080fd5b5061021061030c3660046118e3565b6108f2565b34801561031d57600080fd5b506101b6610971565b34801561033257600080fd5b506101b6610980565b34801561034757600080fd5b506102106103563660046117e9565b610a0e565b34801561036757600080fd5b50610210610376366004611770565b610adc565b34801561038757600080fd5b50610245610b1b565b34801561039c57600080fd5b506101b66103ab3660046118e3565b610b21565b3480156103bc57600080fd5b50610245610c42565b3480156103d157600080fd5b50610245610c48565b3480156103e657600080fd5b5061018b6103f5366004611703565b610c4e565b34801561040657600080fd5b506102106104153660046116e9565b610c7c565b34801561042657600080fd5b50610245610435366004611823565b610d3d565b34801561044657600080fd5b50610245610e23565b60006001600160e01b031982166380ac58cd60e01b148061048057506001600160e01b03198216635b5e139f60e01b145b8061048f575061048f82610e29565b90505b919050565b6060600080546104a69061212a565b80601f01602080910402602001604051908101604052809291908181526020018280546104d29061212a565b801561051f5780601f106104f45761010080835404028352916020019161051f565b820191906000526020600020905b81548152906001019060200180831161050257829003601f168201915b5050505050905090565b600061053482610e42565b6105595760405162461bcd60e51b815260040161055090611e97565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061058082610773565b9050806001600160a01b0316836001600160a01b031614156105b45760405162461bcd60e51b815260040161055090611fb0565b806001600160a01b03166105c6610e5f565b6001600160a01b031614806105e257506105e2816103f5610e5f565b6105fe5760405162461bcd60e51b815260040161055090611cd3565b6106088383610e63565b505050565b61061e610618610e5f565b82610ed1565b61063a5760405162461bcd60e51b815260040161055090611ff1565b610608838383610f4e565b60006126ac82610655600861107b565b61065f919061209c565b111561067d5760405162461bcd60e51b815260040161055090611b96565b8160095461068b91906120c8565b3410156106aa5760405162461bcd60e51b815260040161055090611c5a565b60148211156106cb5760405162461bcd60e51b815260040161055090612042565b60005b82811015610746576106e0600861107f565b60006106ec600861107b565b90506000600b6106fb83611088565b60405160200161070c929190611983565b604051602081830303815290604052905061072786836111a3565b6107318282611282565b5050808061073e90612165565b9150506106ce565b50610751600861107b565b9392505050565b61060883838360405180602001604052806000815250610adc565b6000818152600260205260408120546001600160a01b03168061048f5760405162461bcd60e51b815260040161055090611d7a565b60006001600160a01b0382166107d05760405162461bcd60e51b815260040161055090611d30565b506001600160a01b031660009081526003602052604090205490565b6107f4610e5f565b6001600160a01b03166108056108e3565b6001600160a01b03161461082b5760405162461bcd60e51b815260040161055090611ee3565b6007546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600780546001600160a01b0319169055565b61087d610e5f565b6001600160a01b031661088e6108e3565b6001600160a01b0316146108b45760405162461bcd60e51b815260040161055090611ee3565b60405133904780156108fc02916000818181858888f193505050501580156108e0573d6000803e3d6000fd5b50565b6007546001600160a01b031690565b6108fa610e5f565b6001600160a01b031661090b6108e3565b6001600160a01b0316146109315760405162461bcd60e51b815260040161055090611ee3565b60098190556040517f66cbca4f3c64fecf1dcb9ce094abcf7f68c3450a1d4e3a8e917dd621edb4ebe090610966908390612087565b60405180910390a150565b6060600180546104a69061212a565b600b805461098d9061212a565b80601f01602080910402602001604051908101604052809291908181526020018280546109b99061212a565b8015610a065780601f106109db57610100808354040283529160200191610a06565b820191906000526020600020905b8154815290600101906020018083116109e957829003601f168201915b505050505081565b610a16610e5f565b6001600160a01b0316826001600160a01b03161415610a475760405162461bcd60e51b815260040161055090611c23565b8060056000610a54610e5f565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610a98610e5f565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610ad09190611aa9565b60405180910390a35050565b610aed610ae7610e5f565b83610ed1565b610b095760405162461bcd60e51b815260040161055090611ff1565b610b15848484846112c6565b50505050565b600a5490565b6060610b2c82610e42565b610b485760405162461bcd60e51b815260040161055090611e46565b60008281526006602052604081208054610b619061212a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8d9061212a565b8015610bda5780601f10610baf57610100808354040283529160200191610bda565b820191906000526020600020905b815481529060010190602001808311610bbd57829003601f168201915b505050505090506000610beb6112f9565b9050805160001415610bff57509050610492565b815115610c31578082604051602001610c19929190611954565b60405160208183030381529060405292505050610492565b610c3a8461130b565b949350505050565b60095490565b60095481565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610c84610e5f565b6001600160a01b0316610c956108e3565b6001600160a01b031614610cbb5760405162461bcd60e51b815260040161055090611ee3565b6001600160a01b038116610ce15760405162461bcd60e51b815260040161055090611b19565b6007546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b6000610d47610e5f565b6001600160a01b0316610d586108e3565b6001600160a01b031614610d7e5760405162461bcd60e51b815260040161055090611ee3565b6064600a5410610d8d57600080fd5b612710610d9a600861107b565b10610da457600080fd5b610dae600861107f565b6000610dba600861107b565b9050610dc684826111a3565b610dd08184611282565b7fe7cd4ce7f2a465edc730269a1305e8a48bad821e8fb7e152ec413829c01a53c4848285604051610e0393929190611a82565b60405180910390a1600a54610e1990600161209c565b600a559392505050565b600a5481565b6001600160e01b031981166301ffc9a760e01b14919050565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610e9882610773565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610edc82610e42565b610ef85760405162461bcd60e51b815260040161055090611c87565b6000610f0383610773565b9050806001600160a01b0316846001600160a01b03161480610f3e5750836001600160a01b0316610f3384610529565b6001600160a01b0316145b80610c3a5750610c3a8185610c4e565b826001600160a01b0316610f6182610773565b6001600160a01b031614610f875760405162461bcd60e51b815260040161055090611f18565b6001600160a01b038216610fad5760405162461bcd60e51b815260040161055090611bdf565b610fb8838383610608565b610fc3600082610e63565b6001600160a01b0383166000908152600360205260408120805460019290610fec9084906120e7565b90915550506001600160a01b038216600090815260036020526040812080546001929061101a90849061209c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b5490565b80546001019055565b6060816110ad57506040805180820190915260018152600360fc1b6020820152610492565b8160005b81156110d757806110c181612165565b91506110d09050600a836120b4565b91506110b1565b60008167ffffffffffffffff81111561110057634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561112a576020820181803683370190505b5090505b8415610c3a5761113f6001836120e7565b915061114c600a86612180565b61115790603061209c565b60f81b81838151811061117a57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061119c600a866120b4565b945061112e565b6001600160a01b0382166111c95760405162461bcd60e51b815260040161055090611e11565b6111d281610e42565b156111ef5760405162461bcd60e51b815260040161055090611b5f565b6111fb60008383610608565b6001600160a01b038216600090815260036020526040812080546001929061122490849061209c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b61128b82610e42565b6112a75760405162461bcd60e51b815260040161055090611dc3565b60008281526006602090815260409091208251610608928401906115c9565b6112d1848484610f4e565b6112dd8484848461138d565b610b155760405162461bcd60e51b815260040161055090611ac7565b60408051602081019091526000815290565b606061131682610e42565b6113325760405162461bcd60e51b815260040161055090611f61565b600061133c6112f9565b9050600081511161135c5760405180602001604052806000815250610751565b80611366846114a8565b604051602001611377929190611954565b6040516020818303038152906040529392505050565b60006113a1846001600160a01b03166115c3565b1561149d57836001600160a01b031663150b7a026113bd610e5f565b8786866040518563ffffffff1660e01b81526004016113df9493929190611a45565b602060405180830381600087803b1580156113f957600080fd5b505af1925050508015611429575060408051601f3d908101601f19168201909252611426918101906118c7565b60015b611483573d808015611457576040519150601f19603f3d011682016040523d82523d6000602084013e61145c565b606091505b50805161147b5760405162461bcd60e51b815260040161055090611ac7565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610c3a565b506001949350505050565b6060816114cd57506040805180820190915260018152600360fc1b6020820152610492565b8160005b81156114f757806114e181612165565b91506114f09050600a836120b4565b91506114d1565b60008167ffffffffffffffff81111561152057634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561154a576020820181803683370190505b5090505b8415610c3a5761155f6001836120e7565b915061156c600a86612180565b61157790603061209c565b60f81b81838151811061159a57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506115bc600a866120b4565b945061154e565b3b151590565b8280546115d59061212a565b90600052602060002090601f0160209004810192826115f7576000855561163d565b82601f1061161057805160ff191683800117855561163d565b8280016001018555821561163d579182015b8281111561163d578251825591602001919060010190611622565b5061164992915061164d565b5090565b5b80821115611649576000815560010161164e565b600067ffffffffffffffff8084111561167d5761167d6121c0565b604051601f8501601f1916810160200182811182821017156116a1576116a16121c0565b6040528481529150818385018610156116b957600080fd5b8484602083013760006020868301015250509392505050565b80356001600160a01b038116811461049257600080fd5b6000602082840312156116fa578081fd5b610751826116d2565b60008060408385031215611715578081fd5b61171e836116d2565b915061172c602084016116d2565b90509250929050565b600080600060608486031215611749578081fd5b611752846116d2565b9250611760602085016116d2565b9150604084013590509250925092565b60008060008060808587031215611785578081fd5b61178e856116d2565b935061179c602086016116d2565b925060408501359150606085013567ffffffffffffffff8111156117be578182fd5b8501601f810187136117ce578182fd5b6117dd87823560208401611662565b91505092959194509250565b600080604083850312156117fb578182fd5b611804836116d2565b915060208301358015158114611818578182fd5b809150509250929050565b60008060408385031215611835578182fd5b61183e836116d2565b9150602083013567ffffffffffffffff811115611859578182fd5b8301601f81018513611869578182fd5b61187885823560208401611662565b9150509250929050565b60008060408385031215611894578182fd5b61189d836116d2565b946020939093013593505050565b6000602082840312156118bc578081fd5b8135610751816121d6565b6000602082840312156118d8578081fd5b8151610751816121d6565b6000602082840312156118f4578081fd5b5035919050565b600081518084526119138160208601602086016120fe565b601f01601f19169290920160200192915050565b600081516119398185602086016120fe565b9290920192915050565b64173539b7b760d91b815260050190565b600083516119668184602088016120fe565b83519083019061197a8183602088016120fe565b01949350505050565b825460009081906002810460018083168061199f57607f831692505b60208084108214156119bf57634e487b7160e01b87526022600452602487fd5b8180156119d357600181146119e457611a10565b60ff19861689528489019650611a10565b6119ed8b612090565b885b86811015611a085781548b8201529085019083016119ef565b505084890196505b505050505050611a28611a238286611927565b611943565b95945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611a78908301846118fb565b9695505050505050565b600060018060a01b038516825283602083015260606040830152611a2860608301846118fb565b901515815260200190565b60006020825261075160208301846118fb565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526029908201527f4d6178696d756d20616d6f756e74206f66204d69736669747320616c726561646040820152683c9036b4b73a32b21760b91b606082015260800190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252601390820152722332b29034b9903737ba1031b7b93932b1ba1760691b604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252602e908201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60408201526d32bc34b9ba32b73a103a37b5b2b760911b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526031908201527f45524337323155524953746f726167653a2055524920717565727920666f72206040820152703737b732bc34b9ba32b73a103a37b5b2b760791b606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526025908201527f596f752063616e74206d696e74206d6f7265207468616e2032302061742061206040820152643a34b6b29760d91b606082015260800190565b90815260200190565b60009081526020902090565b600082198211156120af576120af612194565b500190565b6000826120c3576120c36121aa565b500490565b60008160001904831182151516156120e2576120e2612194565b500290565b6000828210156120f9576120f9612194565b500390565b60005b83811015612119578181015183820152602001612101565b83811115610b155750506000910152565b60028104600182168061213e57607f821691505b6020821081141561215f57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561217957612179612194565b5060010190565b60008261218f5761218f6121aa565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146108e057600080fdfea26469706673582212209874543b617ae710e1550ecb7fab75ec04b0218ecd088f55bb44a3489b76cbb064736f6c63430008000033697066733a2f2f516d62756d5a71346638316863324b7356574d4d4832416d527077376e537758334b42736a4142657761624e6e6a2f

Deployed Bytecode

0x6080604052600436106101665760003560e01c80639012c4a8116100d1578063c87b56dd1161008a578063e985e9c511610064578063e985e9c5146103da578063f2fde38b146103fa578063f9b8c3bd1461041a578063fe60d12c1461043a57610166565b8063c87b56dd14610390578063ced72f87146103b0578063ddca3f43146103c557610166565b80639012c4a8146102f157806395d89b41146103115780639abc832014610326578063a22cb4651461033b578063b88d4fde1461035b578063bc6258c91461037b57610166565b806342842e0e1161012357806342842e0e146102525780636352211e1461027257806370a0823114610292578063715018a6146102b2578063793cd71e146102c75780638da5cb5b146102dc57610166565b806301ffc9a71461016b57806306fdde03146101a1578063081812fc146101c3578063095ea7b3146101f057806323b872dd1461021257806340c10f1914610232575b600080fd5b34801561017757600080fd5b5061018b6101863660046118ab565b61044f565b6040516101989190611aa9565b60405180910390f35b3480156101ad57600080fd5b506101b6610497565b6040516101989190611ab4565b3480156101cf57600080fd5b506101e36101de3660046118e3565b610529565b6040516101989190611a31565b3480156101fc57600080fd5b5061021061020b366004611882565b610575565b005b34801561021e57600080fd5b5061021061022d366004611735565b61060d565b610245610240366004611882565b610645565b6040516101989190612087565b34801561025e57600080fd5b5061021061026d366004611735565b610758565b34801561027e57600080fd5b506101e361028d3660046118e3565b610773565b34801561029e57600080fd5b506102456102ad3660046116e9565b6107a8565b3480156102be57600080fd5b506102106107ec565b3480156102d357600080fd5b50610210610875565b3480156102e857600080fd5b506101e36108e3565b3480156102fd57600080fd5b5061021061030c3660046118e3565b6108f2565b34801561031d57600080fd5b506101b6610971565b34801561033257600080fd5b506101b6610980565b34801561034757600080fd5b506102106103563660046117e9565b610a0e565b34801561036757600080fd5b50610210610376366004611770565b610adc565b34801561038757600080fd5b50610245610b1b565b34801561039c57600080fd5b506101b66103ab3660046118e3565b610b21565b3480156103bc57600080fd5b50610245610c42565b3480156103d157600080fd5b50610245610c48565b3480156103e657600080fd5b5061018b6103f5366004611703565b610c4e565b34801561040657600080fd5b506102106104153660046116e9565b610c7c565b34801561042657600080fd5b50610245610435366004611823565b610d3d565b34801561044657600080fd5b50610245610e23565b60006001600160e01b031982166380ac58cd60e01b148061048057506001600160e01b03198216635b5e139f60e01b145b8061048f575061048f82610e29565b90505b919050565b6060600080546104a69061212a565b80601f01602080910402602001604051908101604052809291908181526020018280546104d29061212a565b801561051f5780601f106104f45761010080835404028352916020019161051f565b820191906000526020600020905b81548152906001019060200180831161050257829003601f168201915b5050505050905090565b600061053482610e42565b6105595760405162461bcd60e51b815260040161055090611e97565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061058082610773565b9050806001600160a01b0316836001600160a01b031614156105b45760405162461bcd60e51b815260040161055090611fb0565b806001600160a01b03166105c6610e5f565b6001600160a01b031614806105e257506105e2816103f5610e5f565b6105fe5760405162461bcd60e51b815260040161055090611cd3565b6106088383610e63565b505050565b61061e610618610e5f565b82610ed1565b61063a5760405162461bcd60e51b815260040161055090611ff1565b610608838383610f4e565b60006126ac82610655600861107b565b61065f919061209c565b111561067d5760405162461bcd60e51b815260040161055090611b96565b8160095461068b91906120c8565b3410156106aa5760405162461bcd60e51b815260040161055090611c5a565b60148211156106cb5760405162461bcd60e51b815260040161055090612042565b60005b82811015610746576106e0600861107f565b60006106ec600861107b565b90506000600b6106fb83611088565b60405160200161070c929190611983565b604051602081830303815290604052905061072786836111a3565b6107318282611282565b5050808061073e90612165565b9150506106ce565b50610751600861107b565b9392505050565b61060883838360405180602001604052806000815250610adc565b6000818152600260205260408120546001600160a01b03168061048f5760405162461bcd60e51b815260040161055090611d7a565b60006001600160a01b0382166107d05760405162461bcd60e51b815260040161055090611d30565b506001600160a01b031660009081526003602052604090205490565b6107f4610e5f565b6001600160a01b03166108056108e3565b6001600160a01b03161461082b5760405162461bcd60e51b815260040161055090611ee3565b6007546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600780546001600160a01b0319169055565b61087d610e5f565b6001600160a01b031661088e6108e3565b6001600160a01b0316146108b45760405162461bcd60e51b815260040161055090611ee3565b60405133904780156108fc02916000818181858888f193505050501580156108e0573d6000803e3d6000fd5b50565b6007546001600160a01b031690565b6108fa610e5f565b6001600160a01b031661090b6108e3565b6001600160a01b0316146109315760405162461bcd60e51b815260040161055090611ee3565b60098190556040517f66cbca4f3c64fecf1dcb9ce094abcf7f68c3450a1d4e3a8e917dd621edb4ebe090610966908390612087565b60405180910390a150565b6060600180546104a69061212a565b600b805461098d9061212a565b80601f01602080910402602001604051908101604052809291908181526020018280546109b99061212a565b8015610a065780601f106109db57610100808354040283529160200191610a06565b820191906000526020600020905b8154815290600101906020018083116109e957829003601f168201915b505050505081565b610a16610e5f565b6001600160a01b0316826001600160a01b03161415610a475760405162461bcd60e51b815260040161055090611c23565b8060056000610a54610e5f565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610a98610e5f565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610ad09190611aa9565b60405180910390a35050565b610aed610ae7610e5f565b83610ed1565b610b095760405162461bcd60e51b815260040161055090611ff1565b610b15848484846112c6565b50505050565b600a5490565b6060610b2c82610e42565b610b485760405162461bcd60e51b815260040161055090611e46565b60008281526006602052604081208054610b619061212a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8d9061212a565b8015610bda5780601f10610baf57610100808354040283529160200191610bda565b820191906000526020600020905b815481529060010190602001808311610bbd57829003601f168201915b505050505090506000610beb6112f9565b9050805160001415610bff57509050610492565b815115610c31578082604051602001610c19929190611954565b60405160208183030381529060405292505050610492565b610c3a8461130b565b949350505050565b60095490565b60095481565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610c84610e5f565b6001600160a01b0316610c956108e3565b6001600160a01b031614610cbb5760405162461bcd60e51b815260040161055090611ee3565b6001600160a01b038116610ce15760405162461bcd60e51b815260040161055090611b19565b6007546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b6000610d47610e5f565b6001600160a01b0316610d586108e3565b6001600160a01b031614610d7e5760405162461bcd60e51b815260040161055090611ee3565b6064600a5410610d8d57600080fd5b612710610d9a600861107b565b10610da457600080fd5b610dae600861107f565b6000610dba600861107b565b9050610dc684826111a3565b610dd08184611282565b7fe7cd4ce7f2a465edc730269a1305e8a48bad821e8fb7e152ec413829c01a53c4848285604051610e0393929190611a82565b60405180910390a1600a54610e1990600161209c565b600a559392505050565b600a5481565b6001600160e01b031981166301ffc9a760e01b14919050565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610e9882610773565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610edc82610e42565b610ef85760405162461bcd60e51b815260040161055090611c87565b6000610f0383610773565b9050806001600160a01b0316846001600160a01b03161480610f3e5750836001600160a01b0316610f3384610529565b6001600160a01b0316145b80610c3a5750610c3a8185610c4e565b826001600160a01b0316610f6182610773565b6001600160a01b031614610f875760405162461bcd60e51b815260040161055090611f18565b6001600160a01b038216610fad5760405162461bcd60e51b815260040161055090611bdf565b610fb8838383610608565b610fc3600082610e63565b6001600160a01b0383166000908152600360205260408120805460019290610fec9084906120e7565b90915550506001600160a01b038216600090815260036020526040812080546001929061101a90849061209c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b5490565b80546001019055565b6060816110ad57506040805180820190915260018152600360fc1b6020820152610492565b8160005b81156110d757806110c181612165565b91506110d09050600a836120b4565b91506110b1565b60008167ffffffffffffffff81111561110057634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561112a576020820181803683370190505b5090505b8415610c3a5761113f6001836120e7565b915061114c600a86612180565b61115790603061209c565b60f81b81838151811061117a57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061119c600a866120b4565b945061112e565b6001600160a01b0382166111c95760405162461bcd60e51b815260040161055090611e11565b6111d281610e42565b156111ef5760405162461bcd60e51b815260040161055090611b5f565b6111fb60008383610608565b6001600160a01b038216600090815260036020526040812080546001929061122490849061209c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b61128b82610e42565b6112a75760405162461bcd60e51b815260040161055090611dc3565b60008281526006602090815260409091208251610608928401906115c9565b6112d1848484610f4e565b6112dd8484848461138d565b610b155760405162461bcd60e51b815260040161055090611ac7565b60408051602081019091526000815290565b606061131682610e42565b6113325760405162461bcd60e51b815260040161055090611f61565b600061133c6112f9565b9050600081511161135c5760405180602001604052806000815250610751565b80611366846114a8565b604051602001611377929190611954565b6040516020818303038152906040529392505050565b60006113a1846001600160a01b03166115c3565b1561149d57836001600160a01b031663150b7a026113bd610e5f565b8786866040518563ffffffff1660e01b81526004016113df9493929190611a45565b602060405180830381600087803b1580156113f957600080fd5b505af1925050508015611429575060408051601f3d908101601f19168201909252611426918101906118c7565b60015b611483573d808015611457576040519150601f19603f3d011682016040523d82523d6000602084013e61145c565b606091505b50805161147b5760405162461bcd60e51b815260040161055090611ac7565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610c3a565b506001949350505050565b6060816114cd57506040805180820190915260018152600360fc1b6020820152610492565b8160005b81156114f757806114e181612165565b91506114f09050600a836120b4565b91506114d1565b60008167ffffffffffffffff81111561152057634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561154a576020820181803683370190505b5090505b8415610c3a5761155f6001836120e7565b915061156c600a86612180565b61157790603061209c565b60f81b81838151811061159a57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506115bc600a866120b4565b945061154e565b3b151590565b8280546115d59061212a565b90600052602060002090601f0160209004810192826115f7576000855561163d565b82601f1061161057805160ff191683800117855561163d565b8280016001018555821561163d579182015b8281111561163d578251825591602001919060010190611622565b5061164992915061164d565b5090565b5b80821115611649576000815560010161164e565b600067ffffffffffffffff8084111561167d5761167d6121c0565b604051601f8501601f1916810160200182811182821017156116a1576116a16121c0565b6040528481529150818385018610156116b957600080fd5b8484602083013760006020868301015250509392505050565b80356001600160a01b038116811461049257600080fd5b6000602082840312156116fa578081fd5b610751826116d2565b60008060408385031215611715578081fd5b61171e836116d2565b915061172c602084016116d2565b90509250929050565b600080600060608486031215611749578081fd5b611752846116d2565b9250611760602085016116d2565b9150604084013590509250925092565b60008060008060808587031215611785578081fd5b61178e856116d2565b935061179c602086016116d2565b925060408501359150606085013567ffffffffffffffff8111156117be578182fd5b8501601f810187136117ce578182fd5b6117dd87823560208401611662565b91505092959194509250565b600080604083850312156117fb578182fd5b611804836116d2565b915060208301358015158114611818578182fd5b809150509250929050565b60008060408385031215611835578182fd5b61183e836116d2565b9150602083013567ffffffffffffffff811115611859578182fd5b8301601f81018513611869578182fd5b61187885823560208401611662565b9150509250929050565b60008060408385031215611894578182fd5b61189d836116d2565b946020939093013593505050565b6000602082840312156118bc578081fd5b8135610751816121d6565b6000602082840312156118d8578081fd5b8151610751816121d6565b6000602082840312156118f4578081fd5b5035919050565b600081518084526119138160208601602086016120fe565b601f01601f19169290920160200192915050565b600081516119398185602086016120fe565b9290920192915050565b64173539b7b760d91b815260050190565b600083516119668184602088016120fe565b83519083019061197a8183602088016120fe565b01949350505050565b825460009081906002810460018083168061199f57607f831692505b60208084108214156119bf57634e487b7160e01b87526022600452602487fd5b8180156119d357600181146119e457611a10565b60ff19861689528489019650611a10565b6119ed8b612090565b885b86811015611a085781548b8201529085019083016119ef565b505084890196505b505050505050611a28611a238286611927565b611943565b95945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611a78908301846118fb565b9695505050505050565b600060018060a01b038516825283602083015260606040830152611a2860608301846118fb565b901515815260200190565b60006020825261075160208301846118fb565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526029908201527f4d6178696d756d20616d6f756e74206f66204d69736669747320616c726561646040820152683c9036b4b73a32b21760b91b606082015260800190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252601390820152722332b29034b9903737ba1031b7b93932b1ba1760691b604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252602e908201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60408201526d32bc34b9ba32b73a103a37b5b2b760911b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526031908201527f45524337323155524953746f726167653a2055524920717565727920666f72206040820152703737b732bc34b9ba32b73a103a37b5b2b760791b606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526025908201527f596f752063616e74206d696e74206d6f7265207468616e2032302061742061206040820152643a34b6b29760d91b606082015260800190565b90815260200190565b60009081526020902090565b600082198211156120af576120af612194565b500190565b6000826120c3576120c36121aa565b500490565b60008160001904831182151516156120e2576120e2612194565b500290565b6000828210156120f9576120f9612194565b500390565b60005b83811015612119578181015183820152602001612101565b83811115610b155750506000910152565b60028104600182168061213e57607f821691505b6020821081141561215f57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561217957612179612194565b5060010190565b60008261218f5761218f6121aa565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146108e057600080fdfea26469706673582212209874543b617ae710e1550ecb7fab75ec04b0218ecd088f55bb44a3489b76cbb064736f6c63430008000033

Deployed Bytecode Sourcemap

38148:3317:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20701:292;;;;;;;;;;-1:-1:-1;20701:292:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21633:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;23093:221::-;;;;;;;;;;-1:-1:-1;23093:221:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;22630:397::-;;;;;;;;;;-1:-1:-1;22630:397:0;;;;;:::i;:::-;;:::i;:::-;;23983:305;;;;;;;;;;-1:-1:-1;23983:305:0;;;;;:::i;:::-;;:::i;39544:900::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;24359:151::-;;;;;;;;;;-1:-1:-1;24359:151:0;;;;;:::i;:::-;;:::i;21327:239::-;;;;;;;;;;-1:-1:-1;21327:239:0;;;;;:::i;:::-;;:::i;21057:208::-;;;;;;;;;;-1:-1:-1;21057:208:0;;;;;:::i;:::-;;:::i;37507:148::-;;;;;;;;;;;;;:::i;41357:105::-;;;;;;;;;;;;;:::i;36856:87::-;;;;;;;;;;;;;:::i;41156:113::-;;;;;;;;;;-1:-1:-1;41156:113:0;;;;;:::i;:::-;;:::i;21802:104::-;;;;;;;;;;;;;:::i;38358:21::-;;;;;;;;;;;;;:::i;23386:295::-;;;;;;;;;;-1:-1:-1;23386:295:0;;;;;:::i;:::-;;:::i;24581:285::-;;;;;;;;;;-1:-1:-1;24581:285:0;;;;;:::i;:::-;;:::i;40452:90::-;;;;;;;;;;;;;:::i;32940:679::-;;;;;;;;;;-1:-1:-1;32940:679:0;;;;;:::i;:::-;;:::i;41277:72::-;;;;;;;;;;;;;:::i;38305:15::-;;;;;;;;;;;;;:::i;23752:164::-;;;;;;;;;;-1:-1:-1;23752:164:0;;;;;:::i;:::-;;:::i;37810:244::-;;;;;;;;;;-1:-1:-1;37810:244:0;;;;;:::i;:::-;;:::i;40550:598::-;;;;;;;;;;-1:-1:-1;40550:598:0;;;;;:::i;:::-;;:::i;38329:20::-;;;;;;;;;;;;;:::i;20701:292::-;20803:4;-1:-1:-1;;;;;;20827:40:0;;-1:-1:-1;;;20827:40:0;;:105;;-1:-1:-1;;;;;;;20884:48:0;;-1:-1:-1;;;20884:48:0;20827:105;:158;;;;20949:36;20973:11;20949:23;:36::i;:::-;20820:165;;20701:292;;;;:::o;21633:100::-;21687:13;21720:5;21713:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21633:100;:::o;23093:221::-;23169:7;23197:16;23205:7;23197;:16::i;:::-;23189:73;;;;-1:-1:-1;;;23189:73:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;23282:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23282:24:0;;23093:221::o;22630:397::-;22711:13;22727:23;22742:7;22727:14;:23::i;:::-;22711:39;;22775:5;-1:-1:-1;;;;;22769:11:0;:2;-1:-1:-1;;;;;22769:11:0;;;22761:57;;;;-1:-1:-1;;;22761:57:0;;;;;;;:::i;:::-;22855:5;-1:-1:-1;;;;;22839:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;22839:21:0;;:62;;;;22864:37;22881:5;22888:12;:10;:12::i;22864:37::-;22831:154;;;;-1:-1:-1;;;22831:154:0;;;;;;;:::i;:::-;22998:21;23007:2;23011:7;22998:8;:21::i;:::-;22630:397;;;:::o;23983:305::-;24144:41;24163:12;:10;:12::i;:::-;24177:7;24144:18;:41::i;:::-;24136:103;;;;-1:-1:-1;;;24136:103:0;;;;;;;:::i;:::-;24252:28;24262:4;24268:2;24272:7;24252:9;:28::i;39544:900::-;39636:7;39708:4;39691:13;39669:19;:9;:17;:19::i;:::-;:35;;;;:::i;:::-;:43;;39661:97;;;;-1:-1:-1;;;39661:97:0;;;;;;;:::i;:::-;39844:13;39838:3;;:19;;;;:::i;:::-;39825:9;:32;;39817:64;;;;-1:-1:-1;;;39817:64:0;;;;;;;:::i;:::-;39944:2;39927:13;:19;;39919:69;;;;-1:-1:-1;;;39919:69:0;;;;;;;:::i;:::-;40005:6;40001:397;40021:13;40017:1;:17;40001:397;;;40058:21;:9;:19;:21::i;:::-;40094:17;40114:19;:9;:17;:19::i;:::-;40094:39;;40148:22;40197:7;40206:19;40215:9;40206:8;:19::i;:::-;40180:56;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40148:89;;40252:24;40258:6;40266:9;40252:5;:24::i;:::-;40291:33;40304:9;40315:8;40291:12;:33::i;:::-;40001:397;;40036:3;;;;;:::i;:::-;;;;40001:397;;;;40417:19;:9;:17;:19::i;:::-;40410:26;39544:900;-1:-1:-1;;;39544:900:0:o;24359:151::-;24463:39;24480:4;24486:2;24490:7;24463:39;;;;;;;;;;;;:16;:39::i;21327:239::-;21399:7;21435:16;;;:7;:16;;;;;;-1:-1:-1;;;;;21435:16:0;21470:19;21462:73;;;;-1:-1:-1;;;21462:73:0;;;;;;;:::i;21057:208::-;21129:7;-1:-1:-1;;;;;21157:19:0;;21149:74;;;;-1:-1:-1;;;21149:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;21241:16:0;;;;;:9;:16;;;;;;;21057:208::o;37507:148::-;37087:12;:10;:12::i;:::-;-1:-1:-1;;;;;37076:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;37076:23:0;;37068:68;;;;-1:-1:-1;;;37068:68:0;;;;;;;:::i;:::-;37598:6:::1;::::0;37577:40:::1;::::0;37614:1:::1;::::0;-1:-1:-1;;;;;37598:6:0::1;::::0;37577:40:::1;::::0;37614:1;;37577:40:::1;37628:6;:19:::0;;-1:-1:-1;;;;;;37628:19:0::1;::::0;;37507:148::o;41357:105::-;37087:12;:10;:12::i;:::-;-1:-1:-1;;;;;37076:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;37076:23:0;;37068:68;;;;-1:-1:-1;;;37068:68:0;;;;;;;:::i;:::-;41403:51:::1;::::0;41411:10:::1;::::0;41432:21:::1;41403:51:::0;::::1;;;::::0;::::1;::::0;;;41432:21;41411:10;41403:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;41357:105::o:0;36856:87::-;36929:6;;-1:-1:-1;;;;;36929:6:0;36856:87;:::o;41156:113::-;37087:12;:10;:12::i;:::-;-1:-1:-1;;;;;37076:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;37076:23:0;;37068:68;;;;-1:-1:-1;;;37068:68:0;;;;;;;:::i;:::-;41213:3:::1;:12:::0;;;41241:20:::1;::::0;::::1;::::0;::::1;::::0;41219:6;;41241:20:::1;:::i;:::-;;;;;;;;41156:113:::0;:::o;21802:104::-;21858:13;21891:7;21884:14;;;;;:::i;38358:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23386:295::-;23501:12;:10;:12::i;:::-;-1:-1:-1;;;;;23489:24:0;:8;-1:-1:-1;;;;;23489:24:0;;;23481:62;;;;-1:-1:-1;;;23481:62:0;;;;;;;:::i;:::-;23601:8;23556:18;:32;23575:12;:10;:12::i;:::-;-1:-1:-1;;;;;23556:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;23556:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;23556:53:0;;;;;;;;;;;23640:12;:10;:12::i;:::-;-1:-1:-1;;;;;23625:48:0;;23664:8;23625:48;;;;;;:::i;:::-;;;;;;;;23386:295;;:::o;24581:285::-;24713:41;24732:12;:10;:12::i;:::-;24746:7;24713:18;:41::i;:::-;24705:103;;;;-1:-1:-1;;;24705:103:0;;;;;;;:::i;:::-;24819:39;24833:4;24839:2;24843:7;24852:5;24819:13;:39::i;:::-;24581:285;;;;:::o;40452:90::-;40526:8;;40452:90;:::o;32940:679::-;33013:13;33047:16;33055:7;33047;:16::i;:::-;33039:78;;;;-1:-1:-1;;;33039:78:0;;;;;;;:::i;:::-;33130:23;33156:19;;;:10;:19;;;;;33130:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33186:18;33207:10;:8;:10::i;:::-;33186:31;;33299:4;33293:18;33315:1;33293:23;33289:72;;;-1:-1:-1;33340:9:0;-1:-1:-1;33333:16:0;;33289:72;33465:23;;:27;33461:108;;33540:4;33546:9;33523:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33509:48;;;;;;33461:108;33588:23;33603:7;33588:14;:23::i;:::-;33581:30;32940:679;-1:-1:-1;;;;32940:679:0:o;41277:72::-;41338:3;;41277:72;:::o;38305:15::-;;;;:::o;23752:164::-;-1:-1:-1;;;;;23873:25:0;;;23849:4;23873:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23752:164::o;37810:244::-;37087:12;:10;:12::i;:::-;-1:-1:-1;;;;;37076:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;37076:23:0;;37068:68;;;;-1:-1:-1;;;37068:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37899:22:0;::::1;37891:73;;;;-1:-1:-1::0;;;37891:73:0::1;;;;;;;:::i;:::-;38001:6;::::0;37980:38:::1;::::0;-1:-1:-1;;;;;37980:38:0;;::::1;::::0;38001:6:::1;::::0;37980:38:::1;::::0;38001:6:::1;::::0;37980:38:::1;38029:6;:17:::0;;-1:-1:-1;;;;;;38029:17:0::1;-1:-1:-1::0;;;;;38029:17:0;;;::::1;::::0;;;::::1;::::0;;37810:244::o;40550:598::-;40653:7;37087:12;:10;:12::i;:::-;-1:-1:-1;;;;;37076:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;37076:23:0;;37068:68;;;;-1:-1:-1;;;37068:68:0;;;;;;;:::i;:::-;40697:3:::1;40686:8;;:14;40678:23;;;::::0;::::1;;40819:5;40797:19;:9;:17;:19::i;:::-;:27;40789:36;;;::::0;::::1;;40870:21;:9;:19;:21::i;:::-;40904:17;40924:19;:9;:17;:19::i;:::-;40904:39;;40954:24;40960:6;40968:9;40954:5;:24::i;:::-;40989:33;41002:9;41013:8;40989:12;:33::i;:::-;41040:35;41047:6;41055:9;41066:8;41040:35;;;;;;;;:::i;:::-;;;;;;;;41099:8;::::0;:12:::1;::::0;41110:1:::1;41099:12;:::i;:::-;41088:8;:23:::0;41131:9;40550:598;-1:-1:-1;;;40550:598:0:o;38329:20::-;;;;:::o;19195:157::-;-1:-1:-1;;;;;;19304:40:0;;-1:-1:-1;;;19304:40:0;19195:157;;;:::o;26333:127::-;26398:4;26422:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26422:16:0;:30;;;26333:127::o;15975:98::-;16055:10;15975:98;:::o;30210:174::-;30285:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;30285:29:0;-1:-1:-1;;;;;30285:29:0;;;;;;;;:24;;30339:23;30285:24;30339:14;:23::i;:::-;-1:-1:-1;;;;;30330:46:0;;;;;;;;;;;30210:174;;:::o;26627:348::-;26720:4;26745:16;26753:7;26745;:16::i;:::-;26737:73;;;;-1:-1:-1;;;26737:73:0;;;;;;;:::i;:::-;26821:13;26837:23;26852:7;26837:14;:23::i;:::-;26821:39;;26890:5;-1:-1:-1;;;;;26879:16:0;:7;-1:-1:-1;;;;;26879:16:0;;:51;;;;26923:7;-1:-1:-1;;;;;26899:31:0;:20;26911:7;26899:11;:20::i;:::-;-1:-1:-1;;;;;26899:31:0;;26879:51;:87;;;;26934:32;26951:5;26958:7;26934:16;:32::i;29548:544::-;29673:4;-1:-1:-1;;;;;29646:31:0;:23;29661:7;29646:14;:23::i;:::-;-1:-1:-1;;;;;29646:31:0;;29638:85;;;;-1:-1:-1;;;29638:85:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29742:16:0;;29734:65;;;;-1:-1:-1;;;29734:65:0;;;;;;;:::i;:::-;29812:39;29833:4;29839:2;29843:7;29812:20;:39::i;:::-;29916:29;29933:1;29937:7;29916:8;:29::i;:::-;-1:-1:-1;;;;;29958:15:0;;;;;;:9;:15;;;;;:20;;29977:1;;29958:15;:20;;29977:1;;29958:20;:::i;:::-;;;;-1:-1:-1;;;;;;;29989:13:0;;;;;;:9;:13;;;;;:18;;30006:1;;29989:13;:18;;30006:1;;29989:18;:::i;:::-;;;;-1:-1:-1;;30018:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30018:21:0;-1:-1:-1;;;;;30018:21:0;;;;;;;;;30057:27;;30018:16;;30057:27;;;;;;;29548:544;;;:::o;35257:114::-;35349:14;;35257:114::o;35379:127::-;35468:19;;35486:1;35468:19;;;35379:127::o;38777:723::-;38833:13;39054:10;39050:53;;-1:-1:-1;39081:10:0;;;;;;;;;;;;-1:-1:-1;;;39081:10:0;;;;;;39050:53;39128:5;39113:12;39169:78;39176:9;;39169:78;;39202:8;;;;:::i;:::-;;-1:-1:-1;39225:10:0;;-1:-1:-1;39233:2:0;39225:10;;:::i;:::-;;;39169:78;;;39257:19;39289:6;39279:17;;;;;;-1:-1:-1;;;39279:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39279:17:0;;39257:39;;39307:154;39314:10;;39307:154;;39341:11;39351:1;39341:11;;:::i;:::-;;-1:-1:-1;39410:10:0;39418:2;39410:5;:10;:::i;:::-;39397:24;;:2;:24;:::i;:::-;39384:39;;39367:6;39374;39367:14;;;;;;-1:-1:-1;;;39367:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;39367:56:0;;;;;;;;-1:-1:-1;39438:11:0;39447:2;39438:11;;:::i;:::-;;;39307:154;;28240:382;-1:-1:-1;;;;;28320:16:0;;28312:61;;;;-1:-1:-1;;;28312:61:0;;;;;;;:::i;:::-;28393:16;28401:7;28393;:16::i;:::-;28392:17;28384:58;;;;-1:-1:-1;;;28384:58:0;;;;;;;:::i;:::-;28455:45;28484:1;28488:2;28492:7;28455:20;:45::i;:::-;-1:-1:-1;;;;;28513:13:0;;;;;;:9;:13;;;;;:18;;28530:1;;28513:13;:18;;28530:1;;28513:18;:::i;:::-;;;;-1:-1:-1;;28542:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28542:21:0;-1:-1:-1;;;;;28542:21:0;;;;;;;;28581:33;;28542:16;;;28581:33;;28542:16;;28581:33;28240:382;;:::o;33775:217::-;33875:16;33883:7;33875;:16::i;:::-;33867:75;;;;-1:-1:-1;;;33867:75:0;;;;;;;:::i;:::-;33953:19;;;;:10;:19;;;;;;;;:31;;;;;;;;:::i;25748:272::-;25862:28;25872:4;25878:2;25882:7;25862:9;:28::i;:::-;25909:48;25932:4;25938:2;25942:7;25951:5;25909:22;:48::i;:::-;25901:111;;;;-1:-1:-1;;;25901:111:0;;;;;;;:::i;22474:94::-;22551:9;;;;;;;;;-1:-1:-1;22551:9:0;;22474:94;:::o;21977:360::-;22050:13;22084:16;22092:7;22084;:16::i;:::-;22076:76;;;;-1:-1:-1;;;22076:76:0;;;;;;;:::i;:::-;22165:21;22189:10;:8;:10::i;:::-;22165:34;;22241:1;22223:7;22217:21;:25;:112;;;;;;;;;;;;;;;;;22282:7;22291:18;:7;:16;:18::i;:::-;22265:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22210:119;21977:360;-1:-1:-1;;;21977:360:0:o;30949:843::-;31070:4;31096:15;:2;-1:-1:-1;;;;;31096:13:0;;:15::i;:::-;31092:693;;;31148:2;-1:-1:-1;;;;;31132:36:0;;31169:12;:10;:12::i;:::-;31183:4;31189:7;31198:5;31132:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31132:72:0;;;;;;;;-1:-1:-1;;31132:72:0;;;;;;;;;;;;:::i;:::-;;;31128:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31378:13:0;;31374:341;;31421:60;;-1:-1:-1;;;31421:60:0;;;;;;;:::i;31374:341::-;31665:6;31659:13;31650:6;31646:2;31642:15;31635:38;31128:602;-1:-1:-1;;;;;;31255:55:0;-1:-1:-1;;;31255:55:0;;-1:-1:-1;31248:62:0;;31092:693;-1:-1:-1;31769:4:0;30949:843;;;;;;:::o;16636:723::-;16692:13;16913:10;16909:53;;-1:-1:-1;16940:10:0;;;;;;;;;;;;-1:-1:-1;;;16940:10:0;;;;;;16909:53;16987:5;16972:12;17028:78;17035:9;;17028:78;;17061:8;;;;:::i;:::-;;-1:-1:-1;17084:10:0;;-1:-1:-1;17092:2:0;17084:10;;:::i;:::-;;;17028:78;;;17116:19;17148:6;17138:17;;;;;;-1:-1:-1;;;17138:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17138:17:0;;17116:39;;17166:154;17173:10;;17166:154;;17200:11;17210:1;17200:11;;:::i;:::-;;-1:-1:-1;17269:10:0;17277:2;17269:5;:10;:::i;:::-;17256:24;;:2;:24;:::i;:::-;17243:39;;17226:6;17233;17226:14;;;;;;-1:-1:-1;;;17226:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;17226:56:0;;;;;;;;-1:-1:-1;17297:11:0;17306:2;17297:11;;:::i;:::-;;;17166:154;;8086:422;8453:20;8492:8;;;8086:422::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:607:1;;110:18;151:2;143:6;140:14;137:2;;;157:18;;:::i;:::-;206:2;200:9;279:2;256:17;;-1:-1:-1;;252:31:1;240:44;;286:4;236:55;306:18;;;326:22;;;303:46;300:2;;;352:18;;:::i;:::-;388:2;381:22;436;;;421:6;-1:-1:-1;421:6:1;473:16;;;470:25;-1:-1:-1;467:2:1;;;508:1;505;498:12;467:2;558:6;553:3;546:4;538:6;534:17;521:44;613:1;606:4;597:6;589;585:19;581:30;574:41;;;90:531;;;;;:::o;626:175::-;696:20;;-1:-1:-1;;;;;745:31:1;;735:42;;725:2;;791:1;788;781:12;806:198;;918:2;906:9;897:7;893:23;889:32;886:2;;;939:6;931;924:22;886:2;967:31;988:9;967:31;:::i;1009:274::-;;;1138:2;1126:9;1117:7;1113:23;1109:32;1106:2;;;1159:6;1151;1144:22;1106:2;1187:31;1208:9;1187:31;:::i;:::-;1177:41;;1237:40;1273:2;1262:9;1258:18;1237:40;:::i;:::-;1227:50;;1096:187;;;;;:::o;1288:342::-;;;;1434:2;1422:9;1413:7;1409:23;1405:32;1402:2;;;1455:6;1447;1440:22;1402:2;1483:31;1504:9;1483:31;:::i;:::-;1473:41;;1533:40;1569:2;1558:9;1554:18;1533:40;:::i;:::-;1523:50;;1620:2;1609:9;1605:18;1592:32;1582:42;;1392:238;;;;;:::o;1635:702::-;;;;;1807:3;1795:9;1786:7;1782:23;1778:33;1775:2;;;1829:6;1821;1814:22;1775:2;1857:31;1878:9;1857:31;:::i;:::-;1847:41;;1907:40;1943:2;1932:9;1928:18;1907:40;:::i;:::-;1897:50;;1994:2;1983:9;1979:18;1966:32;1956:42;;2049:2;2038:9;2034:18;2021:32;2076:18;2068:6;2065:30;2062:2;;;2113:6;2105;2098:22;2062:2;2141:22;;2194:4;2186:13;;2182:27;-1:-1:-1;2172:2:1;;2228:6;2220;2213:22;2172:2;2256:75;2323:7;2318:2;2305:16;2300:2;2296;2292:11;2256:75;:::i;:::-;2246:85;;;1765:572;;;;;;;:::o;2342:369::-;;;2468:2;2456:9;2447:7;2443:23;2439:32;2436:2;;;2489:6;2481;2474:22;2436:2;2517:31;2538:9;2517:31;:::i;:::-;2507:41;;2598:2;2587:9;2583:18;2570:32;2645:5;2638:13;2631:21;2624:5;2621:32;2611:2;;2672:6;2664;2657:22;2611:2;2700:5;2690:15;;;2426:285;;;;;:::o;2716:558::-;;;2855:2;2843:9;2834:7;2830:23;2826:32;2823:2;;;2876:6;2868;2861:22;2823:2;2904:31;2925:9;2904:31;:::i;:::-;2894:41;;2986:2;2975:9;2971:18;2958:32;3013:18;3005:6;3002:30;2999:2;;;3050:6;3042;3035:22;2999:2;3078:22;;3131:4;3123:13;;3119:27;-1:-1:-1;3109:2:1;;3165:6;3157;3150:22;3109:2;3193:75;3260:7;3255:2;3242:16;3237:2;3233;3229:11;3193:75;:::i;:::-;3183:85;;;2813:461;;;;;:::o;3279:266::-;;;3408:2;3396:9;3387:7;3383:23;3379:32;3376:2;;;3429:6;3421;3414:22;3376:2;3457:31;3478:9;3457:31;:::i;:::-;3447:41;3535:2;3520:18;;;;3507:32;;-1:-1:-1;;;3366:179:1:o;3550:257::-;;3661:2;3649:9;3640:7;3636:23;3632:32;3629:2;;;3682:6;3674;3667:22;3629:2;3726:9;3713:23;3745:32;3771:5;3745:32;:::i;3812:261::-;;3934:2;3922:9;3913:7;3909:23;3905:32;3902:2;;;3955:6;3947;3940:22;3902:2;3992:9;3986:16;4011:32;4037:5;4011:32;:::i;4078:190::-;;4190:2;4178:9;4169:7;4165:23;4161:32;4158:2;;;4211:6;4203;4196:22;4158:2;-1:-1:-1;4239:23:1;;4148:120;-1:-1:-1;4148:120:1:o;4273:259::-;;4354:5;4348:12;4381:6;4376:3;4369:19;4397:63;4453:6;4446:4;4441:3;4437:14;4430:4;4423:5;4419:16;4397:63;:::i;:::-;4514:2;4493:15;-1:-1:-1;;4489:29:1;4480:39;;;;4521:4;4476:50;;4324:208;-1:-1:-1;;4324:208:1:o;4537:187::-;;4619:5;4613:12;4634:52;4679:6;4674:3;4667:4;4660:5;4656:16;4634:52;:::i;:::-;4702:16;;;;;4589:135;-1:-1:-1;;4589:135:1:o;4729:120::-;-1:-1:-1;;;4796:20:1;;4841:1;4832:11;;4786:63::o;4854:470::-;;5071:6;5065:13;5087:53;5133:6;5128:3;5121:4;5113:6;5109:17;5087:53;:::i;:::-;5203:13;;5162:16;;;;5225:57;5203:13;5162:16;5259:4;5247:17;;5225:57;:::i;:::-;5298:20;;5041:283;-1:-1:-1;;;;5041:283:1:o;5329:1315::-;5664:13;;5329:1315;;;;5737:1;5722:17;;5758:1;5794:18;;;;5821:2;;5875:4;5867:6;5863:17;5853:27;;5821:2;5901;5949;5941:6;5938:14;5918:18;5915:38;5912:2;;;-1:-1:-1;;;5976:33:1;;6032:4;6029:1;6022:15;6062:4;5983:3;6050:17;5912:2;6093:18;6120:104;;;;6238:1;6233:324;;;;6086:471;;6120:104;-1:-1:-1;;6153:24:1;;6141:37;;6198:16;;;;-1:-1:-1;6120:104:1;;6233:324;6269:39;6301:6;6269:39;:::i;:::-;6330:3;6346:165;6360:6;6357:1;6354:13;6346:165;;;6438:14;;6425:11;;;6418:35;6481:16;;;;6375:10;;6346:165;;;6350:3;;6540:6;6535:3;6531:16;6524:23;;6086:471;;;;;;;6573:65;6605:32;6633:3;6625:6;6605:32;:::i;:::-;6573:65;:::i;:::-;6566:72;5614:1030;-1:-1:-1;;;;;5614:1030:1:o;6649:203::-;-1:-1:-1;;;;;6813:32:1;;;;6795:51;;6783:2;6768:18;;6750:102::o;6857:490::-;-1:-1:-1;;;;;7126:15:1;;;7108:34;;7178:15;;7173:2;7158:18;;7151:43;7225:2;7210:18;;7203:34;;;7273:3;7268:2;7253:18;;7246:31;;;6857:490;;7294:47;;7321:19;;7313:6;7294:47;:::i;:::-;7286:55;7060:287;-1:-1:-1;;;;;;7060:287:1:o;7352:389::-;;7586:1;7582;7577:3;7573:11;7569:19;7561:6;7557:32;7546:9;7539:51;7626:6;7621:2;7610:9;7606:18;7599:34;7669:2;7664;7653:9;7649:18;7642:30;7689:46;7731:2;7720:9;7716:18;7708:6;7689:46;:::i;7746:187::-;7911:14;;7904:22;7886:41;;7874:2;7859:18;;7841:92::o;7938:221::-;;8087:2;8076:9;8069:21;8107:46;8149:2;8138:9;8134:18;8126:6;8107:46;:::i;8164:414::-;8366:2;8348:21;;;8405:2;8385:18;;;8378:30;8444:34;8439:2;8424:18;;8417:62;-1:-1:-1;;;8510:2:1;8495:18;;8488:48;8568:3;8553:19;;8338:240::o;8583:402::-;8785:2;8767:21;;;8824:2;8804:18;;;8797:30;8863:34;8858:2;8843:18;;8836:62;-1:-1:-1;;;8929:2:1;8914:18;;8907:36;8975:3;8960:19;;8757:228::o;8990:352::-;9192:2;9174:21;;;9231:2;9211:18;;;9204:30;9270;9265:2;9250:18;;9243:58;9333:2;9318:18;;9164:178::o;9347:405::-;9549:2;9531:21;;;9588:2;9568:18;;;9561:30;9627:34;9622:2;9607:18;;9600:62;-1:-1:-1;;;9693:2:1;9678:18;;9671:39;9742:3;9727:19;;9521:231::o;9757:400::-;9959:2;9941:21;;;9998:2;9978:18;;;9971:30;10037:34;10032:2;10017:18;;10010:62;-1:-1:-1;;;10103:2:1;10088:18;;10081:34;10147:3;10132:19;;9931:226::o;10162:349::-;10364:2;10346:21;;;10403:2;10383:18;;;10376:30;10442:27;10437:2;10422:18;;10415:55;10502:2;10487:18;;10336:175::o;10516:343::-;10718:2;10700:21;;;10757:2;10737:18;;;10730:30;-1:-1:-1;;;10791:2:1;10776:18;;10769:49;10850:2;10835:18;;10690:169::o;10864:408::-;11066:2;11048:21;;;11105:2;11085:18;;;11078:30;11144:34;11139:2;11124:18;;11117:62;-1:-1:-1;;;11210:2:1;11195:18;;11188:42;11262:3;11247:19;;11038:234::o;11277:420::-;11479:2;11461:21;;;11518:2;11498:18;;;11491:30;11557:34;11552:2;11537:18;;11530:62;11628:26;11623:2;11608:18;;11601:54;11687:3;11672:19;;11451:246::o;11702:406::-;11904:2;11886:21;;;11943:2;11923:18;;;11916:30;11982:34;11977:2;11962:18;;11955:62;-1:-1:-1;;;12048:2:1;12033:18;;12026:40;12098:3;12083:19;;11876:232::o;12113:405::-;12315:2;12297:21;;;12354:2;12334:18;;;12327:30;12393:34;12388:2;12373:18;;12366:62;-1:-1:-1;;;12459:2:1;12444:18;;12437:39;12508:3;12493:19;;12287:231::o;12523:410::-;12725:2;12707:21;;;12764:2;12744:18;;;12737:30;12803:34;12798:2;12783:18;;12776:62;-1:-1:-1;;;12869:2:1;12854:18;;12847:44;12923:3;12908:19;;12697:236::o;12938:356::-;13140:2;13122:21;;;13159:18;;;13152:30;13218:34;13213:2;13198:18;;13191:62;13285:2;13270:18;;13112:182::o;13299:413::-;13501:2;13483:21;;;13540:2;13520:18;;;13513:30;13579:34;13574:2;13559:18;;13552:62;-1:-1:-1;;;13645:2:1;13630:18;;13623:47;13702:3;13687:19;;13473:239::o;13717:408::-;13919:2;13901:21;;;13958:2;13938:18;;;13931:30;13997:34;13992:2;13977:18;;13970:62;-1:-1:-1;;;14063:2:1;14048:18;;14041:42;14115:3;14100:19;;13891:234::o;14130:356::-;14332:2;14314:21;;;14351:18;;;14344:30;14410:34;14405:2;14390:18;;14383:62;14477:2;14462:18;;14304:182::o;14491:405::-;14693:2;14675:21;;;14732:2;14712:18;;;14705:30;14771:34;14766:2;14751:18;;14744:62;-1:-1:-1;;;14837:2:1;14822:18;;14815:39;14886:3;14871:19;;14665:231::o;14901:411::-;15103:2;15085:21;;;15142:2;15122:18;;;15115:30;15181:34;15176:2;15161:18;;15154:62;-1:-1:-1;;;15247:2:1;15232:18;;15225:45;15302:3;15287:19;;15075:237::o;15317:397::-;15519:2;15501:21;;;15558:2;15538:18;;;15531:30;15597:34;15592:2;15577:18;;15570:62;-1:-1:-1;;;15663:2:1;15648:18;;15641:31;15704:3;15689:19;;15491:223::o;15719:413::-;15921:2;15903:21;;;15960:2;15940:18;;;15933:30;15999:34;15994:2;15979:18;;15972:62;-1:-1:-1;;;16065:2:1;16050:18;;16043:47;16122:3;16107:19;;15893:239::o;16137:401::-;16339:2;16321:21;;;16378:2;16358:18;;;16351:30;16417:34;16412:2;16397:18;;16390:62;-1:-1:-1;;;16483:2:1;16468:18;;16461:35;16528:3;16513:19;;16311:227::o;16543:177::-;16689:25;;;16677:2;16662:18;;16644:76::o;16725:129::-;;16793:17;;;16843:4;16827:21;;;16783:71::o;16859:128::-;;16930:1;16926:6;16923:1;16920:13;16917:2;;;16936:18;;:::i;:::-;-1:-1:-1;16972:9:1;;16907:80::o;16992:120::-;;17058:1;17048:2;;17063:18;;:::i;:::-;-1:-1:-1;17097:9:1;;17038:74::o;17117:168::-;;17223:1;17219;17215:6;17211:14;17208:1;17205:21;17200:1;17193:9;17186:17;17182:45;17179:2;;;17230:18;;:::i;:::-;-1:-1:-1;17270:9:1;;17169:116::o;17290:125::-;;17358:1;17355;17352:8;17349:2;;;17363:18;;:::i;:::-;-1:-1:-1;17400:9:1;;17339:76::o;17420:258::-;17492:1;17502:113;17516:6;17513:1;17510:13;17502:113;;;17592:11;;;17586:18;17573:11;;;17566:39;17538:2;17531:10;17502:113;;;17633:6;17630:1;17627:13;17624:2;;;-1:-1:-1;;17668:1:1;17650:16;;17643:27;17473:205::o;17683:380::-;17768:1;17758:12;;17815:1;17805:12;;;17826:2;;17880:4;17872:6;17868:17;17858:27;;17826:2;17933;17925:6;17922:14;17902:18;17899:38;17896:2;;;17979:10;17974:3;17970:20;17967:1;17960:31;18014:4;18011:1;18004:15;18042:4;18039:1;18032:15;17896:2;;17738:325;;;:::o;18068:135::-;;-1:-1:-1;;18128:17:1;;18125:2;;;18148:18;;:::i;:::-;-1:-1:-1;18195:1:1;18184:13;;18115:88::o;18208:112::-;;18266:1;18256:2;;18271:18;;:::i;:::-;-1:-1:-1;18305:9:1;;18246:74::o;18325:127::-;18386:10;18381:3;18377:20;18374:1;18367:31;18417:4;18414:1;18407:15;18441:4;18438:1;18431:15;18457:127;18518:10;18513:3;18509:20;18506:1;18499:31;18549:4;18546:1;18539:15;18573:4;18570:1;18563:15;18589:127;18650:10;18645:3;18641:20;18638:1;18631:31;18681:4;18678:1;18671:15;18705:4;18702:1;18695:15;18721:133;-1:-1:-1;;;;;;18797:32:1;;18787:43;;18777:2;;18844:1;18841;18834:12

Swarm Source

ipfs://9874543b617ae710e1550ecb7fab75ec04b0218ecd088f55bb44a3489b76cbb0
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.