ETH Price: $3,341.15 (-0.77%)
Gas: 5 Gwei

Token

Advent NFT (ADV)
 

Overview

Max Total Supply

341 ADV

Holders

90

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 ADV
0xb6d3f44d325c35e8434bf389efd9ee83b19ded54
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:
AdventNFT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-08-27
*/

// File: @openzeppelin/contracts//utils/cryptography/MerkleProof.sol


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

pragma solidity ^0.8.0;

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

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

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

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Context.sol


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Address.sol


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

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


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

pragma solidity ^0.8.0;


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

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

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

// File: ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;









error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintedQueryForZeroAddress();
error BurnedQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
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 and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 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**128 - 1 (max value of uint128).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    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;
    }

    // Compiler will pack the following 
    // _currentIndex and _burnCounter into a single 256bit word.
    
    // The tokenId of the next token to be minted.
    uint128 internal _currentIndex;

    // The number of tokens burned.
    uint128 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_;
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex times
        unchecked {
            return _currentIndex - _burnCounter;    
        }
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        uint256 numMintedSoFar = _currentIndex;
        uint256 tokenIdsIdx;

        // Counter overflow is impossible as the loop breaks when
        // uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (!ownership.burned) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }
        revert TokenIndexOutOfBounds();
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        if (index >= balanceOf(owner)) revert OwnerIndexOutOfBounds();
        uint256 numMintedSoFar = _currentIndex;
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when
        // uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        // Execution should never reach this point.
        revert();
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).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);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        return uint256(_addressData[owner].numberMinted);
    }

    function _numberBurned(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert BurnedQueryForZeroAddress();
        return uint256(_addressData[owner].numberBurned);
    }

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public 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 (!_checkOnERC721Received(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 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 > 3.4e38 (2**128) - 1
        // updatedIndex overflows if _currentIndex + quantity > 3.4e38 (2**128) - 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;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe && !_checkOnERC721Received(address(0), to, updatedIndex, _data)) {
                    revert TransferToNonERC721ReceiverImplementer();
                }
                updatedIndex++;
            }

            _currentIndex = uint128(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);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            isApprovedForAll(prevOwnership.addr, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // 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**128.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].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;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

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

        _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

        // 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**128.
        unchecked {
            _addressData[prevOwnership.addr].balance -= 1;
            _addressData[prevOwnership.addr].numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            _ownerships[tokenId].addr = prevOwnership.addr;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);
            _ownerships[tokenId].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;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(prevOwnership.addr, address(0), tokenId);
        _afterTokenTransfers(prevOwnership.addr, 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 address.
     * The call is not executed if the target address is not a 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 _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            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))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

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


pragma solidity ^0.8.7;




contract AdventNFT is ERC721A, Ownable {
    
    using Strings for uint256;
    bytes32 public Whitelist_OG;
    bytes32 public AllowList;
    uint256 public AllowStartTime;
    uint256 public WLStartTime; 
    uint256 public MAX_SUPPLY = 6666;    //total supply
    uint256 public Max_Mint = 3;  //max mint
    uint256 public price = 0.13 ether;  //price
    uint256 public wl_price = 0.1 ether; // wl price
    address payable withdrawWallet;
    string public baseURI;
    mapping(address => uint256) public Max_Minted;

    constructor(
        string memory _uri,
        address payable _withdrawWallet,
        bytes32 _wl, bytes32 _allow, uint256 _wltime, uint256 _altime) ERC721A("Advent NFT ", "ADV") {
            baseURI = _uri;
            withdrawWallet = _withdrawWallet;
            Whitelist_OG = _wl;
            AllowList = _allow;
            AllowStartTime = _altime;
            WLStartTime = _wltime;
        }

    function setwithdrawal(address payable _withdrawWallet) public virtual onlyOwner {
        require(_withdrawWallet != address(0), "can't set null address for withdrawal");
        withdrawWallet = _withdrawWallet;
    }

    function setURI(string calldata uri ) public onlyOwner {
        baseURI = uri;
    }

    function setSigns(bytes32 _allowCode, bytes32 _wlCode) public onlyOwner{
        Whitelist_OG = _wlCode;
        AllowList = _allowCode;
    }
    
    function MaxAllowedMints(uint256 Value) public onlyOwner {
        Max_Mint = Value;
    }

    function PauseMint() public onlyOwner {
        AllowStartTime = 0;
        WLStartTime = 0;
    }

    function StartMint(uint256 _SetWLTime, uint256 _SetAllowTime) public onlyOwner{
        WLStartTime = _SetWLTime;
        AllowStartTime = _SetAllowTime;
    }

    //set price
    function Price(uint256 _newprice) public onlyOwner {
        price = _newprice;
    }

    function WLPrice(uint256 _newWlPrice) public onlyOwner {
        wl_price = _newWlPrice;
    }

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

    function WithdrawAddress() public view virtual returns (address){
        return withdrawWallet;
    }

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

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


    function mint(uint256 quantity, bytes32[] memory sign) external payable {
        require(totalSupply()<=MAX_SUPPLY,"All NFTs were Sold Out");
        require(WLStartTime>0,"Sale not started");
        require(AllowStartTime>0,"Sale not started_");
        require(block.timestamp>WLStartTime,"Sale Not Started yet__");

        if(block.timestamp>AllowStartTime) {
            uint256 Minted = Max_Minted[msg.sender];
            require(isValidAllowed(sign, keccak256(abi.encodePacked(msg.sender))), "Not a part of Allowlist");
            require(Max_Minted[msg.sender]<(Max_Mint+1),"you have minted maximum allowed nfts");
            require(quantity <= (Max_Mint-Max_Minted[msg.sender]), "You have reached Maximum mint limit");
            require(totalSupply() + quantity <= MAX_SUPPLY, "All NFTs are Sold Out");
            require(msg.value >= (price * quantity), "Not enough ether sent");
            Max_Minted[msg.sender] = Minted + quantity;
            _safeMint(msg.sender, quantity);

        } else if(block.timestamp>WLStartTime && block.timestamp<AllowStartTime){
           uint256 Minted = Max_Minted[msg.sender];
            require(isValidWL(sign, keccak256(abi.encodePacked(msg.sender))), "Not a part of OG/Whitelist");
            require(Max_Minted[msg.sender]<(Max_Mint+1),"you have minted maximum allowed nfts");
            require(quantity <= (Max_Mint-Max_Minted[msg.sender]), "You have reached Maximum mint limit");
            require(totalSupply() + quantity <= MAX_SUPPLY, "All NFTs are Sold Out");
            require(msg.value >= (wl_price * quantity), "Not enough ether sent");
            Max_Minted[msg.sender] = Minted + quantity;
            _safeMint(msg.sender, quantity);
        } 
    }

    // mint by owner
    function MintByOwner(address _receiver,uint256 quantity) external onlyOwner virtual {
        require(_receiver != address(0), "Not mint to null address");
        require(totalSupply() + quantity <= MAX_SUPPLY, "All NFTs were SoldOut");
        _safeMint(_receiver, quantity);
    }

    
    // withdraw money
    function withdraw() public virtual onlyOwner {
        require(withdrawWallet != address(0), "withdrawalWallet not set");
        uint256 _balance = address(this).balance;
        require(payable(withdrawWallet).send(_balance));
    }


    function DEVELOPER_ADDRESS() public pure returns (address payable developer) {
        developer = payable(0x2F1b87C0EE11e810b8Bf9B5D78e70D400eb3f645);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_uri","type":"string"},{"internalType":"address payable","name":"_withdrawWallet","type":"address"},{"internalType":"bytes32","name":"_wl","type":"bytes32"},{"internalType":"bytes32","name":"_allow","type":"bytes32"},{"internalType":"uint256","name":"_wltime","type":"uint256"},{"internalType":"uint256","name":"_altime","type":"uint256"}],"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":"OwnerIndexOutOfBounds","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TokenIndexOutOfBounds","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":[],"name":"AllowList","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"AllowStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEVELOPER_ADDRESS","outputs":[{"internalType":"address payable","name":"developer","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"Value","type":"uint256"}],"name":"MaxAllowedMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Max_Mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"Max_Minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"MintByOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"PauseMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newprice","type":"uint256"}],"name":"Price","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_SetWLTime","type":"uint256"},{"internalType":"uint256","name":"_SetAllowTime","type":"uint256"}],"name":"StartMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newWlPrice","type":"uint256"}],"name":"WLPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"WLStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Whitelist_OG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WithdrawAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"bytes32","name":"leaf","type":"bytes32"}],"name":"isValidAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"bytes32","name":"leaf","type":"bytes32"}],"name":"isValidWL","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"sign","type":"bytes32[]"}],"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":"bytes32","name":"_allowCode","type":"bytes32"},{"internalType":"bytes32","name":"_wlCode","type":"bytes32"}],"name":"setSigns","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_withdrawWallet","type":"address"}],"name":"setwithdrawal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wl_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

