ETH Price: $2,408.75 (+2.97%)

Token

 

Overview

Max Total Supply

236

Holders

127

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
pop8: Deployer
0xbd9f8735980ca642d9a6df8899bb1430c32ebf67
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
MintPass

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-26
*/

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

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.1;

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

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

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

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

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}


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

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


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

// 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;
}


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

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


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

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


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

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


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

// 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;
    }
}


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

// 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;
    }
}


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

// 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;
    }
}


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

// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}


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

// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Pausable.sol)

/**
 * @dev ERC1155 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 *
 * _Available since v3.1._
 */
abstract contract ERC1155Pausable is ERC1155, Pausable {
    /**
     * @dev See {ERC1155-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    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(!paused(), "ERC1155Pausable: token transfer while paused");
    }
}


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

// 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];
            }
        }
    }
}


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

// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Burnable.sol)

/**
 * @dev Extension of {ERC1155} that allows token holders to destroy both their
 * own tokens and those that they have been approved to use.
 *
 * _Available since v3.1._
 */
abstract contract ERC1155Burnable is ERC1155 {
    function burn(
        address account,
        uint256 id,
        uint256 value
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        _burn(account, id, value);
    }

    function burnBatch(
        address account,
        uint256[] memory ids,
        uint256[] memory values
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        _burnBatch(account, ids, values);
    }
}


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

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


// File contracts/interface/IMintPass.sol

interface IMintPass is IERC1155 {
  /**
    * Method to redeem (burn) mint passes.
    * Can only be calledby the redeemer.
    * @param id - The ID of the mint pass to redeem
    * @param account - The account to redeem from
    * @param amount - The amount to redeem
   */
  function redeem(uint256 id, address account, uint256 amount) external;

  /**
    * Method to mint new mint passes.
    * Can only be called by the minter.
    * @param id - The ID of the mint pass to mint
    * @param account - The account to mint to
    * @param amount - The amount of mint passes to mint
   */
  function mint(uint256 id, address account, uint256 amount) external;
}


// File contracts/AbstractMintPass.sol

abstract contract AbstractMintPass is
  IMintPass, ERC1155Burnable, ERC1155Pausable, ERC1155Supply, Ownable
{
  /**
    * Method to pause all transfers.
    * Owner only.
   */
  function pause() external onlyOwner {
    _pause();
  }

  /**
    * Method to unpause all transfers.
    * Owner only.
   */
  function unpause() external onlyOwner {
    _unpause();
  }
  
  /**
    * Method to set the base URI for all mint passes.
    * Owner only.
    * @param baseURI - The new base URI to apply
   */
  function setURI(string memory baseURI) external onlyOwner {
    _setURI(baseURI);
  }

  /**
    * @dev Internal method to mint passes.
    * @param account - The account to mint to
    * @param id - The ID of the mint pass to mint
    * @param amount - The amount of mint passes to mint
    * @param data - The data attached with the transfer
   */
  function _mint(
    address account,
    uint256 id,
    uint256 amount,
    bytes memory data
  ) internal virtual override {
    super._mint(account, id, amount, data);
  }

  /**
    * @dev Internal method to burn passes.
    * @param account - The account to burn from
    * @param id - The ID of the mint pass to burn
    * @param amount - The amount of mint passes to burn
   */
  function _burn(
    address account,
    uint256 id,
    uint256 amount
  ) internal virtual override {
    super._burn(account, id, amount);
  }

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


// File contracts/MintPass.sol

contract MintPass is AbstractMintPass {
  using Counters for Counters.Counter;

  // Mint Passes count
  Counters.Counter private passCounter;
  // Mint Passes
  mapping(uint256 => Pass) public passes;

  // Represents a Mint Pass
  struct Pass {
    uint256 maxSupply;
    string ipfsMetadataHash;
    address minter;
    address redeemer;
  }

  // Emitted when a new pass is created
  event PassCreated(uint256 indexed id);
  
  // Emitted when mint passes are minted
  event PassMinted(
    uint256 indexed id,
    address indexed account,
    uint256 _amount
  );

  // Emitted when mint passes are redeemed
  event PassRedeemed(
    uint256 indexed id,
    address indexed account,
    uint256 amount
  );

  constructor() ERC1155("ipfs://ipfs/") {}

  /**
    * Method to create a new mint pass and set it up.
    * Owner only.
    * @param _ipfsMetadataHash - IPFS hash for pass metadata
    * @param _redeemer - Address that willhave redeeming power
    * @param _minter - Address that will have minting power
    * @param _maxSupply - Amount of passes to mint and send to receiver
   */
  function createPass(
    string memory _ipfsMetadataHash,
    address _redeemer,
    address _minter,
    uint256 _maxSupply
  ) external onlyOwner {
    require(_redeemer != address(0), "MintPass#create: Redeemer cannot be 0.");
    require(_minter != address(0), "MintPass#create: Minter cannot be 0.");
    require(_maxSupply != 0, "MintPass#create: Max supply cannot be 0.");

    uint256 id = passCounter.current();
    
    Pass storage pass = passes[id];
    pass.ipfsMetadataHash = _ipfsMetadataHash;
    pass.redeemer = _redeemer;
    pass.minter = _minter;
    pass.maxSupply = _maxSupply;
    
    passCounter.increment();
    
    emit PassCreated(id);
  }

  /**
    * Method to edit the IPFS hash, the redeemer and the minter of a mint pass.
    * Owner only.
    * @param _id - ID of the pass to edit
    * @param _ipfsMetadataHash - New IPFS hash for this pass metadata
    * @param _redeemer - New redeemer address
    * @param _minter - New minter address
   */
  function editPass(
    uint256 _id,
    string memory _ipfsMetadataHash,
    address _redeemer,
    address _minter
  ) public onlyOwner {
    require(_redeemer != address(0), "MintPass#edit: Redeemer cannot be 0.");
    require(_minter != address(0), "MintPass#edit: Minter cannot be 0.");
    Pass storage pass = passes[_id];
    require(pass.redeemer != address(0), "MintPass#edit: Wrong ID.");
    pass.ipfsMetadataHash = _ipfsMetadataHash;
    pass.redeemer = _redeemer;
    pass.minter = _minter;
  }

  /**
    * Method to mint passes on another's behalf.
    * Can only be called by the minter of the specified pass.
    * @param _id - ID of the pass to redeem
    * @param _account - Account to mint passes on the behalf of
    * @param _amount - Amount of passes to mint
   */
  function mint(uint256 _id, address _account, uint256 _amount) external {
    Pass storage pass = passes[_id];
    require(pass.redeemer != address(0), "MintPass#mint: Wrong ID.");
    require(
      _msgSender() == pass.minter,
      "MintPass#mint: Caller is not minter."
    );
    require(
      totalSupply(_id) + _amount <= pass.maxSupply,
      "MintPass#mint: Too many passes requested."
    );
    _mint(_account, _id, _amount, "");
    emit PassMinted(_id, _account, _amount);
  }

  /**
    * Method to redeem passes on another's behalf.
    * Can only be called by the redeemer of the specified pass.
    * @param _id - ID of the pass to redeem
    * @param _account - Account to redeem passes on the behalf of
    * @param _amount - Amount of passes to redeem
   */
  function redeem(uint256 _id, address _account, uint256 _amount) external {
    Pass storage pass = passes[_id];
    require(pass.redeemer != address(0), "MintPass#redeem: Wrong ID.");
    require(
      _msgSender() == pass.redeemer,
      "MintPass#redeem: Caller is not redeemer."
    );
    _burn(_account, _id, _amount);
    emit PassRedeemed(_id, _account, _amount);
  }

  /**
    * Method to retrieve a pass' metadata complete URI.
    * @dev Packs baseURI and the pass's IPFS hash together
    * @param _id - ID of the pass to return the metadata URI of
   */
  function uri(uint256 _id) public view override returns (string memory) {
    require(passes[_id].redeemer != address(0), "MintPass#uri: Wrong ID.");
    
    return string(abi.encodePacked(super.uri(_id), passes[_id].ipfsMetadataHash));
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"PassCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"PassMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PassRedeemed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_ipfsMetadataHash","type":"string"},{"internalType":"address","name":"_redeemer","type":"address"},{"internalType":"address","name":"_minter","type":"address"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"createPass","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"string","name":"_ipfsMetadataHash","type":"string"},{"internalType":"address","name":"_redeemer","type":"address"},{"internalType":"address","name":"_minter","type":"address"}],"name":"editPass","outputs":[],"stateMutability":"nonpayable","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":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"passes","outputs":[{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"string","name":"ipfsMetadataHash","type":"string"},{"internalType":"address","name":"minter","type":"address"},{"internalType":"address","name":"redeemer","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"redeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setURI","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":[{"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":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b5060408051808201909152600c81526b697066733a2f2f697066732f60a01b602082015262000040816200005c565b506003805460ff19169055620000563362000075565b620001a9565b805162000071906002906020840190620000c7565b5050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620000d5906200016d565b90600052602060002090601f016020900481019282620000f9576000855562000144565b82601f106200011457805160ff191683800117855562000144565b8280016001018555821562000144579182015b828111156200014457825182559160200191906001019062000127565b506200015292915062000156565b5090565b5b8082111562000152576000815560010162000157565b600181811c908216806200018257607f821691505b602082108103620001a357634e487b7160e01b600052602260045260246000fd5b50919050565b612ad380620001b96000396000f3fe608060405234801561001057600080fd5b50600436106101575760003560e01c8063715018a6116100c3578063bd85b0391161007c578063bd85b039146102ef578063d87801611461030f578063e985e9c514610322578063f242432a1461035e578063f2fde38b14610371578063f5298aca1461038457600080fd5b8063715018a61461028b578063836a1040146102935780638456cb59146102a65780638da5cb5b146102ae578063a22cb465146102c9578063b6ef24c8146102dc57600080fd5b80633f4ba83a116101155780633f4ba83a146102005780634e1273f4146102085780634f558e79146102285780635c975abb1461024a5780636b20c454146102555780636e321ce41461026857600080fd5b8062fdd58e1461015c57806301ffc9a71461018257806302fe5305146101a5578063077657d4146101ba5780630e89341c146101cd5780632eb2c2d6146101ed575b600080fd5b61016f61016a366004611e80565b610397565b6040519081526020015b60405180910390f35b610195610190366004611ec0565b61042e565b6040519015158152602001610179565b6101b86101b3366004611f9b565b610480565b005b6101b86101c8366004611fd8565b6104b6565b6101e06101db366004612040565b610656565b60405161017991906120b1565b6101b86101fb366004612159565b610702565b6101b8610799565b61021b610216366004612203565b6107cd565b6040516101799190612309565b610195610236366004612040565b600090815260046020526040902054151590565b60035460ff16610195565b6101b861026336600461231c565b6108f7565b61027b610276366004612040565b61093f565b6040516101799493929190612390565b6101b86109fd565b6101b86102a13660046123ca565b610a31565b6101b8610beb565b6005546040516001600160a01b039091168152602001610179565b6101b86102d73660046123ff565b610c1d565b6101b86102ea36600461243b565b610c2c565b61016f6102fd366004612040565b60009081526004602052604090205490565b6101b861031d3660046123ca565b610e2b565b6101956103303660046124a1565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6101b861036c3660046124d4565b610f50565b6101b861037f366004612539565b610f95565b6101b8610392366004612554565b61102d565b60006001600160a01b0383166104085760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061045f57506001600160e01b031982166303a24d0760e21b145b8061047a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6005546001600160a01b031633146104aa5760405162461bcd60e51b81526004016103ff90612587565b6104b381611070565b50565b6005546001600160a01b031633146104e05760405162461bcd60e51b81526004016103ff90612587565b6001600160a01b0382166105425760405162461bcd60e51b8152602060048201526024808201527f4d696e745061737323656469743a2052656465656d65722063616e6e6f7420626044820152633290181760e11b60648201526084016103ff565b6001600160a01b0381166105a35760405162461bcd60e51b815260206004820152602260248201527f4d696e745061737323656469743a204d696e7465722063616e6e6f7420626520604482015261181760f11b60648201526084016103ff565b600084815260076020526040902060038101546001600160a01b031661060b5760405162461bcd60e51b815260206004820152601860248201527f4d696e745061737323656469743a2057726f6e672049442e000000000000000060448201526064016103ff565b83516106209060018301906020870190611dcb565b506003810180546001600160a01b039485166001600160a01b031991821617909155600290910180549290931691161790555050565b6000818152600760205260409020600301546060906001600160a01b03166106c05760405162461bcd60e51b815260206004820152601760248201527f4d696e7450617373237572693a2057726f6e672049442e00000000000000000060448201526064016103ff565b6106c982611083565b60008381526007602090815260409182902091516106ec939260010191016125f6565b6040516020818303038152906040529050919050565b6001600160a01b03851633148061071e575061071e8533610330565b6107855760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016103ff565b6107928585858585611117565b5050505050565b6005546001600160a01b031633146107c35760405162461bcd60e51b81526004016103ff90612587565b6107cb6112c1565b565b606081518351146108325760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016103ff565b6000835167ffffffffffffffff81111561084e5761084e611ee4565b604051908082528060200260200182016040528015610877578160200160208202803683370190505b50905060005b84518110156108ef576108c285828151811061089b5761089b6126a6565b60200260200101518583815181106108b5576108b56126a6565b6020026020010151610397565b8282815181106108d4576108d46126a6565b60209081029190910101526108e8816126d2565b905061087d565b509392505050565b6001600160a01b03831633148061091357506109138333610330565b61092f5760405162461bcd60e51b81526004016103ff906126eb565b61093a838383611354565b505050565b60076020526000908152604090208054600182018054919291610961906125bc565b80601f016020809104026020016040519081016040528092919081815260200182805461098d906125bc565b80156109da5780601f106109af576101008083540402835291602001916109da565b820191906000526020600020905b8154815290600101906020018083116109bd57829003601f168201915b50505050600283015460039093015491926001600160a01b039081169216905084565b6005546001600160a01b03163314610a275760405162461bcd60e51b81526004016103ff90612587565b6107cb60006114e2565b600083815260076020526040902060038101546001600160a01b0316610a995760405162461bcd60e51b815260206004820152601860248201527f4d696e7450617373236d696e743a2057726f6e672049442e000000000000000060448201526064016103ff565b60028101546001600160a01b0316336001600160a01b031614610b0a5760405162461bcd60e51b8152602060048201526024808201527f4d696e7450617373236d696e743a2043616c6c6572206973206e6f74206d696e6044820152633a32b91760e11b60648201526084016103ff565b8054600085815260046020526040902054610b26908490612734565b1115610b865760405162461bcd60e51b815260206004820152602960248201527f4d696e7450617373236d696e743a20546f6f206d616e7920706173736573207260448201526832b8bab2b9ba32b21760b91b60648201526084016103ff565b610ba183858460405180602001604052806000815250611534565b826001600160a01b0316847f1881dc1c9999400ab408158644d118cc2e75ef92c3cfb29e6d7c2df05b21036b84604051610bdd91815260200190565b60405180910390a350505050565b6005546001600160a01b03163314610c155760405162461bcd60e51b81526004016103ff90612587565b6107cb611546565b610c283383836115c1565b5050565b6005546001600160a01b03163314610c565760405162461bcd60e51b81526004016103ff90612587565b6001600160a01b038316610cbb5760405162461bcd60e51b815260206004820152602660248201527f4d696e7450617373236372656174653a2052656465656d65722063616e6e6f7460448201526510313290181760d11b60648201526084016103ff565b6001600160a01b038216610d1d5760405162461bcd60e51b8152602060048201526024808201527f4d696e7450617373236372656174653a204d696e7465722063616e6e6f7420626044820152633290181760e11b60648201526084016103ff565b80600003610d7e5760405162461bcd60e51b815260206004820152602860248201527f4d696e7450617373236372656174653a204d617820737570706c792063616e6e60448201526737ba10313290181760c11b60648201526084016103ff565b6000610d8960065490565b6000818152600760209081526040909120875192935091610db291600184019190890190611dcb565b506003810180546001600160a01b038088166001600160a01b03199283161790925560028301805492871692909116919091179055828155610df8600680546001019055565b60405182907f87dfdd9586e12c8094a677a77138cf4039f2b0292ae90e07b5edbee60f51447c90600090a2505050505050565b600083815260076020526040902060038101546001600160a01b0316610e935760405162461bcd60e51b815260206004820152601a60248201527f4d696e74506173732372656465656d3a2057726f6e672049442e00000000000060448201526064016103ff565b60038101546001600160a01b0316336001600160a01b031614610f095760405162461bcd60e51b815260206004820152602860248201527f4d696e74506173732372656465656d3a2043616c6c6572206973206e6f74207260448201526732b232b2b6b2b91760c11b60648201526084016103ff565b610f148385846116a1565b826001600160a01b0316847f04e02cd0e8e4d5cdfd024b73bbd084e9de0d242a572f226f40fd7f18cfb1cf9184604051610bdd91815260200190565b6001600160a01b038516331480610f6c5750610f6c8533610330565b610f885760405162461bcd60e51b81526004016103ff906126eb565b61079285858585856116ac565b6005546001600160a01b03163314610fbf5760405162461bcd60e51b81526004016103ff90612587565b6001600160a01b0381166110245760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103ff565b6104b3816114e2565b6001600160a01b03831633148061104957506110498333610330565b6110655760405162461bcd60e51b81526004016103ff906126eb565b61093a8383836116a1565b8051610c28906002906020840190611dcb565b606060028054611092906125bc565b80601f01602080910402602001604051908101604052809291908181526020018280546110be906125bc565b801561110b5780601f106110e05761010080835404028352916020019161110b565b820191906000526020600020905b8154815290600101906020018083116110ee57829003601f168201915b50505050509050919050565b81518351146111385760405162461bcd60e51b81526004016103ff9061274c565b6001600160a01b03841661115e5760405162461bcd60e51b81526004016103ff90612794565b3361116d8187878787876117d8565b60005b845181101561125357600085828151811061118d5761118d6126a6565b6020026020010151905060008583815181106111ab576111ab6126a6565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156111fb5760405162461bcd60e51b81526004016103ff906127d9565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611238908490612734565b925050819055505050508061124c906126d2565b9050611170565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516112a3929190612823565b60405180910390a46112b98187878787876117e6565b505050505050565b60035460ff1661130a5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016103ff565b6003805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b03831661137a5760405162461bcd60e51b81526004016103ff90612851565b805182511461139b5760405162461bcd60e51b81526004016103ff9061274c565b60003390506113be818560008686604051806020016040528060008152506117d8565b60005b83518110156114835760008482815181106113de576113de6126a6565b6020026020010151905060008483815181106113fc576113fc6126a6565b602090810291909101810151600084815280835260408082206001600160a01b038c16835290935291909120549091508181101561144c5760405162461bcd60e51b81526004016103ff90612894565b6000928352602083815260408085206001600160a01b038b168652909152909220910390558061147b816126d2565b9150506113c1565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516114d4929190612823565b60405180910390a450505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61154084848484611941565b50505050565b60035460ff161561158c5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016103ff565b6003805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586113373390565b816001600160a01b0316836001600160a01b0316036116345760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016103ff565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61093a838383611a42565b6001600160a01b0384166116d25760405162461bcd60e51b81526004016103ff90612794565b336116f18187876116e288611b43565b6116eb88611b43565b876117d8565b6000848152602081815260408083206001600160a01b038a168452909152902054838110156117325760405162461bcd60e51b81526004016103ff906127d9565b6000858152602081815260408083206001600160a01b038b811685529252808320878503905590881682528120805486929061176f908490612734565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46117cf828888888888611b8e565b50505050505050565b6112b9868686868686611c49565b6001600160a01b0384163b156112b95760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061182a90899089908890889088906004016128d8565b6020604051808303816000875af1925050508015611865575060408051601f3d908101601f1916820190925261186291810190612936565b60015b61191157611871612953565b806308c379a0036118aa575061188561296f565b8061189057506118ac565b8060405162461bcd60e51b81526004016103ff91906120b1565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016103ff565b6001600160e01b0319811663bc197c8160e01b146117cf5760405162461bcd60e51b81526004016103ff906129f9565b6001600160a01b0384166119a15760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016103ff565b336119b2816000876116e288611b43565b6000848152602081815260408083206001600160a01b0389168452909152812080548592906119e2908490612734565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461079281600087878787611b8e565b6001600160a01b038316611a685760405162461bcd60e51b81526004016103ff90612851565b33611a9781856000611a7987611b43565b611a8287611b43565b604051806020016040528060008152506117d8565b6000838152602081815260408083206001600160a01b038816845290915290205482811015611ad85760405162461bcd60e51b81526004016103ff90612894565b6000848152602081815260408083206001600160a01b03898116808652918452828520888703905582518981529384018890529092908616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611b7d57611b7d6126a6565b602090810291909101015292915050565b6001600160a01b0384163b156112b95760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611bd29089908990889088908890600401612a41565b6020604051808303816000875af1925050508015611c0d575060408051601f3d908101601f19168201909252611c0a91810190612936565b60015b611c1957611871612953565b6001600160e01b0319811663f23a6e6160e01b146117cf5760405162461bcd60e51b81526004016103ff906129f9565b611c57868686868686611d63565b6001600160a01b038516611cde5760005b8351811015611cdc57828181518110611c8357611c836126a6565b602002602001015160046000868481518110611ca157611ca16126a6565b602002602001015181526020019081526020016000206000828254611cc69190612734565b90915550611cd59050816126d2565b9050611c68565b505b6001600160a01b0384166112b95760005b83518110156117cf57828181518110611d0a57611d0a6126a6565b602002602001015160046000868481518110611d2857611d286126a6565b602002602001015181526020019081526020016000206000828254611d4d9190612a86565b90915550611d5c9050816126d2565b9050611cef565b60035460ff16156112b95760405162461bcd60e51b815260206004820152602c60248201527f455243313135355061757361626c653a20746f6b656e207472616e736665722060448201526b1dda1a5b19481c185d5cd95960a21b60648201526084016103ff565b828054611dd7906125bc565b90600052602060002090601f016020900481019282611df95760008555611e3f565b82601f10611e1257805160ff1916838001178555611e3f565b82800160010185558215611e3f579182015b82811115611e3f578251825591602001919060010190611e24565b50611e4b929150611e4f565b5090565b5b80821115611e4b5760008155600101611e50565b80356001600160a01b0381168114611e7b57600080fd5b919050565b60008060408385031215611e9357600080fd5b611e9c83611e64565b946020939093013593505050565b6001600160e01b0319811681146104b357600080fd5b600060208284031215611ed257600080fd5b8135611edd81611eaa565b9392505050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff81118282101715611f2057611f20611ee4565b6040525050565b600082601f830112611f3857600080fd5b813567ffffffffffffffff811115611f5257611f52611ee4565b604051611f69601f8301601f191660200182611efa565b818152846020838601011115611f7e57600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215611fad57600080fd5b813567ffffffffffffffff811115611fc457600080fd5b611fd084828501611f27565b949350505050565b60008060008060808587031215611fee57600080fd5b84359350602085013567ffffffffffffffff81111561200c57600080fd5b61201887828801611f27565b93505061202760408601611e64565b915061203560608601611e64565b905092959194509250565b60006020828403121561205257600080fd5b5035919050565b60005b8381101561207457818101518382015260200161205c565b838111156115405750506000910152565b6000815180845261209d816020860160208601612059565b601f01601f19169290920160200192915050565b602081526000611edd6020830184612085565b600067ffffffffffffffff8211156120de576120de611ee4565b5060051b60200190565b600082601f8301126120f957600080fd5b81356020612106826120c4565b6040516121138282611efa565b83815260059390931b850182019282810191508684111561213357600080fd5b8286015b8481101561214e5780358352918301918301612137565b509695505050505050565b600080600080600060a0868803121561217157600080fd5b61217a86611e64565b945061218860208701611e64565b9350604086013567ffffffffffffffff808211156121a557600080fd5b6121b189838a016120e8565b945060608801359150808211156121c757600080fd5b6121d389838a016120e8565b935060808801359150808211156121e957600080fd5b506121f688828901611f27565b9150509295509295909350565b6000806040838503121561221657600080fd5b823567ffffffffffffffff8082111561222e57600080fd5b818501915085601f83011261224257600080fd5b8135602061224f826120c4565b60405161225c8282611efa565b83815260059390931b850182019282810191508984111561227c57600080fd5b948201945b838610156122a15761229286611e64565b82529482019490820190612281565b965050860135925050808211156122b757600080fd5b506122c4858286016120e8565b9150509250929050565b600081518084526020808501945080840160005b838110156122fe578151875295820195908201906001016122e2565b509495945050505050565b602081526000611edd60208301846122ce565b60008060006060848603121561233157600080fd5b61233a84611e64565b9250602084013567ffffffffffffffff8082111561235757600080fd5b612363878388016120e8565b9350604086013591508082111561237957600080fd5b50612386868287016120e8565b9150509250925092565b8481526080602082015260006123a96080830186612085565b6001600160a01b039485166040840152929093166060909101529392505050565b6000806000606084860312156123df57600080fd5b833592506123ef60208501611e64565b9150604084013590509250925092565b6000806040838503121561241257600080fd5b61241b83611e64565b91506020830135801515811461243057600080fd5b809150509250929050565b6000806000806080858703121561245157600080fd5b843567ffffffffffffffff81111561246857600080fd5b61247487828801611f27565b94505061248360208601611e64565b925061249160408601611e64565b9396929550929360600135925050565b600080604083850312156124b457600080fd5b6124bd83611e64565b91506124cb60208401611e64565b90509250929050565b600080600080600060a086880312156124ec57600080fd5b6124f586611e64565b945061250360208701611e64565b93506040860135925060608601359150608086013567ffffffffffffffff81111561252d57600080fd5b6121f688828901611f27565b60006020828403121561254b57600080fd5b611edd82611e64565b60008060006060848603121561256957600080fd5b61257284611e64565b95602085013595506040909401359392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c908216806125d057607f821691505b6020821081036125f057634e487b7160e01b600052602260045260246000fd5b50919050565b6000835160206126098285838901612059565b845491840191600090600181811c908083168061262757607f831692505b858310810361264457634e487b7160e01b85526022600452602485fd5b808015612658576001811461266957612696565b60ff19851688528388019550612696565b60008b81526020902060005b8581101561268e5781548a820152908401908801612675565b505083880195505b50939a9950505050505050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016126e4576126e46126bc565b5060010190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b60008219821115612747576127476126bc565b500190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60408152600061283660408301856122ce565b828103602084015261284881856122ce565b95945050505050565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b6001600160a01b0386811682528516602082015260a060408201819052600090612904908301866122ce565b828103606084015261291681866122ce565b9050828103608084015261292a8185612085565b98975050505050505050565b60006020828403121561294857600080fd5b8151611edd81611eaa565b600060033d111561296c5760046000803e5060005160e01c5b90565b600060443d101561297d5790565b6040516003193d81016004833e81513d67ffffffffffffffff81602484011181841117156129ad57505050505090565b82850191508151818111156129c55750505050505090565b843d87010160208285010111156129df5750505050505090565b6129ee60208286010187611efa565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090612a7b90830184612085565b979650505050505050565b600082821015612a9857612a986126bc565b50039056fea26469706673582212201248511566aecd8667ad19c1a6e3ece3127c9caf89916e3df480c90a3402e20964736f6c634300080d0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101575760003560e01c8063715018a6116100c3578063bd85b0391161007c578063bd85b039146102ef578063d87801611461030f578063e985e9c514610322578063f242432a1461035e578063f2fde38b14610371578063f5298aca1461038457600080fd5b8063715018a61461028b578063836a1040146102935780638456cb59146102a65780638da5cb5b146102ae578063a22cb465146102c9578063b6ef24c8146102dc57600080fd5b80633f4ba83a116101155780633f4ba83a146102005780634e1273f4146102085780634f558e79146102285780635c975abb1461024a5780636b20c454146102555780636e321ce41461026857600080fd5b8062fdd58e1461015c57806301ffc9a71461018257806302fe5305146101a5578063077657d4146101ba5780630e89341c146101cd5780632eb2c2d6146101ed575b600080fd5b61016f61016a366004611e80565b610397565b6040519081526020015b60405180910390f35b610195610190366004611ec0565b61042e565b6040519015158152602001610179565b6101b86101b3366004611f9b565b610480565b005b6101b86101c8366004611fd8565b6104b6565b6101e06101db366004612040565b610656565b60405161017991906120b1565b6101b86101fb366004612159565b610702565b6101b8610799565b61021b610216366004612203565b6107cd565b6040516101799190612309565b610195610236366004612040565b600090815260046020526040902054151590565b60035460ff16610195565b6101b861026336600461231c565b6108f7565b61027b610276366004612040565b61093f565b6040516101799493929190612390565b6101b86109fd565b6101b86102a13660046123ca565b610a31565b6101b8610beb565b6005546040516001600160a01b039091168152602001610179565b6101b86102d73660046123ff565b610c1d565b6101b86102ea36600461243b565b610c2c565b61016f6102fd366004612040565b60009081526004602052604090205490565b6101b861031d3660046123ca565b610e2b565b6101956103303660046124a1565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6101b861036c3660046124d4565b610f50565b6101b861037f366004612539565b610f95565b6101b8610392366004612554565b61102d565b60006001600160a01b0383166104085760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061045f57506001600160e01b031982166303a24d0760e21b145b8061047a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6005546001600160a01b031633146104aa5760405162461bcd60e51b81526004016103ff90612587565b6104b381611070565b50565b6005546001600160a01b031633146104e05760405162461bcd60e51b81526004016103ff90612587565b6001600160a01b0382166105425760405162461bcd60e51b8152602060048201526024808201527f4d696e745061737323656469743a2052656465656d65722063616e6e6f7420626044820152633290181760e11b60648201526084016103ff565b6001600160a01b0381166105a35760405162461bcd60e51b815260206004820152602260248201527f4d696e745061737323656469743a204d696e7465722063616e6e6f7420626520604482015261181760f11b60648201526084016103ff565b600084815260076020526040902060038101546001600160a01b031661060b5760405162461bcd60e51b815260206004820152601860248201527f4d696e745061737323656469743a2057726f6e672049442e000000000000000060448201526064016103ff565b83516106209060018301906020870190611dcb565b506003810180546001600160a01b039485166001600160a01b031991821617909155600290910180549290931691161790555050565b6000818152600760205260409020600301546060906001600160a01b03166106c05760405162461bcd60e51b815260206004820152601760248201527f4d696e7450617373237572693a2057726f6e672049442e00000000000000000060448201526064016103ff565b6106c982611083565b60008381526007602090815260409182902091516106ec939260010191016125f6565b6040516020818303038152906040529050919050565b6001600160a01b03851633148061071e575061071e8533610330565b6107855760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016103ff565b6107928585858585611117565b5050505050565b6005546001600160a01b031633146107c35760405162461bcd60e51b81526004016103ff90612587565b6107cb6112c1565b565b606081518351146108325760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016103ff565b6000835167ffffffffffffffff81111561084e5761084e611ee4565b604051908082528060200260200182016040528015610877578160200160208202803683370190505b50905060005b84518110156108ef576108c285828151811061089b5761089b6126a6565b60200260200101518583815181106108b5576108b56126a6565b6020026020010151610397565b8282815181106108d4576108d46126a6565b60209081029190910101526108e8816126d2565b905061087d565b509392505050565b6001600160a01b03831633148061091357506109138333610330565b61092f5760405162461bcd60e51b81526004016103ff906126eb565b61093a838383611354565b505050565b60076020526000908152604090208054600182018054919291610961906125bc565b80601f016020809104026020016040519081016040528092919081815260200182805461098d906125bc565b80156109da5780601f106109af576101008083540402835291602001916109da565b820191906000526020600020905b8154815290600101906020018083116109bd57829003601f168201915b50505050600283015460039093015491926001600160a01b039081169216905084565b6005546001600160a01b03163314610a275760405162461bcd60e51b81526004016103ff90612587565b6107cb60006114e2565b600083815260076020526040902060038101546001600160a01b0316610a995760405162461bcd60e51b815260206004820152601860248201527f4d696e7450617373236d696e743a2057726f6e672049442e000000000000000060448201526064016103ff565b60028101546001600160a01b0316336001600160a01b031614610b0a5760405162461bcd60e51b8152602060048201526024808201527f4d696e7450617373236d696e743a2043616c6c6572206973206e6f74206d696e6044820152633a32b91760e11b60648201526084016103ff565b8054600085815260046020526040902054610b26908490612734565b1115610b865760405162461bcd60e51b815260206004820152602960248201527f4d696e7450617373236d696e743a20546f6f206d616e7920706173736573207260448201526832b8bab2b9ba32b21760b91b60648201526084016103ff565b610ba183858460405180602001604052806000815250611534565b826001600160a01b0316847f1881dc1c9999400ab408158644d118cc2e75ef92c3cfb29e6d7c2df05b21036b84604051610bdd91815260200190565b60405180910390a350505050565b6005546001600160a01b03163314610c155760405162461bcd60e51b81526004016103ff90612587565b6107cb611546565b610c283383836115c1565b5050565b6005546001600160a01b03163314610c565760405162461bcd60e51b81526004016103ff90612587565b6001600160a01b038316610cbb5760405162461bcd60e51b815260206004820152602660248201527f4d696e7450617373236372656174653a2052656465656d65722063616e6e6f7460448201526510313290181760d11b60648201526084016103ff565b6001600160a01b038216610d1d5760405162461bcd60e51b8152602060048201526024808201527f4d696e7450617373236372656174653a204d696e7465722063616e6e6f7420626044820152633290181760e11b60648201526084016103ff565b80600003610d7e5760405162461bcd60e51b815260206004820152602860248201527f4d696e7450617373236372656174653a204d617820737570706c792063616e6e60448201526737ba10313290181760c11b60648201526084016103ff565b6000610d8960065490565b6000818152600760209081526040909120875192935091610db291600184019190890190611dcb565b506003810180546001600160a01b038088166001600160a01b03199283161790925560028301805492871692909116919091179055828155610df8600680546001019055565b60405182907f87dfdd9586e12c8094a677a77138cf4039f2b0292ae90e07b5edbee60f51447c90600090a2505050505050565b600083815260076020526040902060038101546001600160a01b0316610e935760405162461bcd60e51b815260206004820152601a60248201527f4d696e74506173732372656465656d3a2057726f6e672049442e00000000000060448201526064016103ff565b60038101546001600160a01b0316336001600160a01b031614610f095760405162461bcd60e51b815260206004820152602860248201527f4d696e74506173732372656465656d3a2043616c6c6572206973206e6f74207260448201526732b232b2b6b2b91760c11b60648201526084016103ff565b610f148385846116a1565b826001600160a01b0316847f04e02cd0e8e4d5cdfd024b73bbd084e9de0d242a572f226f40fd7f18cfb1cf9184604051610bdd91815260200190565b6001600160a01b038516331480610f6c5750610f6c8533610330565b610f885760405162461bcd60e51b81526004016103ff906126eb565b61079285858585856116ac565b6005546001600160a01b03163314610fbf5760405162461bcd60e51b81526004016103ff90612587565b6001600160a01b0381166110245760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103ff565b6104b3816114e2565b6001600160a01b03831633148061104957506110498333610330565b6110655760405162461bcd60e51b81526004016103ff906126eb565b61093a8383836116a1565b8051610c28906002906020840190611dcb565b606060028054611092906125bc565b80601f01602080910402602001604051908101604052809291908181526020018280546110be906125bc565b801561110b5780601f106110e05761010080835404028352916020019161110b565b820191906000526020600020905b8154815290600101906020018083116110ee57829003601f168201915b50505050509050919050565b81518351146111385760405162461bcd60e51b81526004016103ff9061274c565b6001600160a01b03841661115e5760405162461bcd60e51b81526004016103ff90612794565b3361116d8187878787876117d8565b60005b845181101561125357600085828151811061118d5761118d6126a6565b6020026020010151905060008583815181106111ab576111ab6126a6565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156111fb5760405162461bcd60e51b81526004016103ff906127d9565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611238908490612734565b925050819055505050508061124c906126d2565b9050611170565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516112a3929190612823565b60405180910390a46112b98187878787876117e6565b505050505050565b60035460ff1661130a5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016103ff565b6003805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b03831661137a5760405162461bcd60e51b81526004016103ff90612851565b805182511461139b5760405162461bcd60e51b81526004016103ff9061274c565b60003390506113be818560008686604051806020016040528060008152506117d8565b60005b83518110156114835760008482815181106113de576113de6126a6565b6020026020010151905060008483815181106113fc576113fc6126a6565b602090810291909101810151600084815280835260408082206001600160a01b038c16835290935291909120549091508181101561144c5760405162461bcd60e51b81526004016103ff90612894565b6000928352602083815260408085206001600160a01b038b168652909152909220910390558061147b816126d2565b9150506113c1565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516114d4929190612823565b60405180910390a450505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61154084848484611941565b50505050565b60035460ff161561158c5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016103ff565b6003805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586113373390565b816001600160a01b0316836001600160a01b0316036116345760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016103ff565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61093a838383611a42565b6001600160a01b0384166116d25760405162461bcd60e51b81526004016103ff90612794565b336116f18187876116e288611b43565b6116eb88611b43565b876117d8565b6000848152602081815260408083206001600160a01b038a168452909152902054838110156117325760405162461bcd60e51b81526004016103ff906127d9565b6000858152602081815260408083206001600160a01b038b811685529252808320878503905590881682528120805486929061176f908490612734565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46117cf828888888888611b8e565b50505050505050565b6112b9868686868686611c49565b6001600160a01b0384163b156112b95760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061182a90899089908890889088906004016128d8565b6020604051808303816000875af1925050508015611865575060408051601f3d908101601f1916820190925261186291810190612936565b60015b61191157611871612953565b806308c379a0036118aa575061188561296f565b8061189057506118ac565b8060405162461bcd60e51b81526004016103ff91906120b1565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016103ff565b6001600160e01b0319811663bc197c8160e01b146117cf5760405162461bcd60e51b81526004016103ff906129f9565b6001600160a01b0384166119a15760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016103ff565b336119b2816000876116e288611b43565b6000848152602081815260408083206001600160a01b0389168452909152812080548592906119e2908490612734565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461079281600087878787611b8e565b6001600160a01b038316611a685760405162461bcd60e51b81526004016103ff90612851565b33611a9781856000611a7987611b43565b611a8287611b43565b604051806020016040528060008152506117d8565b6000838152602081815260408083206001600160a01b038816845290915290205482811015611ad85760405162461bcd60e51b81526004016103ff90612894565b6000848152602081815260408083206001600160a01b03898116808652918452828520888703905582518981529384018890529092908616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611b7d57611b7d6126a6565b602090810291909101015292915050565b6001600160a01b0384163b156112b95760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611bd29089908990889088908890600401612a41565b6020604051808303816000875af1925050508015611c0d575060408051601f3d908101601f19168201909252611c0a91810190612936565b60015b611c1957611871612953565b6001600160e01b0319811663f23a6e6160e01b146117cf5760405162461bcd60e51b81526004016103ff906129f9565b611c57868686868686611d63565b6001600160a01b038516611cde5760005b8351811015611cdc57828181518110611c8357611c836126a6565b602002602001015160046000868481518110611ca157611ca16126a6565b602002602001015181526020019081526020016000206000828254611cc69190612734565b90915550611cd59050816126d2565b9050611c68565b505b6001600160a01b0384166112b95760005b83518110156117cf57828181518110611d0a57611d0a6126a6565b602002602001015160046000868481518110611d2857611d286126a6565b602002602001015181526020019081526020016000206000828254611d4d9190612a86565b90915550611d5c9050816126d2565b9050611cef565b60035460ff16156112b95760405162461bcd60e51b815260206004820152602c60248201527f455243313135355061757361626c653a20746f6b656e207472616e736665722060448201526b1dda1a5b19481c185d5cd95960a21b60648201526084016103ff565b828054611dd7906125bc565b90600052602060002090601f016020900481019282611df95760008555611e3f565b82601f10611e1257805160ff1916838001178555611e3f565b82800160010185558215611e3f579182015b82811115611e3f578251825591602001919060010190611e24565b50611e4b929150611e4f565b5090565b5b80821115611e4b5760008155600101611e50565b80356001600160a01b0381168114611e7b57600080fd5b919050565b60008060408385031215611e9357600080fd5b611e9c83611e64565b946020939093013593505050565b6001600160e01b0319811681146104b357600080fd5b600060208284031215611ed257600080fd5b8135611edd81611eaa565b9392505050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff81118282101715611f2057611f20611ee4565b6040525050565b600082601f830112611f3857600080fd5b813567ffffffffffffffff811115611f5257611f52611ee4565b604051611f69601f8301601f191660200182611efa565b818152846020838601011115611f7e57600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215611fad57600080fd5b813567ffffffffffffffff811115611fc457600080fd5b611fd084828501611f27565b949350505050565b60008060008060808587031215611fee57600080fd5b84359350602085013567ffffffffffffffff81111561200c57600080fd5b61201887828801611f27565b93505061202760408601611e64565b915061203560608601611e64565b905092959194509250565b60006020828403121561205257600080fd5b5035919050565b60005b8381101561207457818101518382015260200161205c565b838111156115405750506000910152565b6000815180845261209d816020860160208601612059565b601f01601f19169290920160200192915050565b602081526000611edd6020830184612085565b600067ffffffffffffffff8211156120de576120de611ee4565b5060051b60200190565b600082601f8301126120f957600080fd5b81356020612106826120c4565b6040516121138282611efa565b83815260059390931b850182019282810191508684111561213357600080fd5b8286015b8481101561214e5780358352918301918301612137565b509695505050505050565b600080600080600060a0868803121561217157600080fd5b61217a86611e64565b945061218860208701611e64565b9350604086013567ffffffffffffffff808211156121a557600080fd5b6121b189838a016120e8565b945060608801359150808211156121c757600080fd5b6121d389838a016120e8565b935060808801359150808211156121e957600080fd5b506121f688828901611f27565b9150509295509295909350565b6000806040838503121561221657600080fd5b823567ffffffffffffffff8082111561222e57600080fd5b818501915085601f83011261224257600080fd5b8135602061224f826120c4565b60405161225c8282611efa565b83815260059390931b850182019282810191508984111561227c57600080fd5b948201945b838610156122a15761229286611e64565b82529482019490820190612281565b965050860135925050808211156122b757600080fd5b506122c4858286016120e8565b9150509250929050565b600081518084526020808501945080840160005b838110156122fe578151875295820195908201906001016122e2565b509495945050505050565b602081526000611edd60208301846122ce565b60008060006060848603121561233157600080fd5b61233a84611e64565b9250602084013567ffffffffffffffff8082111561235757600080fd5b612363878388016120e8565b9350604086013591508082111561237957600080fd5b50612386868287016120e8565b9150509250925092565b8481526080602082015260006123a96080830186612085565b6001600160a01b039485166040840152929093166060909101529392505050565b6000806000606084860312156123df57600080fd5b833592506123ef60208501611e64565b9150604084013590509250925092565b6000806040838503121561241257600080fd5b61241b83611e64565b91506020830135801515811461243057600080fd5b809150509250929050565b6000806000806080858703121561245157600080fd5b843567ffffffffffffffff81111561246857600080fd5b61247487828801611f27565b94505061248360208601611e64565b925061249160408601611e64565b9396929550929360600135925050565b600080604083850312156124b457600080fd5b6124bd83611e64565b91506124cb60208401611e64565b90509250929050565b600080600080600060a086880312156124ec57600080fd5b6124f586611e64565b945061250360208701611e64565b93506040860135925060608601359150608086013567ffffffffffffffff81111561252d57600080fd5b6121f688828901611f27565b60006020828403121561254b57600080fd5b611edd82611e64565b60008060006060848603121561256957600080fd5b61257284611e64565b95602085013595506040909401359392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c908216806125d057607f821691505b6020821081036125f057634e487b7160e01b600052602260045260246000fd5b50919050565b6000835160206126098285838901612059565b845491840191600090600181811c908083168061262757607f831692505b858310810361264457634e487b7160e01b85526022600452602485fd5b808015612658576001811461266957612696565b60ff19851688528388019550612696565b60008b81526020902060005b8581101561268e5781548a820152908401908801612675565b505083880195505b50939a9950505050505050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016126e4576126e46126bc565b5060010190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b60008219821115612747576127476126bc565b500190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60408152600061283660408301856122ce565b828103602084015261284881856122ce565b95945050505050565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b6001600160a01b0386811682528516602082015260a060408201819052600090612904908301866122ce565b828103606084015261291681866122ce565b9050828103608084015261292a8185612085565b98975050505050505050565b60006020828403121561294857600080fd5b8151611edd81611eaa565b600060033d111561296c5760046000803e5060005160e01c5b90565b600060443d101561297d5790565b6040516003193d81016004833e81513d67ffffffffffffffff81602484011181841117156129ad57505050505090565b82850191508151818111156129c55750505050505090565b843d87010160208285010111156129df5750505050505090565b6129ee60208286010187611efa565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090612a7b90830184612085565b979650505050505050565b600082821015612a9857612a986126bc565b50039056fea26469706673582212201248511566aecd8667ad19c1a6e3ece3127c9caf89916e3df480c90a3402e20964736f6c634300080d0033

Deployed Bytecode Sourcemap

47083:4601:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22225:231;;;;;;:::i;:::-;;:::i;:::-;;;597:25:1;;;585:2;570:18;22225:231:0;;;;;;;;21248:310;;;;;;:::i;:::-;;:::i;:::-;;;1184:14:1;;1177:22;1159:41;;1147:2;1132:18;21248:310:0;1019:187:1;45796:87:0;;;;;;:::i;:::-;;:::i;:::-;;49238:519;;;;;;:::i;:::-;;:::i;51437:244::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;24164:442::-;;;;;;:::i;:::-;;:::i;45589:61::-;;;:::i;22622:524::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;40028:122::-;;;;;;:::i;:::-;40085:4;39906:16;;;:12;:16;;;;;;-1:-1:-1;;;40028:122:0;36837:86;36908:7;;;;36837:86;;41624:353;;;;;;:::i;:::-;;:::i;47251:38::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;43674:103::-;;;:::i;50049:502::-;;;;;;:::i;:::-;;:::i;45453:57::-;;;:::i;43023:87::-;43096:6;;43023:87;;-1:-1:-1;;;;;43096:6:0;;;9393:51:1;;9381:2;9366:18;43023:87:0;9247:203:1;23219:155:0;;;;;;:::i;:::-;;:::i;48225:689::-;;;;;;:::i;:::-;;:::i;39817:113::-;;;;;;:::i;:::-;39879:7;39906:16;;;:12;:16;;;;;;;39817:113;50851:384;;;;;;:::i;:::-;;:::i;23446:168::-;;;;;;:::i;:::-;-1:-1:-1;;;;;23569:27:0;;;23545:4;23569:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;23446:168;23686:401;;;;;;:::i;:::-;;:::i;43932:201::-;;;;;;:::i;:::-;;:::i;41295:321::-;;;;;;:::i;:::-;;:::i;22225:231::-;22311:7;-1:-1:-1;;;;;22339:21:0;;22331:77;;;;-1:-1:-1;;;22331:77:0;;11948:2:1;22331:77:0;;;11930:21:1;11987:2;11967:18;;;11960:30;12026:34;12006:18;;;11999:62;-1:-1:-1;;;12077:18:1;;;12070:41;12128:19;;22331:77:0;;;;;;;;;-1:-1:-1;22426:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;22426:22:0;;;;;;;;;;;;22225:231::o;21248:310::-;21350:4;-1:-1:-1;;;;;;21387:41:0;;-1:-1:-1;;;21387:41:0;;:110;;-1:-1:-1;;;;;;;21445:52:0;;-1:-1:-1;;;21445:52:0;21387:110;:163;;;-1:-1:-1;;;;;;;;;;20149:40:0;;;21514:36;21367:183;21248:310;-1:-1:-1;;21248:310:0:o;45796:87::-;43096:6;;-1:-1:-1;;;;;43096:6:0;19064:10;43243:23;43235:68;;;;-1:-1:-1;;;43235:68:0;;;;;;;:::i;:::-;45861:16:::1;45869:7;45861;:16::i;:::-;45796:87:::0;:::o;49238:519::-;43096:6;;-1:-1:-1;;;;;43096:6:0;19064:10;43243:23;43235:68;;;;-1:-1:-1;;;43235:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49395:23:0;::::1;49387:72;;;::::0;-1:-1:-1;;;49387:72:0;;12721:2:1;49387:72:0::1;::::0;::::1;12703:21:1::0;12760:2;12740:18;;;12733:30;12799:34;12779:18;;;12772:62;-1:-1:-1;;;12850:18:1;;;12843:34;12894:19;;49387:72:0::1;12519:400:1::0;49387:72:0::1;-1:-1:-1::0;;;;;49474:21:0;::::1;49466:68;;;::::0;-1:-1:-1;;;49466:68:0;;13126:2:1;49466:68:0::1;::::0;::::1;13108:21:1::0;13165:2;13145:18;;;13138:30;13204:34;13184:18;;;13177:62;-1:-1:-1;;;13255:18:1;;;13248:32;13297:19;;49466:68:0::1;12924:398:1::0;49466:68:0::1;49541:17;49561:11:::0;;;:6:::1;:11;::::0;;;;49587:13:::1;::::0;::::1;::::0;-1:-1:-1;;;;;49587:13:0::1;49579:64;;;::::0;-1:-1:-1;;;49579:64:0;;13529:2:1;49579:64:0::1;::::0;::::1;13511:21:1::0;13568:2;13548:18;;;13541:30;13607:26;13587:18;;;13580:54;13651:18;;49579:64:0::1;13327:348:1::0;49579:64:0::1;49650:41:::0;;::::1;::::0;:21:::1;::::0;::::1;::::0;:41:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;49698:13:0::1;::::0;::::1;:25:::0;;-1:-1:-1;;;;;49698:25:0;;::::1;-1:-1:-1::0;;;;;;49698:25:0;;::::1;;::::0;;;49730:11:::1;::::0;;::::1;:21:::0;;;;;::::1;::::0;::::1;;::::0;;-1:-1:-1;;49238:519:0:o;51437:244::-;51555:1;51523:11;;;:6;:11;;;;;:20;;;51493:13;;-1:-1:-1;;;;;51523:20:0;51515:70;;;;-1:-1:-1;;;51515:70:0;;13882:2:1;51515:70:0;;;13864:21:1;13921:2;13901:18;;;13894:30;13960:25;13940:18;;;13933:53;14003:18;;51515:70:0;13680:347:1;51515:70:0;51629:14;51639:3;51629:9;:14::i;:::-;51645:11;;;;:6;:11;;;;;;;;;51612:62;;;;;51645:28;;;51612:62;;:::i;:::-;;;;;;;;;;;;;51598:77;;51437:244;;;:::o;24164:442::-;-1:-1:-1;;;;;24397:20:0;;19064:10;24397:20;;:60;;-1:-1:-1;24421:36:0;24438:4;19064:10;23446:168;:::i;24421:36::-;24375:160;;;;-1:-1:-1;;;24375:160:0;;16085:2:1;24375:160:0;;;16067:21:1;16124:2;16104:18;;;16097:30;16163:34;16143:18;;;16136:62;-1:-1:-1;;;16214:18:1;;;16207:48;16272:19;;24375:160:0;15883:414:1;24375:160:0;24546:52;24569:4;24575:2;24579:3;24584:7;24593:4;24546:22;:52::i;:::-;24164:442;;;;;:::o;45589:61::-;43096:6;;-1:-1:-1;;;;;43096:6:0;19064:10;43243:23;43235:68;;;;-1:-1:-1;;;43235:68:0;;;;;;;:::i;:::-;45634:10:::1;:8;:10::i;:::-;45589:61::o:0;22622:524::-;22778:16;22839:3;:10;22820:8;:15;:29;22812:83;;;;-1:-1:-1;;;22812:83:0;;16504:2:1;22812:83:0;;;16486:21:1;16543:2;16523:18;;;16516:30;16582:34;16562:18;;;16555:62;-1:-1:-1;;;16633:18:1;;;16626:39;16682:19;;22812:83:0;16302:405:1;22812:83:0;22908:30;22955:8;:15;22941:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22941:30:0;;22908:63;;22989:9;22984:122;23008:8;:15;23004:1;:19;22984:122;;;23064:30;23074:8;23083:1;23074:11;;;;;;;;:::i;:::-;;;;;;;23087:3;23091:1;23087:6;;;;;;;;:::i;:::-;;;;;;;23064:9;:30::i;:::-;23045:13;23059:1;23045:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;23025:3;;;:::i;:::-;;;22984:122;;;-1:-1:-1;23125:13:0;22622:524;-1:-1:-1;;;22622:524:0:o;41624:353::-;-1:-1:-1;;;;;41789:23:0;;19064:10;41789:23;;:66;;-1:-1:-1;41816:39:0;41833:7;19064:10;23446:168;:::i;41816:39::-;41767:157;;;;-1:-1:-1;;;41767:157:0;;;;;;;:::i;:::-;41937:32;41948:7;41957:3;41962:6;41937:10;:32::i;:::-;41624:353;;;:::o;47251:38::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;47251:38:0;;;;;;;;;;;-1:-1:-1;;;;;47251:38:0;;;;;;-1:-1:-1;47251:38:0;:::o;43674:103::-;43096:6;;-1:-1:-1;;;;;43096:6:0;19064:10;43243:23;43235:68;;;;-1:-1:-1;;;43235:68:0;;;;;;;:::i;:::-;43739:30:::1;43766:1;43739:18;:30::i;50049:502::-:0;50127:17;50147:11;;;:6;:11;;;;;50173:13;;;;-1:-1:-1;;;;;50173:13:0;50165:64;;;;-1:-1:-1;;;50165:64:0;;17728:2:1;50165:64:0;;;17710:21:1;17767:2;17747:18;;;17740:30;17806:26;17786:18;;;17779:54;17850:18;;50165:64:0;17526:348:1;50165:64:0;50268:11;;;;-1:-1:-1;;;;;50268:11:0;19064:10;-1:-1:-1;;;;;50252:27:0;;50236:97;;;;-1:-1:-1;;;50236:97:0;;18081:2:1;50236:97:0;;;18063:21:1;18120:2;18100:18;;;18093:30;18159:34;18139:18;;;18132:62;-1:-1:-1;;;18210:18:1;;;18203:34;18254:19;;50236:97:0;17879:400:1;50236:97:0;50386:14;;39879:7;39906:16;;;:12;:16;;;;;;50356:26;;50375:7;;50356:26;:::i;:::-;:44;;50340:119;;;;-1:-1:-1;;;50340:119:0;;18619:2:1;50340:119:0;;;18601:21:1;18658:2;18638:18;;;18631:30;18697:34;18677:18;;;18670:62;-1:-1:-1;;;18748:18:1;;;18741:39;18797:19;;50340:119:0;18417:405:1;50340:119:0;50466:33;50472:8;50482:3;50487:7;50466:33;;;;;;;;;;;;:5;:33::i;:::-;50527:8;-1:-1:-1;;;;;50511:34:0;50522:3;50511:34;50537:7;50511:34;;;;597:25:1;;585:2;570:18;;451:177;50511:34:0;;;;;;;;50120:431;50049:502;;;:::o;45453:57::-;43096:6;;-1:-1:-1;;;;;43096:6:0;19064:10;43243:23;43235:68;;;;-1:-1:-1;;;43235:68:0;;;;;;;:::i;:::-;45496:8:::1;:6;:8::i;23219:155::-:0;23314:52;19064:10;23347:8;23357;23314:18;:52::i;:::-;23219:155;;:::o;48225:689::-;43096:6;;-1:-1:-1;;;;;43096:6:0;19064:10;43243:23;43235:68;;;;-1:-1:-1;;;43235:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48393:23:0;::::1;48385:74;;;::::0;-1:-1:-1;;;48385:74:0;;19029:2:1;48385:74:0::1;::::0;::::1;19011:21:1::0;19068:2;19048:18;;;19041:30;19107:34;19087:18;;;19080:62;-1:-1:-1;;;19158:18:1;;;19151:36;19204:19;;48385:74:0::1;18827:402:1::0;48385:74:0::1;-1:-1:-1::0;;;;;48474:21:0;::::1;48466:70;;;::::0;-1:-1:-1;;;48466:70:0;;19436:2:1;48466:70:0::1;::::0;::::1;19418:21:1::0;19475:2;19455:18;;;19448:30;19514:34;19494:18;;;19487:62;-1:-1:-1;;;19565:18:1;;;19558:34;19609:19;;48466:70:0::1;19234:400:1::0;48466:70:0::1;48551:10;48565:1;48551:15:::0;48543:68:::1;;;::::0;-1:-1:-1;;;48543:68:0;;19841:2:1;48543:68:0::1;::::0;::::1;19823:21:1::0;19880:2;19860:18;;;19853:30;19919:34;19899:18;;;19892:62;-1:-1:-1;;;19970:18:1;;;19963:38;20018:19;;48543:68:0::1;19639:404:1::0;48543:68:0::1;48620:10;48633:21;:11;1065:14:::0;;973:114;48633:21:::1;48667:17;48687:10:::0;;;:6:::1;:10;::::0;;;;;;;48704:41;;48620:34;;-1:-1:-1;48687:10:0;48704:41:::1;::::0;:21:::1;::::0;::::1;::::0;:41;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;48752:13:0::1;::::0;::::1;:25:::0;;-1:-1:-1;;;;;48752:25:0;;::::1;-1:-1:-1::0;;;;;;48752:25:0;;::::1;;::::0;;;48784:11:::1;::::0;::::1;:21:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;48812:27;;;48852:23:::1;:11;1184:19:::0;;1202:1;1184:19;;;1095:127;48852:23:::1;48893:15;::::0;48905:2;;48893:15:::1;::::0;;;::::1;48378:536;;48225:689:::0;;;;:::o;50851:384::-;50931:17;50951:11;;;:6;:11;;;;;50977:13;;;;-1:-1:-1;;;;;50977:13:0;50969:66;;;;-1:-1:-1;;;50969:66:0;;20250:2:1;50969:66:0;;;20232:21:1;20289:2;20269:18;;;20262:30;20328:28;20308:18;;;20301:56;20374:18;;50969:66:0;20048:350:1;50969:66:0;51074:13;;;;-1:-1:-1;;;;;51074:13:0;19064:10;-1:-1:-1;;;;;51058:29:0;;51042:103;;;;-1:-1:-1;;;51042:103:0;;20605:2:1;51042:103:0;;;20587:21:1;20644:2;20624:18;;;20617:30;20683:34;20663:18;;;20656:62;-1:-1:-1;;;20734:18:1;;;20727:38;20782:19;;51042:103:0;20403:404:1;51042:103:0;51152:29;51158:8;51168:3;51173:7;51152:5;:29::i;:::-;51211:8;-1:-1:-1;;;;;51193:36:0;51206:3;51193:36;51221:7;51193:36;;;;597:25:1;;585:2;570:18;;451:177;23686:401:0;-1:-1:-1;;;;;23894:20:0;;19064:10;23894:20;;:60;;-1:-1:-1;23918:36:0;23935:4;19064:10;23446:168;:::i;23918:36::-;23872:151;;;;-1:-1:-1;;;23872:151:0;;;;;;;:::i;:::-;24034:45;24052:4;24058:2;24062;24066:6;24074:4;24034:17;:45::i;43932:201::-;43096:6;;-1:-1:-1;;;;;43096:6:0;19064:10;43243:23;43235:68;;;;-1:-1:-1;;;43235:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44021:22:0;::::1;44013:73;;;::::0;-1:-1:-1;;;44013:73:0;;21014:2:1;44013:73:0::1;::::0;::::1;20996:21:1::0;21053:2;21033:18;;;21026:30;21092:34;21072:18;;;21065:62;-1:-1:-1;;;21143:18:1;;;21136:36;21189:19;;44013:73:0::1;20812:402:1::0;44013:73:0::1;44097:28;44116:8;44097:18;:28::i;41295:321::-:0;-1:-1:-1;;;;;41435:23:0;;19064:10;41435:23;;:66;;-1:-1:-1;41462:39:0;41479:7;19064:10;23446:168;:::i;41462:39::-;41413:157;;;;-1:-1:-1;;;41413:157:0;;;;;;;:::i;:::-;41583:25;41589:7;41598:2;41602:5;41583;:25::i;28166:88::-;28233:13;;;;:4;;:13;;;;;:::i;21969:105::-;22029:13;22062:4;22055:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21969:105;;;:::o;26248:1074::-;26475:7;:14;26461:3;:10;:28;26453:81;;;;-1:-1:-1;;;26453:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26553:16:0;;26545:66;;;;-1:-1:-1;;;26545:66:0;;;;;;;:::i;:::-;19064:10;26668:60;19064:10;26699:4;26705:2;26709:3;26714:7;26723:4;26668:20;:60::i;:::-;26746:9;26741:421;26765:3;:10;26761:1;:14;26741:421;;;26797:10;26810:3;26814:1;26810:6;;;;;;;;:::i;:::-;;;;;;;26797:19;;26831:14;26848:7;26856:1;26848:10;;;;;;;;:::i;:::-;;;;;;;;;;;;26875:19;26897:13;;;;;;;;;;-1:-1:-1;;;;;26897:19:0;;;;;;;;;;;;26848:10;;-1:-1:-1;26939:21:0;;;;26931:76;;;;-1:-1:-1;;;26931:76:0;;;;;;;:::i;:::-;27051:9;:13;;;;;;;;;;;-1:-1:-1;;;;;27051:19:0;;;;;;;;;;27073:20;;;27051:42;;27123:17;;;;;;;:27;;27073:20;;27051:9;27123:27;;27073:20;;27123:27;:::i;:::-;;;;;;;;26782:380;;;26777:3;;;;:::i;:::-;;;26741:421;;;;27209:2;-1:-1:-1;;;;;27179:47:0;27203:4;-1:-1:-1;;;;;27179:47:0;27193:8;-1:-1:-1;;;;;27179:47:0;;27213:3;27218:7;27179:47;;;;;;;:::i;:::-;;;;;;;;27239:75;27275:8;27285:4;27291:2;27295:3;27300:7;27309:4;27239:35;:75::i;:::-;26442:880;26248:1074;;;;;:::o;37896:120::-;36908:7;;;;37432:41;;;;-1:-1:-1;;;37432:41:0;;23117:2:1;37432:41:0;;;23099:21:1;23156:2;23136:18;;;23129:30;-1:-1:-1;;;23175:18:1;;;23168:50;23235:18;;37432:41:0;22915:344:1;37432:41:0;37955:7:::1;:15:::0;;-1:-1:-1;;37955:15:0::1;::::0;;37986:22:::1;19064:10:::0;37995:12:::1;37986:22;::::0;-1:-1:-1;;;;;9411:32:1;;;9393:51;;9381:2;9366:18;37986:22:0::1;;;;;;;37896:120::o:0;31401:891::-;-1:-1:-1;;;;;31553:18:0;;31545:66;;;;-1:-1:-1;;;31545:66:0;;;;;;;:::i;:::-;31644:7;:14;31630:3;:10;:28;31622:81;;;;-1:-1:-1;;;31622:81:0;;;;;;;:::i;:::-;31716:16;19064:10;31716:31;;31760:66;31781:8;31791:4;31805:1;31809:3;31814:7;31760:66;;;;;;;;;;;;:20;:66::i;:::-;31844:9;31839:373;31863:3;:10;31859:1;:14;31839:373;;;31895:10;31908:3;31912:1;31908:6;;;;;;;;:::i;:::-;;;;;;;31895:19;;31929:14;31946:7;31954:1;31946:10;;;;;;;;:::i;:::-;;;;;;;;;;;;31973:19;31995:13;;;;;;;;;;-1:-1:-1;;;;;31995:19:0;;;;;;;;;;;;31946:10;;-1:-1:-1;32037:21:0;;;;32029:70;;;;-1:-1:-1;;;32029:70:0;;;;;;;:::i;:::-;32143:9;:13;;;;;;;;;;;-1:-1:-1;;;;;32143:19:0;;;;;;;;;;32165:20;;32143:42;;31875:3;;;;:::i;:::-;;;;31839:373;;;;32267:1;-1:-1:-1;;;;;32229:55:0;32253:4;-1:-1:-1;;;;;32229:55:0;32243:8;-1:-1:-1;;;;;32229:55:0;;32271:3;32276:7;32229:55;;;;;;;:::i;:::-;;;;;;;;31534:758;31401:891;;;:::o;44293:191::-;44386:6;;;-1:-1:-1;;;;;44403:17:0;;;-1:-1:-1;;;;;;44403:17:0;;;;;;;44436:40;;44386:6;;;44403:17;44386:6;;44436:40;;44367:16;;44436:40;44356:128;44293:191;:::o;46159:181::-;46296:38;46308:7;46317:2;46321:6;46329:4;46296:11;:38::i;:::-;46159:181;;;;:::o;37637:118::-;36908:7;;;;37162:9;37154:38;;;;-1:-1:-1;;;37154:38:0;;24275:2:1;37154:38:0;;;24257:21:1;24314:2;24294:18;;;24287:30;-1:-1:-1;;;24333:18:1;;;24326:46;24389:18;;37154:38:0;24073:340:1;37154:38:0;37697:7:::1;:14:::0;;-1:-1:-1;;37697:14:0::1;37707:4;37697:14;::::0;;37727:20:::1;37734:12;19064:10:::0;;18984:98;32434:331;32589:8;-1:-1:-1;;;;;32580:17:0;:5;-1:-1:-1;;;;;32580:17:0;;32572:71;;;;-1:-1:-1;;;32572:71:0;;24620:2:1;32572:71:0;;;24602:21:1;24659:2;24639:18;;;24632:30;24698:34;24678:18;;;24671:62;-1:-1:-1;;;24749:18:1;;;24742:39;24798:19;;32572:71:0;24418:405:1;32572:71:0;-1:-1:-1;;;;;32654:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;32654:46:0;;;;;;;;;;32716:41;;1159::1;;;32716::0;;1132:18:1;32716:41:0;;;;;;;32434:331;;;:::o;46561:151::-;46674:32;46686:7;46695:2;46699:6;46674:11;:32::i;25070:820::-;-1:-1:-1;;;;;25258:16:0;;25250:66;;;;-1:-1:-1;;;25250:66:0;;;;;;;:::i;:::-;19064:10;25373:96;19064:10;25404:4;25410:2;25414:21;25432:2;25414:17;:21::i;:::-;25437:25;25455:6;25437:17;:25::i;:::-;25464:4;25373:20;:96::i;:::-;25482:19;25504:13;;;;;;;;;;;-1:-1:-1;;;;;25504:19:0;;;;;;;;;;25542:21;;;;25534:76;;;;-1:-1:-1;;;25534:76:0;;;;;;;:::i;:::-;25646:9;:13;;;;;;;;;;;-1:-1:-1;;;;;25646:19:0;;;;;;;;;;25668:20;;;25646:42;;25710:17;;;;;;;:27;;25668:20;;25646:9;25710:27;;25668:20;;25710:27;:::i;:::-;;;;-1:-1:-1;;25755:46:0;;;25002:25:1;;;25058:2;25043:18;;25036:34;;;-1:-1:-1;;;;;25755:46:0;;;;;;;;;;;;;;24975:18:1;25755:46:0;;;;;;;25814:68;25845:8;25855:4;25861:2;25865;25869:6;25877:4;25814:30;:68::i;:::-;25239:651;;25070:820;;;;;:::o;46718:322::-;46968:66;46995:8;47005:4;47011:2;47015:3;47020:7;47029:4;46968:26;:66::i;34702:813::-;-1:-1:-1;;;;;34942:13:0;;11351:19;:23;34938:570;;34978:79;;-1:-1:-1;;;34978:79:0;;-1:-1:-1;;;;;34978:43:0;;;;;:79;;35022:8;;35032:4;;35038:3;;35043:7;;35052:4;;34978:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34978:79:0;;;;;;;;-1:-1:-1;;34978:79:0;;;;;;;;;;;;:::i;:::-;;;34974:523;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;35370:6;35363:14;;-1:-1:-1;;;35363:14:0;;;;;;;;:::i;34974:523::-;;;35419:62;;-1:-1:-1;;;35419:62:0;;27229:2:1;35419:62:0;;;27211:21:1;27268:2;27248:18;;;27241:30;27307:34;27287:18;;;27280:62;-1:-1:-1;;;27358:18:1;;;27351:50;27418:19;;35419:62:0;27027:416:1;34974:523:0;-1:-1:-1;;;;;;35139:60:0;;-1:-1:-1;;;35139:60:0;35135:159;;35224:50;;-1:-1:-1;;;35224:50:0;;;;;;;:::i;28640:569::-;-1:-1:-1;;;;;28793:16:0;;28785:62;;;;-1:-1:-1;;;28785:62:0;;28059:2:1;28785:62:0;;;28041:21:1;28098:2;28078:18;;;28071:30;28137:34;28117:18;;;28110:62;-1:-1:-1;;;28188:18:1;;;28181:31;28229:19;;28785:62:0;27857:397:1;28785:62:0;19064:10;28904:102;19064:10;28860:16;28947:2;28951:21;28969:2;28951:17;:21::i;28904:102::-;29019:9;:13;;;;;;;;;;;-1:-1:-1;;;;;29019:17:0;;;;;;;;;:27;;29040:6;;29019:9;:27;;29040:6;;29019:27;:::i;:::-;;;;-1:-1:-1;;29062:52:0;;;25002:25:1;;;25058:2;25043:18;;25036:34;;;-1:-1:-1;;;;;29062:52:0;;;;29095:1;;29062:52;;;;;;24975:18:1;29062:52:0;;;;;;;29127:74;29158:8;29176:1;29180:2;29184;29188:6;29196:4;29127:30;:74::i;30550:648::-;-1:-1:-1;;;;;30677:18:0;;30669:66;;;;-1:-1:-1;;;30669:66:0;;;;;;;:::i;:::-;19064:10;30792:102;19064:10;30823:4;30748:16;30841:21;30859:2;30841:17;:21::i;:::-;30864:25;30882:6;30864:17;:25::i;:::-;30792:102;;;;;;;;;;;;:20;:102::i;:::-;30907:19;30929:13;;;;;;;;;;;-1:-1:-1;;;;;30929:19:0;;;;;;;;;;30967:21;;;;30959:70;;;;-1:-1:-1;;;30959:70:0;;;;;;;:::i;:::-;31065:9;:13;;;;;;;;;;;-1:-1:-1;;;;;31065:19:0;;;;;;;;;;;;31087:20;;;31065:42;;31136:54;;25002:25:1;;;25043:18;;;25036:34;;;31065:19:0;;31136:54;;;;;;24975:18:1;31136:54:0;;;;;;;30658:540;;30550:648;;;:::o;35523:198::-;35643:16;;;35657:1;35643:16;;;;;;;;;35589;;35618:22;;35643:16;;;;;;;;;;;;-1:-1:-1;35643:16:0;35618:41;;35681:7;35670:5;35676:1;35670:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;35708:5;35523:198;-1:-1:-1;;35523:198:0:o;33950:744::-;-1:-1:-1;;;;;34165:13:0;;11351:19;:23;34161:526;;34201:72;;-1:-1:-1;;;34201:72:0;;-1:-1:-1;;;;;34201:38:0;;;;;:72;;34240:8;;34250:4;;34256:2;;34260:6;;34268:4;;34201:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34201:72:0;;;;;;;;-1:-1:-1;;34201:72:0;;;;;;;;;;;;:::i;:::-;;;34197:479;;;;:::i;:::-;-1:-1:-1;;;;;;34323:55:0;;-1:-1:-1;;;34323:55:0;34319:154;;34403:50;;-1:-1:-1;;;34403:50:0;;;;;;;:::i;40225:655::-;40464:66;40491:8;40501:4;40507:2;40511:3;40516:7;40525:4;40464:26;:66::i;:::-;-1:-1:-1;;;;;40547:18:0;;40543:160;;40587:9;40582:110;40606:3;:10;40602:1;:14;40582:110;;;40666:7;40674:1;40666:10;;;;;;;;:::i;:::-;;;;;;;40642:12;:20;40655:3;40659:1;40655:6;;;;;;;;:::i;:::-;;;;;;;40642:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;40618:3:0;;-1:-1:-1;40618:3:0;;:::i;:::-;;;40582:110;;;;40543:160;-1:-1:-1;;;;;40719:16:0;;40715:158;;40757:9;40752:110;40776:3;:10;40772:1;:14;40752:110;;;40836:7;40844:1;40836:10;;;;;;;;:::i;:::-;;;;;;;40812:12;:20;40825:3;40829:1;40825:6;;;;;;;;:::i;:::-;;;;;;;40812:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;40788:3:0;;-1:-1:-1;40788:3:0;;:::i;:::-;;;40752:110;;38716:392;36908:7;;;;39042:9;39034:66;;;;-1:-1:-1;;;39034:66:0;;29157:2:1;39034:66:0;;;29139:21:1;29196:2;29176:18;;;29169:30;29235:34;29215:18;;;29208:62;-1:-1:-1;;;29286:18:1;;;29279:42;29338:19;;39034:66:0;28955:408:1;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;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:254::-;260:6;268;321:2;309:9;300:7;296:23;292:32;289:52;;;337:1;334;327:12;289:52;360:29;379:9;360:29;:::i;:::-;350:39;436:2;421:18;;;;408:32;;-1:-1:-1;;;192:254:1:o;633:131::-;-1:-1:-1;;;;;;707:32:1;;697:43;;687:71;;754:1;751;744:12;769:245;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;935:9;922:23;954:30;978:5;954:30;:::i;:::-;1003:5;769:245;-1:-1:-1;;;769:245:1:o;1211:127::-;1272:10;1267:3;1263:20;1260:1;1253:31;1303:4;1300:1;1293:15;1327:4;1324:1;1317:15;1343:249;1453:2;1434:13;;-1:-1:-1;;1430:27:1;1418:40;;1488:18;1473:34;;1509:22;;;1470:62;1467:88;;;1535:18;;:::i;:::-;1571:2;1564:22;-1:-1:-1;;1343:249:1:o;1597:556::-;1640:5;1693:3;1686:4;1678:6;1674:17;1670:27;1660:55;;1711:1;1708;1701:12;1660:55;1747:6;1734:20;1773:18;1769:2;1766:26;1763:52;;;1795:18;;:::i;:::-;1844:2;1838:9;1856:67;1911:2;1892:13;;-1:-1:-1;;1888:27:1;1917:4;1884:38;1838:9;1856:67;:::i;:::-;1947:2;1939:6;1932:18;1993:3;1986:4;1981:2;1973:6;1969:15;1965:26;1962:35;1959:55;;;2010:1;2007;2000:12;1959:55;2074:2;2067:4;2059:6;2055:17;2048:4;2040:6;2036:17;2023:54;2121:1;2097:15;;;2114:4;2093:26;2086:37;;;;2101:6;1597:556;-1:-1:-1;;;1597:556:1:o;2158:322::-;2227:6;2280:2;2268:9;2259:7;2255:23;2251:32;2248:52;;;2296:1;2293;2286:12;2248:52;2336:9;2323:23;2369:18;2361:6;2358:30;2355:50;;;2401:1;2398;2391:12;2355:50;2424;2466:7;2457:6;2446:9;2442:22;2424:50;:::i;:::-;2414:60;2158:322;-1:-1:-1;;;;2158:322:1:o;2485:539::-;2581:6;2589;2597;2605;2658:3;2646:9;2637:7;2633:23;2629:33;2626:53;;;2675:1;2672;2665:12;2626:53;2711:9;2698:23;2688:33;;2772:2;2761:9;2757:18;2744:32;2799:18;2791:6;2788:30;2785:50;;;2831:1;2828;2821:12;2785:50;2854;2896:7;2887:6;2876:9;2872:22;2854:50;:::i;:::-;2844:60;;;2923:38;2957:2;2946:9;2942:18;2923:38;:::i;:::-;2913:48;;2980:38;3014:2;3003:9;2999:18;2980:38;:::i;:::-;2970:48;;2485:539;;;;;;;:::o;3029:180::-;3088:6;3141:2;3129:9;3120:7;3116:23;3112:32;3109:52;;;3157:1;3154;3147:12;3109:52;-1:-1:-1;3180:23:1;;3029:180;-1:-1:-1;3029:180:1:o;3214:258::-;3286:1;3296:113;3310:6;3307:1;3304:13;3296:113;;;3386:11;;;3380:18;3367:11;;;3360:39;3332:2;3325:10;3296:113;;;3427:6;3424:1;3421:13;3418:48;;;-1:-1:-1;;3462:1:1;3444:16;;3437:27;3214:258::o;3477:::-;3519:3;3557:5;3551:12;3584:6;3579:3;3572:19;3600:63;3656:6;3649:4;3644:3;3640:14;3633:4;3626:5;3622:16;3600:63;:::i;:::-;3717:2;3696:15;-1:-1:-1;;3692:29:1;3683:39;;;;3724:4;3679:50;;3477:258;-1:-1:-1;;3477:258:1:o;3740:220::-;3889:2;3878:9;3871:21;3852:4;3909:45;3950:2;3939:9;3935:18;3927:6;3909:45;:::i;3965:183::-;4025:4;4058:18;4050:6;4047:30;4044:56;;;4080:18;;:::i;:::-;-1:-1:-1;4125:1:1;4121:14;4137:4;4117:25;;3965:183::o;4153:724::-;4207:5;4260:3;4253:4;4245:6;4241:17;4237:27;4227:55;;4278:1;4275;4268:12;4227:55;4314:6;4301:20;4340:4;4363:43;4403:2;4363:43;:::i;:::-;4435:2;4429:9;4447:31;4475:2;4467:6;4447:31;:::i;:::-;4513:18;;;4605:1;4601:10;;;;4589:23;;4585:32;;;4547:15;;;;-1:-1:-1;4629:15:1;;;4626:35;;;4657:1;4654;4647:12;4626:35;4693:2;4685:6;4681:15;4705:142;4721:6;4716:3;4713:15;4705:142;;;4787:17;;4775:30;;4825:12;;;;4738;;4705:142;;;-1:-1:-1;4865:6:1;4153:724;-1:-1:-1;;;;;;4153:724:1:o;4882:944::-;5036:6;5044;5052;5060;5068;5121:3;5109:9;5100:7;5096:23;5092:33;5089:53;;;5138:1;5135;5128:12;5089:53;5161:29;5180:9;5161:29;:::i;:::-;5151:39;;5209:38;5243:2;5232:9;5228:18;5209:38;:::i;:::-;5199:48;;5298:2;5287:9;5283:18;5270:32;5321:18;5362:2;5354:6;5351:14;5348:34;;;5378:1;5375;5368:12;5348:34;5401:61;5454:7;5445:6;5434:9;5430:22;5401:61;:::i;:::-;5391:71;;5515:2;5504:9;5500:18;5487:32;5471:48;;5544:2;5534:8;5531:16;5528:36;;;5560:1;5557;5550:12;5528:36;5583:63;5638:7;5627:8;5616:9;5612:24;5583:63;:::i;:::-;5573:73;;5699:3;5688:9;5684:19;5671:33;5655:49;;5729:2;5719:8;5716:16;5713:36;;;5745:1;5742;5735:12;5713:36;;5768:52;5812:7;5801:8;5790:9;5786:24;5768:52;:::i;:::-;5758:62;;;4882:944;;;;;;;;:::o;5831:1208::-;5949:6;5957;6010:2;5998:9;5989:7;5985:23;5981:32;5978:52;;;6026:1;6023;6016:12;5978:52;6066:9;6053:23;6095:18;6136:2;6128:6;6125:14;6122:34;;;6152:1;6149;6142:12;6122:34;6190:6;6179:9;6175:22;6165:32;;6235:7;6228:4;6224:2;6220:13;6216:27;6206:55;;6257:1;6254;6247:12;6206:55;6293:2;6280:16;6315:4;6338:43;6378:2;6338:43;:::i;:::-;6410:2;6404:9;6422:31;6450:2;6442:6;6422:31;:::i;:::-;6488:18;;;6576:1;6572:10;;;;6564:19;;6560:28;;;6522:15;;;;-1:-1:-1;6600:19:1;;;6597:39;;;6632:1;6629;6622:12;6597:39;6656:11;;;;6676:148;6692:6;6687:3;6684:15;6676:148;;;6758:23;6777:3;6758:23;:::i;:::-;6746:36;;6709:12;;;;6802;;;;6676:148;;;6843:6;-1:-1:-1;;6887:18:1;;6874:32;;-1:-1:-1;;6918:16:1;;;6915:36;;;6947:1;6944;6937:12;6915:36;;6970:63;7025:7;7014:8;7003:9;6999:24;6970:63;:::i;:::-;6960:73;;;5831:1208;;;;;:::o;7044:435::-;7097:3;7135:5;7129:12;7162:6;7157:3;7150:19;7188:4;7217:2;7212:3;7208:12;7201:19;;7254:2;7247:5;7243:14;7275:1;7285:169;7299:6;7296:1;7293:13;7285:169;;;7360:13;;7348:26;;7394:12;;;;7429:15;;;;7321:1;7314:9;7285:169;;;-1:-1:-1;7470:3:1;;7044:435;-1:-1:-1;;;;;7044:435:1:o;7484:261::-;7663:2;7652:9;7645:21;7626:4;7683:56;7735:2;7724:9;7720:18;7712:6;7683:56;:::i;7750:669::-;7877:6;7885;7893;7946:2;7934:9;7925:7;7921:23;7917:32;7914:52;;;7962:1;7959;7952:12;7914:52;7985:29;8004:9;7985:29;:::i;:::-;7975:39;;8065:2;8054:9;8050:18;8037:32;8088:18;8129:2;8121:6;8118:14;8115:34;;;8145:1;8142;8135:12;8115:34;8168:61;8221:7;8212:6;8201:9;8197:22;8168:61;:::i;:::-;8158:71;;8282:2;8271:9;8267:18;8254:32;8238:48;;8311:2;8301:8;8298:16;8295:36;;;8327:1;8324;8317:12;8295:36;;8350:63;8405:7;8394:8;8383:9;8379:24;8350:63;:::i;:::-;8340:73;;;7750:669;;;;;:::o;8424:491::-;8657:6;8646:9;8639:25;8700:3;8695:2;8684:9;8680:18;8673:31;8620:4;8721:46;8762:3;8751:9;8747:19;8739:6;8721:46;:::i;:::-;-1:-1:-1;;;;;8841:15:1;;;8836:2;8821:18;;8814:43;8893:15;;;;8888:2;8873:18;;;8866:43;8713:54;8424:491;-1:-1:-1;;;8424:491:1:o;8920:322::-;8997:6;9005;9013;9066:2;9054:9;9045:7;9041:23;9037:32;9034:52;;;9082:1;9079;9072:12;9034:52;9118:9;9105:23;9095:33;;9147:38;9181:2;9170:9;9166:18;9147:38;:::i;:::-;9137:48;;9232:2;9221:9;9217:18;9204:32;9194:42;;8920:322;;;;;:::o;9455:347::-;9520:6;9528;9581:2;9569:9;9560:7;9556:23;9552:32;9549:52;;;9597:1;9594;9587:12;9549:52;9620:29;9639:9;9620:29;:::i;:::-;9610:39;;9699:2;9688:9;9684:18;9671:32;9746:5;9739:13;9732:21;9725:5;9722:32;9712:60;;9768:1;9765;9758:12;9712:60;9791:5;9781:15;;;9455:347;;;;;:::o;9807:539::-;9903:6;9911;9919;9927;9980:3;9968:9;9959:7;9955:23;9951:33;9948:53;;;9997:1;9994;9987:12;9948:53;10037:9;10024:23;10070:18;10062:6;10059:30;10056:50;;;10102:1;10099;10092:12;10056:50;10125;10167:7;10158:6;10147:9;10143:22;10125:50;:::i;:::-;10115:60;;;10194:38;10228:2;10217:9;10213:18;10194:38;:::i;:::-;10184:48;;10251:38;10285:2;10274:9;10270:18;10251:38;:::i;:::-;9807:539;;;;-1:-1:-1;10241:48:1;;10336:2;10321:18;10308:32;;-1:-1:-1;;9807:539:1:o;10351:260::-;10419:6;10427;10480:2;10468:9;10459:7;10455:23;10451:32;10448:52;;;10496:1;10493;10486:12;10448:52;10519:29;10538:9;10519:29;:::i;:::-;10509:39;;10567:38;10601:2;10590:9;10586:18;10567:38;:::i;:::-;10557:48;;10351:260;;;;;:::o;10616:607::-;10720:6;10728;10736;10744;10752;10805:3;10793:9;10784:7;10780:23;10776:33;10773:53;;;10822:1;10819;10812:12;10773:53;10845:29;10864:9;10845:29;:::i;:::-;10835:39;;10893:38;10927:2;10916:9;10912:18;10893:38;:::i;:::-;10883:48;;10978:2;10967:9;10963:18;10950:32;10940:42;;11029:2;11018:9;11014:18;11001:32;10991:42;;11084:3;11073:9;11069:19;11056:33;11112:18;11104:6;11101:30;11098:50;;;11144:1;11141;11134:12;11098:50;11167;11209:7;11200:6;11189:9;11185:22;11167:50;:::i;11228:186::-;11287:6;11340:2;11328:9;11319:7;11315:23;11311:32;11308:52;;;11356:1;11353;11346:12;11308:52;11379:29;11398:9;11379:29;:::i;11419:322::-;11496:6;11504;11512;11565:2;11553:9;11544:7;11540:23;11536:32;11533:52;;;11581:1;11578;11571:12;11533:52;11604:29;11623:9;11604:29;:::i;:::-;11594:39;11680:2;11665:18;;11652:32;;-1:-1:-1;11731:2:1;11716:18;;;11703:32;;11419:322;-1:-1:-1;;;11419:322:1:o;12158:356::-;12360:2;12342:21;;;12379:18;;;12372:30;12438:34;12433:2;12418:18;;12411:62;12505:2;12490:18;;12158:356::o;14032:380::-;14111:1;14107:12;;;;14154;;;14175:61;;14229:4;14221:6;14217:17;14207:27;;14175:61;14282:2;14274:6;14271:14;14251:18;14248:38;14245:161;;14328:10;14323:3;14319:20;14316:1;14309:31;14363:4;14360:1;14353:15;14391:4;14388:1;14381:15;14245:161;;14032:380;;;:::o;14543:1335::-;14719:3;14757:6;14751:13;14783:4;14796:51;14840:6;14835:3;14830:2;14822:6;14818:15;14796:51;:::i;:::-;14932:13;;14869:16;;;;14905:1;;14992;15014:18;;;;15067;;;;15094:93;;15172:4;15162:8;15158:19;15146:31;;15094:93;15235:2;15225:8;15222:16;15202:18;15199:40;15196:167;;-1:-1:-1;;;15262:33:1;;15318:4;15315:1;15308:15;15348:4;15269:3;15336:17;15196:167;15379:18;15406:110;;;;15530:1;15525:328;;;;15372:481;;15406:110;-1:-1:-1;;15441:24:1;;15427:39;;15486:20;;;;-1:-1:-1;15406:110:1;;15525:328;14490:1;14483:14;;;14527:4;14514:18;;15620:1;15634:169;15648:8;15645:1;15642:15;15634:169;;;15730:14;;15715:13;;;15708:37;15773:16;;;;15665:10;;15634:169;;;15638:3;;15834:8;15827:5;15823:20;15816:27;;15372:481;-1:-1:-1;15869:3:1;;14543:1335;-1:-1:-1;;;;;;;;;;14543:1335:1:o;16712:127::-;16773:10;16768:3;16764:20;16761:1;16754:31;16804:4;16801:1;16794:15;16828:4;16825:1;16818:15;16844:127;16905:10;16900:3;16896:20;16893:1;16886:31;16936:4;16933:1;16926:15;16960:4;16957:1;16950:15;16976:135;17015:3;17036:17;;;17033:43;;17056:18;;:::i;:::-;-1:-1:-1;17103:1:1;17092:13;;16976:135::o;17116:405::-;17318:2;17300:21;;;17357:2;17337:18;;;17330:30;17396:34;17391:2;17376:18;;17369:62;-1:-1:-1;;;17462:2:1;17447:18;;17440:39;17511:3;17496:19;;17116:405::o;18284:128::-;18324:3;18355:1;18351:6;18348:1;18345:13;18342:39;;;18361:18;;:::i;:::-;-1:-1:-1;18397:9:1;;18284:128::o;21219:404::-;21421:2;21403:21;;;21460:2;21440:18;;;21433:30;21499:34;21494:2;21479:18;;21472:62;-1:-1:-1;;;21565:2:1;21550:18;;21543:38;21613:3;21598:19;;21219:404::o;21628:401::-;21830:2;21812:21;;;21869:2;21849:18;;;21842:30;21908:34;21903:2;21888:18;;21881:62;-1:-1:-1;;;21974:2:1;21959:18;;21952:35;22019:3;22004:19;;21628:401::o;22034:406::-;22236:2;22218:21;;;22275:2;22255:18;;;22248:30;22314:34;22309:2;22294:18;;22287:62;-1:-1:-1;;;22380:2:1;22365:18;;22358:40;22430:3;22415:19;;22034:406::o;22445:465::-;22702:2;22691:9;22684:21;22665:4;22728:56;22780:2;22769:9;22765:18;22757:6;22728:56;:::i;:::-;22832:9;22824:6;22820:22;22815:2;22804:9;22800:18;22793:50;22860:44;22897:6;22889;22860:44;:::i;:::-;22852:52;22445:465;-1:-1:-1;;;;;22445:465:1:o;23264:399::-;23466:2;23448:21;;;23505:2;23485:18;;;23478:30;23544:34;23539:2;23524:18;;23517:62;-1:-1:-1;;;23610:2:1;23595:18;;23588:33;23653:3;23638:19;;23264:399::o;23668:400::-;23870:2;23852:21;;;23909:2;23889:18;;;23882:30;23948:34;23943:2;23928:18;;23921:62;-1:-1:-1;;;24014:2:1;23999:18;;23992:34;24058:3;24043:19;;23668:400::o;25081:827::-;-1:-1:-1;;;;;25478:15:1;;;25460:34;;25530:15;;25525:2;25510:18;;25503:43;25440:3;25577:2;25562:18;;25555:31;;;25403:4;;25609:57;;25646:19;;25638:6;25609:57;:::i;:::-;25714:9;25706:6;25702:22;25697:2;25686:9;25682:18;25675:50;25748:44;25785:6;25777;25748:44;:::i;:::-;25734:58;;25841:9;25833:6;25829:22;25823:3;25812:9;25808:19;25801:51;25869:33;25895:6;25887;25869:33;:::i;:::-;25861:41;25081:827;-1:-1:-1;;;;;;;;25081:827:1:o;25913:249::-;25982:6;26035:2;26023:9;26014:7;26010:23;26006:32;26003:52;;;26051:1;26048;26041:12;26003:52;26083:9;26077:16;26102:30;26126:5;26102:30;:::i;26167:179::-;26202:3;26244:1;26226:16;26223:23;26220:120;;;26290:1;26287;26284;26269:23;-1:-1:-1;26327:1:1;26321:8;26316:3;26312:18;26220:120;26167:179;:::o;26351:671::-;26390:3;26432:4;26414:16;26411:26;26408:39;;;26351:671;:::o;26408:39::-;26474:2;26468:9;-1:-1:-1;;26539:16:1;26535:25;;26532:1;26468:9;26511:50;26590:4;26584:11;26614:16;26649:18;26720:2;26713:4;26705:6;26701:17;26698:25;26693:2;26685:6;26682:14;26679:45;26676:58;;;26727:5;;;;;26351:671;:::o;26676:58::-;26764:6;26758:4;26754:17;26743:28;;26800:3;26794:10;26827:2;26819:6;26816:14;26813:27;;;26833:5;;;;;;26351:671;:::o;26813:27::-;26917:2;26898:16;26892:4;26888:27;26884:36;26877:4;26868:6;26863:3;26859:16;26855:27;26852:69;26849:82;;;26924:5;;;;;;26351:671;:::o;26849:82::-;26940:57;26991:4;26982:6;26974;26970:19;26966:30;26960:4;26940:57;:::i;:::-;-1:-1:-1;27013:3:1;;26351:671;-1:-1:-1;;;;;26351:671:1:o;27448:404::-;27650:2;27632:21;;;27689:2;27669:18;;;27662:30;27728:34;27723:2;27708:18;;27701:62;-1:-1:-1;;;27794:2:1;27779:18;;27772:38;27842:3;27827:19;;27448:404::o;28259:561::-;-1:-1:-1;;;;;28556:15:1;;;28538:34;;28608:15;;28603:2;28588:18;;28581:43;28655:2;28640:18;;28633:34;;;28698:2;28683:18;;28676:34;;;28518:3;28741;28726:19;;28719:32;;;28481:4;;28768:46;;28794:19;;28786:6;28768:46;:::i;:::-;28760:54;28259:561;-1:-1:-1;;;;;;;28259:561:1:o;28825:125::-;28865:4;28893:1;28890;28887:8;28884:34;;;28898:18;;:::i;:::-;-1:-1:-1;28935:9:1;;28825:125::o

Swarm Source

ipfs://1248511566aecd8667ad19c1a6e3ece3127c9caf89916e3df480c90a3402e209
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.