ETH Price: $3,377.65 (-1.93%)
Gas: 2 Gwei

Token

Censored Boys Syndicate (CNSRD)
 

Overview

Max Total Supply

7,777 CNSRD

Holders

1,726

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 CNSRD
0x820dfdc28a5d4dd681752190a6450c3f795a8116
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:
CensoredBoysSyndicate

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 2023-02-18
*/

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


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

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The tree and the proofs can be generated using our
 * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
 * You will find a quickstart guide in the readme.
 *
 * 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.
 * OpenZeppelin's JavaScript library generates merkle trees that are safe
 * against this attack out of the box.
 */
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 simultaneously proven to be a part of a merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _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}
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _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 sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     *
     * _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}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _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/security/ReentrancyGuard.sol


// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

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

// File: @openzeppelin/contracts/utils/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 (last updated v4.7.0) (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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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/security/Pausable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;


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

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

    bool private _paused;

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

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

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

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

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

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

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

// File: erc721a/contracts/IERC721A.sol


// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of ERC721A.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the
     * ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    // =============================================================
    //                            STRUCTS
    // =============================================================

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
        uint24 extraData;
    }

    // =============================================================
    //                         TOKEN COUNTERS
    // =============================================================

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() external view returns (uint256);

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    // =============================================================
    //                            IERC721
    // =============================================================

    /**
     * @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,
        bytes calldata data
    ) external payable;

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable;

    /**
     * @dev Transfers `tokenId` 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 payable;

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

    /**
     * @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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

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

    // =============================================================
    //                           IERC2309
    // =============================================================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId`
     * (inclusive) is transferred from `from` to `to`, as defined in the
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
     *
     * See {_mintERC2309} for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

// File: erc721a/contracts/ERC721A.sol


// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;


/**
 * @dev Interface of ERC721 token receiver.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364).
    struct TokenApprovalRef {
        address value;
    }

    // =============================================================
    //                           CONSTANTS
    // =============================================================

    // Mask of an entry in packed address data.
    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant _BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant _BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant _BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant _BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant _BITMASK_BURNED = 1 << 224;

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The bit position of `extraData` in packed ownership.
    uint256 private constant _BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum `quantity` that can be minted with {_mintERC2309}.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    // The `Transfer` event signature is given by:
    // `keccak256(bytes("Transfer(address,address,uint256)"))`.
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    // =============================================================
    //                            STORAGE
    // =============================================================

    // The next token ID to be minted.
    uint256 private _currentIndex;

    // The number of tokens burned.
    uint256 private _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 {_packedOwnershipOf} implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

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

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

    // =============================================================
    //                          CONSTRUCTOR
    // =============================================================

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

    // =============================================================
    //                   TOKEN COUNTING OPERATIONS
    // =============================================================

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

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view virtual returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

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

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view virtual returns (uint256) {
        return _burnCounter;
    }

    // =============================================================
    //                    ADDRESS DATA OPERATIONS
    // =============================================================

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

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

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

    /**
     * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes
        // of the XOR of all function selectors in the interface.
        // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
        // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`)
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

    /**
     * @dev Returns the token collection name.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    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, _toString(tokenId))) : '';
    }

    /**
     * @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, it can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    // =============================================================
    //                     OWNERSHIPS OPERATIONS
    // =============================================================

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    /**
     * @dev Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around over time.
     */
    function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal virtual {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & _BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an initialized ownership slot
                        // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                        // before an unintialized ownership slot
                        // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                        // Hence, `curr` will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
        ownership.burned = packed & _BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`.
            result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    // =============================================================
    //                      APPROVAL OPERATIONS
    // =============================================================

    /**
     * @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) public payable virtual override {
        address owner = ownerOf(tokenId);

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

        _tokenApprovals[tokenId].value = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @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) public virtual override {
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

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

    /**
     * @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. See {_mint}.
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`.
     */
    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, _BITMASK_ADDRESS)
            // `msgSender == owner || msgSender == approvedAddress`.
            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`.
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    // =============================================================
    //                      TRANSFER OPERATIONS
    // =============================================================

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) public payable virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

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

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @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 memory _data
    ) public payable virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

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

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

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

    // =============================================================
    //                        MINT OPERATIONS
    // =============================================================

    /**
     * @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 for each mint.
     */
    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            // The duplicated `log4` removes an extra check and reduces stack juggling.
            // The assembly, together with the surrounding Solidity code, have been
            // delicately arranged to nudge the compiler into producing optimized opcodes.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )

                // The `iszero(eq(,))` check ensures that large values of `quantity`
                // that overflows uint256 will make the loop run out of gas.
                // The compiler will optimize the `iszero` away for performance.
                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

            _currentIndex = end;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

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

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

            _currentIndex = startTokenId + quantity;
        }
        _afterTokenTransfers(address(0), to, startTokenId, 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.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal virtual {
        _mint(to, quantity);

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal virtual {
        _safeMint(to, quantity, '');
    }

    // =============================================================
    //                        BURN OPERATIONS
    // =============================================================

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

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

        address from = address(uint160(prevOwnershipPacked));

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

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

    // =============================================================
    //                     EXTRA DATA OPERATIONS
    // =============================================================

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * 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 _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
    }

    // =============================================================
    //                       OTHER OPERATIONS
    // =============================================================

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a uint256 to its ASCII string decimal representation.
     */
    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), but
            // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
            // We will need 1 word for the trailing zeros padding, 1 word for the length,
            // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
            let m := add(mload(0x40), 0xa0)
            // Update the free memory pointer to allocate.
            mstore(0x40, m)
            // Assign the `str` to the end.
            str := sub(m, 0x20)
            // Zeroize the slot after the string.
            mstore(str, 0)

            // Cache the end of the memory to calculate the length later.
            let end := str

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

            let length := sub(end, str)
            // Move the pointer 32 bytes leftwards to make room for the length.
            str := sub(str, 0x20)
            // Store the length.
            mstore(str, length)
        }
    }
}

// File: contracts/CensoredBoysSyndicate.sol



pragma solidity ^0.8.7;







contract CensoredBoysSyndicate is ERC721A, Ownable, ReentrancyGuard, Pausable{

    // uint256 mint variables
    uint256 public maxSupply = 7777;
    uint256 public mintPrice = 0.049 ether; // @dev 10 finney = 0.01 ether
    uint256 public wlMaxMint = 4;
    uint256 public publicMaxMint = 5;
    uint256 public wlMintPrice = 0.039 ether;

    //base uri, base extension
    string public baseExtension = ".json";
    string public baseURI;

    // booleans for if mint is enabled
    bool public publicMintEnabled = false;
    bool public wlMintEnabled = false;
    bool public revealed = false;

    // mappings to keep track of # of minted tokens per user
    mapping(address => uint256) public totalWlMint;
    mapping(address => uint256) public totalPublicMint;

    // merkle root
    bytes32 public root;

    constructor (
        string memory _initBaseURI,
        bytes32 _root
        ) ERC721A("Censored Boys Syndicate", "CNSRD") {
            setBaseURI(_initBaseURI);
            setRoot(_root); 
    }

    function airdrop(address[] calldata _address, uint256 _amount) external onlyOwner nonReentrant {

        require(totalSupply() + _amount <= maxSupply, "Error: max supply reached");

        for (uint i = 0; i < _address.length; i++) {
            _safeMint(_address[i], _amount);
        }
    }

    // Whitelist mint that requires merkle proof; user receives 1 free 
    function whitelistMint(uint256 _quantity, bytes32[] memory proof) external payable whenNotPaused nonReentrant {
            require(isValid(proof, keccak256(abi.encodePacked(msg.sender))), "Not a part of whitelist");
            require(wlMintEnabled, "Whitelist mint is currently paused"); 
            require(totalSupply() + _quantity <= maxSupply, "Error: max supply reached");
            require((totalWlMint[msg.sender] + _quantity) <= wlMaxMint, "Error: Cannot mint more than 4");
            require(msg.value >= (_quantity * wlMintPrice), "Not enough ether sent");

            totalWlMint[msg.sender] += _quantity;
            _safeMint(msg.sender, _quantity);

        
    }

    // verify merkle proof with a buf2hex(keccak256(address)) or keccak256(abi.encodePacked(address))
    function isValid(bytes32[] memory proof, bytes32 leaf) public view returns(bool) {
        return MerkleProof.verify(proof, root, leaf);
    }

    // Public mint with 20 per tx limit

    function publicMint(uint256 _quantity) external payable whenNotPaused nonReentrant {
        require((totalPublicMint[msg.sender] + _quantity) <= publicMaxMint, "Error: Cannot mint more than 5");
        require(publicMintEnabled, "Public mint is currently paused");
        require(msg.value >= (_quantity * mintPrice), "Not enough ether sent");
        require(totalSupply() + _quantity <= maxSupply, "Error: max supply reached");

        totalPublicMint[msg.sender] += _quantity;
        _safeMint(msg.sender, _quantity);
    }

    

    // returns the baseuri of collection, private
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }

    // override _statTokenId() from erc721a to start tokenId at 1
    function _startTokenId() internal view virtual override returns (uint256) {
        return 1;
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721A)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }

    // return tokenUri given the tokenId

    function tokenURI(uint256 tokenId)
    public
    view
    virtual
    override
    returns (string memory)
    {
    require(_exists(tokenId),"ERC721Metadata: URI query for nonexistent token");
    
    if (revealed == false) {
        return baseURI;
    } else {
        string memory currentBaseURI = _baseURI();
        return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, _toString(tokenId), baseExtension))
        : "";
    }
        
    }

    // owner updates and functions

    function togglePublicMint() external onlyOwner nonReentrant{
        publicMintEnabled = !publicMintEnabled;
    }

    function toggleWlMint() external onlyOwner nonReentrant{
        wlMintEnabled = !wlMintEnabled;
    }

    function enableBothMints() external onlyOwner nonReentrant{
        wlMintEnabled = true;
        publicMintEnabled = true;
    }

    function setPrice(uint256 _mintPrice) external onlyOwner nonReentrant{
    mintPrice = _mintPrice;
    }

    function setWlPrice(uint256 _wlMintPrice) external onlyOwner nonReentrant{
    wlMintPrice = _wlMintPrice;
    }

    function setmaxWl(uint256 _wlMaxMint) external onlyOwner nonReentrant{
    wlMaxMint = _wlMaxMint;
    }
  
    function pause() public onlyOwner nonReentrant{ 
        _pause();
    }

    function unpause() public onlyOwner nonReentrant{
        _unpause();
    }

    function setBaseURI(string memory _newURI) public onlyOwner nonReentrant{
        baseURI = _newURI;
    }

    function toggleReveal() public onlyOwner nonReentrant {
        revealed = !revealed;
    }

    function setRoot(bytes32 _root) public onlyOwner nonReentrant {
        root = _root;
    }

    function setMaxSupply(uint256 _maxSupply) external onlyOwner nonReentrant {
        maxSupply = _maxSupply;
    }

    // withdraw to owner(), i.e only if msg.sender is owner
    function withdraw() external onlyOwner nonReentrant {

        payable(owner()).transfer(address(this).balance);
    }


}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"bytes32","name":"_root","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address[]","name":"_address","type":"address[]"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableBothMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"bytes32","name":"leaf","type":"bytes32"}],"name":"isValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMaxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_wlMintPrice","type":"uint256"}],"name":"setWlPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_wlMaxMint","type":"uint256"}],"name":"setmaxWl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePublicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWlMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalPublicMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalWlMint","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wlMaxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wlMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wlMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

6080604052611e61600b5566ae153d89fe8000600c556004600d556005600e55668a8e4b1a3d8000600f556040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250601090805190602001906200007792919062000494565b506000601260006101000a81548160ff0219169083151502179055506000601260016101000a81548160ff0219169083151502179055506000601260026101000a81548160ff021916908315150217905550348015620000d657600080fd5b506040516200478f3803806200478f8339818101604052810190620000fc9190620005d9565b6040518060400160405280601781526020017f43656e736f72656420426f79732053796e6469636174650000000000000000008152506040518060400160405280600581526020017f434e53524400000000000000000000000000000000000000000000000000000081525081600290805190602001906200018092919062000494565b5080600390805190602001906200019992919062000494565b50620001aa6200021f60201b60201c565b6000819055505050620001d2620001c66200022860201b60201c565b6200023060201b60201c565b60016009819055506000600a60006101000a81548160ff0219169083151502179055506200020682620002f660201b60201c565b62000217816200034260201b60201c565b5050620008dc565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003066200037c60201b60201c565b620003166200040d60201b60201c565b80601190805190602001906200032e92919062000494565b506200033f6200046060201b60201c565b50565b620003526200037c60201b60201c565b620003626200040d60201b60201c565b80601581905550620003796200046060201b60201c565b50565b6200038c6200022860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003b26200046a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200040b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000402906200068d565b60405180910390fd5b565b6002600954141562000456576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200044d90620006af565b60405180910390fd5b6002600981905550565b6001600981905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620004a29062000781565b90600052602060002090601f016020900481019282620004c6576000855562000512565b82601f10620004e157805160ff191683800117855562000512565b8280016001018555821562000512579182015b8281111562000511578251825591602001919060010190620004f4565b5b50905062000521919062000525565b5090565b5b808211156200054057600081600090555060010162000526565b5090565b60006200055b6200055584620006fa565b620006d1565b9050828152602081018484840111156200057a576200057962000850565b5b620005878482856200074b565b509392505050565b600081519050620005a081620008c2565b92915050565b600082601f830112620005be57620005bd6200084b565b5b8151620005d084826020860162000544565b91505092915050565b60008060408385031215620005f357620005f26200085a565b5b600083015167ffffffffffffffff81111562000614576200061362000855565b5b6200062285828601620005a6565b925050602062000635858286016200058f565b9150509250929050565b60006200064e60208362000730565b91506200065b8262000870565b602082019050919050565b600062000675601f8362000730565b9150620006828262000899565b602082019050919050565b60006020820190508181036000830152620006a8816200063f565b9050919050565b60006020820190508181036000830152620006ca8162000666565b9050919050565b6000620006dd620006f0565b9050620006eb8282620007b7565b919050565b6000604051905090565b600067ffffffffffffffff8211156200071857620007176200081c565b5b62000723826200085f565b9050602081019050919050565b600082825260208201905092915050565b6000819050919050565b60005b838110156200076b5780820151818401526020810190506200074e565b838111156200077b576000848401525b50505050565b600060028204905060018216806200079a57607f821691505b60208210811415620007b157620007b0620007ed565b5b50919050565b620007c2826200085f565b810181811067ffffffffffffffff82111715620007e457620007e36200081c565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b620008cd8162000741565b8114620008d957600080fd5b50565b613ea380620008ec6000396000f3fe6080604052600436106102935760003560e01c80636c0360eb1161015a578063b8a20ed0116100c1578063dab5f3401161007a578063dab5f3401461091c578063e4b3568314610945578063e985e9c514610970578063ebf0c717146109ad578063f2e83403146109d8578063f2fde38b14610a1557610293565b8063b8a20ed014610807578063c204642c14610844578063c66828621461086d578063c87b56dd14610898578063d2cab056146108d5578063d5abeb01146108f157610293565b80638dd07d0f116101135780638dd07d0f1461072e57806391b7f5ed1461075757806395d89b41146107805780639c08feb2146107ab578063a22cb465146107c2578063b88d4fde146107eb57610293565b80636c0360eb146106445780636f8b44b01461066f57806370a0823114610698578063715018a6146106d55780638456cb59146106ec5780638da5cb5b1461070357610293565b8063305c7d4a116101fe57806351830227116101b7578063518302271461054657806355f804b3146105715780635b8ad4291461059a5780635c975abb146105b15780636352211e146105dc5780636817c76c1461061957610293565b8063305c7d4a146104a35780633ccfd60b146104ce5780633f4ba83a146104e55780634047638d146104fc57806342842e0e14610513578063450f6b861461052f57610293565b806318160ddd1161025057806318160ddd146103af5780631c16521c146103da57806323b872dd14610417578063258e835b146104335780632c4e9fc61461045c5780632db115441461048757610293565b806301ffc9a71461029857806306fdde03146102d5578063081812fc14610300578063095ea7b31461033d5780630f4161aa1461035957806311f95ac314610384575b600080fd5b3480156102a457600080fd5b506102bf60048036038101906102ba9190613002565b610a3e565b6040516102cc919061351d565b60405180910390f35b3480156102e157600080fd5b506102ea610a50565b6040516102f79190613553565b60405180910390f35b34801561030c57600080fd5b50610327600480360381019061032291906130a5565b610ae2565b60405161033491906134b6565b60405180910390f35b61035760048036038101906103529190612ed9565b610b61565b005b34801561036557600080fd5b5061036e610ca5565b60405161037b919061351d565b60405180910390f35b34801561039057600080fd5b50610399610cb8565b6040516103a6919061351d565b60405180910390f35b3480156103bb57600080fd5b506103c4610ccb565b6040516103d19190613715565b60405180910390f35b3480156103e657600080fd5b5061040160048036038101906103fc9190612d56565b610ce2565b60405161040e9190613715565b60405180910390f35b610431600480360381019061042c9190612dc3565b610cfa565b005b34801561043f57600080fd5b5061045a600480360381019061045591906130a5565b61101f565b005b34801561046857600080fd5b50610471611041565b60405161047e9190613715565b60405180910390f35b6104a1600480360381019061049c91906130a5565b611047565b005b3480156104af57600080fd5b506104b8611247565b6040516104c59190613715565b60405180910390f35b3480156104da57600080fd5b506104e361124d565b005b3480156104f157600080fd5b506104fa6112b5565b005b34801561050857600080fd5b506105116112d7565b005b61052d60048036038101906105289190612dc3565b61131b565b005b34801561053b57600080fd5b5061054461133b565b005b34801561055257600080fd5b5061055b61138b565b604051610568919061351d565b60405180910390f35b34801561057d57600080fd5b506105986004803603810190610593919061305c565b61139e565b005b3480156105a657600080fd5b506105af6113d0565b005b3480156105bd57600080fd5b506105c6611414565b6040516105d3919061351d565b60405180910390f35b3480156105e857600080fd5b5061060360048036038101906105fe91906130a5565b61142b565b60405161061091906134b6565b60405180910390f35b34801561062557600080fd5b5061062e61143d565b60405161063b9190613715565b60405180910390f35b34801561065057600080fd5b50610659611443565b6040516106669190613553565b60405180910390f35b34801561067b57600080fd5b50610696600480360381019061069191906130a5565b6114d1565b005b3480156106a457600080fd5b506106bf60048036038101906106ba9190612d56565b6114f3565b6040516106cc9190613715565b60405180910390f35b3480156106e157600080fd5b506106ea6115ac565b005b3480156106f857600080fd5b506107016115c0565b005b34801561070f57600080fd5b506107186115e2565b60405161072591906134b6565b60405180910390f35b34801561073a57600080fd5b50610755600480360381019061075091906130a5565b61160c565b005b34801561076357600080fd5b5061077e600480360381019061077991906130a5565b61162e565b005b34801561078c57600080fd5b50610795611650565b6040516107a29190613553565b60405180910390f35b3480156107b757600080fd5b506107c06116e2565b005b3480156107ce57600080fd5b506107e960048036038101906107e49190612e99565b611726565b005b61080560048036038101906108009190612e16565b611831565b005b34801561081357600080fd5b5061082e60048036038101906108299190612f79565b6118a4565b60405161083b919061351d565b60405180910390f35b34801561085057600080fd5b5061086b60048036038101906108669190612f19565b6118bb565b005b34801561087957600080fd5b50610882611982565b60405161088f9190613553565b60405180910390f35b3480156108a457600080fd5b506108bf60048036038101906108ba91906130a5565b611a10565b6040516108cc9190613553565b60405180910390f35b6108ef60048036038101906108ea91906130d2565b611b69565b005b3480156108fd57600080fd5b50610906611dd9565b6040516109139190613715565b60405180910390f35b34801561092857600080fd5b50610943600480360381019061093e9190612fd5565b611ddf565b005b34801561095157600080fd5b5061095a611e01565b6040516109679190613715565b60405180910390f35b34801561097c57600080fd5b5061099760048036038101906109929190612d83565b611e07565b6040516109a4919061351d565b60405180910390f35b3480156109b957600080fd5b506109c2611e9b565b6040516109cf9190613538565b60405180910390f35b3480156109e457600080fd5b506109ff60048036038101906109fa9190612d56565b611ea1565b604051610a0c9190613715565b60405180910390f35b348015610a2157600080fd5b50610a3c6004803603810190610a379190612d56565b611eb9565b005b6000610a4982611f3d565b9050919050565b606060028054610a5f906139ab565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8b906139ab565b8015610ad85780601f10610aad57610100808354040283529160200191610ad8565b820191906000526020600020905b815481529060010190602001808311610abb57829003601f168201915b5050505050905090565b6000610aed82611fcf565b610b23576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b6c8261142b565b90508073ffffffffffffffffffffffffffffffffffffffff16610b8d61202e565b73ffffffffffffffffffffffffffffffffffffffff1614610bf057610bb981610bb461202e565b611e07565b610bef576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b601260009054906101000a900460ff1681565b601260019054906101000a900460ff1681565b6000610cd5612036565b6001546000540303905090565b60146020528060005260406000206000915090505481565b6000610d058261203f565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d6c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610d788461210d565b91509150610d8e8187610d8961202e565b612134565b610dda57610da386610d9e61202e565b611e07565b610dd9576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610e41576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e4e8686866001612178565b8015610e5957600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610f2785610f0388888761217e565b7c0200000000000000000000000000000000000000000000000000000000176121a6565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610faf576000600185019050600060046000838152602001908152602001600020541415610fad576000548114610fac578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461101786868660016121d1565b505050505050565b6110276121d7565b61102f612255565b80600d8190555061103e6122a5565b50565b600f5481565b61104f6122af565b611057612255565b600e5481601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110a5919061383b565b11156110e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110dd906136d5565b60405180910390fd5b601260009054906101000a900460ff16611135576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112c906136b5565b60405180910390fd5b600c54816111439190613891565b341015611185576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117c90613695565b60405180910390fd5b600b5481611191610ccb565b61119b919061383b565b11156111dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d390613675565b60405180910390fd5b80601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461122b919061383b565b9250508190555061123c33826122f9565b6112446122a5565b50565b600e5481565b6112556121d7565b61125d612255565b6112656115e2565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156112aa573d6000803e3d6000fd5b506112b36122a5565b565b6112bd6121d7565b6112c5612255565b6112cd612317565b6112d56122a5565b565b6112df6121d7565b6112e7612255565b601260009054906101000a900460ff1615601260006101000a81548160ff0219169083151502179055506113196122a5565b565b61133683838360405180602001604052806000815250611831565b505050565b6113436121d7565b61134b612255565b6001601260016101000a81548160ff0219169083151502179055506001601260006101000a81548160ff0219169083151502179055506113896122a5565b565b601260029054906101000a900460ff1681565b6113a66121d7565b6113ae612255565b80601190805190602001906113c4929190612a61565b506113cd6122a5565b50565b6113d86121d7565b6113e0612255565b601260029054906101000a900460ff1615601260026101000a81548160ff0219169083151502179055506114126122a5565b565b6000600a60009054906101000a900460ff16905090565b60006114368261203f565b9050919050565b600c5481565b60118054611450906139ab565b80601f016020809104026020016040519081016040528092919081815260200182805461147c906139ab565b80156114c95780601f1061149e576101008083540402835291602001916114c9565b820191906000526020600020905b8154815290600101906020018083116114ac57829003601f168201915b505050505081565b6114d96121d7565b6114e1612255565b80600b819055506114f06122a5565b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561155b576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6115b46121d7565b6115be600061237a565b565b6115c86121d7565b6115d0612255565b6115d8612440565b6115e06122a5565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6116146121d7565b61161c612255565b80600f8190555061162b6122a5565b50565b6116366121d7565b61163e612255565b80600c8190555061164d6122a5565b50565b60606003805461165f906139ab565b80601f016020809104026020016040519081016040528092919081815260200182805461168b906139ab565b80156116d85780601f106116ad576101008083540402835291602001916116d8565b820191906000526020600020905b8154815290600101906020018083116116bb57829003601f168201915b5050505050905090565b6116ea6121d7565b6116f2612255565b601260019054906101000a900460ff1615601260016101000a81548160ff0219169083151502179055506117246122a5565b565b806007600061173361202e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117e061202e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611825919061351d565b60405180910390a35050565b61183c848484610cfa565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461189e57611867848484846124a3565b61189d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60006118b38360155484612603565b905092915050565b6118c36121d7565b6118cb612255565b600b54816118d7610ccb565b6118e1919061383b565b1115611922576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191990613675565b60405180910390fd5b60005b838390508110156119745761196184848381811061194657611945613ad9565b5b905060200201602081019061195b9190612d56565b836122f9565b808061196c90613a0e565b915050611925565b5061197d6122a5565b505050565b6010805461198f906139ab565b80601f01602080910402602001604051908101604052809291908181526020018280546119bb906139ab565b8015611a085780601f106119dd57610100808354040283529160200191611a08565b820191906000526020600020905b8154815290600101906020018083116119eb57829003601f168201915b505050505081565b6060611a1b82611fcf565b611a5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5190613635565b60405180910390fd5b60001515601260029054906101000a900460ff1615151415611b085760118054611a83906139ab565b80601f0160208091040260200160405190810160405280929190818152602001828054611aaf906139ab565b8015611afc5780601f10611ad157610100808354040283529160200191611afc565b820191906000526020600020905b815481529060010190602001808311611adf57829003601f168201915b50505050509050611b64565b6000611b1261261a565b90506000815111611b325760405180602001604052806000815250611b60565b80611b3c846126ac565b6010604051602001611b5093929190613485565b6040516020818303038152906040525b9150505b919050565b611b716122af565b611b79612255565b611ba98133604051602001611b8e919061346a565b604051602081830303815290604052805190602001206118a4565b611be8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdf906135f5565b60405180910390fd5b601260019054906101000a900460ff16611c37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2e90613655565b60405180910390fd5b600b5482611c43610ccb565b611c4d919061383b565b1115611c8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8590613675565b60405180910390fd5b600d5482601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cdc919061383b565b1115611d1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d14906135b5565b60405180910390fd5b600f5482611d2b9190613891565b341015611d6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6490613695565b60405180910390fd5b81601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dbc919061383b565b92505081905550611dcd33836122f9565b611dd56122a5565b5050565b600b5481565b611de76121d7565b611def612255565b80601581905550611dfe6122a5565b50565b600d5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60155481565b60136020528060005260406000206000915090505481565b611ec16121d7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2890613595565b60405180910390fd5b611f3a8161237a565b50565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611f9857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611fc85750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600081611fda612036565b11158015611fe9575060005482105b8015612027575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b6000808290508061204e612036565b116120d6576000548110156120d55760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156120d3575b60008114156120c957600460008360019003935083815260200190815260200160002054905061209e565b8092505050612108565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612195868684612705565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6121df61270e565b73ffffffffffffffffffffffffffffffffffffffff166121fd6115e2565b73ffffffffffffffffffffffffffffffffffffffff1614612253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224a90613615565b60405180910390fd5b565b6002600954141561229b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612292906136f5565b60405180910390fd5b6002600981905550565b6001600981905550565b6122b7611414565b156122f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ee906135d5565b60405180910390fd5b565b612313828260405180602001604052806000815250612716565b5050565b61231f6127b3565b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61236361270e565b60405161237091906134b6565b60405180910390a1565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6124486122af565b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861248c61270e565b60405161249991906134b6565b60405180910390a1565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026124c961202e565b8786866040518563ffffffff1660e01b81526004016124eb94939291906134d1565b602060405180830381600087803b15801561250557600080fd5b505af192505050801561253657506040513d601f19601f82011682018060405250810190612533919061302f565b60015b6125b0573d8060008114612566576040519150601f19603f3d011682016040523d82523d6000602084013e61256b565b606091505b506000815114156125a8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60008261261085846127fc565b1490509392505050565b606060118054612629906139ab565b80601f0160208091040260200160405190810160405280929190818152602001828054612655906139ab565b80156126a25780601f10612677576101008083540402835291602001916126a2565b820191906000526020600020905b81548152906001019060200180831161268557829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b6001156126f057600184039350600a81066030018453600a81049050806126eb576126f0565b6126c5565b50828103602084039350808452505050919050565b60009392505050565b600033905090565b6127208383612852565b60008373ffffffffffffffffffffffffffffffffffffffff163b146127ae57600080549050600083820390505b61276060008683806001019450866124a3565b612796576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061274d5781600054146127ab57600080fd5b50505b505050565b6127bb611414565b6127fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f190613575565b60405180910390fd5b565b60008082905060005b8451811015612847576128328286838151811061282557612824613ad9565b5b6020026020010151612a0f565b9150808061283f90613a0e565b915050612805565b508091505092915050565b6000805490506000821415612893576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128a06000848385612178565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061291783612908600086600061217e565b61291185612a3a565b176121a6565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146129b857808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061297d565b5060008214156129f4576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050612a0a60008483856121d1565b505050565b6000818310612a2757612a228284612a4a565b612a32565b612a318383612a4a565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b828054612a6d906139ab565b90600052602060002090601f016020900481019282612a8f5760008555612ad6565b82601f10612aa857805160ff1916838001178555612ad6565b82800160010185558215612ad6579182015b82811115612ad5578251825591602001919060010190612aba565b5b509050612ae39190612ae7565b5090565b5b80821115612b00576000816000905550600101612ae8565b5090565b6000612b17612b1284613755565b613730565b90508083825260208201905082856020860282011115612b3a57612b39613b41565b5b60005b85811015612b6a5781612b508882612ca6565b845260208401935060208301925050600181019050612b3d565b5050509392505050565b6000612b87612b8284613781565b613730565b905082815260208101848484011115612ba357612ba2613b46565b5b612bae848285613969565b509392505050565b6000612bc9612bc4846137b2565b613730565b905082815260208101848484011115612be557612be4613b46565b5b612bf0848285613969565b509392505050565b600081359050612c0781613dfa565b92915050565b60008083601f840112612c2357612c22613b3c565b5b8235905067ffffffffffffffff811115612c4057612c3f613b37565b5b602083019150836020820283011115612c5c57612c5b613b41565b5b9250929050565b600082601f830112612c7857612c77613b3c565b5b8135612c88848260208601612b04565b91505092915050565b600081359050612ca081613e11565b92915050565b600081359050612cb581613e28565b92915050565b600081359050612cca81613e3f565b92915050565b600081519050612cdf81613e3f565b92915050565b600082601f830112612cfa57612cf9613b3c565b5b8135612d0a848260208601612b74565b91505092915050565b600082601f830112612d2857612d27613b3c565b5b8135612d38848260208601612bb6565b91505092915050565b600081359050612d5081613e56565b92915050565b600060208284031215612d6c57612d6b613b50565b5b6000612d7a84828501612bf8565b91505092915050565b60008060408385031215612d9a57612d99613b50565b5b6000612da885828601612bf8565b9250506020612db985828601612bf8565b9150509250929050565b600080600060608486031215612ddc57612ddb613b50565b5b6000612dea86828701612bf8565b9350506020612dfb86828701612bf8565b9250506040612e0c86828701612d41565b9150509250925092565b60008060008060808587031215612e3057612e2f613b50565b5b6000612e3e87828801612bf8565b9450506020612e4f87828801612bf8565b9350506040612e6087828801612d41565b925050606085013567ffffffffffffffff811115612e8157612e80613b4b565b5b612e8d87828801612ce5565b91505092959194509250565b60008060408385031215612eb057612eaf613b50565b5b6000612ebe85828601612bf8565b9250506020612ecf85828601612c91565b9150509250929050565b60008060408385031215612ef057612eef613b50565b5b6000612efe85828601612bf8565b9250506020612f0f85828601612d41565b9150509250929050565b600080600060408486031215612f3257612f31613b50565b5b600084013567ffffffffffffffff811115612f5057612f4f613b4b565b5b612f5c86828701612c0d565b93509350506020612f6f86828701612d41565b9150509250925092565b60008060408385031215612f9057612f8f613b50565b5b600083013567ffffffffffffffff811115612fae57612fad613b4b565b5b612fba85828601612c63565b9250506020612fcb85828601612ca6565b9150509250929050565b600060208284031215612feb57612fea613b50565b5b6000612ff984828501612ca6565b91505092915050565b60006020828403121561301857613017613b50565b5b600061302684828501612cbb565b91505092915050565b60006020828403121561304557613044613b50565b5b600061305384828501612cd0565b91505092915050565b60006020828403121561307257613071613b50565b5b600082013567ffffffffffffffff8111156130905761308f613b4b565b5b61309c84828501612d13565b91505092915050565b6000602082840312156130bb576130ba613b50565b5b60006130c984828501612d41565b91505092915050565b600080604083850312156130e9576130e8613b50565b5b60006130f785828601612d41565b925050602083013567ffffffffffffffff81111561311857613117613b4b565b5b61312485828601612c63565b9150509250929050565b613137816138eb565b82525050565b61314e613149826138eb565b613a57565b82525050565b61315d816138fd565b82525050565b61316c81613909565b82525050565b600061317d826137f8565b613187818561380e565b9350613197818560208601613978565b6131a081613b55565b840191505092915050565b60006131b682613803565b6131c0818561381f565b93506131d0818560208601613978565b6131d981613b55565b840191505092915050565b60006131ef82613803565b6131f98185613830565b9350613209818560208601613978565b80840191505092915050565b60008154613222816139ab565b61322c8186613830565b9450600182166000811461324757600181146132585761328b565b60ff1983168652818601935061328b565b613261856137e3565b60005b8381101561328357815481890152600182019150602081019050613264565b838801955050505b50505092915050565b60006132a160148361381f565b91506132ac82613b73565b602082019050919050565b60006132c460268361381f565b91506132cf82613b9c565b604082019050919050565b60006132e7601e8361381f565b91506132f282613beb565b602082019050919050565b600061330a60108361381f565b915061331582613c14565b602082019050919050565b600061332d60178361381f565b915061333882613c3d565b602082019050919050565b600061335060208361381f565b915061335b82613c66565b602082019050919050565b6000613373602f8361381f565b915061337e82613c8f565b604082019050919050565b600061339660228361381f565b91506133a182613cde565b604082019050919050565b60006133b960198361381f565b91506133c482613d2d565b602082019050919050565b60006133dc60158361381f565b91506133e782613d56565b602082019050919050565b60006133ff601f8361381f565b915061340a82613d7f565b602082019050919050565b6000613422601e8361381f565b915061342d82613da8565b602082019050919050565b6000613445601f8361381f565b915061345082613dd1565b602082019050919050565b6134648161395f565b82525050565b6000613476828461313d565b60148201915081905092915050565b600061349182866131e4565b915061349d82856131e4565b91506134a98284613215565b9150819050949350505050565b60006020820190506134cb600083018461312e565b92915050565b60006080820190506134e6600083018761312e565b6134f3602083018661312e565b613500604083018561345b565b81810360608301526135128184613172565b905095945050505050565b60006020820190506135326000830184613154565b92915050565b600060208201905061354d6000830184613163565b92915050565b6000602082019050818103600083015261356d81846131ab565b905092915050565b6000602082019050818103600083015261358e81613294565b9050919050565b600060208201905081810360008301526135ae816132b7565b9050919050565b600060208201905081810360008301526135ce816132da565b9050919050565b600060208201905081810360008301526135ee816132fd565b9050919050565b6000602082019050818103600083015261360e81613320565b9050919050565b6000602082019050818103600083015261362e81613343565b9050919050565b6000602082019050818103600083015261364e81613366565b9050919050565b6000602082019050818103600083015261366e81613389565b9050919050565b6000602082019050818103600083015261368e816133ac565b9050919050565b600060208201905081810360008301526136ae816133cf565b9050919050565b600060208201905081810360008301526136ce816133f2565b9050919050565b600060208201905081810360008301526136ee81613415565b9050919050565b6000602082019050818103600083015261370e81613438565b9050919050565b600060208201905061372a600083018461345b565b92915050565b600061373a61374b565b905061374682826139dd565b919050565b6000604051905090565b600067ffffffffffffffff8211156137705761376f613b08565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561379c5761379b613b08565b5b6137a582613b55565b9050602081019050919050565b600067ffffffffffffffff8211156137cd576137cc613b08565b5b6137d682613b55565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006138468261395f565b91506138518361395f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561388657613885613a7b565b5b828201905092915050565b600061389c8261395f565b91506138a78361395f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156138e0576138df613a7b565b5b828202905092915050565b60006138f68261393f565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561399657808201518184015260208101905061397b565b838111156139a5576000848401525b50505050565b600060028204905060018216806139c357607f821691505b602082108114156139d7576139d6613aaa565b5b50919050565b6139e682613b55565b810181811067ffffffffffffffff82111715613a0557613a04613b08565b5b80604052505050565b6000613a198261395f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a4c57613a4b613a7b565b5b600182019050919050565b6000613a6282613a69565b9050919050565b6000613a7482613b66565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4572726f723a2043616e6e6f74206d696e74206d6f7265207468616e20340000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4e6f7420612070617274206f662077686974656c697374000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f57686974656c697374206d696e742069732063757272656e746c79207061757360008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b7f4572726f723a206d617820737570706c79207265616368656400000000000000600082015250565b7f4e6f7420656e6f7567682065746865722073656e740000000000000000000000600082015250565b7f5075626c6963206d696e742069732063757272656e746c792070617573656400600082015250565b7f4572726f723a2043616e6e6f74206d696e74206d6f7265207468616e20350000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b613e03816138eb565b8114613e0e57600080fd5b50565b613e1a816138fd565b8114613e2557600080fd5b50565b613e3181613909565b8114613e3c57600080fd5b50565b613e4881613913565b8114613e5357600080fd5b50565b613e5f8161395f565b8114613e6a57600080fd5b5056fea26469706673582212207ae4b3ad724d83626c104088b571ad6c660c46d8b813e290eb6657c8d2cc94c464736f6c634300080700330000000000000000000000000000000000000000000000000000000000000040c14a745d9c6c399c8510468b30c6fd1496190859230f6792595c7859c38283b1000000000000000000000000000000000000000000000000000000000000005c68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d55325272667a3963467235656f4169614e67586671457971756a6b7977505477415452544e557036516e74622f68696464656e2e6a736f6e00000000

Deployed Bytecode

0x6080604052600436106102935760003560e01c80636c0360eb1161015a578063b8a20ed0116100c1578063dab5f3401161007a578063dab5f3401461091c578063e4b3568314610945578063e985e9c514610970578063ebf0c717146109ad578063f2e83403146109d8578063f2fde38b14610a1557610293565b8063b8a20ed014610807578063c204642c14610844578063c66828621461086d578063c87b56dd14610898578063d2cab056146108d5578063d5abeb01146108f157610293565b80638dd07d0f116101135780638dd07d0f1461072e57806391b7f5ed1461075757806395d89b41146107805780639c08feb2146107ab578063a22cb465146107c2578063b88d4fde146107eb57610293565b80636c0360eb146106445780636f8b44b01461066f57806370a0823114610698578063715018a6146106d55780638456cb59146106ec5780638da5cb5b1461070357610293565b8063305c7d4a116101fe57806351830227116101b7578063518302271461054657806355f804b3146105715780635b8ad4291461059a5780635c975abb146105b15780636352211e146105dc5780636817c76c1461061957610293565b8063305c7d4a146104a35780633ccfd60b146104ce5780633f4ba83a146104e55780634047638d146104fc57806342842e0e14610513578063450f6b861461052f57610293565b806318160ddd1161025057806318160ddd146103af5780631c16521c146103da57806323b872dd14610417578063258e835b146104335780632c4e9fc61461045c5780632db115441461048757610293565b806301ffc9a71461029857806306fdde03146102d5578063081812fc14610300578063095ea7b31461033d5780630f4161aa1461035957806311f95ac314610384575b600080fd5b3480156102a457600080fd5b506102bf60048036038101906102ba9190613002565b610a3e565b6040516102cc919061351d565b60405180910390f35b3480156102e157600080fd5b506102ea610a50565b6040516102f79190613553565b60405180910390f35b34801561030c57600080fd5b50610327600480360381019061032291906130a5565b610ae2565b60405161033491906134b6565b60405180910390f35b61035760048036038101906103529190612ed9565b610b61565b005b34801561036557600080fd5b5061036e610ca5565b60405161037b919061351d565b60405180910390f35b34801561039057600080fd5b50610399610cb8565b6040516103a6919061351d565b60405180910390f35b3480156103bb57600080fd5b506103c4610ccb565b6040516103d19190613715565b60405180910390f35b3480156103e657600080fd5b5061040160048036038101906103fc9190612d56565b610ce2565b60405161040e9190613715565b60405180910390f35b610431600480360381019061042c9190612dc3565b610cfa565b005b34801561043f57600080fd5b5061045a600480360381019061045591906130a5565b61101f565b005b34801561046857600080fd5b50610471611041565b60405161047e9190613715565b60405180910390f35b6104a1600480360381019061049c91906130a5565b611047565b005b3480156104af57600080fd5b506104b8611247565b6040516104c59190613715565b60405180910390f35b3480156104da57600080fd5b506104e361124d565b005b3480156104f157600080fd5b506104fa6112b5565b005b34801561050857600080fd5b506105116112d7565b005b61052d60048036038101906105289190612dc3565b61131b565b005b34801561053b57600080fd5b5061054461133b565b005b34801561055257600080fd5b5061055b61138b565b604051610568919061351d565b60405180910390f35b34801561057d57600080fd5b506105986004803603810190610593919061305c565b61139e565b005b3480156105a657600080fd5b506105af6113d0565b005b3480156105bd57600080fd5b506105c6611414565b6040516105d3919061351d565b60405180910390f35b3480156105e857600080fd5b5061060360048036038101906105fe91906130a5565b61142b565b60405161061091906134b6565b60405180910390f35b34801561062557600080fd5b5061062e61143d565b60405161063b9190613715565b60405180910390f35b34801561065057600080fd5b50610659611443565b6040516106669190613553565b60405180910390f35b34801561067b57600080fd5b50610696600480360381019061069191906130a5565b6114d1565b005b3480156106a457600080fd5b506106bf60048036038101906106ba9190612d56565b6114f3565b6040516106cc9190613715565b60405180910390f35b3480156106e157600080fd5b506106ea6115ac565b005b3480156106f857600080fd5b506107016115c0565b005b34801561070f57600080fd5b506107186115e2565b60405161072591906134b6565b60405180910390f35b34801561073a57600080fd5b50610755600480360381019061075091906130a5565b61160c565b005b34801561076357600080fd5b5061077e600480360381019061077991906130a5565b61162e565b005b34801561078c57600080fd5b50610795611650565b6040516107a29190613553565b60405180910390f35b3480156107b757600080fd5b506107c06116e2565b005b3480156107ce57600080fd5b506107e960048036038101906107e49190612e99565b611726565b005b61080560048036038101906108009190612e16565b611831565b005b34801561081357600080fd5b5061082e60048036038101906108299190612f79565b6118a4565b60405161083b919061351d565b60405180910390f35b34801561085057600080fd5b5061086b60048036038101906108669190612f19565b6118bb565b005b34801561087957600080fd5b50610882611982565b60405161088f9190613553565b60405180910390f35b3480156108a457600080fd5b506108bf60048036038101906108ba91906130a5565b611a10565b6040516108cc9190613553565b60405180910390f35b6108ef60048036038101906108ea91906130d2565b611b69565b005b3480156108fd57600080fd5b50610906611dd9565b6040516109139190613715565b60405180910390f35b34801561092857600080fd5b50610943600480360381019061093e9190612fd5565b611ddf565b005b34801561095157600080fd5b5061095a611e01565b6040516109679190613715565b60405180910390f35b34801561097c57600080fd5b5061099760048036038101906109929190612d83565b611e07565b6040516109a4919061351d565b60405180910390f35b3480156109b957600080fd5b506109c2611e9b565b6040516109cf9190613538565b60405180910390f35b3480156109e457600080fd5b506109ff60048036038101906109fa9190612d56565b611ea1565b604051610a0c9190613715565b60405180910390f35b348015610a2157600080fd5b50610a3c6004803603810190610a379190612d56565b611eb9565b005b6000610a4982611f3d565b9050919050565b606060028054610a5f906139ab565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8b906139ab565b8015610ad85780601f10610aad57610100808354040283529160200191610ad8565b820191906000526020600020905b815481529060010190602001808311610abb57829003601f168201915b5050505050905090565b6000610aed82611fcf565b610b23576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b6c8261142b565b90508073ffffffffffffffffffffffffffffffffffffffff16610b8d61202e565b73ffffffffffffffffffffffffffffffffffffffff1614610bf057610bb981610bb461202e565b611e07565b610bef576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b601260009054906101000a900460ff1681565b601260019054906101000a900460ff1681565b6000610cd5612036565b6001546000540303905090565b60146020528060005260406000206000915090505481565b6000610d058261203f565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d6c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610d788461210d565b91509150610d8e8187610d8961202e565b612134565b610dda57610da386610d9e61202e565b611e07565b610dd9576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610e41576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e4e8686866001612178565b8015610e5957600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610f2785610f0388888761217e565b7c0200000000000000000000000000000000000000000000000000000000176121a6565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610faf576000600185019050600060046000838152602001908152602001600020541415610fad576000548114610fac578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461101786868660016121d1565b505050505050565b6110276121d7565b61102f612255565b80600d8190555061103e6122a5565b50565b600f5481565b61104f6122af565b611057612255565b600e5481601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110a5919061383b565b11156110e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110dd906136d5565b60405180910390fd5b601260009054906101000a900460ff16611135576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112c906136b5565b60405180910390fd5b600c54816111439190613891565b341015611185576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117c90613695565b60405180910390fd5b600b5481611191610ccb565b61119b919061383b565b11156111dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d390613675565b60405180910390fd5b80601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461122b919061383b565b9250508190555061123c33826122f9565b6112446122a5565b50565b600e5481565b6112556121d7565b61125d612255565b6112656115e2565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156112aa573d6000803e3d6000fd5b506112b36122a5565b565b6112bd6121d7565b6112c5612255565b6112cd612317565b6112d56122a5565b565b6112df6121d7565b6112e7612255565b601260009054906101000a900460ff1615601260006101000a81548160ff0219169083151502179055506113196122a5565b565b61133683838360405180602001604052806000815250611831565b505050565b6113436121d7565b61134b612255565b6001601260016101000a81548160ff0219169083151502179055506001601260006101000a81548160ff0219169083151502179055506113896122a5565b565b601260029054906101000a900460ff1681565b6113a66121d7565b6113ae612255565b80601190805190602001906113c4929190612a61565b506113cd6122a5565b50565b6113d86121d7565b6113e0612255565b601260029054906101000a900460ff1615601260026101000a81548160ff0219169083151502179055506114126122a5565b565b6000600a60009054906101000a900460ff16905090565b60006114368261203f565b9050919050565b600c5481565b60118054611450906139ab565b80601f016020809104026020016040519081016040528092919081815260200182805461147c906139ab565b80156114c95780601f1061149e576101008083540402835291602001916114c9565b820191906000526020600020905b8154815290600101906020018083116114ac57829003601f168201915b505050505081565b6114d96121d7565b6114e1612255565b80600b819055506114f06122a5565b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561155b576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6115b46121d7565b6115be600061237a565b565b6115c86121d7565b6115d0612255565b6115d8612440565b6115e06122a5565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6116146121d7565b61161c612255565b80600f8190555061162b6122a5565b50565b6116366121d7565b61163e612255565b80600c8190555061164d6122a5565b50565b60606003805461165f906139ab565b80601f016020809104026020016040519081016040528092919081815260200182805461168b906139ab565b80156116d85780601f106116ad576101008083540402835291602001916116d8565b820191906000526020600020905b8154815290600101906020018083116116bb57829003601f168201915b5050505050905090565b6116ea6121d7565b6116f2612255565b601260019054906101000a900460ff1615601260016101000a81548160ff0219169083151502179055506117246122a5565b565b806007600061173361202e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117e061202e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611825919061351d565b60405180910390a35050565b61183c848484610cfa565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461189e57611867848484846124a3565b61189d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60006118b38360155484612603565b905092915050565b6118c36121d7565b6118cb612255565b600b54816118d7610ccb565b6118e1919061383b565b1115611922576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191990613675565b60405180910390fd5b60005b838390508110156119745761196184848381811061194657611945613ad9565b5b905060200201602081019061195b9190612d56565b836122f9565b808061196c90613a0e565b915050611925565b5061197d6122a5565b505050565b6010805461198f906139ab565b80601f01602080910402602001604051908101604052809291908181526020018280546119bb906139ab565b8015611a085780601f106119dd57610100808354040283529160200191611a08565b820191906000526020600020905b8154815290600101906020018083116119eb57829003601f168201915b505050505081565b6060611a1b82611fcf565b611a5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5190613635565b60405180910390fd5b60001515601260029054906101000a900460ff1615151415611b085760118054611a83906139ab565b80601f0160208091040260200160405190810160405280929190818152602001828054611aaf906139ab565b8015611afc5780601f10611ad157610100808354040283529160200191611afc565b820191906000526020600020905b815481529060010190602001808311611adf57829003601f168201915b50505050509050611b64565b6000611b1261261a565b90506000815111611b325760405180602001604052806000815250611b60565b80611b3c846126ac565b6010604051602001611b5093929190613485565b6040516020818303038152906040525b9150505b919050565b611b716122af565b611b79612255565b611ba98133604051602001611b8e919061346a565b604051602081830303815290604052805190602001206118a4565b611be8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdf906135f5565b60405180910390fd5b601260019054906101000a900460ff16611c37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2e90613655565b60405180910390fd5b600b5482611c43610ccb565b611c4d919061383b565b1115611c8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8590613675565b60405180910390fd5b600d5482601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cdc919061383b565b1115611d1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d14906135b5565b60405180910390fd5b600f5482611d2b9190613891565b341015611d6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6490613695565b60405180910390fd5b81601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dbc919061383b565b92505081905550611dcd33836122f9565b611dd56122a5565b5050565b600b5481565b611de76121d7565b611def612255565b80601581905550611dfe6122a5565b50565b600d5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60155481565b60136020528060005260406000206000915090505481565b611ec16121d7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2890613595565b60405180910390fd5b611f3a8161237a565b50565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611f9857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611fc85750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600081611fda612036565b11158015611fe9575060005482105b8015612027575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b6000808290508061204e612036565b116120d6576000548110156120d55760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156120d3575b60008114156120c957600460008360019003935083815260200190815260200160002054905061209e565b8092505050612108565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612195868684612705565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6121df61270e565b73ffffffffffffffffffffffffffffffffffffffff166121fd6115e2565b73ffffffffffffffffffffffffffffffffffffffff1614612253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224a90613615565b60405180910390fd5b565b6002600954141561229b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612292906136f5565b60405180910390fd5b6002600981905550565b6001600981905550565b6122b7611414565b156122f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ee906135d5565b60405180910390fd5b565b612313828260405180602001604052806000815250612716565b5050565b61231f6127b3565b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61236361270e565b60405161237091906134b6565b60405180910390a1565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6124486122af565b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861248c61270e565b60405161249991906134b6565b60405180910390a1565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026124c961202e565b8786866040518563ffffffff1660e01b81526004016124eb94939291906134d1565b602060405180830381600087803b15801561250557600080fd5b505af192505050801561253657506040513d601f19601f82011682018060405250810190612533919061302f565b60015b6125b0573d8060008114612566576040519150601f19603f3d011682016040523d82523d6000602084013e61256b565b606091505b506000815114156125a8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60008261261085846127fc565b1490509392505050565b606060118054612629906139ab565b80601f0160208091040260200160405190810160405280929190818152602001828054612655906139ab565b80156126a25780601f10612677576101008083540402835291602001916126a2565b820191906000526020600020905b81548152906001019060200180831161268557829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b6001156126f057600184039350600a81066030018453600a81049050806126eb576126f0565b6126c5565b50828103602084039350808452505050919050565b60009392505050565b600033905090565b6127208383612852565b60008373ffffffffffffffffffffffffffffffffffffffff163b146127ae57600080549050600083820390505b61276060008683806001019450866124a3565b612796576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061274d5781600054146127ab57600080fd5b50505b505050565b6127bb611414565b6127fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f190613575565b60405180910390fd5b565b60008082905060005b8451811015612847576128328286838151811061282557612824613ad9565b5b6020026020010151612a0f565b9150808061283f90613a0e565b915050612805565b508091505092915050565b6000805490506000821415612893576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128a06000848385612178565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061291783612908600086600061217e565b61291185612a3a565b176121a6565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146129b857808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061297d565b5060008214156129f4576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050612a0a60008483856121d1565b505050565b6000818310612a2757612a228284612a4a565b612a32565b612a318383612a4a565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b828054612a6d906139ab565b90600052602060002090601f016020900481019282612a8f5760008555612ad6565b82601f10612aa857805160ff1916838001178555612ad6565b82800160010185558215612ad6579182015b82811115612ad5578251825591602001919060010190612aba565b5b509050612ae39190612ae7565b5090565b5b80821115612b00576000816000905550600101612ae8565b5090565b6000612b17612b1284613755565b613730565b90508083825260208201905082856020860282011115612b3a57612b39613b41565b5b60005b85811015612b6a5781612b508882612ca6565b845260208401935060208301925050600181019050612b3d565b5050509392505050565b6000612b87612b8284613781565b613730565b905082815260208101848484011115612ba357612ba2613b46565b5b612bae848285613969565b509392505050565b6000612bc9612bc4846137b2565b613730565b905082815260208101848484011115612be557612be4613b46565b5b612bf0848285613969565b509392505050565b600081359050612c0781613dfa565b92915050565b60008083601f840112612c2357612c22613b3c565b5b8235905067ffffffffffffffff811115612c4057612c3f613b37565b5b602083019150836020820283011115612c5c57612c5b613b41565b5b9250929050565b600082601f830112612c7857612c77613b3c565b5b8135612c88848260208601612b04565b91505092915050565b600081359050612ca081613e11565b92915050565b600081359050612cb581613e28565b92915050565b600081359050612cca81613e3f565b92915050565b600081519050612cdf81613e3f565b92915050565b600082601f830112612cfa57612cf9613b3c565b5b8135612d0a848260208601612b74565b91505092915050565b600082601f830112612d2857612d27613b3c565b5b8135612d38848260208601612bb6565b91505092915050565b600081359050612d5081613e56565b92915050565b600060208284031215612d6c57612d6b613b50565b5b6000612d7a84828501612bf8565b91505092915050565b60008060408385031215612d9a57612d99613b50565b5b6000612da885828601612bf8565b9250506020612db985828601612bf8565b9150509250929050565b600080600060608486031215612ddc57612ddb613b50565b5b6000612dea86828701612bf8565b9350506020612dfb86828701612bf8565b9250506040612e0c86828701612d41565b9150509250925092565b60008060008060808587031215612e3057612e2f613b50565b5b6000612e3e87828801612bf8565b9450506020612e4f87828801612bf8565b9350506040612e6087828801612d41565b925050606085013567ffffffffffffffff811115612e8157612e80613b4b565b5b612e8d87828801612ce5565b91505092959194509250565b60008060408385031215612eb057612eaf613b50565b5b6000612ebe85828601612bf8565b9250506020612ecf85828601612c91565b9150509250929050565b60008060408385031215612ef057612eef613b50565b5b6000612efe85828601612bf8565b9250506020612f0f85828601612d41565b9150509250929050565b600080600060408486031215612f3257612f31613b50565b5b600084013567ffffffffffffffff811115612f5057612f4f613b4b565b5b612f5c86828701612c0d565b93509350506020612f6f86828701612d41565b9150509250925092565b60008060408385031215612f9057612f8f613b50565b5b600083013567ffffffffffffffff811115612fae57612fad613b4b565b5b612fba85828601612c63565b9250506020612fcb85828601612ca6565b9150509250929050565b600060208284031215612feb57612fea613b50565b5b6000612ff984828501612ca6565b91505092915050565b60006020828403121561301857613017613b50565b5b600061302684828501612cbb565b91505092915050565b60006020828403121561304557613044613b50565b5b600061305384828501612cd0565b91505092915050565b60006020828403121561307257613071613b50565b5b600082013567ffffffffffffffff8111156130905761308f613b4b565b5b61309c84828501612d13565b91505092915050565b6000602082840312156130bb576130ba613b50565b5b60006130c984828501612d41565b91505092915050565b600080604083850312156130e9576130e8613b50565b5b60006130f785828601612d41565b925050602083013567ffffffffffffffff81111561311857613117613b4b565b5b61312485828601612c63565b9150509250929050565b613137816138eb565b82525050565b61314e613149826138eb565b613a57565b82525050565b61315d816138fd565b82525050565b61316c81613909565b82525050565b600061317d826137f8565b613187818561380e565b9350613197818560208601613978565b6131a081613b55565b840191505092915050565b60006131b682613803565b6131c0818561381f565b93506131d0818560208601613978565b6131d981613b55565b840191505092915050565b60006131ef82613803565b6131f98185613830565b9350613209818560208601613978565b80840191505092915050565b60008154613222816139ab565b61322c8186613830565b9450600182166000811461324757600181146132585761328b565b60ff1983168652818601935061328b565b613261856137e3565b60005b8381101561328357815481890152600182019150602081019050613264565b838801955050505b50505092915050565b60006132a160148361381f565b91506132ac82613b73565b602082019050919050565b60006132c460268361381f565b91506132cf82613b9c565b604082019050919050565b60006132e7601e8361381f565b91506132f282613beb565b602082019050919050565b600061330a60108361381f565b915061331582613c14565b602082019050919050565b600061332d60178361381f565b915061333882613c3d565b602082019050919050565b600061335060208361381f565b915061335b82613c66565b602082019050919050565b6000613373602f8361381f565b915061337e82613c8f565b604082019050919050565b600061339660228361381f565b91506133a182613cde565b604082019050919050565b60006133b960198361381f565b91506133c482613d2d565b602082019050919050565b60006133dc60158361381f565b91506133e782613d56565b602082019050919050565b60006133ff601f8361381f565b915061340a82613d7f565b602082019050919050565b6000613422601e8361381f565b915061342d82613da8565b602082019050919050565b6000613445601f8361381f565b915061345082613dd1565b602082019050919050565b6134648161395f565b82525050565b6000613476828461313d565b60148201915081905092915050565b600061349182866131e4565b915061349d82856131e4565b91506134a98284613215565b9150819050949350505050565b60006020820190506134cb600083018461312e565b92915050565b60006080820190506134e6600083018761312e565b6134f3602083018661312e565b613500604083018561345b565b81810360608301526135128184613172565b905095945050505050565b60006020820190506135326000830184613154565b92915050565b600060208201905061354d6000830184613163565b92915050565b6000602082019050818103600083015261356d81846131ab565b905092915050565b6000602082019050818103600083015261358e81613294565b9050919050565b600060208201905081810360008301526135ae816132b7565b9050919050565b600060208201905081810360008301526135ce816132da565b9050919050565b600060208201905081810360008301526135ee816132fd565b9050919050565b6000602082019050818103600083015261360e81613320565b9050919050565b6000602082019050818103600083015261362e81613343565b9050919050565b6000602082019050818103600083015261364e81613366565b9050919050565b6000602082019050818103600083015261366e81613389565b9050919050565b6000602082019050818103600083015261368e816133ac565b9050919050565b600060208201905081810360008301526136ae816133cf565b9050919050565b600060208201905081810360008301526136ce816133f2565b9050919050565b600060208201905081810360008301526136ee81613415565b9050919050565b6000602082019050818103600083015261370e81613438565b9050919050565b600060208201905061372a600083018461345b565b92915050565b600061373a61374b565b905061374682826139dd565b919050565b6000604051905090565b600067ffffffffffffffff8211156137705761376f613b08565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561379c5761379b613b08565b5b6137a582613b55565b9050602081019050919050565b600067ffffffffffffffff8211156137cd576137cc613b08565b5b6137d682613b55565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006138468261395f565b91506138518361395f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561388657613885613a7b565b5b828201905092915050565b600061389c8261395f565b91506138a78361395f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156138e0576138df613a7b565b5b828202905092915050565b60006138f68261393f565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561399657808201518184015260208101905061397b565b838111156139a5576000848401525b50505050565b600060028204905060018216806139c357607f821691505b602082108114156139d7576139d6613aaa565b5b50919050565b6139e682613b55565b810181811067ffffffffffffffff82111715613a0557613a04613b08565b5b80604052505050565b6000613a198261395f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a4c57613a4b613a7b565b5b600182019050919050565b6000613a6282613a69565b9050919050565b6000613a7482613b66565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4572726f723a2043616e6e6f74206d696e74206d6f7265207468616e20340000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4e6f7420612070617274206f662077686974656c697374000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f57686974656c697374206d696e742069732063757272656e746c79207061757360008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b7f4572726f723a206d617820737570706c79207265616368656400000000000000600082015250565b7f4e6f7420656e6f7567682065746865722073656e740000000000000000000000600082015250565b7f5075626c6963206d696e742069732063757272656e746c792070617573656400600082015250565b7f4572726f723a2043616e6e6f74206d696e74206d6f7265207468616e20350000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b613e03816138eb565b8114613e0e57600080fd5b50565b613e1a816138fd565b8114613e2557600080fd5b50565b613e3181613909565b8114613e3c57600080fd5b50565b613e4881613913565b8114613e5357600080fd5b50565b613e5f8161395f565b8114613e6a57600080fd5b5056fea26469706673582212207ae4b3ad724d83626c104088b571ad6c660c46d8b813e290eb6657c8d2cc94c464736f6c63430008070033

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

0000000000000000000000000000000000000000000000000000000000000040c14a745d9c6c399c8510468b30c6fd1496190859230f6792595c7859c38283b1000000000000000000000000000000000000000000000000000000000000005c68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d55325272667a3963467235656f4169614e67586671457971756a6b7977505477415452544e557036516e74622f68696464656e2e6a736f6e00000000

-----Decoded View---------------
Arg [0] : _initBaseURI (string): https://gateway.pinata.cloud/ipfs/QmU2Rrfz9cFr5eoAiaNgXfqEyqujkywPTwATRTNUp6Qntb/hidden.json
Arg [1] : _root (bytes32): 0xc14a745d9c6c399c8510468b30c6fd1496190859230f6792595c7859c38283b1

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : c14a745d9c6c399c8510468b30c6fd1496190859230f6792595c7859c38283b1
Arg [2] : 000000000000000000000000000000000000000000000000000000000000005c
Arg [3] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [4] : 732f516d55325272667a3963467235656f4169614e67586671457971756a6b79
Arg [5] : 77505477415452544e557036516e74622f68696464656e2e6a736f6e00000000


Deployed Bytecode Sourcemap

70281:5664:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73624:195;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38061:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44552:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43985:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70781:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70825:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33812:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71017:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48191:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75032:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70586:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72726:539;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70547:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75817:121;;;;;;;;;;;;;:::i;:::-;;75230:77;;;;;;;;;;;;;:::i;:::-;;74420:116;;;;;;;;;;;;;:::i;:::-;;51112:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74656:132;;;;;;;;;;;;;:::i;:::-;;70865:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75315:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75431:93;;;;;;;;;;;;;:::i;:::-;;17773:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39454:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70436:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70711:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75633:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34996:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15283:103;;;;;;;;;;;;;:::i;:::-;;75148:74;;;;;;;;;;;;;:::i;:::-;;14635:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74910:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74796:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38237:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74544;;;;;;;;;;;;;:::i;:::-;;45110:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51903:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72531:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71338:303;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70667:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73871:503;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71722:698;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70398:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75532:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70512:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45501:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71096:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70964:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15541:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73624:195;73746:4;73775:36;73799:11;73775:23;:36::i;:::-;73768:43;;73624:195;;;:::o;38061:100::-;38115:13;38148:5;38141:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38061:100;:::o;44552:218::-;44628:7;44653:16;44661:7;44653;:16::i;:::-;44648:64;;44678:34;;;;;;;;;;;;;;44648:64;44732:15;:24;44748:7;44732:24;;;;;;;;;;;:30;;;;;;;;;;;;44725:37;;44552:218;;;:::o;43985:408::-;44074:13;44090:16;44098:7;44090;:16::i;:::-;44074:32;;44146:5;44123:28;;:19;:17;:19::i;:::-;:28;;;44119:175;;44171:44;44188:5;44195:19;:17;:19::i;:::-;44171:16;:44::i;:::-;44166:128;;44243:35;;;;;;;;;;;;;;44166:128;44119:175;44339:2;44306:15;:24;44322:7;44306:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;44377:7;44373:2;44357:28;;44366:5;44357:28;;;;;;;;;;;;44063:330;43985:408;;:::o;70781:37::-;;;;;;;;;;;;;:::o;70825:33::-;;;;;;;;;;;;;:::o;33812:323::-;33873:7;34101:15;:13;:15::i;:::-;34086:12;;34070:13;;:28;:46;34063:53;;33812:323;:::o;71017:50::-;;;;;;;;;;;;;;;;;:::o;48191:2825::-;48333:27;48363;48382:7;48363:18;:27::i;:::-;48333:57;;48448:4;48407:45;;48423:19;48407:45;;;48403:86;;48461:28;;;;;;;;;;;;;;48403:86;48503:27;48532:23;48559:35;48586:7;48559:26;:35::i;:::-;48502:92;;;;48694:68;48719:15;48736:4;48742:19;:17;:19::i;:::-;48694:24;:68::i;:::-;48689:180;;48782:43;48799:4;48805:19;:17;:19::i;:::-;48782:16;:43::i;:::-;48777:92;;48834:35;;;;;;;;;;;;;;48777:92;48689:180;48900:1;48886:16;;:2;:16;;;48882:52;;;48911:23;;;;;;;;;;;;;;48882:52;48947:43;48969:4;48975:2;48979:7;48988:1;48947:21;:43::i;:::-;49083:15;49080:160;;;49223:1;49202:19;49195:30;49080:160;49620:18;:24;49639:4;49620:24;;;;;;;;;;;;;;;;49618:26;;;;;;;;;;;;49689:18;:22;49708:2;49689:22;;;;;;;;;;;;;;;;49687:24;;;;;;;;;;;50011:146;50048:2;50097:45;50112:4;50118:2;50122:19;50097:14;:45::i;:::-;30211:8;50069:73;50011:18;:146::i;:::-;49982:17;:26;50000:7;49982:26;;;;;;;;;;;:175;;;;50328:1;30211:8;50277:19;:47;:52;50273:627;;;50350:19;50382:1;50372:7;:11;50350:33;;50539:1;50505:17;:30;50523:11;50505:30;;;;;;;;;;;;:35;50501:384;;;50643:13;;50628:11;:28;50624:242;;50823:19;50790:17;:30;50808:11;50790:30;;;;;;;;;;;:52;;;;50624:242;50501:384;50331:569;50273:627;50947:7;50943:2;50928:27;;50937:4;50928:27;;;;;;;;;;;;50966:42;50987:4;50993:2;50997:7;51006:1;50966:20;:42::i;:::-;48322:2694;;;48191:2825;;;:::o;75032:106::-;14521:13;:11;:13::i;:::-;11906:21:::1;:19;:21::i;:::-;75120:10:::2;75108:9;:22;;;;11950:20:::1;:18;:20::i;:::-;75032:106:::0;:::o;70586:40::-;;;;:::o;72726:539::-;17378:19;:17;:19::i;:::-;11906:21:::1;:19;:21::i;:::-;72873:13:::2;;72859:9;72829:15;:27;72845:10;72829:27;;;;;;;;;;;;;;;;:39;;;;:::i;:::-;72828:58;;72820:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;72940:17;;;;;;;;;;;72932:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;73038:9;;73026;:21;;;;:::i;:::-;73012:9;:36;;73004:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;73122:9;;73109;73093:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:38;;73085:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;73205:9;73174:15;:27;73190:10;73174:27;;;;;;;;;;;;;;;;:40;;;;;;;:::i;:::-;;;;;;;;73225:32;73235:10;73247:9;73225;:32::i;:::-;11950:20:::1;:18;:20::i;:::-;72726:539:::0;:::o;70547:32::-;;;;:::o;75817:121::-;14521:13;:11;:13::i;:::-;11906:21:::1;:19;:21::i;:::-;75890:7:::2;:5;:7::i;:::-;75882:25;;:48;75908:21;75882:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;11950:20:::1;:18;:20::i;:::-;75817:121::o:0;75230:77::-;14521:13;:11;:13::i;:::-;11906:21:::1;:19;:21::i;:::-;75289:10:::2;:8;:10::i;:::-;11950:20:::1;:18;:20::i;:::-;75230:77::o:0;74420:116::-;14521:13;:11;:13::i;:::-;11906:21:::1;:19;:21::i;:::-;74511:17:::2;;;;;;;;;;;74510:18;74490:17;;:38;;;;;;;;;;;;;;;;;;11950:20:::1;:18;:20::i;:::-;74420:116::o:0;51112:193::-;51258:39;51275:4;51281:2;51285:7;51258:39;;;;;;;;;;;;:16;:39::i;:::-;51112:193;;;:::o;74656:132::-;14521:13;:11;:13::i;:::-;11906:21:::1;:19;:21::i;:::-;74741:4:::2;74725:13;;:20;;;;;;;;;;;;;;;;;;74776:4;74756:17;;:24;;;;;;;;;;;;;;;;;;11950:20:::1;:18;:20::i;:::-;74656:132::o:0;70865:28::-;;;;;;;;;;;;;:::o;75315:108::-;14521:13;:11;:13::i;:::-;11906:21:::1;:19;:21::i;:::-;75408:7:::2;75398;:17;;;;;;;;;;;;:::i;:::-;;11950:20:::1;:18;:20::i;:::-;75315:108:::0;:::o;75431:93::-;14521:13;:11;:13::i;:::-;11906:21:::1;:19;:21::i;:::-;75508:8:::2;;;;;;;;;;;75507:9;75496:8;;:20;;;;;;;;;;;;;;;;;;11950::::1;:18;:20::i;:::-;75431:93::o:0;17773:86::-;17820:4;17844:7;;;;;;;;;;;17837:14;;17773:86;:::o;39454:152::-;39526:7;39569:27;39588:7;39569:18;:27::i;:::-;39546:52;;39454:152;;;:::o;70436:38::-;;;;:::o;70711:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;75633:115::-;14521:13;:11;:13::i;:::-;11906:21:::1;:19;:21::i;:::-;75730:10:::2;75718:9;:22;;;;11950:20:::1;:18;:20::i;:::-;75633:115:::0;:::o;34996:233::-;35068:7;35109:1;35092:19;;:5;:19;;;35088:60;;;35120:28;;;;;;;;;;;;;;35088:60;29155:13;35166:18;:25;35185:5;35166:25;;;;;;;;;;;;;;;;:55;35159:62;;34996:233;;;:::o;15283:103::-;14521:13;:11;:13::i;:::-;15348:30:::1;15375:1;15348:18;:30::i;:::-;15283:103::o:0;75148:74::-;14521:13;:11;:13::i;:::-;11906:21:::1;:19;:21::i;:::-;75206:8:::2;:6;:8::i;:::-;11950:20:::1;:18;:20::i;:::-;75148:74::o:0;14635:87::-;14681:7;14708:6;;;;;;;;;;;14701:13;;14635:87;:::o;74910:114::-;14521:13;:11;:13::i;:::-;11906:21:::1;:19;:21::i;:::-;75004:12:::2;74990:11;:26;;;;11950:20:::1;:18;:20::i;:::-;74910:114:::0;:::o;74796:106::-;14521:13;:11;:13::i;:::-;11906:21:::1;:19;:21::i;:::-;74884:10:::2;74872:9;:22;;;;11950:20:::1;:18;:20::i;:::-;74796:106:::0;:::o;38237:104::-;38293:13;38326:7;38319:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38237:104;:::o;74544:::-;14521:13;:11;:13::i;:::-;11906:21:::1;:19;:21::i;:::-;74627:13:::2;;;;;;;;;;;74626:14;74610:13;;:30;;;;;;;;;;;;;;;;;;11950:20:::1;:18;:20::i;:::-;74544:104::o:0;45110:234::-;45257:8;45205:18;:39;45224:19;:17;:19::i;:::-;45205:39;;;;;;;;;;;;;;;:49;45245:8;45205:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;45317:8;45281:55;;45296:19;:17;:19::i;:::-;45281:55;;;45327:8;45281:55;;;;;;:::i;:::-;;;;;;;;45110:234;;:::o;51903:407::-;52078:31;52091:4;52097:2;52101:7;52078:12;:31::i;:::-;52142:1;52124:2;:14;;;:19;52120:183;;52163:56;52194:4;52200:2;52204:7;52213:5;52163:30;:56::i;:::-;52158:145;;52247:40;;;;;;;;;;;;;;52158:145;52120:183;51903:407;;;;:::o;72531:144::-;72606:4;72630:37;72649:5;72656:4;;72662;72630:18;:37::i;:::-;72623:44;;72531:144;;;;:::o;71338:303::-;14521:13;:11;:13::i;:::-;11906:21:::1;:19;:21::i;:::-;71481:9:::2;;71470:7;71454:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:36;;71446:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;71538:6;71533:101;71554:8;;:15;;71550:1;:19;71533:101;;;71591:31;71601:8;;71610:1;71601:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;71614:7;71591:9;:31::i;:::-;71571:3;;;;;:::i;:::-;;;;71533:101;;;;11950:20:::1;:18;:20::i;:::-;71338:303:::0;;;:::o;70667:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;73871:503::-;73969:13;74004:16;74012:7;74004;:16::i;:::-;73996:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;74100:5;74088:17;;:8;;;;;;;;;;;:17;;;74084:273;;;74125:7;74118:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74084:273;74157:28;74188:10;:8;:10::i;:::-;74157:41;;74247:1;74222:14;74216:28;:32;:133;;;;;;;;;;;;;;;;;74284:14;74300:18;74310:7;74300:9;:18::i;:::-;74320:13;74267:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;74216:133;74209:140;;;73871:503;;;;:::o;71722:698::-;17378:19;:17;:19::i;:::-;11906:21:::1;:19;:21::i;:::-;71855:55:::2;71863:5;71897:10;71880:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;71870:39;;;;;;71855:7;:55::i;:::-;71847:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;71961:13;;;;;;;;;;;71953:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;72066:9;;72053;72037:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:38;;72029:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;72169:9;;72155;72129:11;:23;72141:10;72129:23;;;;;;;;;;;;;;;;:35;;;;:::i;:::-;72128:50;;72120:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;72262:11;;72250:9;:23;;;;:::i;:::-;72236:9;:38;;72228:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;72344:9;72317:11;:23;72329:10;72317:23;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;72368:32;72378:10;72390:9;72368;:32::i;:::-;11950:20:::1;:18;:20::i;:::-;71722:698:::0;;:::o;70398:31::-;;;;:::o;75532:93::-;14521:13;:11;:13::i;:::-;11906:21:::1;:19;:21::i;:::-;75612:5:::2;75605:4;:12;;;;11950:20:::1;:18;:20::i;:::-;75532:93:::0;:::o;70512:28::-;;;;:::o;45501:164::-;45598:4;45622:18;:25;45641:5;45622:25;;;;;;;;;;;;;;;:35;45648:8;45622:35;;;;;;;;;;;;;;;;;;;;;;;;;45615:42;;45501:164;;;;:::o;71096:19::-;;;;:::o;70964:46::-;;;;;;;;;;;;;;;;;:::o;15541:201::-;14521:13;:11;:13::i;:::-;15650:1:::1;15630:22;;:8;:22;;;;15622:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;15706:28;15725:8;15706:18;:28::i;:::-;15541:201:::0;:::o;37159:639::-;37244:4;37583:10;37568:25;;:11;:25;;;;:102;;;;37660:10;37645:25;;:11;:25;;;;37568:102;:179;;;;37737:10;37722:25;;:11;:25;;;;37568:179;37548:199;;37159:639;;;:::o;45923:282::-;45988:4;46044:7;46025:15;:13;:15::i;:::-;:26;;:66;;;;;46078:13;;46068:7;:23;46025:66;:153;;;;;46177:1;29931:8;46129:17;:26;46147:7;46129:26;;;;;;;;;;;;:44;:49;46025:153;46005:173;;45923:282;;;:::o;68231:105::-;68291:7;68318:10;68311:17;;68231:105;:::o;73515:101::-;73580:7;73607:1;73600:8;;73515:101;:::o;40609:1275::-;40676:7;40696:12;40711:7;40696:22;;40779:4;40760:15;:13;:15::i;:::-;:23;40756:1061;;40813:13;;40806:4;:20;40802:1015;;;40851:14;40868:17;:23;40886:4;40868:23;;;;;;;;;;;;40851:40;;40985:1;29931:8;40957:6;:24;:29;40953:845;;;41622:113;41639:1;41629:6;:11;41622:113;;;41682:17;:25;41700:6;;;;;;;41682:25;;;;;;;;;;;;41673:34;;41622:113;;;41768:6;41761:13;;;;;;40953:845;40828:989;40802:1015;40756:1061;41845:31;;;;;;;;;;;;;;40609:1275;;;;:::o;47086:485::-;47188:27;47217:23;47258:38;47299:15;:24;47315:7;47299:24;;;;;;;;;;;47258:65;;47476:18;47453:41;;47533:19;47527:26;47508:45;;47438:126;47086:485;;;:::o;46314:659::-;46463:11;46628:16;46621:5;46617:28;46608:37;;46788:16;46777:9;46773:32;46760:45;;46938:15;46927:9;46924:30;46916:5;46905:9;46902:20;46899:56;46889:66;;46314:659;;;;;:::o;52972:159::-;;;;;:::o;67540:311::-;67675:7;67695:16;30335:3;67721:19;:41;;67695:68;;30335:3;67789:31;67800:4;67806:2;67810:9;67789:10;:31::i;:::-;67781:40;;:62;;67774:69;;;67540:311;;;;;:::o;42432:450::-;42512:14;42680:16;42673:5;42669:28;42660:37;;42857:5;42843:11;42818:23;42814:41;42811:52;42804:5;42801:63;42791:73;;42432:450;;;;:::o;53796:158::-;;;;;:::o;14800:132::-;14875:12;:10;:12::i;:::-;14864:23;;:7;:5;:7::i;:::-;:23;;;14856:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14800:132::o;11986:293::-;11388:1;12120:7;;:19;;12112:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;11388:1;12253:7;:18;;;;11986:293::o;12287:213::-;11344:1;12470:7;:22;;;;12287:213::o;17932:108::-;18003:8;:6;:8::i;:::-;18002:9;17994:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;17932:108::o;62063:112::-;62140:27;62150:2;62154:8;62140:27;;;;;;;;;;;;:9;:27::i;:::-;62063:112;;:::o;18628:120::-;17637:16;:14;:16::i;:::-;18697:5:::1;18687:7;;:15;;;;;;;;;;;;;;;;;;18718:22;18727:12;:10;:12::i;:::-;18718:22;;;;;;:::i;:::-;;;;;;;;18628:120::o:0;15902:191::-;15976:16;15995:6;;;;;;;;;;;15976:25;;16021:8;16012:6;;:17;;;;;;;;;;;;;;;;;;16076:8;16045:40;;16066:8;16045:40;;;;;;;;;;;;15965:128;15902:191;:::o;18369:118::-;17378:19;:17;:19::i;:::-;18439:4:::1;18429:7;;:14;;;;;;;;;;;;;;;;;;18459:20;18466:12;:10;:12::i;:::-;18459:20;;;;;;:::i;:::-;;;;;;;;18369:118::o:0;54394:716::-;54557:4;54603:2;54578:45;;;54624:19;:17;:19::i;:::-;54645:4;54651:7;54660:5;54578:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;54574:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54878:1;54861:6;:13;:18;54857:235;;;54907:40;;;;;;;;;;;;;;54857:235;55050:6;55044:13;55035:6;55031:2;55027:15;55020:38;54574:529;54747:54;;;54737:64;;;:6;:64;;;;54730:71;;;54394:716;;;;;;:::o;1222:190::-;1347:4;1400;1371:25;1384:5;1391:4;1371:12;:25::i;:::-;:33;1364:40;;1222:190;;;;;:::o;73332:108::-;73392:13;73425:7;73418:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73332:108;:::o;68438:1745::-;68503:17;68937:4;68930;68924:11;68920:22;69029:1;69023:4;69016:15;69104:4;69101:1;69097:12;69090:19;;69186:1;69181:3;69174:14;69290:3;69529:5;69511:428;69537:1;69511:428;;;69577:1;69572:3;69568:11;69561:18;;69748:2;69742:4;69738:13;69734:2;69730:22;69725:3;69717:36;69842:2;69836:4;69832:13;69824:21;;69909:4;69899:25;;69917:5;;69899:25;69511:428;;;69515:21;69978:3;69973;69969:13;70093:4;70088:3;70084:14;70077:21;;70158:6;70153:3;70146:19;68542:1634;;;68438:1745;;;:::o;67241:147::-;67378:6;67241:147;;;;;:::o;13186:98::-;13239:7;13266:10;13259:17;;13186:98;:::o;61290:689::-;61421:19;61427:2;61431:8;61421:5;:19::i;:::-;61500:1;61482:2;:14;;;:19;61478:483;;61522:11;61536:13;;61522:27;;61568:13;61590:8;61584:3;:14;61568:30;;61617:233;61648:62;61687:1;61691:2;61695:7;;;;;;61704:5;61648:30;:62::i;:::-;61643:167;;61746:40;;;;;;;;;;;;;;61643:167;61845:3;61837:5;:11;61617:233;;61932:3;61915:13;;:20;61911:34;;61937:8;;;61911:34;61503:458;;61478:483;61290:689;;;:::o;18117:108::-;18184:8;:6;:8::i;:::-;18176:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;18117:108::o;2089:296::-;2172:7;2192:20;2215:4;2192:27;;2235:9;2230:118;2254:5;:12;2250:1;:16;2230:118;;;2303:33;2313:12;2327:5;2333:1;2327:8;;;;;;;;:::i;:::-;;;;;;;;2303:9;:33::i;:::-;2288:48;;2268:3;;;;;:::i;:::-;;;;2230:118;;;;2365:12;2358:19;;;2089:296;;;;:::o;55572:2966::-;55645:20;55668:13;;55645:36;;55708:1;55696:8;:13;55692:44;;;55718:18;;;;;;;;;;;;;;55692:44;55749:61;55779:1;55783:2;55787:12;55801:8;55749:21;:61::i;:::-;56293:1;29293:2;56263:1;:26;;56262:32;56250:8;:45;56224:18;:22;56243:2;56224:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;56572:139;56609:2;56663:33;56686:1;56690:2;56694:1;56663:14;:33::i;:::-;56630:30;56651:8;56630:20;:30::i;:::-;:66;56572:18;:139::i;:::-;56538:17;:31;56556:12;56538:31;;;;;;;;;;;:173;;;;56728:16;56759:11;56788:8;56773:12;:23;56759:37;;57309:16;57305:2;57301:25;57289:37;;57681:12;57641:8;57600:1;57538:25;57479:1;57418;57391:335;58052:1;58038:12;58034:20;57992:346;58093:3;58084:7;58081:16;57992:346;;58311:7;58301:8;58298:1;58271:25;58268:1;58265;58260:59;58146:1;58137:7;58133:15;58122:26;;57992:346;;;57996:77;58383:1;58371:8;:13;58367:45;;;58393:19;;;;;;;;;;;;;;58367:45;58445:3;58429:13;:19;;;;55998:2462;;58470:60;58499:1;58503:2;58507:12;58521:8;58470:20;:60::i;:::-;55634:2904;55572:2966;;:::o;9129:149::-;9192:7;9223:1;9219;:5;:51;;9250:20;9265:1;9268;9250:14;:20::i;:::-;9219:51;;;9227:20;9242:1;9245;9227:14;:20::i;:::-;9219:51;9212:58;;9129:149;;;;:::o;42984:324::-;43054:14;43287:1;43277:8;43274:15;43248:24;43244:46;43234:56;;42984:324;;;:::o;9286:268::-;9354:13;9461:1;9455:4;9448:15;9490:1;9484:4;9477:15;9531:4;9525;9515:21;9506:30;;9286:268;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::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:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:568::-;1821:8;1831:6;1881:3;1874:4;1866:6;1862:17;1858:27;1848:122;;1889:79;;:::i;:::-;1848:122;2002:6;1989:20;1979:30;;2032:18;2024:6;2021:30;2018:117;;;2054:79;;:::i;:::-;2018:117;2168:4;2160:6;2156:17;2144:29;;2222:3;2214:4;2206:6;2202:17;2192:8;2188:32;2185:41;2182:128;;;2229:79;;:::i;:::-;2182:128;1748:568;;;;;:::o;2339:370::-;2410:5;2459:3;2452:4;2444:6;2440:17;2436:27;2426:122;;2467:79;;:::i;:::-;2426:122;2584:6;2571:20;2609:94;2699:3;2691:6;2684:4;2676:6;2672:17;2609:94;:::i;:::-;2600:103;;2416:293;2339:370;;;;:::o;2715:133::-;2758:5;2796:6;2783:20;2774:29;;2812:30;2836:5;2812:30;:::i;:::-;2715:133;;;;:::o;2854:139::-;2900:5;2938:6;2925:20;2916:29;;2954:33;2981:5;2954:33;:::i;:::-;2854:139;;;;:::o;2999:137::-;3044:5;3082:6;3069:20;3060:29;;3098:32;3124:5;3098:32;:::i;:::-;2999:137;;;;:::o;3142:141::-;3198:5;3229:6;3223:13;3214:22;;3245:32;3271:5;3245:32;:::i;:::-;3142:141;;;;:::o;3302:338::-;3357:5;3406:3;3399:4;3391:6;3387:17;3383:27;3373:122;;3414:79;;:::i;:::-;3373:122;3531:6;3518:20;3556:78;3630:3;3622:6;3615:4;3607:6;3603:17;3556:78;:::i;:::-;3547:87;;3363:277;3302:338;;;;:::o;3660:340::-;3716:5;3765:3;3758:4;3750:6;3746:17;3742:27;3732:122;;3773:79;;:::i;:::-;3732:122;3890:6;3877:20;3915:79;3990:3;3982:6;3975:4;3967:6;3963:17;3915:79;:::i;:::-;3906:88;;3722:278;3660:340;;;;:::o;4006:139::-;4052:5;4090:6;4077:20;4068:29;;4106:33;4133:5;4106:33;:::i;:::-;4006:139;;;;:::o;4151:329::-;4210:6;4259:2;4247:9;4238:7;4234:23;4230:32;4227:119;;;4265:79;;:::i;:::-;4227:119;4385:1;4410:53;4455:7;4446:6;4435:9;4431:22;4410:53;:::i;:::-;4400:63;;4356:117;4151:329;;;;:::o;4486:474::-;4554:6;4562;4611:2;4599:9;4590:7;4586:23;4582:32;4579:119;;;4617:79;;:::i;:::-;4579:119;4737:1;4762:53;4807:7;4798:6;4787:9;4783:22;4762:53;:::i;:::-;4752:63;;4708:117;4864:2;4890:53;4935:7;4926:6;4915:9;4911:22;4890:53;:::i;:::-;4880:63;;4835:118;4486:474;;;;;:::o;4966:619::-;5043:6;5051;5059;5108:2;5096:9;5087:7;5083:23;5079:32;5076:119;;;5114:79;;:::i;:::-;5076:119;5234:1;5259:53;5304:7;5295:6;5284:9;5280:22;5259:53;:::i;:::-;5249:63;;5205:117;5361:2;5387:53;5432:7;5423:6;5412:9;5408:22;5387:53;:::i;:::-;5377:63;;5332:118;5489:2;5515:53;5560:7;5551:6;5540:9;5536:22;5515:53;:::i;:::-;5505:63;;5460:118;4966:619;;;;;:::o;5591:943::-;5686:6;5694;5702;5710;5759:3;5747:9;5738:7;5734:23;5730:33;5727:120;;;5766:79;;:::i;:::-;5727:120;5886:1;5911:53;5956:7;5947:6;5936:9;5932:22;5911:53;:::i;:::-;5901:63;;5857:117;6013:2;6039:53;6084:7;6075:6;6064:9;6060:22;6039:53;:::i;:::-;6029:63;;5984:118;6141:2;6167:53;6212:7;6203:6;6192:9;6188:22;6167:53;:::i;:::-;6157:63;;6112:118;6297:2;6286:9;6282:18;6269:32;6328:18;6320:6;6317:30;6314:117;;;6350:79;;:::i;:::-;6314:117;6455:62;6509:7;6500:6;6489:9;6485:22;6455:62;:::i;:::-;6445:72;;6240:287;5591:943;;;;;;;:::o;6540:468::-;6605:6;6613;6662:2;6650:9;6641:7;6637:23;6633:32;6630:119;;;6668:79;;:::i;:::-;6630:119;6788:1;6813:53;6858:7;6849:6;6838:9;6834:22;6813:53;:::i;:::-;6803:63;;6759:117;6915:2;6941:50;6983:7;6974:6;6963:9;6959:22;6941:50;:::i;:::-;6931:60;;6886:115;6540:468;;;;;:::o;7014:474::-;7082:6;7090;7139:2;7127:9;7118:7;7114:23;7110:32;7107:119;;;7145:79;;:::i;:::-;7107:119;7265:1;7290:53;7335:7;7326:6;7315:9;7311:22;7290:53;:::i;:::-;7280:63;;7236:117;7392:2;7418:53;7463:7;7454:6;7443:9;7439:22;7418:53;:::i;:::-;7408:63;;7363:118;7014:474;;;;;:::o;7494:704::-;7589:6;7597;7605;7654:2;7642:9;7633:7;7629:23;7625:32;7622:119;;;7660:79;;:::i;:::-;7622:119;7808:1;7797:9;7793:17;7780:31;7838:18;7830:6;7827:30;7824:117;;;7860:79;;:::i;:::-;7824:117;7973:80;8045:7;8036:6;8025:9;8021:22;7973:80;:::i;:::-;7955:98;;;;7751:312;8102:2;8128:53;8173:7;8164:6;8153:9;8149:22;8128:53;:::i;:::-;8118:63;;8073:118;7494:704;;;;;:::o;8204:684::-;8297:6;8305;8354:2;8342:9;8333:7;8329:23;8325:32;8322:119;;;8360:79;;:::i;:::-;8322:119;8508:1;8497:9;8493:17;8480:31;8538:18;8530:6;8527:30;8524:117;;;8560:79;;:::i;:::-;8524:117;8665:78;8735:7;8726:6;8715:9;8711:22;8665:78;:::i;:::-;8655:88;;8451:302;8792:2;8818:53;8863:7;8854:6;8843:9;8839:22;8818:53;:::i;:::-;8808:63;;8763:118;8204:684;;;;;:::o;8894:329::-;8953:6;9002:2;8990:9;8981:7;8977:23;8973:32;8970:119;;;9008:79;;:::i;:::-;8970:119;9128:1;9153:53;9198:7;9189:6;9178:9;9174:22;9153:53;:::i;:::-;9143:63;;9099:117;8894:329;;;;:::o;9229:327::-;9287:6;9336:2;9324:9;9315:7;9311:23;9307:32;9304:119;;;9342:79;;:::i;:::-;9304:119;9462:1;9487:52;9531:7;9522:6;9511:9;9507:22;9487:52;:::i;:::-;9477:62;;9433:116;9229:327;;;;:::o;9562:349::-;9631:6;9680:2;9668:9;9659:7;9655:23;9651:32;9648:119;;;9686:79;;:::i;:::-;9648:119;9806:1;9831:63;9886:7;9877:6;9866:9;9862:22;9831:63;:::i;:::-;9821:73;;9777:127;9562:349;;;;:::o;9917:509::-;9986:6;10035:2;10023:9;10014:7;10010:23;10006:32;10003:119;;;10041:79;;:::i;:::-;10003:119;10189:1;10178:9;10174:17;10161:31;10219:18;10211:6;10208:30;10205:117;;;10241:79;;:::i;:::-;10205:117;10346:63;10401:7;10392:6;10381:9;10377:22;10346:63;:::i;:::-;10336:73;;10132:287;9917:509;;;;:::o;10432:329::-;10491:6;10540:2;10528:9;10519:7;10515:23;10511:32;10508:119;;;10546:79;;:::i;:::-;10508:119;10666:1;10691:53;10736:7;10727:6;10716:9;10712:22;10691:53;:::i;:::-;10681:63;;10637:117;10432:329;;;;:::o;10767:684::-;10860:6;10868;10917:2;10905:9;10896:7;10892:23;10888:32;10885:119;;;10923:79;;:::i;:::-;10885:119;11043:1;11068:53;11113:7;11104:6;11093:9;11089:22;11068:53;:::i;:::-;11058:63;;11014:117;11198:2;11187:9;11183:18;11170:32;11229:18;11221:6;11218:30;11215:117;;;11251:79;;:::i;:::-;11215:117;11356:78;11426:7;11417:6;11406:9;11402:22;11356:78;:::i;:::-;11346:88;;11141:303;10767:684;;;;;:::o;11457:118::-;11544:24;11562:5;11544:24;:::i;:::-;11539:3;11532:37;11457:118;;:::o;11581:157::-;11686:45;11706:24;11724:5;11706:24;:::i;:::-;11686:45;:::i;:::-;11681:3;11674:58;11581:157;;:::o;11744:109::-;11825:21;11840:5;11825:21;:::i;:::-;11820:3;11813:34;11744:109;;:::o;11859:118::-;11946:24;11964:5;11946:24;:::i;:::-;11941:3;11934:37;11859:118;;:::o;11983:360::-;12069:3;12097:38;12129:5;12097:38;:::i;:::-;12151:70;12214:6;12209:3;12151:70;:::i;:::-;12144:77;;12230:52;12275:6;12270:3;12263:4;12256:5;12252:16;12230:52;:::i;:::-;12307:29;12329:6;12307:29;:::i;:::-;12302:3;12298:39;12291:46;;12073:270;11983:360;;;;:::o;12349:364::-;12437:3;12465:39;12498:5;12465:39;:::i;:::-;12520:71;12584:6;12579:3;12520:71;:::i;:::-;12513:78;;12600:52;12645:6;12640:3;12633:4;12626:5;12622:16;12600:52;:::i;:::-;12677:29;12699:6;12677:29;:::i;:::-;12672:3;12668:39;12661:46;;12441:272;12349:364;;;;:::o;12719:377::-;12825:3;12853:39;12886:5;12853:39;:::i;:::-;12908:89;12990:6;12985:3;12908:89;:::i;:::-;12901:96;;13006:52;13051:6;13046:3;13039:4;13032:5;13028:16;13006:52;:::i;:::-;13083:6;13078:3;13074:16;13067:23;;12829:267;12719:377;;;;:::o;13126:845::-;13229:3;13266:5;13260:12;13295:36;13321:9;13295:36;:::i;:::-;13347:89;13429:6;13424:3;13347:89;:::i;:::-;13340:96;;13467:1;13456:9;13452:17;13483:1;13478:137;;;;13629:1;13624:341;;;;13445:520;;13478:137;13562:4;13558:9;13547;13543:25;13538:3;13531:38;13598:6;13593:3;13589:16;13582:23;;13478:137;;13624:341;13691:38;13723:5;13691:38;:::i;:::-;13751:1;13765:154;13779:6;13776:1;13773:13;13765:154;;;13853:7;13847:14;13843:1;13838:3;13834:11;13827:35;13903:1;13894:7;13890:15;13879:26;;13801:4;13798:1;13794:12;13789:17;;13765:154;;;13948:6;13943:3;13939:16;13932:23;;13631:334;;13445:520;;13233:738;;13126:845;;;;:::o;13977:366::-;14119:3;14140:67;14204:2;14199:3;14140:67;:::i;:::-;14133:74;;14216:93;14305:3;14216:93;:::i;:::-;14334:2;14329:3;14325:12;14318:19;;13977:366;;;:::o;14349:::-;14491:3;14512:67;14576:2;14571:3;14512:67;:::i;:::-;14505:74;;14588:93;14677:3;14588:93;:::i;:::-;14706:2;14701:3;14697:12;14690:19;;14349:366;;;:::o;14721:::-;14863:3;14884:67;14948:2;14943:3;14884:67;:::i;:::-;14877:74;;14960:93;15049:3;14960:93;:::i;:::-;15078:2;15073:3;15069:12;15062:19;;14721:366;;;:::o;15093:::-;15235:3;15256:67;15320:2;15315:3;15256:67;:::i;:::-;15249:74;;15332:93;15421:3;15332:93;:::i;:::-;15450:2;15445:3;15441:12;15434:19;;15093:366;;;:::o;15465:::-;15607:3;15628:67;15692:2;15687:3;15628:67;:::i;:::-;15621:74;;15704:93;15793:3;15704:93;:::i;:::-;15822:2;15817:3;15813:12;15806:19;;15465:366;;;:::o;15837:::-;15979:3;16000:67;16064:2;16059:3;16000:67;:::i;:::-;15993:74;;16076:93;16165:3;16076:93;:::i;:::-;16194:2;16189:3;16185:12;16178:19;;15837:366;;;:::o;16209:::-;16351:3;16372:67;16436:2;16431:3;16372:67;:::i;:::-;16365:74;;16448:93;16537:3;16448:93;:::i;:::-;16566:2;16561:3;16557:12;16550:19;;16209:366;;;:::o;16581:::-;16723:3;16744:67;16808:2;16803:3;16744:67;:::i;:::-;16737:74;;16820:93;16909:3;16820:93;:::i;:::-;16938:2;16933:3;16929:12;16922:19;;16581:366;;;:::o;16953:::-;17095:3;17116:67;17180:2;17175:3;17116:67;:::i;:::-;17109:74;;17192:93;17281:3;17192:93;:::i;:::-;17310:2;17305:3;17301:12;17294:19;;16953:366;;;:::o;17325:::-;17467:3;17488:67;17552:2;17547:3;17488:67;:::i;:::-;17481:74;;17564:93;17653:3;17564:93;:::i;:::-;17682:2;17677:3;17673:12;17666:19;;17325:366;;;:::o;17697:::-;17839:3;17860:67;17924:2;17919:3;17860:67;:::i;:::-;17853:74;;17936:93;18025:3;17936:93;:::i;:::-;18054:2;18049:3;18045:12;18038:19;;17697:366;;;:::o;18069:::-;18211:3;18232:67;18296:2;18291:3;18232:67;:::i;:::-;18225:74;;18308:93;18397:3;18308:93;:::i;:::-;18426:2;18421:3;18417:12;18410:19;;18069:366;;;:::o;18441:::-;18583:3;18604:67;18668:2;18663:3;18604:67;:::i;:::-;18597:74;;18680:93;18769:3;18680:93;:::i;:::-;18798:2;18793:3;18789:12;18782:19;;18441:366;;;:::o;18813:118::-;18900:24;18918:5;18900:24;:::i;:::-;18895:3;18888:37;18813:118;;:::o;18937:256::-;19049:3;19064:75;19135:3;19126:6;19064:75;:::i;:::-;19164:2;19159:3;19155:12;19148:19;;19184:3;19177:10;;18937:256;;;;:::o;19199:589::-;19424:3;19446:95;19537:3;19528:6;19446:95;:::i;:::-;19439:102;;19558:95;19649:3;19640:6;19558:95;:::i;:::-;19551:102;;19670:92;19758:3;19749:6;19670:92;:::i;:::-;19663:99;;19779:3;19772:10;;19199:589;;;;;;:::o;19794:222::-;19887:4;19925:2;19914:9;19910:18;19902:26;;19938:71;20006:1;19995:9;19991:17;19982:6;19938:71;:::i;:::-;19794:222;;;;:::o;20022:640::-;20217:4;20255:3;20244:9;20240:19;20232:27;;20269:71;20337:1;20326:9;20322:17;20313:6;20269:71;:::i;:::-;20350:72;20418:2;20407:9;20403:18;20394:6;20350:72;:::i;:::-;20432;20500:2;20489:9;20485:18;20476:6;20432:72;:::i;:::-;20551:9;20545:4;20541:20;20536:2;20525:9;20521:18;20514:48;20579:76;20650:4;20641:6;20579:76;:::i;:::-;20571:84;;20022:640;;;;;;;:::o;20668:210::-;20755:4;20793:2;20782:9;20778:18;20770:26;;20806:65;20868:1;20857:9;20853:17;20844:6;20806:65;:::i;:::-;20668:210;;;;:::o;20884:222::-;20977:4;21015:2;21004:9;21000:18;20992:26;;21028:71;21096:1;21085:9;21081:17;21072:6;21028:71;:::i;:::-;20884:222;;;;:::o;21112:313::-;21225:4;21263:2;21252:9;21248:18;21240:26;;21312:9;21306:4;21302:20;21298:1;21287:9;21283:17;21276:47;21340:78;21413:4;21404:6;21340:78;:::i;:::-;21332:86;;21112:313;;;;:::o;21431:419::-;21597:4;21635:2;21624:9;21620:18;21612:26;;21684:9;21678:4;21674:20;21670:1;21659:9;21655:17;21648:47;21712:131;21838:4;21712:131;:::i;:::-;21704:139;;21431:419;;;:::o;21856:::-;22022:4;22060:2;22049:9;22045:18;22037:26;;22109:9;22103:4;22099:20;22095:1;22084:9;22080:17;22073:47;22137:131;22263:4;22137:131;:::i;:::-;22129:139;;21856:419;;;:::o;22281:::-;22447:4;22485:2;22474:9;22470:18;22462:26;;22534:9;22528:4;22524:20;22520:1;22509:9;22505:17;22498:47;22562:131;22688:4;22562:131;:::i;:::-;22554:139;;22281:419;;;:::o;22706:::-;22872:4;22910:2;22899:9;22895:18;22887:26;;22959:9;22953:4;22949:20;22945:1;22934:9;22930:17;22923:47;22987:131;23113:4;22987:131;:::i;:::-;22979:139;;22706:419;;;:::o;23131:::-;23297:4;23335:2;23324:9;23320:18;23312:26;;23384:9;23378:4;23374:20;23370:1;23359:9;23355:17;23348:47;23412:131;23538:4;23412:131;:::i;:::-;23404:139;;23131:419;;;:::o;23556:::-;23722:4;23760:2;23749:9;23745:18;23737:26;;23809:9;23803:4;23799:20;23795:1;23784:9;23780:17;23773:47;23837:131;23963:4;23837:131;:::i;:::-;23829:139;;23556:419;;;:::o;23981:::-;24147:4;24185:2;24174:9;24170:18;24162:26;;24234:9;24228:4;24224:20;24220:1;24209:9;24205:17;24198:47;24262:131;24388:4;24262:131;:::i;:::-;24254:139;;23981:419;;;:::o;24406:::-;24572:4;24610:2;24599:9;24595:18;24587:26;;24659:9;24653:4;24649:20;24645:1;24634:9;24630:17;24623:47;24687:131;24813:4;24687:131;:::i;:::-;24679:139;;24406:419;;;:::o;24831:::-;24997:4;25035:2;25024:9;25020:18;25012:26;;25084:9;25078:4;25074:20;25070:1;25059:9;25055:17;25048:47;25112:131;25238:4;25112:131;:::i;:::-;25104:139;;24831:419;;;:::o;25256:::-;25422:4;25460:2;25449:9;25445:18;25437:26;;25509:9;25503:4;25499:20;25495:1;25484:9;25480:17;25473:47;25537:131;25663:4;25537:131;:::i;:::-;25529:139;;25256:419;;;:::o;25681:::-;25847:4;25885:2;25874:9;25870:18;25862:26;;25934:9;25928:4;25924:20;25920:1;25909:9;25905:17;25898:47;25962:131;26088:4;25962:131;:::i;:::-;25954:139;;25681:419;;;:::o;26106:::-;26272:4;26310:2;26299:9;26295:18;26287:26;;26359:9;26353:4;26349:20;26345:1;26334:9;26330:17;26323:47;26387:131;26513:4;26387:131;:::i;:::-;26379:139;;26106:419;;;:::o;26531:::-;26697:4;26735:2;26724:9;26720:18;26712:26;;26784:9;26778:4;26774:20;26770:1;26759:9;26755:17;26748:47;26812:131;26938:4;26812:131;:::i;:::-;26804:139;;26531:419;;;:::o;26956:222::-;27049:4;27087:2;27076:9;27072:18;27064:26;;27100:71;27168:1;27157:9;27153:17;27144:6;27100:71;:::i;:::-;26956:222;;;;:::o;27184:129::-;27218:6;27245:20;;:::i;:::-;27235:30;;27274:33;27302:4;27294:6;27274:33;:::i;:::-;27184:129;;;:::o;27319:75::-;27352:6;27385:2;27379:9;27369:19;;27319:75;:::o;27400:311::-;27477:4;27567:18;27559:6;27556:30;27553:56;;;27589:18;;:::i;:::-;27553:56;27639:4;27631:6;27627:17;27619:25;;27699:4;27693;27689:15;27681:23;;27400:311;;;:::o;27717:307::-;27778:4;27868:18;27860:6;27857:30;27854:56;;;27890:18;;:::i;:::-;27854:56;27928:29;27950:6;27928:29;:::i;:::-;27920:37;;28012:4;28006;28002:15;27994:23;;27717:307;;;:::o;28030:308::-;28092:4;28182:18;28174:6;28171:30;28168:56;;;28204:18;;:::i;:::-;28168:56;28242:29;28264:6;28242:29;:::i;:::-;28234:37;;28326:4;28320;28316:15;28308:23;;28030:308;;;:::o;28344:141::-;28393:4;28416:3;28408:11;;28439:3;28436:1;28429:14;28473:4;28470:1;28460:18;28452:26;;28344:141;;;:::o;28491:98::-;28542:6;28576:5;28570:12;28560:22;;28491:98;;;:::o;28595:99::-;28647:6;28681:5;28675:12;28665:22;;28595:99;;;:::o;28700:168::-;28783:11;28817:6;28812:3;28805:19;28857:4;28852:3;28848:14;28833:29;;28700:168;;;;:::o;28874:169::-;28958:11;28992:6;28987:3;28980:19;29032:4;29027:3;29023:14;29008:29;;28874:169;;;;:::o;29049:148::-;29151:11;29188:3;29173:18;;29049:148;;;;:::o;29203:305::-;29243:3;29262:20;29280:1;29262:20;:::i;:::-;29257:25;;29296:20;29314:1;29296:20;:::i;:::-;29291:25;;29450:1;29382:66;29378:74;29375:1;29372:81;29369:107;;;29456:18;;:::i;:::-;29369:107;29500:1;29497;29493:9;29486:16;;29203:305;;;;:::o;29514:348::-;29554:7;29577:20;29595:1;29577:20;:::i;:::-;29572:25;;29611:20;29629:1;29611:20;:::i;:::-;29606:25;;29799:1;29731:66;29727:74;29724:1;29721:81;29716:1;29709:9;29702:17;29698:105;29695:131;;;29806:18;;:::i;:::-;29695:131;29854:1;29851;29847:9;29836:20;;29514:348;;;;:::o;29868:96::-;29905:7;29934:24;29952:5;29934:24;:::i;:::-;29923:35;;29868:96;;;:::o;29970:90::-;30004:7;30047:5;30040:13;30033:21;30022:32;;29970:90;;;:::o;30066:77::-;30103:7;30132:5;30121:16;;30066:77;;;:::o;30149:149::-;30185:7;30225:66;30218:5;30214:78;30203:89;;30149:149;;;:::o;30304:126::-;30341:7;30381:42;30374:5;30370:54;30359:65;;30304:126;;;:::o;30436:77::-;30473:7;30502:5;30491:16;;30436:77;;;:::o;30519:154::-;30603:6;30598:3;30593;30580:30;30665:1;30656:6;30651:3;30647:16;30640:27;30519:154;;;:::o;30679:307::-;30747:1;30757:113;30771:6;30768:1;30765:13;30757:113;;;30856:1;30851:3;30847:11;30841:18;30837:1;30832:3;30828:11;30821:39;30793:2;30790:1;30786:10;30781:15;;30757:113;;;30888:6;30885:1;30882:13;30879:101;;;30968:1;30959:6;30954:3;30950:16;30943:27;30879:101;30728:258;30679:307;;;:::o;30992:320::-;31036:6;31073:1;31067:4;31063:12;31053:22;;31120:1;31114:4;31110:12;31141:18;31131:81;;31197:4;31189:6;31185:17;31175:27;;31131:81;31259:2;31251:6;31248:14;31228:18;31225:38;31222:84;;;31278:18;;:::i;:::-;31222:84;31043:269;30992:320;;;:::o;31318:281::-;31401:27;31423:4;31401:27;:::i;:::-;31393:6;31389:40;31531:6;31519:10;31516:22;31495:18;31483:10;31480:34;31477:62;31474:88;;;31542:18;;:::i;:::-;31474:88;31582:10;31578:2;31571:22;31361:238;31318:281;;:::o;31605:233::-;31644:3;31667:24;31685:5;31667:24;:::i;:::-;31658:33;;31713:66;31706:5;31703:77;31700:103;;;31783:18;;:::i;:::-;31700:103;31830:1;31823:5;31819:13;31812:20;;31605:233;;;:::o;31844:100::-;31883:7;31912:26;31932:5;31912:26;:::i;:::-;31901:37;;31844:100;;;:::o;31950:94::-;31989:7;32018:20;32032:5;32018:20;:::i;:::-;32007:31;;31950:94;;;:::o;32050:180::-;32098:77;32095:1;32088:88;32195:4;32192:1;32185:15;32219:4;32216:1;32209:15;32236:180;32284:77;32281:1;32274:88;32381:4;32378:1;32371:15;32405:4;32402:1;32395:15;32422:180;32470:77;32467:1;32460:88;32567:4;32564:1;32557:15;32591:4;32588:1;32581:15;32608:180;32656:77;32653:1;32646:88;32753:4;32750:1;32743:15;32777:4;32774:1;32767:15;32794:117;32903:1;32900;32893:12;32917:117;33026:1;33023;33016:12;33040:117;33149:1;33146;33139:12;33163:117;33272:1;33269;33262:12;33286:117;33395:1;33392;33385:12;33409:117;33518:1;33515;33508:12;33532:102;33573:6;33624:2;33620:7;33615:2;33608:5;33604:14;33600:28;33590:38;;33532:102;;;:::o;33640:94::-;33673:8;33721:5;33717:2;33713:14;33692:35;;33640:94;;;:::o;33740:170::-;33880:22;33876:1;33868:6;33864:14;33857:46;33740:170;:::o;33916:225::-;34056:34;34052:1;34044:6;34040:14;34033:58;34125:8;34120:2;34112:6;34108:15;34101:33;33916:225;:::o;34147:180::-;34287:32;34283:1;34275:6;34271:14;34264:56;34147:180;:::o;34333:166::-;34473:18;34469:1;34461:6;34457:14;34450:42;34333:166;:::o;34505:173::-;34645:25;34641:1;34633:6;34629:14;34622:49;34505:173;:::o;34684:182::-;34824:34;34820:1;34812:6;34808:14;34801:58;34684:182;:::o;34872:234::-;35012:34;35008:1;35000:6;34996:14;34989:58;35081:17;35076:2;35068:6;35064:15;35057:42;34872:234;:::o;35112:221::-;35252:34;35248:1;35240:6;35236:14;35229:58;35321:4;35316:2;35308:6;35304:15;35297:29;35112:221;:::o;35339:175::-;35479:27;35475:1;35467:6;35463:14;35456:51;35339:175;:::o;35520:171::-;35660:23;35656:1;35648:6;35644:14;35637:47;35520:171;:::o;35697:181::-;35837:33;35833:1;35825:6;35821:14;35814:57;35697:181;:::o;35884:180::-;36024:32;36020:1;36012:6;36008:14;36001:56;35884:180;:::o;36070:181::-;36210:33;36206:1;36198:6;36194:14;36187:57;36070:181;:::o;36257:122::-;36330:24;36348:5;36330:24;:::i;:::-;36323:5;36320:35;36310:63;;36369:1;36366;36359:12;36310:63;36257:122;:::o;36385:116::-;36455:21;36470:5;36455:21;:::i;:::-;36448:5;36445:32;36435:60;;36491:1;36488;36481:12;36435:60;36385:116;:::o;36507:122::-;36580:24;36598:5;36580:24;:::i;:::-;36573:5;36570:35;36560:63;;36619:1;36616;36609:12;36560:63;36507:122;:::o;36635:120::-;36707:23;36724:5;36707:23;:::i;:::-;36700:5;36697:34;36687:62;;36745:1;36742;36735:12;36687:62;36635:120;:::o;36761:122::-;36834:24;36852:5;36834:24;:::i;:::-;36827:5;36824:35;36814:63;;36873:1;36870;36863:12;36814:63;36761:122;:::o

Swarm Source

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