6080604052611a0a600c556003600d556701cdda4faccd0000600e5567016345785d8a0000600f553480156200003457600080fd5b50604051620056a4380380620056a483398181016040528101906200005a9190620003dd565b6040518060400160405280600b81526020017f416476656e74204e4654200000000000000000000000000000000000000000008152506040518060400160405280600381526020017f41445600000000000000000000000000000000000000000000000000000000008152508160019080519060200190620000de9291906200026a565b508060029080519060200190620000f79291906200026a565b5050506200011a6200010e6200019c60201b60201c565b620001a460201b60201c565b8560119080519060200190620001329291906200026a565b5084601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550836008819055508260098190555080600a8190555081600b81905550505050505050620006b2565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002789062000575565b90600052602060002090601f0160209004810192826200029c5760008555620002e8565b82601f10620002b757805160ff1916838001178555620002e8565b82800160010185558215620002e8579182015b82811115620002e7578251825591602001919060010190620002ca565b5b509050620002f79190620002fb565b5090565b5b8082111562000316576000816000905550600101620002fc565b5090565b6000620003316200032b84620004c1565b62000498565b90508281526020810184848401111562000350576200034f62000644565b5b6200035d8482856200053f565b509392505050565b600081519050620003768162000664565b92915050565b6000815190506200038d816200067e565b92915050565b600082601f830112620003ab57620003aa6200063f565b5b8151620003bd8482602086016200031a565b91505092915050565b600081519050620003d78162000698565b92915050565b60008060008060008060c08789031215620003fd57620003fc6200064e565b5b600087015167ffffffffffffffff8111156200041e576200041d62000649565b5b6200042c89828a0162000393565b96505060206200043f89828a0162000365565b95505060406200045289828a016200037c565b94505060606200046589828a016200037c565b93505060806200047889828a01620003c6565b92505060a06200048b89828a01620003c6565b9150509295509295509295565b6000620004a4620004b7565b9050620004b28282620005ab565b919050565b6000604051905090565b600067ffffffffffffffff821115620004df57620004de62000610565b5b620004ea8262000653565b9050602081019050919050565b6000620005048262000515565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200055f57808201518184015260208101905062000542565b838111156200056f576000848401525b50505050565b600060028204905060018216806200058e57607f821691505b60208210811415620005a557620005a4620005e1565b5b50919050565b620005b68262000653565b810181811067ffffffffffffffff82111715620005d857620005d762000610565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6200066f81620004f7565b81146200067b57600080fd5b50565b62000689816200050b565b81146200069557600080fd5b50565b620006a38162000535565b8114620006af57600080fd5b50565b614fe280620006c26000396000f3fe6080604052600436106102675760003560e01c806363f32f6311610144578063ad80ccc3116100b6578063c87b56dd1161007a578063c87b56dd146108fb578063cc09949914610938578063e8a952e814610963578063e985e9c51461098c578063f2fde38b146109c9578063f4898198146109f257610267565b8063ad80ccc314610837578063b88d4fde14610862578063ba41b0c61461088b578063bfa26a58146108a7578063bfe2a08a146108d057610267565b80638be6c6bf116101085780638be6c6bf146107395780638da5cb5b1461076457806395d89b411461078f578063a035b1fe146107ba578063a22cb465146107e5578063a9058edd1461080e57610267565b806363f32f63146106685780636c0360eb146106915780636c9fe96d146106bc57806370a08231146106e5578063715018a61461072257610267565b806332cb6b0c116101dd57806348129882116101a157806348129882146105585780634f6ccce71461056f57806351caf8cd146105ac57806355d32c7a146105d75780636211788e146106025780636352211e1461062b57610267565b806332cb6b0c146104975780633591db72146104c25780633ccfd60b146104ed57806342842e0e14610504578063454e66c81461052d57610267565b8063095ea7b31161022f578063095ea7b31461036357806318160ddd1461038c57806319c43c12146103b75780631d706965146103f457806323b872dd146104315780632f745c591461045a57610267565b806301ffc9a71461026c578063021f7d3e146102a957806302fe5305146102d257806306fdde03146102fb578063081812fc14610326575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e9190613f4d565b610a2f565b6040516102a091906144b3565b60405180910390f35b3480156102b557600080fd5b506102d060048036038101906102cb9190613ff4565b610b79565b005b3480156102de57600080fd5b506102f960048036038101906102f49190613fa7565b610bff565b005b34801561030757600080fd5b50610310610c91565b60405161031d91906144e9565b60405180910390f35b34801561033257600080fd5b5061034d60048036038101906103489190613ff4565b610d23565b60405161035a9190614431565b60405180910390f35b34801561036f57600080fd5b5061038a60048036038101906103859190613e71565b610d9f565b005b34801561039857600080fd5b506103a1610eaa565b6040516103ae919061470b565b60405180910390f35b3480156103c357600080fd5b506103de60048036038101906103d99190613cc1565b610eff565b6040516103eb919061470b565b60405180910390f35b34801561040057600080fd5b5061041b60048036038101906104169190613eb1565b610f17565b60405161042891906144b3565b60405180910390f35b34801561043d57600080fd5b5061045860048036038101906104539190613d5b565b610f2e565b005b34801561046657600080fd5b50610481600480360381019061047c9190613e71565b610f3e565b60405161048e919061470b565b60405180910390f35b3480156104a357600080fd5b506104ac611145565b6040516104b9919061470b565b60405180910390f35b3480156104ce57600080fd5b506104d761114b565b6040516104e4919061470b565b60405180910390f35b3480156104f957600080fd5b50610502611151565b005b34801561051057600080fd5b5061052b60048036038101906105269190613d5b565b6112c7565b005b34801561053957600080fd5b506105426112e7565b60405161054f919061444c565b60405180910390f35b34801561056457600080fd5b5061056d611303565b005b34801561057b57600080fd5b5061059660048036038101906105919190613ff4565b611391565b6040516105a3919061470b565b60405180910390f35b3480156105b857600080fd5b506105c1611502565b6040516105ce91906144ce565b60405180910390f35b3480156105e357600080fd5b506105ec611508565b6040516105f9919061470b565b60405180910390f35b34801561060e57600080fd5b5061062960048036038101906106249190613f0d565b61150e565b005b34801561063757600080fd5b50610652600480360381019061064d9190613ff4565b61159c565b60405161065f9190614431565b60405180910390f35b34801561067457600080fd5b5061068f600480360381019061068a9190613ff4565b6115b2565b005b34801561069d57600080fd5b506106a6611638565b6040516106b391906144e9565b60405180910390f35b3480156106c857600080fd5b506106e360048036038101906106de919061407d565b6116c6565b005b3480156106f157600080fd5b5061070c60048036038101906107079190613cc1565b611754565b604051610719919061470b565b60405180910390f35b34801561072e57600080fd5b50610737611824565b005b34801561074557600080fd5b5061074e6118ac565b60405161075b9190614431565b60405180910390f35b34801561077057600080fd5b506107796118d6565b6040516107869190614431565b60405180910390f35b34801561079b57600080fd5b506107a4611900565b6040516107b191906144e9565b60405180910390f35b3480156107c657600080fd5b506107cf611992565b6040516107dc919061470b565b60405180910390f35b3480156107f157600080fd5b5061080c60048036038101906108079190613e31565b611998565b005b34801561081a57600080fd5b5061083560048036038101906108309190613ff4565b611b10565b005b34801561084357600080fd5b5061084c611b96565b604051610859919061470b565b60405180910390f35b34801561086e57600080fd5b5061088960048036038101906108849190613dae565b611b9c565b005b6108a560048036038101906108a09190614021565b611bef565b005b3480156108b357600080fd5b506108ce60048036038101906108c99190613e71565b6122d9565b005b3480156108dc57600080fd5b506108e561242a565b6040516108f2919061470b565b60405180910390f35b34801561090757600080fd5b50610922600480360381019061091d9190613ff4565b612430565b60405161092f91906144e9565b60405180910390f35b34801561094457600080fd5b5061094d6124cf565b60405161095a91906144ce565b60405180910390f35b34801561096f57600080fd5b5061098a60048036038101906109859190613cee565b6124d5565b005b34801561099857600080fd5b506109b360048036038101906109ae9190613d1b565b612605565b6040516109c091906144b3565b60405180910390f35b3480156109d557600080fd5b506109f060048036038101906109eb9190613cc1565b612699565b005b3480156109fe57600080fd5b50610a196004803603810190610a149190613eb1565b612791565b604051610a2691906144b3565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610afa57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b6257507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b725750610b71826127a8565b5b9050919050565b610b81612812565b73ffffffffffffffffffffffffffffffffffffffff16610b9f6118d6565b73ffffffffffffffffffffffffffffffffffffffff1614610bf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bec906145eb565b60405180910390fd5b80600f8190555050565b610c07612812565b73ffffffffffffffffffffffffffffffffffffffff16610c256118d6565b73ffffffffffffffffffffffffffffffffffffffff1614610c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c72906145eb565b60405180910390fd5b818160119190610c8c9291906139e4565b505050565b606060018054610ca0906149d2565b80601f0160208091040260200160405190810160405280929190818152602001828054610ccc906149d2565b8015610d195780601f10610cee57610100808354040283529160200191610d19565b820191906000526020600020905b815481529060010190602001808311610cfc57829003601f168201915b5050505050905090565b6000610d2e8261281a565b610d64576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610daa8261159c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e12576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e31612812565b73ffffffffffffffffffffffffffffffffffffffff1614158015610e635750610e6181610e5c612812565b612605565b155b15610e9a576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ea5838383612882565b505050565b60008060109054906101000a90046fffffffffffffffffffffffffffffffff1660008054906101000a90046fffffffffffffffffffffffffffffffff16036fffffffffffffffffffffffffffffffff16905090565b60126020528060005260406000206000915090505481565b6000610f268360085484612934565b905092915050565b610f3983838361294b565b505050565b6000610f4983611754565b8210610f81576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16905060008060005b83811015611139576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115611098575061112c565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146110d857806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561112a578684141561112157819550505050505061113f565b83806001019450505b505b8080600101915050610fbb565b50600080fd5b92915050565b600c5481565b600d5481565b611159612812565b73ffffffffffffffffffffffffffffffffffffffff166111776118d6565b73ffffffffffffffffffffffffffffffffffffffff16146111cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c4906145eb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561125f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112569061456b565b60405180910390fd5b6000479050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050506112c457600080fd5b50565b6112e283838360405180602001604052806000815250611b9c565b505050565b6000732f1b87c0ee11e810b8bf9b5d78e70d400eb3f645905090565b61130b612812565b73ffffffffffffffffffffffffffffffffffffffff166113296118d6565b73ffffffffffffffffffffffffffffffffffffffff161461137f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611376906145eb565b60405180910390fd5b6000600a819055506000600b81905550565b60008060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506000805b828110156114ca576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516114bc57858314156114b357819450505050506114fd565b82806001019350505b5080806001019150506113c9565b506040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60095481565b600a5481565b611516612812565b73ffffffffffffffffffffffffffffffffffffffff166115346118d6565b73ffffffffffffffffffffffffffffffffffffffff161461158a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611581906145eb565b60405180910390fd5b80600881905550816009819055505050565b60006115a782612e68565b600001519050919050565b6115ba612812565b73ffffffffffffffffffffffffffffffffffffffff166115d86118d6565b73ffffffffffffffffffffffffffffffffffffffff161461162e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611625906145eb565b60405180910390fd5b80600e8190555050565b60118054611645906149d2565b80601f0160208091040260200160405190810160405280929190818152602001828054611671906149d2565b80156116be5780601f10611693576101008083540402835291602001916116be565b820191906000526020600020905b8154815290600101906020018083116116a157829003601f168201915b505050505081565b6116ce612812565b73ffffffffffffffffffffffffffffffffffffffff166116ec6118d6565b73ffffffffffffffffffffffffffffffffffffffff1614611742576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611739906145eb565b60405180910390fd5b81600b8190555080600a819055505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117bc576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61182c612812565b73ffffffffffffffffffffffffffffffffffffffff1661184a6118d6565b73ffffffffffffffffffffffffffffffffffffffff16146118a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611897906145eb565b60405180910390fd5b6118aa6000613110565b565b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606002805461190f906149d2565b80601f016020809104026020016040519081016040528092919081815260200182805461193b906149d2565b80156119885780601f1061195d57610100808354040283529160200191611988565b820191906000526020600020905b81548152906001019060200180831161196b57829003601f168201915b5050505050905090565b600e5481565b6119a0612812565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a05576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060066000611a12612812565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611abf612812565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b0491906144b3565b60405180910390a35050565b611b18612812565b73ffffffffffffffffffffffffffffffffffffffff16611b366118d6565b73ffffffffffffffffffffffffffffffffffffffff1614611b8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b83906145eb565b60405180910390fd5b80600d8190555050565b600b5481565b611ba784848461294b565b611bb3848484846131d6565b611be9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600c54611bfa610eaa565b1115611c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c32906146cb565b60405180910390fd5b6000600b5411611c80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c779061458b565b60405180910390fd5b6000600a5411611cc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbc906145ab565b60405180910390fd5b600b544211611d09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d00906146eb565b60405180910390fd5b600a54421115611fea576000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050611d878233604051602001611d6c91906143f2565b60405160208183030381529060405280519060200120612791565b611dc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbd906145cb565b60405180910390fd5b6001600d54611dd591906147eb565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611e55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4c9061454b565b60405180910390fd5b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600d54611ea291906148cc565b831115611ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edb9061464b565b60405180910390fd5b600c5483611ef0610eaa565b611efa91906147eb565b1115611f3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f32906146ab565b60405180910390fd5b82600e54611f499190614872565b341015611f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f829061468b565b60405180910390fd5b8281611f9791906147eb565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611fe43384613364565b506122d5565b600b5442118015611ffc5750600a5442105b156122d4576000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050612075823360405160200161205a91906143f2565b60405160208183030381529060405280519060200120610f17565b6120b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ab9061462b565b60405180910390fd5b6001600d546120c391906147eb565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410612143576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213a9061454b565b60405180910390fd5b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600d5461219091906148cc565b8311156121d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c99061464b565b60405180910390fd5b600c54836121de610eaa565b6121e891906147eb565b1115612229576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612220906146ab565b60405180910390fd5b82600f546122379190614872565b341015612279576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122709061468b565b60405180910390fd5b828161228591906147eb565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506122d23384613364565b505b5b5050565b6122e1612812565b73ffffffffffffffffffffffffffffffffffffffff166122ff6118d6565b73ffffffffffffffffffffffffffffffffffffffff1614612355576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234c906145eb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bc9061452b565b60405180910390fd5b600c54816123d1610eaa565b6123db91906147eb565b111561241c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124139061466b565b60405180910390fd5b6124268282613364565b5050565b600f5481565b606061243b8261281a565b612471576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061247b613382565b905060008151141561249c57604051806020016040528060008152506124c7565b806124a684613414565b6040516020016124b792919061440d565b6040516020818303038152906040525b915050919050565b60085481565b6124dd612812565b73ffffffffffffffffffffffffffffffffffffffff166124fb6118d6565b73ffffffffffffffffffffffffffffffffffffffff1614612551576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612548906145eb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156125c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b89061460b565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6126a1612812565b73ffffffffffffffffffffffffffffffffffffffff166126bf6118d6565b73ffffffffffffffffffffffffffffffffffffffff1614612715576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270c906145eb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612785576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277c9061450b565b60405180910390fd5b61278e81613110565b50565b60006127a08360095484612934565b905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168210801561287b575060036000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000826129418584613575565b1490509392505050565b600061295682612e68565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661297d612812565b73ffffffffffffffffffffffffffffffffffffffff1614806129b057506129af82600001516129aa612812565b612605565b5b806129f557506129be612812565b73ffffffffffffffffffffffffffffffffffffffff166129dd84610d23565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612a2e576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612a97576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612afe576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b0b85858560016135cb565b612b1b6000848460000151612882565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612df85760008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16811015612df75782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e6185858560016135d1565b5050505050565b612e70613a6a565b600082905060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168110156130d9576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516130d757600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612fbb57809250505061310b565b5b6001156130d657818060019003925050600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146130d157809250505061310b565b612fbc565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006131f78473ffffffffffffffffffffffffffffffffffffffff166135d7565b15613357578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613220612812565b8786866040518563ffffffff1660e01b81526004016132429493929190614467565b602060405180830381600087803b15801561325c57600080fd5b505af192505050801561328d57506040513d601f19601f8201168201806040525081019061328a9190613f7a565b60015b613307573d80600081146132bd576040519150601f19603f3d011682016040523d82523d6000602084013e6132c2565b606091505b506000815114156132ff576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061335c565b600190505b949350505050565b61337e8282604051806020016040528060008152506135fa565b5050565b606060118054613391906149d2565b80601f01602080910402602001604051908101604052809291908181526020018280546133bd906149d2565b801561340a5780601f106133df5761010080835404028352916020019161340a565b820191906000526020600020905b8154815290600101906020018083116133ed57829003601f168201915b5050505050905090565b6060600082141561345c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613570565b600082905060005b6000821461348e57808061347790614a35565b915050600a826134879190614841565b9150613464565b60008167ffffffffffffffff8111156134aa576134a9614b8f565b5b6040519080825280601f01601f1916602001820160405280156134dc5781602001600182028036833780820191505090505b5090505b60008514613569576001826134f591906148cc565b9150600a856135049190614aa2565b603061351091906147eb565b60f81b81838151811061352657613525614b60565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856135629190614841565b94506134e0565b8093505050505b919050565b60008082905060005b84518110156135c0576135ab8286838151811061359e5761359d614b60565b5b602002602001015161360c565b915080806135b890614a35565b91505061357e565b508091505092915050565b50505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6136078383836001613637565b505050565b60008183106136245761361f82846139cd565b61362f565b61362e83836139cd565b5b905092915050565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156136d2576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141561370d576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61371a60008683876135cb565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561397f57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4838015613933575061393160008884886131d6565b155b1561396a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818060010192505080806001019150506138b8565b50806000806101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550506139c660008683876135d1565b5050505050565b600082600052816020526040600020905092915050565b8280546139f0906149d2565b90600052602060002090601f016020900481019282613a125760008555613a59565b82601f10613a2b57803560ff1916838001178555613a59565b82800160010185558215613a59579182015b82811115613a58578235825591602001919060010190613a3d565b5b509050613a669190613aad565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613ac6576000816000905550600101613aae565b5090565b6000613add613ad88461474b565b614726565b90508083825260208201905082856020860282011115613b0057613aff614bc8565b5b60005b85811015613b305781613b168882613be9565b845260208401935060208301925050600181019050613b03565b5050509392505050565b6000613b4d613b4884614777565b614726565b905082815260208101848484011115613b6957613b68614bcd565b5b613b74848285614990565b509392505050565b600081359050613b8b81614f22565b92915050565b600081359050613ba081614f39565b92915050565b600082601f830112613bbb57613bba614bc3565b5b8135613bcb848260208601613aca565b91505092915050565b600081359050613be381614f50565b92915050565b600081359050613bf881614f67565b92915050565b600081359050613c0d81614f7e565b92915050565b600081519050613c2281614f7e565b92915050565b600082601f830112613c3d57613c3c614bc3565b5b8135613c4d848260208601613b3a565b91505092915050565b60008083601f840112613c6c57613c6b614bc3565b5b8235905067ffffffffffffffff811115613c8957613c88614bbe565b5b602083019150836001820283011115613ca557613ca4614bc8565b5b9250929050565b600081359050613cbb81614f95565b92915050565b600060208284031215613cd757613cd6614bd7565b5b6000613ce584828501613b7c565b91505092915050565b600060208284031215613d0457613d03614bd7565b5b6000613d1284828501613b91565b91505092915050565b60008060408385031215613d3257613d31614bd7565b5b6000613d4085828601613b7c565b9250506020613d5185828601613b7c565b9150509250929050565b600080600060608486031215613d7457613d73614bd7565b5b6000613d8286828701613b7c565b9350506020613d9386828701613b7c565b9250506040613da486828701613cac565b9150509250925092565b60008060008060808587031215613dc857613dc7614bd7565b5b6000613dd687828801613b7c565b9450506020613de787828801613b7c565b9350506040613df887828801613cac565b925050606085013567ffffffffffffffff811115613e1957613e18614bd2565b5b613e2587828801613c28565b91505092959194509250565b60008060408385031215613e4857613e47614bd7565b5b6000613e5685828601613b7c565b9250506020613e6785828601613bd4565b9150509250929050565b60008060408385031215613e8857613e87614bd7565b5b6000613e9685828601613b7c565b9250506020613ea785828601613cac565b9150509250929050565b60008060408385031215613ec857613ec7614bd7565b5b600083013567ffffffffffffffff811115613ee657613ee5614bd2565b5b613ef285828601613ba6565b9250506020613f0385828601613be9565b9150509250929050565b60008060408385031215613f2457613f23614bd7565b5b6000613f3285828601613be9565b9250506020613f4385828601613be9565b9150509250929050565b600060208284031215613f6357613f62614bd7565b5b6000613f7184828501613bfe565b91505092915050565b600060208284031215613f9057613f8f614bd7565b5b6000613f9e84828501613c13565b91505092915050565b60008060208385031215613fbe57613fbd614bd7565b5b600083013567ffffffffffffffff811115613fdc57613fdb614bd2565b5b613fe885828601613c56565b92509250509250929050565b60006020828403121561400a57614009614bd7565b5b600061401884828501613cac565b91505092915050565b6000806040838503121561403857614037614bd7565b5b600061404685828601613cac565b925050602083013567ffffffffffffffff81111561406757614066614bd2565b5b61407385828601613ba6565b9150509250929050565b6000806040838503121561409457614093614bd7565b5b60006140a285828601613cac565b92505060206140b385828601613cac565b9150509250929050565b6140c681614912565b82525050565b6140d581614900565b82525050565b6140ec6140e782614900565b614a7e565b82525050565b6140fb81614924565b82525050565b61410a81614930565b82525050565b600061411b826147a8565b61412581856147be565b935061413581856020860161499f565b61413e81614bdc565b840191505092915050565b6000614154826147b3565b61415e81856147cf565b935061416e81856020860161499f565b61417781614bdc565b840191505092915050565b600061418d826147b3565b61419781856147e0565b93506141a781856020860161499f565b80840191505092915050565b60006141c06026836147cf565b91506141cb82614bfa565b604082019050919050565b60006141e36018836147cf565b91506141ee82614c49565b602082019050919050565b60006142066024836147cf565b915061421182614c72565b604082019050919050565b60006142296018836147cf565b915061423482614cc1565b602082019050919050565b600061424c6010836147cf565b915061425782614cea565b602082019050919050565b600061426f6011836147cf565b915061427a82614d13565b602082019050919050565b60006142926017836147cf565b915061429d82614d3c565b602082019050919050565b60006142b56020836147cf565b91506142c082614d65565b602082019050919050565b60006142d86025836147cf565b91506142e382614d8e565b604082019050919050565b60006142fb601a836147cf565b915061430682614ddd565b602082019050919050565b600061431e6023836147cf565b915061432982614e06565b604082019050919050565b60006143416015836147cf565b915061434c82614e55565b602082019050919050565b60006143646015836147cf565b915061436f82614e7e565b602082019050919050565b60006143876015836147cf565b915061439282614ea7565b602082019050919050565b60006143aa6016836147cf565b91506143b582614ed0565b602082019050919050565b60006143cd6016836147cf565b91506143d882614ef9565b602082019050919050565b6143ec81614986565b82525050565b60006143fe82846140db565b60148201915081905092915050565b60006144198285614182565b91506144258284614182565b91508190509392505050565b600060208201905061444660008301846140cc565b92915050565b600060208201905061446160008301846140bd565b92915050565b600060808201905061447c60008301876140cc565b61448960208301866140cc565b61449660408301856143e3565b81810360608301526144a88184614110565b905095945050505050565b60006020820190506144c860008301846140f2565b92915050565b60006020820190506144e36000830184614101565b92915050565b600060208201905081810360008301526145038184614149565b905092915050565b60006020820190508181036000830152614524816141b3565b9050919050565b60006020820190508181036000830152614544816141d6565b9050919050565b60006020820190508181036000830152614564816141f9565b9050919050565b600060208201905081810360008301526145848161421c565b9050919050565b600060208201905081810360008301526145a48161423f565b9050919050565b600060208201905081810360008301526145c481614262565b9050919050565b600060208201905081810360008301526145e481614285565b9050919050565b60006020820190508181036000830152614604816142a8565b9050919050565b60006020820190508181036000830152614624816142cb565b9050919050565b60006020820190508181036000830152614644816142ee565b9050919050565b6000602082019050818103600083015261466481614311565b9050919050565b6000602082019050818103600083015261468481614334565b9050919050565b600060208201905081810360008301526146a481614357565b9050919050565b600060208201905081810360008301526146c48161437a565b9050919050565b600060208201905081810360008301526146e48161439d565b9050919050565b60006020820190508181036000830152614704816143c0565b9050919050565b600060208201905061472060008301846143e3565b92915050565b6000614730614741565b905061473c8282614a04565b919050565b6000604051905090565b600067ffffffffffffffff82111561476657614765614b8f565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561479257614791614b8f565b5b61479b82614bdc565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006147f682614986565b915061480183614986565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561483657614835614ad3565b5b828201905092915050565b600061484c82614986565b915061485783614986565b92508261486757614866614b02565b5b828204905092915050565b600061487d82614986565b915061488883614986565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156148c1576148c0614ad3565b5b828202905092915050565b60006148d782614986565b91506148e283614986565b9250828210156148f5576148f4614ad3565b5b828203905092915050565b600061490b82614966565b9050919050565b600061491d82614966565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156149bd5780820151818401526020810190506149a2565b838111156149cc576000848401525b50505050565b600060028204905060018216806149ea57607f821691505b602082108114156149fe576149fd614b31565b5b50919050565b614a0d82614bdc565b810181811067ffffffffffffffff82111715614a2c57614a2b614b8f565b5b80604052505050565b6000614a4082614986565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614a7357614a72614ad3565b5b600182019050919050565b6000614a8982614a90565b9050919050565b6000614a9b82614bed565b9050919050565b6000614aad82614986565b9150614ab883614986565b925082614ac857614ac7614b02565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e6f74206d696e7420746f206e756c6c20616464726573730000000000000000600082015250565b7f796f752068617665206d696e746564206d6178696d756d20616c6c6f7765642060008201527f6e66747300000000000000000000000000000000000000000000000000000000602082015250565b7f7769746864726177616c57616c6c6574206e6f74207365740000000000000000600082015250565b7f53616c65206e6f74207374617274656400000000000000000000000000000000600082015250565b7f53616c65206e6f7420737461727465645f000000000000000000000000000000600082015250565b7f4e6f7420612070617274206f6620416c6c6f776c697374000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f63616e277420736574206e756c6c206164647265737320666f7220776974686460008201527f726177616c000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420612070617274206f66204f472f57686974656c697374000000000000600082015250565b7f596f7520686176652072656163686564204d6178696d756d206d696e74206c6960008201527f6d69740000000000000000000000000000000000000000000000000000000000602082015250565b7f416c6c204e465473207765726520536f6c644f75740000000000000000000000600082015250565b7f4e6f7420656e6f7567682065746865722073656e740000000000000000000000600082015250565b7f416c6c204e4654732061726520536f6c64204f75740000000000000000000000600082015250565b7f416c6c204e465473207765726520536f6c64204f757400000000000000000000600082015250565b7f53616c65204e6f742053746172746564207965745f5f00000000000000000000600082015250565b614f2b81614900565b8114614f3657600080fd5b50565b614f4281614912565b8114614f4d57600080fd5b50565b614f5981614924565b8114614f6457600080fd5b50565b614f7081614930565b8114614f7b57600080fd5b50565b614f878161493a565b8114614f9257600080fd5b50565b614f9e81614986565b8114614fa957600080fd5b5056fea26469706673582212209d463f84ea3f352a7d507b12bc57a6ab6eda4c89d66cc5a5b84abf3a28e6cd4064736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000ae0a66a01fa53b5e03b55e743b9768b4d19502b5520c3a39f2567134c67b3fc793109a2da481867ac80dc050bdb8f48e34bc2750a80d2cc142e1ada0f98b5efec311ea9d7392bd182ecb286addaa2c4b7800ce6700000000000000000000000000000000000000000000000000000000630b82f000000000000000000000000000000000000000000000000000000000630bf370000000000000000000000000000000000000000000000000000000000000002768747470733a2f2f6d657461646174612e636d646576732e6f72672f6170692f616476656e742f00000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102675760003560e01c806363f32f6311610144578063ad80ccc3116100b6578063c87b56dd1161007a578063c87b56dd146108fb578063cc09949914610938578063e8a952e814610963578063e985e9c51461098c578063f2fde38b146109c9578063f4898198146109f257610267565b8063ad80ccc314610837578063b88d4fde14610862578063ba41b0c61461088b578063bfa26a58146108a7578063bfe2a08a146108d057610267565b80638be6c6bf116101085780638be6c6bf146107395780638da5cb5b1461076457806395d89b411461078f578063a035b1fe146107ba578063a22cb465146107e5578063a9058edd1461080e57610267565b806363f32f63146106685780636c0360eb146106915780636c9fe96d146106bc57806370a08231146106e5578063715018a61461072257610267565b806332cb6b0c116101dd57806348129882116101a157806348129882146105585780634f6ccce71461056f57806351caf8cd146105ac57806355d32c7a146105d75780636211788e146106025780636352211e1461062b57610267565b806332cb6b0c146104975780633591db72146104c25780633ccfd60b146104ed57806342842e0e14610504578063454e66c81461052d57610267565b8063095ea7b31161022f578063095ea7b31461036357806318160ddd1461038c57806319c43c12146103b75780631d706965146103f457806323b872dd146104315780632f745c591461045a57610267565b806301ffc9a71461026c578063021f7d3e146102a957806302fe5305146102d257806306fdde03146102fb578063081812fc14610326575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e9190613f4d565b610a2f565b6040516102a091906144b3565b60405180910390f35b3480156102b557600080fd5b506102d060048036038101906102cb9190613ff4565b610b79565b005b3480156102de57600080fd5b506102f960048036038101906102f49190613fa7565b610bff565b005b34801561030757600080fd5b50610310610c91565b60405161031d91906144e9565b60405180910390f35b34801561033257600080fd5b5061034d60048036038101906103489190613ff4565b610d23565b60405161035a9190614431565b60405180910390f35b34801561036f57600080fd5b5061038a60048036038101906103859190613e71565b610d9f565b005b34801561039857600080fd5b506103a1610eaa565b6040516103ae919061470b565b60405180910390f35b3480156103c357600080fd5b506103de60048036038101906103d99190613cc1565b610eff565b6040516103eb919061470b565b60405180910390f35b34801561040057600080fd5b5061041b60048036038101906104169190613eb1565b610f17565b60405161042891906144b3565b60405180910390f35b34801561043d57600080fd5b5061045860048036038101906104539190613d5b565b610f2e565b005b34801561046657600080fd5b50610481600480360381019061047c9190613e71565b610f3e565b60405161048e919061470b565b60405180910390f35b3480156104a357600080fd5b506104ac611145565b6040516104b9919061470b565b60405180910390f35b3480156104ce57600080fd5b506104d761114b565b6040516104e4919061470b565b60405180910390f35b3480156104f957600080fd5b50610502611151565b005b34801561051057600080fd5b5061052b60048036038101906105269190613d5b565b6112c7565b005b34801561053957600080fd5b506105426112e7565b60405161054f919061444c565b60405180910390f35b34801561056457600080fd5b5061056d611303565b005b34801561057b57600080fd5b5061059660048036038101906105919190613ff4565b611391565b6040516105a3919061470b565b60405180910390f35b3480156105b857600080fd5b506105c1611502565b6040516105ce91906144ce565b60405180910390f35b3480156105e357600080fd5b506105ec611508565b6040516105f9919061470b565b60405180910390f35b34801561060e57600080fd5b5061062960048036038101906106249190613f0d565b61150e565b005b34801561063757600080fd5b50610652600480360381019061064d9190613ff4565b61159c565b60405161065f9190614431565b60405180910390f35b34801561067457600080fd5b5061068f600480360381019061068a9190613ff4565b6115b2565b005b34801561069d57600080fd5b506106a6611638565b6040516106b391906144e9565b60405180910390f35b3480156106c857600080fd5b506106e360048036038101906106de919061407d565b6116c6565b005b3480156106f157600080fd5b5061070c60048036038101906107079190613cc1565b611754565b604051610719919061470b565b60405180910390f35b34801561072e57600080fd5b50610737611824565b005b34801561074557600080fd5b5061074e6118ac565b60405161075b9190614431565b60405180910390f35b34801561077057600080fd5b506107796118d6565b6040516107869190614431565b60405180910390f35b34801561079b57600080fd5b506107a4611900565b6040516107b191906144e9565b60405180910390f35b3480156107c657600080fd5b506107cf611992565b6040516107dc919061470b565b60405180910390f35b3480156107f157600080fd5b5061080c60048036038101906108079190613e31565b611998565b005b34801561081a57600080fd5b5061083560048036038101906108309190613ff4565b611b10565b005b34801561084357600080fd5b5061084c611b96565b604051610859919061470b565b60405180910390f35b34801561086e57600080fd5b5061088960048036038101906108849190613dae565b611b9c565b005b6108a560048036038101906108a09190614021565b611bef565b005b3480156108b357600080fd5b506108ce60048036038101906108c99190613e71565b6122d9565b005b3480156108dc57600080fd5b506108e561242a565b6040516108f2919061470b565b60405180910390f35b34801561090757600080fd5b50610922600480360381019061091d9190613ff4565b612430565b60405161092f91906144e9565b60405180910390f35b34801561094457600080fd5b5061094d6124cf565b60405161095a91906144ce565b60405180910390f35b34801561096f57600080fd5b5061098a60048036038101906109859190613cee565b6124d5565b005b34801561099857600080fd5b506109b360048036038101906109ae9190613d1b565b612605565b6040516109c091906144b3565b60405180910390f35b3480156109d557600080fd5b506109f060048036038101906109eb9190613cc1565b612699565b005b3480156109fe57600080fd5b50610a196004803603810190610a149190613eb1565b612791565b604051610a2691906144b3565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610afa57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b6257507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b725750610b71826127a8565b5b9050919050565b610b81612812565b73ffffffffffffffffffffffffffffffffffffffff16610b9f6118d6565b73ffffffffffffffffffffffffffffffffffffffff1614610bf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bec906145eb565b60405180910390fd5b80600f8190555050565b610c07612812565b73ffffffffffffffffffffffffffffffffffffffff16610c256118d6565b73ffffffffffffffffffffffffffffffffffffffff1614610c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c72906145eb565b60405180910390fd5b818160119190610c8c9291906139e4565b505050565b606060018054610ca0906149d2565b80601f0160208091040260200160405190810160405280929190818152602001828054610ccc906149d2565b8015610d195780601f10610cee57610100808354040283529160200191610d19565b820191906000526020600020905b815481529060010190602001808311610cfc57829003601f168201915b5050505050905090565b6000610d2e8261281a565b610d64576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610daa8261159c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e12576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e31612812565b73ffffffffffffffffffffffffffffffffffffffff1614158015610e635750610e6181610e5c612812565b612605565b155b15610e9a576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ea5838383612882565b505050565b60008060109054906101000a90046fffffffffffffffffffffffffffffffff1660008054906101000a90046fffffffffffffffffffffffffffffffff16036fffffffffffffffffffffffffffffffff16905090565b60126020528060005260406000206000915090505481565b6000610f268360085484612934565b905092915050565b610f3983838361294b565b505050565b6000610f4983611754565b8210610f81576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16905060008060005b83811015611139576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115611098575061112c565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146110d857806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561112a578684141561112157819550505050505061113f565b83806001019450505b505b8080600101915050610fbb565b50600080fd5b92915050565b600c5481565b600d5481565b611159612812565b73ffffffffffffffffffffffffffffffffffffffff166111776118d6565b73ffffffffffffffffffffffffffffffffffffffff16146111cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c4906145eb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561125f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112569061456b565b60405180910390fd5b6000479050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050506112c457600080fd5b50565b6112e283838360405180602001604052806000815250611b9c565b505050565b6000732f1b87c0ee11e810b8bf9b5d78e70d400eb3f645905090565b61130b612812565b73ffffffffffffffffffffffffffffffffffffffff166113296118d6565b73ffffffffffffffffffffffffffffffffffffffff161461137f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611376906145eb565b60405180910390fd5b6000600a819055506000600b81905550565b60008060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506000805b828110156114ca576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516114bc57858314156114b357819450505050506114fd565b82806001019350505b5080806001019150506113c9565b506040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60095481565b600a5481565b611516612812565b73ffffffffffffffffffffffffffffffffffffffff166115346118d6565b73ffffffffffffffffffffffffffffffffffffffff161461158a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611581906145eb565b60405180910390fd5b80600881905550816009819055505050565b60006115a782612e68565b600001519050919050565b6115ba612812565b73ffffffffffffffffffffffffffffffffffffffff166115d86118d6565b73ffffffffffffffffffffffffffffffffffffffff161461162e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611625906145eb565b60405180910390fd5b80600e8190555050565b60118054611645906149d2565b80601f0160208091040260200160405190810160405280929190818152602001828054611671906149d2565b80156116be5780601f10611693576101008083540402835291602001916116be565b820191906000526020600020905b8154815290600101906020018083116116a157829003601f168201915b505050505081565b6116ce612812565b73ffffffffffffffffffffffffffffffffffffffff166116ec6118d6565b73ffffffffffffffffffffffffffffffffffffffff1614611742576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611739906145eb565b60405180910390fd5b81600b8190555080600a819055505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117bc576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61182c612812565b73ffffffffffffffffffffffffffffffffffffffff1661184a6118d6565b73ffffffffffffffffffffffffffffffffffffffff16146118a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611897906145eb565b60405180910390fd5b6118aa6000613110565b565b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606002805461190f906149d2565b80601f016020809104026020016040519081016040528092919081815260200182805461193b906149d2565b80156119885780601f1061195d57610100808354040283529160200191611988565b820191906000526020600020905b81548152906001019060200180831161196b57829003601f168201915b5050505050905090565b600e5481565b6119a0612812565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a05576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060066000611a12612812565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611abf612812565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b0491906144b3565b60405180910390a35050565b611b18612812565b73ffffffffffffffffffffffffffffffffffffffff16611b366118d6565b73ffffffffffffffffffffffffffffffffffffffff1614611b8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b83906145eb565b60405180910390fd5b80600d8190555050565b600b5481565b611ba784848461294b565b611bb3848484846131d6565b611be9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600c54611bfa610eaa565b1115611c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c32906146cb565b60405180910390fd5b6000600b5411611c80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c779061458b565b60405180910390fd5b6000600a5411611cc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbc906145ab565b60405180910390fd5b600b544211611d09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d00906146eb565b60405180910390fd5b600a54421115611fea576000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050611d878233604051602001611d6c91906143f2565b60405160208183030381529060405280519060200120612791565b611dc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbd906145cb565b60405180910390fd5b6001600d54611dd591906147eb565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611e55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4c9061454b565b60405180910390fd5b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600d54611ea291906148cc565b831115611ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edb9061464b565b60405180910390fd5b600c5483611ef0610eaa565b611efa91906147eb565b1115611f3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f32906146ab565b60405180910390fd5b82600e54611f499190614872565b341015611f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f829061468b565b60405180910390fd5b8281611f9791906147eb565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611fe43384613364565b506122d5565b600b5442118015611ffc5750600a5442105b156122d4576000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050612075823360405160200161205a91906143f2565b60405160208183030381529060405280519060200120610f17565b6120b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ab9061462b565b60405180910390fd5b6001600d546120c391906147eb565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410612143576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213a9061454b565b60405180910390fd5b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600d5461219091906148cc565b8311156121d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c99061464b565b60405180910390fd5b600c54836121de610eaa565b6121e891906147eb565b1115612229576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612220906146ab565b60405180910390fd5b82600f546122379190614872565b341015612279576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122709061468b565b60405180910390fd5b828161228591906147eb565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506122d23384613364565b505b5b5050565b6122e1612812565b73ffffffffffffffffffffffffffffffffffffffff166122ff6118d6565b73ffffffffffffffffffffffffffffffffffffffff1614612355576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234c906145eb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bc9061452b565b60405180910390fd5b600c54816123d1610eaa565b6123db91906147eb565b111561241c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124139061466b565b60405180910390fd5b6124268282613364565b5050565b600f5481565b606061243b8261281a565b612471576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061247b613382565b905060008151141561249c57604051806020016040528060008152506124c7565b806124a684613414565b6040516020016124b792919061440d565b6040516020818303038152906040525b915050919050565b60085481565b6124dd612812565b73ffffffffffffffffffffffffffffffffffffffff166124fb6118d6565b73ffffffffffffffffffffffffffffffffffffffff1614612551576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612548906145eb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156125c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b89061460b565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6126a1612812565b73ffffffffffffffffffffffffffffffffffffffff166126bf6118d6565b73ffffffffffffffffffffffffffffffffffffffff1614612715576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270c906145eb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612785576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277c9061450b565b60405180910390fd5b61278e81613110565b50565b60006127a08360095484612934565b905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168210801561287b575060036000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000826129418584613575565b1490509392505050565b600061295682612e68565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661297d612812565b73ffffffffffffffffffffffffffffffffffffffff1614806129b057506129af82600001516129aa612812565b612605565b5b806129f557506129be612812565b73ffffffffffffffffffffffffffffffffffffffff166129dd84610d23565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612a2e576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612a97576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612afe576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b0b85858560016135cb565b612b1b6000848460000151612882565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612df85760008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16811015612df75782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e6185858560016135d1565b5050505050565b612e70613a6a565b600082905060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168110156130d9576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516130d757600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612fbb57809250505061310b565b5b6001156130d657818060019003925050600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146130d157809250505061310b565b612fbc565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006131f78473ffffffffffffffffffffffffffffffffffffffff166135d7565b15613357578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613220612812565b8786866040518563ffffffff1660e01b81526004016132429493929190614467565b602060405180830381600087803b15801561325c57600080fd5b505af192505050801561328d57506040513d601f19601f8201168201806040525081019061328a9190613f7a565b60015b613307573d80600081146132bd576040519150601f19603f3d011682016040523d82523d6000602084013e6132c2565b606091505b506000815114156132ff576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061335c565b600190505b949350505050565b61337e8282604051806020016040528060008152506135fa565b5050565b606060118054613391906149d2565b80601f01602080910402602001604051908101604052809291908181526020018280546133bd906149d2565b801561340a5780601f106133df5761010080835404028352916020019161340a565b820191906000526020600020905b8154815290600101906020018083116133ed57829003601f168201915b5050505050905090565b6060600082141561345c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613570565b600082905060005b6000821461348e57808061347790614a35565b915050600a826134879190614841565b9150613464565b60008167ffffffffffffffff8111156134aa576134a9614b8f565b5b6040519080825280601f01601f1916602001820160405280156134dc5781602001600182028036833780820191505090505b5090505b60008514613569576001826134f591906148cc565b9150600a856135049190614aa2565b603061351091906147eb565b60f81b81838151811061352657613525614b60565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856135629190614841565b94506134e0565b8093505050505b919050565b60008082905060005b84518110156135c0576135ab8286838151811061359e5761359d614b60565b5b602002602001015161360c565b915080806135b890614a35565b91505061357e565b508091505092915050565b50505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6136078383836001613637565b505050565b60008183106136245761361f82846139cd565b61362f565b61362e83836139cd565b5b905092915050565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156136d2576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141561370d576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61371a60008683876135cb565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561397f57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4838015613933575061393160008884886131d6565b155b1561396a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818060010192505080806001019150506138b8565b50806000806101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550506139c660008683876135d1565b5050505050565b600082600052816020526040600020905092915050565b8280546139f0906149d2565b90600052602060002090601f016020900481019282613a125760008555613a59565b82601f10613a2b57803560ff1916838001178555613a59565b82800160010185558215613a59579182015b82811115613a58578235825591602001919060010190613a3d565b5b509050613a669190613aad565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613ac6576000816000905550600101613aae565b5090565b6000613add613ad88461474b565b614726565b90508083825260208201905082856020860282011115613b0057613aff614bc8565b5b60005b85811015613b305781613b168882613be9565b845260208401935060208301925050600181019050613b03565b5050509392505050565b6000613b4d613b4884614777565b614726565b905082815260208101848484011115613b6957613b68614bcd565b5b613b74848285614990565b509392505050565b600081359050613b8b81614f22565b92915050565b600081359050613ba081614f39565b92915050565b600082601f830112613bbb57613bba614bc3565b5b8135613bcb848260208601613aca565b91505092915050565b600081359050613be381614f50565b92915050565b600081359050613bf881614f67565b92915050565b600081359050613c0d81614f7e565b92915050565b600081519050613c2281614f7e565b92915050565b600082601f830112613c3d57613c3c614bc3565b5b8135613c4d848260208601613b3a565b91505092915050565b60008083601f840112613c6c57613c6b614bc3565b5b8235905067ffffffffffffffff811115613c8957613c88614bbe565b5b602083019150836001820283011115613ca557613ca4614bc8565b5b9250929050565b600081359050613cbb81614f95565b92915050565b600060208284031215613cd757613cd6614bd7565b5b6000613ce584828501613b7c565b91505092915050565b600060208284031215613d0457613d03614bd7565b5b6000613d1284828501613b91565b91505092915050565b60008060408385031215613d3257613d31614bd7565b5b6000613d4085828601613b7c565b9250506020613d5185828601613b7c565b9150509250929050565b600080600060608486031215613d7457613d73614bd7565b5b6000613d8286828701613b7c565b9350506020613d9386828701613b7c565b9250506040613da486828701613cac565b9150509250925092565b60008060008060808587031215613dc857613dc7614bd7565b5b6000613dd687828801613b7c565b9450506020613de787828801613b7c565b9350506040613df887828801613cac565b925050606085013567ffffffffffffffff811115613e1957613e18614bd2565b5b613e2587828801613c28565b91505092959194509250565b60008060408385031215613e4857613e47614bd7565b5b6000613e5685828601613b7c565b9250506020613e6785828601613bd4565b9150509250929050565b60008060408385031215613e8857613e87614bd7565b5b6000613e9685828601613b7c565b9250506020613ea785828601613cac565b9150509250929050565b60008060408385031215613ec857613ec7614bd7565b5b600083013567ffffffffffffffff811115613ee657613ee5614bd2565b5b613ef285828601613ba6565b9250506020613f0385828601613be9565b9150509250929050565b60008060408385031215613f2457613f23614bd7565b5b6000613f3285828601613be9565b9250506020613f4385828601613be9565b9150509250929050565b600060208284031215613f6357613f62614bd7565b5b6000613f7184828501613bfe565b91505092915050565b600060208284031215613f9057613f8f614bd7565b5b6000613f9e84828501613c13565b91505092915050565b60008060208385031215613fbe57613fbd614bd7565b5b600083013567ffffffffffffffff811115613fdc57613fdb614bd2565b5b613fe885828601613c56565b92509250509250929050565b60006020828403121561400a57614009614bd7565b5b600061401884828501613cac565b91505092915050565b6000806040838503121561403857614037614bd7565b5b600061404685828601613cac565b925050602083013567ffffffffffffffff81111561406757614066614bd2565b5b61407385828601613ba6565b9150509250929050565b6000806040838503121561409457614093614bd7565b5b60006140a285828601613cac565b92505060206140b385828601613cac565b9150509250929050565b6140c681614912565b82525050565b6140d581614900565b82525050565b6140ec6140e782614900565b614a7e565b82525050565b6140fb81614924565b82525050565b61410a81614930565b82525050565b600061411b826147a8565b61412581856147be565b935061413581856020860161499f565b61413e81614bdc565b840191505092915050565b6000614154826147b3565b61415e81856147cf565b935061416e81856020860161499f565b61417781614bdc565b840191505092915050565b600061418d826147b3565b61419781856147e0565b93506141a781856020860161499f565b80840191505092915050565b60006141c06026836147cf565b91506141cb82614bfa565b604082019050919050565b60006141e36018836147cf565b91506141ee82614c49565b602082019050919050565b60006142066024836147cf565b915061421182614c72565b604082019050919050565b60006142296018836147cf565b915061423482614cc1565b602082019050919050565b600061424c6010836147cf565b915061425782614cea565b602082019050919050565b600061426f6011836147cf565b915061427a82614d13565b602082019050919050565b60006142926017836147cf565b915061429d82614d3c565b602082019050919050565b60006142b56020836147cf565b91506142c082614d65565b602082019050919050565b60006142d86025836147cf565b91506142e382614d8e565b604082019050919050565b60006142fb601a836147cf565b915061430682614ddd565b602082019050919050565b600061431e6023836147cf565b915061432982614e06565b604082019050919050565b60006143416015836147cf565b915061434c82614e55565b602082019050919050565b60006143646015836147cf565b915061436f82614e7e565b602082019050919050565b60006143876015836147cf565b915061439282614ea7565b602082019050919050565b60006143aa6016836147cf565b91506143b582614ed0565b602082019050919050565b60006143cd6016836147cf565b91506143d882614ef9565b602082019050919050565b6143ec81614986565b82525050565b60006143fe82846140db565b60148201915081905092915050565b60006144198285614182565b91506144258284614182565b91508190509392505050565b600060208201905061444660008301846140cc565b92915050565b600060208201905061446160008301846140bd565b92915050565b600060808201905061447c60008301876140cc565b61448960208301866140cc565b61449660408301856143e3565b81810360608301526144a88184614110565b905095945050505050565b60006020820190506144c860008301846140f2565b92915050565b60006020820190506144e36000830184614101565b92915050565b600060208201905081810360008301526145038184614149565b905092915050565b60006020820190508181036000830152614524816141b3565b9050919050565b60006020820190508181036000830152614544816141d6565b9050919050565b60006020820190508181036000830152614564816141f9565b9050919050565b600060208201905081810360008301526145848161421c565b9050919050565b600060208201905081810360008301526145a48161423f565b9050919050565b600060208201905081810360008301526145c481614262565b9050919050565b600060208201905081810360008301526145e481614285565b9050919050565b60006020820190508181036000830152614604816142a8565b9050919050565b60006020820190508181036000830152614624816142cb565b9050919050565b60006020820190508181036000830152614644816142ee565b9050919050565b6000602082019050818103600083015261466481614311565b9050919050565b6000602082019050818103600083015261468481614334565b9050919050565b600060208201905081810360008301526146a481614357565b9050919050565b600060208201905081810360008301526146c48161437a565b9050919050565b600060208201905081810360008301526146e48161439d565b9050919050565b60006020820190508181036000830152614704816143c0565b9050919050565b600060208201905061472060008301846143e3565b92915050565b6000614730614741565b905061473c8282614a04565b919050565b6000604051905090565b600067ffffffffffffffff82111561476657614765614b8f565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561479257614791614b8f565b5b61479b82614bdc565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006147f682614986565b915061480183614986565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561483657614835614ad3565b5b828201905092915050565b600061484c82614986565b915061485783614986565b92508261486757614866614b02565b5b828204905092915050565b600061487d82614986565b915061488883614986565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156148c1576148c0614ad3565b5b828202905092915050565b60006148d782614986565b91506148e283614986565b9250828210156148f5576148f4614ad3565b5b828203905092915050565b600061490b82614966565b9050919050565b600061491d82614966565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156149bd5780820151818401526020810190506149a2565b838111156149cc576000848401525b50505050565b600060028204905060018216806149ea57607f821691505b602082108114156149fe576149fd614b31565b5b50919050565b614a0d82614bdc565b810181811067ffffffffffffffff82111715614a2c57614a2b614b8f565b5b80604052505050565b6000614a4082614986565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614a7357614a72614ad3565b5b600182019050919050565b6000614a8982614a90565b9050919050565b6000614a9b82614bed565b9050919050565b6000614aad82614986565b9150614ab883614986565b925082614ac857614ac7614b02565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e6f74206d696e7420746f206e756c6c20616464726573730000000000000000600082015250565b7f796f752068617665206d696e746564206d6178696d756d20616c6c6f7765642060008201527f6e66747300000000000000000000000000000000000000000000000000000000602082015250565b7f7769746864726177616c57616c6c6574206e6f74207365740000000000000000600082015250565b7f53616c65206e6f74207374617274656400000000000000000000000000000000600082015250565b7f53616c65206e6f7420737461727465645f000000000000000000000000000000600082015250565b7f4e6f7420612070617274206f6620416c6c6f776c697374000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f63616e277420736574206e756c6c206164647265737320666f7220776974686460008201527f726177616c000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420612070617274206f66204f472f57686974656c697374000000000000600082015250565b7f596f7520686176652072656163686564204d6178696d756d206d696e74206c6960008201527f6d69740000000000000000000000000000000000000000000000000000000000602082015250565b7f416c6c204e465473207765726520536f6c644f75740000000000000000000000600082015250565b7f4e6f7420656e6f7567682065746865722073656e740000000000000000000000600082015250565b7f416c6c204e4654732061726520536f6c64204f75740000000000000000000000600082015250565b7f416c6c204e465473207765726520536f6c64204f757400000000000000000000600082015250565b7f53616c65204e6f742053746172746564207965745f5f00000000000000000000600082015250565b614f2b81614900565b8114614f3657600080fd5b50565b614f4281614912565b8114614f4d57600080fd5b50565b614f5981614924565b8114614f6457600080fd5b50565b614f7081614930565b8114614f7b57600080fd5b50565b614f878161493a565b8114614f9257600080fd5b50565b614f9e81614986565b8114614fa957600080fd5b5056fea26469706673582212209d463f84ea3f352a7d507b12bc57a6ab6eda4c89d66cc5a5b84abf3a28e6cd4064736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000ae0a66a01fa53b5e03b55e743b9768b4d19502b5520c3a39f2567134c67b3fc793109a2da481867ac80dc050bdb8f48e34bc2750a80d2cc142e1ada0f98b5efec311ea9d7392bd182ecb286addaa2c4b7800ce6700000000000000000000000000000000000000000000000000000000630b82f000000000000000000000000000000000000000000000000000000000630bf370000000000000000000000000000000000000000000000000000000000000002768747470733a2f2f6d657461646174612e636d646576732e6f72672f6170692f616476656e742f00000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _uri (string): https://metadata.cmdevs.org/api/advent/
Arg [1] : _withdrawWallet (address): 0xae0a66a01Fa53b5e03b55e743b9768b4D19502b5
Arg [2] : _wl (bytes32): 0x520c3a39f2567134c67b3fc793109a2da481867ac80dc050bdb8f48e34bc2750
Arg [3] : _allow (bytes32): 0xa80d2cc142e1ada0f98b5efec311ea9d7392bd182ecb286addaa2c4b7800ce67
Arg [4] : _wltime (uint256): 1661698800
Arg [5] : _altime (uint256): 1661727600

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 000000000000000000000000ae0a66a01fa53b5e03b55e743b9768b4d19502b5
Arg [2] : 520c3a39f2567134c67b3fc793109a2da481867ac80dc050bdb8f48e34bc2750
Arg [3] : a80d2cc142e1ada0f98b5efec311ea9d7392bd182ecb286addaa2c4b7800ce67
Arg [4] : 00000000000000000000000000000000000000000000000000000000630b82f0
Arg [5] : 00000000000000000000000000000000000000000000000000000000630bf370
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000027
Arg [7] : 68747470733a2f2f6d657461646174612e636d646576732e6f72672f6170692f
Arg [8] : 616476656e742f00000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

