Token AnimalsByXY

 

Overview ERC-721

Total Supply:
258 ANXY

Holders:
250 addresses
 
Balance
1 ANXY
0x86d6f9079dd02fc0f11d463720ad04ae9cf190e2
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

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

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0xa865d651ec9cdb7107e509be8b44373bd77d39c6

Contract Name:
MinteriumUser

Compiler Version
v0.8.4+commit.c7e474f2

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-09
*/

// Sources flattened with hardhat v2.3.0 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;

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

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

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

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


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


pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @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/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 @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 contracts/MyERC721.sol


pragma solidity ^0.8.0;





contract MinteriumUser is ERC721, ERC721Enumerable, ERC721URIStorage, Ownable {
    using Counters for Counters.Counter;

    Counters.Counter private _tokenIdCounter;

    constructor(string memory _name, string memory _symbol) ERC721(_name, _symbol) {}

    function safeMint(address to, string memory tokenURI) public onlyOwner returns(uint256 tokenId) {
        _tokenIdCounter.increment();
        uint256 _current = _tokenIdCounter.current();
        _safeMint(to, _current);
        _setTokenURI(_current, tokenURI);
        return _current;
    }

    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }

    function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) {
        return super.tokenURI(tokenId);
    }

    function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) {
        return super.supportsInterface(interfaceId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"tokenURI","type":"string"}],"name":"safeMint","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040516200207a3803806200207a83398101604081905262000034916200022b565b8151829082906200004d906000906020850190620000d2565b50805162000063906001906020840190620000d2565b505050600062000078620000ce60201b60201c565b600b80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3505050620002e5565b3390565b828054620000e09062000292565b90600052602060002090601f0160209004810192826200010457600085556200014f565b82601f106200011f57805160ff19168380011785556200014f565b828001600101855582156200014f579182015b828111156200014f57825182559160200191906001019062000132565b506200015d92915062000161565b5090565b5b808211156200015d576000815560010162000162565b600082601f83011262000189578081fd5b81516001600160401b0380821115620001a657620001a6620002cf565b604051601f8301601f19908116603f01168101908282118183101715620001d157620001d1620002cf565b81604052838152602092508683858801011115620001ed578485fd5b8491505b83821015620002105785820183015181830184015290820190620001f1565b838211156200022157848385830101525b9695505050505050565b600080604083850312156200023e578182fd5b82516001600160401b038082111562000255578384fd5b620002638683870162000178565b9350602085015191508082111562000279578283fd5b50620002888582860162000178565b9150509250929050565b600181811c90821680620002a757607f821691505b60208210811415620002c957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b611d8580620002f56000396000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c806370a08231116100ad578063b88d4fde11610071578063b88d4fde14610266578063c87b56dd14610279578063d204c45e1461028c578063e985e9c51461029f578063f2fde38b146102db57600080fd5b806370a082311461021f578063715018a6146102325780638da5cb5b1461023a57806395d89b411461024b578063a22cb4651461025357600080fd5b806323b872dd116100f457806323b872dd146101c05780632f745c59146101d357806342842e0e146101e65780634f6ccce7146101f95780636352211e1461020c57600080fd5b806301ffc9a71461013157806306fdde0314610159578063081812fc1461016e578063095ea7b31461019957806318160ddd146101ae575b600080fd5b61014461013f366004611a48565b6102ee565b60405190151581526020015b60405180910390f35b6101616102ff565b6040516101509190611b30565b61018161017c366004611a80565b610391565b6040516001600160a01b039091168152602001610150565b6101ac6101a7366004611a1f565b61041e565b005b6008545b604051908152602001610150565b6101ac6101ce3660046118d2565b610534565b6101b26101e1366004611a1f565b610565565b6101ac6101f43660046118d2565b6105fb565b6101b2610207366004611a80565b610616565b61018161021a366004611a80565b6106b7565b6101b261022d366004611886565b61072e565b6101ac6107b5565b600b546001600160a01b0316610181565b610161610829565b6101ac610261366004611986565b610838565b6101ac61027436600461190d565b6108fd565b610161610287366004611a80565b610935565b6101b261029a3660046119c0565b610940565b6101446102ad3660046118a0565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6101ac6102e9366004611886565b6109a3565b60006102f982610a8e565b92915050565b60606000805461030e90611c8a565b80601f016020809104026020016040519081016040528092919081815260200182805461033a90611c8a565b80156103875780601f1061035c57610100808354040283529160200191610387565b820191906000526020600020905b81548152906001019060200180831161036a57829003601f168201915b5050505050905090565b600061039c82610ab3565b6104025760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610429826106b7565b9050806001600160a01b0316836001600160a01b031614156104975760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016103f9565b336001600160a01b03821614806104b357506104b381336102ad565b6105255760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016103f9565b61052f8383610ad0565b505050565b61053e3382610b3e565b61055a5760405162461bcd60e51b81526004016103f990611bca565b61052f838383610c28565b60006105708361072e565b82106105d25760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016103f9565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b61052f838383604051806020016040528060008152506108fd565b600061062160085490565b82106106845760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016103f9565b600882815481106106a557634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806102f95760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016103f9565b60006001600160a01b0382166107995760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016103f9565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b031633146107df5760405162461bcd60e51b81526004016103f990611b95565b600b546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600b80546001600160a01b0319169055565b60606001805461030e90611c8a565b6001600160a01b0382163314156108915760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016103f9565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6109073383610b3e565b6109235760405162461bcd60e51b81526004016103f990611bca565b61092f84848484610dd3565b50505050565b60606102f982610e06565b600b546000906001600160a01b0316331461096d5760405162461bcd60e51b81526004016103f990611b95565b61097b600c80546001019055565b6000610986600c5490565b90506109928482610f75565b61099c8184610f93565b9392505050565b600b546001600160a01b031633146109cd5760405162461bcd60e51b81526004016103f990611b95565b6001600160a01b038116610a325760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103f9565b600b546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600b80546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b0319821663780e9d6360e01b14806102f957506102f98261101e565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610b05826106b7565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610b4982610ab3565b610baa5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016103f9565b6000610bb5836106b7565b9050806001600160a01b0316846001600160a01b03161480610bf05750836001600160a01b0316610be584610391565b6001600160a01b0316145b80610c2057506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316610c3b826106b7565b6001600160a01b031614610ca35760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016103f9565b6001600160a01b038216610d055760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016103f9565b610d1083838361106e565b610d1b600082610ad0565b6001600160a01b0383166000908152600360205260408120805460019290610d44908490611c47565b90915550506001600160a01b0382166000908152600360205260408120805460019290610d72908490611c1b565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610dde848484610c28565b610dea84848484611079565b61092f5760405162461bcd60e51b81526004016103f990611b43565b6060610e1182610ab3565b610e775760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b60648201526084016103f9565b6000828152600a602052604081208054610e9090611c8a565b80601f0160208091040260200160405190810160405280929190818152602001828054610ebc90611c8a565b8015610f095780601f10610ede57610100808354040283529160200191610f09565b820191906000526020600020905b815481529060010190602001808311610eec57829003601f168201915b505050505090506000610f2760408051602081019091526000815290565b9050805160001415610f3a575092915050565b815115610f6c578082604051602001610f54929190611ac4565b60405160208183030381529060405292505050919050565b610c2084611186565b610f8f82826040518060200160405280600081525061125d565b5050565b610f9c82610ab3565b610fff5760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b60648201526084016103f9565b6000828152600a60209081526040909120825161052f9284019061175b565b60006001600160e01b031982166380ac58cd60e01b148061104f57506001600160e01b03198216635b5e139f60e01b145b806102f957506301ffc9a760e01b6001600160e01b03198316146102f9565b61052f838383611290565b60006001600160a01b0384163b1561117b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906110bd903390899088908890600401611af3565b602060405180830381600087803b1580156110d757600080fd5b505af1925050508015611107575060408051601f3d908101601f1916820190925261110491810190611a64565b60015b611161573d808015611135576040519150601f19603f3d011682016040523d82523d6000602084013e61113a565b606091505b5080516111595760405162461bcd60e51b81526004016103f990611b43565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610c20565b506001949350505050565b606061119182610ab3565b6111f55760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016103f9565b600061120c60408051602081019091526000815290565b9050600081511161122c576040518060200160405280600081525061099c565b8061123684611348565b604051602001611247929190611ac4565b6040516020818303038152906040529392505050565b6112678383611462565b6112746000848484611079565b61052f5760405162461bcd60e51b81526004016103f990611b43565b6001600160a01b0383166112eb576112e681600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61130e565b816001600160a01b0316836001600160a01b03161461130e5761130e83826115a1565b6001600160a01b0382166113255761052f8161163e565b826001600160a01b0316826001600160a01b03161461052f5761052f8282611717565b60608161136c5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611396578061138081611cc5565b915061138f9050600a83611c33565b9150611370565b60008167ffffffffffffffff8111156113bf57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156113e9576020820181803683370190505b5090505b8415610c20576113fe600183611c47565b915061140b600a86611ce0565b611416906030611c1b565b60f81b81838151811061143957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061145b600a86611c33565b94506113ed565b6001600160a01b0382166114b85760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016103f9565b6114c181610ab3565b1561150e5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016103f9565b61151a6000838361106e565b6001600160a01b0382166000908152600360205260408120805460019290611543908490611c1b565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600060016115ae8461072e565b6115b89190611c47565b60008381526007602052604090205490915080821461160b576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061165090600190611c47565b6000838152600960205260408120546008805493945090928490811061168657634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080600883815481106116b557634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806116fb57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006117228361072e565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461176790611c8a565b90600052602060002090601f01602090048101928261178957600085556117cf565b82601f106117a257805160ff19168380011785556117cf565b828001600101855582156117cf579182015b828111156117cf5782518255916020019190600101906117b4565b506117db9291506117df565b5090565b5b808211156117db57600081556001016117e0565b600067ffffffffffffffff8084111561180f5761180f611d20565b604051601f8501601f19908116603f0116810190828211818310171561183757611837611d20565b8160405280935085815286868601111561185057600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461188157600080fd5b919050565b600060208284031215611897578081fd5b61099c8261186a565b600080604083850312156118b2578081fd5b6118bb8361186a565b91506118c96020840161186a565b90509250929050565b6000806000606084860312156118e6578081fd5b6118ef8461186a565b92506118fd6020850161186a565b9150604084013590509250925092565b60008060008060808587031215611922578081fd5b61192b8561186a565b93506119396020860161186a565b925060408501359150606085013567ffffffffffffffff81111561195b578182fd5b8501601f8101871361196b578182fd5b61197a878235602084016117f4565b91505092959194509250565b60008060408385031215611998578182fd5b6119a18361186a565b9150602083013580151581146119b5578182fd5b809150509250929050565b600080604083850312156119d2578182fd5b6119db8361186a565b9150602083013567ffffffffffffffff8111156119f6578182fd5b8301601f81018513611a06578182fd5b611a15858235602084016117f4565b9150509250929050565b60008060408385031215611a31578182fd5b611a3a8361186a565b946020939093013593505050565b600060208284031215611a59578081fd5b813561099c81611d36565b600060208284031215611a75578081fd5b815161099c81611d36565b600060208284031215611a91578081fd5b5035919050565b60008151808452611ab0816020860160208601611c5e565b601f01601f19169290920160200192915050565b60008351611ad6818460208801611c5e565b835190830190611aea818360208801611c5e565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611b2690830184611a98565b9695505050505050565b60208152600061099c6020830184611a98565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115611c2e57611c2e611cf4565b500190565b600082611c4257611c42611d0a565b500490565b600082821015611c5957611c59611cf4565b500390565b60005b83811015611c79578181015183820152602001611c61565b8381111561092f5750506000910152565b600181811c90821680611c9e57607f821691505b60208210811415611cbf57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611cd957611cd9611cf4565b5060010190565b600082611cef57611cef611d0a565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611d4c57600080fd5b5056fea2646970667358221220083422f598983317aa1362c3e0d75a367db574a634d24f3a6dbcbc5045caaa8264736f6c63430008040033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000012506c75746f202d2054686520506c616e657400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005504c55544f000000000000000000000000000000000000000000000000000000

