ETH Price: $3,338.55 (-1.08%)

TrendDAO Genesis Pass (TDP)
 

Overview

TokenID

125

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
TrendDAOGenesisPass

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-11-25
*/

// SPDX-License-Identifier: MIT

// Creator: Chiru Labs

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


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

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

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


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

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

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

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

/**
 * @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)
        }
    }
}

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

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(),".json")) : '';
    }

    /**
     * @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 {}
}

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

contract TrendDAOGenesisPass is ERC721A, Ownable, ReentrancyGuard {
    address public vault;
    bytes32 public merkleRoot;
    bytes32 public merkleRootTeam;
    string public baseTokenURI;
    uint public price;
    uint public status;

    constructor(uint _price, address _vault) ERC721A("TrendDAO Genesis Pass", "TDP") {
        setPrice(_price);
        setVault(_vault);
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return baseTokenURI;
    }

    function setBaseTokenURI(string calldata _baseTokenURI) external onlyOwner {
        baseTokenURI = _baseTokenURI;
    }

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

    function setPrice(uint _price) public onlyOwner {
        price = _price;
    }

    function setStatus(uint _status) external onlyOwner {
        status = _status;
    }

    function setVault(address _vault) public onlyOwner {
        vault = _vault;
    }

    function teamMint(bytes32[] calldata _merkleProof) external nonReentrant payable {
        
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));

        require(status == 1, 'Not Active');
        require(tx.origin == msg.sender, 'Contract Denied');
        require(_totalMinted() + 1 < 667, 'Supply Denied');
        require(!(_numberMinted(msg.sender) > 0), 'Mint Claimed');
        require(MerkleProof.verify(_merkleProof, merkleRootTeam, leaf), 'Not Whitelist');

        _safeMint(msg.sender, 1);
    }

    function whitelist(bytes32[] calldata _merkleProof) external nonReentrant payable {
        
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));

        require(status == 1, 'Not Active');
        require(tx.origin == msg.sender, 'Contract Denied');
        require(_totalMinted() + 1 < 667, 'Supply Denied');
        require(!(_numberMinted(msg.sender) > 0), 'Mint Claimed');
        require(msg.value >= price * 1, 'Ether Amount Denied');
        require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), 'Not Whitelist');

        _safeMint(msg.sender, 1);
    }

    function mint() external nonReentrant payable {
        require(status == 2, 'Not Active');
        require(tx.origin == msg.sender, 'Contract Denied');
        require(_totalMinted() + 1 < 667, 'Supply Denied');
        require(!(_numberMinted(msg.sender) > 0), 'Mint Claimed');
        require(msg.value >= price * 1, 'Ether Amount Denied');

        _safeMint(msg.sender, 1);
    }

    function withdraw() external nonReentrant payable onlyOwner {
        payable(vault).transfer(address(this).balance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"address","name":"_vault","type":"address"}],"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"},{"inputs":[],"name":"URIQueryForNonexistentToken","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":"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":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRootTeam","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","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":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"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":"_baseTokenURI","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRootTeam","type":"bytes32"}],"name":"setMerkleRootTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_status","type":"uint256"}],"name":"setStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"setVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"status","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"teamMint","outputs":[],"stateMutability":"payable","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":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"whitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040523480156200001157600080fd5b5060405162004ad838038062004ad883398181016040528101906200003791906200043f565b6040518060400160405280601581526020017f5472656e6444414f2047656e65736973205061737300000000000000000000008152506040518060400160405280600381526020017f54445000000000000000000000000000000000000000000000000000000000008152508160029081620000b49190620006f6565b508060039081620000c69190620006f6565b50620000d76200013160201b60201c565b6000819055505050620000ff620000f36200013660201b60201c565b6200013e60201b60201c565b600160098190555062000118826200020460201b60201c565b62000129816200029d60201b60201c565b505062000860565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002146200013660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200023a6200037060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000293576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200028a906200083e565b60405180910390fd5b80600e8190555050565b620002ad6200013660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002d36200037060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200032c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000323906200083e565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080fd5b6000819050919050565b620003b4816200039f565b8114620003c057600080fd5b50565b600081519050620003d481620003a9565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200040782620003da565b9050919050565b6200041981620003fa565b81146200042557600080fd5b50565b60008151905062000439816200040e565b92915050565b600080604083850312156200045957620004586200039a565b5b60006200046985828601620003c3565b92505060206200047c8582860162000428565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200050857607f821691505b6020821081036200051e576200051d620004c0565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000549565b62000594868362000549565b95508019841693508086168417925050509392505050565b6000819050919050565b6000620005d7620005d1620005cb846200039f565b620005ac565b6200039f565b9050919050565b6000819050919050565b620005f383620005b6565b6200060b6200060282620005de565b84845462000556565b825550505050565b600090565b6200062262000613565b6200062f818484620005e8565b505050565b5b8181101562000657576200064b60008262000618565b60018101905062000635565b5050565b601f821115620006a657620006708162000524565b6200067b8462000539565b810160208510156200068b578190505b620006a36200069a8562000539565b83018262000634565b50505b505050565b600082821c905092915050565b6000620006cb60001984600802620006ab565b1980831691505092915050565b6000620006e68383620006b8565b9150826002028217905092915050565b620007018262000486565b67ffffffffffffffff8111156200071d576200071c62000491565b5b620007298254620004ef565b620007368282856200065b565b600060209050601f8311600181146200076e576000841562000759578287015190505b620007658582620006d8565b865550620007d5565b601f1984166200077e8662000524565b60005b82811015620007a85784890151825560018201915060208501945060208101905062000781565b86831015620007c85784890151620007c4601f891682620006b8565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000826602083620007dd565b91506200083382620007ee565b602082019050919050565b60006020820190508181036000830152620008598162000817565b9050919050565b61426880620008706000396000f3fe6080604052600436106101ee5760003560e01c806369ba1a751161010d578063a035b1fe116100a0578063cb30bc2e1161006f578063cb30bc2e14610686578063d547cfb7146106a2578063e985e9c5146106cd578063f2fde38b1461070a578063fbfa77cf14610733576101ee565b8063a035b1fe146105cc578063a22cb465146105f7578063b88d4fde14610620578063c87b56dd14610649576101ee565b80638da5cb5b116100dc5780638da5cb5b146105225780638e7717311461054d57806391b7f5ed1461057857806395d89b41146105a1576101ee565b806369ba1a751461047c57806370a08231146104a5578063715018a6146104e25780637cb64759146104f9576101ee565b80632920bbb2116101855780633ccfd60b116101545780633ccfd60b146103e357806342842e0e146103ed5780636352211e146104165780636817031b14610453576101ee565b80632920bbb21461034a5780632eb4a7ab1461037357806330176e131461039e5780633b9f8383146103c7576101ee565b80631249c58b116101c15780631249c58b146102c157806318160ddd146102cb578063200d2ed2146102f657806323b872dd14610321576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190613050565b61075e565b6040516102279190613098565b60405180910390f35b34801561023c57600080fd5b50610245610840565b6040516102529190613143565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d919061319b565b6108d2565b60405161028f9190613209565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba9190613250565b61094e565b005b6102c9610a58565b005b3480156102d757600080fd5b506102e0610c61565b6040516102ed919061329f565b60405180910390f35b34801561030257600080fd5b5061030b610c78565b604051610318919061329f565b60405180910390f35b34801561032d57600080fd5b50610348600480360381019061034391906132ba565b610c7e565b005b34801561035657600080fd5b50610371600480360381019061036c9190613343565b610c8e565b005b34801561037f57600080fd5b50610388610d14565b604051610395919061337f565b60405180910390f35b3480156103aa57600080fd5b506103c560048036038101906103c091906133ff565b610d1a565b005b6103e160048036038101906103dc91906134a2565b610dac565b005b6103eb611070565b005b3480156103f957600080fd5b50610414600480360381019061040f91906132ba565b6111ac565b005b34801561042257600080fd5b5061043d6004803603810190610438919061319b565b6111cc565b60405161044a9190613209565b60405180910390f35b34801561045f57600080fd5b5061047a600480360381019061047591906134ef565b6111e2565b005b34801561048857600080fd5b506104a3600480360381019061049e919061319b565b6112a2565b005b3480156104b157600080fd5b506104cc60048036038101906104c791906134ef565b611328565b6040516104d9919061329f565b60405180910390f35b3480156104ee57600080fd5b506104f76113f7565b005b34801561050557600080fd5b50610520600480360381019061051b9190613343565b61147f565b005b34801561052e57600080fd5b50610537611505565b6040516105449190613209565b60405180910390f35b34801561055957600080fd5b5061056261152f565b60405161056f919061337f565b60405180910390f35b34801561058457600080fd5b5061059f600480360381019061059a919061319b565b611535565b005b3480156105ad57600080fd5b506105b66115bb565b6040516105c39190613143565b60405180910390f35b3480156105d857600080fd5b506105e161164d565b6040516105ee919061329f565b60405180910390f35b34801561060357600080fd5b5061061e60048036038101906106199190613548565b611653565b005b34801561062c57600080fd5b50610647600480360381019061064291906136b8565b6117ca565b005b34801561065557600080fd5b50610670600480360381019061066b919061319b565b611846565b60405161067d9190613143565b60405180910390f35b6106a0600480360381019061069b91906134a2565b6118e4565b005b3480156106ae57600080fd5b506106b7611b57565b6040516106c49190613143565b60405180910390f35b3480156106d957600080fd5b506106f460048036038101906106ef919061373b565b611be5565b6040516107019190613098565b60405180910390f35b34801561071657600080fd5b50610731600480360381019061072c91906134ef565b611c79565b005b34801561073f57600080fd5b50610748611d70565b6040516107559190613209565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061082957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610839575061083882611d96565b5b9050919050565b60606002805461084f906137aa565b80601f016020809104026020016040519081016040528092919081815260200182805461087b906137aa565b80156108c85780601f1061089d576101008083540402835291602001916108c8565b820191906000526020600020905b8154815290600101906020018083116108ab57829003601f168201915b5050505050905090565b60006108dd82611e00565b610913576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610959826111cc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036109c0576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109df611e4e565b73ffffffffffffffffffffffffffffffffffffffff1614158015610a115750610a0f81610a0a611e4e565b611be5565b155b15610a48576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a53838383611e56565b505050565b600260095403610a9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9490613827565b60405180910390fd5b60026009819055506002600f5414610aea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae190613893565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4f906138ff565b60405180910390fd5b61029b6001610b65611f08565b610b6f919061394e565b10610baf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba6906139ce565b60405180910390fd5b6000610bba33611f1b565b1115610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf290613a3a565b60405180910390fd5b6001600e54610c0a9190613a5a565b341015610c4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4390613ae8565b60405180910390fd5b610c57336001611f85565b6001600981905550565b6000610c6b611fa3565b6001546000540303905090565b600f5481565b610c89838383611fa8565b505050565b610c96611e4e565b73ffffffffffffffffffffffffffffffffffffffff16610cb4611505565b73ffffffffffffffffffffffffffffffffffffffff1614610d0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0190613b54565b60405180910390fd5b80600c8190555050565b600b5481565b610d22611e4e565b73ffffffffffffffffffffffffffffffffffffffff16610d40611505565b73ffffffffffffffffffffffffffffffffffffffff1614610d96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8d90613b54565b60405180910390fd5b8181600d9182610da7929190613d2b565b505050565b600260095403610df1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de890613827565b60405180910390fd5b6002600981905550600033604051602001610e0c9190613e43565b6040516020818303038152906040528051906020012090506001600f5414610e69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6090613893565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ece906138ff565b60405180910390fd5b61029b6001610ee4611f08565b610eee919061394e565b10610f2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f25906139ce565b60405180910390fd5b6000610f3933611f1b565b1115610f7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7190613a3a565b60405180910390fd5b6001600e54610f899190613a5a565b341015610fcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc290613ae8565b60405180910390fd5b611019838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600b548361245c565b611058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104f90613eaa565b60405180910390fd5b611063336001611f85565b5060016009819055505050565b6002600954036110b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ac90613827565b60405180910390fd5b60026009819055506110c5611e4e565b73ffffffffffffffffffffffffffffffffffffffff166110e3611505565b73ffffffffffffffffffffffffffffffffffffffff1614611139576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113090613b54565b60405180910390fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156111a1573d6000803e3d6000fd5b506001600981905550565b6111c7838383604051806020016040528060008152506117ca565b505050565b60006111d782612473565b600001519050919050565b6111ea611e4e565b73ffffffffffffffffffffffffffffffffffffffff16611208611505565b73ffffffffffffffffffffffffffffffffffffffff161461125e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125590613b54565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6112aa611e4e565b73ffffffffffffffffffffffffffffffffffffffff166112c8611505565b73ffffffffffffffffffffffffffffffffffffffff161461131e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131590613b54565b60405180910390fd5b80600f8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361138f576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6113ff611e4e565b73ffffffffffffffffffffffffffffffffffffffff1661141d611505565b73ffffffffffffffffffffffffffffffffffffffff1614611473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146a90613b54565b60405180910390fd5b61147d6000612702565b565b611487611e4e565b73ffffffffffffffffffffffffffffffffffffffff166114a5611505565b73ffffffffffffffffffffffffffffffffffffffff16146114fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f290613b54565b60405180910390fd5b80600b8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600c5481565b61153d611e4e565b73ffffffffffffffffffffffffffffffffffffffff1661155b611505565b73ffffffffffffffffffffffffffffffffffffffff16146115b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a890613b54565b60405180910390fd5b80600e8190555050565b6060600380546115ca906137aa565b80601f01602080910402602001604051908101604052809291908181526020018280546115f6906137aa565b80156116435780601f1061161857610100808354040283529160200191611643565b820191906000526020600020905b81548152906001019060200180831161162657829003601f168201915b5050505050905090565b600e5481565b61165b611e4e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116bf576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006116cc611e4e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611779611e4e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117be9190613098565b60405180910390a35050565b6117d5848484611fa8565b6117f48373ffffffffffffffffffffffffffffffffffffffff166127c8565b80156118095750611807848484846127eb565b155b15611840576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061185182611e00565b611887576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061189161293b565b905060008151036118b157604051806020016040528060008152506118dc565b806118bb846129cd565b6040516020016118cc929190613f52565b6040516020818303038152906040525b915050919050565b600260095403611929576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192090613827565b60405180910390fd5b60026009819055506000336040516020016119449190613e43565b6040516020818303038152906040528051906020012090506001600f54146119a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199890613893565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611a0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a06906138ff565b60405180910390fd5b61029b6001611a1c611f08565b611a26919061394e565b10611a66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5d906139ce565b60405180910390fd5b6000611a7133611f1b565b1115611ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa990613a3a565b60405180910390fd5b611b00838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600c548361245c565b611b3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3690613eaa565b60405180910390fd5b611b4a336001611f85565b5060016009819055505050565b600d8054611b64906137aa565b80601f0160208091040260200160405190810160405280929190818152602001828054611b90906137aa565b8015611bdd5780601f10611bb257610100808354040283529160200191611bdd565b820191906000526020600020905b815481529060010190602001808311611bc057829003601f168201915b505050505081565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c81611e4e565b73ffffffffffffffffffffffffffffffffffffffff16611c9f611505565b73ffffffffffffffffffffffffffffffffffffffff1614611cf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cec90613b54565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5b90613ff3565b60405180910390fd5b611d6d81612702565b50565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611e0b611fa3565b11158015611e1a575060005482105b8015611e47575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611f12611fa3565b60005403905090565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611f9f828260405180602001604052806000815250612b2d565b5050565b600090565b6000611fb382612473565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461201e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661203f611e4e565b73ffffffffffffffffffffffffffffffffffffffff16148061206e575061206d85612068611e4e565b611be5565b5b806120b3575061207c611e4e565b73ffffffffffffffffffffffffffffffffffffffff1661209b846108d2565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806120ec576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612152576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61215f8585856001612b3f565b61216b60008487611e56565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036123ea5760005482146123e957878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124558585856001612b45565b5050505050565b6000826124698584612b4b565b1490509392505050565b61247b612fa1565b600082905080612489611fa3565b11158015612498575060005481105b156126cb576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516126c957600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146125ad5780925050506126fd565b5b6001156126c857818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146126c35780925050506126fd565b6125ae565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612811611e4e565b8786866040518563ffffffff1660e01b81526004016128339493929190614068565b6020604051808303816000875af192505050801561286f57506040513d601f19601f8201168201806040525081019061286c91906140c9565b60015b6128e8573d806000811461289f576040519150601f19603f3d011682016040523d82523d6000602084013e6128a4565b606091505b5060008151036128e0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600d805461294a906137aa565b80601f0160208091040260200160405190810160405280929190818152602001828054612976906137aa565b80156129c35780601f10612998576101008083540402835291602001916129c3565b820191906000526020600020905b8154815290600101906020018083116129a657829003601f168201915b5050505050905090565b606060008203612a14576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b28565b600082905060005b60008214612a46578080612a2f906140f6565b915050600a82612a3f919061416d565b9150612a1c565b60008167ffffffffffffffff811115612a6257612a6161358d565b5b6040519080825280601f01601f191660200182016040528015612a945781602001600182028036833780820191505090505b5090505b60008514612b2157600182612aad919061419e565b9150600a85612abc91906141d2565b6030612ac8919061394e565b60f81b818381518110612ade57612add614203565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b1a919061416d565b9450612a98565b8093505050505b919050565b612b3a8383836001612bc0565b505050565b50505050565b50505050565b60008082905060005b8451811015612bb5576000858281518110612b7257612b71614203565b5b60200260200101519050808311612b9457612b8d8382612f8a565b9250612ba1565b612b9e8184612f8a565b92505b508080612bad906140f6565b915050612b54565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612c2c576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403612c66576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c736000868387612b3f565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612e3d5750612e3c8773ffffffffffffffffffffffffffffffffffffffff166127c8565b5b15612f02575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612eb260008884806001019550886127eb565b612ee8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808203612e43578260005414612efd57600080fd5b612f6d565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203612f03575b816000819055505050612f836000868387612b45565b5050505050565b600082600052816020526040600020905092915050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61302d81612ff8565b811461303857600080fd5b50565b60008135905061304a81613024565b92915050565b60006020828403121561306657613065612fee565b5b60006130748482850161303b565b91505092915050565b60008115159050919050565b6130928161307d565b82525050565b60006020820190506130ad6000830184613089565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156130ed5780820151818401526020810190506130d2565b60008484015250505050565b6000601f19601f8301169050919050565b6000613115826130b3565b61311f81856130be565b935061312f8185602086016130cf565b613138816130f9565b840191505092915050565b6000602082019050818103600083015261315d818461310a565b905092915050565b6000819050919050565b61317881613165565b811461318357600080fd5b50565b6000813590506131958161316f565b92915050565b6000602082840312156131b1576131b0612fee565b5b60006131bf84828501613186565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006131f3826131c8565b9050919050565b613203816131e8565b82525050565b600060208201905061321e60008301846131fa565b92915050565b61322d816131e8565b811461323857600080fd5b50565b60008135905061324a81613224565b92915050565b6000806040838503121561326757613266612fee565b5b60006132758582860161323b565b925050602061328685828601613186565b9150509250929050565b61329981613165565b82525050565b60006020820190506132b46000830184613290565b92915050565b6000806000606084860312156132d3576132d2612fee565b5b60006132e18682870161323b565b93505060206132f28682870161323b565b925050604061330386828701613186565b9150509250925092565b6000819050919050565b6133208161330d565b811461332b57600080fd5b50565b60008135905061333d81613317565b92915050565b60006020828403121561335957613358612fee565b5b60006133678482850161332e565b91505092915050565b6133798161330d565b82525050565b60006020820190506133946000830184613370565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126133bf576133be61339a565b5b8235905067ffffffffffffffff8111156133dc576133db61339f565b5b6020830191508360018202830111156133f8576133f76133a4565b5b9250929050565b6000806020838503121561341657613415612fee565b5b600083013567ffffffffffffffff81111561343457613433612ff3565b5b613440858286016133a9565b92509250509250929050565b60008083601f8401126134625761346161339a565b5b8235905067ffffffffffffffff81111561347f5761347e61339f565b5b60208301915083602082028301111561349b5761349a6133a4565b5b9250929050565b600080602083850312156134b9576134b8612fee565b5b600083013567ffffffffffffffff8111156134d7576134d6612ff3565b5b6134e38582860161344c565b92509250509250929050565b60006020828403121561350557613504612fee565b5b60006135138482850161323b565b91505092915050565b6135258161307d565b811461353057600080fd5b50565b6000813590506135428161351c565b92915050565b6000806040838503121561355f5761355e612fee565b5b600061356d8582860161323b565b925050602061357e85828601613533565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6135c5826130f9565b810181811067ffffffffffffffff821117156135e4576135e361358d565b5b80604052505050565b60006135f7612fe4565b905061360382826135bc565b919050565b600067ffffffffffffffff8211156136235761362261358d565b5b61362c826130f9565b9050602081019050919050565b82818337600083830152505050565b600061365b61365684613608565b6135ed565b90508281526020810184848401111561367757613676613588565b5b613682848285613639565b509392505050565b600082601f83011261369f5761369e61339a565b5b81356136af848260208601613648565b91505092915050565b600080600080608085870312156136d2576136d1612fee565b5b60006136e08782880161323b565b94505060206136f18782880161323b565b935050604061370287828801613186565b925050606085013567ffffffffffffffff81111561372357613722612ff3565b5b61372f8782880161368a565b91505092959194509250565b6000806040838503121561375257613751612fee565b5b60006137608582860161323b565b92505060206137718582860161323b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806137c257607f821691505b6020821081036137d5576137d461377b565b5b50919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613811601f836130be565b915061381c826137db565b602082019050919050565b6000602082019050818103600083015261384081613804565b9050919050565b7f4e6f742041637469766500000000000000000000000000000000000000000000600082015250565b600061387d600a836130be565b915061388882613847565b602082019050919050565b600060208201905081810360008301526138ac81613870565b9050919050565b7f436f6e74726163742044656e6965640000000000000000000000000000000000600082015250565b60006138e9600f836130be565b91506138f4826138b3565b602082019050919050565b60006020820190508181036000830152613918816138dc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061395982613165565b915061396483613165565b925082820190508082111561397c5761397b61391f565b5b92915050565b7f537570706c792044656e69656400000000000000000000000000000000000000600082015250565b60006139b8600d836130be565b91506139c382613982565b602082019050919050565b600060208201905081810360008301526139e7816139ab565b9050919050565b7f4d696e7420436c61696d65640000000000000000000000000000000000000000600082015250565b6000613a24600c836130be565b9150613a2f826139ee565b602082019050919050565b60006020820190508181036000830152613a5381613a17565b9050919050565b6000613a6582613165565b9150613a7083613165565b9250828202613a7e81613165565b91508282048414831517613a9557613a9461391f565b5b5092915050565b7f457468657220416d6f756e742044656e69656400000000000000000000000000600082015250565b6000613ad26013836130be565b9150613add82613a9c565b602082019050919050565b60006020820190508181036000830152613b0181613ac5565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613b3e6020836130be565b9150613b4982613b08565b602082019050919050565b60006020820190508181036000830152613b6d81613b31565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613be17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613ba4565b613beb8683613ba4565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613c28613c23613c1e84613165565b613c03565b613165565b9050919050565b6000819050919050565b613c4283613c0d565b613c56613c4e82613c2f565b848454613bb1565b825550505050565b600090565b613c6b613c5e565b613c76818484613c39565b505050565b5b81811015613c9a57613c8f600082613c63565b600181019050613c7c565b5050565b601f821115613cdf57613cb081613b7f565b613cb984613b94565b81016020851015613cc8578190505b613cdc613cd485613b94565b830182613c7b565b50505b505050565b600082821c905092915050565b6000613d0260001984600802613ce4565b1980831691505092915050565b6000613d1b8383613cf1565b9150826002028217905092915050565b613d358383613b74565b67ffffffffffffffff811115613d4e57613d4d61358d565b5b613d5882546137aa565b613d63828285613c9e565b6000601f831160018114613d925760008415613d80578287013590505b613d8a8582613d0f565b865550613df2565b601f198416613da086613b7f565b60005b82811015613dc857848901358255600182019150602085019450602081019050613da3565b86831015613de55784890135613de1601f891682613cf1565b8355505b6001600288020188555050505b50505050505050565b60008160601b9050919050565b6000613e1382613dfb565b9050919050565b6000613e2582613e08565b9050919050565b613e3d613e38826131e8565b613e1a565b82525050565b6000613e4f8284613e2c565b60148201915081905092915050565b7f4e6f742057686974656c69737400000000000000000000000000000000000000600082015250565b6000613e94600d836130be565b9150613e9f82613e5e565b602082019050919050565b60006020820190508181036000830152613ec381613e87565b9050919050565b600081905092915050565b6000613ee0826130b3565b613eea8185613eca565b9350613efa8185602086016130cf565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613f3c600583613eca565b9150613f4782613f06565b600582019050919050565b6000613f5e8285613ed5565b9150613f6a8284613ed5565b9150613f7582613f2f565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613fdd6026836130be565b9150613fe882613f81565b604082019050919050565b6000602082019050818103600083015261400c81613fd0565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061403a82614013565b614044818561401e565b93506140548185602086016130cf565b61405d816130f9565b840191505092915050565b600060808201905061407d60008301876131fa565b61408a60208301866131fa565b6140976040830185613290565b81810360608301526140a9818461402f565b905095945050505050565b6000815190506140c381613024565b92915050565b6000602082840312156140df576140de612fee565b5b60006140ed848285016140b4565b91505092915050565b600061410182613165565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036141335761413261391f565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061417882613165565b915061418383613165565b9250826141935761419261413e565b5b828204905092915050565b60006141a982613165565b91506141b483613165565b92508282039050818111156141cc576141cb61391f565b5b92915050565b60006141dd82613165565b91506141e883613165565b9250826141f8576141f761413e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220ac702094c09142e0f7d34575783e7cce24671f5c5ab27cc27c1f51069a510b0f64736f6c6343000811003300000000000000000000000000000000000000000000000000670758aa7c8000000000000000000000000000905587583ab9a31bae59c9aee25e34cfe4749357

Deployed Bytecode

0x6080604052600436106101ee5760003560e01c806369ba1a751161010d578063a035b1fe116100a0578063cb30bc2e1161006f578063cb30bc2e14610686578063d547cfb7146106a2578063e985e9c5146106cd578063f2fde38b1461070a578063fbfa77cf14610733576101ee565b8063a035b1fe146105cc578063a22cb465146105f7578063b88d4fde14610620578063c87b56dd14610649576101ee565b80638da5cb5b116100dc5780638da5cb5b146105225780638e7717311461054d57806391b7f5ed1461057857806395d89b41146105a1576101ee565b806369ba1a751461047c57806370a08231146104a5578063715018a6146104e25780637cb64759146104f9576101ee565b80632920bbb2116101855780633ccfd60b116101545780633ccfd60b146103e357806342842e0e146103ed5780636352211e146104165780636817031b14610453576101ee565b80632920bbb21461034a5780632eb4a7ab1461037357806330176e131461039e5780633b9f8383146103c7576101ee565b80631249c58b116101c15780631249c58b146102c157806318160ddd146102cb578063200d2ed2146102f657806323b872dd14610321576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190613050565b61075e565b6040516102279190613098565b60405180910390f35b34801561023c57600080fd5b50610245610840565b6040516102529190613143565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d919061319b565b6108d2565b60405161028f9190613209565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba9190613250565b61094e565b005b6102c9610a58565b005b3480156102d757600080fd5b506102e0610c61565b6040516102ed919061329f565b60405180910390f35b34801561030257600080fd5b5061030b610c78565b604051610318919061329f565b60405180910390f35b34801561032d57600080fd5b50610348600480360381019061034391906132ba565b610c7e565b005b34801561035657600080fd5b50610371600480360381019061036c9190613343565b610c8e565b005b34801561037f57600080fd5b50610388610d14565b604051610395919061337f565b60405180910390f35b3480156103aa57600080fd5b506103c560048036038101906103c091906133ff565b610d1a565b005b6103e160048036038101906103dc91906134a2565b610dac565b005b6103eb611070565b005b3480156103f957600080fd5b50610414600480360381019061040f91906132ba565b6111ac565b005b34801561042257600080fd5b5061043d6004803603810190610438919061319b565b6111cc565b60405161044a9190613209565b60405180910390f35b34801561045f57600080fd5b5061047a600480360381019061047591906134ef565b6111e2565b005b34801561048857600080fd5b506104a3600480360381019061049e919061319b565b6112a2565b005b3480156104b157600080fd5b506104cc60048036038101906104c791906134ef565b611328565b6040516104d9919061329f565b60405180910390f35b3480156104ee57600080fd5b506104f76113f7565b005b34801561050557600080fd5b50610520600480360381019061051b9190613343565b61147f565b005b34801561052e57600080fd5b50610537611505565b6040516105449190613209565b60405180910390f35b34801561055957600080fd5b5061056261152f565b60405161056f919061337f565b60405180910390f35b34801561058457600080fd5b5061059f600480360381019061059a919061319b565b611535565b005b3480156105ad57600080fd5b506105b66115bb565b6040516105c39190613143565b60405180910390f35b3480156105d857600080fd5b506105e161164d565b6040516105ee919061329f565b60405180910390f35b34801561060357600080fd5b5061061e60048036038101906106199190613548565b611653565b005b34801561062c57600080fd5b50610647600480360381019061064291906136b8565b6117ca565b005b34801561065557600080fd5b50610670600480360381019061066b919061319b565b611846565b60405161067d9190613143565b60405180910390f35b6106a0600480360381019061069b91906134a2565b6118e4565b005b3480156106ae57600080fd5b506106b7611b57565b6040516106c49190613143565b60405180910390f35b3480156106d957600080fd5b506106f460048036038101906106ef919061373b565b611be5565b6040516107019190613098565b60405180910390f35b34801561071657600080fd5b50610731600480360381019061072c91906134ef565b611c79565b005b34801561073f57600080fd5b50610748611d70565b6040516107559190613209565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061082957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610839575061083882611d96565b5b9050919050565b60606002805461084f906137aa565b80601f016020809104026020016040519081016040528092919081815260200182805461087b906137aa565b80156108c85780601f1061089d576101008083540402835291602001916108c8565b820191906000526020600020905b8154815290600101906020018083116108ab57829003601f168201915b5050505050905090565b60006108dd82611e00565b610913576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610959826111cc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036109c0576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109df611e4e565b73ffffffffffffffffffffffffffffffffffffffff1614158015610a115750610a0f81610a0a611e4e565b611be5565b155b15610a48576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a53838383611e56565b505050565b600260095403610a9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9490613827565b60405180910390fd5b60026009819055506002600f5414610aea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae190613893565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4f906138ff565b60405180910390fd5b61029b6001610b65611f08565b610b6f919061394e565b10610baf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba6906139ce565b60405180910390fd5b6000610bba33611f1b565b1115610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf290613a3a565b60405180910390fd5b6001600e54610c0a9190613a5a565b341015610c4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4390613ae8565b60405180910390fd5b610c57336001611f85565b6001600981905550565b6000610c6b611fa3565b6001546000540303905090565b600f5481565b610c89838383611fa8565b505050565b610c96611e4e565b73ffffffffffffffffffffffffffffffffffffffff16610cb4611505565b73ffffffffffffffffffffffffffffffffffffffff1614610d0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0190613b54565b60405180910390fd5b80600c8190555050565b600b5481565b610d22611e4e565b73ffffffffffffffffffffffffffffffffffffffff16610d40611505565b73ffffffffffffffffffffffffffffffffffffffff1614610d96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8d90613b54565b60405180910390fd5b8181600d9182610da7929190613d2b565b505050565b600260095403610df1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de890613827565b60405180910390fd5b6002600981905550600033604051602001610e0c9190613e43565b6040516020818303038152906040528051906020012090506001600f5414610e69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6090613893565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ece906138ff565b60405180910390fd5b61029b6001610ee4611f08565b610eee919061394e565b10610f2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f25906139ce565b60405180910390fd5b6000610f3933611f1b565b1115610f7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7190613a3a565b60405180910390fd5b6001600e54610f899190613a5a565b341015610fcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc290613ae8565b60405180910390fd5b611019838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600b548361245c565b611058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104f90613eaa565b60405180910390fd5b611063336001611f85565b5060016009819055505050565b6002600954036110b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ac90613827565b60405180910390fd5b60026009819055506110c5611e4e565b73ffffffffffffffffffffffffffffffffffffffff166110e3611505565b73ffffffffffffffffffffffffffffffffffffffff1614611139576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113090613b54565b60405180910390fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156111a1573d6000803e3d6000fd5b506001600981905550565b6111c7838383604051806020016040528060008152506117ca565b505050565b60006111d782612473565b600001519050919050565b6111ea611e4e565b73ffffffffffffffffffffffffffffffffffffffff16611208611505565b73ffffffffffffffffffffffffffffffffffffffff161461125e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125590613b54565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6112aa611e4e565b73ffffffffffffffffffffffffffffffffffffffff166112c8611505565b73ffffffffffffffffffffffffffffffffffffffff161461131e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131590613b54565b60405180910390fd5b80600f8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361138f576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6113ff611e4e565b73ffffffffffffffffffffffffffffffffffffffff1661141d611505565b73ffffffffffffffffffffffffffffffffffffffff1614611473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146a90613b54565b60405180910390fd5b61147d6000612702565b565b611487611e4e565b73ffffffffffffffffffffffffffffffffffffffff166114a5611505565b73ffffffffffffffffffffffffffffffffffffffff16146114fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f290613b54565b60405180910390fd5b80600b8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600c5481565b61153d611e4e565b73ffffffffffffffffffffffffffffffffffffffff1661155b611505565b73ffffffffffffffffffffffffffffffffffffffff16146115b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a890613b54565b60405180910390fd5b80600e8190555050565b6060600380546115ca906137aa565b80601f01602080910402602001604051908101604052809291908181526020018280546115f6906137aa565b80156116435780601f1061161857610100808354040283529160200191611643565b820191906000526020600020905b81548152906001019060200180831161162657829003601f168201915b5050505050905090565b600e5481565b61165b611e4e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116bf576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006116cc611e4e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611779611e4e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117be9190613098565b60405180910390a35050565b6117d5848484611fa8565b6117f48373ffffffffffffffffffffffffffffffffffffffff166127c8565b80156118095750611807848484846127eb565b155b15611840576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061185182611e00565b611887576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061189161293b565b905060008151036118b157604051806020016040528060008152506118dc565b806118bb846129cd565b6040516020016118cc929190613f52565b6040516020818303038152906040525b915050919050565b600260095403611929576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192090613827565b60405180910390fd5b60026009819055506000336040516020016119449190613e43565b6040516020818303038152906040528051906020012090506001600f54146119a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199890613893565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611a0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a06906138ff565b60405180910390fd5b61029b6001611a1c611f08565b611a26919061394e565b10611a66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5d906139ce565b60405180910390fd5b6000611a7133611f1b565b1115611ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa990613a3a565b60405180910390fd5b611b00838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600c548361245c565b611b3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3690613eaa565b60405180910390fd5b611b4a336001611f85565b5060016009819055505050565b600d8054611b64906137aa565b80601f0160208091040260200160405190810160405280929190818152602001828054611b90906137aa565b8015611bdd5780601f10611bb257610100808354040283529160200191611bdd565b820191906000526020600020905b815481529060010190602001808311611bc057829003601f168201915b505050505081565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c81611e4e565b73ffffffffffffffffffffffffffffffffffffffff16611c9f611505565b73ffffffffffffffffffffffffffffffffffffffff1614611cf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cec90613b54565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5b90613ff3565b60405180910390fd5b611d6d81612702565b50565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611e0b611fa3565b11158015611e1a575060005482105b8015611e47575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611f12611fa3565b60005403905090565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611f9f828260405180602001604052806000815250612b2d565b5050565b600090565b6000611fb382612473565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461201e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661203f611e4e565b73ffffffffffffffffffffffffffffffffffffffff16148061206e575061206d85612068611e4e565b611be5565b5b806120b3575061207c611e4e565b73ffffffffffffffffffffffffffffffffffffffff1661209b846108d2565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806120ec576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612152576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61215f8585856001612b3f565b61216b60008487611e56565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036123ea5760005482146123e957878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124558585856001612b45565b5050505050565b6000826124698584612b4b565b1490509392505050565b61247b612fa1565b600082905080612489611fa3565b11158015612498575060005481105b156126cb576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516126c957600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146125ad5780925050506126fd565b5b6001156126c857818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146126c35780925050506126fd565b6125ae565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612811611e4e565b8786866040518563ffffffff1660e01b81526004016128339493929190614068565b6020604051808303816000875af192505050801561286f57506040513d601f19601f8201168201806040525081019061286c91906140c9565b60015b6128e8573d806000811461289f576040519150601f19603f3d011682016040523d82523d6000602084013e6128a4565b606091505b5060008151036128e0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600d805461294a906137aa565b80601f0160208091040260200160405190810160405280929190818152602001828054612976906137aa565b80156129c35780601f10612998576101008083540402835291602001916129c3565b820191906000526020600020905b8154815290600101906020018083116129a657829003601f168201915b5050505050905090565b606060008203612a14576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b28565b600082905060005b60008214612a46578080612a2f906140f6565b915050600a82612a3f919061416d565b9150612a1c565b60008167ffffffffffffffff811115612a6257612a6161358d565b5b6040519080825280601f01601f191660200182016040528015612a945781602001600182028036833780820191505090505b5090505b60008514612b2157600182612aad919061419e565b9150600a85612abc91906141d2565b6030612ac8919061394e565b60f81b818381518110612ade57612add614203565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b1a919061416d565b9450612a98565b8093505050505b919050565b612b3a8383836001612bc0565b505050565b50505050565b50505050565b60008082905060005b8451811015612bb5576000858281518110612b7257612b71614203565b5b60200260200101519050808311612b9457612b8d8382612f8a565b9250612ba1565b612b9e8184612f8a565b92505b508080612bad906140f6565b915050612b54565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612c2c576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403612c66576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c736000868387612b3f565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612e3d5750612e3c8773ffffffffffffffffffffffffffffffffffffffff166127c8565b5b15612f02575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612eb260008884806001019550886127eb565b612ee8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808203612e43578260005414612efd57600080fd5b612f6d565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203612f03575b816000819055505050612f836000868387612b45565b5050505050565b600082600052816020526040600020905092915050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61302d81612ff8565b811461303857600080fd5b50565b60008135905061304a81613024565b92915050565b60006020828403121561306657613065612fee565b5b60006130748482850161303b565b91505092915050565b60008115159050919050565b6130928161307d565b82525050565b60006020820190506130ad6000830184613089565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156130ed5780820151818401526020810190506130d2565b60008484015250505050565b6000601f19601f8301169050919050565b6000613115826130b3565b61311f81856130be565b935061312f8185602086016130cf565b613138816130f9565b840191505092915050565b6000602082019050818103600083015261315d818461310a565b905092915050565b6000819050919050565b61317881613165565b811461318357600080fd5b50565b6000813590506131958161316f565b92915050565b6000602082840312156131b1576131b0612fee565b5b60006131bf84828501613186565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006131f3826131c8565b9050919050565b613203816131e8565b82525050565b600060208201905061321e60008301846131fa565b92915050565b61322d816131e8565b811461323857600080fd5b50565b60008135905061324a81613224565b92915050565b6000806040838503121561326757613266612fee565b5b60006132758582860161323b565b925050602061328685828601613186565b9150509250929050565b61329981613165565b82525050565b60006020820190506132b46000830184613290565b92915050565b6000806000606084860312156132d3576132d2612fee565b5b60006132e18682870161323b565b93505060206132f28682870161323b565b925050604061330386828701613186565b9150509250925092565b6000819050919050565b6133208161330d565b811461332b57600080fd5b50565b60008135905061333d81613317565b92915050565b60006020828403121561335957613358612fee565b5b60006133678482850161332e565b91505092915050565b6133798161330d565b82525050565b60006020820190506133946000830184613370565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126133bf576133be61339a565b5b8235905067ffffffffffffffff8111156133dc576133db61339f565b5b6020830191508360018202830111156133f8576133f76133a4565b5b9250929050565b6000806020838503121561341657613415612fee565b5b600083013567ffffffffffffffff81111561343457613433612ff3565b5b613440858286016133a9565b92509250509250929050565b60008083601f8401126134625761346161339a565b5b8235905067ffffffffffffffff81111561347f5761347e61339f565b5b60208301915083602082028301111561349b5761349a6133a4565b5b9250929050565b600080602083850312156134b9576134b8612fee565b5b600083013567ffffffffffffffff8111156134d7576134d6612ff3565b5b6134e38582860161344c565b92509250509250929050565b60006020828403121561350557613504612fee565b5b60006135138482850161323b565b91505092915050565b6135258161307d565b811461353057600080fd5b50565b6000813590506135428161351c565b92915050565b6000806040838503121561355f5761355e612fee565b5b600061356d8582860161323b565b925050602061357e85828601613533565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6135c5826130f9565b810181811067ffffffffffffffff821117156135e4576135e361358d565b5b80604052505050565b60006135f7612fe4565b905061360382826135bc565b919050565b600067ffffffffffffffff8211156136235761362261358d565b5b61362c826130f9565b9050602081019050919050565b82818337600083830152505050565b600061365b61365684613608565b6135ed565b90508281526020810184848401111561367757613676613588565b5b613682848285613639565b509392505050565b600082601f83011261369f5761369e61339a565b5b81356136af848260208601613648565b91505092915050565b600080600080608085870312156136d2576136d1612fee565b5b60006136e08782880161323b565b94505060206136f18782880161323b565b935050604061370287828801613186565b925050606085013567ffffffffffffffff81111561372357613722612ff3565b5b61372f8782880161368a565b91505092959194509250565b6000806040838503121561375257613751612fee565b5b60006137608582860161323b565b92505060206137718582860161323b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806137c257607f821691505b6020821081036137d5576137d461377b565b5b50919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613811601f836130be565b915061381c826137db565b602082019050919050565b6000602082019050818103600083015261384081613804565b9050919050565b7f4e6f742041637469766500000000000000000000000000000000000000000000600082015250565b600061387d600a836130be565b915061388882613847565b602082019050919050565b600060208201905081810360008301526138ac81613870565b9050919050565b7f436f6e74726163742044656e6965640000000000000000000000000000000000600082015250565b60006138e9600f836130be565b91506138f4826138b3565b602082019050919050565b60006020820190508181036000830152613918816138dc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061395982613165565b915061396483613165565b925082820190508082111561397c5761397b61391f565b5b92915050565b7f537570706c792044656e69656400000000000000000000000000000000000000600082015250565b60006139b8600d836130be565b91506139c382613982565b602082019050919050565b600060208201905081810360008301526139e7816139ab565b9050919050565b7f4d696e7420436c61696d65640000000000000000000000000000000000000000600082015250565b6000613a24600c836130be565b9150613a2f826139ee565b602082019050919050565b60006020820190508181036000830152613a5381613a17565b9050919050565b6000613a6582613165565b9150613a7083613165565b9250828202613a7e81613165565b91508282048414831517613a9557613a9461391f565b5b5092915050565b7f457468657220416d6f756e742044656e69656400000000000000000000000000600082015250565b6000613ad26013836130be565b9150613add82613a9c565b602082019050919050565b60006020820190508181036000830152613b0181613ac5565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613b3e6020836130be565b9150613b4982613b08565b602082019050919050565b60006020820190508181036000830152613b6d81613b31565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613be17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613ba4565b613beb8683613ba4565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613c28613c23613c1e84613165565b613c03565b613165565b9050919050565b6000819050919050565b613c4283613c0d565b613c56613c4e82613c2f565b848454613bb1565b825550505050565b600090565b613c6b613c5e565b613c76818484613c39565b505050565b5b81811015613c9a57613c8f600082613c63565b600181019050613c7c565b5050565b601f821115613cdf57613cb081613b7f565b613cb984613b94565b81016020851015613cc8578190505b613cdc613cd485613b94565b830182613c7b565b50505b505050565b600082821c905092915050565b6000613d0260001984600802613ce4565b1980831691505092915050565b6000613d1b8383613cf1565b9150826002028217905092915050565b613d358383613b74565b67ffffffffffffffff811115613d4e57613d4d61358d565b5b613d5882546137aa565b613d63828285613c9e565b6000601f831160018114613d925760008415613d80578287013590505b613d8a8582613d0f565b865550613df2565b601f198416613da086613b7f565b60005b82811015613dc857848901358255600182019150602085019450602081019050613da3565b86831015613de55784890135613de1601f891682613cf1565b8355505b6001600288020188555050505b50505050505050565b60008160601b9050919050565b6000613e1382613dfb565b9050919050565b6000613e2582613e08565b9050919050565b613e3d613e38826131e8565b613e1a565b82525050565b6000613e4f8284613e2c565b60148201915081905092915050565b7f4e6f742057686974656c69737400000000000000000000000000000000000000600082015250565b6000613e94600d836130be565b9150613e9f82613e5e565b602082019050919050565b60006020820190508181036000830152613ec381613e87565b9050919050565b600081905092915050565b6000613ee0826130b3565b613eea8185613eca565b9350613efa8185602086016130cf565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613f3c600583613eca565b9150613f4782613f06565b600582019050919050565b6000613f5e8285613ed5565b9150613f6a8284613ed5565b9150613f7582613f2f565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613fdd6026836130be565b9150613fe882613f81565b604082019050919050565b6000602082019050818103600083015261400c81613fd0565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061403a82614013565b614044818561401e565b93506140548185602086016130cf565b61405d816130f9565b840191505092915050565b600060808201905061407d60008301876131fa565b61408a60208301866131fa565b6140976040830185613290565b81810360608301526140a9818461402f565b905095945050505050565b6000815190506140c381613024565b92915050565b6000602082840312156140df576140de612fee565b5b60006140ed848285016140b4565b91505092915050565b600061410182613165565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036141335761413261391f565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061417882613165565b915061418383613165565b9250826141935761419261413e565b5b828204905092915050565b60006141a982613165565b91506141b483613165565b92508282039050818111156141cc576141cb61391f565b5b92915050565b60006141dd82613165565b91506141e883613165565b9250826141f8576141f761413e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220ac702094c09142e0f7d34575783e7cce24671f5c5ab27cc27c1f51069a510b0f64736f6c63430008110033

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

00000000000000000000000000000000000000000000000000670758aa7c8000000000000000000000000000905587583ab9a31bae59c9aee25e34cfe4749357

-----Decoded View---------------
Arg [0] : _price (uint256): 29000000000000000
Arg [1] : _vault (address): 0x905587583AB9A31BaE59c9Aee25e34CfE4749357

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000670758aa7c8000
Arg [1] : 000000000000000000000000905587583ab9a31bae59c9aee25e34cfe4749357


Deployed Bytecode Sourcemap

48079:2838:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27939:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31052:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32563:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32126:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50389:392;;;:::i;:::-;;27188:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48304:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33428:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48845:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48179:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48603:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49789:592;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50789:125;;;:::i;:::-;;33669:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30860:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49159:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49064:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28308:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47262:103;;;;;;;;;;;;;:::i;:::-;;48733:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46611:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48211:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48975:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31221:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48280:17;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32839:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33925:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31396:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49251:530;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48247:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33197:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47520:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48152:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27939:305;28041:4;28093:25;28078:40;;;:11;:40;;;;:105;;;;28150:33;28135:48;;;:11;:48;;;;28078:105;:158;;;;28200:36;28224:11;28200:23;:36::i;:::-;28078:158;28058:178;;27939:305;;;:::o;31052:100::-;31106:13;31139:5;31132:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31052:100;:::o;32563:204::-;32631:7;32656:16;32664:7;32656;:16::i;:::-;32651:64;;32681:34;;;;;;;;;;;;;;32651:64;32735:15;:24;32751:7;32735:24;;;;;;;;;;;;;;;;;;;;;32728:31;;32563:204;;;:::o;32126:371::-;32199:13;32215:24;32231:7;32215:15;:24::i;:::-;32199:40;;32260:5;32254:11;;:2;:11;;;32250:48;;32274:24;;;;;;;;;;;;;;32250:48;32331:5;32315:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;32341:37;32358:5;32365:12;:10;:12::i;:::-;32341:16;:37::i;:::-;32340:38;32315:63;32311:138;;;32402:35;;;;;;;;;;;;;;32311:138;32461:28;32470:2;32474:7;32483:5;32461:8;:28::i;:::-;32188:309;32126:371;;:::o;50389:392::-;22833:1;23431:7;;:19;23423:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;22833:1;23564:7;:18;;;;50464:1:::1;50454:6;;:11;50446:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;50512:10;50499:23;;:9;:23;;;50491:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;50582:3;50578:1;50561:14;:12;:14::i;:::-;:18;;;;:::i;:::-;:24;50553:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;50652:1;50624:25;50638:10;50624:13;:25::i;:::-;:29;50622:32;50614:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;50711:1;50703:5;;:9;;;;:::i;:::-;50690;:22;;50682:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;50749:24;50759:10;50771:1;50749:9;:24::i;:::-;22789:1:::0;23743:7;:22;;;;50389:392::o;27188:303::-;27232:7;27457:15;:13;:15::i;:::-;27442:12;;27426:13;;:28;:46;27419:53;;27188:303;:::o;48304:18::-;;;;:::o;33428:170::-;33562:28;33572:4;33578:2;33582:7;33562:9;:28::i;:::-;33428:170;;;:::o;48845:122::-;46842:12;:10;:12::i;:::-;46831:23;;:7;:5;:7::i;:::-;:23;;;46823:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48944:15:::1;48927:14;:32;;;;48845:122:::0;:::o;48179:25::-;;;;:::o;48603:122::-;46842:12;:10;:12::i;:::-;46831:23;;:7;:5;:7::i;:::-;:23;;;46823:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48704:13:::1;;48689:12;:28;;;;;;;:::i;:::-;;48603:122:::0;;:::o;49789:592::-;22833:1;23431:7;;:19;23423:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;22833:1;23564:7;:18;;;;49892:12:::1;49934:10;49917:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;49907:39;;;;;;49892:54;;49977:1;49967:6;;:11;49959:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;50025:10;50012:23;;:9;:23;;;50004:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;50095:3;50091:1;50074:14;:12;:14::i;:::-;:18;;;;:::i;:::-;:24;50066:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;50165:1;50137:25;50151:10;50137:13;:25::i;:::-;:29;50135:32;50127:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;50224:1;50216:5;;:9;;;;:::i;:::-;50203;:22;;50195:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;50268:50;50287:12;;50268:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50301:10;;50313:4;50268:18;:50::i;:::-;50260:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;50349:24;50359:10;50371:1;50349:9;:24::i;:::-;49871:510;22789:1:::0;23743:7;:22;;;;49789:592;;:::o;50789:125::-;22833:1;23431:7;;:19;23423:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;22833:1;23564:7;:18;;;;46842:12:::1;:10;:12::i;:::-;46831:23;;:7;:5;:7::i;:::-;:23;;;46823:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50868:5:::2;;;;;;;;;;;50860:23;;:46;50884:21;50860:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;22789:1:::0;23743:7;:22;;;;50789:125::o;33669:185::-;33807:39;33824:4;33830:2;33834:7;33807:39;;;;;;;;;;;;:16;:39::i;:::-;33669:185;;;:::o;30860:125::-;30924:7;30951:21;30964:7;30951:12;:21::i;:::-;:26;;;30944:33;;30860:125;;;:::o;49159:84::-;46842:12;:10;:12::i;:::-;46831:23;;:7;:5;:7::i;:::-;:23;;;46823:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49229:6:::1;49221:5;;:14;;;;;;;;;;;;;;;;;;49159:84:::0;:::o;49064:87::-;46842:12;:10;:12::i;:::-;46831:23;;:7;:5;:7::i;:::-;:23;;;46823:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49136:7:::1;49127:6;:16;;;;49064:87:::0;:::o;28308:206::-;28372:7;28413:1;28396:19;;:5;:19;;;28392:60;;28424:28;;;;;;;;;;;;;;28392:60;28478:12;:19;28491:5;28478:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;28470:36;;28463:43;;28308:206;;;:::o;47262:103::-;46842:12;:10;:12::i;:::-;46831:23;;:7;:5;:7::i;:::-;:23;;;46823:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47327:30:::1;47354:1;47327:18;:30::i;:::-;47262:103::o:0;48733:106::-;46842:12;:10;:12::i;:::-;46831:23;;:7;:5;:7::i;:::-;:23;;;46823:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48820:11:::1;48807:10;:24;;;;48733:106:::0;:::o;46611:87::-;46657:7;46684:6;;;;;;;;;;;46677:13;;46611:87;:::o;48211:29::-;;;;:::o;48975:81::-;46842:12;:10;:12::i;:::-;46831:23;;:7;:5;:7::i;:::-;:23;;;46823:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49042:6:::1;49034:5;:14;;;;48975:81:::0;:::o;31221:104::-;31277:13;31310:7;31303:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31221:104;:::o;48280:17::-;;;;:::o;32839:287::-;32950:12;:10;:12::i;:::-;32938:24;;:8;:24;;;32934:54;;32971:17;;;;;;;;;;;;;;32934:54;33046:8;33001:18;:32;33020:12;:10;:12::i;:::-;33001:32;;;;;;;;;;;;;;;:42;33034:8;33001:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;33099:8;33070:48;;33085:12;:10;:12::i;:::-;33070:48;;;33109:8;33070:48;;;;;;:::i;:::-;;;;;;;;32839:287;;:::o;33925:369::-;34092:28;34102:4;34108:2;34112:7;34092:9;:28::i;:::-;34135:15;:2;:13;;;:15::i;:::-;:76;;;;;34155:56;34186:4;34192:2;34196:7;34205:5;34155:30;:56::i;:::-;34154:57;34135:76;34131:156;;;34235:40;;;;;;;;;;;;;;34131:156;33925:369;;;;:::o;31396:326::-;31469:13;31500:16;31508:7;31500;:16::i;:::-;31495:59;;31525:29;;;;;;;;;;;;;;31495:59;31567:21;31591:10;:8;:10::i;:::-;31567:34;;31644:1;31625:7;31619:21;:26;:95;;;;;;;;;;;;;;;;;31672:7;31681:18;:7;:16;:18::i;:::-;31655:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;31619:95;31612:102;;;31396:326;;;:::o;49251:530::-;22833:1;23431:7;;:19;23423:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;22833:1;23564:7;:18;;;;49353:12:::1;49395:10;49378:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;49368:39;;;;;;49353:54;;49438:1;49428:6;;:11;49420:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;49486:10;49473:23;;:9;:23;;;49465:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;49556:3;49552:1;49535:14;:12;:14::i;:::-;:18;;;;:::i;:::-;:24;49527:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;49626:1;49598:25;49612:10;49598:13;:25::i;:::-;:29;49596:32;49588:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;49664:54;49683:12;;49664:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49697:14;;49713:4;49664:18;:54::i;:::-;49656:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;49749:24;49759:10;49771:1;49749:9;:24::i;:::-;49332:449;22789:1:::0;23743:7;:22;;;;49251:530;;:::o;48247:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33197:164::-;33294:4;33318:18;:25;33337:5;33318:25;;;;;;;;;;;;;;;:35;33344:8;33318:35;;;;;;;;;;;;;;;;;;;;;;;;;33311:42;;33197:164;;;;:::o;47520:201::-;46842:12;:10;:12::i;:::-;46831:23;;:7;:5;:7::i;:::-;:23;;;46823:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47629:1:::1;47609:22;;:8;:22;;::::0;47601:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;47685:28;47704:8;47685:18;:28::i;:::-;47520:201:::0;:::o;48152:20::-;;;;;;;;;;;;;:::o;7729:157::-;7814:4;7853:25;7838:40;;;:11;:40;;;;7831:47;;7729:157;;;:::o;34549:174::-;34606:4;34649:7;34630:15;:13;:15::i;:::-;:26;;:53;;;;;34670:13;;34660:7;:23;34630:53;:85;;;;;34688:11;:20;34700:7;34688:20;;;;;;;;;;;:27;;;;;;;;;;;;34687:28;34630:85;34623:92;;34549:174;;;:::o;16782:98::-;16835:7;16862:10;16855:17;;16782:98;:::o;42706:196::-;42848:2;42821:15;:24;42837:7;42821:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;42886:7;42882:2;42866:28;;42875:5;42866:28;;;;;;;;;;;;42706:196;;;:::o;27584:283::-;27631:7;27833:15;:13;:15::i;:::-;27817:13;;:31;27810:38;;27584:283;:::o;28596:137::-;28657:7;28692:12;:19;28705:5;28692:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;28684:41;;28677:48;;28596:137;;;:::o;34731:104::-;34800:27;34810:2;34814:8;34800:27;;;;;;;;;;;;:9;:27::i;:::-;34731:104;;:::o;26962:92::-;27018:7;26962:92;:::o;37649:2130::-;37764:35;37802:21;37815:7;37802:12;:21::i;:::-;37764:59;;37862:4;37840:26;;:13;:18;;;:26;;;37836:67;;37875:28;;;;;;;;;;;;;;37836:67;37916:22;37958:4;37942:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;37979:36;37996:4;38002:12;:10;:12::i;:::-;37979:16;:36::i;:::-;37942:73;:126;;;;38056:12;:10;:12::i;:::-;38032:36;;:20;38044:7;38032:11;:20::i;:::-;:36;;;37942:126;37916:153;;38087:17;38082:66;;38113:35;;;;;;;;;;;;;;38082:66;38177:1;38163:16;;:2;:16;;;38159:52;;38188:23;;;;;;;;;;;;;;38159:52;38224:43;38246:4;38252:2;38256:7;38265:1;38224:21;:43::i;:::-;38332:35;38349:1;38353:7;38362:4;38332:8;:35::i;:::-;38693:1;38663:12;:18;38676:4;38663:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38737:1;38709:12;:16;38722:2;38709:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38755:31;38789:11;:20;38801:7;38789:20;;;;;;;;;;;38755:54;;38840:2;38824:8;:13;;;:18;;;;;;;;;;;;;;;;;;38890:15;38857:8;:23;;;:49;;;;;;;;;;;;;;;;;;39158:19;39190:1;39180:7;:11;39158:33;;39206:31;39240:11;:24;39252:11;39240:24;;;;;;;;;;;39206:58;;39308:1;39283:27;;:8;:13;;;;;;;;;;;;:27;;;39279:384;;39493:13;;39478:11;:28;39474:174;;39547:4;39531:8;:13;;;:20;;;;;;;;;;;;;;;;;;39600:13;:28;;;39574:8;:23;;;:54;;;;;;;;;;;;;;;;;;39474:174;39279:384;38638:1036;;;39710:7;39706:2;39691:27;;39700:4;39691:27;;;;;;;;;;;;39729:42;39750:4;39756:2;39760:7;39769:1;39729:20;:42::i;:::-;37753:2026;;37649:2130;;;:::o;19716:190::-;19841:4;19894;19865:25;19878:5;19885:4;19865:12;:25::i;:::-;:33;19858:40;;19716:190;;;;;:::o;29689:1109::-;29751:21;;:::i;:::-;29785:12;29800:7;29785:22;;29868:4;29849:15;:13;:15::i;:::-;:23;;:47;;;;;29883:13;;29876:4;:20;29849:47;29845:886;;;29917:31;29951:11;:17;29963:4;29951:17;;;;;;;;;;;29917:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29992:9;:16;;;29987:729;;30063:1;30037:28;;:9;:14;;;:28;;;30033:101;;30101:9;30094:16;;;;;;30033:101;30436:261;30443:4;30436:261;;;30476:6;;;;;;;;30521:11;:17;30533:4;30521:17;;;;;;;;;;;30509:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30595:1;30569:28;;:9;:14;;;:28;;;30565:109;;30637:9;30630:16;;;;;;30565:109;30436:261;;;29987:729;29898:833;29845:886;30759:31;;;;;;;;;;;;;;29689:1109;;;;:::o;47881:191::-;47955:16;47974:6;;;;;;;;;;;47955:25;;48000:8;47991:6;;:17;;;;;;;;;;;;;;;;;;48055:8;48024:40;;48045:8;48024:40;;;;;;;;;;;;47944:128;47881:191;:::o;8972:326::-;9032:4;9289:1;9267:7;:19;;;:23;9260:30;;8972:326;;;:::o;43394:667::-;43557:4;43594:2;43578:36;;;43615:12;:10;:12::i;:::-;43629:4;43635:7;43644:5;43578:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;43574:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43829:1;43812:6;:13;:18;43808:235;;43858:40;;;;;;;;;;;;;;43808:235;44001:6;43995:13;43986:6;43982:2;43978:15;43971:38;43574:480;43707:45;;;43697:55;;;:6;:55;;;;43690:62;;;43394:667;;;;;;:::o;48482:113::-;48542:13;48575:12;48568:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48482:113;:::o;17222:723::-;17278:13;17508:1;17499:5;:10;17495:53;;17526:10;;;;;;;;;;;;;;;;;;;;;17495:53;17558:12;17573:5;17558:20;;17589:14;17614:78;17629:1;17621:4;:9;17614:78;;17647:8;;;;;:::i;:::-;;;;17678:2;17670:10;;;;;:::i;:::-;;;17614:78;;;17702:19;17734:6;17724:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17702:39;;17752:154;17768:1;17759:5;:10;17752:154;;17796:1;17786:11;;;;;:::i;:::-;;;17863:2;17855:5;:10;;;;:::i;:::-;17842:2;:24;;;;:::i;:::-;17829:39;;17812:6;17819;17812:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17892:2;17883:11;;;;;:::i;:::-;;;17752:154;;;17930:6;17916:21;;;;;17222:723;;;;:::o;35198:163::-;35321:32;35327:2;35331:8;35341:5;35348:4;35321:5;:32::i;:::-;35198:163;;;:::o;44709:159::-;;;;;:::o;45527:158::-;;;;;:::o;20268:675::-;20351:7;20371:20;20394:4;20371:27;;20414:9;20409:497;20433:5;:12;20429:1;:16;20409:497;;;20467:20;20490:5;20496:1;20490:8;;;;;;;;:::i;:::-;;;;;;;;20467:31;;20533:12;20517;:28;20513:382;;20660:42;20675:12;20689;20660:14;:42::i;:::-;20645:57;;20513:382;;;20837:42;20852:12;20866;20837:14;:42::i;:::-;20822:57;;20513:382;20452:454;20447:3;;;;;:::i;:::-;;;;20409:497;;;;20923:12;20916:19;;;20268:675;;;;:::o;35620:1775::-;35759:20;35782:13;;35759:36;;35824:1;35810:16;;:2;:16;;;35806:48;;35835:19;;;;;;;;;;;;;;35806:48;35881:1;35869:8;:13;35865:44;;35891:18;;;;;;;;;;;;;;35865:44;35922:61;35952:1;35956:2;35960:12;35974:8;35922:21;:61::i;:::-;36295:8;36260:12;:16;36273:2;36260:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36359:8;36319:12;:16;36332:2;36319:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36418:2;36385:11;:25;36397:12;36385:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;36485:15;36435:11;:25;36447:12;36435:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;36518:20;36541:12;36518:35;;36568:11;36597:8;36582:12;:23;36568:37;;36626:4;:23;;;;;36634:15;:2;:13;;;:15::i;:::-;36626:23;36622:641;;;36670:314;36726:12;36722:2;36701:38;;36718:1;36701:38;;;;;;;;;;;;36767:69;36806:1;36810:2;36814:14;;;;;;36830:5;36767:30;:69::i;:::-;36762:174;;36872:40;;;;;;;;;;;;;;36762:174;36979:3;36963:12;:19;36670:314;;37065:12;37048:13;;:29;37044:43;;37079:8;;;37044:43;36622:641;;;37128:120;37184:14;;;;;;37180:2;37159:40;;37176:1;37159:40;;;;;;;;;;;;37243:3;37227:12;:19;37128:120;;36622:641;37293:12;37277:13;:28;;;;36235:1082;;37327:60;37356:1;37360:2;37364:12;37378:8;37327:20;:60::i;:::-;35748:1647;35620:1775;;;;:::o;20951:224::-;21019:13;21082:1;21076:4;21069:15;21111:1;21105:4;21098:15;21152:4;21146;21136:21;21127:30;;20951:224;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:77::-;5904:7;5933:5;5922:16;;5867:77;;;:::o;5950:122::-;6023:24;6041:5;6023:24;:::i;:::-;6016:5;6013:35;6003:63;;6062:1;6059;6052:12;6003:63;5950:122;:::o;6078:139::-;6124:5;6162:6;6149:20;6140:29;;6178:33;6205:5;6178:33;:::i;:::-;6078:139;;;;:::o;6223:329::-;6282:6;6331:2;6319:9;6310:7;6306:23;6302:32;6299:119;;;6337:79;;:::i;:::-;6299:119;6457:1;6482:53;6527:7;6518:6;6507:9;6503:22;6482:53;:::i;:::-;6472:63;;6428:117;6223:329;;;;:::o;6558:118::-;6645:24;6663:5;6645:24;:::i;:::-;6640:3;6633:37;6558:118;;:::o;6682:222::-;6775:4;6813:2;6802:9;6798:18;6790:26;;6826:71;6894:1;6883:9;6879:17;6870:6;6826:71;:::i;:::-;6682:222;;;;:::o;6910:117::-;7019:1;7016;7009:12;7033:117;7142:1;7139;7132:12;7156:117;7265:1;7262;7255:12;7293:553;7351:8;7361:6;7411:3;7404:4;7396:6;7392:17;7388:27;7378:122;;7419:79;;:::i;:::-;7378:122;7532:6;7519:20;7509:30;;7562:18;7554:6;7551:30;7548:117;;;7584:79;;:::i;:::-;7548:117;7698:4;7690:6;7686:17;7674:29;;7752:3;7744:4;7736:6;7732:17;7722:8;7718:32;7715:41;7712:128;;;7759:79;;:::i;:::-;7712:128;7293:553;;;;;:::o;7852:529::-;7923:6;7931;7980:2;7968:9;7959:7;7955:23;7951:32;7948:119;;;7986:79;;:::i;:::-;7948:119;8134:1;8123:9;8119:17;8106:31;8164:18;8156:6;8153:30;8150:117;;;8186:79;;:::i;:::-;8150:117;8299:65;8356:7;8347:6;8336:9;8332:22;8299:65;:::i;:::-;8281:83;;;;8077:297;7852:529;;;;;:::o;8404:568::-;8477:8;8487:6;8537:3;8530:4;8522:6;8518:17;8514:27;8504:122;;8545:79;;:::i;:::-;8504:122;8658:6;8645:20;8635:30;;8688:18;8680:6;8677:30;8674:117;;;8710:79;;:::i;:::-;8674:117;8824:4;8816:6;8812:17;8800:29;;8878:3;8870:4;8862:6;8858:17;8848:8;8844:32;8841:41;8838:128;;;8885:79;;:::i;:::-;8838:128;8404:568;;;;;:::o;8978:559::-;9064:6;9072;9121:2;9109:9;9100:7;9096:23;9092:32;9089:119;;;9127:79;;:::i;:::-;9089:119;9275:1;9264:9;9260:17;9247:31;9305:18;9297:6;9294:30;9291:117;;;9327:79;;:::i;:::-;9291:117;9440:80;9512:7;9503:6;9492:9;9488:22;9440:80;:::i;:::-;9422:98;;;;9218:312;8978:559;;;;;:::o;9543:329::-;9602:6;9651:2;9639:9;9630:7;9626:23;9622:32;9619:119;;;9657:79;;:::i;:::-;9619:119;9777:1;9802:53;9847:7;9838:6;9827:9;9823:22;9802:53;:::i;:::-;9792:63;;9748:117;9543:329;;;;:::o;9878:116::-;9948:21;9963:5;9948:21;:::i;:::-;9941:5;9938:32;9928:60;;9984:1;9981;9974:12;9928:60;9878:116;:::o;10000:133::-;10043:5;10081:6;10068:20;10059:29;;10097:30;10121:5;10097:30;:::i;:::-;10000:133;;;;:::o;10139:468::-;10204:6;10212;10261:2;10249:9;10240:7;10236:23;10232:32;10229:119;;;10267:79;;:::i;:::-;10229:119;10387:1;10412:53;10457:7;10448:6;10437:9;10433:22;10412:53;:::i;:::-;10402:63;;10358:117;10514:2;10540:50;10582:7;10573:6;10562:9;10558:22;10540:50;:::i;:::-;10530:60;;10485:115;10139:468;;;;;:::o;10613:117::-;10722:1;10719;10712:12;10736:180;10784:77;10781:1;10774:88;10881:4;10878:1;10871:15;10905:4;10902:1;10895:15;10922:281;11005:27;11027:4;11005:27;:::i;:::-;10997:6;10993:40;11135:6;11123:10;11120:22;11099:18;11087:10;11084:34;11081:62;11078:88;;;11146:18;;:::i;:::-;11078:88;11186:10;11182:2;11175:22;10965:238;10922:281;;:::o;11209:129::-;11243:6;11270:20;;:::i;:::-;11260:30;;11299:33;11327:4;11319:6;11299:33;:::i;:::-;11209:129;;;:::o;11344:307::-;11405:4;11495:18;11487:6;11484:30;11481:56;;;11517:18;;:::i;:::-;11481:56;11555:29;11577:6;11555:29;:::i;:::-;11547:37;;11639:4;11633;11629:15;11621:23;;11344:307;;;:::o;11657:146::-;11754:6;11749:3;11744;11731:30;11795:1;11786:6;11781:3;11777:16;11770:27;11657:146;;;:::o;11809:423::-;11886:5;11911:65;11927:48;11968:6;11927:48;:::i;:::-;11911:65;:::i;:::-;11902:74;;11999:6;11992:5;11985:21;12037:4;12030:5;12026:16;12075:3;12066:6;12061:3;12057:16;12054:25;12051:112;;;12082:79;;:::i;:::-;12051:112;12172:54;12219:6;12214:3;12209;12172:54;:::i;:::-;11892:340;11809:423;;;;;:::o;12251:338::-;12306:5;12355:3;12348:4;12340:6;12336:17;12332:27;12322:122;;12363:79;;:::i;:::-;12322:122;12480:6;12467:20;12505:78;12579:3;12571:6;12564:4;12556:6;12552:17;12505:78;:::i;:::-;12496:87;;12312:277;12251:338;;;;:::o;12595:943::-;12690:6;12698;12706;12714;12763:3;12751:9;12742:7;12738:23;12734:33;12731:120;;;12770:79;;:::i;:::-;12731:120;12890:1;12915:53;12960:7;12951:6;12940:9;12936:22;12915:53;:::i;:::-;12905:63;;12861:117;13017:2;13043:53;13088:7;13079:6;13068:9;13064:22;13043:53;:::i;:::-;13033:63;;12988:118;13145:2;13171:53;13216:7;13207:6;13196:9;13192:22;13171:53;:::i;:::-;13161:63;;13116:118;13301:2;13290:9;13286:18;13273:32;13332:18;13324:6;13321:30;13318:117;;;13354:79;;:::i;:::-;13318:117;13459:62;13513:7;13504:6;13493:9;13489:22;13459:62;:::i;:::-;13449:72;;13244:287;12595:943;;;;;;;:::o;13544:474::-;13612:6;13620;13669:2;13657:9;13648:7;13644:23;13640:32;13637:119;;;13675:79;;:::i;:::-;13637:119;13795:1;13820:53;13865:7;13856:6;13845:9;13841:22;13820:53;:::i;:::-;13810:63;;13766:117;13922:2;13948:53;13993:7;13984:6;13973:9;13969:22;13948:53;:::i;:::-;13938:63;;13893:118;13544:474;;;;;:::o;14024:180::-;14072:77;14069:1;14062:88;14169:4;14166:1;14159:15;14193:4;14190:1;14183:15;14210:320;14254:6;14291:1;14285:4;14281:12;14271:22;;14338:1;14332:4;14328:12;14359:18;14349:81;;14415:4;14407:6;14403:17;14393:27;;14349:81;14477:2;14469:6;14466:14;14446:18;14443:38;14440:84;;14496:18;;:::i;:::-;14440:84;14261:269;14210:320;;;:::o;14536:181::-;14676:33;14672:1;14664:6;14660:14;14653:57;14536:181;:::o;14723:366::-;14865:3;14886:67;14950:2;14945:3;14886:67;:::i;:::-;14879:74;;14962:93;15051:3;14962:93;:::i;:::-;15080:2;15075:3;15071:12;15064:19;;14723:366;;;:::o;15095:419::-;15261:4;15299:2;15288:9;15284:18;15276:26;;15348:9;15342:4;15338:20;15334:1;15323:9;15319:17;15312:47;15376:131;15502:4;15376:131;:::i;:::-;15368:139;;15095:419;;;:::o;15520:160::-;15660:12;15656:1;15648:6;15644:14;15637:36;15520:160;:::o;15686:366::-;15828:3;15849:67;15913:2;15908:3;15849:67;:::i;:::-;15842:74;;15925:93;16014:3;15925:93;:::i;:::-;16043:2;16038:3;16034:12;16027:19;;15686:366;;;:::o;16058:419::-;16224:4;16262:2;16251:9;16247:18;16239:26;;16311:9;16305:4;16301:20;16297:1;16286:9;16282:17;16275:47;16339:131;16465:4;16339:131;:::i;:::-;16331:139;;16058:419;;;:::o;16483:165::-;16623:17;16619:1;16611:6;16607:14;16600:41;16483:165;:::o;16654:366::-;16796:3;16817:67;16881:2;16876:3;16817:67;:::i;:::-;16810:74;;16893:93;16982:3;16893:93;:::i;:::-;17011:2;17006:3;17002:12;16995:19;;16654:366;;;:::o;17026:419::-;17192:4;17230:2;17219:9;17215:18;17207:26;;17279:9;17273:4;17269:20;17265:1;17254:9;17250:17;17243:47;17307:131;17433:4;17307:131;:::i;:::-;17299:139;;17026:419;;;:::o;17451:180::-;17499:77;17496:1;17489:88;17596:4;17593:1;17586:15;17620:4;17617:1;17610:15;17637:191;17677:3;17696:20;17714:1;17696:20;:::i;:::-;17691:25;;17730:20;17748:1;17730:20;:::i;:::-;17725:25;;17773:1;17770;17766:9;17759:16;;17794:3;17791:1;17788:10;17785:36;;;17801:18;;:::i;:::-;17785:36;17637:191;;;;:::o;17834:163::-;17974:15;17970:1;17962:6;17958:14;17951:39;17834:163;:::o;18003:366::-;18145:3;18166:67;18230:2;18225:3;18166:67;:::i;:::-;18159:74;;18242:93;18331:3;18242:93;:::i;:::-;18360:2;18355:3;18351:12;18344:19;;18003:366;;;:::o;18375:419::-;18541:4;18579:2;18568:9;18564:18;18556:26;;18628:9;18622:4;18618:20;18614:1;18603:9;18599:17;18592:47;18656:131;18782:4;18656:131;:::i;:::-;18648:139;;18375:419;;;:::o;18800:162::-;18940:14;18936:1;18928:6;18924:14;18917:38;18800:162;:::o;18968:366::-;19110:3;19131:67;19195:2;19190:3;19131:67;:::i;:::-;19124:74;;19207:93;19296:3;19207:93;:::i;:::-;19325:2;19320:3;19316:12;19309:19;;18968:366;;;:::o;19340:419::-;19506:4;19544:2;19533:9;19529:18;19521:26;;19593:9;19587:4;19583:20;19579:1;19568:9;19564:17;19557:47;19621:131;19747:4;19621:131;:::i;:::-;19613:139;;19340:419;;;:::o;19765:410::-;19805:7;19828:20;19846:1;19828:20;:::i;:::-;19823:25;;19862:20;19880:1;19862:20;:::i;:::-;19857:25;;19917:1;19914;19910:9;19939:30;19957:11;19939:30;:::i;:::-;19928:41;;20118:1;20109:7;20105:15;20102:1;20099:22;20079:1;20072:9;20052:83;20029:139;;20148:18;;:::i;:::-;20029:139;19813:362;19765:410;;;;:::o;20181:169::-;20321:21;20317:1;20309:6;20305:14;20298:45;20181:169;:::o;20356:366::-;20498:3;20519:67;20583:2;20578:3;20519:67;:::i;:::-;20512:74;;20595:93;20684:3;20595:93;:::i;:::-;20713:2;20708:3;20704:12;20697:19;;20356:366;;;:::o;20728:419::-;20894:4;20932:2;20921:9;20917:18;20909:26;;20981:9;20975:4;20971:20;20967:1;20956:9;20952:17;20945:47;21009:131;21135:4;21009:131;:::i;:::-;21001:139;;20728:419;;;:::o;21153:182::-;21293:34;21289:1;21281:6;21277:14;21270:58;21153:182;:::o;21341:366::-;21483:3;21504:67;21568:2;21563:3;21504:67;:::i;:::-;21497:74;;21580:93;21669:3;21580:93;:::i;:::-;21698:2;21693:3;21689:12;21682:19;;21341:366;;;:::o;21713:419::-;21879:4;21917:2;21906:9;21902:18;21894:26;;21966:9;21960:4;21956:20;21952:1;21941:9;21937:17;21930:47;21994:131;22120:4;21994:131;:::i;:::-;21986:139;;21713:419;;;:::o;22138:97::-;22197:6;22225:3;22215:13;;22138:97;;;;:::o;22241:141::-;22290:4;22313:3;22305:11;;22336:3;22333:1;22326:14;22370:4;22367:1;22357:18;22349:26;;22241:141;;;:::o;22388:93::-;22425:6;22472:2;22467;22460:5;22456:14;22452:23;22442:33;;22388:93;;;:::o;22487:107::-;22531:8;22581:5;22575:4;22571:16;22550:37;;22487:107;;;;:::o;22600:393::-;22669:6;22719:1;22707:10;22703:18;22742:97;22772:66;22761:9;22742:97;:::i;:::-;22860:39;22890:8;22879:9;22860:39;:::i;:::-;22848:51;;22932:4;22928:9;22921:5;22917:21;22908:30;;22981:4;22971:8;22967:19;22960:5;22957:30;22947:40;;22676:317;;22600:393;;;;;:::o;22999:60::-;23027:3;23048:5;23041:12;;22999:60;;;:::o;23065:142::-;23115:9;23148:53;23166:34;23175:24;23193:5;23175:24;:::i;:::-;23166:34;:::i;:::-;23148:53;:::i;:::-;23135:66;;23065:142;;;:::o;23213:75::-;23256:3;23277:5;23270:12;;23213:75;;;:::o;23294:269::-;23404:39;23435:7;23404:39;:::i;:::-;23465:91;23514:41;23538:16;23514:41;:::i;:::-;23506:6;23499:4;23493:11;23465:91;:::i;:::-;23459:4;23452:105;23370:193;23294:269;;;:::o;23569:73::-;23614:3;23569:73;:::o;23648:189::-;23725:32;;:::i;:::-;23766:65;23824:6;23816;23810:4;23766:65;:::i;:::-;23701:136;23648:189;;:::o;23843:186::-;23903:120;23920:3;23913:5;23910:14;23903:120;;;23974:39;24011:1;24004:5;23974:39;:::i;:::-;23947:1;23940:5;23936:13;23927:22;;23903:120;;;23843:186;;:::o;24035:543::-;24136:2;24131:3;24128:11;24125:446;;;24170:38;24202:5;24170:38;:::i;:::-;24254:29;24272:10;24254:29;:::i;:::-;24244:8;24240:44;24437:2;24425:10;24422:18;24419:49;;;24458:8;24443:23;;24419:49;24481:80;24537:22;24555:3;24537:22;:::i;:::-;24527:8;24523:37;24510:11;24481:80;:::i;:::-;24140:431;;24125:446;24035:543;;;:::o;24584:117::-;24638:8;24688:5;24682:4;24678:16;24657:37;;24584:117;;;;:::o;24707:169::-;24751:6;24784:51;24832:1;24828:6;24820:5;24817:1;24813:13;24784:51;:::i;:::-;24780:56;24865:4;24859;24855:15;24845:25;;24758:118;24707:169;;;;:::o;24881:295::-;24957:4;25103:29;25128:3;25122:4;25103:29;:::i;:::-;25095:37;;25165:3;25162:1;25158:11;25152:4;25149:21;25141:29;;24881:295;;;;:::o;25181:1403::-;25305:44;25345:3;25340;25305:44;:::i;:::-;25414:18;25406:6;25403:30;25400:56;;;25436:18;;:::i;:::-;25400:56;25480:38;25512:4;25506:11;25480:38;:::i;:::-;25565:67;25625:6;25617;25611:4;25565:67;:::i;:::-;25659:1;25688:2;25680:6;25677:14;25705:1;25700:632;;;;26376:1;26393:6;26390:84;;;26449:9;26444:3;26440:19;26427:33;26418:42;;26390:84;26500:67;26560:6;26553:5;26500:67;:::i;:::-;26494:4;26487:81;26349:229;25670:908;;25700:632;25752:4;25748:9;25740:6;25736:22;25786:37;25818:4;25786:37;:::i;:::-;25845:1;25859:215;25873:7;25870:1;25867:14;25859:215;;;25959:9;25954:3;25950:19;25937:33;25929:6;25922:49;26010:1;26002:6;25998:14;25988:24;;26057:2;26046:9;26042:18;26029:31;;25896:4;25893:1;25889:12;25884:17;;25859:215;;;26102:6;26093:7;26090:19;26087:186;;;26167:9;26162:3;26158:19;26145:33;26210:48;26252:4;26244:6;26240:17;26229:9;26210:48;:::i;:::-;26202:6;26195:64;26110:163;26087:186;26319:1;26315;26307:6;26303:14;26299:22;26293:4;26286:36;25707:625;;;25670:908;;25280:1304;;;25181:1403;;;:::o;26590:94::-;26623:8;26671:5;26667:2;26663:14;26642:35;;26590:94;;;:::o;26690:::-;26729:7;26758:20;26772:5;26758:20;:::i;:::-;26747:31;;26690:94;;;:::o;26790:100::-;26829:7;26858:26;26878:5;26858:26;:::i;:::-;26847:37;;26790:100;;;:::o;26896:157::-;27001:45;27021:24;27039:5;27021:24;:::i;:::-;27001:45;:::i;:::-;26996:3;26989:58;26896:157;;:::o;27059:256::-;27171:3;27186:75;27257:3;27248:6;27186:75;:::i;:::-;27286:2;27281:3;27277:12;27270:19;;27306:3;27299:10;;27059:256;;;;:::o;27321:163::-;27461:15;27457:1;27449:6;27445:14;27438:39;27321:163;:::o;27490:366::-;27632:3;27653:67;27717:2;27712:3;27653:67;:::i;:::-;27646:74;;27729:93;27818:3;27729:93;:::i;:::-;27847:2;27842:3;27838:12;27831:19;;27490:366;;;:::o;27862:419::-;28028:4;28066:2;28055:9;28051:18;28043:26;;28115:9;28109:4;28105:20;28101:1;28090:9;28086:17;28079:47;28143:131;28269:4;28143:131;:::i;:::-;28135:139;;27862:419;;;:::o;28287:148::-;28389:11;28426:3;28411:18;;28287:148;;;;:::o;28441:390::-;28547:3;28575:39;28608:5;28575:39;:::i;:::-;28630:89;28712:6;28707:3;28630:89;:::i;:::-;28623:96;;28728:65;28786:6;28781:3;28774:4;28767:5;28763:16;28728:65;:::i;:::-;28818:6;28813:3;28809:16;28802:23;;28551:280;28441:390;;;;:::o;28837:155::-;28977:7;28973:1;28965:6;28961:14;28954:31;28837:155;:::o;28998:400::-;29158:3;29179:84;29261:1;29256:3;29179:84;:::i;:::-;29172:91;;29272:93;29361:3;29272:93;:::i;:::-;29390:1;29385:3;29381:11;29374:18;;28998:400;;;:::o;29404:701::-;29685:3;29707:95;29798:3;29789:6;29707:95;:::i;:::-;29700:102;;29819:95;29910:3;29901:6;29819:95;:::i;:::-;29812:102;;29931:148;30075:3;29931:148;:::i;:::-;29924:155;;30096:3;30089:10;;29404:701;;;;;:::o;30111:225::-;30251:34;30247:1;30239:6;30235:14;30228:58;30320:8;30315:2;30307:6;30303:15;30296:33;30111:225;:::o;30342:366::-;30484:3;30505:67;30569:2;30564:3;30505:67;:::i;:::-;30498:74;;30581:93;30670:3;30581:93;:::i;:::-;30699:2;30694:3;30690:12;30683:19;;30342:366;;;:::o;30714:419::-;30880:4;30918:2;30907:9;30903:18;30895:26;;30967:9;30961:4;30957:20;30953:1;30942:9;30938:17;30931:47;30995:131;31121:4;30995:131;:::i;:::-;30987:139;;30714:419;;;:::o;31139:98::-;31190:6;31224:5;31218:12;31208:22;;31139:98;;;:::o;31243:168::-;31326:11;31360:6;31355:3;31348:19;31400:4;31395:3;31391:14;31376:29;;31243:168;;;;:::o;31417:373::-;31503:3;31531:38;31563:5;31531:38;:::i;:::-;31585:70;31648:6;31643:3;31585:70;:::i;:::-;31578:77;;31664:65;31722:6;31717:3;31710:4;31703:5;31699:16;31664:65;:::i;:::-;31754:29;31776:6;31754:29;:::i;:::-;31749:3;31745:39;31738:46;;31507:283;31417:373;;;;:::o;31796:640::-;31991:4;32029:3;32018:9;32014:19;32006:27;;32043:71;32111:1;32100:9;32096:17;32087:6;32043:71;:::i;:::-;32124:72;32192:2;32181:9;32177:18;32168:6;32124:72;:::i;:::-;32206;32274:2;32263:9;32259:18;32250:6;32206:72;:::i;:::-;32325:9;32319:4;32315:20;32310:2;32299:9;32295:18;32288:48;32353:76;32424:4;32415:6;32353:76;:::i;:::-;32345:84;;31796:640;;;;;;;:::o;32442:141::-;32498:5;32529:6;32523:13;32514:22;;32545:32;32571:5;32545:32;:::i;:::-;32442:141;;;;:::o;32589:349::-;32658:6;32707:2;32695:9;32686:7;32682:23;32678:32;32675:119;;;32713:79;;:::i;:::-;32675:119;32833:1;32858:63;32913:7;32904:6;32893:9;32889:22;32858:63;:::i;:::-;32848:73;;32804:127;32589:349;;;;:::o;32944:233::-;32983:3;33006:24;33024:5;33006:24;:::i;:::-;32997:33;;33052:66;33045:5;33042:77;33039:103;;33122:18;;:::i;:::-;33039:103;33169:1;33162:5;33158:13;33151:20;;32944:233;;;:::o;33183:180::-;33231:77;33228:1;33221:88;33328:4;33325:1;33318:15;33352:4;33349:1;33342:15;33369:185;33409:1;33426:20;33444:1;33426:20;:::i;:::-;33421:25;;33460:20;33478:1;33460:20;:::i;:::-;33455:25;;33499:1;33489:35;;33504:18;;:::i;:::-;33489:35;33546:1;33543;33539:9;33534:14;;33369:185;;;;:::o;33560:194::-;33600:4;33620:20;33638:1;33620:20;:::i;:::-;33615:25;;33654:20;33672:1;33654:20;:::i;:::-;33649:25;;33698:1;33695;33691:9;33683:17;;33722:1;33716:4;33713:11;33710:37;;;33727:18;;:::i;:::-;33710:37;33560:194;;;;:::o;33760:176::-;33792:1;33809:20;33827:1;33809:20;:::i;:::-;33804:25;;33843:20;33861:1;33843:20;:::i;:::-;33838:25;;33882:1;33872:35;;33887:18;;:::i;:::-;33872:35;33928:1;33925;33921:9;33916:14;;33760:176;;;;:::o;33942:180::-;33990:77;33987:1;33980:88;34087:4;34084:1;34077:15;34111:4;34108:1;34101:15

Swarm Source

ipfs://ac702094c09142e0f7d34575783e7cce24671f5c5ab27cc27c1f51069a510b0f
Loading...
Loading
Loading...
Loading
[ 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.