ETH Price: $3,892.11 (+0.19%)

Token

Tiny Dogs (TDOG)
 

Overview

Max Total Supply

8,088 TDOG

Holders

758

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
7 TDOG
0x64343791cd400805192c5bbd060550ce4b93f29e
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

8,088 tiny little doggies looking for owners on the Ethereum blockchain. game in progress. no roadmap. just adorable tiny dogs.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
TinyDogs

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

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

// File: @openzeppelin/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.
 */
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 Merklee 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: @openzeppelin/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: @openzeppelin/contracts/utils/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/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: @openzeppelin/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: @openzeppelin/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: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/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: @openzeppelin/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: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

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

// File: erc721a/contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;








error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownershipOf(tokenId).addr;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSender()) revert ApproveToCaller();

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

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

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

// File: contracts/TinyDogs.sol

//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.13;





contract TinyDogs is ERC721A, Ownable, ReentrancyGuard  {
    using Strings for uint256;

    string public baseURI;

    uint256 public maxPerWallet = 8;
    uint256 public maxTinyDogs = 8088;

    bool public publicMinting;
    bool public whitelistMinting;
    bool public revealed;

    bytes32 public merkleRoot;

    mapping (address => uint256) public addressBalance;

    constructor(
        string memory _initBaseURI
    ) ERC721A("Tiny Dogs", "TDOG") {
        baseURI = _initBaseURI;
    }

    function mint(uint256 quantity) external nonReentrant {
        require(publicMinting,                                                      "PUBLIC MINT NOT ACTIVE");
        require(quantity >= 1,                                                      "AT LEAST 1 TINY DOG NEED TO BE MINTED");
        require(totalSupply() + quantity <= maxTinyDogs,                            "MINTING THIS MANY WOULD EXCEED TINY DOG SUPPLY");
        require(quantity <= maxPerWallet,                                           "MAX PER TX IS 8");
        addressBalance[msg.sender] = addressBalance[msg.sender] + quantity;
        _safeMint(msg.sender, quantity);
    }
    function whitelistMint(uint256 quantity, bytes32[] memory proof) external nonReentrant {
        require(!publicMinting,                                                     "PUBLIC MINT ACTIVE");
        require(whitelistMinting,                                                   "WHITELIST MINT NOT ACTIVE");
        require(quantity >= 1,                                                      "AT LEAST 1 TINY DOG NEED TO BE MINTED");
        require(totalSupply() + quantity <= maxTinyDogs,                            "MINTING THIS MANY WOULD EXCEED TINY DOG SUPPLY");
        require(addressBalance[msg.sender] + quantity <= maxPerWallet,              "MAX MINTED TO WALLET ALREADY");
        require(isValid(proof, keccak256(abi.encodePacked(msg.sender))), "Not a part of Allowlist");
        addressBalance[msg.sender] = addressBalance[msg.sender] + quantity;
        _safeMint(msg.sender, quantity);
    }

    function isValid(bytes32[] memory proof, bytes32 leaf) public view returns (bool) {
        return MerkleProof.verify(proof, merkleRoot, leaf);
    }

    ////////////////////////////////////////////////
    ///////////// Internal Functions ///////////////
    ////////////////////////////////////////////////
    function _baseURI() internal view override returns (string memory) {
        return baseURI;
    }
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { 
        require(_exists(tokenId),"ERC721Metadata: URI query for nonexistent token");
        if (revealed == false) {
            return "ipfs://QmboNRu81BS7rDK8WqN4v948X2KSy1By2HGB8qHicmQdtz?filename=preview.json";
        }
        
        return
        bytes(baseURI).length > 0
            ? string(abi.encodePacked(_baseURI(), tokenId.toString(), '.json'))
            : "";
    }

    ////////////////////////////////////////////////
    /////////////// Owner Functions ////////////////
    ////////////////////////////////////////////////
    function setBaseURI(string calldata _newBaseURI) external onlyOwner {
        baseURI = _newBaseURI;
    }
    function setMerkleRoot(bytes32 root) external onlyOwner { 
        merkleRoot = root;
    }
    
    function flipPublicMinting() public onlyOwner { 
        publicMinting = !publicMinting;
    }
    function flipWhitelistMinting() public onlyOwner { 
        whitelistMinting = !whitelistMinting;
    }
    function flipRevealed() public onlyOwner { 
        revealed = !revealed;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipPublicMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipWhitelistMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"bytes32","name":"leaf","type":"bytes32"}],"name":"isValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTinyDogs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","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":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMinting","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistMinting","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60806040526008600b55611f98600c553480156200001c57600080fd5b506040516200439438038062004394833981810160405281019062000042919062000460565b6040518060400160405280600981526020017f54696e7920446f677300000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f54444f47000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000c692919062000213565b508060039080519060200190620000df92919062000213565b50620000f06200014060201b60201c565b6000819055505050620001186200010c6200014560201b60201c565b6200014d60201b60201c565b600160098190555080600a90805190602001906200013892919062000213565b505062000515565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200022190620004e0565b90600052602060002090601f01602090048101928262000245576000855562000291565b82601f106200026057805160ff191683800117855562000291565b8280016001018555821562000291579182015b828111156200029057825182559160200191906001019062000273565b5b509050620002a09190620002a4565b5090565b5b80821115620002bf576000816000905550600101620002a5565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200032c82620002e1565b810181811067ffffffffffffffff821117156200034e576200034d620002f2565b5b80604052505050565b600062000363620002c3565b905062000371828262000321565b919050565b600067ffffffffffffffff821115620003945762000393620002f2565b5b6200039f82620002e1565b9050602081019050919050565b60005b83811015620003cc578082015181840152602081019050620003af565b83811115620003dc576000848401525b50505050565b6000620003f9620003f38462000376565b62000357565b905082815260208101848484011115620004185762000417620002dc565b5b62000425848285620003ac565b509392505050565b600082601f830112620004455762000444620002d7565b5b815162000457848260208601620003e2565b91505092915050565b600060208284031215620004795762000478620002cd565b5b600082015167ffffffffffffffff8111156200049a5762000499620002d2565b5b620004a8848285016200042d565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004f957607f821691505b6020821081036200050f576200050e620004b1565b5b50919050565b613e6f80620005256000396000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c80636352211e1161011a57806395d89b41116100ad578063b8a20ed01161007c578063b8a20ed014610542578063c87b56dd14610572578063d2cab056146105a2578063e985e9c5146105be578063f2fde38b146105ee576101fb565b806395d89b41146104d0578063a0712d68146104ee578063a22cb4651461050a578063b88d4fde14610526576101fb565b8063715018a6116100e9578063715018a61461046e5780637cb6475914610478578063869d49cf146104945780638da5cb5b146104b2576101fb565b80636352211e146103d25780636992d229146104025780636c0360eb1461042057806370a082311461043e576101fb565b80632eb4a7ab11610192578063453c231011610161578063453c23101461035c578063518302271461037a57806353ac010a1461039857806355f804b3146103b6576101fb565b80632eb4a7ab146102e85780633b2c3fb6146103065780633ec4de351461031057806342842e0e14610340576101fb565b8063095ea7b3116101ce578063095ea7b31461028857806318160ddd146102a45780631bb59fcb146102c257806323b872dd146102cc576101fb565b806301401cb31461020057806301ffc9a71461020a57806306fdde031461023a578063081812fc14610258575b600080fd5b61020861060a565b005b610224600480360381019061021f9190612c1c565b6106b2565b6040516102319190612c64565b60405180910390f35b610242610794565b60405161024f9190612d18565b60405180910390f35b610272600480360381019061026d9190612d70565b610826565b60405161027f9190612dde565b60405180910390f35b6102a2600480360381019061029d9190612e25565b6108a2565b005b6102ac6109ac565b6040516102b99190612e74565b60405180910390f35b6102ca6109c3565b005b6102e660048036038101906102e19190612e8f565b610a6b565b005b6102f0610a7b565b6040516102fd9190612efb565b60405180910390f35b61030e610a81565b005b61032a60048036038101906103259190612f16565b610b29565b6040516103379190612e74565b60405180910390f35b61035a60048036038101906103559190612e8f565b610b41565b005b610364610b61565b6040516103719190612e74565b60405180910390f35b610382610b67565b60405161038f9190612c64565b60405180910390f35b6103a0610b7a565b6040516103ad9190612c64565b60405180910390f35b6103d060048036038101906103cb9190612fa8565b610b8d565b005b6103ec60048036038101906103e79190612d70565b610c1f565b6040516103f99190612dde565b60405180910390f35b61040a610c35565b6040516104179190612c64565b60405180910390f35b610428610c48565b6040516104359190612d18565b60405180910390f35b61045860048036038101906104539190612f16565b610cd6565b6040516104659190612e74565b60405180910390f35b610476610da5565b005b610492600480360381019061048d9190613021565b610e2d565b005b61049c610eb3565b6040516104a99190612e74565b60405180910390f35b6104ba610eb9565b6040516104c79190612dde565b60405180910390f35b6104d8610ee3565b6040516104e59190612d18565b60405180910390f35b61050860048036038101906105039190612d70565b610f75565b005b610524600480360381019061051f919061307a565b611194565b005b610540600480360381019061053b91906131ea565b61130b565b005b61055c60048036038101906105579190613330565b611387565b6040516105699190612c64565b60405180910390f35b61058c60048036038101906105879190612d70565b61139e565b6040516105999190612d18565b60405180910390f35b6105bc60048036038101906105b7919061338c565b611488565b005b6105d860048036038101906105d391906133e8565b6117b1565b6040516105e59190612c64565b60405180910390f35b61060860048036038101906106039190612f16565b611845565b005b61061261193c565b73ffffffffffffffffffffffffffffffffffffffff16610630610eb9565b73ffffffffffffffffffffffffffffffffffffffff1614610686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067d90613474565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061077d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061078d575061078c82611944565b5b9050919050565b6060600280546107a3906134c3565b80601f01602080910402602001604051908101604052809291908181526020018280546107cf906134c3565b801561081c5780601f106107f15761010080835404028352916020019161081c565b820191906000526020600020905b8154815290600101906020018083116107ff57829003601f168201915b5050505050905090565b6000610831826119ae565b610867576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108ad82610c1f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610914576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661093361193c565b73ffffffffffffffffffffffffffffffffffffffff161415801561096557506109638161095e61193c565b6117b1565b155b1561099c576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109a78383836119fc565b505050565b60006109b6611aae565b6001546000540303905090565b6109cb61193c565b73ffffffffffffffffffffffffffffffffffffffff166109e9610eb9565b73ffffffffffffffffffffffffffffffffffffffff1614610a3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3690613474565b60405180910390fd5b600d60019054906101000a900460ff1615600d60016101000a81548160ff021916908315150217905550565b610a76838383611ab3565b505050565b600e5481565b610a8961193c565b73ffffffffffffffffffffffffffffffffffffffff16610aa7610eb9565b73ffffffffffffffffffffffffffffffffffffffff1614610afd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af490613474565b60405180910390fd5b600d60029054906101000a900460ff1615600d60026101000a81548160ff021916908315150217905550565b600f6020528060005260406000206000915090505481565b610b5c8383836040518060200160405280600081525061130b565b505050565b600b5481565b600d60029054906101000a900460ff1681565b600d60009054906101000a900460ff1681565b610b9561193c565b73ffffffffffffffffffffffffffffffffffffffff16610bb3610eb9565b73ffffffffffffffffffffffffffffffffffffffff1614610c09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0090613474565b60405180910390fd5b8181600a9190610c1a929190612aca565b505050565b6000610c2a82611f67565b600001519050919050565b600d60019054906101000a900460ff1681565b600a8054610c55906134c3565b80601f0160208091040260200160405190810160405280929190818152602001828054610c81906134c3565b8015610cce5780601f10610ca357610100808354040283529160200191610cce565b820191906000526020600020905b815481529060010190602001808311610cb157829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d3d576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610dad61193c565b73ffffffffffffffffffffffffffffffffffffffff16610dcb610eb9565b73ffffffffffffffffffffffffffffffffffffffff1614610e21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1890613474565b60405180910390fd5b610e2b60006121f6565b565b610e3561193c565b73ffffffffffffffffffffffffffffffffffffffff16610e53610eb9565b73ffffffffffffffffffffffffffffffffffffffff1614610ea9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea090613474565b60405180910390fd5b80600e8190555050565b600c5481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610ef2906134c3565b80601f0160208091040260200160405190810160405280929190818152602001828054610f1e906134c3565b8015610f6b5780601f10610f4057610100808354040283529160200191610f6b565b820191906000526020600020905b815481529060010190602001808311610f4e57829003601f168201915b5050505050905090565b600260095403610fba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb190613540565b60405180910390fd5b6002600981905550600d60009054906101000a900460ff16611011576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611008906135ac565b60405180910390fd5b6001811015611055576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104c9061363e565b60405180910390fd5b600c54816110616109ac565b61106b919061368d565b11156110ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a390613755565b60405180910390fd5b600b548111156110f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e8906137c1565b60405180910390fd5b80600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461113c919061368d565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061118933826122bc565b600160098190555050565b61119c61193c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611200576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061120d61193c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166112ba61193c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112ff9190612c64565b60405180910390a35050565b611316848484611ab3565b6113358373ffffffffffffffffffffffffffffffffffffffff166122da565b801561134a5750611348848484846122fd565b155b15611381576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600061139683600e548461244d565b905092915050565b60606113a9826119ae565b6113e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113df90613853565b60405180910390fd5b60001515600d60029054906101000a900460ff16151503611423576040518060800160405280604b8152602001613def604b91399050611483565b6000600a8054611432906134c3565b90501161144e5760405180602001604052806000815250611480565b611456612464565b61145f836124f6565b6040516020016114709291906138fb565b6040516020818303038152906040525b90505b919050565b6002600954036114cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c490613540565b60405180910390fd5b6002600981905550600d60009054906101000a900460ff1615611525576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151c90613976565b60405180910390fd5b600d60019054906101000a900460ff16611574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156b906139e2565b60405180910390fd5b60018210156115b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115af9061363e565b60405180910390fd5b600c54826115c46109ac565b6115ce919061368d565b111561160f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160690613755565b60405180910390fd5b600b5482600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461165d919061368d565b111561169e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169590613a4e565b60405180910390fd5b6116ce81336040516020016116b39190613ab6565b60405160208183030381529060405280519060200120611387565b61170d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170490613b1d565b60405180910390fd5b81600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611758919061368d565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506117a533836122bc565b60016009819055505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61184d61193c565b73ffffffffffffffffffffffffffffffffffffffff1661186b610eb9565b73ffffffffffffffffffffffffffffffffffffffff16146118c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b890613474565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611930576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192790613baf565b60405180910390fd5b611939816121f6565b50565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816119b9611aae565b111580156119c8575060005482105b80156119f5575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6000611abe82611f67565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611b29576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611b4a61193c565b73ffffffffffffffffffffffffffffffffffffffff161480611b795750611b7885611b7361193c565b6117b1565b5b80611bbe5750611b8761193c565b73ffffffffffffffffffffffffffffffffffffffff16611ba684610826565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611bf7576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611c5d576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c6a8585856001612656565b611c76600084876119fc565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611ef5576000548214611ef457878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f60858585600161265c565b5050505050565b611f6f612b50565b600082905080611f7d611aae565b11158015611f8c575060005481105b156121bf576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516121bd57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146120a15780925050506121f1565b5b6001156121bc57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146121b75780925050506121f1565b6120a2565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6122d6828260405180602001604052806000815250612662565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261232361193c565b8786866040518563ffffffff1660e01b81526004016123459493929190613c24565b6020604051808303816000875af192505050801561238157506040513d601f19601f8201168201806040525081019061237e9190613c85565b60015b6123fa573d80600081146123b1576040519150601f19603f3d011682016040523d82523d6000602084013e6123b6565b606091505b5060008151036123f2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60008261245a8584612674565b1490509392505050565b6060600a8054612473906134c3565b80601f016020809104026020016040519081016040528092919081815260200182805461249f906134c3565b80156124ec5780601f106124c1576101008083540402835291602001916124ec565b820191906000526020600020905b8154815290600101906020018083116124cf57829003601f168201915b5050505050905090565b60606000820361253d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612651565b600082905060005b6000821461256f57808061255890613cb2565b915050600a826125689190613d29565b9150612545565b60008167ffffffffffffffff81111561258b5761258a6130bf565b5b6040519080825280601f01601f1916602001820160405280156125bd5781602001600182028036833780820191505090505b5090505b6000851461264a576001826125d69190613d5a565b9150600a856125e59190613d8e565b60306125f1919061368d565b60f81b81838151811061260757612606613dbf565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126439190613d29565b94506125c1565b8093505050505b919050565b50505050565b50505050565b61266f83838360016126e9565b505050565b60008082905060005b84518110156126de57600085828151811061269b5761269a613dbf565b5b602002602001015190508083116126bd576126b68382612ab3565b92506126ca565b6126c78184612ab3565b92505b5080806126d690613cb2565b91505061267d565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612755576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000840361278f576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61279c6000868387612656565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561296657506129658773ffffffffffffffffffffffffffffffffffffffff166122da565b5b15612a2b575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129db60008884806001019550886122fd565b612a11576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80820361296c578260005414612a2657600080fd5b612a96565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203612a2c575b816000819055505050612aac600086838761265c565b5050505050565b600082600052816020526040600020905092915050565b828054612ad6906134c3565b90600052602060002090601f016020900481019282612af85760008555612b3f565b82601f10612b1157803560ff1916838001178555612b3f565b82800160010185558215612b3f579182015b82811115612b3e578235825591602001919060010190612b23565b5b509050612b4c9190612b93565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612bac576000816000905550600101612b94565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612bf981612bc4565b8114612c0457600080fd5b50565b600081359050612c1681612bf0565b92915050565b600060208284031215612c3257612c31612bba565b5b6000612c4084828501612c07565b91505092915050565b60008115159050919050565b612c5e81612c49565b82525050565b6000602082019050612c796000830184612c55565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612cb9578082015181840152602081019050612c9e565b83811115612cc8576000848401525b50505050565b6000601f19601f8301169050919050565b6000612cea82612c7f565b612cf48185612c8a565b9350612d04818560208601612c9b565b612d0d81612cce565b840191505092915050565b60006020820190508181036000830152612d328184612cdf565b905092915050565b6000819050919050565b612d4d81612d3a565b8114612d5857600080fd5b50565b600081359050612d6a81612d44565b92915050565b600060208284031215612d8657612d85612bba565b5b6000612d9484828501612d5b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612dc882612d9d565b9050919050565b612dd881612dbd565b82525050565b6000602082019050612df36000830184612dcf565b92915050565b612e0281612dbd565b8114612e0d57600080fd5b50565b600081359050612e1f81612df9565b92915050565b60008060408385031215612e3c57612e3b612bba565b5b6000612e4a85828601612e10565b9250506020612e5b85828601612d5b565b9150509250929050565b612e6e81612d3a565b82525050565b6000602082019050612e896000830184612e65565b92915050565b600080600060608486031215612ea857612ea7612bba565b5b6000612eb686828701612e10565b9350506020612ec786828701612e10565b9250506040612ed886828701612d5b565b9150509250925092565b6000819050919050565b612ef581612ee2565b82525050565b6000602082019050612f106000830184612eec565b92915050565b600060208284031215612f2c57612f2b612bba565b5b6000612f3a84828501612e10565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f840112612f6857612f67612f43565b5b8235905067ffffffffffffffff811115612f8557612f84612f48565b5b602083019150836001820283011115612fa157612fa0612f4d565b5b9250929050565b60008060208385031215612fbf57612fbe612bba565b5b600083013567ffffffffffffffff811115612fdd57612fdc612bbf565b5b612fe985828601612f52565b92509250509250929050565b612ffe81612ee2565b811461300957600080fd5b50565b60008135905061301b81612ff5565b92915050565b60006020828403121561303757613036612bba565b5b60006130458482850161300c565b91505092915050565b61305781612c49565b811461306257600080fd5b50565b6000813590506130748161304e565b92915050565b6000806040838503121561309157613090612bba565b5b600061309f85828601612e10565b92505060206130b085828601613065565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6130f782612cce565b810181811067ffffffffffffffff82111715613116576131156130bf565b5b80604052505050565b6000613129612bb0565b905061313582826130ee565b919050565b600067ffffffffffffffff821115613155576131546130bf565b5b61315e82612cce565b9050602081019050919050565b82818337600083830152505050565b600061318d6131888461313a565b61311f565b9050828152602081018484840111156131a9576131a86130ba565b5b6131b484828561316b565b509392505050565b600082601f8301126131d1576131d0612f43565b5b81356131e184826020860161317a565b91505092915050565b6000806000806080858703121561320457613203612bba565b5b600061321287828801612e10565b945050602061322387828801612e10565b935050604061323487828801612d5b565b925050606085013567ffffffffffffffff81111561325557613254612bbf565b5b613261878288016131bc565b91505092959194509250565b600067ffffffffffffffff821115613288576132876130bf565b5b602082029050602081019050919050565b60006132ac6132a78461326d565b61311f565b905080838252602082019050602084028301858111156132cf576132ce612f4d565b5b835b818110156132f857806132e4888261300c565b8452602084019350506020810190506132d1565b5050509392505050565b600082601f83011261331757613316612f43565b5b8135613327848260208601613299565b91505092915050565b6000806040838503121561334757613346612bba565b5b600083013567ffffffffffffffff81111561336557613364612bbf565b5b61337185828601613302565b92505060206133828582860161300c565b9150509250929050565b600080604083850312156133a3576133a2612bba565b5b60006133b185828601612d5b565b925050602083013567ffffffffffffffff8111156133d2576133d1612bbf565b5b6133de85828601613302565b9150509250929050565b600080604083850312156133ff576133fe612bba565b5b600061340d85828601612e10565b925050602061341e85828601612e10565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061345e602083612c8a565b915061346982613428565b602082019050919050565b6000602082019050818103600083015261348d81613451565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806134db57607f821691505b6020821081036134ee576134ed613494565b5b50919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061352a601f83612c8a565b9150613535826134f4565b602082019050919050565b600060208201905081810360008301526135598161351d565b9050919050565b7f5055424c4943204d494e54204e4f542041435449564500000000000000000000600082015250565b6000613596601683612c8a565b91506135a182613560565b602082019050919050565b600060208201905081810360008301526135c581613589565b9050919050565b7f4154204c4541535420312054494e5920444f47204e45454420544f204245204d60008201527f494e544544000000000000000000000000000000000000000000000000000000602082015250565b6000613628602583612c8a565b9150613633826135cc565b604082019050919050565b600060208201905081810360008301526136578161361b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061369882612d3a565b91506136a383612d3a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156136d8576136d761365e565b5b828201905092915050565b7f4d494e54494e472054484953204d414e5920574f554c4420455843454544205460008201527f494e5920444f4720535550504c59000000000000000000000000000000000000602082015250565b600061373f602e83612c8a565b915061374a826136e3565b604082019050919050565b6000602082019050818103600083015261376e81613732565b9050919050565b7f4d41582050455220545820495320380000000000000000000000000000000000600082015250565b60006137ab600f83612c8a565b91506137b682613775565b602082019050919050565b600060208201905081810360008301526137da8161379e565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061383d602f83612c8a565b9150613848826137e1565b604082019050919050565b6000602082019050818103600083015261386c81613830565b9050919050565b600081905092915050565b600061388982612c7f565b6138938185613873565b93506138a3818560208601612c9b565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006138e5600583613873565b91506138f0826138af565b600582019050919050565b6000613907828561387e565b9150613913828461387e565b915061391e826138d8565b91508190509392505050565b7f5055424c4943204d494e54204143544956450000000000000000000000000000600082015250565b6000613960601283612c8a565b915061396b8261392a565b602082019050919050565b6000602082019050818103600083015261398f81613953565b9050919050565b7f57484954454c495354204d494e54204e4f542041435449564500000000000000600082015250565b60006139cc601983612c8a565b91506139d782613996565b602082019050919050565b600060208201905081810360008301526139fb816139bf565b9050919050565b7f4d4158204d494e54454420544f2057414c4c455420414c524541445900000000600082015250565b6000613a38601c83612c8a565b9150613a4382613a02565b602082019050919050565b60006020820190508181036000830152613a6781613a2b565b9050919050565b60008160601b9050919050565b6000613a8682613a6e565b9050919050565b6000613a9882613a7b565b9050919050565b613ab0613aab82612dbd565b613a8d565b82525050565b6000613ac28284613a9f565b60148201915081905092915050565b7f4e6f7420612070617274206f6620416c6c6f776c697374000000000000000000600082015250565b6000613b07601783612c8a565b9150613b1282613ad1565b602082019050919050565b60006020820190508181036000830152613b3681613afa565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613b99602683612c8a565b9150613ba482613b3d565b604082019050919050565b60006020820190508181036000830152613bc881613b8c565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613bf682613bcf565b613c008185613bda565b9350613c10818560208601612c9b565b613c1981612cce565b840191505092915050565b6000608082019050613c396000830187612dcf565b613c466020830186612dcf565b613c536040830185612e65565b8181036060830152613c658184613beb565b905095945050505050565b600081519050613c7f81612bf0565b92915050565b600060208284031215613c9b57613c9a612bba565b5b6000613ca984828501613c70565b91505092915050565b6000613cbd82612d3a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613cef57613cee61365e565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613d3482612d3a565b9150613d3f83612d3a565b925082613d4f57613d4e613cfa565b5b828204905092915050565b6000613d6582612d3a565b9150613d7083612d3a565b925082821015613d8357613d8261365e565b5b828203905092915050565b6000613d9982612d3a565b9150613da483612d3a565b925082613db457613db3613cfa565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfe697066733a2f2f516d626f4e5275383142533772444b3857714e347639343858324b53793142793248474238714869636d5164747a3f66696c656e616d653d707265766965772e6a736f6ea264697066735822122017f269fffdf46e3848371d38e28557bbeac8daae722d22de8c6d36452e3f8e5c64736f6c634300080d00330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000b697066733a2f2f6173642f000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c80636352211e1161011a57806395d89b41116100ad578063b8a20ed01161007c578063b8a20ed014610542578063c87b56dd14610572578063d2cab056146105a2578063e985e9c5146105be578063f2fde38b146105ee576101fb565b806395d89b41146104d0578063a0712d68146104ee578063a22cb4651461050a578063b88d4fde14610526576101fb565b8063715018a6116100e9578063715018a61461046e5780637cb6475914610478578063869d49cf146104945780638da5cb5b146104b2576101fb565b80636352211e146103d25780636992d229146104025780636c0360eb1461042057806370a082311461043e576101fb565b80632eb4a7ab11610192578063453c231011610161578063453c23101461035c578063518302271461037a57806353ac010a1461039857806355f804b3146103b6576101fb565b80632eb4a7ab146102e85780633b2c3fb6146103065780633ec4de351461031057806342842e0e14610340576101fb565b8063095ea7b3116101ce578063095ea7b31461028857806318160ddd146102a45780631bb59fcb146102c257806323b872dd146102cc576101fb565b806301401cb31461020057806301ffc9a71461020a57806306fdde031461023a578063081812fc14610258575b600080fd5b61020861060a565b005b610224600480360381019061021f9190612c1c565b6106b2565b6040516102319190612c64565b60405180910390f35b610242610794565b60405161024f9190612d18565b60405180910390f35b610272600480360381019061026d9190612d70565b610826565b60405161027f9190612dde565b60405180910390f35b6102a2600480360381019061029d9190612e25565b6108a2565b005b6102ac6109ac565b6040516102b99190612e74565b60405180910390f35b6102ca6109c3565b005b6102e660048036038101906102e19190612e8f565b610a6b565b005b6102f0610a7b565b6040516102fd9190612efb565b60405180910390f35b61030e610a81565b005b61032a60048036038101906103259190612f16565b610b29565b6040516103379190612e74565b60405180910390f35b61035a60048036038101906103559190612e8f565b610b41565b005b610364610b61565b6040516103719190612e74565b60405180910390f35b610382610b67565b60405161038f9190612c64565b60405180910390f35b6103a0610b7a565b6040516103ad9190612c64565b60405180910390f35b6103d060048036038101906103cb9190612fa8565b610b8d565b005b6103ec60048036038101906103e79190612d70565b610c1f565b6040516103f99190612dde565b60405180910390f35b61040a610c35565b6040516104179190612c64565b60405180910390f35b610428610c48565b6040516104359190612d18565b60405180910390f35b61045860048036038101906104539190612f16565b610cd6565b6040516104659190612e74565b60405180910390f35b610476610da5565b005b610492600480360381019061048d9190613021565b610e2d565b005b61049c610eb3565b6040516104a99190612e74565b60405180910390f35b6104ba610eb9565b6040516104c79190612dde565b60405180910390f35b6104d8610ee3565b6040516104e59190612d18565b60405180910390f35b61050860048036038101906105039190612d70565b610f75565b005b610524600480360381019061051f919061307a565b611194565b005b610540600480360381019061053b91906131ea565b61130b565b005b61055c60048036038101906105579190613330565b611387565b6040516105699190612c64565b60405180910390f35b61058c60048036038101906105879190612d70565b61139e565b6040516105999190612d18565b60405180910390f35b6105bc60048036038101906105b7919061338c565b611488565b005b6105d860048036038101906105d391906133e8565b6117b1565b6040516105e59190612c64565b60405180910390f35b61060860048036038101906106039190612f16565b611845565b005b61061261193c565b73ffffffffffffffffffffffffffffffffffffffff16610630610eb9565b73ffffffffffffffffffffffffffffffffffffffff1614610686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067d90613474565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061077d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061078d575061078c82611944565b5b9050919050565b6060600280546107a3906134c3565b80601f01602080910402602001604051908101604052809291908181526020018280546107cf906134c3565b801561081c5780601f106107f15761010080835404028352916020019161081c565b820191906000526020600020905b8154815290600101906020018083116107ff57829003601f168201915b5050505050905090565b6000610831826119ae565b610867576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108ad82610c1f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610914576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661093361193c565b73ffffffffffffffffffffffffffffffffffffffff161415801561096557506109638161095e61193c565b6117b1565b155b1561099c576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109a78383836119fc565b505050565b60006109b6611aae565b6001546000540303905090565b6109cb61193c565b73ffffffffffffffffffffffffffffffffffffffff166109e9610eb9565b73ffffffffffffffffffffffffffffffffffffffff1614610a3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3690613474565b60405180910390fd5b600d60019054906101000a900460ff1615600d60016101000a81548160ff021916908315150217905550565b610a76838383611ab3565b505050565b600e5481565b610a8961193c565b73ffffffffffffffffffffffffffffffffffffffff16610aa7610eb9565b73ffffffffffffffffffffffffffffffffffffffff1614610afd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af490613474565b60405180910390fd5b600d60029054906101000a900460ff1615600d60026101000a81548160ff021916908315150217905550565b600f6020528060005260406000206000915090505481565b610b5c8383836040518060200160405280600081525061130b565b505050565b600b5481565b600d60029054906101000a900460ff1681565b600d60009054906101000a900460ff1681565b610b9561193c565b73ffffffffffffffffffffffffffffffffffffffff16610bb3610eb9565b73ffffffffffffffffffffffffffffffffffffffff1614610c09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0090613474565b60405180910390fd5b8181600a9190610c1a929190612aca565b505050565b6000610c2a82611f67565b600001519050919050565b600d60019054906101000a900460ff1681565b600a8054610c55906134c3565b80601f0160208091040260200160405190810160405280929190818152602001828054610c81906134c3565b8015610cce5780601f10610ca357610100808354040283529160200191610cce565b820191906000526020600020905b815481529060010190602001808311610cb157829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d3d576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610dad61193c565b73ffffffffffffffffffffffffffffffffffffffff16610dcb610eb9565b73ffffffffffffffffffffffffffffffffffffffff1614610e21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1890613474565b60405180910390fd5b610e2b60006121f6565b565b610e3561193c565b73ffffffffffffffffffffffffffffffffffffffff16610e53610eb9565b73ffffffffffffffffffffffffffffffffffffffff1614610ea9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea090613474565b60405180910390fd5b80600e8190555050565b600c5481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610ef2906134c3565b80601f0160208091040260200160405190810160405280929190818152602001828054610f1e906134c3565b8015610f6b5780601f10610f4057610100808354040283529160200191610f6b565b820191906000526020600020905b815481529060010190602001808311610f4e57829003601f168201915b5050505050905090565b600260095403610fba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb190613540565b60405180910390fd5b6002600981905550600d60009054906101000a900460ff16611011576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611008906135ac565b60405180910390fd5b6001811015611055576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104c9061363e565b60405180910390fd5b600c54816110616109ac565b61106b919061368d565b11156110ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a390613755565b60405180910390fd5b600b548111156110f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e8906137c1565b60405180910390fd5b80600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461113c919061368d565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061118933826122bc565b600160098190555050565b61119c61193c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611200576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061120d61193c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166112ba61193c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112ff9190612c64565b60405180910390a35050565b611316848484611ab3565b6113358373ffffffffffffffffffffffffffffffffffffffff166122da565b801561134a5750611348848484846122fd565b155b15611381576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600061139683600e548461244d565b905092915050565b60606113a9826119ae565b6113e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113df90613853565b60405180910390fd5b60001515600d60029054906101000a900460ff16151503611423576040518060800160405280604b8152602001613def604b91399050611483565b6000600a8054611432906134c3565b90501161144e5760405180602001604052806000815250611480565b611456612464565b61145f836124f6565b6040516020016114709291906138fb565b6040516020818303038152906040525b90505b919050565b6002600954036114cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c490613540565b60405180910390fd5b6002600981905550600d60009054906101000a900460ff1615611525576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151c90613976565b60405180910390fd5b600d60019054906101000a900460ff16611574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156b906139e2565b60405180910390fd5b60018210156115b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115af9061363e565b60405180910390fd5b600c54826115c46109ac565b6115ce919061368d565b111561160f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160690613755565b60405180910390fd5b600b5482600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461165d919061368d565b111561169e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169590613a4e565b60405180910390fd5b6116ce81336040516020016116b39190613ab6565b60405160208183030381529060405280519060200120611387565b61170d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170490613b1d565b60405180910390fd5b81600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611758919061368d565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506117a533836122bc565b60016009819055505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61184d61193c565b73ffffffffffffffffffffffffffffffffffffffff1661186b610eb9565b73ffffffffffffffffffffffffffffffffffffffff16146118c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b890613474565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611930576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192790613baf565b60405180910390fd5b611939816121f6565b50565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816119b9611aae565b111580156119c8575060005482105b80156119f5575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6000611abe82611f67565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611b29576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611b4a61193c565b73ffffffffffffffffffffffffffffffffffffffff161480611b795750611b7885611b7361193c565b6117b1565b5b80611bbe5750611b8761193c565b73ffffffffffffffffffffffffffffffffffffffff16611ba684610826565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611bf7576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611c5d576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c6a8585856001612656565b611c76600084876119fc565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611ef5576000548214611ef457878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f60858585600161265c565b5050505050565b611f6f612b50565b600082905080611f7d611aae565b11158015611f8c575060005481105b156121bf576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516121bd57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146120a15780925050506121f1565b5b6001156121bc57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146121b75780925050506121f1565b6120a2565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6122d6828260405180602001604052806000815250612662565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261232361193c565b8786866040518563ffffffff1660e01b81526004016123459493929190613c24565b6020604051808303816000875af192505050801561238157506040513d601f19601f8201168201806040525081019061237e9190613c85565b60015b6123fa573d80600081146123b1576040519150601f19603f3d011682016040523d82523d6000602084013e6123b6565b606091505b5060008151036123f2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60008261245a8584612674565b1490509392505050565b6060600a8054612473906134c3565b80601f016020809104026020016040519081016040528092919081815260200182805461249f906134c3565b80156124ec5780601f106124c1576101008083540402835291602001916124ec565b820191906000526020600020905b8154815290600101906020018083116124cf57829003601f168201915b5050505050905090565b60606000820361253d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612651565b600082905060005b6000821461256f57808061255890613cb2565b915050600a826125689190613d29565b9150612545565b60008167ffffffffffffffff81111561258b5761258a6130bf565b5b6040519080825280601f01601f1916602001820160405280156125bd5781602001600182028036833780820191505090505b5090505b6000851461264a576001826125d69190613d5a565b9150600a856125e59190613d8e565b60306125f1919061368d565b60f81b81838151811061260757612606613dbf565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126439190613d29565b94506125c1565b8093505050505b919050565b50505050565b50505050565b61266f83838360016126e9565b505050565b60008082905060005b84518110156126de57600085828151811061269b5761269a613dbf565b5b602002602001015190508083116126bd576126b68382612ab3565b92506126ca565b6126c78184612ab3565b92505b5080806126d690613cb2565b91505061267d565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612755576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000840361278f576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61279c6000868387612656565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561296657506129658773ffffffffffffffffffffffffffffffffffffffff166122da565b5b15612a2b575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129db60008884806001019550886122fd565b612a11576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80820361296c578260005414612a2657600080fd5b612a96565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203612a2c575b816000819055505050612aac600086838761265c565b5050505050565b600082600052816020526040600020905092915050565b828054612ad6906134c3565b90600052602060002090601f016020900481019282612af85760008555612b3f565b82601f10612b1157803560ff1916838001178555612b3f565b82800160010185558215612b3f579182015b82811115612b3e578235825591602001919060010190612b23565b5b509050612b4c9190612b93565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612bac576000816000905550600101612b94565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612bf981612bc4565b8114612c0457600080fd5b50565b600081359050612c1681612bf0565b92915050565b600060208284031215612c3257612c31612bba565b5b6000612c4084828501612c07565b91505092915050565b60008115159050919050565b612c5e81612c49565b82525050565b6000602082019050612c796000830184612c55565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612cb9578082015181840152602081019050612c9e565b83811115612cc8576000848401525b50505050565b6000601f19601f8301169050919050565b6000612cea82612c7f565b612cf48185612c8a565b9350612d04818560208601612c9b565b612d0d81612cce565b840191505092915050565b60006020820190508181036000830152612d328184612cdf565b905092915050565b6000819050919050565b612d4d81612d3a565b8114612d5857600080fd5b50565b600081359050612d6a81612d44565b92915050565b600060208284031215612d8657612d85612bba565b5b6000612d9484828501612d5b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612dc882612d9d565b9050919050565b612dd881612dbd565b82525050565b6000602082019050612df36000830184612dcf565b92915050565b612e0281612dbd565b8114612e0d57600080fd5b50565b600081359050612e1f81612df9565b92915050565b60008060408385031215612e3c57612e3b612bba565b5b6000612e4a85828601612e10565b9250506020612e5b85828601612d5b565b9150509250929050565b612e6e81612d3a565b82525050565b6000602082019050612e896000830184612e65565b92915050565b600080600060608486031215612ea857612ea7612bba565b5b6000612eb686828701612e10565b9350506020612ec786828701612e10565b9250506040612ed886828701612d5b565b9150509250925092565b6000819050919050565b612ef581612ee2565b82525050565b6000602082019050612f106000830184612eec565b92915050565b600060208284031215612f2c57612f2b612bba565b5b6000612f3a84828501612e10565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f840112612f6857612f67612f43565b5b8235905067ffffffffffffffff811115612f8557612f84612f48565b5b602083019150836001820283011115612fa157612fa0612f4d565b5b9250929050565b60008060208385031215612fbf57612fbe612bba565b5b600083013567ffffffffffffffff811115612fdd57612fdc612bbf565b5b612fe985828601612f52565b92509250509250929050565b612ffe81612ee2565b811461300957600080fd5b50565b60008135905061301b81612ff5565b92915050565b60006020828403121561303757613036612bba565b5b60006130458482850161300c565b91505092915050565b61305781612c49565b811461306257600080fd5b50565b6000813590506130748161304e565b92915050565b6000806040838503121561309157613090612bba565b5b600061309f85828601612e10565b92505060206130b085828601613065565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6130f782612cce565b810181811067ffffffffffffffff82111715613116576131156130bf565b5b80604052505050565b6000613129612bb0565b905061313582826130ee565b919050565b600067ffffffffffffffff821115613155576131546130bf565b5b61315e82612cce565b9050602081019050919050565b82818337600083830152505050565b600061318d6131888461313a565b61311f565b9050828152602081018484840111156131a9576131a86130ba565b5b6131b484828561316b565b509392505050565b600082601f8301126131d1576131d0612f43565b5b81356131e184826020860161317a565b91505092915050565b6000806000806080858703121561320457613203612bba565b5b600061321287828801612e10565b945050602061322387828801612e10565b935050604061323487828801612d5b565b925050606085013567ffffffffffffffff81111561325557613254612bbf565b5b613261878288016131bc565b91505092959194509250565b600067ffffffffffffffff821115613288576132876130bf565b5b602082029050602081019050919050565b60006132ac6132a78461326d565b61311f565b905080838252602082019050602084028301858111156132cf576132ce612f4d565b5b835b818110156132f857806132e4888261300c565b8452602084019350506020810190506132d1565b5050509392505050565b600082601f83011261331757613316612f43565b5b8135613327848260208601613299565b91505092915050565b6000806040838503121561334757613346612bba565b5b600083013567ffffffffffffffff81111561336557613364612bbf565b5b61337185828601613302565b92505060206133828582860161300c565b9150509250929050565b600080604083850312156133a3576133a2612bba565b5b60006133b185828601612d5b565b925050602083013567ffffffffffffffff8111156133d2576133d1612bbf565b5b6133de85828601613302565b9150509250929050565b600080604083850312156133ff576133fe612bba565b5b600061340d85828601612e10565b925050602061341e85828601612e10565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061345e602083612c8a565b915061346982613428565b602082019050919050565b6000602082019050818103600083015261348d81613451565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806134db57607f821691505b6020821081036134ee576134ed613494565b5b50919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061352a601f83612c8a565b9150613535826134f4565b602082019050919050565b600060208201905081810360008301526135598161351d565b9050919050565b7f5055424c4943204d494e54204e4f542041435449564500000000000000000000600082015250565b6000613596601683612c8a565b91506135a182613560565b602082019050919050565b600060208201905081810360008301526135c581613589565b9050919050565b7f4154204c4541535420312054494e5920444f47204e45454420544f204245204d60008201527f494e544544000000000000000000000000000000000000000000000000000000602082015250565b6000613628602583612c8a565b9150613633826135cc565b604082019050919050565b600060208201905081810360008301526136578161361b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061369882612d3a565b91506136a383612d3a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156136d8576136d761365e565b5b828201905092915050565b7f4d494e54494e472054484953204d414e5920574f554c4420455843454544205460008201527f494e5920444f4720535550504c59000000000000000000000000000000000000602082015250565b600061373f602e83612c8a565b915061374a826136e3565b604082019050919050565b6000602082019050818103600083015261376e81613732565b9050919050565b7f4d41582050455220545820495320380000000000000000000000000000000000600082015250565b60006137ab600f83612c8a565b91506137b682613775565b602082019050919050565b600060208201905081810360008301526137da8161379e565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061383d602f83612c8a565b9150613848826137e1565b604082019050919050565b6000602082019050818103600083015261386c81613830565b9050919050565b600081905092915050565b600061388982612c7f565b6138938185613873565b93506138a3818560208601612c9b565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006138e5600583613873565b91506138f0826138af565b600582019050919050565b6000613907828561387e565b9150613913828461387e565b915061391e826138d8565b91508190509392505050565b7f5055424c4943204d494e54204143544956450000000000000000000000000000600082015250565b6000613960601283612c8a565b915061396b8261392a565b602082019050919050565b6000602082019050818103600083015261398f81613953565b9050919050565b7f57484954454c495354204d494e54204e4f542041435449564500000000000000600082015250565b60006139cc601983612c8a565b91506139d782613996565b602082019050919050565b600060208201905081810360008301526139fb816139bf565b9050919050565b7f4d4158204d494e54454420544f2057414c4c455420414c524541445900000000600082015250565b6000613a38601c83612c8a565b9150613a4382613a02565b602082019050919050565b60006020820190508181036000830152613a6781613a2b565b9050919050565b60008160601b9050919050565b6000613a8682613a6e565b9050919050565b6000613a9882613a7b565b9050919050565b613ab0613aab82612dbd565b613a8d565b82525050565b6000613ac28284613a9f565b60148201915081905092915050565b7f4e6f7420612070617274206f6620416c6c6f776c697374000000000000000000600082015250565b6000613b07601783612c8a565b9150613b1282613ad1565b602082019050919050565b60006020820190508181036000830152613b3681613afa565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613b99602683612c8a565b9150613ba482613b3d565b604082019050919050565b60006020820190508181036000830152613bc881613b8c565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613bf682613bcf565b613c008185613bda565b9350613c10818560208601612c9b565b613c1981612cce565b840191505092915050565b6000608082019050613c396000830187612dcf565b613c466020830186612dcf565b613c536040830185612e65565b8181036060830152613c658184613beb565b905095945050505050565b600081519050613c7f81612bf0565b92915050565b600060208284031215613c9b57613c9a612bba565b5b6000613ca984828501613c70565b91505092915050565b6000613cbd82612d3a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613cef57613cee61365e565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613d3482612d3a565b9150613d3f83612d3a565b925082613d4f57613d4e613cfa565b5b828204905092915050565b6000613d6582612d3a565b9150613d7083612d3a565b925082821015613d8357613d8261365e565b5b828203905092915050565b6000613d9982612d3a565b9150613da483612d3a565b925082613db457613db3613cfa565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfe697066733a2f2f516d626f4e5275383142533772444b3857714e347639343858324b53793142793248474238714869636d5164747a3f66696c656e616d653d707265766965772e6a736f6ea264697066735822122017f269fffdf46e3848371d38e28557bbeac8daae722d22de8c6d36452e3f8e5c64736f6c634300080d0033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000b697066733a2f2f6173642f000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _initBaseURI (string): ipfs://asd/

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [2] : 697066733a2f2f6173642f000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

