ETH Price: $3,097.49 (+0.46%)
Gas: 11 Gwei

Token

Moon Pets (MAL_PETS)
 

Overview

Max Total Supply

16,000 MAL_PETS

Holders

387

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x1f1df9a5b9c07e4433f9a8a17a6041e2738938a2
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Welcome to the Pet Incubator! Moon Pets are in-game assistants for the Moon Apes! There are 8 types of Pets with each pet providing a specific amount of $MAL when staked. Collecting all 8 types of Moon Pets will allow you to acquire a limited edition Moon Ape Gen Z 3D collecti...

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MoonPets

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-13
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;



// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
/**
 * @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);
}


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

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

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

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

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

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

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

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

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

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


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

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


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


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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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


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


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

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

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

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

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

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

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

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

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

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

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

        return batchBalances;
    }

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

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

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

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

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

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data);

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

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

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

        address operator = _msgSender();

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

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

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

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

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

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

        return array;
    }
}


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

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

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

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

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

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


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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)
/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

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

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

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

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


interface IMAL {
  function spendMAL(address user, uint256 amount) external;
}

interface ISTAKING {
  function balanceOf(address user) external view returns (uint256);
}

contract MoonPets is ERC1155Supply, Ownable {
    using Strings for uint256;

    mapping (uint256 => uint256) maxSupplies;
    mapping (uint256 => uint256) tokensPrices;
    bool private _detailsSet;

    bool public saleIsActive;
    bool public isPaused;
    bool public apeOwnershipRequired;

    string private name_;
    string private symbol_; 

    IMAL public MAL;
    ISTAKING public STAKING;
    IERC721 public APES;

    mapping (address => bool) private _isAuthorised;
    address[] public authorisedLog;

    string private petsBaseUri;

    enum PetTypes {
      PetBasic,
      PetCommon,
      PetUncommon,
      PetRare,
      PetEpic,
      PetMythic,
      PetLegendary,
      PetArtifact
    }

    event PetsMinted(address mintedBy, uint256 totalAmount, uint256 totalTypes);

    constructor(address _apes, address _staking, address _mal, string memory baseUri) ERC1155(baseUri) {
      name_ = "Moon Pets";
      symbol_ = "MAL_PETS";
      petsBaseUri = baseUri;

      saleIsActive = false;
      isPaused = false;
      apeOwnershipRequired = true;

      APES = IERC721(address(_apes));
      STAKING = ISTAKING(address(_staking));
      MAL = IMAL(address(_mal));
      _isAuthorised[_staking] = true;

      maxSupplies[0] = 4000;
      maxSupplies[1] = 3520;
      maxSupplies[2] = 2880;
      maxSupplies[3] = 2240;
      maxSupplies[4] = 1600;
      maxSupplies[5] = 960;
      maxSupplies[6] = 640;
      maxSupplies[7] = 160;

      tokensPrices[0] = 1200 ether;
      tokensPrices[1] = 1600 ether;
      tokensPrices[2] = 2000 ether;
      tokensPrices[3] = 2400 ether;
      tokensPrices[4] = 3000 ether;
      tokensPrices[5] = 4000 ether;
      tokensPrices[6] = 5000 ether;
      tokensPrices[7] = 10000 ether;

      _detailsSet = true;
    }

    function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes memory data) public override {
        require(from == _msgSender() || isApprovedForAll(from, _msgSender()) || _isAuthorised[_msgSender()], "ERC1155: caller is not owner nor approved");
        _safeTransferFrom(from, to, id, amount, data);
    }

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

    function authorise(address addressToAuth) public onlyOwner {
      _isAuthorised[addressToAuth] = true;
      authorisedLog.push(addressToAuth);
    }

    function unauthorise(address addressToUnAuth) public onlyOwner {
      _isAuthorised[addressToUnAuth] = false;
    }
    
    function name() public view returns (string memory) {
      return name_;
    }

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

    function reserveForGiveaway(uint256[] memory tokenTypes, uint256[] memory tokenAmounts) public onlyOwner{
      require(tokenTypes.length == tokenAmounts.length, "Lists are not same length");
      for (uint256 i = 0; i < tokenTypes.length; i++){
            require(tokenTypes[i] <= uint256(PetTypes.PetArtifact), "Invalid token type");
            require(totalSupply(tokenTypes[i]) + tokenAmounts[i] <= maxSupplies[tokenTypes[i]], "You tried to mint more than allowed");
        }
      _mintBatch(_msgSender(), tokenTypes, tokenAmounts, "");
    }

    function giveaway(address[] memory receivers, uint256[] memory tokenTypes, uint256[] memory tokenAmounts) public onlyOwner{
      require(receivers.length == tokenTypes.length, "Lists are not same length");
      require(tokenTypes.length == tokenAmounts.length, "Lists are not same length");
      for (uint256 i = 0; i < receivers.length; i++){
        _mint(receivers[i], tokenTypes[i], tokenAmounts[i], "");
      }
    }

    function purchase(uint256[] memory tokensTypes, uint256[] memory tokensNumbers) public {
        require(tokensTypes.length == tokensNumbers.length, "Lists not same length");
        require(_detailsSet, "The mint has not started yet");
        require(saleIsActive, "The mint has not started yet");
        require(_validateApeOwnership(_msgSender()), "You do not have any Moon Apes");
        uint256 totalPrice = 0;
        uint256 totalAmount = 0;
        for (uint256 i = 0; i < tokensTypes.length; i++){
            require(tokensNumbers[i] > 0, "Wrong amount requested");
            require(tokensTypes[i] >= 0, "Invalid token type");
            require(tokensTypes[i] <= uint256(PetTypes.PetArtifact), "Invalid token type");
            require(totalSupply(tokensTypes[i]) + tokensNumbers[i] <= maxSupplies[tokensTypes[i]], "You tried to mint more than allowed");
            totalPrice += tokensPrices[tokensTypes[i]] * tokensNumbers[i];
            totalAmount += tokensNumbers[i];
        }
        MAL.spendMAL(_msgSender(), totalPrice);

        _mintBatch(_msgSender(), tokensTypes, tokensNumbers, "");

        emit PetsMinted(_msgSender(), totalAmount, tokensTypes.length);
    }

    function updateSaleStatus(bool status) public onlyOwner {
      saleIsActive = status;
    }
    
    function setTokenPrices(uint256[] memory _tokenTypes, uint256[] memory _tokenPrices, uint256[] memory _tokenMaxSupplies) public onlyOwner {
        require(_tokenTypes.length == _tokenPrices.length, "Lists not same length");
        require(!saleIsActive, "Price cannot be changed while sale is active");
        for (uint256 i = 0; i < _tokenTypes.length; i++){
            require(_tokenTypes[i] >= 0, "Invalid token type");
            require(_tokenTypes[i] <= uint256(PetTypes.PetArtifact), "Invalid token type");
            require(_tokenPrices[i] > 0, "Invalid price");
            tokensPrices[_tokenTypes[i]] = _tokenPrices[i];
            maxSupplies[_tokenTypes[i]] = _tokenMaxSupplies[i];
        }
        _detailsSet = true;
    }

    function _validateApeOwnership(address user) internal view returns (bool) {
      if (!apeOwnershipRequired) return true;
      if (STAKING.balanceOf(user) > 0) return true;
      return APES.balanceOf(user) > 0;
    }

    function updateApeOwnershipRequirement(bool _isOwnershipRequired) public onlyOwner {
      apeOwnershipRequired = _isOwnershipRequired;
    }

    function withdraw() external onlyOwner {
      uint256 balance = address(this).balance;
      payable(owner()).transfer(balance);
    }

    function pause(bool _isPaused) external onlyOwner {
      isPaused = _isPaused;
    }

    function uri(uint256 tokenType) public view override returns (string memory) {
        require(tokenType <= uint256(PetTypes.PetArtifact), "Invalid token type");
        return string(abi.encodePacked(string(abi.encodePacked(petsBaseUri, tokenType.toString())), ".json"));
    }

    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);

        require(!isPaused, "ERC1155Pausable: token transfer while paused");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_apes","type":"address"},{"internalType":"address","name":"_staking","type":"address"},{"internalType":"address","name":"_mal","type":"address"},{"internalType":"string","name":"baseUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"mintedBy","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalTypes","type":"uint256"}],"name":"PetsMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"APES","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAL","outputs":[{"internalType":"contract IMAL","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAKING","outputs":[{"internalType":"contract ISTAKING","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"apeOwnershipRequired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addressToAuth","type":"address"}],"name":"authorise","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"authorisedLog","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"tokenTypes","type":"uint256[]"},{"internalType":"uint256[]","name":"tokenAmounts","type":"uint256[]"}],"name":"giveaway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","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":"bool","name":"_isPaused","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokensTypes","type":"uint256[]"},{"internalType":"uint256[]","name":"tokensNumbers","type":"uint256[]"}],"name":"purchase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenTypes","type":"uint256[]"},{"internalType":"uint256[]","name":"tokenAmounts","type":"uint256[]"}],"name":"reserveForGiveaway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenTypes","type":"uint256[]"},{"internalType":"uint256[]","name":"_tokenPrices","type":"uint256[]"},{"internalType":"uint256[]","name":"_tokenMaxSupplies","type":"uint256[]"}],"name":"setTokenPrices","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":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addressToUnAuth","type":"address"}],"name":"unauthorise","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isOwnershipRequired","type":"bool"}],"name":"updateApeOwnershipRequirement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"updateSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenType","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040516200346d3803806200346d833981016040819052620000349162000505565b806200004081620003d7565b506200004c33620003f0565b604080518082019091526009808252684d6f6f6e205065747360b81b60209092019182526200007e9160089162000442565b50604080518082019091526008808252674d414c5f5045545360c01b6020909201918252620000b09160099162000442565b508051620000c690600f90602084019062000442565b50506007805463ffffff0019166301000000178155600c80546001600160a01b039586166001600160a01b031991821617909155600b805494861694821685179055600a8054939095169216919091179092556000908152600d602090815260408220805460ff199081166001908117909255610fa07f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc55610dc07f1471eb6eb2c5e789fc3de43f8ce62938c7d1836ec861730447e2ada8fd81017b55610b407f89832631fb3c3307a103ba2c84ab569c64d6182a18893dcd163f0f1c2090733a556108c07fa9bc9a3a348c357ba16b37005d7e6b3236198c0e939f4af8c5f19b8deeb8ebc0556106407f3eec716f11ba9e820c81ca75eb978ffb45831ef8b7a53e5e422c26008e1ca6d5556103c07f458b30c2d72bfd2c6317304a4594ecbafe5f729d3111b65fdc3a33bd48e5432d556102807f069400f22b28c6c362558d92f66163cec5671cba50b61abd2eecfcd0eaeac5185560a07feddb6698d7c569ff62ff64f1f1492bf14a54594835ba0faac91f84b4f5d8146055600690925268410d586a20a4c000007f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f8556856bc75e2d6310000007f3e5fec24aa4dc4e5aee2e025e51e1392c72a2500577559fae9665c6d52bd6a3155686c6b935b8bbd4000007f8819ef417987f8ae7a81f42cdfb18815282fe989326fbff903d13cf0e03ace295568821ab0d441498000007f75f96ab15d697e93042dc45b5c896c4b27e89bb6eaf39475c5c371cb2513f7d25568a2a15d09519be000007fc5069e24aaadb2addc3e52e868fcf3f4f8acf5a87e24300992fd4540c2a87eed5568d8d726b7177a8000007fbfd358e93f18da3ed276c3afdbdba00b8f0b6008a03476a6a86bd6320ee6938b5569010f0cf064dd592000007f697b2bd7bb2984c4e0dc14c79c987d37818484a62958b9c45a0e8b962f20650f559183905269021e19e0c9bab24000007f4ced6d0d36392b04cc5d8761b1327b3bbba6e1089c77f60a9a9ca18e05e4f00e558254161790556200066d565b8051620003ec90600290602084019062000442565b5050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805462000450906200061a565b90600052602060002090601f016020900481019282620004745760008555620004bf565b82601f106200048f57805160ff1916838001178555620004bf565b82800160010185558215620004bf579182015b82811115620004bf578251825591602001919060010190620004a2565b50620004cd929150620004d1565b5090565b5b80821115620004cd5760008155600101620004d2565b80516001600160a01b03811681146200050057600080fd5b919050565b600080600080608085870312156200051c57600080fd5b6200052785620004e8565b9350602062000538818701620004e8565b93506200054860408701620004e8565b60608701519093506001600160401b03808211156200056657600080fd5b818801915088601f8301126200057b57600080fd5b81518181111562000590576200059062000657565b604051601f8201601f19908116603f01168101908382118183101715620005bb57620005bb62000657565b816040528281528b86848701011115620005d457600080fd5b600093505b82841015620005f85784840186015181850187015292850192620005d9565b828411156200060a5760008684830101525b989b979a50959850505050505050565b600181811c908216806200062f57607f821691505b602082108114156200065157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b612df0806200067d6000396000f3fe608060405234801561001057600080fd5b50600436106101ef5760003560e01c806386f3b23d1161010f578063c82bc61d116100a2578063f242432a11610071578063f242432a14610466578063f2fde38b14610479578063f31121d71461048c578063f4461fc8146104a057600080fd5b8063c82bc61d146103f2578063d1b1934714610405578063e985e9c514610418578063eb8d24441461045457600080fd5b806397610f30116100de57806397610f3014610399578063a22cb465146103ac578063b187bd26146103bf578063bd85b039146103d257600080fd5b806386f3b23d1461035a5780638da5cb5b1461036d578063922fab051461037e57806395d89b411461039157600080fd5b80634e1273f41161018757806373ec42b71161015657806373ec42b7146102f65780637bdadbcf146103095780637e6732971461033457806380833d781461034757600080fd5b80634e1273f4146102a85780634f558e79146102c857806366e6c8af146102db578063715018a6146102ee57600080fd5b80630a088949116101c35780630a088949146102675780630e89341c1461027a5780632eb2c2d61461028d5780633ccfd60b146102a057600080fd5b8062fdd58e146101f457806301ffc9a71461021a57806302329a291461023d57806306fdde0314610252575b600080fd5b6102076102023660046124d4565b6104b3565b6040519081526020015b60405180910390f35b61022d610228366004612675565b61054a565b6040519015158152602001610211565b61025061024b36600461265a565b61059c565b005b61025a6105e2565b604051610211919061290f565b61025061027536600461265a565b610674565b61025a6102883660046126af565b6106b8565b61025061029b36600461239b565b61072a565b6102506107db565b6102bb6102b63660046124fe565b610854565b60405161021191906128d7565b61022d6102d63660046126af565b61097e565b6102506102e9366004612346565b610997565b610250610a27565b6102506103043660046125ea565b610a5d565b600a5461031c906001600160a01b031681565b6040516001600160a01b039091168152602001610211565b610250610342366004612621565b610bba565b610250610355366004612346565b610e2d565b6102506103683660046125ea565b610e78565b6004546001600160a01b031661031c565b600c5461031c906001600160a01b031681565b61025a6112a2565b600b5461031c906001600160a01b031681565b6102506103ba3660046124aa565b6112b1565b60075461022d9062010000900460ff1681565b6102076103e03660046126af565b60009081526003602052604090205490565b61031c6104003660046126af565b6112bc565b610250610413366004612562565b6112e6565b61022d610426366004612368565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b60075461022d90610100900460ff1681565b610250610474366004612445565b6113dc565b610250610487366004612346565b61147d565b60075461022d906301000000900460ff1681565b6102506104ae36600461265a565b611518565b60006001600160a01b0383166105245760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061057b57506001600160e01b031982166303a24d0760e21b145b8061059657506301ffc9a760e01b6001600160e01b03198316145b92915050565b6004546001600160a01b031633146105c65760405162461bcd60e51b815260040161051b90612a9f565b60078054911515620100000262ff000019909216919091179055565b6060600880546105f190612c0f565b80601f016020809104026020016040519081016040528092919081815260200182805461061d90612c0f565b801561066a5780601f1061063f5761010080835404028352916020019161066a565b820191906000526020600020905b81548152906001019060200180831161064d57829003601f168201915b5050505050905090565b6004546001600160a01b0316331461069e5760405162461bcd60e51b815260040161051b90612a9f565b600780549115156101000261ff0019909216919091179055565b606060078211156106db5760405162461bcd60e51b815260040161051b9061296a565b600f6106e683611560565b6040516020016106f792919061278d565b60408051601f198184030181529082905261071491602001612764565b6040516020818303038152906040529050919050565b6001600160a01b03851633148061074657506107468533610426565b806107605750336000908152600d602052604090205460ff165b6107c75760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161051b565b6107d48585858585611666565b5050505050565b6004546001600160a01b031633146108055760405162461bcd60e51b815260040161051b90612a9f565b476108186004546001600160a01b031690565b6001600160a01b03166108fc829081150290604051600060405180830381858888f19350505050158015610850573d6000803e3d6000fd5b5050565b606081518351146108b95760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b606482015260840161051b565b6000835167ffffffffffffffff8111156108d5576108d5612ce8565b6040519080825280602002602001820160405280156108fe578160200160208202803683370190505b50905060005b84518110156109765761094985828151811061092257610922612cd2565b602002602001015185838151811061093c5761093c612cd2565b60200260200101516104b3565b82828151811061095b5761095b612cd2565b602090810291909101015261096f81612c77565b9050610904565b509392505050565b60008181526003602052604081205481905b1192915050565b6004546001600160a01b031633146109c15760405162461bcd60e51b815260040161051b90612a9f565b6001600160a01b03166000818152600d60205260408120805460ff19166001908117909155600e805491820181559091527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0180546001600160a01b0319169091179055565b6004546001600160a01b03163314610a515760405162461bcd60e51b815260040161051b90612a9f565b610a5b6000611810565b565b6004546001600160a01b03163314610a875760405162461bcd60e51b815260040161051b90612a9f565b8051825114610aa85760405162461bcd60e51b815260040161051b90612a68565b60005b8251811015610b9e576007838281518110610ac857610ac8612cd2565b60200260200101511115610aee5760405162461bcd60e51b815260040161051b9061296a565b60056000848381518110610b0457610b04612cd2565b6020026020010151815260200190815260200160002054828281518110610b2d57610b2d612cd2565b6020026020010151610b64858481518110610b4a57610b4a612cd2565b602002602001015160009081526003602052604090205490565b610b6e9190612b81565b1115610b8c5760405162461bcd60e51b815260040161051b90612996565b80610b9681612c77565b915050610aab565b5061085033838360405180602001604052806000815250611862565b6004546001600160a01b03163314610be45760405162461bcd60e51b815260040161051b90612a9f565b8151835114610c2d5760405162461bcd60e51b8152602060048201526015602482015274098d2e6e8e640dcdee840e6c2daca40d8cadccee8d605b1b604482015260640161051b565b600754610100900460ff1615610c9a5760405162461bcd60e51b815260206004820152602c60248201527f50726963652063616e6e6f74206265206368616e676564207768696c6520736160448201526b6c652069732061637469766560a01b606482015260840161051b565b60005b8351811015610e1a576000848281518110610cba57610cba612cd2565b60200260200101511015610ce05760405162461bcd60e51b815260040161051b9061296a565b6007848281518110610cf457610cf4612cd2565b60200260200101511115610d1a5760405162461bcd60e51b815260040161051b9061296a565b6000838281518110610d2e57610d2e612cd2565b602002602001015111610d735760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420707269636560981b604482015260640161051b565b828181518110610d8557610d85612cd2565b602002602001015160066000868481518110610da357610da3612cd2565b6020026020010151815260200190815260200160002081905550818181518110610dcf57610dcf612cd2565b602002602001015160056000868481518110610ded57610ded612cd2565b60200260200101518152602001908152602001600020819055508080610e1290612c77565b915050610c9d565b50506007805460ff191660011790555050565b6004546001600160a01b03163314610e575760405162461bcd60e51b815260040161051b90612a9f565b6001600160a01b03166000908152600d60205260409020805460ff19169055565b8051825114610ec15760405162461bcd60e51b8152602060048201526015602482015274098d2e6e8e640dcdee840e6c2daca40d8cadccee8d605b1b604482015260640161051b565b60075460ff16610f135760405162461bcd60e51b815260206004820152601c60248201527f546865206d696e7420686173206e6f7420737461727465642079657400000000604482015260640161051b565b600754610100900460ff16610f6a5760405162461bcd60e51b815260206004820152601c60248201527f546865206d696e7420686173206e6f7420737461727465642079657400000000604482015260640161051b565b610f73336119bc565b610fbf5760405162461bcd60e51b815260206004820152601d60248201527f596f7520646f206e6f74206861766520616e79204d6f6f6e2041706573000000604482015260640161051b565b60008060005b84518110156111be576000848281518110610fe257610fe2612cd2565b6020026020010151116110305760405162461bcd60e51b815260206004820152601660248201527515dc9bdb99c8185b5bdd5b9d081c995c5d595cdd195960521b604482015260640161051b565b600085828151811061104457611044612cd2565b6020026020010151101561106a5760405162461bcd60e51b815260040161051b9061296a565b600785828151811061107e5761107e612cd2565b602002602001015111156110a45760405162461bcd60e51b815260040161051b9061296a565b600560008683815181106110ba576110ba612cd2565b60200260200101518152602001908152602001600020548482815181106110e3576110e3612cd2565b6020026020010151611100878481518110610b4a57610b4a612cd2565b61110a9190612b81565b11156111285760405162461bcd60e51b815260040161051b90612996565b83818151811061113a5761113a612cd2565b60200260200101516006600087848151811061115857611158612cd2565b60200260200101518152602001908152602001600020546111799190612bad565b6111839084612b81565b925083818151811061119757611197612cd2565b6020026020010151826111aa9190612b81565b9150806111b681612c77565b915050610fc5565b50600a546001600160a01b03166384a85b0d336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101859052604401600060405180830381600087803b15801561121957600080fd5b505af115801561122d573d6000803e3d6000fd5b5050505061125261123b3390565b858560405180602001604052806000815250611862565b7fc6dd49fa9355ef938864039b6b10c29e75da596f7a9cb6cb75b545eebab7f42e338551604080516001600160a01b0390931683526020830185905282015260600160405180910390a150505050565b6060600980546105f190612c0f565b610850338383611ae2565b600e81815481106112cc57600080fd5b6000918252602090912001546001600160a01b0316905081565b6004546001600160a01b031633146113105760405162461bcd60e51b815260040161051b90612a9f565b81518351146113315760405162461bcd60e51b815260040161051b90612a68565b80518251146113525760405162461bcd60e51b815260040161051b90612a68565b60005b83518110156113d6576113c484828151811061137357611373612cd2565b602002602001015184838151811061138d5761138d612cd2565b60200260200101518484815181106113a7576113a7612cd2565b602002602001015160405180602001604052806000815250611bc3565b806113ce81612c77565b915050611355565b50505050565b6001600160a01b0385163314806113f857506113f88533610426565b806114125750336000908152600d602052604090205460ff165b6114705760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b606482015260840161051b565b6107d48585858585611c99565b6004546001600160a01b031633146114a75760405162461bcd60e51b815260040161051b90612a9f565b6001600160a01b03811661150c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161051b565b61151581611810565b50565b6004546001600160a01b031633146115425760405162461bcd60e51b815260040161051b90612a9f565b6007805491151563010000000263ff00000019909216919091179055565b6060816115845750506040805180820190915260018152600360fc1b602082015290565b8160005b81156115ae578061159881612c77565b91506115a79050600a83612b99565b9150611588565b60008167ffffffffffffffff8111156115c9576115c9612ce8565b6040519080825280601f01601f1916602001820160405280156115f3576020820181803683370190505b5090505b841561165e57611608600183612bcc565b9150611615600a86612c92565b611620906030612b81565b60f81b81838151811061163557611635612cd2565b60200101906001600160f81b031916908160001a905350611657600a86612b99565b94506115f7565b949350505050565b81518351146116875760405162461bcd60e51b815260040161051b90612ad4565b6001600160a01b0384166116ad5760405162461bcd60e51b815260040161051b906129d9565b336116bc818787878787611db6565b60005b84518110156117a25760008582815181106116dc576116dc612cd2565b6020026020010151905060008583815181106116fa576116fa612cd2565b602090810291909101810151600084815280835260408082206001600160a01b038e16835290935291909120549091508181101561174a5760405162461bcd60e51b815260040161051b90612a1e565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611787908490612b81565b925050819055505050508061179b90612c77565b90506116bf565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516117f29291906128ea565b60405180910390a4611808818787878787611e32565b505050505050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0384166118885760405162461bcd60e51b815260040161051b90612b1c565b81518351146118a95760405162461bcd60e51b815260040161051b90612ad4565b336118b981600087878787611db6565b60005b8451811015611954578381815181106118d7576118d7612cd2565b60200260200101516000808784815181106118f4576118f4612cd2565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b03168152602001908152602001600020600082825461193c9190612b81565b9091555081905061194c81612c77565b9150506118bc565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516119a59291906128ea565b60405180910390a46107d481600087878787611e32565b6007546000906301000000900460ff166119d857506001919050565b600b546040516370a0823160e01b81526001600160a01b03848116600483015260009216906370a082319060240160206040518083038186803b158015611a1e57600080fd5b505afa158015611a32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5691906126c8565b1115611a6457506001919050565b600c546040516370a0823160e01b81526001600160a01b03848116600483015260009216906370a082319060240160206040518083038186803b158015611aaa57600080fd5b505afa158015611abe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061099091906126c8565b816001600160a01b0316836001600160a01b03161415611b565760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b606482015260840161051b565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038416611be95760405162461bcd60e51b815260040161051b90612b1c565b33611c0981600087611bfa88611f9d565b611c0388611f9d565b87611db6565b6000848152602081815260408083206001600160a01b038916845290915281208054859290611c39908490612b81565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46107d481600087878787611fe8565b6001600160a01b038416611cbf5760405162461bcd60e51b815260040161051b906129d9565b33611ccf818787611bfa88611f9d565b6000848152602081815260408083206001600160a01b038a16845290915290205483811015611d105760405162461bcd60e51b815260040161051b90612a1e565b6000858152602081815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290611d4d908490612b81565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611dad828888888888611fe8565b50505050505050565b611dc48686868686866120b2565b60075462010000900460ff16156118085760405162461bcd60e51b815260206004820152602c60248201527f455243313135355061757361626c653a20746f6b656e207472616e736665722060448201526b1dda1a5b19481c185d5cd95960a21b606482015260840161051b565b6001600160a01b0384163b156118085760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611e769089908990889088908890600401612834565b602060405180830381600087803b158015611e9057600080fd5b505af1925050508015611ec0575060408051601f3d908101601f19168201909252611ebd91810190612692565b60015b611f6d57611ecc612cfe565b806308c379a01415611f065750611ee1612d1a565b80611eec5750611f08565b8060405162461bcd60e51b815260040161051b919061290f565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606482015260840161051b565b6001600160e01b0319811663bc197c8160e01b14611dad5760405162461bcd60e51b815260040161051b90612922565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611fd757611fd7612cd2565b602090810291909101015292915050565b6001600160a01b0384163b156118085760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061202c9089908990889088908890600401612892565b602060405180830381600087803b15801561204657600080fd5b505af1925050508015612076575060408051601f3d908101601f1916820190925261207391810190612692565b60015b61208257611ecc612cfe565b6001600160e01b0319811663f23a6e6160e01b14611dad5760405162461bcd60e51b815260040161051b90612922565b6001600160a01b0385166121395760005b8351811015612137578281815181106120de576120de612cd2565b6020026020010151600360008684815181106120fc576120fc612cd2565b6020026020010151815260200190815260200160002060008282546121219190612b81565b90915550612130905081612c77565b90506120c3565b505b6001600160a01b0384166118085760005b8351811015611dad5782818151811061216557612165612cd2565b60200260200101516003600086848151811061218357612183612cd2565b6020026020010151815260200190815260200160002060008282546121a89190612bcc565b909155506121b7905081612c77565b905061214a565b80356001600160a01b03811681146121d557600080fd5b919050565b600082601f8301126121eb57600080fd5b813560206121f882612b5d565b6040516122058282612c4a565b8381528281019150858301600585901b8701840188101561222557600080fd5b60005b8581101561224b57612239826121be565b84529284019290840190600101612228565b5090979650505050505050565b600082601f83011261226957600080fd5b8135602061227682612b5d565b6040516122838282612c4a565b8381528281019150858301600585901b870184018810156122a357600080fd5b60005b8581101561224b578135845292840192908401906001016122a6565b803580151581146121d557600080fd5b600082601f8301126122e357600080fd5b813567ffffffffffffffff8111156122fd576122fd612ce8565b604051612314601f8301601f191660200182612c4a565b81815284602083860101111561232957600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561235857600080fd5b612361826121be565b9392505050565b6000806040838503121561237b57600080fd5b612384836121be565b9150612392602084016121be565b90509250929050565b600080600080600060a086880312156123b357600080fd5b6123bc866121be565b94506123ca602087016121be565b9350604086013567ffffffffffffffff808211156123e757600080fd5b6123f389838a01612258565b9450606088013591508082111561240957600080fd5b61241589838a01612258565b9350608088013591508082111561242b57600080fd5b50612438888289016122d2565b9150509295509295909350565b600080600080600060a0868803121561245d57600080fd5b612466866121be565b9450612474602087016121be565b93506040860135925060608601359150608086013567ffffffffffffffff81111561249e57600080fd5b612438888289016122d2565b600080604083850312156124bd57600080fd5b6124c6836121be565b9150612392602084016122c2565b600080604083850312156124e757600080fd5b6124f0836121be565b946020939093013593505050565b6000806040838503121561251157600080fd5b823567ffffffffffffffff8082111561252957600080fd5b612535868387016121da565b9350602085013591508082111561254b57600080fd5b5061255885828601612258565b9150509250929050565b60008060006060848603121561257757600080fd5b833567ffffffffffffffff8082111561258f57600080fd5b61259b878388016121da565b945060208601359150808211156125b157600080fd5b6125bd87838801612258565b935060408601359150808211156125d357600080fd5b506125e086828701612258565b9150509250925092565b600080604083850312156125fd57600080fd5b823567ffffffffffffffff8082111561261557600080fd5b61253586838701612258565b60008060006060848603121561263657600080fd5b833567ffffffffffffffff8082111561264e57600080fd5b61259b87838801612258565b60006020828403121561266c57600080fd5b612361826122c2565b60006020828403121561268757600080fd5b813561236181612da4565b6000602082840312156126a457600080fd5b815161236181612da4565b6000602082840312156126c157600080fd5b5035919050565b6000602082840312156126da57600080fd5b5051919050565b600081518084526020808501945080840160005b83811015612711578151875295820195908201906001016126f5565b509495945050505050565b60008151808452612734816020860160208601612be3565b601f01601f19169290920160200192915050565b6000815161275a818560208601612be3565b9290920192915050565b60008251612776818460208701612be3565b64173539b7b760d91b920191825250600501919050565b600080845481600182811c9150808316806127a957607f831692505b60208084108214156127c957634e487b7160e01b86526022600452602486fd5b8180156127dd57600181146127ee5761281b565b60ff1986168952848901965061281b565b60008b81526020902060005b868110156128135781548b8201529085019083016127fa565b505084890196505b50505050505061282b8185612748565b95945050505050565b6001600160a01b0386811682528516602082015260a060408201819052600090612860908301866126e1565b828103606084015261287281866126e1565b90508281036080840152612886818561271c565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906128cc9083018461271c565b979650505050505050565b60208152600061236160208301846126e1565b6040815260006128fd60408301856126e1565b828103602084015261282b81856126e1565b602081526000612361602083018461271c565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b602080825260129082015271496e76616c696420746f6b656e207479706560701b604082015260600190565b60208082526023908201527f596f7520747269656420746f206d696e74206d6f7265207468616e20616c6c6f6040820152621dd95960ea1b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60208082526019908201527f4c6973747320617265206e6f742073616d65206c656e67746800000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b600067ffffffffffffffff821115612b7757612b77612ce8565b5060051b60200190565b60008219821115612b9457612b94612ca6565b500190565b600082612ba857612ba8612cbc565b500490565b6000816000190483118215151615612bc757612bc7612ca6565b500290565b600082821015612bde57612bde612ca6565b500390565b60005b83811015612bfe578181015183820152602001612be6565b838111156113d65750506000910152565b600181811c90821680612c2357607f821691505b60208210811415612c4457634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f1916810167ffffffffffffffff81118282101715612c7057612c70612ce8565b6040525050565b6000600019821415612c8b57612c8b612ca6565b5060010190565b600082612ca157612ca1612cbc565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115612d175760046000803e5060005160e01c5b90565b600060443d1015612d285790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715612d5857505050505090565b8285019150815181811115612d705750505050505090565b843d8701016020828501011115612d8a5750505050505090565b612d9960208286010187612c4a565b509095945050505050565b6001600160e01b03198116811461151557600080fdfea264697066735822122035dfffc7e937bca056c29a208a0736f628d51a95c18fff5181c68928d4008ded64736f6c6343000807003300000000000000000000000034c4eba1966b502dfcf0868b6f271d85cc8a231200000000000000000000000000a103267a22971375c3c37d6e1f1bdfb548e94600000000000000000000000065fd5d7ea09459c932aa70eba22548cd16283c9300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d4e4d53367964524b34325862746e373176674232584c4a33503644427131663564754651335131467a4b4a672f00000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101ef5760003560e01c806386f3b23d1161010f578063c82bc61d116100a2578063f242432a11610071578063f242432a14610466578063f2fde38b14610479578063f31121d71461048c578063f4461fc8146104a057600080fd5b8063c82bc61d146103f2578063d1b1934714610405578063e985e9c514610418578063eb8d24441461045457600080fd5b806397610f30116100de57806397610f3014610399578063a22cb465146103ac578063b187bd26146103bf578063bd85b039146103d257600080fd5b806386f3b23d1461035a5780638da5cb5b1461036d578063922fab051461037e57806395d89b411461039157600080fd5b80634e1273f41161018757806373ec42b71161015657806373ec42b7146102f65780637bdadbcf146103095780637e6732971461033457806380833d781461034757600080fd5b80634e1273f4146102a85780634f558e79146102c857806366e6c8af146102db578063715018a6146102ee57600080fd5b80630a088949116101c35780630a088949146102675780630e89341c1461027a5780632eb2c2d61461028d5780633ccfd60b146102a057600080fd5b8062fdd58e146101f457806301ffc9a71461021a57806302329a291461023d57806306fdde0314610252575b600080fd5b6102076102023660046124d4565b6104b3565b6040519081526020015b60405180910390f35b61022d610228366004612675565b61054a565b6040519015158152602001610211565b61025061024b36600461265a565b61059c565b005b61025a6105e2565b604051610211919061290f565b61025061027536600461265a565b610674565b61025a6102883660046126af565b6106b8565b61025061029b36600461239b565b61072a565b6102506107db565b6102bb6102b63660046124fe565b610854565b60405161021191906128d7565b61022d6102d63660046126af565b61097e565b6102506102e9366004612346565b610997565b610250610a27565b6102506103043660046125ea565b610a5d565b600a5461031c906001600160a01b031681565b6040516001600160a01b039091168152602001610211565b610250610342366004612621565b610bba565b610250610355366004612346565b610e2d565b6102506103683660046125ea565b610e78565b6004546001600160a01b031661031c565b600c5461031c906001600160a01b031681565b61025a6112a2565b600b5461031c906001600160a01b031681565b6102506103ba3660046124aa565b6112b1565b60075461022d9062010000900460ff1681565b6102076103e03660046126af565b60009081526003602052604090205490565b61031c6104003660046126af565b6112bc565b610250610413366004612562565b6112e6565b61022d610426366004612368565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b60075461022d90610100900460ff1681565b610250610474366004612445565b6113dc565b610250610487366004612346565b61147d565b60075461022d906301000000900460ff1681565b6102506104ae36600461265a565b611518565b60006001600160a01b0383166105245760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061057b57506001600160e01b031982166303a24d0760e21b145b8061059657506301ffc9a760e01b6001600160e01b03198316145b92915050565b6004546001600160a01b031633146105c65760405162461bcd60e51b815260040161051b90612a9f565b60078054911515620100000262ff000019909216919091179055565b6060600880546105f190612c0f565b80601f016020809104026020016040519081016040528092919081815260200182805461061d90612c0f565b801561066a5780601f1061063f5761010080835404028352916020019161066a565b820191906000526020600020905b81548152906001019060200180831161064d57829003601f168201915b5050505050905090565b6004546001600160a01b0316331461069e5760405162461bcd60e51b815260040161051b90612a9f565b600780549115156101000261ff0019909216919091179055565b606060078211156106db5760405162461bcd60e51b815260040161051b9061296a565b600f6106e683611560565b6040516020016106f792919061278d565b60408051601f198184030181529082905261071491602001612764565b6040516020818303038152906040529050919050565b6001600160a01b03851633148061074657506107468533610426565b806107605750336000908152600d602052604090205460ff165b6107c75760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161051b565b6107d48585858585611666565b5050505050565b6004546001600160a01b031633146108055760405162461bcd60e51b815260040161051b90612a9f565b476108186004546001600160a01b031690565b6001600160a01b03166108fc829081150290604051600060405180830381858888f19350505050158015610850573d6000803e3d6000fd5b5050565b606081518351146108b95760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b606482015260840161051b565b6000835167ffffffffffffffff8111156108d5576108d5612ce8565b6040519080825280602002602001820160405280156108fe578160200160208202803683370190505b50905060005b84518110156109765761094985828151811061092257610922612cd2565b602002602001015185838151811061093c5761093c612cd2565b60200260200101516104b3565b82828151811061095b5761095b612cd2565b602090810291909101015261096f81612c77565b9050610904565b509392505050565b60008181526003602052604081205481905b1192915050565b6004546001600160a01b031633146109c15760405162461bcd60e51b815260040161051b90612a9f565b6001600160a01b03166000818152600d60205260408120805460ff19166001908117909155600e805491820181559091527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0180546001600160a01b0319169091179055565b6004546001600160a01b03163314610a515760405162461bcd60e51b815260040161051b90612a9f565b610a5b6000611810565b565b6004546001600160a01b03163314610a875760405162461bcd60e51b815260040161051b90612a9f565b8051825114610aa85760405162461bcd60e51b815260040161051b90612a68565b60005b8251811015610b9e576007838281518110610ac857610ac8612cd2565b60200260200101511115610aee5760405162461bcd60e51b815260040161051b9061296a565b60056000848381518110610b0457610b04612cd2565b6020026020010151815260200190815260200160002054828281518110610b2d57610b2d612cd2565b6020026020010151610b64858481518110610b4a57610b4a612cd2565b602002602001015160009081526003602052604090205490565b610b6e9190612b81565b1115610b8c5760405162461bcd60e51b815260040161051b90612996565b80610b9681612c77565b915050610aab565b5061085033838360405180602001604052806000815250611862565b6004546001600160a01b03163314610be45760405162461bcd60e51b815260040161051b90612a9f565b8151835114610c2d5760405162461bcd60e51b8152602060048201526015602482015274098d2e6e8e640dcdee840e6c2daca40d8cadccee8d605b1b604482015260640161051b565b600754610100900460ff1615610c9a5760405162461bcd60e51b815260206004820152602c60248201527f50726963652063616e6e6f74206265206368616e676564207768696c6520736160448201526b6c652069732061637469766560a01b606482015260840161051b565b60005b8351811015610e1a576000848281518110610cba57610cba612cd2565b60200260200101511015610ce05760405162461bcd60e51b815260040161051b9061296a565b6007848281518110610cf457610cf4612cd2565b60200260200101511115610d1a5760405162461bcd60e51b815260040161051b9061296a565b6000838281518110610d2e57610d2e612cd2565b602002602001015111610d735760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420707269636560981b604482015260640161051b565b828181518110610d8557610d85612cd2565b602002602001015160066000868481518110610da357610da3612cd2565b6020026020010151815260200190815260200160002081905550818181518110610dcf57610dcf612cd2565b602002602001015160056000868481518110610ded57610ded612cd2565b60200260200101518152602001908152602001600020819055508080610e1290612c77565b915050610c9d565b50506007805460ff191660011790555050565b6004546001600160a01b03163314610e575760405162461bcd60e51b815260040161051b90612a9f565b6001600160a01b03166000908152600d60205260409020805460ff19169055565b8051825114610ec15760405162461bcd60e51b8152602060048201526015602482015274098d2e6e8e640dcdee840e6c2daca40d8cadccee8d605b1b604482015260640161051b565b60075460ff16610f135760405162461bcd60e51b815260206004820152601c60248201527f546865206d696e7420686173206e6f7420737461727465642079657400000000604482015260640161051b565b600754610100900460ff16610f6a5760405162461bcd60e51b815260206004820152601c60248201527f546865206d696e7420686173206e6f7420737461727465642079657400000000604482015260640161051b565b610f73336119bc565b610fbf5760405162461bcd60e51b815260206004820152601d60248201527f596f7520646f206e6f74206861766520616e79204d6f6f6e2041706573000000604482015260640161051b565b60008060005b84518110156111be576000848281518110610fe257610fe2612cd2565b6020026020010151116110305760405162461bcd60e51b815260206004820152601660248201527515dc9bdb99c8185b5bdd5b9d081c995c5d595cdd195960521b604482015260640161051b565b600085828151811061104457611044612cd2565b6020026020010151101561106a5760405162461bcd60e51b815260040161051b9061296a565b600785828151811061107e5761107e612cd2565b602002602001015111156110a45760405162461bcd60e51b815260040161051b9061296a565b600560008683815181106110ba576110ba612cd2565b60200260200101518152602001908152602001600020548482815181106110e3576110e3612cd2565b6020026020010151611100878481518110610b4a57610b4a612cd2565b61110a9190612b81565b11156111285760405162461bcd60e51b815260040161051b90612996565b83818151811061113a5761113a612cd2565b60200260200101516006600087848151811061115857611158612cd2565b60200260200101518152602001908152602001600020546111799190612bad565b6111839084612b81565b925083818151811061119757611197612cd2565b6020026020010151826111aa9190612b81565b9150806111b681612c77565b915050610fc5565b50600a546001600160a01b03166384a85b0d336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101859052604401600060405180830381600087803b15801561121957600080fd5b505af115801561122d573d6000803e3d6000fd5b5050505061125261123b3390565b858560405180602001604052806000815250611862565b7fc6dd49fa9355ef938864039b6b10c29e75da596f7a9cb6cb75b545eebab7f42e338551604080516001600160a01b0390931683526020830185905282015260600160405180910390a150505050565b6060600980546105f190612c0f565b610850338383611ae2565b600e81815481106112cc57600080fd5b6000918252602090912001546001600160a01b0316905081565b6004546001600160a01b031633146113105760405162461bcd60e51b815260040161051b90612a9f565b81518351146113315760405162461bcd60e51b815260040161051b90612a68565b80518251146113525760405162461bcd60e51b815260040161051b90612a68565b60005b83518110156113d6576113c484828151811061137357611373612cd2565b602002602001015184838151811061138d5761138d612cd2565b60200260200101518484815181106113a7576113a7612cd2565b602002602001015160405180602001604052806000815250611bc3565b806113ce81612c77565b915050611355565b50505050565b6001600160a01b0385163314806113f857506113f88533610426565b806114125750336000908152600d602052604090205460ff165b6114705760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b606482015260840161051b565b6107d48585858585611c99565b6004546001600160a01b031633146114a75760405162461bcd60e51b815260040161051b90612a9f565b6001600160a01b03811661150c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161051b565b61151581611810565b50565b6004546001600160a01b031633146115425760405162461bcd60e51b815260040161051b90612a9f565b6007805491151563010000000263ff00000019909216919091179055565b6060816115845750506040805180820190915260018152600360fc1b602082015290565b8160005b81156115ae578061159881612c77565b91506115a79050600a83612b99565b9150611588565b60008167ffffffffffffffff8111156115c9576115c9612ce8565b6040519080825280601f01601f1916602001820160405280156115f3576020820181803683370190505b5090505b841561165e57611608600183612bcc565b9150611615600a86612c92565b611620906030612b81565b60f81b81838151811061163557611635612cd2565b60200101906001600160f81b031916908160001a905350611657600a86612b99565b94506115f7565b949350505050565b81518351146116875760405162461bcd60e51b815260040161051b90612ad4565b6001600160a01b0384166116ad5760405162461bcd60e51b815260040161051b906129d9565b336116bc818787878787611db6565b60005b84518110156117a25760008582815181106116dc576116dc612cd2565b6020026020010151905060008583815181106116fa576116fa612cd2565b602090810291909101810151600084815280835260408082206001600160a01b038e16835290935291909120549091508181101561174a5760405162461bcd60e51b815260040161051b90612a1e565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611787908490612b81565b925050819055505050508061179b90612c77565b90506116bf565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516117f29291906128ea565b60405180910390a4611808818787878787611e32565b505050505050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0384166118885760405162461bcd60e51b815260040161051b90612b1c565b81518351146118a95760405162461bcd60e51b815260040161051b90612ad4565b336118b981600087878787611db6565b60005b8451811015611954578381815181106118d7576118d7612cd2565b60200260200101516000808784815181106118f4576118f4612cd2565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b03168152602001908152602001600020600082825461193c9190612b81565b9091555081905061194c81612c77565b9150506118bc565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516119a59291906128ea565b60405180910390a46107d481600087878787611e32565b6007546000906301000000900460ff166119d857506001919050565b600b546040516370a0823160e01b81526001600160a01b03848116600483015260009216906370a082319060240160206040518083038186803b158015611a1e57600080fd5b505afa158015611a32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5691906126c8565b1115611a6457506001919050565b600c546040516370a0823160e01b81526001600160a01b03848116600483015260009216906370a082319060240160206040518083038186803b158015611aaa57600080fd5b505afa158015611abe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061099091906126c8565b816001600160a01b0316836001600160a01b03161415611b565760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b606482015260840161051b565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038416611be95760405162461bcd60e51b815260040161051b90612b1c565b33611c0981600087611bfa88611f9d565b611c0388611f9d565b87611db6565b6000848152602081815260408083206001600160a01b038916845290915281208054859290611c39908490612b81565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46107d481600087878787611fe8565b6001600160a01b038416611cbf5760405162461bcd60e51b815260040161051b906129d9565b33611ccf818787611bfa88611f9d565b6000848152602081815260408083206001600160a01b038a16845290915290205483811015611d105760405162461bcd60e51b815260040161051b90612a1e565b6000858152602081815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290611d4d908490612b81565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611dad828888888888611fe8565b50505050505050565b611dc48686868686866120b2565b60075462010000900460ff16156118085760405162461bcd60e51b815260206004820152602c60248201527f455243313135355061757361626c653a20746f6b656e207472616e736665722060448201526b1dda1a5b19481c185d5cd95960a21b606482015260840161051b565b6001600160a01b0384163b156118085760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611e769089908990889088908890600401612834565b602060405180830381600087803b158015611e9057600080fd5b505af1925050508015611ec0575060408051601f3d908101601f19168201909252611ebd91810190612692565b60015b611f6d57611ecc612cfe565b806308c379a01415611f065750611ee1612d1a565b80611eec5750611f08565b8060405162461bcd60e51b815260040161051b919061290f565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606482015260840161051b565b6001600160e01b0319811663bc197c8160e01b14611dad5760405162461bcd60e51b815260040161051b90612922565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611fd757611fd7612cd2565b602090810291909101015292915050565b6001600160a01b0384163b156118085760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061202c9089908990889088908890600401612892565b602060405180830381600087803b15801561204657600080fd5b505af1925050508015612076575060408051601f3d908101601f1916820190925261207391810190612692565b60015b61208257611ecc612cfe565b6001600160e01b0319811663f23a6e6160e01b14611dad5760405162461bcd60e51b815260040161051b90612922565b6001600160a01b0385166121395760005b8351811015612137578281815181106120de576120de612cd2565b6020026020010151600360008684815181106120fc576120fc612cd2565b6020026020010151815260200190815260200160002060008282546121219190612b81565b90915550612130905081612c77565b90506120c3565b505b6001600160a01b0384166118085760005b8351811015611dad5782818151811061216557612165612cd2565b60200260200101516003600086848151811061218357612183612cd2565b6020026020010151815260200190815260200160002060008282546121a89190612bcc565b909155506121b7905081612c77565b905061214a565b80356001600160a01b03811681146121d557600080fd5b919050565b600082601f8301126121eb57600080fd5b813560206121f882612b5d565b6040516122058282612c4a565b8381528281019150858301600585901b8701840188101561222557600080fd5b60005b8581101561224b57612239826121be565b84529284019290840190600101612228565b5090979650505050505050565b600082601f83011261226957600080fd5b8135602061227682612b5d565b6040516122838282612c4a565b8381528281019150858301600585901b870184018810156122a357600080fd5b60005b8581101561224b578135845292840192908401906001016122a6565b803580151581146121d557600080fd5b600082601f8301126122e357600080fd5b813567ffffffffffffffff8111156122fd576122fd612ce8565b604051612314601f8301601f191660200182612c4a565b81815284602083860101111561232957600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561235857600080fd5b612361826121be565b9392505050565b6000806040838503121561237b57600080fd5b612384836121be565b9150612392602084016121be565b90509250929050565b600080600080600060a086880312156123b357600080fd5b6123bc866121be565b94506123ca602087016121be565b9350604086013567ffffffffffffffff808211156123e757600080fd5b6123f389838a01612258565b9450606088013591508082111561240957600080fd5b61241589838a01612258565b9350608088013591508082111561242b57600080fd5b50612438888289016122d2565b9150509295509295909350565b600080600080600060a0868803121561245d57600080fd5b612466866121be565b9450612474602087016121be565b93506040860135925060608601359150608086013567ffffffffffffffff81111561249e57600080fd5b612438888289016122d2565b600080604083850312156124bd57600080fd5b6124c6836121be565b9150612392602084016122c2565b600080604083850312156124e757600080fd5b6124f0836121be565b946020939093013593505050565b6000806040838503121561251157600080fd5b823567ffffffffffffffff8082111561252957600080fd5b612535868387016121da565b9350602085013591508082111561254b57600080fd5b5061255885828601612258565b9150509250929050565b60008060006060848603121561257757600080fd5b833567ffffffffffffffff8082111561258f57600080fd5b61259b878388016121da565b945060208601359150808211156125b157600080fd5b6125bd87838801612258565b935060408601359150808211156125d357600080fd5b506125e086828701612258565b9150509250925092565b600080604083850312156125fd57600080fd5b823567ffffffffffffffff8082111561261557600080fd5b61253586838701612258565b60008060006060848603121561263657600080fd5b833567ffffffffffffffff8082111561264e57600080fd5b61259b87838801612258565b60006020828403121561266c57600080fd5b612361826122c2565b60006020828403121561268757600080fd5b813561236181612da4565b6000602082840312156126a457600080fd5b815161236181612da4565b6000602082840312156126c157600080fd5b5035919050565b6000602082840312156126da57600080fd5b5051919050565b600081518084526020808501945080840160005b83811015612711578151875295820195908201906001016126f5565b509495945050505050565b60008151808452612734816020860160208601612be3565b601f01601f19169290920160200192915050565b6000815161275a818560208601612be3565b9290920192915050565b60008251612776818460208701612be3565b64173539b7b760d91b920191825250600501919050565b600080845481600182811c9150808316806127a957607f831692505b60208084108214156127c957634e487b7160e01b86526022600452602486fd5b8180156127dd57600181146127ee5761281b565b60ff1986168952848901965061281b565b60008b81526020902060005b868110156128135781548b8201529085019083016127fa565b505084890196505b50505050505061282b8185612748565b95945050505050565b6001600160a01b0386811682528516602082015260a060408201819052600090612860908301866126e1565b828103606084015261287281866126e1565b90508281036080840152612886818561271c565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906128cc9083018461271c565b979650505050505050565b60208152600061236160208301846126e1565b6040815260006128fd60408301856126e1565b828103602084015261282b81856126e1565b602081526000612361602083018461271c565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b602080825260129082015271496e76616c696420746f6b656e207479706560701b604082015260600190565b60208082526023908201527f596f7520747269656420746f206d696e74206d6f7265207468616e20616c6c6f6040820152621dd95960ea1b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60208082526019908201527f4c6973747320617265206e6f742073616d65206c656e67746800000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b600067ffffffffffffffff821115612b7757612b77612ce8565b5060051b60200190565b60008219821115612b9457612b94612ca6565b500190565b600082612ba857612ba8612cbc565b500490565b6000816000190483118215151615612bc757612bc7612ca6565b500290565b600082821015612bde57612bde612ca6565b500390565b60005b83811015612bfe578181015183820152602001612be6565b838111156113d65750506000910152565b600181811c90821680612c2357607f821691505b60208210811415612c4457634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f1916810167ffffffffffffffff81118282101715612c7057612c70612ce8565b6040525050565b6000600019821415612c8b57612c8b612ca6565b5060010190565b600082612ca157612ca1612cbc565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115612d175760046000803e5060005160e01c5b90565b600060443d1015612d285790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715612d5857505050505090565b8285019150815181811115612d705750505050505090565b843d8701016020828501011115612d8a5750505050505090565b612d9960208286010187612c4a565b509095945050505050565b6001600160e01b03198116811461151557600080fdfea264697066735822122035dfffc7e937bca056c29a208a0736f628d51a95c18fff5181c68928d4008ded64736f6c63430008070033

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

00000000000000000000000034c4eba1966b502dfcf0868b6f271d85cc8a231200000000000000000000000000a103267a22971375c3c37d6e1f1bdfb548e94600000000000000000000000065fd5d7ea09459c932aa70eba22548cd16283c9300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d4e4d53367964524b34325862746e373176674232584c4a33503644427131663564754651335131467a4b4a672f00000000000000000000

-----Decoded View---------------
Arg [0] : _apes (address): 0x34c4EBA1966B502dfCF0868b6f271d85CC8A2312
Arg [1] : _staking (address): 0x00a103267A22971375C3C37d6E1f1BDfb548e946
Arg [2] : _mal (address): 0x65fd5d7eA09459c932Aa70eba22548cd16283c93
Arg [3] : baseUri (string): ipfs://QmNMS6ydRK42Xbtn71vgB2XLJ3P6DBq1f5duFQ3Q1FzKJg/

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 00000000000000000000000034c4eba1966b502dfcf0868b6f271d85cc8a2312
Arg [1] : 00000000000000000000000000a103267a22971375c3c37d6e1f1bdfb548e946
Arg [2] : 00000000000000000000000065fd5d7ea09459c932aa70eba22548cd16283c93
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [5] : 697066733a2f2f516d4e4d53367964524b34325862746e373176674232584c4a
Arg [6] : 33503644427131663564754651335131467a4b4a672f00000000000000000000


Deployed Bytecode Sourcemap

44758:7473:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20133:231;;;;;;:::i;:::-;;:::i;:::-;;;24547:25:1;;;24535:2;24520:18;20133:231:0;;;;;;;;19156:310;;;;;;:::i;:::-;;:::i;:::-;;;14504:14:1;;14497:22;14479:41;;14467:2;14452:18;19156:310:0;14339:187:1;51452:87:0;;;;;;:::i;:::-;;:::i;:::-;;47643:81;;;:::i;:::-;;;;;;;:::i;50055:94::-;;;;;;:::i;:::-;;:::i;51547:281::-;;;;;;:::i;:::-;;:::i;46960:384::-;;;;;;:::i;:::-;;:::i;51306:138::-;;;:::i;20530:524::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;34462:122::-;;;;;;:::i;:::-;;:::i;47352:153::-;;;;;;:::i;:::-;;:::i;36948:103::-;;;:::i;47825:558::-;;;;;;:::i;:::-;;:::i;45129:15::-;;;;;-1:-1:-1;;;;;45129:15:0;;;;;;-1:-1:-1;;;;;11534:32:1;;;11516:51;;11504:2;11489:18;45129:15:0;11370:203:1;50161:756:0;;;;;;:::i;:::-;;:::i;47513:118::-;;;;;;:::i;:::-;;:::i;48830:1217::-;;;;;;:::i;:::-;;:::i;36297:87::-;36370:6;;-1:-1:-1;;;;;36370:6:0;36297:87;;45181:19;;;;;-1:-1:-1;;;;;45181:19:0;;;47732:85;;;:::i;45151:23::-;;;;;-1:-1:-1;;;;;45151:23:0;;;21127:155;;;;;;:::i;:::-;;:::i;45002:20::-;;;;;;;;;;;;34251:113;;;;;;:::i;:::-;34313:7;34340:16;;;:12;:16;;;;;;;34251:113;45263:30;;;;;;:::i;:::-;;:::i;48391:431::-;;;;;;:::i;:::-;;:::i;21354:168::-;;;;;;:::i;:::-;-1:-1:-1;;;;;21477:27:0;;;21453:4;21477:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;21354:168;44971:24;;;;;;;;;;;;46617:335;;;;;;:::i;:::-;;:::i;37206:201::-;;;;;;:::i;:::-;;:::i;45029:32::-;;;;;;;;;;;;51155:143;;;;;;:::i;:::-;;:::i;20133:231::-;20219:7;-1:-1:-1;;;;;20247:21:0;;20239:77;;;;-1:-1:-1;;;20239:77:0;;16815:2:1;20239:77:0;;;16797:21:1;16854:2;16834:18;;;16827:30;16893:34;16873:18;;;16866:62;-1:-1:-1;;;16944:18:1;;;16937:41;16995:19;;20239:77:0;;;;;;;;;-1:-1:-1;20334:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;20334:22:0;;;;;;;;;;;;20133:231::o;19156:310::-;19258:4;-1:-1:-1;;;;;;19295:41:0;;-1:-1:-1;;;19295:41:0;;:110;;-1:-1:-1;;;;;;;19353:52:0;;-1:-1:-1;;;19353:52:0;19295:110;:163;;;-1:-1:-1;;;;;;;;;;18127:40:0;;;19422:36;19275:183;19156:310;-1:-1:-1;;19156:310:0:o;51452:87::-;36370:6;;-1:-1:-1;;;;;36370:6:0;17117:10;36517:23;36509:68;;;;-1:-1:-1;;;36509:68:0;;;;;;;:::i;:::-;51511:8:::1;:20:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;51511:20:0;;::::1;::::0;;;::::1;::::0;;51452:87::o;47643:81::-;47680:13;47711:5;47704:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47643:81;:::o;50055:94::-;36370:6;;-1:-1:-1;;;;;36370:6:0;17117:10;36517:23;36509:68;;;;-1:-1:-1;;;36509:68:0;;;;;;;:::i;:::-;50120:12:::1;:21:::0;;;::::1;;;;-1:-1:-1::0;;50120:21:0;;::::1;::::0;;;::::1;::::0;;50055:94::o;51547:281::-;51609:13;51664:20;51643:9;:42;;51635:73;;;;-1:-1:-1;;;51635:73:0;;;;;;;:::i;:::-;51774:11;51787:20;:9;:18;:20::i;:::-;51757:51;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;51757:51:0;;;;;;;;;;51733:86;;51757:51;51733:86;;:::i;:::-;;;;;;;;;;;;;51719:101;;51547:281;;;:::o;46960:384::-;-1:-1:-1;;;;;47127:20:0;;17117:10;47127:20;;:60;;-1:-1:-1;47151:36:0;47168:4;17117:10;21354:168;:::i;47151:36::-;47127:91;;;-1:-1:-1;17117:10:0;47191:27;;;;:13;:27;;;;;;;;47127:91;47119:154;;;;-1:-1:-1;;;47119:154:0;;19965:2:1;47119:154:0;;;19947:21:1;20004:2;19984:18;;;19977:30;20043:34;20023:18;;;20016:62;-1:-1:-1;;;20094:18:1;;;20087:48;20152:19;;47119:154:0;19763:414:1;47119:154:0;47284:52;47307:4;47313:2;47317:3;47322:7;47331:4;47284:22;:52::i;:::-;46960:384;;;;;:::o;51306:138::-;36370:6;;-1:-1:-1;;;;;36370:6:0;17117:10;36517:23;36509:68;;;;-1:-1:-1;;;36509:68:0;;;;;;;:::i;:::-;51372:21:::1;51410:7;36370:6:::0;;-1:-1:-1;;;;;36370:6:0;;36297:87;51410:7:::1;-1:-1:-1::0;;;;;51402:25:0::1;:34;51428:7;51402:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;51345:99;51306:138::o:0;20530:524::-;20686:16;20747:3;:10;20728:8;:15;:29;20720:83;;;;-1:-1:-1;;;20720:83:0;;22683:2:1;20720:83:0;;;22665:21:1;22722:2;22702:18;;;22695:30;22761:34;22741:18;;;22734:62;-1:-1:-1;;;22812:18:1;;;22805:39;22861:19;;20720:83:0;22481:405:1;20720:83:0;20816:30;20863:8;:15;20849:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20849:30:0;;20816:63;;20897:9;20892:122;20916:8;:15;20912:1;:19;20892:122;;;20972:30;20982:8;20991:1;20982:11;;;;;;;;:::i;:::-;;;;;;;20995:3;20999:1;20995:6;;;;;;;;:::i;:::-;;;;;;;20972:9;:30::i;:::-;20953:13;20967:1;20953:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;20933:3;;;:::i;:::-;;;20892:122;;;-1:-1:-1;21033:13:0;20530:524;-1:-1:-1;;;20530:524:0:o;34462:122::-;34519:4;34340:16;;;:12;:16;;;;;;34519:4;;34543:29;:33;;34462:122;-1:-1:-1;;34462:122:0:o;47352:153::-;36370:6;;-1:-1:-1;;;;;36370:6:0;17117:10;36517:23;36509:68;;;;-1:-1:-1;;;36509:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47420:28:0::1;;::::0;;;:13:::1;:28;::::0;;;;:35;;-1:-1:-1;;47420:35:0::1;47451:4;47420:35:::0;;::::1;::::0;;;47464:13:::1;:33:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;47464:33:0::1;::::0;;::::1;::::0;;47352:153::o;36948:103::-;36370:6;;-1:-1:-1;;;;;36370:6:0;17117:10;36517:23;36509:68;;;;-1:-1:-1;;;36509:68:0;;;;;;;:::i;:::-;37013:30:::1;37040:1;37013:18;:30::i;:::-;36948:103::o:0;47825:558::-;36370:6;;-1:-1:-1;;;;;36370:6:0;17117:10;36517:23;36509:68;;;;-1:-1:-1;;;36509:68:0;;;;;;;:::i;:::-;47967:12:::1;:19;47946:10;:17;:40;47938:78;;;;-1:-1:-1::0;;;47938:78:0::1;;;;;;;:::i;:::-;48030:9;48025:288;48049:10;:17;48045:1;:21;48025:288;;;48120:20;48095:10;48106:1;48095:13;;;;;;;;:::i;:::-;;;;;;;:46;;48087:77;;;;-1:-1:-1::0;;;48087:77:0::1;;;;;;;:::i;:::-;48235:11;:26;48247:10;48258:1;48247:13;;;;;;;;:::i;:::-;;;;;;;48235:26;;;;;;;;;;;;48216:12;48229:1;48216:15;;;;;;;;:::i;:::-;;;;;;;48187:26;48199:10;48210:1;48199:13;;;;;;;;:::i;:::-;;;;;;;34313:7:::0;34340:16;;;:12;:16;;;;;;;34251:113;48187:26:::1;:44;;;;:::i;:::-;:74;;48179:122;;;;-1:-1:-1::0;;;48179:122:0::1;;;;;;;:::i;:::-;48068:3:::0;::::1;::::0;::::1;:::i;:::-;;;;48025:288;;;-1:-1:-1::0;48321:54:0::1;17117:10:::0;48346::::1;48358:12;48321:54;;;;;;;;;;;::::0;:10:::1;:54::i;50161:756::-:0;36370:6;;-1:-1:-1;;;;;36370:6:0;17117:10;36517:23;36509:68;;;;-1:-1:-1;;;36509:68:0;;;;;;;:::i;:::-;50340:12:::1;:19;50318:11;:18;:41;50310:75;;;::::0;-1:-1:-1;;;50310:75:0;;21510:2:1;50310:75:0::1;::::0;::::1;21492:21:1::0;21549:2;21529:18;;;21522:30;-1:-1:-1;;;21568:18:1;;;21561:51;21629:18;;50310:75:0::1;21308:345:1::0;50310:75:0::1;50405:12;::::0;::::1;::::0;::::1;;;50404:13;50396:70;;;::::0;-1:-1:-1;;;50396:70:0;;21860:2:1;50396:70:0::1;::::0;::::1;21842:21:1::0;21899:2;21879:18;;;21872:30;21938:34;21918:18;;;21911:62;-1:-1:-1;;;21989:18:1;;;21982:42;22041:19;;50396:70:0::1;21658:408:1::0;50396:70:0::1;50482:9;50477:404;50501:11;:18;50497:1;:22;50477:404;;;50566:1;50548:11;50560:1;50548:14;;;;;;;;:::i;:::-;;;;;;;:19;;50540:50;;;;-1:-1:-1::0;;;50540:50:0::1;;;;;;;:::i;:::-;50639:20;50613:11;50625:1;50613:14;;;;;;;;:::i;:::-;;;;;;;:47;;50605:78;;;;-1:-1:-1::0;;;50605:78:0::1;;;;;;;:::i;:::-;50724:1;50706:12;50719:1;50706:15;;;;;;;;:::i;:::-;;;;;;;:19;50698:45;;;::::0;-1:-1:-1;;;50698:45:0;;23502:2:1;50698:45:0::1;::::0;::::1;23484:21:1::0;23541:2;23521:18;;;23514:30;-1:-1:-1;;;23560:18:1;;;23553:43;23613:18;;50698:45:0::1;23300:337:1::0;50698:45:0::1;50789:12;50802:1;50789:15;;;;;;;;:::i;:::-;;;;;;;50758:12;:28;50771:11;50783:1;50771:14;;;;;;;;:::i;:::-;;;;;;;50758:28;;;;;;;;;;;:46;;;;50849:17;50867:1;50849:20;;;;;;;;:::i;:::-;;;;;;;50819:11;:27;50831:11;50843:1;50831:14;;;;;;;;:::i;:::-;;;;;;;50819:27;;;;;;;;;;;:50;;;;50521:3;;;;;:::i;:::-;;;;50477:404;;;-1:-1:-1::0;;50891:11:0::1;:18:::0;;-1:-1:-1;;50891:18:0::1;50905:4;50891:18;::::0;;-1:-1:-1;;50161:756:0:o;47513:118::-;36370:6;;-1:-1:-1;;;;;36370:6:0;17117:10;36517:23;36509:68;;;;-1:-1:-1;;;36509:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47585:30:0::1;47618:5;47585:30:::0;;;:13:::1;:30;::::0;;;;:38;;-1:-1:-1;;47585:38:0::1;::::0;;47513:118::o;48830:1217::-;48958:13;:20;48936:11;:18;:42;48928:76;;;;-1:-1:-1;;;48928:76:0;;21510:2:1;48928:76:0;;;21492:21:1;21549:2;21529:18;;;21522:30;-1:-1:-1;;;21568:18:1;;;21561:51;21629:18;;48928:76:0;21308:345:1;48928:76:0;49023:11;;;;49015:52;;;;-1:-1:-1;;;49015:52:0;;24246:2:1;49015:52:0;;;24228:21:1;24285:2;24265:18;;;24258:30;24324;24304:18;;;24297:58;24372:18;;49015:52:0;24044:352:1;49015:52:0;49086:12;;;;;;;49078:53;;;;-1:-1:-1;;;49078:53:0;;24246:2:1;49078:53:0;;;24228:21:1;24285:2;24265:18;;;24258:30;24324;24304:18;;;24297:58;24372:18;;49078:53:0;24044:352:1;49078:53:0;49150:35;17117:10;49150:21;:35::i;:::-;49142:77;;;;-1:-1:-1;;;49142:77:0;;16048:2:1;49142:77:0;;;16030:21:1;16087:2;16067:18;;;16060:30;16126:31;16106:18;;;16099:59;16175:18;;49142:77:0;15846:353:1;49142:77:0;49230:18;49263:19;49302:9;49297:550;49321:11;:18;49317:1;:22;49297:550;;;49387:1;49368:13;49382:1;49368:16;;;;;;;;:::i;:::-;;;;;;;:20;49360:55;;;;-1:-1:-1;;;49360:55:0;;19208:2:1;49360:55:0;;;19190:21:1;19247:2;19227:18;;;19220:30;-1:-1:-1;;;19266:18:1;;;19259:52;19328:18;;49360:55:0;19006:346:1;49360:55:0;49456:1;49438:11;49450:1;49438:14;;;;;;;;:::i;:::-;;;;;;;:19;;49430:50;;;;-1:-1:-1;;;49430:50:0;;;;;;;:::i;:::-;49529:20;49503:11;49515:1;49503:14;;;;;;;;:::i;:::-;;;;;;;:47;;49495:78;;;;-1:-1:-1;;;49495:78:0;;;;;;;:::i;:::-;49646:11;:27;49658:11;49670:1;49658:14;;;;;;;;:::i;:::-;;;;;;;49646:27;;;;;;;;;;;;49626:13;49640:1;49626:16;;;;;;;;:::i;:::-;;;;;;;49596:27;49608:11;49620:1;49608:14;;;;;;;;:::i;49596:27::-;:46;;;;:::i;:::-;:77;;49588:125;;;;-1:-1:-1;;;49588:125:0;;;;;;;:::i;:::-;49773:13;49787:1;49773:16;;;;;;;;:::i;:::-;;;;;;;49742:12;:28;49755:11;49767:1;49755:14;;;;;;;;:::i;:::-;;;;;;;49742:28;;;;;;;;;;;;:47;;;;:::i;:::-;49728:61;;;;:::i;:::-;;;49819:13;49833:1;49819:16;;;;;;;;:::i;:::-;;;;;;;49804:31;;;;;:::i;:::-;;-1:-1:-1;49341:3:0;;;;:::i;:::-;;;;49297:550;;;-1:-1:-1;49857:3:0;;-1:-1:-1;;;;;49857:3:0;:12;17117:10;49857:38;;-1:-1:-1;;;;;;49857:38:0;;;;;;;-1:-1:-1;;;;;13166:32:1;;;49857:38:0;;;13148:51:1;13215:18;;;13208:34;;;13121:18;;49857:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49908:56;49919:12;17117:10;;17037:98;49919:12;49933:11;49946:13;49908:56;;;;;;;;;;;;:10;:56::i;:::-;49982:57;17117:10;50020:18;;49982:57;;;-1:-1:-1;;;;;13473:32:1;;;13455:51;;13537:2;13522:18;;13515:34;;;13565:18;;13558:34;13443:2;13428:18;49982:57:0;;;;;;;48917:1130;;48830:1217;;:::o;47732:85::-;47771:13;47802:7;47795:14;;;;;:::i;21127:155::-;21222:52;17117:10;21255:8;21265;21222:18;:52::i;45263:30::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45263:30:0;;-1:-1:-1;45263:30:0;:::o;48391:431::-;36370:6;;-1:-1:-1;;;;;36370:6:0;17117:10;36517:23;36509:68;;;;-1:-1:-1;;;36509:68:0;;;;;;;:::i;:::-;48550:10:::1;:17;48530:9;:16;:37;48522:75;;;;-1:-1:-1::0;;;48522:75:0::1;;;;;;;:::i;:::-;48635:12;:19;48614:10;:17;:40;48606:78;;;;-1:-1:-1::0;;;48606:78:0::1;;;;;;;:::i;:::-;48698:9;48693:122;48717:9;:16;48713:1;:20;48693:122;;;48750:55;48756:9;48766:1;48756:12;;;;;;;;:::i;:::-;;;;;;;48770:10;48781:1;48770:13;;;;;;;;:::i;:::-;;;;;;;48785:12;48798:1;48785:15;;;;;;;;:::i;:::-;;;;;;;48750:55;;;;;;;;;;;::::0;:5:::1;:55::i;:::-;48735:3:::0;::::1;::::0;::::1;:::i;:::-;;;;48693:122;;;;48391:431:::0;;;:::o;46617:335::-;-1:-1:-1;;;;;46751:20:0;;17117:10;46751:20;;:60;;-1:-1:-1;46775:36:0;46792:4;17117:10;21354:168;:::i;46775:36::-;46751:91;;;-1:-1:-1;17117:10:0;46815:27;;;;:13;:27;;;;;;;;46751:91;46743:145;;;;-1:-1:-1;;;46743:145:0;;18394:2:1;46743:145:0;;;18376:21:1;18433:2;18413:18;;;18406:30;18472:34;18452:18;;;18445:62;-1:-1:-1;;;18523:18:1;;;18516:39;18572:19;;46743:145:0;18192:405:1;46743:145:0;46899:45;46917:4;46923:2;46927;46931:6;46939:4;46899:17;:45::i;37206:201::-;36370:6;;-1:-1:-1;;;;;36370:6:0;17117:10;36517:23;36509:68;;;;-1:-1:-1;;;36509:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37295:22:0;::::1;37287:73;;;::::0;-1:-1:-1;;;37287:73:0;;17227:2:1;37287:73:0::1;::::0;::::1;17209:21:1::0;17266:2;17246:18;;;17239:30;17305:34;17285:18;;;17278:62;-1:-1:-1;;;17356:18:1;;;17349:36;17402:19;;37287:73:0::1;17025:402:1::0;37287:73:0::1;37371:28;37390:8;37371:18;:28::i;:::-;37206:201:::0;:::o;51155:143::-;36370:6;;-1:-1:-1;;;;;36370:6:0;17117:10;36517:23;36509:68;;;;-1:-1:-1;;;36509:68:0;;;;;;;:::i;:::-;51247:20:::1;:43:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;51247:43:0;;::::1;::::0;;;::::1;::::0;;51155:143::o;42817:723::-;42873:13;43094:10;43090:53;;-1:-1:-1;;43121:10:0;;;;;;;;;;;;-1:-1:-1;;;43121:10:0;;;;;42817:723::o;43090:53::-;43168:5;43153:12;43209:78;43216:9;;43209:78;;43242:8;;;;:::i;:::-;;-1:-1:-1;43265:10:0;;-1:-1:-1;43273:2:0;43265:10;;:::i;:::-;;;43209:78;;;43297:19;43329:6;43319:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43319:17:0;;43297:39;;43347:154;43354:10;;43347:154;;43381:11;43391:1;43381:11;;:::i;:::-;;-1:-1:-1;43450:10:0;43458:2;43450:5;:10;:::i;:::-;43437:24;;:2;:24;:::i;:::-;43424:39;;43407:6;43414;43407:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;43407:56:0;;;;;;;;-1:-1:-1;43478:11:0;43487:2;43478:11;;:::i;:::-;;;43347:154;;;43525:6;42817:723;-1:-1:-1;;;;42817:723:0:o;24156:1074::-;24383:7;:14;24369:3;:10;:28;24361:81;;;;-1:-1:-1;;;24361:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24461:16:0;;24453:66;;;;-1:-1:-1;;;24453:66:0;;;;;;;:::i;:::-;17117:10;24576:60;17117:10;24607:4;24613:2;24617:3;24622:7;24631:4;24576:20;:60::i;:::-;24654:9;24649:421;24673:3;:10;24669:1;:14;24649:421;;;24705:10;24718:3;24722:1;24718:6;;;;;;;;:::i;:::-;;;;;;;24705:19;;24739:14;24756:7;24764:1;24756:10;;;;;;;;:::i;:::-;;;;;;;;;;;;24783:19;24805:13;;;;;;;;;;-1:-1:-1;;;;;24805:19:0;;;;;;;;;;;;24756:10;;-1:-1:-1;24847:21:0;;;;24839:76;;;;-1:-1:-1;;;24839:76:0;;;;;;;:::i;:::-;24959:9;:13;;;;;;;;;;;-1:-1:-1;;;;;24959:19:0;;;;;;;;;;24981:20;;;24959:42;;25031:17;;;;;;;:27;;24981:20;;24959:9;25031:27;;24981:20;;25031:27;:::i;:::-;;;;;;;;24690:380;;;24685:3;;;;:::i;:::-;;;24649:421;;;;25117:2;-1:-1:-1;;;;;25087:47:0;25111:4;-1:-1:-1;;;;;25087:47:0;25101:8;-1:-1:-1;;;;;25087:47:0;;25121:3;25126:7;25087:47;;;;;;;:::i;:::-;;;;;;;;25147:75;25183:8;25193:4;25199:2;25203:3;25208:7;25217:4;25147:35;:75::i;:::-;24350:880;24156:1074;;;;;:::o;37567:191::-;37660:6;;;-1:-1:-1;;;;;37677:17:0;;;-1:-1:-1;;;;;;37677:17:0;;;;;;;37710:40;;37660:6;;;37677:17;37660:6;;37710:40;;37641:16;;37710:40;37630:128;37567:191;:::o;27473:735::-;-1:-1:-1;;;;;27651:16:0;;27643:62;;;;-1:-1:-1;;;27643:62:0;;;;;;;:::i;:::-;27738:7;:14;27724:3;:10;:28;27716:81;;;;-1:-1:-1;;;27716:81:0;;;;;;;:::i;:::-;17117:10;27854:66;17117:10;27810:16;27897:2;27901:3;27906:7;27915:4;27854:20;:66::i;:::-;27938:9;27933:103;27957:3;:10;27953:1;:14;27933:103;;;28014:7;28022:1;28014:10;;;;;;;;:::i;:::-;;;;;;;27989:9;:17;27999:3;28003:1;27999:6;;;;;;;;:::i;:::-;;;;;;;27989:17;;;;;;;;;;;:21;28007:2;-1:-1:-1;;;;;27989:21:0;-1:-1:-1;;;;;27989:21:0;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;27969:3:0;;-1:-1:-1;27969:3:0;;;:::i;:::-;;;;27933:103;;;;28089:2;-1:-1:-1;;;;;28053:53:0;28085:1;-1:-1:-1;;;;;28053:53:0;28067:8;-1:-1:-1;;;;;28053:53:0;;28093:3;28098:7;28053:53;;;;;;;:::i;:::-;;;;;;;;28119:81;28155:8;28173:1;28177:2;28181:3;28186:7;28195:4;28119:35;:81::i;50925:222::-;51013:20;;50993:4;;51013:20;;;;;51008:38;;-1:-1:-1;51042:4:0;;50925:222;-1:-1:-1;50925:222:0:o;51008:38::-;51059:7;;:23;;-1:-1:-1;;;51059:23:0;;-1:-1:-1;;;;;11534:32:1;;;51059:23:0;;;11516:51:1;51085:1:0;;51059:7;;:17;;11489:18:1;;51059:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:27;51055:44;;;-1:-1:-1;51095:4:0;;50925:222;-1:-1:-1;50925:222:0:o;51055:44::-;51115:4;;:20;;-1:-1:-1;;;51115:20:0;;-1:-1:-1;;;;;11534:32:1;;;51115:20:0;;;11516:51:1;51138:1:0;;51115:4;;:14;;11489:18:1;;51115:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;30342:331::-;30497:8;-1:-1:-1;;;;;30488:17:0;:5;-1:-1:-1;;;;;30488:17:0;;;30480:71;;;;-1:-1:-1;;;30480:71:0;;22273:2:1;30480:71:0;;;22255:21:1;22312:2;22292:18;;;22285:30;22351:34;22331:18;;;22324:62;-1:-1:-1;;;22402:18:1;;;22395:39;22451:19;;30480:71:0;22071:405:1;30480:71:0;-1:-1:-1;;;;;30562:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;30562:46:0;;;;;;;;;;30624:41;;14479::1;;;30624::0;;14452:18:1;30624:41:0;;;;;;;30342:331;;;:::o;26548:569::-;-1:-1:-1;;;;;26701:16:0;;26693:62;;;;-1:-1:-1;;;26693:62:0;;;;;;;:::i;:::-;17117:10;26812:102;17117:10;26768:16;26855:2;26859:21;26877:2;26859:17;:21::i;:::-;26882:25;26900:6;26882:17;:25::i;:::-;26909:4;26812:20;:102::i;:::-;26927:9;:13;;;;;;;;;;;-1:-1:-1;;;;;26927:17:0;;;;;;;;;:27;;26948:6;;26927:9;:27;;26948:6;;26927:27;:::i;:::-;;;;-1:-1:-1;;26970:52:0;;;24757:25:1;;;24813:2;24798:18;;24791:34;;;-1:-1:-1;;;;;26970:52:0;;;;27003:1;;26970:52;;;;;;24730:18:1;26970:52:0;;;;;;;27035:74;27066:8;27084:1;27088:2;27092;27096:6;27104:4;27035:30;:74::i;22978:820::-;-1:-1:-1;;;;;23166:16:0;;23158:66;;;;-1:-1:-1;;;23158:66:0;;;;;;;:::i;:::-;17117:10;23281:96;17117:10;23312:4;23318:2;23322:21;23340:2;23322:17;:21::i;23281:96::-;23390:19;23412:13;;;;;;;;;;;-1:-1:-1;;;;;23412:19:0;;;;;;;;;;23450:21;;;;23442:76;;;;-1:-1:-1;;;23442:76:0;;;;;;;:::i;:::-;23554:9;:13;;;;;;;;;;;-1:-1:-1;;;;;23554:19:0;;;;;;;;;;23576:20;;;23554:42;;23618:17;;;;;;;:27;;23576:20;;23554:9;23618:27;;23576:20;;23618:27;:::i;:::-;;;;-1:-1:-1;;23663:46:0;;;24757:25:1;;;24813:2;24798:18;;24791:34;;;-1:-1:-1;;;;;23663:46:0;;;;;;;;;;;;;;24730:18:1;23663:46:0;;;;;;;23722:68;23753:8;23763:4;23769:2;23773;23777:6;23785:4;23722:30;:68::i;:::-;23147:651;;22978:820;;;;;:::o;51836:392::-;52075:66;52102:8;52112:4;52118:2;52122:3;52127:7;52136:4;52075:26;:66::i;:::-;52163:8;;;;;;;52162:9;52154:66;;;;-1:-1:-1;;;52154:66:0;;17981:2:1;52154:66:0;;;17963:21:1;18020:2;18000:18;;;17993:30;18059:34;18039:18;;;18032:62;-1:-1:-1;;;18110:18:1;;;18103:42;18162:19;;52154:66:0;17779:408:1;32610:813:0;-1:-1:-1;;;;;32850:13:0;;9466:19;:23;32846:570;;32886:79;;-1:-1:-1;;;32886:79:0;;-1:-1:-1;;;;;32886:43:0;;;;;:79;;32930:8;;32940:4;;32946:3;;32951:7;;32960:4;;32886:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32886:79:0;;;;;;;;-1:-1:-1;;32886:79:0;;;;;;;;;;;;:::i;:::-;;;32882:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;33278:6;33271:14;;-1:-1:-1;;;33271:14:0;;;;;;;;:::i;32882:523::-;;;33327:62;;-1:-1:-1;;;33327:62:0;;15627:2:1;33327:62:0;;;15609:21:1;15666:2;15646:18;;;15639:30;15705:34;15685:18;;;15678:62;-1:-1:-1;;;15756:18:1;;;15749:50;15816:19;;33327:62:0;15425:416:1;32882:523:0;-1:-1:-1;;;;;;33047:60:0;;-1:-1:-1;;;33047:60:0;33043:159;;33132:50;;-1:-1:-1;;;33132:50:0;;;;;;;:::i;33431:198::-;33551:16;;;33565:1;33551:16;;;;;;;;;33497;;33526:22;;33551:16;;;;;;;;;;;;-1:-1:-1;33551:16:0;33526:41;;33589:7;33578:5;33584:1;33578:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;33616:5;33431:198;-1:-1:-1;;33431:198:0:o;31858:744::-;-1:-1:-1;;;;;32073:13:0;;9466:19;:23;32069:526;;32109:72;;-1:-1:-1;;;32109:72:0;;-1:-1:-1;;;;;32109:38:0;;;;;:72;;32148:8;;32158:4;;32164:2;;32168:6;;32176:4;;32109:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32109:72:0;;;;;;;;-1:-1:-1;;32109:72:0;;;;;;;;;;;;:::i;:::-;;;32105:479;;;;:::i;:::-;-1:-1:-1;;;;;;32231:55:0;;-1:-1:-1;;;32231:55:0;32227:154;;32311:50;;-1:-1:-1;;;32311:50:0;;;;;;;:::i;34659:655::-;-1:-1:-1;;;;;34981:18:0;;34977:160;;35021:9;35016:110;35040:3;:10;35036:1;:14;35016:110;;;35100:7;35108:1;35100:10;;;;;;;;:::i;:::-;;;;;;;35076:12;:20;35089:3;35093:1;35089:6;;;;;;;;:::i;:::-;;;;;;;35076:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;35052:3:0;;-1:-1:-1;35052:3:0;;:::i;:::-;;;35016:110;;;;34977:160;-1:-1:-1;;;;;35153:16:0;;35149:158;;35191:9;35186:110;35210:3;:10;35206:1;:14;35186:110;;;35270:7;35278:1;35270:10;;;;;;;;:::i;:::-;;;;;;;35246:12;:20;35259:3;35263:1;35259:6;;;;;;;;:::i;:::-;;;;;;;35246:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;35222:3:0;;-1:-1:-1;35222:3:0;;:::i;:::-;;;35186:110;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:741::-;246:5;299:3;292:4;284:6;280:17;276:27;266:55;;317:1;314;307:12;266:55;353:6;340:20;379:4;402:43;442:2;402:43;:::i;:::-;474:2;468:9;486:31;514:2;506:6;486:31;:::i;:::-;552:18;;;586:15;;;;-1:-1:-1;621:15:1;;;671:1;667:10;;;655:23;;651:32;;648:41;-1:-1:-1;645:61:1;;;702:1;699;692:12;645:61;724:1;734:169;748:2;745:1;742:9;734:169;;;805:23;824:3;805:23;:::i;:::-;793:36;;849:12;;;;881;;;;766:1;759:9;734:169;;;-1:-1:-1;921:6:1;;192:741;-1:-1:-1;;;;;;;192:741:1:o;938:735::-;992:5;1045:3;1038:4;1030:6;1026:17;1022:27;1012:55;;1063:1;1060;1053:12;1012:55;1099:6;1086:20;1125:4;1148:43;1188:2;1148:43;:::i;:::-;1220:2;1214:9;1232:31;1260:2;1252:6;1232:31;:::i;:::-;1298:18;;;1332:15;;;;-1:-1:-1;1367:15:1;;;1417:1;1413:10;;;1401:23;;1397:32;;1394:41;-1:-1:-1;1391:61:1;;;1448:1;1445;1438:12;1391:61;1470:1;1480:163;1494:2;1491:1;1488:9;1480:163;;;1551:17;;1539:30;;1589:12;;;;1621;;;;1512:1;1505:9;1480:163;;1678:160;1743:20;;1799:13;;1792:21;1782:32;;1772:60;;1828:1;1825;1818:12;1843:555;1885:5;1938:3;1931:4;1923:6;1919:17;1915:27;1905:55;;1956:1;1953;1946:12;1905:55;1992:6;1979:20;2018:18;2014:2;2011:26;2008:52;;;2040:18;;:::i;:::-;2089:2;2083:9;2101:67;2156:2;2137:13;;-1:-1:-1;;2133:27:1;2162:4;2129:38;2083:9;2101:67;:::i;:::-;2192:2;2184:6;2177:18;2238:3;2231:4;2226:2;2218:6;2214:15;2210:26;2207:35;2204:55;;;2255:1;2252;2245:12;2204:55;2319:2;2312:4;2304:6;2300:17;2293:4;2285:6;2281:17;2268:54;2366:1;2342:15;;;2359:4;2338:26;2331:37;;;;2346:6;1843:555;-1:-1:-1;;;1843:555:1:o;2403:186::-;2462:6;2515:2;2503:9;2494:7;2490:23;2486:32;2483:52;;;2531:1;2528;2521:12;2483:52;2554:29;2573:9;2554:29;:::i;:::-;2544:39;2403:186;-1:-1:-1;;;2403:186:1:o;2594:260::-;2662:6;2670;2723:2;2711:9;2702:7;2698:23;2694:32;2691:52;;;2739:1;2736;2729:12;2691:52;2762:29;2781:9;2762:29;:::i;:::-;2752:39;;2810:38;2844:2;2833:9;2829:18;2810:38;:::i;:::-;2800:48;;2594:260;;;;;:::o;2859:943::-;3013:6;3021;3029;3037;3045;3098:3;3086:9;3077:7;3073:23;3069:33;3066:53;;;3115:1;3112;3105:12;3066:53;3138:29;3157:9;3138:29;:::i;:::-;3128:39;;3186:38;3220:2;3209:9;3205:18;3186:38;:::i;:::-;3176:48;;3275:2;3264:9;3260:18;3247:32;3298:18;3339:2;3331:6;3328:14;3325:34;;;3355:1;3352;3345:12;3325:34;3378:61;3431:7;3422:6;3411:9;3407:22;3378:61;:::i;:::-;3368:71;;3492:2;3481:9;3477:18;3464:32;3448:48;;3521:2;3511:8;3508:16;3505:36;;;3537:1;3534;3527:12;3505:36;3560:63;3615:7;3604:8;3593:9;3589:24;3560:63;:::i;:::-;3550:73;;3676:3;3665:9;3661:19;3648:33;3632:49;;3706:2;3696:8;3693:16;3690:36;;;3722:1;3719;3712:12;3690:36;;3745:51;3788:7;3777:8;3766:9;3762:24;3745:51;:::i;:::-;3735:61;;;2859:943;;;;;;;;:::o;3807:606::-;3911:6;3919;3927;3935;3943;3996:3;3984:9;3975:7;3971:23;3967:33;3964:53;;;4013:1;4010;4003:12;3964:53;4036:29;4055:9;4036:29;:::i;:::-;4026:39;;4084:38;4118:2;4107:9;4103:18;4084:38;:::i;:::-;4074:48;;4169:2;4158:9;4154:18;4141:32;4131:42;;4220:2;4209:9;4205:18;4192:32;4182:42;;4275:3;4264:9;4260:19;4247:33;4303:18;4295:6;4292:30;4289:50;;;4335:1;4332;4325:12;4289:50;4358:49;4399:7;4390:6;4379:9;4375:22;4358:49;:::i;4418:254::-;4483:6;4491;4544:2;4532:9;4523:7;4519:23;4515:32;4512:52;;;4560:1;4557;4550:12;4512:52;4583:29;4602:9;4583:29;:::i;:::-;4573:39;;4631:35;4662:2;4651:9;4647:18;4631:35;:::i;4677:254::-;4745:6;4753;4806:2;4794:9;4785:7;4781:23;4777:32;4774:52;;;4822:1;4819;4812:12;4774:52;4845:29;4864:9;4845:29;:::i;:::-;4835:39;4921:2;4906:18;;;;4893:32;;-1:-1:-1;;;4677:254:1:o;4936:595::-;5054:6;5062;5115:2;5103:9;5094:7;5090:23;5086:32;5083:52;;;5131:1;5128;5121:12;5083:52;5171:9;5158:23;5200:18;5241:2;5233:6;5230:14;5227:34;;;5257:1;5254;5247:12;5227:34;5280:61;5333:7;5324:6;5313:9;5309:22;5280:61;:::i;:::-;5270:71;;5394:2;5383:9;5379:18;5366:32;5350:48;;5423:2;5413:8;5410:16;5407:36;;;5439:1;5436;5429:12;5407:36;;5462:63;5517:7;5506:8;5495:9;5491:24;5462:63;:::i;:::-;5452:73;;;4936:595;;;;;:::o;5536:821::-;5688:6;5696;5704;5757:2;5745:9;5736:7;5732:23;5728:32;5725:52;;;5773:1;5770;5763:12;5725:52;5813:9;5800:23;5842:18;5883:2;5875:6;5872:14;5869:34;;;5899:1;5896;5889:12;5869:34;5922:61;5975:7;5966:6;5955:9;5951:22;5922:61;:::i;:::-;5912:71;;6036:2;6025:9;6021:18;6008:32;5992:48;;6065:2;6055:8;6052:16;6049:36;;;6081:1;6078;6071:12;6049:36;6104:63;6159:7;6148:8;6137:9;6133:24;6104:63;:::i;:::-;6094:73;;6220:2;6209:9;6205:18;6192:32;6176:48;;6249:2;6239:8;6236:16;6233:36;;;6265:1;6262;6255:12;6233:36;;6288:63;6343:7;6332:8;6321:9;6317:24;6288:63;:::i;:::-;6278:73;;;5536:821;;;;;:::o;6362:595::-;6480:6;6488;6541:2;6529:9;6520:7;6516:23;6512:32;6509:52;;;6557:1;6554;6547:12;6509:52;6597:9;6584:23;6626:18;6667:2;6659:6;6656:14;6653:34;;;6683:1;6680;6673:12;6653:34;6706:61;6759:7;6750:6;6739:9;6735:22;6706:61;:::i;6962:821::-;7114:6;7122;7130;7183:2;7171:9;7162:7;7158:23;7154:32;7151:52;;;7199:1;7196;7189:12;7151:52;7239:9;7226:23;7268:18;7309:2;7301:6;7298:14;7295:34;;;7325:1;7322;7315:12;7295:34;7348:61;7401:7;7392:6;7381:9;7377:22;7348:61;:::i;7788:180::-;7844:6;7897:2;7885:9;7876:7;7872:23;7868:32;7865:52;;;7913:1;7910;7903:12;7865:52;7936:26;7952:9;7936:26;:::i;7973:245::-;8031:6;8084:2;8072:9;8063:7;8059:23;8055:32;8052:52;;;8100:1;8097;8090:12;8052:52;8139:9;8126:23;8158:30;8182:5;8158:30;:::i;8223:249::-;8292:6;8345:2;8333:9;8324:7;8320:23;8316:32;8313:52;;;8361:1;8358;8351:12;8313:52;8393:9;8387:16;8412:30;8436:5;8412:30;:::i;8477:180::-;8536:6;8589:2;8577:9;8568:7;8564:23;8560:32;8557:52;;;8605:1;8602;8595:12;8557:52;-1:-1:-1;8628:23:1;;8477:180;-1:-1:-1;8477:180:1:o;8662:184::-;8732:6;8785:2;8773:9;8764:7;8760:23;8756:32;8753:52;;;8801:1;8798;8791:12;8753:52;-1:-1:-1;8824:16:1;;8662:184;-1:-1:-1;8662:184:1:o;8851:435::-;8904:3;8942:5;8936:12;8969:6;8964:3;8957:19;8995:4;9024:2;9019:3;9015:12;9008:19;;9061:2;9054:5;9050:14;9082:1;9092:169;9106:6;9103:1;9100:13;9092:169;;;9167:13;;9155:26;;9201:12;;;;9236:15;;;;9128:1;9121:9;9092:169;;;-1:-1:-1;9277:3:1;;8851:435;-1:-1:-1;;;;;8851:435:1:o;9291:257::-;9332:3;9370:5;9364:12;9397:6;9392:3;9385:19;9413:63;9469:6;9462:4;9457:3;9453:14;9446:4;9439:5;9435:16;9413:63;:::i;:::-;9530:2;9509:15;-1:-1:-1;;9505:29:1;9496:39;;;;9537:4;9492:50;;9291:257;-1:-1:-1;;9291:257:1:o;9553:185::-;9595:3;9633:5;9627:12;9648:52;9693:6;9688:3;9681:4;9674:5;9670:16;9648:52;:::i;:::-;9716:16;;;;;9553:185;-1:-1:-1;;9553:185:1:o;9743:443::-;9975:3;10013:6;10007:13;10029:53;10075:6;10070:3;10063:4;10055:6;10051:17;10029:53;:::i;:::-;-1:-1:-1;;;10104:16:1;;10129:22;;;-1:-1:-1;10178:1:1;10167:13;;9743:443;-1:-1:-1;9743:443:1:o;10191:1174::-;10367:3;10396:1;10429:6;10423:13;10459:3;10481:1;10509:9;10505:2;10501:18;10491:28;;10569:2;10558:9;10554:18;10591;10581:61;;10635:4;10627:6;10623:17;10613:27;;10581:61;10661:2;10709;10701:6;10698:14;10678:18;10675:38;10672:165;;;-1:-1:-1;;;10736:33:1;;10792:4;10789:1;10782:15;10822:4;10743:3;10810:17;10672:165;10853:18;10880:104;;;;10998:1;10993:320;;;;10846:467;;10880:104;-1:-1:-1;;10913:24:1;;10901:37;;10958:16;;;;-1:-1:-1;10880:104:1;;10993:320;25097:1;25090:14;;;25134:4;25121:18;;11088:1;11102:165;11116:6;11113:1;11110:13;11102:165;;;11194:14;;11181:11;;;11174:35;11237:16;;;;11131:10;;11102:165;;;11106:3;;11296:6;11291:3;11287:16;11280:23;;10846:467;;;;;;;11329:30;11355:3;11347:6;11329:30;:::i;:::-;11322:37;10191:1174;-1:-1:-1;;;;;10191:1174:1:o;11578:826::-;-1:-1:-1;;;;;11975:15:1;;;11957:34;;12027:15;;12022:2;12007:18;;12000:43;11937:3;12074:2;12059:18;;12052:31;;;11900:4;;12106:57;;12143:19;;12135:6;12106:57;:::i;:::-;12211:9;12203:6;12199:22;12194:2;12183:9;12179:18;12172:50;12245:44;12282:6;12274;12245:44;:::i;:::-;12231:58;;12338:9;12330:6;12326:22;12320:3;12309:9;12305:19;12298:51;12366:32;12391:6;12383;12366:32;:::i;:::-;12358:40;11578:826;-1:-1:-1;;;;;;;;11578:826:1:o;12409:560::-;-1:-1:-1;;;;;12706:15:1;;;12688:34;;12758:15;;12753:2;12738:18;;12731:43;12805:2;12790:18;;12783:34;;;12848:2;12833:18;;12826:34;;;12668:3;12891;12876:19;;12869:32;;;12631:4;;12918:45;;12943:19;;12935:6;12918:45;:::i;:::-;12910:53;12409:560;-1:-1:-1;;;;;;;12409:560:1:o;13603:261::-;13782:2;13771:9;13764:21;13745:4;13802:56;13854:2;13843:9;13839:18;13831:6;13802:56;:::i;13869:465::-;14126:2;14115:9;14108:21;14089:4;14152:56;14204:2;14193:9;14189:18;14181:6;14152:56;:::i;:::-;14256:9;14248:6;14244:22;14239:2;14228:9;14224:18;14217:50;14284:44;14321:6;14313;14284:44;:::i;15201:219::-;15350:2;15339:9;15332:21;15313:4;15370:44;15410:2;15399:9;15395:18;15387:6;15370:44;:::i;16204:404::-;16406:2;16388:21;;;16445:2;16425:18;;;16418:30;16484:34;16479:2;16464:18;;16457:62;-1:-1:-1;;;16550:2:1;16535:18;;16528:38;16598:3;16583:19;;16204:404::o;17432:342::-;17634:2;17616:21;;;17673:2;17653:18;;;17646:30;-1:-1:-1;;;17707:2:1;17692:18;;17685:48;17765:2;17750:18;;17432:342::o;18602:399::-;18804:2;18786:21;;;18843:2;18823:18;;;18816:30;18882:34;18877:2;18862:18;;18855:62;-1:-1:-1;;;18948:2:1;18933:18;;18926:33;18991:3;18976:19;;18602:399::o;19357:401::-;19559:2;19541:21;;;19598:2;19578:18;;;19571:30;19637:34;19632:2;19617:18;;19610:62;-1:-1:-1;;;19703:2:1;19688:18;;19681:35;19748:3;19733:19;;19357:401::o;20182:406::-;20384:2;20366:21;;;20423:2;20403:18;;;20396:30;20462:34;20457:2;20442:18;;20435:62;-1:-1:-1;;;20528:2:1;20513:18;;20506:40;20578:3;20563:19;;20182:406::o;20593:349::-;20795:2;20777:21;;;20834:2;20814:18;;;20807:30;20873:27;20868:2;20853:18;;20846:55;20933:2;20918:18;;20593:349::o;20947:356::-;21149:2;21131:21;;;21168:18;;;21161:30;21227:34;21222:2;21207:18;;21200:62;21294:2;21279:18;;20947:356::o;22891:404::-;23093:2;23075:21;;;23132:2;23112:18;;;23105:30;23171:34;23166:2;23151:18;;23144:62;-1:-1:-1;;;23237:2:1;23222:18;;23215:38;23285:3;23270:19;;22891:404::o;23642:397::-;23844:2;23826:21;;;23883:2;23863:18;;;23856:30;23922:34;23917:2;23902:18;;23895:62;-1:-1:-1;;;23988:2:1;23973:18;;23966:31;24029:3;24014:19;;23642:397::o;24836:183::-;24896:4;24929:18;24921:6;24918:30;24915:56;;;24951:18;;:::i;:::-;-1:-1:-1;24996:1:1;24992:14;25008:4;24988:25;;24836:183::o;25150:128::-;25190:3;25221:1;25217:6;25214:1;25211:13;25208:39;;;25227:18;;:::i;:::-;-1:-1:-1;25263:9:1;;25150:128::o;25283:120::-;25323:1;25349;25339:35;;25354:18;;:::i;:::-;-1:-1:-1;25388:9:1;;25283:120::o;25408:168::-;25448:7;25514:1;25510;25506:6;25502:14;25499:1;25496:21;25491:1;25484:9;25477:17;25473:45;25470:71;;;25521:18;;:::i;:::-;-1:-1:-1;25561:9:1;;25408:168::o;25581:125::-;25621:4;25649:1;25646;25643:8;25640:34;;;25654:18;;:::i;:::-;-1:-1:-1;25691:9:1;;25581:125::o;25711:258::-;25783:1;25793:113;25807:6;25804:1;25801:13;25793:113;;;25883:11;;;25877:18;25864:11;;;25857:39;25829:2;25822:10;25793:113;;;25924:6;25921:1;25918:13;25915:48;;;-1:-1:-1;;25959:1:1;25941:16;;25934:27;25711:258::o;25974:380::-;26053:1;26049:12;;;;26096;;;26117:61;;26171:4;26163:6;26159:17;26149:27;;26117:61;26224:2;26216:6;26213:14;26193:18;26190:38;26187:161;;;26270:10;26265:3;26261:20;26258:1;26251:31;26305:4;26302:1;26295:15;26333:4;26330:1;26323:15;26187:161;;25974:380;;;:::o;26359:249::-;26469:2;26450:13;;-1:-1:-1;;26446:27:1;26434:40;;26504:18;26489:34;;26525:22;;;26486:62;26483:88;;;26551:18;;:::i;:::-;26587:2;26580:22;-1:-1:-1;;26359:249:1:o;26613:135::-;26652:3;-1:-1:-1;;26673:17:1;;26670:43;;;26693:18;;:::i;:::-;-1:-1:-1;26740:1:1;26729:13;;26613:135::o;26753:112::-;26785:1;26811;26801:35;;26816:18;;:::i;:::-;-1:-1:-1;26850:9:1;;26753:112::o;26870:127::-;26931:10;26926:3;26922:20;26919:1;26912:31;26962:4;26959:1;26952:15;26986:4;26983:1;26976:15;27002:127;27063:10;27058:3;27054:20;27051:1;27044:31;27094:4;27091:1;27084:15;27118:4;27115:1;27108:15;27266:127;27327:10;27322:3;27318:20;27315:1;27308:31;27358:4;27355:1;27348:15;27382:4;27379:1;27372:15;27398:127;27459:10;27454:3;27450:20;27447:1;27440:31;27490:4;27487:1;27480:15;27514:4;27511:1;27504:15;27530:179;27565:3;27607:1;27589:16;27586:23;27583:120;;;27653:1;27650;27647;27632:23;-1:-1:-1;27690:1:1;27684:8;27679:3;27675:18;27583:120;27530:179;:::o;27714:671::-;27753:3;27795:4;27777:16;27774:26;27771:39;;;27714:671;:::o;27771:39::-;27837:2;27831:9;-1:-1:-1;;27902:16:1;27898:25;;27895:1;27831:9;27874:50;27953:4;27947:11;27977:16;28012:18;28083:2;28076:4;28068:6;28064:17;28061:25;28056:2;28048:6;28045:14;28042:45;28039:58;;;28090:5;;;;;27714:671;:::o;28039:58::-;28127:6;28121:4;28117:17;28106:28;;28163:3;28157:10;28190:2;28182:6;28179:14;28176:27;;;28196:5;;;;;;27714:671;:::o;28176:27::-;28280:2;28261:16;28255:4;28251:27;28247:36;28240:4;28231:6;28226:3;28222:16;28218:27;28215:69;28212:82;;;28287:5;;;;;;27714:671;:::o;28212:82::-;28303:57;28354:4;28345:6;28337;28333:19;28329:30;28323:4;28303:57;:::i;:::-;-1:-1:-1;28376:3:1;;27714:671;-1:-1:-1;;;;;27714:671:1:o;28390:131::-;-1:-1:-1;;;;;;28464:32:1;;28454:43;;28444:71;;28511:1;28508;28501:12

Swarm Source

ipfs://35dfffc7e937bca056c29a208a0736f628d51a95c18fff5181c68928d4008ded
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.