ETH Price: $3,564.77 (+6.85%)

Token

Degen Pass (DEP)
 

Overview

Max Total Supply

222 DEP

Holders

217

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
ludus.eth
0x43ec5640e18f7384761d8817aa55d38c9a03d855
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Degen Pass is a collection of 222 NFTs that give you exclusive access to an alpha group where you are provided with whitelist giveaways, NFT-related tools, and top alpha from experienced people in the space.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
DegenPass

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
Yes with 5000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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



/**  
     ___                           ____                 
   / __ \___  ____ ____  ____     / __ \____ ___________
  / / / / _ \/ __ `/ _ \/ __ \   / /_/ / __ `/ ___/ ___/
 / /_/ /  __/ /_/ /  __/ / / /  / ____/ /_/ (__  |__  ) 
/_____/\___/\__, /\___/_/ /_/  /_/    \__,_/____/____/  
           /____/

**/



// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/security/ReentrancyGuard.sol


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

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/IERC1155Receiver.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;


/**
 * @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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/IERC1155.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;


/**
 * @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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol


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

pragma solidity ^0.8.0;


/**
 * @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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/ERC1155.sol


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

pragma solidity ^0.8.0;







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

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

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

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

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

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

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

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

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

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

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

        return batchBalances;
    }

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

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

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

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

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

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

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

        return array;
    }
}

// File: contracts/DegenPass.sol




contract DegenPass is ERC1155, Ownable, ReentrancyGuard {
    
  string public constant name = "Degen Pass";
  string public constant symbol = "DEP";

  uint private constant maxPasses = 222;
  uint public passCount = 0;
  uint private constant passID = 1;

  bool public isSecondPass = false;
  bool public isMintOpen = false;

  bytes32 public merkleRoot = 0xb273f668854fc22a03370abfa36c32b2db9837d8364b79c3b773328809e4bbfa;

  mapping(address => uint) public whiteListMints;

  constructor() ERC1155("ipfs://QmdMn3YvP3vGSSKBy5AqCJoEGxY51MC1D388QJ9Ea7p2Gw/metadata.json") {}

  /**
   Allows mintlisted members to mint 1 pass during the first pass and allows 
   them to mint 1 more during the second pass.
   */
  function mintListMint(bytes32[] calldata _merkleProof) external nonReentrant{
    require(passCount < maxPasses, "Sold out.");
    require((whiteListMints[msg.sender] < 1) || (isSecondPass && (whiteListMints[msg.sender] < 2)), "Reached mint limit.");
    require(MerkleProof.verify(_merkleProof, merkleRoot,keccak256(abi.encodePacked(msg.sender))), "Proof invalid.");
    require(isMintOpen, "Mint not open.");

    whiteListMints[msg.sender]++;
    passCount++;
    _mint(msg.sender, passID, 1, "");
  }

  function setSecondPass() external onlyOwner{
    isSecondPass = !isSecondPass;
  }
  
  function setMintOpen() external onlyOwner{
    isMintOpen = !isMintOpen;
  }

  function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner{
    merkleRoot = _merkleRoot;
  }

  /**
  Allows contract owner to mint while still under mint limit.
   */
  function ownerMint(address _to, uint _amount) external onlyOwner {
    require(passCount + _amount <= maxPasses, "Sold out.");
    passCount += _amount;
    _mint(_to, passID, _amount, "");
  }

  function setURI(string memory _uri) external onlyOwner {
    _setURI(_uri);
  }

  function totalSupply() external view returns (uint256) {
    return passCount;
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMintOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSecondPass","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mintListMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"passCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setMintOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setSecondPass","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whiteListMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

608060405260006005556006805461ffff191690557fb273f668854fc22a03370abfa36c32b2db9837d8364b79c3b773328809e4bbfa6007553480156200004557600080fd5b506040518060800160405280604381526020016200263d604391396200006b8162000082565b5062000077336200009b565b6001600455620001d0565b805162000097906002906020840190620000ed565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620000fb9062000193565b90600052602060002090601f0160209004810192826200011f57600085556200016a565b82601f106200013a57805160ff19168380011785556200016a565b828001600101855582156200016a579182015b828111156200016a5782518255916020019190600101906200014d565b50620001789291506200017c565b5090565b5b808211156200017857600081556001016200017d565b600181811c90821680620001a857607f821691505b60208210811415620001ca57634e487b7160e01b600052602260045260246000fd5b50919050565b61245d80620001e06000396000f3fe608060405234801561001057600080fd5b50600436106101a25760003560e01c80634a2de55b116100ee5780638da5cb5b11610097578063e985e9c511610071578063e985e9c5146103a0578063f242432a146103dc578063f2fde38b146103ef578063f8c98bd81461040257600080fd5b80638da5cb5b1461033657806395d89b4114610351578063a22cb4651461038d57600080fd5b8063715018a6116100c8578063715018a6146103125780637cb647591461031a5780638377dfd41461032d57600080fd5b80634a2de55b146102bf5780634e1273f4146102d25780635d655285146102f257600080fd5b806319908016116101505780632eb4a7ab1161012a5780632eb4a7ab1461029b5780632f85423a146102a4578063484b973c146102ac57600080fd5b806319908016146102695780631b579bd81461027b5780632eb2c2d61461028857600080fd5b806306fdde031161018157806306fdde03146102055780630e89341c1461024e57806318160ddd1461026157600080fd5b8062fdd58e146101a757806301ffc9a7146101cd57806302fe5305146101f0575b600080fd5b6101ba6101b5366004611b98565b61040a565b6040519081526020015b60405180910390f35b6101e06101db366004611bf0565b6104b3565b60405190151581526020016101c4565b6102036101fe366004611cce565b610598565b005b6102416040518060400160405280600a81526020017f446567656e20506173730000000000000000000000000000000000000000000081525081565b6040516101c49190611d6c565b61024161025c366004611d7f565b6105fe565b6005546101ba565b6006546101e090610100900460ff1681565b6006546101e09060ff1681565b610203610296366004611e4d565b610692565b6101ba60075481565b610203610734565b6102036102ba366004611b98565b6107c8565b6102036102cd366004611ef7565b6108b9565b6102e56102e0366004611f6c565b610b6e565b6040516101c49190612072565b6101ba610300366004612085565b60086020526000908152604090205481565b610203610cac565b610203610328366004611d7f565b610d12565b6101ba60055481565b6003546040516001600160a01b0390911681526020016101c4565b6102416040518060400160405280600381526020017f444550000000000000000000000000000000000000000000000000000000000081525081565b61020361039b3660046120a0565b610d71565b6101e06103ae3660046120dc565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6102036103ea36600461210f565b610d7c565b6102036103fd366004612085565b610e17565b610203610ef6565b60006001600160a01b03831661048d5760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201527f65726f206164647265737300000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a2600000000000000000000000000000000000000000000000000000000148061054657507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b8061059257507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6003546001600160a01b031633146105f25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610484565b6105fb81610f82565b50565b60606002805461060d90612174565b80601f016020809104026020016040519081016040528092919081815260200182805461063990612174565b80156106865780601f1061065b57610100808354040283529160200191610686565b820191906000526020600020905b81548152906001019060200180831161066957829003601f168201915b50505050509050919050565b6001600160a01b0385163314806106ae57506106ae85336103ae565b6107205760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006064820152608401610484565b61072d8585858585610f95565b5050505050565b6003546001600160a01b0316331461078e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610484565b600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff81166101009182900460ff1615909102179055565b6003546001600160a01b031633146108225760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610484565b60de8160055461083291906121f7565b11156108805760405162461bcd60e51b815260206004820152600960248201527f536f6c64206f75742e00000000000000000000000000000000000000000000006044820152606401610484565b806005600082825461089291906121f7565b925050819055506108b58260018360405180602001604052806000815250611233565b5050565b6002600454141561090c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610484565b600260045560055460de116109635760405162461bcd60e51b815260206004820152600960248201527f536f6c64206f75742e00000000000000000000000000000000000000000000006044820152606401610484565b336000908152600860205260409020546001118061099d575060065460ff16801561099d5750336000908152600860205260409020546002115b6109e95760405162461bcd60e51b815260206004820152601360248201527f52656163686564206d696e74206c696d69742e000000000000000000000000006044820152606401610484565b610a71828280806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506007546040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152909250603401905060405160208183030381529060405280519060200120611363565b610abd5760405162461bcd60e51b815260206004820152600e60248201527f50726f6f6620696e76616c69642e0000000000000000000000000000000000006044820152606401610484565b600654610100900460ff16610b145760405162461bcd60e51b815260206004820152600e60248201527f4d696e74206e6f74206f70656e2e0000000000000000000000000000000000006044820152606401610484565b336000908152600860205260408120805491610b2f8361220f565b909155505060058054906000610b448361220f565b9190505550610b653360018060405180602001604052806000815250611233565b50506001600455565b60608151835114610be75760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d6174636800000000000000000000000000000000000000000000006064820152608401610484565b6000835167ffffffffffffffff811115610c0357610c03611c14565b604051908082528060200260200182016040528015610c2c578160200160208202803683370190505b50905060005b8451811015610ca457610c77858281518110610c5057610c50612248565b6020026020010151858381518110610c6a57610c6a612248565b602002602001015161040a565b828281518110610c8957610c89612248565b6020908102919091010152610c9d8161220f565b9050610c32565b509392505050565b6003546001600160a01b03163314610d065760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610484565b610d106000611379565b565b6003546001600160a01b03163314610d6c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610484565b600755565b6108b53383836113e3565b6001600160a01b038516331480610d985750610d9885336103ae565b610e0a5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f76656400000000000000000000000000000000000000000000006064820152608401610484565b61072d85858585856114f6565b6003546001600160a01b03163314610e715760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610484565b6001600160a01b038116610eed5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610484565b6105fb81611379565b6003546001600160a01b03163314610f505760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610484565b600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b80516108b5906002906020840190611ae3565b815183511461100c5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d617463680000000000000000000000000000000000000000000000006064820152608401610484565b6001600160a01b0384166110885760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610484565b3360005b84518110156111c55760008582815181106110a9576110a9612248565b6020026020010151905060008583815181106110c7576110c7612248565b602090810291909101810151600084815280835260408082206001600160a01b038e16835290935291909120549091508181101561116d5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610484565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906111aa9084906121f7565b92505081905550505050806111be9061220f565b905061108c565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611215929190612277565b60405180910390a461122b8187878787876116cc565b505050505050565b6001600160a01b0384166112af5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610484565b3360006112bb856118d1565b905060006112c8856118d1565b90506000868152602081815260408083206001600160a01b038b168452909152812080548792906112fa9084906121f7565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461135a8360008989898961191c565b50505050505050565b6000826113708584611a77565b14949350505050565b600380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316141561146b5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c6600000000000000000000000000000000000000000000006064820152608401610484565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0384166115725760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610484565b33600061157e856118d1565b9050600061158b856118d1565b90506000868152602081815260408083206001600160a01b038c168452909152902054858110156116245760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610484565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a168252812080548892906116619084906121f7565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46116c1848a8a8a8a8a61191c565b505050505050505050565b6001600160a01b0384163b1561122b576040517fbc197c810000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063bc197c819061172990899089908890889088906004016122a5565b6020604051808303816000875af1925050508015611764575060408051601f3d908101601f1916820190925261176191810190612303565b60015b61181a57611770612320565b806308c379a014156117aa575061178561233c565b8061179057506117ac565b8060405162461bcd60e51b81526004016104849190611d6c565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e7465720000000000000000000000006064820152608401610484565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c81000000000000000000000000000000000000000000000000000000001461135a5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610484565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061190b5761190b612248565b602090810291909101015292915050565b6001600160a01b0384163b1561122b576040517ff23a6e610000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063f23a6e619061197990899089908890889088906004016123e4565b6020604051808303816000875af19250505080156119b4575060408051601f3d908101601f191682019092526119b191810190612303565b60015b6119c057611770612320565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e61000000000000000000000000000000000000000000000000000000001461135a5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610484565b600081815b8451811015610ca4576000858281518110611a9957611a99612248565b60200260200101519050808311611abf5760008381526020829052604090209250611ad0565b600081815260208490526040902092505b5080611adb8161220f565b915050611a7c565b828054611aef90612174565b90600052602060002090601f016020900481019282611b115760008555611b57565b82601f10611b2a57805160ff1916838001178555611b57565b82800160010185558215611b57579182015b82811115611b57578251825591602001919060010190611b3c565b50611b63929150611b67565b5090565b5b80821115611b635760008155600101611b68565b80356001600160a01b0381168114611b9357600080fd5b919050565b60008060408385031215611bab57600080fd5b611bb483611b7c565b946020939093013593505050565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146105fb57600080fd5b600060208284031215611c0257600080fd5b8135611c0d81611bc2565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff82111715611c6957611c69611c14565b6040525050565b600067ffffffffffffffff831115611c8a57611c8a611c14565b604051611ca16020601f19601f8701160182611c43565b809150838152848484011115611cb657600080fd5b83836020830137600060208583010152509392505050565b600060208284031215611ce057600080fd5b813567ffffffffffffffff811115611cf757600080fd5b8201601f81018413611d0857600080fd5b611d1784823560208401611c70565b949350505050565b6000815180845260005b81811015611d4557602081850181015186830182015201611d29565b81811115611d57576000602083870101525b50601f01601f19169290920160200192915050565b602081526000611c0d6020830184611d1f565b600060208284031215611d9157600080fd5b5035919050565b600067ffffffffffffffff821115611db257611db2611c14565b5060051b60200190565b600082601f830112611dcd57600080fd5b81356020611dda82611d98565b604051611de78282611c43565b83815260059390931b8501820192828101915086841115611e0757600080fd5b8286015b84811015611e225780358352918301918301611e0b565b509695505050505050565b600082601f830112611e3e57600080fd5b611c0d83833560208501611c70565b600080600080600060a08688031215611e6557600080fd5b611e6e86611b7c565b9450611e7c60208701611b7c565b9350604086013567ffffffffffffffff80821115611e9957600080fd5b611ea589838a01611dbc565b94506060880135915080821115611ebb57600080fd5b611ec789838a01611dbc565b93506080880135915080821115611edd57600080fd5b50611eea88828901611e2d565b9150509295509295909350565b60008060208385031215611f0a57600080fd5b823567ffffffffffffffff80821115611f2257600080fd5b818501915085601f830112611f3657600080fd5b813581811115611f4557600080fd5b8660208260051b8501011115611f5a57600080fd5b60209290920196919550909350505050565b60008060408385031215611f7f57600080fd5b823567ffffffffffffffff80821115611f9757600080fd5b818501915085601f830112611fab57600080fd5b81356020611fb882611d98565b604051611fc58282611c43565b83815260059390931b8501820192828101915089841115611fe557600080fd5b948201945b8386101561200a57611ffb86611b7c565b82529482019490820190611fea565b9650508601359250508082111561202057600080fd5b5061202d85828601611dbc565b9150509250929050565b600081518084526020808501945080840160005b838110156120675781518752958201959082019060010161204b565b509495945050505050565b602081526000611c0d6020830184612037565b60006020828403121561209757600080fd5b611c0d82611b7c565b600080604083850312156120b357600080fd5b6120bc83611b7c565b9150602083013580151581146120d157600080fd5b809150509250929050565b600080604083850312156120ef57600080fd5b6120f883611b7c565b915061210660208401611b7c565b90509250929050565b600080600080600060a0868803121561212757600080fd5b61213086611b7c565b945061213e60208701611b7c565b93506040860135925060608601359150608086013567ffffffffffffffff81111561216857600080fd5b611eea88828901611e2d565b600181811c9082168061218857607f821691505b602082108114156121c2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561220a5761220a6121c8565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612241576122416121c8565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60408152600061228a6040830185612037565b828103602084015261229c8185612037565b95945050505050565b60006001600160a01b03808816835280871660208401525060a060408301526122d160a0830186612037565b82810360608401526122e38186612037565b905082810360808401526122f78185611d1f565b98975050505050505050565b60006020828403121561231557600080fd5b8151611c0d81611bc2565b600060033d11156123395760046000803e5060005160e01c5b90565b600060443d101561234a5790565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc803d016004833e81513d67ffffffffffffffff816024840111818411171561239857505050505090565b82850191508151818111156123b05750505050505090565b843d87010160208285010111156123ca5750505050505090565b6123d960208286010187611c43565b509095945050505050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a0608083015261241c60a0830184611d1f565b97965050505050505056fea2646970667358221220865fab381d3d28ff78a6f85e1f9ea4b80b1974534177716cbc4b2e8d624a707064736f6c634300080c0033697066733a2f2f516d644d6e3359765033764753534b4279354171434a6f4547785935314d433144333838514a39456137703247772f6d657461646174612e6a736f6e

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101a25760003560e01c80634a2de55b116100ee5780638da5cb5b11610097578063e985e9c511610071578063e985e9c5146103a0578063f242432a146103dc578063f2fde38b146103ef578063f8c98bd81461040257600080fd5b80638da5cb5b1461033657806395d89b4114610351578063a22cb4651461038d57600080fd5b8063715018a6116100c8578063715018a6146103125780637cb647591461031a5780638377dfd41461032d57600080fd5b80634a2de55b146102bf5780634e1273f4146102d25780635d655285146102f257600080fd5b806319908016116101505780632eb4a7ab1161012a5780632eb4a7ab1461029b5780632f85423a146102a4578063484b973c146102ac57600080fd5b806319908016146102695780631b579bd81461027b5780632eb2c2d61461028857600080fd5b806306fdde031161018157806306fdde03146102055780630e89341c1461024e57806318160ddd1461026157600080fd5b8062fdd58e146101a757806301ffc9a7146101cd57806302fe5305146101f0575b600080fd5b6101ba6101b5366004611b98565b61040a565b6040519081526020015b60405180910390f35b6101e06101db366004611bf0565b6104b3565b60405190151581526020016101c4565b6102036101fe366004611cce565b610598565b005b6102416040518060400160405280600a81526020017f446567656e20506173730000000000000000000000000000000000000000000081525081565b6040516101c49190611d6c565b61024161025c366004611d7f565b6105fe565b6005546101ba565b6006546101e090610100900460ff1681565b6006546101e09060ff1681565b610203610296366004611e4d565b610692565b6101ba60075481565b610203610734565b6102036102ba366004611b98565b6107c8565b6102036102cd366004611ef7565b6108b9565b6102e56102e0366004611f6c565b610b6e565b6040516101c49190612072565b6101ba610300366004612085565b60086020526000908152604090205481565b610203610cac565b610203610328366004611d7f565b610d12565b6101ba60055481565b6003546040516001600160a01b0390911681526020016101c4565b6102416040518060400160405280600381526020017f444550000000000000000000000000000000000000000000000000000000000081525081565b61020361039b3660046120a0565b610d71565b6101e06103ae3660046120dc565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6102036103ea36600461210f565b610d7c565b6102036103fd366004612085565b610e17565b610203610ef6565b60006001600160a01b03831661048d5760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201527f65726f206164647265737300000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a2600000000000000000000000000000000000000000000000000000000148061054657507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b8061059257507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6003546001600160a01b031633146105f25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610484565b6105fb81610f82565b50565b60606002805461060d90612174565b80601f016020809104026020016040519081016040528092919081815260200182805461063990612174565b80156106865780601f1061065b57610100808354040283529160200191610686565b820191906000526020600020905b81548152906001019060200180831161066957829003601f168201915b50505050509050919050565b6001600160a01b0385163314806106ae57506106ae85336103ae565b6107205760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006064820152608401610484565b61072d8585858585610f95565b5050505050565b6003546001600160a01b0316331461078e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610484565b600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff81166101009182900460ff1615909102179055565b6003546001600160a01b031633146108225760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610484565b60de8160055461083291906121f7565b11156108805760405162461bcd60e51b815260206004820152600960248201527f536f6c64206f75742e00000000000000000000000000000000000000000000006044820152606401610484565b806005600082825461089291906121f7565b925050819055506108b58260018360405180602001604052806000815250611233565b5050565b6002600454141561090c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610484565b600260045560055460de116109635760405162461bcd60e51b815260206004820152600960248201527f536f6c64206f75742e00000000000000000000000000000000000000000000006044820152606401610484565b336000908152600860205260409020546001118061099d575060065460ff16801561099d5750336000908152600860205260409020546002115b6109e95760405162461bcd60e51b815260206004820152601360248201527f52656163686564206d696e74206c696d69742e000000000000000000000000006044820152606401610484565b610a71828280806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506007546040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152909250603401905060405160208183030381529060405280519060200120611363565b610abd5760405162461bcd60e51b815260206004820152600e60248201527f50726f6f6620696e76616c69642e0000000000000000000000000000000000006044820152606401610484565b600654610100900460ff16610b145760405162461bcd60e51b815260206004820152600e60248201527f4d696e74206e6f74206f70656e2e0000000000000000000000000000000000006044820152606401610484565b336000908152600860205260408120805491610b2f8361220f565b909155505060058054906000610b448361220f565b9190505550610b653360018060405180602001604052806000815250611233565b50506001600455565b60608151835114610be75760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d6174636800000000000000000000000000000000000000000000006064820152608401610484565b6000835167ffffffffffffffff811115610c0357610c03611c14565b604051908082528060200260200182016040528015610c2c578160200160208202803683370190505b50905060005b8451811015610ca457610c77858281518110610c5057610c50612248565b6020026020010151858381518110610c6a57610c6a612248565b602002602001015161040a565b828281518110610c8957610c89612248565b6020908102919091010152610c9d8161220f565b9050610c32565b509392505050565b6003546001600160a01b03163314610d065760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610484565b610d106000611379565b565b6003546001600160a01b03163314610d6c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610484565b600755565b6108b53383836113e3565b6001600160a01b038516331480610d985750610d9885336103ae565b610e0a5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f76656400000000000000000000000000000000000000000000006064820152608401610484565b61072d85858585856114f6565b6003546001600160a01b03163314610e715760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610484565b6001600160a01b038116610eed5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610484565b6105fb81611379565b6003546001600160a01b03163314610f505760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610484565b600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b80516108b5906002906020840190611ae3565b815183511461100c5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d617463680000000000000000000000000000000000000000000000006064820152608401610484565b6001600160a01b0384166110885760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610484565b3360005b84518110156111c55760008582815181106110a9576110a9612248565b6020026020010151905060008583815181106110c7576110c7612248565b602090810291909101810151600084815280835260408082206001600160a01b038e16835290935291909120549091508181101561116d5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610484565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906111aa9084906121f7565b92505081905550505050806111be9061220f565b905061108c565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611215929190612277565b60405180910390a461122b8187878787876116cc565b505050505050565b6001600160a01b0384166112af5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610484565b3360006112bb856118d1565b905060006112c8856118d1565b90506000868152602081815260408083206001600160a01b038b168452909152812080548792906112fa9084906121f7565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461135a8360008989898961191c565b50505050505050565b6000826113708584611a77565b14949350505050565b600380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316141561146b5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c6600000000000000000000000000000000000000000000006064820152608401610484565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0384166115725760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610484565b33600061157e856118d1565b9050600061158b856118d1565b90506000868152602081815260408083206001600160a01b038c168452909152902054858110156116245760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610484565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a168252812080548892906116619084906121f7565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46116c1848a8a8a8a8a61191c565b505050505050505050565b6001600160a01b0384163b1561122b576040517fbc197c810000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063bc197c819061172990899089908890889088906004016122a5565b6020604051808303816000875af1925050508015611764575060408051601f3d908101601f1916820190925261176191810190612303565b60015b61181a57611770612320565b806308c379a014156117aa575061178561233c565b8061179057506117ac565b8060405162461bcd60e51b81526004016104849190611d6c565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e7465720000000000000000000000006064820152608401610484565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c81000000000000000000000000000000000000000000000000000000001461135a5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610484565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061190b5761190b612248565b602090810291909101015292915050565b6001600160a01b0384163b1561122b576040517ff23a6e610000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063f23a6e619061197990899089908890889088906004016123e4565b6020604051808303816000875af19250505080156119b4575060408051601f3d908101601f191682019092526119b191810190612303565b60015b6119c057611770612320565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e61000000000000000000000000000000000000000000000000000000001461135a5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610484565b600081815b8451811015610ca4576000858281518110611a9957611a99612248565b60200260200101519050808311611abf5760008381526020829052604090209250611ad0565b600081815260208490526040902092505b5080611adb8161220f565b915050611a7c565b828054611aef90612174565b90600052602060002090601f016020900481019282611b115760008555611b57565b82601f10611b2a57805160ff1916838001178555611b57565b82800160010185558215611b57579182015b82811115611b57578251825591602001919060010190611b3c565b50611b63929150611b67565b5090565b5b80821115611b635760008155600101611b68565b80356001600160a01b0381168114611b9357600080fd5b919050565b60008060408385031215611bab57600080fd5b611bb483611b7c565b946020939093013593505050565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146105fb57600080fd5b600060208284031215611c0257600080fd5b8135611c0d81611bc2565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff82111715611c6957611c69611c14565b6040525050565b600067ffffffffffffffff831115611c8a57611c8a611c14565b604051611ca16020601f19601f8701160182611c43565b809150838152848484011115611cb657600080fd5b83836020830137600060208583010152509392505050565b600060208284031215611ce057600080fd5b813567ffffffffffffffff811115611cf757600080fd5b8201601f81018413611d0857600080fd5b611d1784823560208401611c70565b949350505050565b6000815180845260005b81811015611d4557602081850181015186830182015201611d29565b81811115611d57576000602083870101525b50601f01601f19169290920160200192915050565b602081526000611c0d6020830184611d1f565b600060208284031215611d9157600080fd5b5035919050565b600067ffffffffffffffff821115611db257611db2611c14565b5060051b60200190565b600082601f830112611dcd57600080fd5b81356020611dda82611d98565b604051611de78282611c43565b83815260059390931b8501820192828101915086841115611e0757600080fd5b8286015b84811015611e225780358352918301918301611e0b565b509695505050505050565b600082601f830112611e3e57600080fd5b611c0d83833560208501611c70565b600080600080600060a08688031215611e6557600080fd5b611e6e86611b7c565b9450611e7c60208701611b7c565b9350604086013567ffffffffffffffff80821115611e9957600080fd5b611ea589838a01611dbc565b94506060880135915080821115611ebb57600080fd5b611ec789838a01611dbc565b93506080880135915080821115611edd57600080fd5b50611eea88828901611e2d565b9150509295509295909350565b60008060208385031215611f0a57600080fd5b823567ffffffffffffffff80821115611f2257600080fd5b818501915085601f830112611f3657600080fd5b813581811115611f4557600080fd5b8660208260051b8501011115611f5a57600080fd5b60209290920196919550909350505050565b60008060408385031215611f7f57600080fd5b823567ffffffffffffffff80821115611f9757600080fd5b818501915085601f830112611fab57600080fd5b81356020611fb882611d98565b604051611fc58282611c43565b83815260059390931b8501820192828101915089841115611fe557600080fd5b948201945b8386101561200a57611ffb86611b7c565b82529482019490820190611fea565b9650508601359250508082111561202057600080fd5b5061202d85828601611dbc565b9150509250929050565b600081518084526020808501945080840160005b838110156120675781518752958201959082019060010161204b565b509495945050505050565b602081526000611c0d6020830184612037565b60006020828403121561209757600080fd5b611c0d82611b7c565b600080604083850312156120b357600080fd5b6120bc83611b7c565b9150602083013580151581146120d157600080fd5b809150509250929050565b600080604083850312156120ef57600080fd5b6120f883611b7c565b915061210660208401611b7c565b90509250929050565b600080600080600060a0868803121561212757600080fd5b61213086611b7c565b945061213e60208701611b7c565b93506040860135925060608601359150608086013567ffffffffffffffff81111561216857600080fd5b611eea88828901611e2d565b600181811c9082168061218857607f821691505b602082108114156121c2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561220a5761220a6121c8565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612241576122416121c8565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60408152600061228a6040830185612037565b828103602084015261229c8185612037565b95945050505050565b60006001600160a01b03808816835280871660208401525060a060408301526122d160a0830186612037565b82810360608401526122e38186612037565b905082810360808401526122f78185611d1f565b98975050505050505050565b60006020828403121561231557600080fd5b8151611c0d81611bc2565b600060033d11156123395760046000803e5060005160e01c5b90565b600060443d101561234a5790565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc803d016004833e81513d67ffffffffffffffff816024840111818411171561239857505050505090565b82850191508151818111156123b05750505050505090565b843d87010160208285010111156123ca5750505050505090565b6123d960208286010187611c43565b509095945050505050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a0608083015261241c60a0830184611d1f565b97965050505050505056fea2646970667358221220865fab381d3d28ff78a6f85e1f9ea4b80b1974534177716cbc4b2e8d624a707064736f6c634300080c0033

Deployed Bytecode Sourcemap

45219:1993:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29797:231;;;;;;:::i;:::-;;:::i;:::-;;;620:25:1;;;608:2;593:18;29797:231:0;;;;;;;;28820:310;;;;;;:::i;:::-;;:::i;:::-;;;1253:14:1;;1246:22;1228:41;;1216:2;1201:18;28820:310:0;1088:187:1;47038:81:0;;;;;;:::i;:::-;;:::i;:::-;;45286:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;29541:105::-;;;;;;:::i;:::-;;:::i;47125:84::-;47194:9;;47125:84;;45525:30;;;;;;;;;;;;45488:32;;;;;;;;;31736:442;;;;;;:::i;:::-;;:::i;45562:94::-;;;;;;46569:78;;;:::i;46835:197::-;;;;;;:::i;:::-;;:::i;45958:513::-;;;;;;:::i;:::-;;:::i;30194:524::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;45663:46::-;;;;;;:::i;:::-;;;;;;;;;;;;;;8655:103;;;:::i;46653:99::-;;;;;;:::i;:::-;;:::i;45419:25::-;;;;;;8004:87;8077:6;;8004:87;;-1:-1:-1;;;;;8077:6:0;;;9051:74:1;;9039:2;9024:18;8004:87:0;8905:226:1;45333:37:0;;;;;;;;;;;;;;;;;;;;;30791:155;;;;;;:::i;:::-;;:::i;31018:168::-;;;;;;:::i;:::-;-1:-1:-1;;;;;31141:27:0;;;31117:4;31141:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;31018:168;31258:401;;;;;;:::i;:::-;;:::i;8913:201::-;;;;;;:::i;:::-;;:::i;46477:84::-;;;:::i;29797:231::-;29883:7;-1:-1:-1;;;;;29911:21:0;;29903:77;;;;-1:-1:-1;;;29903:77:0;;10566:2:1;29903:77:0;;;10548:21:1;10605:2;10585:18;;;10578:30;10644:34;10624:18;;;10617:62;10715:13;10695:18;;;10688:41;10746:19;;29903:77:0;;;;;;;;;-1:-1:-1;29998:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;29998:22:0;;;;;;;;;;;;29797:231::o;28820:310::-;28922:4;28959:41;;;28974:26;28959:41;;:110;;-1:-1:-1;29017:52:0;;;29032:37;29017:52;28959:110;:163;;;-1:-1:-1;20040:25:0;20025:40;;;;29086:36;28939:183;28820:310;-1:-1:-1;;28820:310:0:o;47038:81::-;8077:6;;-1:-1:-1;;;;;8077:6:0;6755:10;8224:23;8216:68;;;;-1:-1:-1;;;8216:68:0;;10978:2:1;8216:68:0;;;10960:21:1;;;10997:18;;;10990:30;11056:34;11036:18;;;11029:62;11108:18;;8216:68:0;10776:356:1;8216:68:0;47100:13:::1;47108:4;47100:7;:13::i;:::-;47038:81:::0;:::o;29541:105::-;29601:13;29634:4;29627:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29541:105;;;:::o;31736:442::-;-1:-1:-1;;;;;31969:20:0;;6755:10;31969:20;;:60;;-1:-1:-1;31993:36:0;32010:4;6755:10;31018:168;:::i;31993:36::-;31947:160;;;;-1:-1:-1;;;31947:160:0;;11781:2:1;31947:160:0;;;11763:21:1;11820:2;11800:18;;;11793:30;11859:34;11839:18;;;11832:62;11930:20;11910:18;;;11903:48;11968:19;;31947:160:0;11579:414:1;31947:160:0;32118:52;32141:4;32147:2;32151:3;32156:7;32165:4;32118:22;:52::i;:::-;31736:442;;;;;:::o;46569:78::-;8077:6;;-1:-1:-1;;;;;8077:6:0;6755:10;8224:23;8216:68;;;;-1:-1:-1;;;8216:68:0;;10978:2:1;8216:68:0;;;10960:21:1;;;10997:18;;;10990:30;11056:34;11036:18;;;11029:62;11108:18;;8216:68:0;10776:356:1;8216:68:0;46631:10:::1;::::0;;46617:24;;::::1;46631:10;::::0;;;::::1;;;46630:11;46617:24:::0;;::::1;;::::0;;46569:78::o;46835:197::-;8077:6;;-1:-1:-1;;;;;8077:6:0;6755:10;8224:23;8216:68;;;;-1:-1:-1;;;8216:68:0;;10978:2:1;8216:68:0;;;10960:21:1;;;10997:18;;;10990:30;11056:34;11036:18;;;11029:62;11108:18;;8216:68:0;10776:356:1;8216:68:0;45411:3:::1;46927:7;46915:9;;:19;;;;:::i;:::-;:32;;46907:54;;;::::0;-1:-1:-1;;;46907:54:0;;12522:2:1;46907:54:0::1;::::0;::::1;12504:21:1::0;12561:1;12541:18;;;12534:29;12599:11;12579:18;;;12572:39;12628:18;;46907:54:0::1;12320:332:1::0;46907:54:0::1;46981:7;46968:9;;:20;;;;;;;:::i;:::-;;;;;;;;46995:31;47001:3;45480:1;47014:7;46995:31;;;;;;;;;;;::::0;:5:::1;:31::i;:::-;46835:197:::0;;:::o;45958:513::-;4996:1;5594:7;;:19;;5586:63;;;;-1:-1:-1;;;5586:63:0;;12859:2:1;5586:63:0;;;12841:21:1;12898:2;12878:18;;;12871:30;12937:33;12917:18;;;12910:61;12988:18;;5586:63:0;12657:355:1;5586:63:0;4996:1;5727:7;:18;46049:9:::1;::::0;45411:3:::1;-1:-1:-1::0;46041:43:0::1;;;::::0;-1:-1:-1;;;46041:43:0;;12522:2:1;46041:43:0::1;::::0;::::1;12504:21:1::0;12561:1;12541:18;;;12534:29;12599:11;12579:18;;;12572:39;12628:18;;46041:43:0::1;12320:332:1::0;46041:43:0::1;46115:10;46100:26;::::0;;;:14:::1;:26;::::0;;;;;46129:1:::1;-1:-1:-1::0;46100:30:0;46099:86:::1;;-1:-1:-1::0;46136:12:0::1;::::0;::::1;;:48:::0;::::1;;;-1:-1:-1::0;46168:10:0::1;46153:26;::::0;;;:14:::1;:26;::::0;;;;;46182:1:::1;-1:-1:-1::0;46136:48:0::1;46091:118;;;::::0;-1:-1:-1;;;46091:118:0;;13219:2:1;46091:118:0::1;::::0;::::1;13201:21:1::0;13258:2;13238:18;;;13231:30;13297:21;13277:18;;;13270:49;13336:18;;46091:118:0::1;13017:343:1::0;46091:118:0::1;46224:84;46243:12;;46224:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;46257:10:0::1;::::0;46278:28:::1;::::0;13527:66:1;46295:10:0::1;13514:2:1::0;13510:15;13506:88;46278:28:0::1;::::0;::::1;13494:101:1::0;46257:10:0;;-1:-1:-1;13611:12:1;;;-1:-1:-1;46278:28:0::1;;;;;;;;;;;;46268:39;;;;;;46224:18;:84::i;:::-;46216:111;;;::::0;-1:-1:-1;;;46216:111:0;;13836:2:1;46216:111:0::1;::::0;::::1;13818:21:1::0;13875:2;13855:18;;;13848:30;13914:16;13894:18;;;13887:44;13948:18;;46216:111:0::1;13634:338:1::0;46216:111:0::1;46342:10;::::0;::::1;::::0;::::1;;;46334:37;;;::::0;-1:-1:-1;;;46334:37:0;;14179:2:1;46334:37:0::1;::::0;::::1;14161:21:1::0;14218:2;14198:18;;;14191:30;14257:16;14237:18;;;14230:44;14291:18;;46334:37:0::1;13977:338:1::0;46334:37:0::1;46395:10;46380:26;::::0;;;:14:::1;:26;::::0;;;;:28;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;46415:9:0::1;:11:::0;;;:9:::1;:11;::::0;::::1;:::i;:::-;;;;;;46433:32;46439:10;45480:1;46459::::0;46433:32:::1;;;;;;;;;;;::::0;:5:::1;:32::i;:::-;-1:-1:-1::0;;4952:1:0;5906:7;:22;45958:513::o;30194:524::-;30350:16;30411:3;:10;30392:8;:15;:29;30384:83;;;;-1:-1:-1;;;30384:83:0;;14722:2:1;30384:83:0;;;14704:21:1;14761:2;14741:18;;;14734:30;14800:34;14780:18;;;14773:62;14871:11;14851:18;;;14844:39;14900:19;;30384:83:0;14520:405:1;30384:83:0;30480:30;30527:8;:15;30513:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30513:30:0;;30480:63;;30561:9;30556:122;30580:8;:15;30576:1;:19;30556:122;;;30636:30;30646:8;30655:1;30646:11;;;;;;;;:::i;:::-;;;;;;;30659:3;30663:1;30659:6;;;;;;;;:::i;:::-;;;;;;;30636:9;:30::i;:::-;30617:13;30631:1;30617:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;30597:3;;;:::i;:::-;;;30556:122;;;-1:-1:-1;30697:13:0;30194:524;-1:-1:-1;;;30194:524:0:o;8655:103::-;8077:6;;-1:-1:-1;;;;;8077:6:0;6755:10;8224:23;8216:68;;;;-1:-1:-1;;;8216:68:0;;10978:2:1;8216:68:0;;;10960:21:1;;;10997:18;;;10990:30;11056:34;11036:18;;;11029:62;11108:18;;8216:68:0;10776:356:1;8216:68:0;8720:30:::1;8747:1;8720:18;:30::i;:::-;8655:103::o:0;46653:99::-;8077:6;;-1:-1:-1;;;;;8077:6:0;6755:10;8224:23;8216:68;;;;-1:-1:-1;;;8216:68:0;;10978:2:1;8216:68:0;;;10960:21:1;;;10997:18;;;10990:30;11056:34;11036:18;;;11029:62;11108:18;;8216:68:0;10776:356:1;8216:68:0;46722:10:::1;:24:::0;46653:99::o;30791:155::-;30886:52;6755:10;30919:8;30929;30886:18;:52::i;31258:401::-;-1:-1:-1;;;;;31466:20:0;;6755:10;31466:20;;:60;;-1:-1:-1;31490:36:0;31507:4;6755:10;31018:168;:::i;31490:36::-;31444:151;;;;-1:-1:-1;;;31444:151:0;;15321:2:1;31444:151:0;;;15303:21:1;15360:2;15340:18;;;15333:30;15399:34;15379:18;;;15372:62;15470:11;15450:18;;;15443:39;15499:19;;31444:151:0;15119:405:1;31444:151:0;31606:45;31624:4;31630:2;31634;31638:6;31646:4;31606:17;:45::i;8913:201::-;8077:6;;-1:-1:-1;;;;;8077:6:0;6755:10;8224:23;8216:68;;;;-1:-1:-1;;;8216:68:0;;10978:2:1;8216:68:0;;;10960:21:1;;;10997:18;;;10990:30;11056:34;11036:18;;;11029:62;11108:18;;8216:68:0;10776:356:1;8216:68:0;-1:-1:-1;;;;;9002:22:0;::::1;8994:73;;;::::0;-1:-1:-1;;;8994:73:0;;15731:2:1;8994:73:0::1;::::0;::::1;15713:21:1::0;15770:2;15750:18;;;15743:30;15809:34;15789:18;;;15782:62;15880:8;15860:18;;;15853:36;15906:19;;8994:73:0::1;15529:402:1::0;8994:73:0::1;9078:28;9097:8;9078:18;:28::i;46477:84::-:0;8077:6;;-1:-1:-1;;;;;8077:6:0;6755:10;8224:23;8216:68;;;;-1:-1:-1;;;8216:68:0;;10978:2:1;8216:68:0;;;10960:21:1;;;10997:18;;;10990:30;11056:34;11036:18;;;11029:62;11108:18;;8216:68:0;10776:356:1;8216:68:0;46543:12:::1;::::0;;46527:28;;::::1;46543:12;::::0;;::::1;46542:13;46527:28;::::0;;46477:84::o;35964:88::-;36031:13;;;;:4;;:13;;;;;:::i;33974:1146::-;34201:7;:14;34187:3;:10;:28;34179:81;;;;-1:-1:-1;;;34179:81:0;;16138:2:1;34179:81:0;;;16120:21:1;16177:2;16157:18;;;16150:30;16216:34;16196:18;;;16189:62;16287:10;16267:18;;;16260:38;16315:19;;34179:81:0;15936:404:1;34179:81:0;-1:-1:-1;;;;;34279:16:0;;34271:66;;;;-1:-1:-1;;;34271:66:0;;16547:2:1;34271:66:0;;;16529:21:1;16586:2;16566:18;;;16559:30;16625:34;16605:18;;;16598:62;16696:7;16676:18;;;16669:35;16721:19;;34271:66:0;16345:401:1;34271:66:0;6755:10;34350:16;34467:421;34491:3;:10;34487:1;:14;34467:421;;;34523:10;34536:3;34540:1;34536:6;;;;;;;;:::i;:::-;;;;;;;34523:19;;34557:14;34574:7;34582:1;34574:10;;;;;;;;:::i;:::-;;;;;;;;;;;;34601:19;34623:13;;;;;;;;;;-1:-1:-1;;;;;34623:19:0;;;;;;;;;;;;34574:10;;-1:-1:-1;34665:21:0;;;;34657:76;;;;-1:-1:-1;;;34657:76:0;;16953:2:1;34657:76:0;;;16935:21:1;16992:2;16972:18;;;16965:30;17031:34;17011:18;;;17004:62;17102:12;17082:18;;;17075:40;17132:19;;34657:76:0;16751:406:1;34657:76:0;34777:9;:13;;;;;;;;;;;-1:-1:-1;;;;;34777:19:0;;;;;;;;;;34799:20;;;34777:42;;34849:17;;;;;;;:27;;34799:20;;34777:9;34849:27;;34799:20;;34849:27;:::i;:::-;;;;;;;;34508:380;;;34503:3;;;;:::i;:::-;;;34467:421;;;;34935:2;-1:-1:-1;;;;;34905:47:0;34929:4;-1:-1:-1;;;;;34905:47:0;34919:8;-1:-1:-1;;;;;34905:47:0;;34939:3;34944:7;34905:47;;;;;;;:::i;:::-;;;;;;;;35037:75;35073:8;35083:4;35089:2;35093:3;35098:7;35107:4;35037:35;:75::i;:::-;34168:952;33974:1146;;;;;:::o;36438:729::-;-1:-1:-1;;;;;36591:16:0;;36583:62;;;;-1:-1:-1;;;36583:62:0;;17834:2:1;36583:62:0;;;17816:21:1;17873:2;17853:18;;;17846:30;17912:34;17892:18;;;17885:62;17983:3;17963:18;;;17956:31;18004:19;;36583:62:0;17632:397:1;36583:62:0;6755:10;36658:16;36723:21;36741:2;36723:17;:21::i;:::-;36700:44;;36755:24;36782:25;36800:6;36782:17;:25::i;:::-;36755:52;;36899:9;:13;;;;;;;;;;;-1:-1:-1;;;;;36899:17:0;;;;;;;;;:27;;36920:6;;36899:9;:27;;36920:6;;36899:27;:::i;:::-;;;;-1:-1:-1;;36942:52:0;;;18208:25:1;;;18264:2;18249:18;;18242:34;;;-1:-1:-1;;;;;36942:52:0;;;;36975:1;;36942:52;;;;;;18181:18:1;36942:52:0;;;;;;;37085:74;37116:8;37134:1;37138:2;37142;37146:6;37154:4;37085:30;:74::i;:::-;36572:595;;;36438:729;;;;:::o;1666:190::-;1791:4;1844;1815:25;1828:5;1835:4;1815:12;:25::i;:::-;:33;;1666:190;-1:-1:-1;;;;1666:190:0:o;9274:191::-;9367:6;;;-1:-1:-1;;;;;9384:17:0;;;;;;;;;;;9417:40;;9367:6;;;9384:17;9367:6;;9417:40;;9348:16;;9417:40;9337:128;9274:191;:::o;40708:331::-;40863:8;-1:-1:-1;;;;;40854:17:0;:5;-1:-1:-1;;;;;40854:17:0;;;40846:71;;;;-1:-1:-1;;;40846:71:0;;18489:2:1;40846:71:0;;;18471:21:1;18528:2;18508:18;;;18501:30;18567:34;18547:18;;;18540:62;18638:11;18618:18;;;18611:39;18667:19;;40846:71:0;18287:405:1;40846:71:0;-1:-1:-1;;;;;40928:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;;;;;;;;;;;;40990:41;;1228::1;;;40990::0;;1201:18:1;40990:41:0;;;;;;;40708:331;;;:::o;32642:974::-;-1:-1:-1;;;;;32830:16:0;;32822:66;;;;-1:-1:-1;;;32822:66:0;;16547:2:1;32822:66:0;;;16529:21:1;16586:2;16566:18;;;16559:30;16625:34;16605:18;;;16598:62;16696:7;16676:18;;;16669:35;16721:19;;32822:66:0;16345:401:1;32822:66:0;6755:10;32901:16;32966:21;32984:2;32966:17;:21::i;:::-;32943:44;;32998:24;33025:25;33043:6;33025:17;:25::i;:::-;32998:52;;33136:19;33158:13;;;;;;;;;;;-1:-1:-1;;;;;33158:19:0;;;;;;;;;;33196:21;;;;33188:76;;;;-1:-1:-1;;;33188:76:0;;16953:2:1;33188:76:0;;;16935:21:1;16992:2;16972:18;;;16965:30;17031:34;17011:18;;;17004:62;17102:12;17082:18;;;17075:40;17132:19;;33188:76:0;16751:406:1;33188:76:0;33300:9;:13;;;;;;;;;;;-1:-1:-1;;;;;33300:19:0;;;;;;;;;;33322:20;;;33300:42;;33364:17;;;;;;;:27;;33322:20;;33300:9;33364:27;;33322:20;;33364:27;:::i;:::-;;;;-1:-1:-1;;33409:46:0;;;18208:25:1;;;18264:2;18249:18;;18242:34;;;-1:-1:-1;;;;;33409:46:0;;;;;;;;;;;;;;18181:18:1;33409:46:0;;;;;;;33540:68;33571:8;33581:4;33587:2;33591;33595:6;33603:4;33540:30;:68::i;:::-;32811:805;;;;32642:974;;;;;:::o;44151:813::-;-1:-1:-1;;;;;44391:13:0;;11053:19;:23;44387:570;;44427:79;;;;;-1:-1:-1;;;;;44427:43:0;;;;;:79;;44471:8;;44481:4;;44487:3;;44492:7;;44501:4;;44427:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44427:79:0;;;;;;;;-1:-1:-1;;44427:79:0;;;;;;;;;;;;:::i;:::-;;;44423:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;44819:6;44812:14;;-1:-1:-1;;;44812:14:0;;;;;;;;:::i;44423:523::-;;;44868:62;;-1:-1:-1;;;44868:62:0;;20928:2:1;44868:62:0;;;20910:21:1;20967:2;20947:18;;;20940:30;21006:34;20986:18;;;20979:62;21077:22;21057:18;;;21050:50;21117:19;;44868:62:0;20726:416:1;44423:523:0;44588:60;;;44600:48;44588:60;44584:159;;44673:50;;-1:-1:-1;;;44673:50:0;;21349:2:1;44673:50:0;;;21331:21:1;21388:2;21368:18;;;21361:30;21427:34;21407:18;;;21400:62;21498:10;21478:18;;;21471:38;21526:19;;44673:50:0;21147:404:1;44972:198:0;45092:16;;;45106:1;45092:16;;;;;;;;;45038;;45067:22;;45092:16;;;;;;;;;;;;-1:-1:-1;45092:16:0;45067:41;;45130:7;45119:5;45125:1;45119:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;45157:5;44972:198;-1:-1:-1;;44972:198:0:o;43399:744::-;-1:-1:-1;;;;;43614:13:0;;11053:19;:23;43610:526;;43650:72;;;;;-1:-1:-1;;;;;43650:38:0;;;;;:72;;43689:8;;43699:4;;43705:2;;43709:6;;43717:4;;43650:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43650:72:0;;;;;;;;-1:-1:-1;;43650:72:0;;;;;;;;;;;;:::i;:::-;;;43646:479;;;;:::i;:::-;43772:55;;;43784:43;43772:55;43768:154;;43852:50;;-1:-1:-1;;;43852:50:0;;21349:2:1;43852:50:0;;;21331:21:1;21388:2;21368:18;;;21361:30;21427:34;21407:18;;;21400:62;21498:10;21478:18;;;21471:38;21526:19;;43852:50:0;21147:404:1;2217:675:0;2300:7;2343:4;2300:7;2358:497;2382:5;:12;2378:1;:16;2358:497;;;2416:20;2439:5;2445:1;2439:8;;;;;;;;:::i;:::-;;;;;;;2416:31;;2482:12;2466;:28;2462:382;;2968:13;3018:15;;;3054:4;3047:15;;;3101:4;3085:21;;2594:57;;2462:382;;;2968:13;3018:15;;;3054:4;3047:15;;;3101:4;3085:21;;2771:57;;2462:382;-1:-1:-1;2396:3:0;;;;:::i;:::-;;;;2358:497;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:196:1;82:20;;-1:-1:-1;;;;;131:54:1;;121:65;;111:93;;200:1;197;190:12;111:93;14:196;;;:::o;215:254::-;283:6;291;344:2;332:9;323:7;319:23;315:32;312:52;;;360:1;357;350:12;312:52;383:29;402:9;383:29;:::i;:::-;373:39;459:2;444:18;;;;431:32;;-1:-1:-1;;;215:254:1:o;656:177::-;741:66;734:5;730:78;723:5;720:89;710:117;;823:1;820;813:12;838:245;896:6;949:2;937:9;928:7;924:23;920:32;917:52;;;965:1;962;955:12;917:52;1004:9;991:23;1023:30;1047:5;1023:30;:::i;:::-;1072:5;838:245;-1:-1:-1;;;838:245:1:o;1280:184::-;1332:77;1329:1;1322:88;1429:4;1426:1;1419:15;1453:4;1450:1;1443:15;1469:308;-1:-1:-1;;1570:2:1;1564:4;1560:13;1556:86;1548:6;1544:99;1709:6;1697:10;1694:22;1673:18;1661:10;1658:34;1655:62;1652:88;;;1720:18;;:::i;:::-;1756:2;1749:22;-1:-1:-1;;1469:308:1:o;1782:528::-;1847:5;1881:18;1873:6;1870:30;1867:56;;;1903:18;;:::i;:::-;1952:2;1946:9;1964:128;2086:4;-1:-1:-1;;2012:2:1;2004:6;2000:15;1996:88;1992:99;1984:6;1964:128;:::i;:::-;2110:6;2101:15;;2140:6;2132;2125:22;2180:3;2171:6;2166:3;2162:16;2159:25;2156:45;;;2197:1;2194;2187:12;2156:45;2247:6;2242:3;2235:4;2227:6;2223:17;2210:44;2302:1;2295:4;2286:6;2278;2274:19;2270:30;2263:41;;1782:528;;;;;:::o;2315:451::-;2384:6;2437:2;2425:9;2416:7;2412:23;2408:32;2405:52;;;2453:1;2450;2443:12;2405:52;2493:9;2480:23;2526:18;2518:6;2515:30;2512:50;;;2558:1;2555;2548:12;2512:50;2581:22;;2634:4;2626:13;;2622:27;-1:-1:-1;2612:55:1;;2663:1;2660;2653:12;2612:55;2686:74;2752:7;2747:2;2734:16;2729:2;2725;2721:11;2686:74;:::i;:::-;2676:84;2315:451;-1:-1:-1;;;;2315:451:1:o;2771:531::-;2813:3;2851:5;2845:12;2878:6;2873:3;2866:19;2903:1;2913:162;2927:6;2924:1;2921:13;2913:162;;;2989:4;3045:13;;;3041:22;;3035:29;3017:11;;;3013:20;;3006:59;2942:12;2913:162;;;3093:6;3090:1;3087:13;3084:87;;;3159:1;3152:4;3143:6;3138:3;3134:16;3130:27;3123:38;3084:87;-1:-1:-1;3216:2:1;3204:15;-1:-1:-1;;3200:88:1;3191:98;;;;3291:4;3187:109;;2771:531;-1:-1:-1;;2771:531:1:o;3307:220::-;3456:2;3445:9;3438:21;3419:4;3476:45;3517:2;3506:9;3502:18;3494:6;3476:45;:::i;3532:180::-;3591:6;3644:2;3632:9;3623:7;3619:23;3615:32;3612:52;;;3660:1;3657;3650:12;3612:52;-1:-1:-1;3683:23:1;;3532:180;-1:-1:-1;3532:180:1:o;3717:183::-;3777:4;3810:18;3802:6;3799:30;3796:56;;;3832:18;;:::i;:::-;-1:-1:-1;3877:1:1;3873:14;3889:4;3869:25;;3717:183::o;3905:724::-;3959:5;4012:3;4005:4;3997:6;3993:17;3989:27;3979:55;;4030:1;4027;4020:12;3979:55;4066:6;4053:20;4092:4;4115:43;4155:2;4115:43;:::i;:::-;4187:2;4181:9;4199:31;4227:2;4219:6;4199:31;:::i;:::-;4265:18;;;4357:1;4353:10;;;;4341:23;;4337:32;;;4299:15;;;;-1:-1:-1;4381:15:1;;;4378:35;;;4409:1;4406;4399:12;4378:35;4445:2;4437:6;4433:15;4457:142;4473:6;4468:3;4465:15;4457:142;;;4539:17;;4527:30;;4577:12;;;;4490;;4457:142;;;-1:-1:-1;4617:6:1;3905:724;-1:-1:-1;;;;;;3905:724:1:o;4634:221::-;4676:5;4729:3;4722:4;4714:6;4710:17;4706:27;4696:55;;4747:1;4744;4737:12;4696:55;4769:80;4845:3;4836:6;4823:20;4816:4;4808:6;4804:17;4769:80;:::i;4860:943::-;5014:6;5022;5030;5038;5046;5099:3;5087:9;5078:7;5074:23;5070:33;5067:53;;;5116:1;5113;5106:12;5067:53;5139:29;5158:9;5139:29;:::i;:::-;5129:39;;5187:38;5221:2;5210:9;5206:18;5187:38;:::i;:::-;5177:48;;5276:2;5265:9;5261:18;5248:32;5299:18;5340:2;5332:6;5329:14;5326:34;;;5356:1;5353;5346:12;5326:34;5379:61;5432:7;5423:6;5412:9;5408:22;5379:61;:::i;:::-;5369:71;;5493:2;5482:9;5478:18;5465:32;5449:48;;5522:2;5512:8;5509:16;5506:36;;;5538:1;5535;5528:12;5506:36;5561:63;5616:7;5605:8;5594:9;5590:24;5561:63;:::i;:::-;5551:73;;5677:3;5666:9;5662:19;5649:33;5633:49;;5707:2;5697:8;5694:16;5691:36;;;5723:1;5720;5713:12;5691:36;;5746:51;5789:7;5778:8;5767:9;5763:24;5746:51;:::i;:::-;5736:61;;;4860:943;;;;;;;;:::o;5990:615::-;6076:6;6084;6137:2;6125:9;6116:7;6112:23;6108:32;6105:52;;;6153:1;6150;6143:12;6105:52;6193:9;6180:23;6222:18;6263:2;6255:6;6252:14;6249:34;;;6279:1;6276;6269:12;6249:34;6317:6;6306:9;6302:22;6292:32;;6362:7;6355:4;6351:2;6347:13;6343:27;6333:55;;6384:1;6381;6374:12;6333:55;6424:2;6411:16;6450:2;6442:6;6439:14;6436:34;;;6466:1;6463;6456:12;6436:34;6519:7;6514:2;6504:6;6501:1;6497:14;6493:2;6489:23;6485:32;6482:45;6479:65;;;6540:1;6537;6530:12;6479:65;6571:2;6563:11;;;;;6593:6;;-1:-1:-1;5990:615:1;;-1:-1:-1;;;;5990:615:1:o;6610:1208::-;6728:6;6736;6789:2;6777:9;6768:7;6764:23;6760:32;6757:52;;;6805:1;6802;6795:12;6757:52;6845:9;6832:23;6874:18;6915:2;6907:6;6904:14;6901:34;;;6931:1;6928;6921:12;6901:34;6969:6;6958:9;6954:22;6944:32;;7014:7;7007:4;7003:2;6999:13;6995:27;6985:55;;7036:1;7033;7026:12;6985:55;7072:2;7059:16;7094:4;7117:43;7157:2;7117:43;:::i;:::-;7189:2;7183:9;7201:31;7229:2;7221:6;7201:31;:::i;:::-;7267:18;;;7355:1;7351:10;;;;7343:19;;7339:28;;;7301:15;;;;-1:-1:-1;7379:19:1;;;7376:39;;;7411:1;7408;7401:12;7376:39;7435:11;;;;7455:148;7471:6;7466:3;7463:15;7455:148;;;7537:23;7556:3;7537:23;:::i;:::-;7525:36;;7488:12;;;;7581;;;;7455:148;;;7622:6;-1:-1:-1;;7666:18:1;;7653:32;;-1:-1:-1;;7697:16:1;;;7694:36;;;7726:1;7723;7716:12;7694:36;;7749:63;7804:7;7793:8;7782:9;7778:24;7749:63;:::i;:::-;7739:73;;;6610:1208;;;;;:::o;7823:435::-;7876:3;7914:5;7908:12;7941:6;7936:3;7929:19;7967:4;7996:2;7991:3;7987:12;7980:19;;8033:2;8026:5;8022:14;8054:1;8064:169;8078:6;8075:1;8072:13;8064:169;;;8139:13;;8127:26;;8173:12;;;;8208:15;;;;8100:1;8093:9;8064:169;;;-1:-1:-1;8249:3:1;;7823:435;-1:-1:-1;;;;;7823:435:1:o;8263:261::-;8442:2;8431:9;8424:21;8405:4;8462:56;8514:2;8503:9;8499:18;8491:6;8462:56;:::i;8529:186::-;8588:6;8641:2;8629:9;8620:7;8616:23;8612:32;8609:52;;;8657:1;8654;8647:12;8609:52;8680:29;8699:9;8680:29;:::i;9136:347::-;9201:6;9209;9262:2;9250:9;9241:7;9237:23;9233:32;9230:52;;;9278:1;9275;9268:12;9230:52;9301:29;9320:9;9301:29;:::i;:::-;9291:39;;9380:2;9369:9;9365:18;9352:32;9427:5;9420:13;9413:21;9406:5;9403:32;9393:60;;9449:1;9446;9439:12;9393:60;9472:5;9462:15;;;9136:347;;;;;:::o;9488:260::-;9556:6;9564;9617:2;9605:9;9596:7;9592:23;9588:32;9585:52;;;9633:1;9630;9623:12;9585:52;9656:29;9675:9;9656:29;:::i;:::-;9646:39;;9704:38;9738:2;9727:9;9723:18;9704:38;:::i;:::-;9694:48;;9488:260;;;;;:::o;9753:606::-;9857:6;9865;9873;9881;9889;9942:3;9930:9;9921:7;9917:23;9913:33;9910:53;;;9959:1;9956;9949:12;9910:53;9982:29;10001:9;9982:29;:::i;:::-;9972:39;;10030:38;10064:2;10053:9;10049:18;10030:38;:::i;:::-;10020:48;;10115:2;10104:9;10100:18;10087:32;10077:42;;10166:2;10155:9;10151:18;10138:32;10128:42;;10221:3;10210:9;10206:19;10193:33;10249:18;10241:6;10238:30;10235:50;;;10281:1;10278;10271:12;10235:50;10304:49;10345:7;10336:6;10325:9;10321:22;10304:49;:::i;11137:437::-;11216:1;11212:12;;;;11259;;;11280:61;;11334:4;11326:6;11322:17;11312:27;;11280:61;11387:2;11379:6;11376:14;11356:18;11353:38;11350:218;;;11424:77;11421:1;11414:88;11525:4;11522:1;11515:15;11553:4;11550:1;11543:15;11350:218;;11137:437;;;:::o;11998:184::-;12050:77;12047:1;12040:88;12147:4;12144:1;12137:15;12171:4;12168:1;12161:15;12187:128;12227:3;12258:1;12254:6;12251:1;12248:13;12245:39;;;12264:18;;:::i;:::-;-1:-1:-1;12300:9:1;;12187:128::o;14320:195::-;14359:3;14390:66;14383:5;14380:77;14377:103;;;14460:18;;:::i;:::-;-1:-1:-1;14507:1:1;14496:13;;14320:195::o;14930:184::-;14982:77;14979:1;14972:88;15079:4;15076:1;15069:15;15103:4;15100:1;15093:15;17162:465;17419:2;17408:9;17401:21;17382:4;17445:56;17497:2;17486:9;17482:18;17474:6;17445:56;:::i;:::-;17549:9;17541:6;17537:22;17532:2;17521:9;17517:18;17510:50;17577:44;17614:6;17606;17577:44;:::i;:::-;17569:52;17162:465;-1:-1:-1;;;;;17162:465:1:o;18697:850::-;19019:4;-1:-1:-1;;;;;19129:2:1;19121:6;19117:15;19106:9;19099:34;19181:2;19173:6;19169:15;19164:2;19153:9;19149:18;19142:43;;19221:3;19216:2;19205:9;19201:18;19194:31;19248:57;19300:3;19289:9;19285:19;19277:6;19248:57;:::i;:::-;19353:9;19345:6;19341:22;19336:2;19325:9;19321:18;19314:50;19387:44;19424:6;19416;19387:44;:::i;:::-;19373:58;;19480:9;19472:6;19468:22;19462:3;19451:9;19447:19;19440:51;19508:33;19534:6;19526;19508:33;:::i;:::-;19500:41;18697:850;-1:-1:-1;;;;;;;;18697:850:1:o;19552:249::-;19621:6;19674:2;19662:9;19653:7;19649:23;19645:32;19642:52;;;19690:1;19687;19680:12;19642:52;19722:9;19716:16;19741:30;19765:5;19741:30;:::i;19806:179::-;19841:3;19883:1;19865:16;19862:23;19859:120;;;19929:1;19926;19923;19908:23;-1:-1:-1;19966:1:1;19960:8;19955:3;19951:18;19859:120;19806:179;:::o;19990:731::-;20029:3;20071:4;20053:16;20050:26;20047:39;;;19990:731;:::o;20047:39::-;20113:2;20107:9;20135:66;20256:2;20238:16;20234:25;20231:1;20225:4;20210:50;20289:4;20283:11;20313:16;20348:18;20419:2;20412:4;20404:6;20400:17;20397:25;20392:2;20384:6;20381:14;20378:45;20375:58;;;20426:5;;;;;19990:731;:::o;20375:58::-;20463:6;20457:4;20453:17;20442:28;;20499:3;20493:10;20526:2;20518:6;20515:14;20512:27;;;20532:5;;;;;;19990:731;:::o;20512:27::-;20616:2;20597:16;20591:4;20587:27;20583:36;20576:4;20567:6;20562:3;20558:16;20554:27;20551:69;20548:82;;;20623:5;;;;;;19990:731;:::o;20548:82::-;20639:57;20690:4;20681:6;20673;20669:19;20665:30;20659:4;20639:57;:::i;:::-;-1:-1:-1;20712:3:1;;19990:731;-1:-1:-1;;;;;19990:731:1:o;21556:584::-;21778:4;-1:-1:-1;;;;;21888:2:1;21880:6;21876:15;21865:9;21858:34;21940:2;21932:6;21928:15;21923:2;21912:9;21908:18;21901:43;;21980:6;21975:2;21964:9;21960:18;21953:34;22023:6;22018:2;22007:9;22003:18;21996:34;22067:3;22061;22050:9;22046:19;22039:32;22088:46;22129:3;22118:9;22114:19;22106:6;22088:46;:::i;:::-;22080:54;21556:584;-1:-1:-1;;;;;;;21556:584:1:o

Swarm Source

ipfs://865fab381d3d28ff78a6f85e1f9ea4b80b1974534177716cbc4b2e8d624a7070
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.