55037:5119:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38517:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56977:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56234:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41127:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42630:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42193:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35754:280;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55527:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57301:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43487:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37340:1105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55256:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55313:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59744:238;;;;;;;;;;;;;:::i;:::-;;43728:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59992:159;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56586:101;;;;;;;;;;;;;:::i;:::-;;36327:713;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55155:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55186:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56329:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40936:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56882:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55499:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56695:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38953:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13456:103;;;;;;;;;;;;;:::i;:::-;;57189:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12805:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41296:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55359:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42906:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56486:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55222:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43984:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57631:1759;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59420:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55408:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41471:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55121:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56004:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43256:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13714:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57464:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38517:372;38619:4;38671:25;38656:40;;;:11;:40;;;;:105;;;;38728:33;38713:48;;;:11;:48;;;;38656:105;:172;;;;38793:35;38778:50;;;:11;:50;;;;38656:172;:225;;;;38845:36;38869:11;38845:23;:36::i;:::-;38656:225;38636:245;;38517:372;;;:::o;56977:96::-;13036:12;:10;:12::i;:::-;13025:23;;:7;:5;:7::i;:::-;:23;;;13017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57054:11:::1;57043:8;:22;;;;56977:96:::0;:::o;56234:87::-;13036:12;:10;:12::i;:::-;13025:23;;:7;:5;:7::i;:::-;:23;;;13017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56310:3:::1;;56300:7;:13;;;;;;;:::i;:::-;;56234:87:::0;;:::o;41127:100::-;41181:13;41214:5;41207:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41127:100;:::o;42630:204::-;42698:7;42723:16;42731:7;42723;:16::i;:::-;42718:64;;42748:34;;;;;;;;;;;;;;42718:64;42802:15;:24;42818:7;42802:24;;;;;;;;;;;;;;;;;;;;;42795:31;;42630:204;;;:::o;42193:371::-;42266:13;42282:24;42298:7;42282:15;:24::i;:::-;42266:40;;42327:5;42321:11;;:2;:11;;;42317:48;;;42341:24;;;;;;;;;;;;;;42317:48;42398:5;42382:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;42408:37;42425:5;42432:12;:10;:12::i;:::-;42408:16;:37::i;:::-;42407:38;42382:63;42378:138;;;42469:35;;;;;;;;;;;;;;42378:138;42528:28;42537:2;42541:7;42550:5;42528:8;:28::i;:::-;42255:309;42193:371;;:::o;35754:280::-;35807:7;35999:12;;;;;;;;;;;35983:13;;;;;;;;;;:28;35976:35;;;;35754:280;:::o;55527:45::-;;;;;;;;;;;;;;;;;:::o;57301:155::-;57379:4;57403:45;57422:5;57429:12;;57443:4;57403:18;:45::i;:::-;57396:52;;57301:155;;;;:::o;43487:170::-;43621:28;43631:4;43637:2;43641:7;43621:9;:28::i;:::-;43487:170;;;:::o;37340:1105::-;37429:7;37462:16;37472:5;37462:9;:16::i;:::-;37453:5;:25;37449:61;;37487:23;;;;;;;;;;;;;;37449:61;37521:22;37546:13;;;;;;;;;;;37521:38;;;;37570:19;37600:25;37801:9;37796:557;37816:14;37812:1;:18;37796:557;;;37856:31;37890:11;:14;37902:1;37890:14;;;;;;;;;;;37856:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37927:9;:16;;;37923:73;;;37968:8;;;37923:73;38044:1;38018:28;;:9;:14;;;:28;;;38014:111;;38091:9;:14;;;38071:34;;38014:111;38168:5;38147:26;;:17;:26;;;38143:195;;;38217:5;38202:11;:20;38198:85;;;38258:1;38251:8;;;;;;;;;38198:85;38305:13;;;;;;;38143:195;37837:516;37796:557;37832:3;;;;;;;37796:557;;;;38429:8;;;37340:1105;;;;;:::o;55256:32::-;;;;:::o;55313:27::-;;;;:::o;59744:238::-;13036:12;:10;:12::i;:::-;13025:23;;:7;:5;:7::i;:::-;:23;;;13017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59834:1:::1;59808:28;;:14;;;;;;;;;;;:28;;;;59800:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;59876:16;59895:21;59876:40;;59943:14;;;;;;;;;;;59935:28;;:38;59964:8;59935:38;;;;;;;;;;;;;;;;;;;;;;;59927:47;;;::::0;::::1;;59789:193;59744:238::o:0;43728:185::-;43866:39;43883:4;43889:2;43893:7;43866:39;;;;;;;;;;;;:16;:39::i;:::-;43728:185;;;:::o;59992:159::-;60042:25;60100:42;60080:63;;59992:159;:::o;56586:101::-;13036:12;:10;:12::i;:::-;13025:23;;:7;:5;:7::i;:::-;:23;;;13017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56652:1:::1;56635:14;:18;;;;56678:1;56664:11;:15;;;;56586:101::o:0;36327:713::-;36394:7;36414:22;36439:13;;;;;;;;;;36414:38;;;;36463:19;36658:9;36653:328;36673:14;36669:1;:18;36653:328;;;36713:31;36747:11;:14;36759:1;36747:14;;;;;;;;;;;36713:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36785:9;:16;;;36780:186;;36845:5;36830:11;:20;36826:85;;;36886:1;36879:8;;;;;;;;36826:85;36933:13;;;;;;;36780:186;36694:287;36689:3;;;;;;;36653:328;;;;37009:23;;;;;;;;;;;;;;36327:713;;;;:::o;55155:24::-;;;;:::o;55186:29::-;;;;:::o;56329:145::-;13036:12;:10;:12::i;:::-;13025:23;;:7;:5;:7::i;:::-;:23;;;13017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56426:7:::1;56411:12;:22;;;;56456:10;56444:9;:22;;;;56329:145:::0;;:::o;40936:124::-;41000:7;41027:20;41039:7;41027:11;:20::i;:::-;:25;;;41020:32;;40936:124;;;:::o;56882:87::-;13036:12;:10;:12::i;:::-;13025:23;;:7;:5;:7::i;:::-;:23;;;13017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56952:9:::1;56944:5;:17;;;;56882:87:::0;:::o;55499:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56695:162::-;13036:12;:10;:12::i;:::-;13025:23;;:7;:5;:7::i;:::-;:23;;;13017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56798:10:::1;56784:11;:24;;;;56836:13;56819:14;:30;;;;56695:162:::0;;:::o;38953:206::-;39017:7;39058:1;39041:19;;:5;:19;;;39037:60;;;39069:28;;;;;;;;;;;;;;39037:60;39123:12;:19;39136:5;39123:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;39115:36;;39108:43;;38953:206;;;:::o;13456:103::-;13036:12;:10;:12::i;:::-;13025:23;;:7;:5;:7::i;:::-;:23;;;13017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13521:30:::1;13548:1;13521:18;:30::i;:::-;13456:103::o:0;57189:104::-;57245:7;57271:14;;;;;;;;;;;57264:21;;57189:104;:::o;12805:87::-;12851:7;12878:6;;;;;;;;;;;12871:13;;12805:87;:::o;41296:104::-;41352:13;41385:7;41378:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41296:104;:::o;55359:33::-;;;;:::o;42906:279::-;43009:12;:10;:12::i;:::-;42997:24;;:8;:24;;;42993:54;;;43030:17;;;;;;;;;;;;;;42993:54;43105:8;43060:18;:32;43079:12;:10;:12::i;:::-;43060:32;;;;;;;;;;;;;;;:42;43093:8;43060:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;43158:8;43129:48;;43144:12;:10;:12::i;:::-;43129:48;;;43168:8;43129:48;;;;;;:::i;:::-;;;;;;;;42906:279;;:::o;56486:92::-;13036:12;:10;:12::i;:::-;13025:23;;:7;:5;:7::i;:::-;:23;;;13017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56565:5:::1;56554:8;:16;;;;56486:92:::0;:::o;55222:26::-;;;;:::o;43984:342::-;44151:28;44161:4;44167:2;44171:7;44151:9;:28::i;:::-;44195:48;44218:4;44224:2;44228:7;44237:5;44195:22;:48::i;:::-;44190:129;;44267:40;;;;;;;;;;;;;;44190:129;43984:342;;;;:::o;57631:1759::-;57737:10;;57722:13;:11;:13::i;:::-;:25;;57714:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;57804:1;57792:11;;:13;57784:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;57859:1;57844:14;;:16;57836:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;57916:11;;57900:15;:27;57892:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;57985:14;;57969:15;:30;57966:1416;;;58016:14;58033:10;:22;58044:10;58033:22;;;;;;;;;;;;;;;;58016:39;;58078:61;58093:4;58126:10;58109:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;58099:39;;;;;;58078:14;:61::i;:::-;58070:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;58223:1;58214:8;;:10;;;;:::i;:::-;58190;:22;58201:10;58190:22;;;;;;;;;;;;;;;;:35;58182:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;58310:10;:22;58321:10;58310:22;;;;;;;;;;;;;;;;58301:8;;:31;;;;:::i;:::-;58288:8;:45;;58280:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;58424:10;;58412:8;58396:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;58388:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;58505:8;58497:5;;:16;;;;:::i;:::-;58483:9;:31;;58475:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;58589:8;58580:6;:17;;;;:::i;:::-;58555:10;:22;58566:10;58555:22;;;;;;;;;;;;;;;:42;;;;58612:31;58622:10;58634:8;58612:9;:31::i;:::-;58001:656;57966:1416;;;58682:11;;58666:15;:27;:61;;;;;58713:14;;58697:15;:30;58666:61;58663:719;;;58742:14;58759:10;:22;58770:10;58759:22;;;;;;;;;;;;;;;;58742:39;;58804:56;58814:4;58847:10;58830:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;58820:39;;;;;;58804:9;:56::i;:::-;58796:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;58947:1;58938:8;;:10;;;;:::i;:::-;58914;:22;58925:10;58914:22;;;;;;;;;;;;;;;;:35;58906:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;59034:10;:22;59045:10;59034:22;;;;;;;;;;;;;;;;59025:8;;:31;;;;:::i;:::-;59012:8;:45;;59004:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;59148:10;;59136:8;59120:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;59112:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;59232:8;59221;;:19;;;;:::i;:::-;59207:9;:34;;59199:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59316:8;59307:6;:17;;;;:::i;:::-;59282:10;:22;59293:10;59282:22;;;;;;;;;;;;;;;:42;;;;59339:31;59349:10;59361:8;59339:9;:31::i;:::-;58728:654;58663:719;57966:1416;57631:1759;;:::o;59420:287::-;13036:12;:10;:12::i;:::-;13025:23;;:7;:5;:7::i;:::-;:23;;;13017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59544:1:::1;59523:23;;:9;:23;;;;59515:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;59622:10;;59610:8;59594:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;59586:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;59669:30;59679:9;59690:8;59669:9;:30::i;:::-;59420:287:::0;;:::o;55408:35::-;;;;:::o;41471:318::-;41544:13;41575:16;41583:7;41575;:16::i;:::-;41570:59;;41600:29;;;;;;;;;;;;;;41570:59;41642:21;41666:10;:8;:10::i;:::-;41642:34;;41719:1;41700:7;41694:21;:26;;:87;;;;;;;;;;;;;;;;;41747:7;41756:18;:7;:16;:18::i;:::-;41730:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41694:87;41687:94;;;41471:318;;;:::o;55121:27::-;;;;:::o;56004:222::-;13036:12;:10;:12::i;:::-;13025:23;;:7;:5;:7::i;:::-;:23;;;13017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56131:1:::1;56104:29;;:15;:29;;;;56096:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;56203:15;56186:14;;:32;;;;;;;;;;;;;;;;;;56004:222:::0;:::o;43256:164::-;43353:4;43377:18;:25;43396:5;43377:25;;;;;;;;;;;;;;;:35;43403:8;43377:35;;;;;;;;;;;;;;;;;;;;;;;;;43370:42;;43256:164;;;;:::o;13714:201::-;13036:12;:10;:12::i;:::-;13025:23;;:7;:5;:7::i;:::-;:23;;;13017:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13823:1:::1;13803:22;;:8;:22;;;;13795:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;13879:28;13898:8;13879:18;:28::i;:::-;13714:201:::0;:::o;57464:157::-;57547:4;57571:42;57590:5;57597:9;;57608:4;57571:18;:42::i;:::-;57564:49;;57464:157;;;;:::o;25589:::-;25674:4;25713:25;25698:40;;;:11;:40;;;;25691:47;;25589:157;;;:::o;11529:98::-;11582:7;11609:10;11602:17;;11529:98;:::o;44581:144::-;44638:4;44672:13;;;;;;;;;;;44662:23;;:7;:23;:55;;;;;44690:11;:20;44702:7;44690:20;;;;;;;;;;;:27;;;;;;;;;;;;44689:28;44662:55;44655:62;;44581:144;;;:::o;51799:196::-;51941:2;51914:15;:24;51930:7;51914:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;51979:7;51975:2;51959:28;;51968:5;51959:28;;;;;;;;;;;;51799:196;;;:::o;1220:190::-;1345:4;1398;1369:25;1382:5;1389:4;1369:12;:25::i;:::-;:33;1362:40;;1220:190;;;;;:::o;47300:2112::-;47415:35;47453:20;47465:7;47453:11;:20::i;:::-;47415:58;;47486:22;47528:13;:18;;;47512:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;47563:50;47580:13;:18;;;47600:12;:10;:12::i;:::-;47563:16;:50::i;:::-;47512:101;:154;;;;47654:12;:10;:12::i;:::-;47630:36;;:20;47642:7;47630:11;:20::i;:::-;:36;;;47512:154;47486:181;;47685:17;47680:66;;47711:35;;;;;;;;;;;;;;47680:66;47783:4;47761:26;;:13;:18;;;:26;;;47757:67;;47796:28;;;;;;;;;;;;;;47757:67;47853:1;47839:16;;:2;:16;;;47835:52;;;47864:23;;;;;;;;;;;;;;47835:52;47900:43;47922:4;47928:2;47932:7;47941:1;47900:21;:43::i;:::-;48008:49;48025:1;48029:7;48038:13;:18;;;48008:8;:49::i;:::-;48383:1;48353:12;:18;48366:4;48353:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48427:1;48399:12;:16;48412:2;48399:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48473:2;48445:11;:20;48457:7;48445:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;48535:15;48490:11;:20;48502:7;48490:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;48803:19;48835:1;48825:7;:11;48803:33;;48896:1;48855:43;;:11;:24;48867:11;48855:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;48851:445;;;49080:13;;;;;;;;;;49066:27;;:11;:27;49062:219;;;49150:13;:18;;;49118:11;:24;49130:11;49118:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;49233:13;:28;;;49191:11;:24;49203:11;49191:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;49062:219;48851:445;48328:979;49343:7;49339:2;49324:27;;49333:4;49324:27;;;;;;;;;;;;49362:42;49383:4;49389:2;49393:7;49402:1;49362:20;:42::i;:::-;47404:2008;;47300:2112;;;:::o;39791:1083::-;39852:21;;:::i;:::-;39886:12;39901:7;39886:22;;39957:13;;;;;;;;;;39950:20;;:4;:20;39946:861;;;39991:31;40025:11;:17;40037:4;40025:17;;;;;;;;;;;39991:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40066:9;:16;;;40061:731;;40137:1;40111:28;;:9;:14;;;:28;;;40107:101;;40175:9;40168:16;;;;;;40107:101;40512:261;40519:4;40512:261;;;40552:6;;;;;;;;40597:11;:17;40609:4;40597:17;;;;;;;;;;;40585:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40671:1;40645:28;;:9;:14;;;:28;;;40641:109;;40713:9;40706:16;;;;;;40641:109;40512:261;;;40061:731;39972:835;39946:861;40835:31;;;;;;;;;;;;;;39791:1083;;;;:::o;14075:191::-;14149:16;14168:6;;;;;;;;;;;14149:25;;14194:8;14185:6;;:17;;;;;;;;;;;;;;;;;;14249:8;14218:40;;14239:8;14218:40;;;;;;;;;;;;14138:128;14075:191;:::o;52560:790::-;52715:4;52736:15;:2;:13;;;:15::i;:::-;52732:611;;;52788:2;52772:36;;;52809:12;:10;:12::i;:::-;52823:4;52829:7;52838:5;52772:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;52768:520;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53035:1;53018:6;:13;:18;53014:259;;;53068:40;;;;;;;;;;;;;;53014:259;53223:6;53217:13;53208:6;53204:2;53200:15;53193:38;52768:520;52905:45;;;52895:55;;;:6;:55;;;;52888:62;;;;;52732:611;53327:4;53320:11;;52560:790;;;;;;;:::o;44733:104::-;44802:27;44812:2;44816:8;44802:27;;;;;;;;;;;;:9;:27::i;:::-;44733:104;;:::o;57081:100::-;57133:13;57166:7;57159:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57081:100;:::o;9091:723::-;9147:13;9377:1;9368:5;:10;9364:53;;;9395:10;;;;;;;;;;;;;;;;;;;;;9364:53;9427:12;9442:5;9427:20;;9458:14;9483:78;9498:1;9490:4;:9;9483:78;;9516:8;;;;;:::i;:::-;;;;9547:2;9539:10;;;;;:::i;:::-;;;9483:78;;;9571:19;9603:6;9593:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9571:39;;9621:154;9637:1;9628:5;:10;9621:154;;9665:1;9655:11;;;;;:::i;:::-;;;9732:2;9724:5;:10;;;;:::i;:::-;9711:2;:24;;;;:::i;:::-;9698:39;;9681:6;9688;9681:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;9761:2;9752:11;;;;;:::i;:::-;;;9621:154;;;9799:6;9785:21;;;;;9091:723;;;;:::o;2087:296::-;2170:7;2190:20;2213:4;2190:27;;2233:9;2228:118;2252:5;:12;2248:1;:16;2228:118;;;2301:33;2311:12;2325:5;2331:1;2325:8;;;;;;;;:::i;:::-;;;;;;;;2301:9;:33::i;:::-;2286:48;;2266:3;;;;;:::i;:::-;;;;2228:118;;;;2363:12;2356:19;;;2087:296;;;;:::o;53998:159::-;;;;;:::o;54816:158::-;;;;;:::o;15506:326::-;15566:4;15823:1;15801:7;:19;;;:23;15794:30;;15506:326;;;:::o;45200:163::-;45323:32;45329:2;45333:8;45343:5;45350:4;45323:5;:32::i;:::-;45200:163;;;:::o;8294:149::-;8357:7;8388:1;8384;:5;:51;;8415:20;8430:1;8433;8415:14;:20::i;:::-;8384:51;;;8392:20;8407:1;8410;8392:14;:20::i;:::-;8384:51;8377:58;;8294:149;;;;:::o;45624:1422::-;45763:20;45786:13;;;;;;;;;;;45763:36;;;;45828:1;45814:16;;:2;:16;;;45810:48;;;45839:19;;;;;;;;;;;;;;45810:48;45885:1;45873:8;:13;45869:44;;;45895:18;;;;;;;;;;;;;;45869:44;45926:61;45956:1;45960:2;45964:12;45978:8;45926:21;:61::i;:::-;46300:8;46265:12;:16;46278:2;46265:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46364:8;46324:12;:16;46337:2;46324:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46423:2;46390:11;:25;46402:12;46390:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;46490:15;46440:11;:25;46452:12;46440:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;46523:20;46546:12;46523:35;;46580:9;46575:328;46595:8;46591:1;:12;46575:328;;;46659:12;46655:2;46634:38;;46651:1;46634:38;;;;;;;;;;;;46695:4;:68;;;;;46704:59;46735:1;46739:2;46743:12;46757:5;46704:22;:59::i;:::-;46703:60;46695:68;46691:164;;;46795:40;;;;;;;;;;;;;;46691:164;46873:14;;;;;;;46605:3;;;;;;;46575:328;;;;46943:12;46919:13;;:37;;;;;;;;;;;;;;;;;;46240:728;46978:60;47007:1;47011:2;47015:12;47029:8;46978:20;:60::i;:::-;45752:1294;45624:1422;;;;:::o;8451:268::-;8519:13;8626:1;8620:4;8613:15;8655:1;8649:4;8642:15;8696:4;8690;8680:21;8671:30;;8451:268;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:139::-;1214:5;1252:6;1239:20;1230:29;;1268:33;1295:5;1268:33;:::i;:::-;1168:139;;;;:::o;1313:155::-;1367:5;1405:6;1392:20;1383:29;;1421:41;1456:5;1421:41;:::i;:::-;1313:155;;;;:::o;1491:370::-;1562:5;1611:3;1604:4;1596:6;1592:17;1588:27;1578:122;;1619:79;;:::i;:::-;1578:122;1736:6;1723:20;1761:94;1851:3;1843:6;1836:4;1828:6;1824:17;1761:94;:::i;:::-;1752:103;;1568:293;1491:370;;;;:::o;1867:133::-;1910:5;1948:6;1935:20;1926:29;;1964:30;1988:5;1964:30;:::i;:::-;1867:133;;;;:::o;2006:139::-;2052:5;2090:6;2077:20;2068:29;;2106:33;2133:5;2106:33;:::i;:::-;2006:139;;;;:::o;2151:137::-;2196:5;2234:6;2221:20;2212:29;;2250:32;2276:5;2250:32;:::i;:::-;2151:137;;;;:::o;2294:141::-;2350:5;2381:6;2375:13;2366:22;;2397:32;2423:5;2397:32;:::i;:::-;2294:141;;;;:::o;2454:338::-;2509:5;2558:3;2551:4;2543:6;2539:17;2535:27;2525:122;;2566:79;;:::i;:::-;2525:122;2683:6;2670:20;2708:78;2782:3;2774:6;2767:4;2759:6;2755:17;2708:78;:::i;:::-;2699:87;;2515:277;2454:338;;;;:::o;2812:553::-;2870:8;2880:6;2930:3;2923:4;2915:6;2911:17;2907:27;2897:122;;2938:79;;:::i;:::-;2897:122;3051:6;3038:20;3028:30;;3081:18;3073:6;3070:30;3067:117;;;3103:79;;:::i;:::-;3067:117;3217:4;3209:6;3205:17;3193:29;;3271:3;3263:4;3255:6;3251:17;3241:8;3237:32;3234:41;3231:128;;;3278:79;;:::i;:::-;3231:128;2812:553;;;;;:::o;3371:139::-;3417:5;3455:6;3442:20;3433:29;;3471:33;3498:5;3471:33;:::i;:::-;3371:139;;;;:::o;3516:329::-;3575:6;3624:2;3612:9;3603:7;3599:23;3595:32;3592:119;;;3630:79;;:::i;:::-;3592:119;3750:1;3775:53;3820:7;3811:6;3800:9;3796:22;3775:53;:::i;:::-;3765:63;;3721:117;3516:329;;;;:::o;3851:345::-;3918:6;3967:2;3955:9;3946:7;3942:23;3938:32;3935:119;;;3973:79;;:::i;:::-;3935:119;4093:1;4118:61;4171:7;4162:6;4151:9;4147:22;4118:61;:::i;:::-;4108:71;;4064:125;3851:345;;;;:::o;4202:474::-;4270:6;4278;4327:2;4315:9;4306:7;4302:23;4298:32;4295:119;;;4333:79;;:::i;:::-;4295:119;4453:1;4478:53;4523:7;4514:6;4503:9;4499:22;4478:53;:::i;:::-;4468:63;;4424:117;4580:2;4606:53;4651:7;4642:6;4631:9;4627:22;4606:53;:::i;:::-;4596:63;;4551:118;4202:474;;;;;:::o;4682:619::-;4759:6;4767;4775;4824:2;4812:9;4803:7;4799:23;4795:32;4792:119;;;4830:79;;:::i;:::-;4792:119;4950:1;4975:53;5020:7;5011:6;5000:9;4996:22;4975:53;:::i;:::-;4965:63;;4921:117;5077:2;5103:53;5148:7;5139:6;5128:9;5124:22;5103:53;:::i;:::-;5093:63;;5048:118;5205:2;5231:53;5276:7;5267:6;5256:9;5252:22;5231:53;:::i;:::-;5221:63;;5176:118;4682:619;;;;;:::o;5307:943::-;5402:6;5410;5418;5426;5475:3;5463:9;5454:7;5450:23;5446:33;5443:120;;;5482:79;;:::i;:::-;5443:120;5602:1;5627:53;5672:7;5663:6;5652:9;5648:22;5627:53;:::i;:::-;5617:63;;5573:117;5729:2;5755:53;5800:7;5791:6;5780:9;5776:22;5755:53;:::i;:::-;5745:63;;5700:118;5857:2;5883:53;5928:7;5919:6;5908:9;5904:22;5883:53;:::i;:::-;5873:63;;5828:118;6013:2;6002:9;5998:18;5985:32;6044:18;6036:6;6033:30;6030:117;;;6066:79;;:::i;:::-;6030:117;6171:62;6225:7;6216:6;6205:9;6201:22;6171:62;:::i;:::-;6161:72;;5956:287;5307:943;;;;;;;:::o;6256:468::-;6321:6;6329;6378:2;6366:9;6357:7;6353:23;6349:32;6346:119;;;6384:79;;:::i;:::-;6346:119;6504:1;6529:53;6574:7;6565:6;6554:9;6550:22;6529:53;:::i;:::-;6519:63;;6475:117;6631:2;6657:50;6699:7;6690:6;6679:9;6675:22;6657:50;:::i;:::-;6647:60;;6602:115;6256:468;;;;;:::o;6730:474::-;6798:6;6806;6855:2;6843:9;6834:7;6830:23;6826:32;6823:119;;;6861:79;;:::i;:::-;6823:119;6981:1;7006:53;7051:7;7042:6;7031:9;7027:22;7006:53;:::i;:::-;6996:63;;6952:117;7108:2;7134:53;7179:7;7170:6;7159:9;7155:22;7134:53;:::i;:::-;7124:63;;7079:118;6730:474;;;;;:::o;7210:684::-;7303:6;7311;7360:2;7348:9;7339:7;7335:23;7331:32;7328:119;;;7366:79;;:::i;:::-;7328:119;7514:1;7503:9;7499:17;7486:31;7544:18;7536:6;7533:30;7530:117;;;7566:79;;:::i;:::-;7530:117;7671:78;7741:7;7732:6;7721:9;7717:22;7671:78;:::i;:::-;7661:88;;7457:302;7798:2;7824:53;7869:7;7860:6;7849:9;7845:22;7824:53;:::i;:::-;7814:63;;7769:118;7210:684;;;;;:::o;7900:474::-;7968:6;7976;8025:2;8013:9;8004:7;8000:23;7996:32;7993:119;;;8031:79;;:::i;:::-;7993:119;8151:1;8176:53;8221:7;8212:6;8201:9;8197:22;8176:53;:::i;:::-;8166:63;;8122:117;8278:2;8304:53;8349:7;8340:6;8329:9;8325:22;8304:53;:::i;:::-;8294:63;;8249:118;7900:474;;;;;:::o;8380:327::-;8438:6;8487:2;8475:9;8466:7;8462:23;8458:32;8455:119;;;8493:79;;:::i;:::-;8455:119;8613:1;8638:52;8682:7;8673:6;8662:9;8658:22;8638:52;:::i;:::-;8628:62;;8584:116;8380:327;;;;:::o;8713:349::-;8782:6;8831:2;8819:9;8810:7;8806:23;8802:32;8799:119;;;8837:79;;:::i;:::-;8799:119;8957:1;8982:63;9037:7;9028:6;9017:9;9013:22;8982:63;:::i;:::-;8972:73;;8928:127;8713:349;;;;:::o;9068:529::-;9139:6;9147;9196:2;9184:9;9175:7;9171:23;9167:32;9164:119;;;9202:79;;:::i;:::-;9164:119;9350:1;9339:9;9335:17;9322:31;9380:18;9372:6;9369:30;9366:117;;;9402:79;;:::i;:::-;9366:117;9515:65;9572:7;9563:6;9552:9;9548:22;9515:65;:::i;:::-;9497:83;;;;9293:297;9068:529;;;;;:::o;9603:329::-;9662:6;9711:2;9699:9;9690:7;9686:23;9682:32;9679:119;;;9717:79;;:::i;:::-;9679:119;9837:1;9862:53;9907:7;9898:6;9887:9;9883:22;9862:53;:::i;:::-;9852:63;;9808:117;9603:329;;;;:::o;9938:684::-;10031:6;10039;10088:2;10076:9;10067:7;10063:23;10059:32;10056:119;;;10094:79;;:::i;:::-;10056:119;10214:1;10239:53;10284:7;10275:6;10264:9;10260:22;10239:53;:::i;:::-;10229:63;;10185:117;10369:2;10358:9;10354:18;10341:32;10400:18;10392:6;10389:30;10386:117;;;10422:79;;:::i;:::-;10386:117;10527:78;10597:7;10588:6;10577:9;10573:22;10527:78;:::i;:::-;10517:88;;10312:303;9938:684;;;;;:::o;10628:474::-;10696:6;10704;10753:2;10741:9;10732:7;10728:23;10724:32;10721:119;;;10759:79;;:::i;:::-;10721:119;10879:1;10904:53;10949:7;10940:6;10929:9;10925:22;10904:53;:::i;:::-;10894:63;;10850:117;11006:2;11032:53;11077:7;11068:6;11057:9;11053:22;11032:53;:::i;:::-;11022:63;;10977:118;10628:474;;;;;:::o;11108:142::-;11211:32;11237:5;11211:32;:::i;:::-;11206:3;11199:45;11108:142;;:::o;11256:118::-;11343:24;11361:5;11343:24;:::i;:::-;11338:3;11331:37;11256:118;;:::o;11380:157::-;11485:45;11505:24;11523:5;11505:24;:::i;:::-;11485:45;:::i;:::-;11480:3;11473:58;11380:157;;:::o;11543:109::-;11624:21;11639:5;11624:21;:::i;:::-;11619:3;11612:34;11543:109;;:::o;11658:118::-;11745:24;11763:5;11745:24;:::i;:::-;11740:3;11733:37;11658:118;;:::o;11782:360::-;11868:3;11896:38;11928:5;11896:38;:::i;:::-;11950:70;12013:6;12008:3;11950:70;:::i;:::-;11943:77;;12029:52;12074:6;12069:3;12062:4;12055:5;12051:16;12029:52;:::i;:::-;12106:29;12128:6;12106:29;:::i;:::-;12101:3;12097:39;12090:46;;11872:270;11782:360;;;;:::o;12148:364::-;12236:3;12264:39;12297:5;12264:39;:::i;:::-;12319:71;12383:6;12378:3;12319:71;:::i;:::-;12312:78;;12399:52;12444:6;12439:3;12432:4;12425:5;12421:16;12399:52;:::i;:::-;12476:29;12498:6;12476:29;:::i;:::-;12471:3;12467:39;12460:46;;12240:272;12148:364;;;;:::o;12518:377::-;12624:3;12652:39;12685:5;12652:39;:::i;:::-;12707:89;12789:6;12784:3;12707:89;:::i;:::-;12700:96;;12805:52;12850:6;12845:3;12838:4;12831:5;12827:16;12805:52;:::i;:::-;12882:6;12877:3;12873:16;12866:23;;12628:267;12518:377;;;;:::o;12901:366::-;13043:3;13064:67;13128:2;13123:3;13064:67;:::i;:::-;13057:74;;13140:93;13229:3;13140:93;:::i;:::-;13258:2;13253:3;13249:12;13242:19;;12901:366;;;:::o;13273:::-;13415:3;13436:67;13500:2;13495:3;13436:67;:::i;:::-;13429:74;;13512:93;13601:3;13512:93;:::i;:::-;13630:2;13625:3;13621:12;13614:19;;13273:366;;;:::o;13645:::-;13787:3;13808:67;13872:2;13867:3;13808:67;:::i;:::-;13801:74;;13884:93;13973:3;13884:93;:::i;:::-;14002:2;13997:3;13993:12;13986:19;;13645:366;;;:::o;14017:::-;14159:3;14180:67;14244:2;14239:3;14180:67;:::i;:::-;14173:74;;14256:93;14345:3;14256:93;:::i;:::-;14374:2;14369:3;14365:12;14358:19;;14017:366;;;:::o;14389:::-;14531:3;14552:67;14616:2;14611:3;14552:67;:::i;:::-;14545:74;;14628:93;14717:3;14628:93;:::i;:::-;14746:2;14741:3;14737:12;14730:19;;14389:366;;;:::o;14761:::-;14903:3;14924:67;14988:2;14983:3;14924:67;:::i;:::-;14917:74;;15000:93;15089:3;15000:93;:::i;:::-;15118:2;15113:3;15109:12;15102:19;;14761:366;;;:::o;15133:::-;15275:3;15296:67;15360:2;15355:3;15296:67;:::i;:::-;15289:74;;15372:93;15461:3;15372:93;:::i;:::-;15490:2;15485:3;15481:12;15474:19;;15133:366;;;:::o;15505:::-;15647:3;15668:67;15732:2;15727:3;15668:67;:::i;:::-;15661:74;;15744:93;15833:3;15744:93;:::i;:::-;15862:2;15857:3;15853:12;15846:19;;15505:366;;;:::o;15877:::-;16019:3;16040:67;16104:2;16099:3;16040:67;:::i;:::-;16033:74;;16116:93;16205:3;16116:93;:::i;:::-;16234:2;16229:3;16225:12;16218:19;;15877:366;;;:::o;16249:::-;16391:3;16412:67;16476:2;16471:3;16412:67;:::i;:::-;16405:74;;16488:93;16577:3;16488:93;:::i;:::-;16606:2;16601:3;16597:12;16590:19;;16249:366;;;:::o;16621:::-;16763:3;16784:67;16848:2;16843:3;16784:67;:::i;:::-;16777:74;;16860:93;16949:3;16860:93;:::i;:::-;16978:2;16973:3;16969:12;16962:19;;16621:366;;;:::o;16993:::-;17135:3;17156:67;17220:2;17215:3;17156:67;:::i;:::-;17149:74;;17232:93;17321:3;17232:93;:::i;:::-;17350:2;17345:3;17341:12;17334:19;;16993:366;;;:::o;17365:::-;17507:3;17528:67;17592:2;17587:3;17528:67;:::i;:::-;17521:74;;17604:93;17693:3;17604:93;:::i;:::-;17722:2;17717:3;17713:12;17706:19;;17365:366;;;:::o;17737:::-;17879:3;17900:67;17964:2;17959:3;17900:67;:::i;:::-;17893:74;;17976:93;18065:3;17976:93;:::i;:::-;18094:2;18089:3;18085:12;18078:19;;17737:366;;;:::o;18109:::-;18251:3;18272:67;18336:2;18331:3;18272:67;:::i;:::-;18265:74;;18348:93;18437:3;18348:93;:::i;:::-;18466:2;18461:3;18457:12;18450:19;;18109:366;;;:::o;18481:::-;18623:3;18644:67;18708:2;18703:3;18644:67;:::i;:::-;18637:74;;18720:93;18809:3;18720:93;:::i;:::-;18838:2;18833:3;18829:12;18822:19;;18481:366;;;:::o;18853:118::-;18940:24;18958:5;18940:24;:::i;:::-;18935:3;18928:37;18853:118;;:::o;18977:256::-;19089:3;19104:75;19175:3;19166:6;19104:75;:::i;:::-;19204:2;19199:3;19195:12;19188:19;;19224:3;19217:10;;18977:256;;;;:::o;19239:435::-;19419:3;19441:95;19532:3;19523:6;19441:95;:::i;:::-;19434:102;;19553:95;19644:3;19635:6;19553:95;:::i;:::-;19546:102;;19665:3;19658:10;;19239:435;;;;;:::o;19680:222::-;19773:4;19811:2;19800:9;19796:18;19788:26;;19824:71;19892:1;19881:9;19877:17;19868:6;19824:71;:::i;:::-;19680:222;;;;:::o;19908:254::-;20017:4;20055:2;20044:9;20040:18;20032:26;;20068:87;20152:1;20141:9;20137:17;20128:6;20068:87;:::i;:::-;19908:254;;;;:::o;20168:640::-;20363:4;20401:3;20390:9;20386:19;20378:27;;20415:71;20483:1;20472:9;20468:17;20459:6;20415:71;:::i;:::-;20496:72;20564:2;20553:9;20549:18;20540:6;20496:72;:::i;:::-;20578;20646:2;20635:9;20631:18;20622:6;20578:72;:::i;:::-;20697:9;20691:4;20687:20;20682:2;20671:9;20667:18;20660:48;20725:76;20796:4;20787:6;20725:76;:::i;:::-;20717:84;;20168:640;;;;;;;:::o;20814:210::-;20901:4;20939:2;20928:9;20924:18;20916:26;;20952:65;21014:1;21003:9;20999:17;20990:6;20952:65;:::i;:::-;20814:210;;;;:::o;21030:222::-;21123:4;21161:2;21150:9;21146:18;21138:26;;21174:71;21242:1;21231:9;21227:17;21218:6;21174:71;:::i;:::-;21030:222;;;;:::o;21258:313::-;21371:4;21409:2;21398:9;21394:18;21386:26;;21458:9;21452:4;21448:20;21444:1;21433:9;21429:17;21422:47;21486:78;21559:4;21550:6;21486:78;:::i;:::-;21478:86;;21258:313;;;;:::o;21577:419::-;21743:4;21781:2;21770:9;21766:18;21758:26;;21830:9;21824:4;21820:20;21816:1;21805:9;21801:17;21794:47;21858:131;21984:4;21858:131;:::i;:::-;21850:139;;21577:419;;;:::o;22002:::-;22168:4;22206:2;22195:9;22191:18;22183:26;;22255:9;22249:4;22245:20;22241:1;22230:9;22226:17;22219:47;22283:131;22409:4;22283:131;:::i;:::-;22275:139;;22002:419;;;:::o;22427:::-;22593:4;22631:2;22620:9;22616:18;22608:26;;22680:9;22674:4;22670:20;22666:1;22655:9;22651:17;22644:47;22708:131;22834:4;22708:131;:::i;:::-;22700:139;;22427:419;;;:::o;22852:::-;23018:4;23056:2;23045:9;23041:18;23033:26;;23105:9;23099:4;23095:20;23091:1;23080:9;23076:17;23069:47;23133:131;23259:4;23133:131;:::i;:::-;23125:139;;22852:419;;;:::o;23277:::-;23443:4;23481:2;23470:9;23466:18;23458:26;;23530:9;23524:4;23520:20;23516:1;23505:9;23501:17;23494:47;23558:131;23684:4;23558:131;:::i;:::-;23550:139;;23277:419;;;:::o;23702:::-;23868:4;23906:2;23895:9;23891:18;23883:26;;23955:9;23949:4;23945:20;23941:1;23930:9;23926:17;23919:47;23983:131;24109:4;23983:131;:::i;:::-;23975:139;;23702:419;;;:::o;24127:::-;24293:4;24331:2;24320:9;24316:18;24308:26;;24380:9;24374:4;24370:20;24366:1;24355:9;24351:17;24344:47;24408:131;24534:4;24408:131;:::i;:::-;24400:139;;24127:419;;;:::o;24552:::-;24718:4;24756:2;24745:9;24741:18;24733:26;;24805:9;24799:4;24795:20;24791:1;24780:9;24776:17;24769:47;24833:131;24959:4;24833:131;:::i;:::-;24825:139;;24552:419;;;:::o;24977:::-;25143:4;25181:2;25170:9;25166:18;25158:26;;25230:9;25224:4;25220:20;25216:1;25205:9;25201:17;25194:47;25258:131;25384:4;25258:131;:::i;:::-;25250:139;;24977:419;;;:::o;25402:::-;25568:4;25606:2;25595:9;25591:18;25583:26;;25655:9;25649:4;25645:20;25641:1;25630:9;25626:17;25619:47;25683:131;25809:4;25683:131;:::i;:::-;25675:139;;25402:419;;;:::o;25827:::-;25993:4;26031:2;26020:9;26016:18;26008:26;;26080:9;26074:4;26070:20;26066:1;26055:9;26051:17;26044:47;26108:131;26234:4;26108:131;:::i;:::-;26100:139;;25827:419;;;:::o;26252:::-;26418:4;26456:2;26445:9;26441:18;26433:26;;26505:9;26499:4;26495:20;26491:1;26480:9;26476:17;26469:47;26533:131;26659:4;26533:131;:::i;:::-;26525:139;;26252:419;;;:::o;26677:::-;26843:4;26881:2;26870:9;26866:18;26858:26;;26930:9;26924:4;26920:20;26916:1;26905:9;26901:17;26894:47;26958:131;27084:4;26958:131;:::i;:::-;26950:139;;26677:419;;;:::o;27102:::-;27268:4;27306:2;27295:9;27291:18;27283:26;;27355:9;27349:4;27345:20;27341:1;27330:9;27326:17;27319:47;27383:131;27509:4;27383:131;:::i;:::-;27375:139;;27102:419;;;:::o;27527:::-;27693:4;27731:2;27720:9;27716:18;27708:26;;27780:9;27774:4;27770:20;27766:1;27755:9;27751:17;27744:47;27808:131;27934:4;27808:131;:::i;:::-;27800:139;;27527:419;;;:::o;27952:::-;28118:4;28156:2;28145:9;28141:18;28133:26;;28205:9;28199:4;28195:20;28191:1;28180:9;28176:17;28169:47;28233:131;28359:4;28233:131;:::i;:::-;28225:139;;27952:419;;;:::o;28377:222::-;28470:4;28508:2;28497:9;28493:18;28485:26;;28521:71;28589:1;28578:9;28574:17;28565:6;28521:71;:::i;:::-;28377:222;;;;:::o;28605:129::-;28639:6;28666:20;;:::i;:::-;28656:30;;28695:33;28723:4;28715:6;28695:33;:::i;:::-;28605:129;;;:::o;28740:75::-;28773:6;28806:2;28800:9;28790:19;;28740:75;:::o;28821:311::-;28898:4;28988:18;28980:6;28977:30;28974:56;;;29010:18;;:::i;:::-;28974:56;29060:4;29052:6;29048:17;29040:25;;29120:4;29114;29110:15;29102:23;;28821:311;;;:::o;29138:307::-;29199:4;29289:18;29281:6;29278:30;29275:56;;;29311:18;;:::i;:::-;29275:56;29349:29;29371:6;29349:29;:::i;:::-;29341:37;;29433:4;29427;29423:15;29415:23;;29138:307;;;:::o;29451:98::-;29502:6;29536:5;29530:12;29520:22;;29451:98;;;:::o;29555:99::-;29607:6;29641:5;29635:12;29625:22;;29555:99;;;:::o;29660:168::-;29743:11;29777:6;29772:3;29765:19;29817:4;29812:3;29808:14;29793:29;;29660:168;;;;:::o;29834:169::-;29918:11;29952:6;29947:3;29940:19;29992:4;29987:3;29983:14;29968:29;;29834:169;;;;:::o;30009:148::-;30111:11;30148:3;30133:18;;30009:148;;;;:::o;30163:305::-;30203:3;30222:20;30240:1;30222:20;:::i;:::-;30217:25;;30256:20;30274:1;30256:20;:::i;:::-;30251:25;;30410:1;30342:66;30338:74;30335:1;30332:81;30329:107;;;30416:18;;:::i;:::-;30329:107;30460:1;30457;30453:9;30446:16;;30163:305;;;;:::o;30474:185::-;30514:1;30531:20;30549:1;30531:20;:::i;:::-;30526:25;;30565:20;30583:1;30565:20;:::i;:::-;30560:25;;30604:1;30594:35;;30609:18;;:::i;:::-;30594:35;30651:1;30648;30644:9;30639:14;;30474:185;;;;:::o;30665:348::-;30705:7;30728:20;30746:1;30728:20;:::i;:::-;30723:25;;30762:20;30780:1;30762:20;:::i;:::-;30757:25;;30950:1;30882:66;30878:74;30875:1;30872:81;30867:1;30860:9;30853:17;30849:105;30846:131;;;30957:18;;:::i;:::-;30846:131;31005:1;31002;30998:9;30987:20;;30665:348;;;;:::o;31019:191::-;31059:4;31079:20;31097:1;31079:20;:::i;:::-;31074:25;;31113:20;31131:1;31113:20;:::i;:::-;31108:25;;31152:1;31149;31146:8;31143:34;;;31157:18;;:::i;:::-;31143:34;31202:1;31199;31195:9;31187:17;;31019:191;;;;:::o;31216:96::-;31253:7;31282:24;31300:5;31282:24;:::i;:::-;31271:35;;31216:96;;;:::o;31318:104::-;31363:7;31392:24;31410:5;31392:24;:::i;:::-;31381:35;;31318:104;;;:::o;31428:90::-;31462:7;31505:5;31498:13;31491:21;31480:32;;31428:90;;;:::o;31524:77::-;31561:7;31590:5;31579:16;;31524:77;;;:::o;31607:149::-;31643:7;31683:66;31676:5;31672:78;31661:89;;31607:149;;;:::o;31762:126::-;31799:7;31839:42;31832:5;31828:54;31817:65;;31762:126;;;:::o;31894:77::-;31931:7;31960:5;31949:16;;31894:77;;;:::o;31977:154::-;32061:6;32056:3;32051;32038:30;32123:1;32114:6;32109:3;32105:16;32098:27;31977:154;;;:::o;32137:307::-;32205:1;32215:113;32229:6;32226:1;32223:13;32215:113;;;32314:1;32309:3;32305:11;32299:18;32295:1;32290:3;32286:11;32279:39;32251:2;32248:1;32244:10;32239:15;;32215:113;;;32346:6;32343:1;32340:13;32337:101;;;32426:1;32417:6;32412:3;32408:16;32401:27;32337:101;32186:258;32137:307;;;:::o;32450:320::-;32494:6;32531:1;32525:4;32521:12;32511:22;;32578:1;32572:4;32568:12;32599:18;32589:81;;32655:4;32647:6;32643:17;32633:27;;32589:81;32717:2;32709:6;32706:14;32686:18;32683:38;32680:84;;;32736:18;;:::i;:::-;32680:84;32501:269;32450:320;;;:::o;32776:281::-;32859:27;32881:4;32859:27;:::i;:::-;32851:6;32847:40;32989:6;32977:10;32974:22;32953:18;32941:10;32938:34;32935:62;32932:88;;;33000:18;;:::i;:::-;32932:88;33040:10;33036:2;33029:22;32819:238;32776:281;;:::o;33063:233::-;33102:3;33125:24;33143:5;33125:24;:::i;:::-;33116:33;;33171:66;33164:5;33161:77;33158:103;;;33241:18;;:::i;:::-;33158:103;33288:1;33281:5;33277:13;33270:20;;33063:233;;;:::o;33302:100::-;33341:7;33370:26;33390:5;33370:26;:::i;:::-;33359:37;;33302:100;;;:::o;33408:94::-;33447:7;33476:20;33490:5;33476:20;:::i;:::-;33465:31;;33408:94;;;:::o;33508:176::-;33540:1;33557:20;33575:1;33557:20;:::i;:::-;33552:25;;33591:20;33609:1;33591:20;:::i;:::-;33586:25;;33630:1;33620:35;;33635:18;;:::i;:::-;33620:35;33676:1;33673;33669:9;33664:14;;33508:176;;;;:::o;33690:180::-;33738:77;33735:1;33728:88;33835:4;33832:1;33825:15;33859:4;33856:1;33849:15;33876:180;33924:77;33921:1;33914:88;34021:4;34018:1;34011:15;34045:4;34042:1;34035:15;34062:180;34110:77;34107:1;34100:88;34207:4;34204:1;34197:15;34231:4;34228:1;34221:15;34248:180;34296:77;34293:1;34286:88;34393:4;34390:1;34383:15;34417:4;34414:1;34407:15;34434:180;34482:77;34479:1;34472:88;34579:4;34576:1;34569:15;34603:4;34600:1;34593:15;34620:117;34729:1;34726;34719:12;34743:117;34852:1;34849;34842:12;34866:117;34975:1;34972;34965:12;34989:117;35098:1;35095;35088:12;35112:117;35221:1;35218;35211:12;35235:117;35344:1;35341;35334:12;35358:102;35399:6;35450:2;35446:7;35441:2;35434:5;35430:14;35426:28;35416:38;;35358:102;;;:::o;35466:94::-;35499:8;35547:5;35543:2;35539:14;35518:35;;35466:94;;;:::o;35566:225::-;35706:34;35702:1;35694:6;35690:14;35683:58;35775:8;35770:2;35762:6;35758:15;35751:33;35566:225;:::o;35797:174::-;35937:26;35933:1;35925:6;35921:14;35914:50;35797:174;:::o;35977:223::-;36117:34;36113:1;36105:6;36101:14;36094:58;36186:6;36181:2;36173:6;36169:15;36162:31;35977:223;:::o;36206:174::-;36346:26;36342:1;36334:6;36330:14;36323:50;36206:174;:::o;36386:166::-;36526:18;36522:1;36514:6;36510:14;36503:42;36386:166;:::o;36558:167::-;36698:19;36694:1;36686:6;36682:14;36675:43;36558:167;:::o;36731:173::-;36871:25;36867:1;36859:6;36855:14;36848:49;36731:173;:::o;36910:182::-;37050:34;37046:1;37038:6;37034:14;37027:58;36910:182;:::o;37098:224::-;37238:34;37234:1;37226:6;37222:14;37215:58;37307:7;37302:2;37294:6;37290:15;37283:32;37098:224;:::o;37328:176::-;37468:28;37464:1;37456:6;37452:14;37445:52;37328:176;:::o;37510:222::-;37650:34;37646:1;37638:6;37634:14;37627:58;37719:5;37714:2;37706:6;37702:15;37695:30;37510:222;:::o;37738:171::-;37878:23;37874:1;37866:6;37862:14;37855:47;37738:171;:::o;37915:::-;38055:23;38051:1;38043:6;38039:14;38032:47;37915:171;:::o;38092:::-;38232:23;38228:1;38220:6;38216:14;38209:47;38092:171;:::o;38269:172::-;38409:24;38405:1;38397:6;38393:14;38386:48;38269:172;:::o;38447:::-;38587:24;38583:1;38575:6;38571:14;38564:48;38447:172;:::o;38625:122::-;38698:24;38716:5;38698:24;:::i;:::-;38691:5;38688:35;38678:63;;38737:1;38734;38727:12;38678:63;38625:122;:::o;38753:138::-;38834:32;38860:5;38834:32;:::i;:::-;38827:5;38824:43;38814:71;;38881:1;38878;38871:12;38814:71;38753:138;:::o;38897:116::-;38967:21;38982:5;38967:21;:::i;:::-;38960:5;38957:32;38947:60;;39003:1;39000;38993:12;38947:60;38897:116;:::o;39019:122::-;39092:24;39110:5;39092:24;:::i;:::-;39085:5;39082:35;39072:63;;39131:1;39128;39121:12;39072:63;39019:122;:::o;39147:120::-;39219:23;39236:5;39219:23;:::i;:::-;39212:5;39209:34;39199:62;;39257:1;39254;39247:12;39199:62;39147:120;:::o;39273:122::-;39346:24;39364:5;39346:24;:::i;:::-;39339:5;39336:35;39326:63;;39385:1;39382;39375:12;39326:63;39273:122;:::o

Swarm Source

ipfs://9d463f84ea3f352a7d507b12bc57a6ab6eda4c89d66cc5a5b84abf3a28e6cd40
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.