Deployed ByteCode Sourcemap

46198:1224:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47248:171;;;;;;:::i;:::-;;:::i;:::-;;;5870:14:1;;5863:22;5845:41;;5833:2;5818:18;47248:171:0;;;;;;;;21639:100;;;:::i;:::-;;;;;;;:::i;23099:221::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;5168:32:1;;;5150:51;;5138:2;5123:18;23099:221:0;5105:102:1;22636:397:0;;;;;;:::i;:::-;;:::i;:::-;;35095:113;35183:10;:17;35095:113;;;14307:25:1;;;14295:2;14280:18;35095:113:0;14262:76:1;23989:305:0;;;;;;:::i;:::-;;:::i;34763:256::-;;;;;;:::i;:::-;;:::i;24365:151::-;;;;;;:::i;:::-;;:::i;35285:233::-;;;;;;:::i;:::-;;:::i;21333:239::-;;;;;;:::i;:::-;;:::i;21063:208::-;;;;;;:::i;:::-;;:::i;44249:148::-;;;:::i;43598:87::-;43671:6;;-1:-1:-1;;;;;43671:6:0;43598:87;;21808:104;;;:::i;23392:295::-;;;;;;:::i;:::-;;:::i;24587:285::-;;;;;;:::i;:::-;;:::i;47085:155::-;;;;;;:::i;:::-;;:::i;46465:300::-;;;;;;:::i;:::-;;:::i;23758:164::-;;;;;;:::i;:::-;-1:-1:-1;;;;;23879:25:0;;;23855:4;23879:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23758:164;44552:244;;;;;;:::i;:::-;;:::i;47248:171::-;47351:4;47375:36;47399:11;47375:23;:36::i;:::-;47368:43;47248:171;-1:-1:-1;;47248:171:0:o;21639:100::-;21693:13;21726:5;21719:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21639:100;:::o;23099:221::-;23175:7;23203:16;23211:7;23203;:16::i;:::-;23195:73;;;;-1:-1:-1;;;23195:73:0;;11530:2:1;23195:73:0;;;11512:21:1;11569:2;11549:18;;;11542:30;11608:34;11588:18;;;11581:62;-1:-1:-1;;;11659:18:1;;;11652:42;11711:19;;23195:73:0;;;;;;;;;-1:-1:-1;23288:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23288:24:0;;23099:221::o;22636:397::-;22717:13;22733:23;22748:7;22733:14;:23::i;:::-;22717:39;;22781:5;-1:-1:-1;;;;;22775:11:0;:2;-1:-1:-1;;;;;22775:11:0;;;22767:57;;;;-1:-1:-1;;;22767:57:0;;13130:2:1;22767:57:0;;;13112:21:1;13169:2;13149:18;;;13142:30;13208:34;13188:18;;;13181:62;-1:-1:-1;;;13259:18:1;;;13252:31;13300:19;;22767:57:0;13102:223:1;22767:57:0;16061:10;-1:-1:-1;;;;;22845:21:0;;;;:62;;-1:-1:-1;22870:37:0;22887:5;16061:10;23758:164;:::i;22870:37::-;22837:154;;;;-1:-1:-1;;;22837:154:0;;9090:2:1;22837:154:0;;;9072:21:1;9129:2;9109:18;;;9102:30;9168:34;9148:18;;;9141:62;9239:26;9219:18;;;9212:54;9283:19;;22837:154:0;9062:246:1;22837:154:0;23004:21;23013:2;23017:7;23004:8;:21::i;:::-;22636:397;;;:::o;23989:305::-;24150:41;16061:10;24183:7;24150:18;:41::i;:::-;24142:103;;;;-1:-1:-1;;;24142:103:0;;;;;;;:::i;:::-;24258:28;24268:4;24274:2;24278:7;24258:9;:28::i;34763:256::-;34860:7;34896:23;34913:5;34896:16;:23::i;:::-;34888:5;:31;34880:87;;;;-1:-1:-1;;;34880:87:0;;6323:2:1;34880:87:0;;;6305:21:1;6362:2;6342:18;;;6335:30;6401:34;6381:18;;;6374:62;-1:-1:-1;;;6452:18:1;;;6445:41;6503:19;;34880:87:0;6295:233:1;34880:87:0;-1:-1:-1;;;;;;34985:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;34763:256::o;24365:151::-;24469:39;24486:4;24492:2;24496:7;24469:39;;;;;;;;;;;;:16;:39::i;35285:233::-;35360:7;35396:30;35183:10;:17;;35095:113;35396:30;35388:5;:38;35380:95;;;;-1:-1:-1;;;35380:95:0;;13950:2:1;35380:95:0;;;13932:21:1;13989:2;13969:18;;;13962:30;14028:34;14008:18;;;14001:62;-1:-1:-1;;;14079:18:1;;;14072:42;14131:19;;35380:95:0;13922:234:1;35380:95:0;35493:10;35504:5;35493:17;;;;;;-1:-1:-1;;;35493:17:0;;;;;;;;;;;;;;;;;35486:24;;35285:233;;;:::o;21333:239::-;21405:7;21441:16;;;:7;:16;;;;;;-1:-1:-1;;;;;21441:16:0;21476:19;21468:73;;;;-1:-1:-1;;;21468:73:0;;9926:2:1;21468:73:0;;;9908:21:1;9965:2;9945:18;;;9938:30;10004:34;9984:18;;;9977:62;-1:-1:-1;;;10055:18:1;;;10048:39;10104:19;;21468:73:0;9898:231:1;21063:208:0;21135:7;-1:-1:-1;;;;;21163:19:0;;21155:74;;;;-1:-1:-1;;;21155:74:0;;9515:2:1;21155:74:0;;;9497:21:1;9554:2;9534:18;;;9527:30;9593:34;9573:18;;;9566:62;-1:-1:-1;;;9644:18:1;;;9637:40;9694:19;;21155:74:0;9487:232:1;21155:74:0;-1:-1:-1;;;;;;21247:16:0;;;;;:9;:16;;;;;;;21063:208::o;44249:148::-;43671:6;;-1:-1:-1;;;;;43671:6:0;16061:10;43818:23;43810:68;;;;-1:-1:-1;;;43810:68:0;;;;;;;:::i;:::-;44340:6:::1;::::0;44319:40:::1;::::0;44356:1:::1;::::0;-1:-1:-1;;;;;44340:6:0::1;::::0;44319:40:::1;::::0;44356:1;;44319:40:::1;44370:6;:19:::0;;-1:-1:-1;;;;;;44370:19:0::1;::::0;;44249:148::o;21808:104::-;21864:13;21897:7;21890:14;;;;;:::i;23392:295::-;-1:-1:-1;;;;;23495:24:0;;16061:10;23495:24;;23487:62;;;;-1:-1:-1;;;23487:62:0;;8323:2:1;23487:62:0;;;8305:21:1;8362:2;8342:18;;;8335:30;8401:27;8381:18;;;8374:55;8446:18;;23487:62:0;8295:175:1;23487:62:0;16061:10;23562:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;23562:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;23562:53:0;;;;;;;;;;23631:48;;5845:41:1;;;23562:42:0;;16061:10;23631:48;;5818:18:1;23631:48:0;;;;;;;23392:295;;:::o;24587:285::-;24719:41;16061:10;24752:7;24719:18;:41::i;:::-;24711:103;;;;-1:-1:-1;;;24711:103:0;;;;;;;:::i;:::-;24825:39;24839:4;24845:2;24849:7;24858:5;24825:13;:39::i;:::-;24587:285;;;;:::o;47085:155::-;47176:13;47209:23;47224:7;47209:14;:23::i;46465:300::-;43671:6;;46544:15;;-1:-1:-1;;;;;43671:6:0;16061:10;43818:23;43810:68;;;;-1:-1:-1;;;43810:68:0;;;;;;;:::i;:::-;46572:27:::1;:15;45837:19:::0;;45855:1;45837:19;;;45748:127;46572:27:::1;46610:16;46629:25;:15;45718:14:::0;;45626:114;46629:25:::1;46610:44;;46665:23;46675:2;46679:8;46665:9;:23::i;:::-;46699:32;46712:8;46722;46699:12;:32::i;:::-;46749:8:::0;46465:300;-1:-1:-1;;;46465:300:0:o;44552:244::-;43671:6;;-1:-1:-1;;;;;43671:6:0;16061:10;43818:23;43810:68;;;;-1:-1:-1;;;43810:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44641:22:0;::::1;44633:73;;;::::0;-1:-1:-1;;;44633:73:0;;7154:2:1;44633:73:0::1;::::0;::::1;7136:21:1::0;7193:2;7173:18;;;7166:30;7232:34;7212:18;;;7205:62;-1:-1:-1;;;7283:18:1;;;7276:36;7329:19;;44633:73:0::1;7126:228:1::0;44633:73:0::1;44743:6;::::0;44722:38:::1;::::0;-1:-1:-1;;;;;44722:38:0;;::::1;::::0;44743:6:::1;::::0;44722:38:::1;::::0;44743:6:::1;::::0;44722:38:::1;44771:6;:17:::0;;-1:-1:-1;;;;;;44771:17:0::1;-1:-1:-1::0;;;;;44771:17:0;;;::::1;::::0;;;::::1;::::0;;44552:244::o;34442:237::-;34544:4;-1:-1:-1;;;;;;34568:50:0;;-1:-1:-1;;;34568:50:0;;:103;;;34635:36;34659:11;34635:23;:36::i;26339:127::-;26404:4;26428:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26428:16:0;:30;;;26339:127::o;30216:174::-;30291:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;30291:29:0;-1:-1:-1;;;;;30291:29:0;;;;;;;;:24;;30345:23;30291:24;30345:14;:23::i;:::-;-1:-1:-1;;;;;30336:46:0;;;;;;;;;;;30216:174;;:::o;26633:348::-;26726:4;26751:16;26759:7;26751;:16::i;:::-;26743:73;;;;-1:-1:-1;;;26743:73:0;;8677:2:1;26743:73:0;;;8659:21:1;8716:2;8696:18;;;8689:30;8755:34;8735:18;;;8728:62;-1:-1:-1;;;8806:18:1;;;8799:42;8858:19;;26743:73:0;8649:234:1;26743:73:0;26827:13;26843:23;26858:7;26843:14;:23::i;:::-;26827:39;;26896:5;-1:-1:-1;;;;;26885:16:0;:7;-1:-1:-1;;;;;26885:16:0;;:51;;;;26929:7;-1:-1:-1;;;;;26905:31:0;:20;26917:7;26905:11;:20::i;:::-;-1:-1:-1;;;;;26905:31:0;;26885:51;:87;;;-1:-1:-1;;;;;;23879:25:0;;;23855:4;23879:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;26940:32;26877:96;26633:348;-1:-1:-1;;;;26633:348:0:o;29554:544::-;29679:4;-1:-1:-1;;;;;29652:31:0;:23;29667:7;29652:14;:23::i;:::-;-1:-1:-1;;;;;29652:31:0;;29644:85;;;;-1:-1:-1;;;29644:85:0;;12304:2:1;29644:85:0;;;12286:21:1;12343:2;12323:18;;;12316:30;12382:34;12362:18;;;12355:62;-1:-1:-1;;;12433:18:1;;;12426:39;12482:19;;29644:85:0;12276:231:1;29644:85:0;-1:-1:-1;;;;;29748:16:0;;29740:65;;;;-1:-1:-1;;;29740:65:0;;7918:2:1;29740:65:0;;;7900:21:1;7957:2;7937:18;;;7930:30;7996:34;7976:18;;;7969:62;-1:-1:-1;;;8047:18:1;;;8040:34;8091:19;;29740:65:0;7890:226:1;29740:65:0;29818:39;29839:4;29845:2;29849:7;29818:20;:39::i;:::-;29922:29;29939:1;29943:7;29922:8;:29::i;:::-;-1:-1:-1;;;;;29964:15:0;;;;;;:9;:15;;;;;:20;;29983:1;;29964:15;:20;;29983:1;;29964:20;:::i;:::-;;;;-1:-1:-1;;;;;;;29995:13:0;;;;;;:9;:13;;;;;:18;;30012:1;;29995:13;:18;;30012:1;;29995:18;:::i;:::-;;;;-1:-1:-1;;30024:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30024:21:0;-1:-1:-1;;;;;30024:21:0;;;;;;;;;30063:27;;30024:16;;30063:27;;;;;;;29554:544;;;:::o;25754:272::-;25868:28;25878:4;25884:2;25888:7;25868:9;:28::i;:::-;25915:48;25938:4;25944:2;25948:7;25957:5;25915:22;:48::i;:::-;25907:111;;;;-1:-1:-1;;;25907:111:0;;;;;;;:::i;41004:679::-;41077:13;41111:16;41119:7;41111;:16::i;:::-;41103:78;;;;-1:-1:-1;;;41103:78:0;;11112:2:1;41103:78:0;;;11094:21:1;11151:2;11131:18;;;11124:30;11190:34;11170:18;;;11163:62;-1:-1:-1;;;11241:18:1;;;11234:47;11298:19;;41103:78:0;11084:239:1;41103:78:0;41194:23;41220:19;;;:10;:19;;;;;41194:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41250:18;41271:10;22557:9;;;;;;;;;-1:-1:-1;22557:9:0;;;22480:94;41271:10;41250:31;;41363:4;41357:18;41379:1;41357:23;41353:72;;;-1:-1:-1;41404:9:0;41004:679;-1:-1:-1;;41004:679:0:o;41353:72::-;41529:23;;:27;41525:108;;41604:4;41610:9;41587:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41573:48;;;;41004:679;;;:::o;41525:108::-;41652:23;41667:7;41652:14;:23::i;27323:110::-;27399:26;27409:2;27413:7;27399:26;;;;;;;;;;;;:9;:26::i;:::-;27323:110;;:::o;41839:217::-;41939:16;41947:7;41939;:16::i;:::-;41931:75;;;;-1:-1:-1;;;41931:75:0;;10336:2:1;41931:75:0;;;10318:21:1;10375:2;10355:18;;;10348:30;10414:34;10394:18;;;10387:62;-1:-1:-1;;;10465:18:1;;;10458:44;10519:19;;41931:75:0;10308:236:1;41931:75:0;42017:19;;;;:10;:19;;;;;;;;:31;;;;;;;;:::i;20707:292::-;20809:4;-1:-1:-1;;;;;;20833:40:0;;-1:-1:-1;;;20833:40:0;;:105;;-1:-1:-1;;;;;;;20890:48:0;;-1:-1:-1;;;20890:48:0;20833:105;:158;;;-1:-1:-1;;;;;;;;;;19310:40:0;;;20955:36;19201:157;46773:181;46901:45;46928:4;46934:2;46938:7;46901:26;:45::i;30955:843::-;31076:4;-1:-1:-1;;;;;31102:13:0;;8459:20;8498:8;31098:693;;31138:72;;-1:-1:-1;;;31138:72:0;;-1:-1:-1;;;;;31138:36:0;;;;;:72;;16061:10;;31189:4;;31195:7;;31204:5;;31138:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31138:72:0;;;;;;;;-1:-1:-1;;31138:72:0;;;;;;;;;;;;:::i;:::-;;;31134:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31384:13:0;;31380:341;;31427:60;;-1:-1:-1;;;31427:60:0;;;;;;;:::i;31380:341::-;31671:6;31665:13;31656:6;31652:2;31648:15;31641:38;31134:602;-1:-1:-1;;;;;;31261:55:0;-1:-1:-1;;;31261:55:0;;-1:-1:-1;31254:62:0;;31098:693;-1:-1:-1;31775:4:0;30955:843;;;;;;:::o;21983:360::-;22056:13;22090:16;22098:7;22090;:16::i;:::-;22082:76;;;;-1:-1:-1;;;22082:76:0;;12714:2:1;22082:76:0;;;12696:21:1;12753:2;12733:18;;;12726:30;12792:34;12772:18;;;12765:62;-1:-1:-1;;;12843:18:1;;;12836:45;12898:19;;22082:76:0;12686:237:1;22082:76:0;22171:21;22195:10;22557:9;;;;;;;;;-1:-1:-1;22557:9:0;;;22480:94;22195:10;22171:34;;22247:1;22229:7;22223:21;:25;:112;;;;;;;;;;;;;;;;;22288:7;22297:18;:7;:16;:18::i;:::-;22271:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22216:119;21983:360;-1:-1:-1;;;21983:360:0:o;27660:250::-;27756:18;27762:2;27766:7;27756:5;:18::i;:::-;27793:54;27824:1;27828:2;27832:7;27841:5;27793:22;:54::i;:::-;27785:117;;;;-1:-1:-1;;;27785:117:0;;;;;;;:::i;36131:555::-;-1:-1:-1;;;;;36303:18:0;;36299:187;;36338:40;36370:7;37513:10;:17;;37486:24;;;;:15;:24;;;;;:44;;;37541:24;;;;;;;;;;;;37409:164;36338:40;36299:187;;;36408:2;-1:-1:-1;;;;;36400:10:0;:4;-1:-1:-1;;;;;36400:10:0;;36396:90;;36427:47;36460:4;36466:7;36427:32;:47::i;:::-;-1:-1:-1;;;;;36500:16:0;;36496:183;;36533:45;36570:7;36533:36;:45::i;36496:183::-;36606:4;-1:-1:-1;;;;;36600:10:0;:2;-1:-1:-1;;;;;36600:10:0;;36596:83;;36627:40;36655:2;36659:7;36627:27;:40::i;16642:723::-;16698:13;16919:10;16915:53;;-1:-1:-1;;16946:10:0;;;;;;;;;;;;-1:-1:-1;;;16946:10:0;;;;;16642:723::o;16915:53::-;16993:5;16978:12;17034:78;17041:9;;17034:78;;17067:8;;;;:::i;:::-;;-1:-1:-1;17090:10:0;;-1:-1:-1;17098:2:0;17090:10;;:::i;:::-;;;17034:78;;;17122:19;17154:6;17144:17;;;;;;-1:-1:-1;;;17144:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17144:17:0;;17122:39;;17172:154;17179:10;;17172:154;;17206:11;17216:1;17206:11;;:::i;:::-;;-1:-1:-1;17275:10:0;17283:2;17275:5;:10;:::i;:::-;17262:24;;:2;:24;:::i;:::-;17249:39;;17232:6;17239;17232:14;;;;;;-1:-1:-1;;;17232:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;17232:56:0;;;;;;;;-1:-1:-1;17303:11:0;17312:2;17303:11;;:::i;:::-;;;17172:154;;28246:382;-1:-1:-1;;;;;28326:16:0;;28318:61;;;;-1:-1:-1;;;28318:61:0;;10751:2:1;28318:61:0;;;10733:21:1;;;10770:18;;;10763:30;10829:34;10809:18;;;10802:62;10881:18;;28318:61:0;10723:182:1;28318:61:0;28399:16;28407:7;28399;:16::i;:::-;28398:17;28390:58;;;;-1:-1:-1;;;28390:58:0;;7561:2:1;28390:58:0;;;7543:21:1;7600:2;7580:18;;;7573:30;7639;7619:18;;;7612:58;7687:18;;28390:58:0;7533:178:1;28390:58:0;28461:45;28490:1;28494:2;28498:7;28461:20;:45::i;:::-;-1:-1:-1;;;;;28519:13:0;;;;;;:9;:13;;;;;:18;;28536:1;;28519:13;:18;;28536:1;;28519:18;:::i;:::-;;;;-1:-1:-1;;28548:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28548:21:0;-1:-1:-1;;;;;28548:21:0;;;;;;;;28587:33;;28548:16;;;28587:33;;28548:16;;28587:33;28246:382;;:::o;38200:988::-;38466:22;38516:1;38491:22;38508:4;38491:16;:22::i;:::-;:26;;;;:::i;:::-;38528:18;38549:26;;;:17;:26;;;;;;38466:51;;-1:-1:-1;38682:28:0;;;38678:328;;-1:-1:-1;;;;;38749:18:0;;38727:19;38749:18;;;:12;:18;;;;;;;;:34;;;;;;;;;38800:30;;;;;;:44;;;38917:30;;:17;:30;;;;;:43;;;38678:328;-1:-1:-1;39102:26:0;;;;:17;:26;;;;;;;;39095:33;;;-1:-1:-1;;;;;39146:18:0;;;;;:12;:18;;;;;:34;;;;;;;39139:41;38200:988::o;39483:1079::-;39761:10;:17;39736:22;;39761:21;;39781:1;;39761:21;:::i;:::-;39793:18;39814:24;;;:15;:24;;;;;;40187:10;:26;;39736:46;;-1:-1:-1;39814:24:0;;39736:46;;40187:26;;;;-1:-1:-1;;;40187:26:0;;;;;;;;;;;;;;;;;40165:48;;40251:11;40226:10;40237;40226:22;;;;;;-1:-1:-1;;;40226:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;40331:28;;;:15;:28;;;;;;;:41;;;40503:24;;;;;40496:31;40538:10;:16;;;;;-1:-1:-1;;;40538:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;39483:1079;;;;:::o;36987:221::-;37072:14;37089:20;37106:2;37089:16;:20::i;:::-;-1:-1:-1;;;;;37120:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;37165:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;36987:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:2;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:2;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:2;;;532:1;529;522:12;491:2;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;88:557;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:2;;813:1;810;803:12;747:2;699:124;;;:::o;828:196::-;887:6;940:2;928:9;919:7;915:23;911:32;908:2;;;961:6;953;946:22;908:2;989:29;1008:9;989:29;:::i;1029:270::-;1097:6;1105;1158:2;1146:9;1137:7;1133:23;1129:32;1126:2;;;1179:6;1171;1164:22;1126:2;1207:29;1226:9;1207:29;:::i;:::-;1197:39;;1255:38;1289:2;1278:9;1274:18;1255:38;:::i;:::-;1245:48;;1116:183;;;;;:::o;1304:338::-;1381:6;1389;1397;1450:2;1438:9;1429:7;1425:23;1421:32;1418:2;;;1471:6;1463;1456:22;1418:2;1499:29;1518:9;1499:29;:::i;:::-;1489:39;;1547:38;1581:2;1570:9;1566:18;1547:38;:::i;:::-;1537:48;;1632:2;1621:9;1617:18;1604:32;1594:42;;1408:234;;;;;:::o;1647:696::-;1742:6;1750;1758;1766;1819:3;1807:9;1798:7;1794:23;1790:33;1787:2;;;1841:6;1833;1826:22;1787:2;1869:29;1888:9;1869:29;:::i;:::-;1859:39;;1917:38;1951:2;1940:9;1936:18;1917:38;:::i;:::-;1907:48;;2002:2;1991:9;1987:18;1974:32;1964:42;;2057:2;2046:9;2042:18;2029:32;2084:18;2076:6;2073:30;2070:2;;;2121:6;2113;2106:22;2070:2;2149:22;;2202:4;2194:13;;2190:27;-1:-1:-1;2180:2:1;;2236:6;2228;2221:22;2180:2;2264:73;2329:7;2324:2;2311:16;2306:2;2302;2298:11;2264:73;:::i;:::-;2254:83;;;1777:566;;;;;;;:::o;2348:367::-;2413:6;2421;2474:2;2462:9;2453:7;2449:23;2445:32;2442:2;;;2495:6;2487;2480:22;2442:2;2523:29;2542:9;2523:29;:::i;:::-;2513:39;;2602:2;2591:9;2587:18;2574:32;2649:5;2642:13;2635:21;2628:5;2625:32;2615:2;;2676:6;2668;2661:22;2615:2;2704:5;2694:15;;;2432:283;;;;;:::o;2720:554::-;2798:6;2806;2859:2;2847:9;2838:7;2834:23;2830:32;2827:2;;;2880:6;2872;2865:22;2827:2;2908:29;2927:9;2908:29;:::i;:::-;2898:39;;2988:2;2977:9;2973:18;2960:32;3015:18;3007:6;3004:30;3001:2;;;3052:6;3044;3037:22;3001:2;3080:22;;3133:4;3125:13;;3121:27;-1:-1:-1;3111:2:1;;3167:6;3159;3152:22;3111:2;3195:73;3260:7;3255:2;3242:16;3237:2;3233;3229:11;3195:73;:::i;:::-;3185:83;;;2817:457;;;;;:::o;3279:264::-;3347:6;3355;3408:2;3396:9;3387:7;3383:23;3379:32;3376:2;;;3429:6;3421;3414:22;3376:2;3457:29;3476:9;3457:29;:::i;:::-;3447:39;3533:2;3518:18;;;;3505:32;;-1:-1:-1;;;3366:177:1:o;3548:255::-;3606:6;3659:2;3647:9;3638:7;3634:23;3630:32;3627:2;;;3680:6;3672;3665:22;3627:2;3724:9;3711:23;3743:30;3767:5;3743:30;:::i;3808:259::-;3877:6;3930:2;3918:9;3909:7;3905:23;3901:32;3898:2;;;3951:6;3943;3936:22;3898:2;3988:9;3982:16;4007:30;4031:5;4007:30;:::i;4072:190::-;4131:6;4184:2;4172:9;4163:7;4159:23;4155:32;4152:2;;;4205:6;4197;4190:22;4152:2;-1:-1:-1;4233:23:1;;4142:120;-1:-1:-1;4142:120:1:o;4267:257::-;4308:3;4346:5;4340:12;4373:6;4368:3;4361:19;4389:63;4445:6;4438:4;4433:3;4429:14;4422:4;4415:5;4411:16;4389:63;:::i;:::-;4506:2;4485:15;-1:-1:-1;;4481:29:1;4472:39;;;;4513:4;4468:50;;4316:208;-1:-1:-1;;4316:208:1:o;4529:470::-;4708:3;4746:6;4740:13;4762:53;4808:6;4803:3;4796:4;4788:6;4784:17;4762:53;:::i;:::-;4878:13;;4837:16;;;;4900:57;4878:13;4837:16;4934:4;4922:17;;4900:57;:::i;:::-;4973:20;;4716:283;-1:-1:-1;;;;4716:283:1:o;5212:488::-;-1:-1:-1;;;;;5481:15:1;;;5463:34;;5533:15;;5528:2;5513:18;;5506:43;5580:2;5565:18;;5558:34;;;5628:3;5623:2;5608:18;;5601:31;;;5406:4;;5649:45;;5674:19;;5666:6;5649:45;:::i;:::-;5641:53;5415:285;-1:-1:-1;;;;;;5415:285:1:o;5897:219::-;6046:2;6035:9;6028:21;6009:4;6066:44;6106:2;6095:9;6091:18;6083:6;6066:44;:::i;6533:414::-;6735:2;6717:21;;;6774:2;6754:18;;;6747:30;6813:34;6808:2;6793:18;;6786:62;-1:-1:-1;;;6879:2:1;6864:18;;6857:48;6937:3;6922:19;;6707:240::o;11741:356::-;11943:2;11925:21;;;11962:18;;;11955:30;12021:34;12016:2;12001:18;;11994:62;12088:2;12073:18;;11915:182::o;13330:413::-;13532:2;13514:21;;;13571:2;13551:18;;;13544:30;13610:34;13605:2;13590:18;;13583:62;-1:-1:-1;;;13676:2:1;13661:18;;13654:47;13733:3;13718:19;;13504:239::o;14343:128::-;14383:3;14414:1;14410:6;14407:1;14404:13;14401:2;;;14420:18;;:::i;:::-;-1:-1:-1;14456:9:1;;14391:80::o;14476:120::-;14516:1;14542;14532:2;;14547:18;;:::i;:::-;-1:-1:-1;14581:9:1;;14522:74::o;14601:125::-;14641:4;14669:1;14666;14663:8;14660:2;;;14674:18;;:::i;:::-;-1:-1:-1;14711:9:1;;14650:76::o;14731:258::-;14803:1;14813:113;14827:6;14824:1;14821:13;14813:113;;;14903:11;;;14897:18;14884:11;;;14877:39;14849:2;14842:10;14813:113;;;14944:6;14941:1;14938:13;14935:2;;;-1:-1:-1;;14979:1:1;14961:16;;14954:27;14784:205::o;14994:380::-;15073:1;15069:12;;;;15116;;;15137:2;;15191:4;15183:6;15179:17;15169:27;;15137:2;15244;15236:6;15233:14;15213:18;15210:38;15207:2;;;15290:10;15285:3;15281:20;15278:1;15271:31;15325:4;15322:1;15315:15;15353:4;15350:1;15343:15;15207:2;;15049:325;;;:::o;15379:135::-;15418:3;-1:-1:-1;;15439:17:1;;15436:2;;;15459:18;;:::i;:::-;-1:-1:-1;15506:1:1;15495:13;;15426:88::o;15519:112::-;15551:1;15577;15567:2;;15582:18;;:::i;:::-;-1:-1:-1;15616:9:1;;15557:74::o;15636:127::-;15697:10;15692:3;15688:20;15685:1;15678:31;15728:4;15725:1;15718:15;15752:4;15749:1;15742:15;15768:127;15829:10;15824:3;15820:20;15817:1;15810:31;15860:4;15857:1;15850:15;15884:4;15881:1;15874:15;15900:127;15961:10;15956:3;15952:20;15949:1;15942:31;15992:4;15989:1;15982:15;16016:4;16013:1;16006:15;16032:131;-1:-1:-1;;;;;;16106:32:1;;16096:43;;16086:2;;16153:1;16150;16143:12;16086:2;16076:87;:::o

Swarm Source

ipfs://083422f598983317aa1362c3e0d75a367db574a634d24f3a6dbcbc5045caaa82
Loading