49974:3726:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53403:96;;;:::i;:::-;;32120:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35233:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36736:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36299:371;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31369:303;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53505:105;;;:::i;:::-;;37601:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50277:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53616:81;;;:::i;:::-;;50311:50;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37842:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50101:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50248:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50181:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53184:108;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35041:125;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50213:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50071:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32489:206;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9878:103;;;:::i;:::-;;53298:93;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50139:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9227:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35402:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50504:661;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37012:287;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38098:369;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52099:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52526:488;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51171:920;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37370:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10136:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53403:96;9458:12;:10;:12::i;:::-;9447:23;;:7;:5;:7::i;:::-;:23;;;9439:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53478:13:::1;;;;;;;;;;;53477:14;53461:13;;:30;;;;;;;;;;;;;;;;;;53403:96::o:0;32120:305::-;32222:4;32274:25;32259:40;;;:11;:40;;;;:105;;;;32331:33;32316:48;;;:11;:48;;;;32259:105;:158;;;;32381:36;32405:11;32381:23;:36::i;:::-;32259:158;32239:178;;32120:305;;;:::o;35233:100::-;35287:13;35320:5;35313:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35233:100;:::o;36736:204::-;36804:7;36829:16;36837:7;36829;:16::i;:::-;36824:64;;36854:34;;;;;;;;;;;;;;36824:64;36908:15;:24;36924:7;36908:24;;;;;;;;;;;;;;;;;;;;;36901:31;;36736:204;;;:::o;36299:371::-;36372:13;36388:24;36404:7;36388:15;:24::i;:::-;36372:40;;36433:5;36427:11;;:2;:11;;;36423:48;;36447:24;;;;;;;;;;;;;;36423:48;36504:5;36488:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;36514:37;36531:5;36538:12;:10;:12::i;:::-;36514:16;:37::i;:::-;36513:38;36488:63;36484:138;;;36575:35;;;;;;;;;;;;;;36484:138;36634:28;36643:2;36647:7;36656:5;36634:8;:28::i;:::-;36361:309;36299:371;;:::o;31369:303::-;31413:7;31638:15;:13;:15::i;:::-;31623:12;;31607:13;;:28;:46;31600:53;;31369:303;:::o;53505:105::-;9458:12;:10;:12::i;:::-;9447:23;;:7;:5;:7::i;:::-;:23;;;9439:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53586:16:::1;;;;;;;;;;;53585:17;53566:16;;:36;;;;;;;;;;;;;;;;;;53505:105::o:0;37601:170::-;37735:28;37745:4;37751:2;37755:7;37735:9;:28::i;:::-;37601:170;;;:::o;50277:25::-;;;;:::o;53616:81::-;9458:12;:10;:12::i;:::-;9447:23;;:7;:5;:7::i;:::-;:23;;;9439:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53681:8:::1;;;;;;;;;;;53680:9;53669:8;;:20;;;;;;;;;;;;;;;;;;53616:81::o:0;50311:50::-;;;;;;;;;;;;;;;;;:::o;37842:185::-;37980:39;37997:4;38003:2;38007:7;37980:39;;;;;;;;;;;;:16;:39::i;:::-;37842:185;;;:::o;50101:31::-;;;;:::o;50248:20::-;;;;;;;;;;;;;:::o;50181:25::-;;;;;;;;;;;;;:::o;53184:108::-;9458:12;:10;:12::i;:::-;9447:23;;:7;:5;:7::i;:::-;:23;;;9439:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53273:11:::1;;53263:7;:21;;;;;;;:::i;:::-;;53184:108:::0;;:::o;35041:125::-;35105:7;35132:21;35145:7;35132:12;:21::i;:::-;:26;;;35125:33;;35041:125;;;:::o;50213:28::-;;;;;;;;;;;;;:::o;50071:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32489:206::-;32553:7;32594:1;32577:19;;:5;:19;;;32573:60;;32605:28;;;;;;;;;;;;;;32573:60;32659:12;:19;32672:5;32659:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;32651:36;;32644:43;;32489:206;;;:::o;9878:103::-;9458:12;:10;:12::i;:::-;9447:23;;:7;:5;:7::i;:::-;:23;;;9439:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9943:30:::1;9970:1;9943:18;:30::i;:::-;9878:103::o:0;53298:93::-;9458:12;:10;:12::i;:::-;9447:23;;:7;:5;:7::i;:::-;:23;;;9439:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53379:4:::1;53366:10;:17;;;;53298:93:::0;:::o;50139:33::-;;;;:::o;9227:87::-;9273:7;9300:6;;;;;;;;;;;9293:13;;9227:87;:::o;35402:104::-;35458:13;35491:7;35484:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35402:104;:::o;50504:661::-;4201:1;4799:7;;:19;4791:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;4201:1;4932:7;:18;;;;50577:13:::1;;;;;;;;;;;50569:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;50701:1;50689:8;:13;;50681:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;50844:11;;50832:8;50816:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:39;;50808:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;50964:12;;50952:8;:24;;50944:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;51107:8;51078:14;:26;51093:10;51078:26;;;;;;;;;;;;;;;;:37;;;;:::i;:::-;51049:14;:26;51064:10;51049:26;;;;;;;;;;;;;;;:66;;;;51126:31;51136:10;51148:8;51126:9;:31::i;:::-;4157:1:::0;5111:7;:22;;;;50504:661;:::o;37012:287::-;37123:12;:10;:12::i;:::-;37111:24;;:8;:24;;;37107:54;;37144:17;;;;;;;;;;;;;;37107:54;37219:8;37174:18;:32;37193:12;:10;:12::i;:::-;37174:32;;;;;;;;;;;;;;;:42;37207:8;37174:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;37272:8;37243:48;;37258:12;:10;:12::i;:::-;37243:48;;;37282:8;37243:48;;;;;;:::i;:::-;;;;;;;;37012:287;;:::o;38098:369::-;38265:28;38275:4;38281:2;38285:7;38265:9;:28::i;:::-;38308:15;:2;:13;;;:15::i;:::-;:76;;;;;38328:56;38359:4;38365:2;38369:7;38378:5;38328:30;:56::i;:::-;38327:57;38308:76;38304:156;;;38408:40;;;;;;;;;;;;;;38304:156;38098:369;;;;:::o;52099:151::-;52175:4;52199:43;52218:5;52225:10;;52237:4;52199:18;:43::i;:::-;52192:50;;52099:151;;;;:::o;52526:488::-;52599:13;52634:16;52642:7;52634;:16::i;:::-;52626:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;52728:5;52716:17;;:8;;;;;;;;;;;:17;;;52712:134;;52750:84;;;;;;;;;;;;;;;;;;;;;52712:134;52906:1;52888:7;52882:21;;;;;:::i;:::-;;;:25;:124;;;;;;;;;;;;;;;;;52947:10;:8;:10::i;:::-;52959:18;:7;:16;:18::i;:::-;52930:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52882:124;52866:140;;52526:488;;;;:::o;51171:920::-;4201:1;4799:7;;:19;4791:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;4201:1;4932:7;:18;;;;51278:13:::1;;;;;;;;;;;51277:14;51269:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;51385:16;;;;;;;;;;;51377:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;51512:1;51500:8;:13;;51492:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;51655:11;;51643:8;51627:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:39;;51619:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;51804:12;;51792:8;51763:14;:26;51778:10;51763:26;;;;;;;;;;;;;;;;:37;;;;:::i;:::-;:53;;51755:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;51881:55;51889:5;51923:10;51906:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;51896:39;;;;;;51881:7;:55::i;:::-;51873:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;52033:8;52004:14;:26;52019:10;52004:26;;;;;;;;;;;;;;;;:37;;;;:::i;:::-;51975:14;:26;51990:10;51975:26;;;;;;;;;;;;;;;:66;;;;52052:31;52062:10;52074:8;52052:9;:31::i;:::-;4157:1:::0;5111:7;:22;;;;51171:920;;:::o;37370:164::-;37467:4;37491:18;:25;37510:5;37491:25;;;;;;;;;;;;;;;:35;37517:8;37491:35;;;;;;;;;;;;;;;;;;;;;;;;;37484:42;;37370:164;;;;:::o;10136:201::-;9458:12;:10;:12::i;:::-;9447:23;;:7;:5;:7::i;:::-;:23;;;9439:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10245:1:::1;10225:22;;:8;:22;;::::0;10217:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;10301:28;10320:8;10301:18;:28::i;:::-;10136:201:::0;:::o;7951:98::-;8004:7;8031:10;8024:17;;7951:98;:::o;22011:157::-;22096:4;22135:25;22120:40;;;:11;:40;;;;22113:47;;22011:157;;;:::o;38722:174::-;38779:4;38822:7;38803:15;:13;:15::i;:::-;:26;;:53;;;;;38843:13;;38833:7;:23;38803:53;:85;;;;;38861:11;:20;38873:7;38861:20;;;;;;;;;;;:27;;;;;;;;;;;;38860:28;38803:85;38796:92;;38722:174;;;:::o;46879:196::-;47021:2;46994:15;:24;47010:7;46994:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;47059:7;47055:2;47039:28;;47048:5;47039:28;;;;;;;;;;;;46879:196;;;:::o;31143:92::-;31199:7;31143:92;:::o;41822:2130::-;41937:35;41975:21;41988:7;41975:12;:21::i;:::-;41937:59;;42035:4;42013:26;;:13;:18;;;:26;;;42009:67;;42048:28;;;;;;;;;;;;;;42009:67;42089:22;42131:4;42115:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;42152:36;42169:4;42175:12;:10;:12::i;:::-;42152:16;:36::i;:::-;42115:73;:126;;;;42229:12;:10;:12::i;:::-;42205:36;;:20;42217:7;42205:11;:20::i;:::-;:36;;;42115:126;42089:153;;42260:17;42255:66;;42286:35;;;;;;;;;;;;;;42255:66;42350:1;42336:16;;:2;:16;;;42332:52;;42361:23;;;;;;;;;;;;;;42332:52;42397:43;42419:4;42425:2;42429:7;42438:1;42397:21;:43::i;:::-;42505:35;42522:1;42526:7;42535:4;42505:8;:35::i;:::-;42866:1;42836:12;:18;42849:4;42836:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42910:1;42882:12;:16;42895:2;42882:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42928:31;42962:11;:20;42974:7;42962:20;;;;;;;;;;;42928:54;;43013:2;42997:8;:13;;;:18;;;;;;;;;;;;;;;;;;43063:15;43030:8;:23;;;:49;;;;;;;;;;;;;;;;;;43331:19;43363:1;43353:7;:11;43331:33;;43379:31;43413:11;:24;43425:11;43413:24;;;;;;;;;;;43379:58;;43481:1;43456:27;;:8;:13;;;;;;;;;;;;:27;;;43452:384;;43666:13;;43651:11;:28;43647:174;;43720:4;43704:8;:13;;;:20;;;;;;;;;;;;;;;;;;43773:13;:28;;;43747:8;:23;;;:54;;;;;;;;;;;;;;;;;;43647:174;43452:384;42811:1036;;;43883:7;43879:2;43864:27;;43873:4;43864:27;;;;;;;;;;;;43902:42;43923:4;43929:2;43933:7;43942:1;43902:20;:42::i;:::-;41926:2026;;41822:2130;;;:::o;33870:1109::-;33932:21;;:::i;:::-;33966:12;33981:7;33966:22;;34049:4;34030:15;:13;:15::i;:::-;:23;;:47;;;;;34064:13;;34057:4;:20;34030:47;34026:886;;;34098:31;34132:11;:17;34144:4;34132:17;;;;;;;;;;;34098:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34173:9;:16;;;34168:729;;34244:1;34218:28;;:9;:14;;;:28;;;34214:101;;34282:9;34275:16;;;;;;34214:101;34617:261;34624:4;34617:261;;;34657:6;;;;;;;;34702:11;:17;34714:4;34702:17;;;;;;;;;;;34690:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34776:1;34750:28;;:9;:14;;;:28;;;34746:109;;34818:9;34811:16;;;;;;34746:109;34617:261;;;34168:729;34079:833;34026:886;34940:31;;;;;;;;;;;;;;33870:1109;;;;:::o;10497:191::-;10571:16;10590:6;;;;;;;;;;;10571:25;;10616:8;10607:6;;:17;;;;;;;;;;;;;;;;;;10671:8;10640:40;;10661:8;10640:40;;;;;;;;;;;;10560:128;10497:191;:::o;38904:104::-;38973:27;38983:2;38987:8;38973:27;;;;;;;;;;;;:9;:27::i;:::-;38904:104;;:::o;11928:326::-;11988:4;12245:1;12223:7;:19;;;:23;12216:30;;11928:326;;;:::o;47567:667::-;47730:4;47767:2;47751:36;;;47788:12;:10;:12::i;:::-;47802:4;47808:7;47817:5;47751:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;47747:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48002:1;47985:6;:13;:18;47981:235;;48031:40;;;;;;;;;;;;;;47981:235;48174:6;48168:13;48159:6;48155:2;48151:15;48144:38;47747:480;47880:45;;;47870:55;;;:6;:55;;;;47863:62;;;47567:667;;;;;;:::o;923:190::-;1048:4;1101;1072:25;1085:5;1092:4;1072:12;:25::i;:::-;:33;1065:40;;923:190;;;;;:::o;52420:100::-;52472:13;52505:7;52498:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52420:100;:::o;5513:723::-;5569:13;5799:1;5790:5;:10;5786:53;;5817:10;;;;;;;;;;;;;;;;;;;;;5786:53;5849:12;5864:5;5849:20;;5880:14;5905:78;5920:1;5912:4;:9;5905:78;;5938:8;;;;;:::i;:::-;;;;5969:2;5961:10;;;;;:::i;:::-;;;5905:78;;;5993:19;6025:6;6015:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5993:39;;6043:154;6059:1;6050:5;:10;6043:154;;6087:1;6077:11;;;;;:::i;:::-;;;6154:2;6146:5;:10;;;;:::i;:::-;6133:2;:24;;;;:::i;:::-;6120:39;;6103:6;6110;6103:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;6183:2;6174:11;;;;;:::i;:::-;;;6043:154;;;6221:6;6207:21;;;;;5513:723;;;;:::o;48882:159::-;;;;;:::o;49700:158::-;;;;;:::o;39371:163::-;39494:32;39500:2;39504:8;39514:5;39521:4;39494:5;:32::i;:::-;39371:163;;;:::o;1475:675::-;1558:7;1578:20;1601:4;1578:27;;1621:9;1616:497;1640:5;:12;1636:1;:16;1616:497;;;1674:20;1697:5;1703:1;1697:8;;;;;;;;:::i;:::-;;;;;;;;1674:31;;1740:12;1724;:28;1720:382;;1867:42;1882:12;1896;1867:14;:42::i;:::-;1852:57;;1720:382;;;2044:42;2059:12;2073;2044:14;:42::i;:::-;2029:57;;1720:382;1659:454;1654:3;;;;;:::i;:::-;;;;1616:497;;;;2130:12;2123:19;;;1475:675;;;;:::o;39793:1775::-;39932:20;39955:13;;39932:36;;39997:1;39983:16;;:2;:16;;;39979:48;;40008:19;;;;;;;;;;;;;;39979:48;40054:1;40042:8;:13;40038:44;;40064:18;;;;;;;;;;;;;;40038:44;40095:61;40125:1;40129:2;40133:12;40147:8;40095:21;:61::i;:::-;40468:8;40433:12;:16;40446:2;40433:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40532:8;40492:12;:16;40505:2;40492:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40591:2;40558:11;:25;40570:12;40558:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;40658:15;40608:11;:25;40620:12;40608:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;40691:20;40714:12;40691:35;;40741:11;40770:8;40755:12;:23;40741:37;;40799:4;:23;;;;;40807:15;:2;:13;;;:15::i;:::-;40799:23;40795:641;;;40843:314;40899:12;40895:2;40874:38;;40891:1;40874:38;;;;;;;;;;;;40940:69;40979:1;40983:2;40987:14;;;;;;41003:5;40940:30;:69::i;:::-;40935:174;;41045:40;;;;;;;;;;;;;;40935:174;41152:3;41136:12;:19;40843:314;;41238:12;41221:13;;:29;41217:43;;41252:8;;;41217:43;40795:641;;;41301:120;41357:14;;;;;;41353:2;41332:40;;41349:1;41332:40;;;;;;;;;;;;41416:3;41400:12;:19;41301:120;;40795:641;41466:12;41450:13;:28;;;;40408:1082;;41500:60;41529:1;41533:2;41537:12;41551:8;41500:20;:60::i;:::-;39921:1647;39793:1775;;;;:::o;2158:224::-;2226:13;2289:1;2283:4;2276:15;2318:1;2312:4;2305:15;2359:4;2353;2343:21;2334:30;;2158:224;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:77::-;5952:7;5981:5;5970:16;;5915:77;;;:::o;5998:118::-;6085:24;6103:5;6085:24;:::i;:::-;6080:3;6073:37;5998:118;;:::o;6122:222::-;6215:4;6253:2;6242:9;6238:18;6230:26;;6266:71;6334:1;6323:9;6319:17;6310:6;6266:71;:::i;:::-;6122:222;;;;:::o;6350:329::-;6409:6;6458:2;6446:9;6437:7;6433:23;6429:32;6426:119;;;6464:79;;:::i;:::-;6426:119;6584:1;6609:53;6654:7;6645:6;6634:9;6630:22;6609:53;:::i;:::-;6599:63;;6555:117;6350:329;;;;:::o;6685:117::-;6794:1;6791;6784:12;6808:117;6917:1;6914;6907:12;6931:117;7040:1;7037;7030:12;7068:553;7126:8;7136:6;7186:3;7179:4;7171:6;7167:17;7163:27;7153:122;;7194:79;;:::i;:::-;7153:122;7307:6;7294:20;7284:30;;7337:18;7329:6;7326:30;7323:117;;;7359:79;;:::i;:::-;7323:117;7473:4;7465:6;7461:17;7449:29;;7527:3;7519:4;7511:6;7507:17;7497:8;7493:32;7490:41;7487:128;;;7534:79;;:::i;:::-;7487:128;7068:553;;;;;:::o;7627:529::-;7698:6;7706;7755:2;7743:9;7734:7;7730:23;7726:32;7723:119;;;7761:79;;:::i;:::-;7723:119;7909:1;7898:9;7894:17;7881:31;7939:18;7931:6;7928:30;7925:117;;;7961:79;;:::i;:::-;7925:117;8074:65;8131:7;8122:6;8111:9;8107:22;8074:65;:::i;:::-;8056:83;;;;7852:297;7627:529;;;;;:::o;8162:122::-;8235:24;8253:5;8235:24;:::i;:::-;8228:5;8225:35;8215:63;;8274:1;8271;8264:12;8215:63;8162:122;:::o;8290:139::-;8336:5;8374:6;8361:20;8352:29;;8390:33;8417:5;8390:33;:::i;:::-;8290:139;;;;:::o;8435:329::-;8494:6;8543:2;8531:9;8522:7;8518:23;8514:32;8511:119;;;8549:79;;:::i;:::-;8511:119;8669:1;8694:53;8739:7;8730:6;8719:9;8715:22;8694:53;:::i;:::-;8684:63;;8640:117;8435:329;;;;:::o;8770:116::-;8840:21;8855:5;8840:21;:::i;:::-;8833:5;8830:32;8820:60;;8876:1;8873;8866:12;8820:60;8770:116;:::o;8892:133::-;8935:5;8973:6;8960:20;8951:29;;8989:30;9013:5;8989:30;:::i;:::-;8892:133;;;;:::o;9031:468::-;9096:6;9104;9153:2;9141:9;9132:7;9128:23;9124:32;9121:119;;;9159:79;;:::i;:::-;9121:119;9279:1;9304:53;9349:7;9340:6;9329:9;9325:22;9304:53;:::i;:::-;9294:63;;9250:117;9406:2;9432:50;9474:7;9465:6;9454:9;9450:22;9432:50;:::i;:::-;9422:60;;9377:115;9031:468;;;;;:::o;9505:117::-;9614:1;9611;9604:12;9628:180;9676:77;9673:1;9666:88;9773:4;9770:1;9763:15;9797:4;9794:1;9787:15;9814:281;9897:27;9919:4;9897:27;:::i;:::-;9889:6;9885:40;10027:6;10015:10;10012:22;9991:18;9979:10;9976:34;9973:62;9970:88;;;10038:18;;:::i;:::-;9970:88;10078:10;10074:2;10067:22;9857:238;9814:281;;:::o;10101:129::-;10135:6;10162:20;;:::i;:::-;10152:30;;10191:33;10219:4;10211:6;10191:33;:::i;:::-;10101:129;;;:::o;10236:307::-;10297:4;10387:18;10379:6;10376:30;10373:56;;;10409:18;;:::i;:::-;10373:56;10447:29;10469:6;10447:29;:::i;:::-;10439:37;;10531:4;10525;10521:15;10513:23;;10236:307;;;:::o;10549:154::-;10633:6;10628:3;10623;10610:30;10695:1;10686:6;10681:3;10677:16;10670:27;10549:154;;;:::o;10709:410::-;10786:5;10811:65;10827:48;10868:6;10827:48;:::i;:::-;10811:65;:::i;:::-;10802:74;;10899:6;10892:5;10885:21;10937:4;10930:5;10926:16;10975:3;10966:6;10961:3;10957:16;10954:25;10951:112;;;10982:79;;:::i;:::-;10951:112;11072:41;11106:6;11101:3;11096;11072:41;:::i;:::-;10792:327;10709:410;;;;;:::o;11138:338::-;11193:5;11242:3;11235:4;11227:6;11223:17;11219:27;11209:122;;11250:79;;:::i;:::-;11209:122;11367:6;11354:20;11392:78;11466:3;11458:6;11451:4;11443:6;11439:17;11392:78;:::i;:::-;11383:87;;11199:277;11138:338;;;;:::o;11482:943::-;11577:6;11585;11593;11601;11650:3;11638:9;11629:7;11625:23;11621:33;11618:120;;;11657:79;;:::i;:::-;11618:120;11777:1;11802:53;11847:7;11838:6;11827:9;11823:22;11802:53;:::i;:::-;11792:63;;11748:117;11904:2;11930:53;11975:7;11966:6;11955:9;11951:22;11930:53;:::i;:::-;11920:63;;11875:118;12032:2;12058:53;12103:7;12094:6;12083:9;12079:22;12058:53;:::i;:::-;12048:63;;12003:118;12188:2;12177:9;12173:18;12160:32;12219:18;12211:6;12208:30;12205:117;;;12241:79;;:::i;:::-;12205:117;12346:62;12400:7;12391:6;12380:9;12376:22;12346:62;:::i;:::-;12336:72;;12131:287;11482:943;;;;;;;:::o;12431:311::-;12508:4;12598:18;12590:6;12587:30;12584:56;;;12620:18;;:::i;:::-;12584:56;12670:4;12662:6;12658:17;12650:25;;12730:4;12724;12720:15;12712:23;;12431:311;;;:::o;12765:710::-;12861:5;12886:81;12902:64;12959:6;12902:64;:::i;:::-;12886:81;:::i;:::-;12877:90;;12987:5;13016:6;13009:5;13002:21;13050:4;13043:5;13039:16;13032:23;;13103:4;13095:6;13091:17;13083:6;13079:30;13132:3;13124:6;13121:15;13118:122;;;13151:79;;:::i;:::-;13118:122;13266:6;13249:220;13283:6;13278:3;13275:15;13249:220;;;13358:3;13387:37;13420:3;13408:10;13387:37;:::i;:::-;13382:3;13375:50;13454:4;13449:3;13445:14;13438:21;;13325:144;13309:4;13304:3;13300:14;13293:21;;13249:220;;;13253:21;12867:608;;12765:710;;;;;:::o;13498:370::-;13569:5;13618:3;13611:4;13603:6;13599:17;13595:27;13585:122;;13626:79;;:::i;:::-;13585:122;13743:6;13730:20;13768:94;13858:3;13850:6;13843:4;13835:6;13831:17;13768:94;:::i;:::-;13759:103;;13575:293;13498:370;;;;:::o;13874:684::-;13967:6;13975;14024:2;14012:9;14003:7;13999:23;13995:32;13992:119;;;14030:79;;:::i;:::-;13992:119;14178:1;14167:9;14163:17;14150:31;14208:18;14200:6;14197:30;14194:117;;;14230:79;;:::i;:::-;14194:117;14335:78;14405:7;14396:6;14385:9;14381:22;14335:78;:::i;:::-;14325:88;;14121:302;14462:2;14488:53;14533:7;14524:6;14513:9;14509:22;14488:53;:::i;:::-;14478:63;;14433:118;13874:684;;;;;:::o;14564:::-;14657:6;14665;14714:2;14702:9;14693:7;14689:23;14685:32;14682:119;;;14720:79;;:::i;:::-;14682:119;14840:1;14865:53;14910:7;14901:6;14890:9;14886:22;14865:53;:::i;:::-;14855:63;;14811:117;14995:2;14984:9;14980:18;14967:32;15026:18;15018:6;15015:30;15012:117;;;15048:79;;:::i;:::-;15012:117;15153:78;15223:7;15214:6;15203:9;15199:22;15153:78;:::i;:::-;15143:88;;14938:303;14564:684;;;;;:::o;15254:474::-;15322:6;15330;15379:2;15367:9;15358:7;15354:23;15350:32;15347:119;;;15385:79;;:::i;:::-;15347:119;15505:1;15530:53;15575:7;15566:6;15555:9;15551:22;15530:53;:::i;:::-;15520:63;;15476:117;15632:2;15658:53;15703:7;15694:6;15683:9;15679:22;15658:53;:::i;:::-;15648:63;;15603:118;15254:474;;;;;:::o;15734:182::-;15874:34;15870:1;15862:6;15858:14;15851:58;15734:182;:::o;15922:366::-;16064:3;16085:67;16149:2;16144:3;16085:67;:::i;:::-;16078:74;;16161:93;16250:3;16161:93;:::i;:::-;16279:2;16274:3;16270:12;16263:19;;15922:366;;;:::o;16294:419::-;16460:4;16498:2;16487:9;16483:18;16475:26;;16547:9;16541:4;16537:20;16533:1;16522:9;16518:17;16511:47;16575:131;16701:4;16575:131;:::i;:::-;16567:139;;16294:419;;;:::o;16719:180::-;16767:77;16764:1;16757:88;16864:4;16861:1;16854:15;16888:4;16885:1;16878:15;16905:320;16949:6;16986:1;16980:4;16976:12;16966:22;;17033:1;17027:4;17023:12;17054:18;17044:81;;17110:4;17102:6;17098:17;17088:27;;17044:81;17172:2;17164:6;17161:14;17141:18;17138:38;17135:84;;17191:18;;:::i;:::-;17135:84;16956:269;16905:320;;;:::o;17231:181::-;17371:33;17367:1;17359:6;17355:14;17348:57;17231:181;:::o;17418:366::-;17560:3;17581:67;17645:2;17640:3;17581:67;:::i;:::-;17574:74;;17657:93;17746:3;17657:93;:::i;:::-;17775:2;17770:3;17766:12;17759:19;;17418:366;;;:::o;17790:419::-;17956:4;17994:2;17983:9;17979:18;17971:26;;18043:9;18037:4;18033:20;18029:1;18018:9;18014:17;18007:47;18071:131;18197:4;18071:131;:::i;:::-;18063:139;;17790:419;;;:::o;18215:172::-;18355:24;18351:1;18343:6;18339:14;18332:48;18215:172;:::o;18393:366::-;18535:3;18556:67;18620:2;18615:3;18556:67;:::i;:::-;18549:74;;18632:93;18721:3;18632:93;:::i;:::-;18750:2;18745:3;18741:12;18734:19;;18393:366;;;:::o;18765:419::-;18931:4;18969:2;18958:9;18954:18;18946:26;;19018:9;19012:4;19008:20;19004:1;18993:9;18989:17;18982:47;19046:131;19172:4;19046:131;:::i;:::-;19038:139;;18765:419;;;:::o;19190:224::-;19330:34;19326:1;19318:6;19314:14;19307:58;19399:7;19394:2;19386:6;19382:15;19375:32;19190:224;:::o;19420:366::-;19562:3;19583:67;19647:2;19642:3;19583:67;:::i;:::-;19576:74;;19659:93;19748:3;19659:93;:::i;:::-;19777:2;19772:3;19768:12;19761:19;;19420:366;;;:::o;19792:419::-;19958:4;19996:2;19985:9;19981:18;19973:26;;20045:9;20039:4;20035:20;20031:1;20020:9;20016:17;20009:47;20073:131;20199:4;20073:131;:::i;:::-;20065:139;;19792:419;;;:::o;20217:180::-;20265:77;20262:1;20255:88;20362:4;20359:1;20352:15;20386:4;20383:1;20376:15;20403:305;20443:3;20462:20;20480:1;20462:20;:::i;:::-;20457:25;;20496:20;20514:1;20496:20;:::i;:::-;20491:25;;20650:1;20582:66;20578:74;20575:1;20572:81;20569:107;;;20656:18;;:::i;:::-;20569:107;20700:1;20697;20693:9;20686:16;;20403:305;;;;:::o;20714:233::-;20854:34;20850:1;20842:6;20838:14;20831:58;20923:16;20918:2;20910:6;20906:15;20899:41;20714:233;:::o;20953:366::-;21095:3;21116:67;21180:2;21175:3;21116:67;:::i;:::-;21109:74;;21192:93;21281:3;21192:93;:::i;:::-;21310:2;21305:3;21301:12;21294:19;;20953:366;;;:::o;21325:419::-;21491:4;21529:2;21518:9;21514:18;21506:26;;21578:9;21572:4;21568:20;21564:1;21553:9;21549:17;21542:47;21606:131;21732:4;21606:131;:::i;:::-;21598:139;;21325:419;;;:::o;21750:165::-;21890:17;21886:1;21878:6;21874:14;21867:41;21750:165;:::o;21921:366::-;22063:3;22084:67;22148:2;22143:3;22084:67;:::i;:::-;22077:74;;22160:93;22249:3;22160:93;:::i;:::-;22278:2;22273:3;22269:12;22262:19;;21921:366;;;:::o;22293:419::-;22459:4;22497:2;22486:9;22482:18;22474:26;;22546:9;22540:4;22536:20;22532:1;22521:9;22517:17;22510:47;22574:131;22700:4;22574:131;:::i;:::-;22566:139;;22293:419;;;:::o;22718:234::-;22858:34;22854:1;22846:6;22842:14;22835:58;22927:17;22922:2;22914:6;22910:15;22903:42;22718:234;:::o;22958:366::-;23100:3;23121:67;23185:2;23180:3;23121:67;:::i;:::-;23114:74;;23197:93;23286:3;23197:93;:::i;:::-;23315:2;23310:3;23306:12;23299:19;;22958:366;;;:::o;23330:419::-;23496:4;23534:2;23523:9;23519:18;23511:26;;23583:9;23577:4;23573:20;23569:1;23558:9;23554:17;23547:47;23611:131;23737:4;23611:131;:::i;:::-;23603:139;;23330:419;;;:::o;23755:148::-;23857:11;23894:3;23879:18;;23755:148;;;;:::o;23909:377::-;24015:3;24043:39;24076:5;24043:39;:::i;:::-;24098:89;24180:6;24175:3;24098:89;:::i;:::-;24091:96;;24196:52;24241:6;24236:3;24229:4;24222:5;24218:16;24196:52;:::i;:::-;24273:6;24268:3;24264:16;24257:23;;24019:267;23909:377;;;;:::o;24292:155::-;24432:7;24428:1;24420:6;24416:14;24409:31;24292:155;:::o;24453:400::-;24613:3;24634:84;24716:1;24711:3;24634:84;:::i;:::-;24627:91;;24727:93;24816:3;24727:93;:::i;:::-;24845:1;24840:3;24836:11;24829:18;;24453:400;;;:::o;24859:701::-;25140:3;25162:95;25253:3;25244:6;25162:95;:::i;:::-;25155:102;;25274:95;25365:3;25356:6;25274:95;:::i;:::-;25267:102;;25386:148;25530:3;25386:148;:::i;:::-;25379:155;;25551:3;25544:10;;24859:701;;;;;:::o;25566:168::-;25706:20;25702:1;25694:6;25690:14;25683:44;25566:168;:::o;25740:366::-;25882:3;25903:67;25967:2;25962:3;25903:67;:::i;:::-;25896:74;;25979:93;26068:3;25979:93;:::i;:::-;26097:2;26092:3;26088:12;26081:19;;25740:366;;;:::o;26112:419::-;26278:4;26316:2;26305:9;26301:18;26293:26;;26365:9;26359:4;26355:20;26351:1;26340:9;26336:17;26329:47;26393:131;26519:4;26393:131;:::i;:::-;26385:139;;26112:419;;;:::o;26537:175::-;26677:27;26673:1;26665:6;26661:14;26654:51;26537:175;:::o;26718:366::-;26860:3;26881:67;26945:2;26940:3;26881:67;:::i;:::-;26874:74;;26957:93;27046:3;26957:93;:::i;:::-;27075:2;27070:3;27066:12;27059:19;;26718:366;;;:::o;27090:419::-;27256:4;27294:2;27283:9;27279:18;27271:26;;27343:9;27337:4;27333:20;27329:1;27318:9;27314:17;27307:47;27371:131;27497:4;27371:131;:::i;:::-;27363:139;;27090:419;;;:::o;27515:178::-;27655:30;27651:1;27643:6;27639:14;27632:54;27515:178;:::o;27699:366::-;27841:3;27862:67;27926:2;27921:3;27862:67;:::i;:::-;27855:74;;27938:93;28027:3;27938:93;:::i;:::-;28056:2;28051:3;28047:12;28040:19;;27699:366;;;:::o;28071:419::-;28237:4;28275:2;28264:9;28260:18;28252:26;;28324:9;28318:4;28314:20;28310:1;28299:9;28295:17;28288:47;28352:131;28478:4;28352:131;:::i;:::-;28344:139;;28071:419;;;:::o;28496:94::-;28529:8;28577:5;28573:2;28569:14;28548:35;;28496:94;;;:::o;28596:::-;28635:7;28664:20;28678:5;28664:20;:::i;:::-;28653:31;;28596:94;;;:::o;28696:100::-;28735:7;28764:26;28784:5;28764:26;:::i;:::-;28753:37;;28696:100;;;:::o;28802:157::-;28907:45;28927:24;28945:5;28927:24;:::i;:::-;28907:45;:::i;:::-;28902:3;28895:58;28802:157;;:::o;28965:256::-;29077:3;29092:75;29163:3;29154:6;29092:75;:::i;:::-;29192:2;29187:3;29183:12;29176:19;;29212:3;29205:10;;28965:256;;;;:::o;29227:173::-;29367:25;29363:1;29355:6;29351:14;29344:49;29227:173;:::o;29406:366::-;29548:3;29569:67;29633:2;29628:3;29569:67;:::i;:::-;29562:74;;29645:93;29734:3;29645:93;:::i;:::-;29763:2;29758:3;29754:12;29747:19;;29406:366;;;:::o;29778:419::-;29944:4;29982:2;29971:9;29967:18;29959:26;;30031:9;30025:4;30021:20;30017:1;30006:9;30002:17;29995:47;30059:131;30185:4;30059:131;:::i;:::-;30051:139;;29778:419;;;:::o;30203:225::-;30343:34;30339:1;30331:6;30327:14;30320:58;30412:8;30407:2;30399:6;30395:15;30388:33;30203:225;:::o;30434:366::-;30576:3;30597:67;30661:2;30656:3;30597:67;:::i;:::-;30590:74;;30673:93;30762:3;30673:93;:::i;:::-;30791:2;30786:3;30782:12;30775:19;;30434:366;;;:::o;30806:419::-;30972:4;31010:2;30999:9;30995:18;30987:26;;31059:9;31053:4;31049:20;31045:1;31034:9;31030:17;31023:47;31087:131;31213:4;31087:131;:::i;:::-;31079:139;;30806:419;;;:::o;31231:98::-;31282:6;31316:5;31310:12;31300:22;;31231:98;;;:::o;31335:168::-;31418:11;31452:6;31447:3;31440:19;31492:4;31487:3;31483:14;31468:29;;31335:168;;;;:::o;31509:360::-;31595:3;31623:38;31655:5;31623:38;:::i;:::-;31677:70;31740:6;31735:3;31677:70;:::i;:::-;31670:77;;31756:52;31801:6;31796:3;31789:4;31782:5;31778:16;31756:52;:::i;:::-;31833:29;31855:6;31833:29;:::i;:::-;31828:3;31824:39;31817:46;;31599:270;31509:360;;;;:::o;31875:640::-;32070:4;32108:3;32097:9;32093:19;32085:27;;32122:71;32190:1;32179:9;32175:17;32166:6;32122:71;:::i;:::-;32203:72;32271:2;32260:9;32256:18;32247:6;32203:72;:::i;:::-;32285;32353:2;32342:9;32338:18;32329:6;32285:72;:::i;:::-;32404:9;32398:4;32394:20;32389:2;32378:9;32374:18;32367:48;32432:76;32503:4;32494:6;32432:76;:::i;:::-;32424:84;;31875:640;;;;;;;:::o;32521:141::-;32577:5;32608:6;32602:13;32593:22;;32624:32;32650:5;32624:32;:::i;:::-;32521:141;;;;:::o;32668:349::-;32737:6;32786:2;32774:9;32765:7;32761:23;32757:32;32754:119;;;32792:79;;:::i;:::-;32754:119;32912:1;32937:63;32992:7;32983:6;32972:9;32968:22;32937:63;:::i;:::-;32927:73;;32883:127;32668:349;;;;:::o;33023:233::-;33062:3;33085:24;33103:5;33085:24;:::i;:::-;33076:33;;33131:66;33124:5;33121:77;33118:103;;33201:18;;:::i;:::-;33118:103;33248:1;33241:5;33237:13;33230:20;;33023:233;;;:::o;33262:180::-;33310:77;33307:1;33300:88;33407:4;33404:1;33397:15;33431:4;33428:1;33421:15;33448:185;33488:1;33505:20;33523:1;33505:20;:::i;:::-;33500:25;;33539:20;33557:1;33539:20;:::i;:::-;33534:25;;33578:1;33568:35;;33583:18;;:::i;:::-;33568:35;33625:1;33622;33618:9;33613:14;;33448:185;;;;:::o;33639:191::-;33679:4;33699:20;33717:1;33699:20;:::i;:::-;33694:25;;33733:20;33751:1;33733:20;:::i;:::-;33728:25;;33772:1;33769;33766:8;33763:34;;;33777:18;;:::i;:::-;33763:34;33822:1;33819;33815:9;33807:17;;33639:191;;;;:::o;33836:176::-;33868:1;33885:20;33903:1;33885:20;:::i;:::-;33880:25;;33919:20;33937:1;33919:20;:::i;:::-;33914:25;;33958:1;33948:35;;33963:18;;:::i;:::-;33948:35;34004:1;34001;33997:9;33992:14;;33836:176;;;;:::o;34018:180::-;34066:77;34063:1;34056:88;34163:4;34160:1;34153:15;34187:4;34184:1;34177:15

Swarm Source

ipfs://17f269fffdf46e3848371d38e28557bbeac8daae722d22de8c6d36452e3f8e5c
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.