ETH Price: $2,289.51 (+1.08%)

Token

PrideElixir (PE)
 

Overview

Max Total Supply

357 PE

Holders

92

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 PE
0x0d28ab329287bd539631023ebfdd12a8f8d51f55
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:
PrideElixer

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-30
*/

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/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: erc721a/contracts/IERC721A.sol


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

pragma solidity ^0.8.4;

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

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

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

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

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

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     *
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

    /**
     * @dev 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 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.1.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;


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

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard,
 * including the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at `_startTokenId()`
 * (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // 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 tokenId of the next token 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 => address) private _tokenApprovals;

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

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

    /**
     * @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 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 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 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 returns (uint256) {
        return _burnCounter;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    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: 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.
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view 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 {
        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;
    }

    /**
     * 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 ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

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

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

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

    /**
     * @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 See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

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

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

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

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _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 '';
    }

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

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

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

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

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     *   {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _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 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 {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // `balance` 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 tokenId = startTokenId;
            uint256 end = startTokenId + quantity;
            do {
                emit Transfer(address(0), to, tokenId++);
            } while (tokenId < end);

            _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 {
        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 Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals;
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`.
        assembly {
            // Compute the slot.
            mstore(0x00, tokenId)
            mstore(0x20, tokenApprovalsPtr.slot)
            approvedAddressSlot := keccak256(0x00, 0x40)
            // Load the slot's value from storage.
            approvedAddress := sload(approvedAddressSlot)
        }
    }

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

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

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isOwnerOrApproved(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 `_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) = _getApprovedAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isOwnerOrApproved(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++;
        }
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try 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))
                }
            }
        }
    }

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal {
        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 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;
    }

    /**
     * @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 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 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 returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit),
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length,
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

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

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for {
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp {
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } {
                // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }

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

// File: contracts/PrideElixir.sol

//SPDX-License-Identifier: MIT

pragma solidity >= 0.8.7;






contract PrideElixer is ERC721A, Ownable, ReentrancyGuard {

    using Strings for uint256;

    
    //File type
    string public uriSuffix = '.json';
    
    //Prices
    uint256 public cost = 0.005 ether;
    uint256 public whitelistCost = 0.00 ether;
    
    //Inventory
    bytes32 private whitelistRoot;
    string public baseURI;
    uint256 public publicSupply = 3000;
    uint256 public whiteListSupply = 3869;
    uint256 public RESERVE_SUPPLY = 100;

    //limits
    uint256 public maxMintAmountPerWallet = 3;
    uint256 public maxMintAmountPerWhitelist = 3;

    //keep track of counts
    uint256 public reserveMinted;
    uint256 public minted;
    uint256 public whitelistMinted;
    
    //Utility
    bool public paused = true;
    bool public whiteListingSale = true;

    //mapping
    mapping(address => uint256) public addressMintedBalance;

    constructor(
        string memory _tokenName,
        string memory _tokenSymbol,
        uint256 _publicSupply,
        uint256 _whiteListSupply,
        uint256 _maxMintAmountPerWallet,
        uint256 _maxMintAmountPerWhitelist,
        string memory _initialURI

        
    ) ERC721A(_tokenName, _tokenSymbol) {
        //set publicSupply supply amount 
        setPublicSupply(_publicSupply);
         //set whiteListSupply supply amount 
        setWhiteListSupply(_whiteListSupply);
        //set max mint amount per transcation (per wallet)
        setMaxMintAmountPerWallet(_maxMintAmountPerWallet);
        setMaxMintAmountPerWhitelist(_maxMintAmountPerWhitelist);
        //set initial URI
        baseURI = _initialURI;
    }
 
 // =============================================================================//

    /**
     * Do not allow calls from other contracts.
     */
    modifier noBots() {
            require(msg.sender == tx.origin, "Pride: No bots");
            _;
        }
    

  /**
     * Ensure amount of per wallet is within the mint limit.
     * Ensure amount of tokens to mint is within the limit.
     */
    modifier mintLimitCompliance(uint256 _mintAmount) {
      require(_mintAmount > 0, 'Mint amount should be greater than 0');
      if(whiteListingSale){
        require(addressMintedBalance[msg.sender] + _mintAmount <= maxMintAmountPerWhitelist,
             "Pride: Whitelist sale allowance Exceeded"); 
        require( whitelistMinted + _mintAmount <= whiteListSupply , "Pride :whitelist supply Exceeded"); 
        } 
         require(addressMintedBalance[msg.sender] + _mintAmount <= maxMintAmountPerWallet,
             "Pride: Public sale allowance Exceeds"); 
        require( minted + _mintAmount <= publicSupply , "Pride :Max supply Exceeded"); 


       _;
    }

  /**
    * Set the presale Merkle root.
    * @dev The Merkle root is calculated from [address, allowance] pairs.
    * @param _root The new merkle roo
    */
    function setWhitelistingRoot(bytes32 _root) public onlyOwner {
            whitelistRoot = _root;
    }


  /**
    * Verify the Merkle proof is valid.
    * @param _leafNode The leaf. A [address, availableAmt] pair
    * @param proof The Merkle proof used to validate the leaf is in the root
    */
    function _verify(bytes32 _leafNode, bytes32[] memory proof)
    internal
    view
    returns (bool)
    {
        return MerkleProof.verify(proof, whitelistRoot, _leafNode);
    }


  /**
    * Generate the leaf node 
    * @param account used the hash of tokenID concatenated with the account address
    */
    function _leaf(address account) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(account));
    }


   /**
     * Mint tokens during the presale.
     * @notice This function is only available to those on the allowlist.
     * @param _mintAmount The number of tokens to mint.
     * @param proof The Merkle proof used to validate the leaf is in the root.
     */
    function mintWhitelist(bytes32[] calldata proof, uint256 _mintAmount)
        external
        payable
        noBots
        mintLimitCompliance(_mintAmount)
    {
         require(!paused);
         require(whiteListingSale, "Pride: Whitelisting not enabled");
         require(_verify(_leaf(msg.sender), proof), "Pride: Invalid proof"); 
         require(msg.value >= whitelistCost * _mintAmount, "Pride: Insuffient funds ");
         _mintLoop(msg.sender, _mintAmount);
         whitelistMinted += _mintAmount;
         addressMintedBalance[msg.sender] += _mintAmount; 
    }



   /**
    * Public mint.
    * @param _mintAmount Amount of tokens to mint.
    */
    function mint(uint256 _mintAmount) 
      external 
      payable
      noBots
      mintLimitCompliance(_mintAmount)
    {
        require(!paused, 'The contract is paused!');
        require(!whiteListingSale, "You cant mint on Presale");
          //Reamaining whitelist ill be free for public
           uint256 a = whiteListSupply - whitelistMinted;
             if(whitelistMinted > a) {
                //not free 
                  require(msg.value >= cost * _mintAmount, "Insuffient funds");
                  minted +=_mintAmount;
            }else{

                if(whitelistMinted + _mintAmount > whiteListSupply){
                   uint256 c = _mintAmount - a; 
                   //pay only for c 
                    require(msg.value >= cost * c, "Insuffient funds");
                     
                     minted += c;
                     whitelistMinted += a;
                    
                }else{

                    whitelistMinted += _mintAmount;
                }

            }
        _mintLoop(msg.sender, _mintAmount);
        addressMintedBalance[msg.sender] += _mintAmount;
        
    }


   /**
    * airdrop mint.
    * @param _mintAmount Amount of tokens to mint.
    * @param _receiver Address to mint to.
    */
    function mintForAddress(uint256 _mintAmount, address _receiver)
     external
     onlyOwner
   {
        require(_mintAmount > 0, 'Mint amount should be greater than 0');
        uint256 maxSupply = publicSupply + RESERVE_SUPPLY + whiteListSupply;
        require( totalSupply() + _mintAmount <= maxSupply , "Pride :Max supply Exceeded"); 
        _mintLoop(_receiver, _mintAmount);
        minted += _mintAmount;       
   }


  /**
    * Team reserved mint.
    * @param to Address to mint to.
    * @param quantity Amount of tokens to mint.
    */
    function mintReserved(address to, uint256 quantity)
     external
     onlyOwner
    {
        require(reserveMinted + quantity <= RESERVE_SUPPLY, "Pride: Reseve supply Exceeded");
        _mintLoop(to, quantity);
        reserveMinted += quantity;

    }

  /**
    * Check what are the token ids owned by wallet address
    * @param _owner account address.
    */
  function walletOfOwner(address _owner)
    public
    view
    returns (uint256[] memory)
  {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
    uint256 maxSupply = publicSupply + RESERVE_SUPPLY + whiteListSupply;
    uint256 currentTokenId = 1;
    uint256 ownedTokenIndex = 0;

    while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
      address currentTokenOwner = ownerOf(currentTokenId);

      if (currentTokenOwner == _owner) {
        ownedTokenIds[ownedTokenIndex] = currentTokenId;

        ownedTokenIndex++;
      }

      currentTokenId++;
    }

    return ownedTokenIds;
  }


  /**
    * Change the starting tokenId to 1.
    */
    function _startTokenId() internal view virtual override returns (uint256) {
        return 1;
    }


  /**
    * Change the baseURI
    */
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }
  

  /**
    * @dev See {IERC721Metadata-tokenURI}.
    */
    function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
        require(_exists(_tokenId), 'ERC721Metadata: URI query for nonexistent token');

        string memory currentBaseURI = _baseURI();
        return bytes(currentBaseURI).length > 0
            ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix))
            : '';
    }


  /**
    * Update whitelist token price
    * @param _cost The new token price
    */
    function setWhitelistCost(uint256 _cost) public onlyOwner {
        whitelistCost = _cost;
    }
  
  
  /**
    * Update token price.
    * @param _cost The new token price
    */
    function setCost(uint256 _cost) public onlyOwner {
        cost = _cost;
    }


  /**
    * Update team supply
    * @param _supply The new token price
    */
    function setReserveSpply(uint256 _supply) public onlyOwner {
        RESERVE_SUPPLY = _supply;
    }


  /**
    * Update colletion publicSupply.
    * @param _supply The new token price
    */
    function setPublicSupply(uint256 _supply) public onlyOwner {
        publicSupply = _supply;
    }

  /**
    * Update colletion publicSupply.
    * @param _supply The new token price
    */
    function setWhiteListSupply(uint256 _supply) public onlyOwner {
        whiteListSupply = _supply;
    }    


  /**
    * Update whilist mint limit per wallet.
    * @param _maxMintAmountPerWhitelist The new token price
    */
    function setMaxMintAmountPerWhitelist(uint256 _maxMintAmountPerWhitelist) public onlyOwner {
        maxMintAmountPerWhitelist = _maxMintAmountPerWhitelist;
    }    


  /**
    * Update sales mint limit per wallet.
    * @param _maxMintAmountPerWallet The new token price
    */
    function setMaxMintAmountPerWallet(uint256 _maxMintAmountPerWallet) public onlyOwner {
        maxMintAmountPerWallet = _maxMintAmountPerWallet;
    }


  /**
    * Sets base URI.
    * @param _newBaseURI The base URI
    */
    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }


  /**
    * Sets file type.
    * @param _uriSuffix The base URI
    */
    function setUriSuffix(string memory _uriSuffix) public onlyOwner {
        uriSuffix = _uriSuffix;
    }


  /**
    * On and Off public sales.
    */
    function togglePause() public onlyOwner {
            paused = !paused;
    }

  /**
    * On and Off whitlist sale.
    */
    function toggleWhitlist() public onlyOwner {
            whiteListingSale = !whiteListingSale;
    }


  // =============================================================================//

    function _mintLoop(address _receiver, uint256 _mintAmount) internal {
            _safeMint(_receiver, _mintAmount);
    }

    address private constant WALLET_A = 0x9dC7A7D3c4FD55FaC37f62BA311E9759F142c525;

  
    function withdraw() public onlyOwner nonReentrant {
        
        uint256 balance = address(this).balance;
        require(balance  > 0,"Not have Eth");
        // splitting the initial sale funds
        //5% of initial sale funds will go the A wallet
        (bool hs, ) = payable(WALLET_A).call{value: balance * 5 / 100}("");
         require(hs, "Failed to send to WALLET_A.");
        // =============================================================================
        // remaining funds ill be go to owner
        // =============================================================================
        (bool os, ) = payable(owner()).call{value: balance}('');
        require(os,"Failed to send to owner wallet.");
        // =============================================================================
   }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"},{"internalType":"uint256","name":"_publicSupply","type":"uint256"},{"internalType":"uint256","name":"_whiteListSupply","type":"uint256"},{"internalType":"uint256","name":"_maxMintAmountPerWallet","type":"uint256"},{"internalType":"uint256","name":"_maxMintAmountPerWhitelist","type":"uint256"},{"internalType":"string","name":"_initialURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"RESERVE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerWhitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintReserved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"minted","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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveMinted","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerWallet","type":"uint256"}],"name":"setMaxMintAmountPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerWhitelist","type":"uint256"}],"name":"setMaxMintAmountPerWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"}],"name":"setPublicSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"}],"name":"setReserveSpply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"}],"name":"setWhiteListSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setWhitelistCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setWhitelistingRoot","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":"togglePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWhitlist","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":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whiteListSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whiteListingSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600a908051906020019062000051929190620003be565b506611c37937e08000600b556000600c55610bb8600f55610f1d6010556064601155600360125560036013556001601760006101000a81548160ff0219169083151502179055506001601760016101000a81548160ff021916908315150217905550348015620000c057600080fd5b506040516200522a3803806200522a8339818101604052810190620000e6919062000503565b8686816002908051906020019062000100929190620003be565b50806003908051906020019062000119929190620003be565b506200012a620001c460201b60201c565b60008190555050506200015262000146620001cd60201b60201c565b620001d560201b60201c565b60016009819055506200016b856200029b60201b60201c565b6200017c84620002b560201b60201c565b6200018d83620002cf60201b60201c565b6200019e82620002e960201b60201c565b80600e9080519060200190620001b6929190620003be565b50505050505050506200083e565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002ab6200030360201b60201c565b80600f8190555050565b620002c56200030360201b60201c565b8060108190555050565b620002df6200030360201b60201c565b8060128190555050565b620002f96200030360201b60201c565b8060138190555050565b62000313620001cd60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003396200039460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000392576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000389906200063a565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003cc906200070c565b90600052602060002090601f016020900481019282620003f057600085556200043c565b82601f106200040b57805160ff19168380011785556200043c565b828001600101855582156200043c579182015b828111156200043b5782518255916020019190600101906200041e565b5b5090506200044b91906200044f565b5090565b5b808211156200046a57600081600090555060010162000450565b5090565b6000620004856200047f8462000685565b6200065c565b905082815260208101848484011115620004a457620004a3620007db565b5b620004b1848285620006d6565b509392505050565b600082601f830112620004d157620004d0620007d6565b5b8151620004e38482602086016200046e565b91505092915050565b600081519050620004fd8162000824565b92915050565b600080600080600080600060e0888a031215620005255762000524620007e5565b5b600088015167ffffffffffffffff811115620005465762000545620007e0565b5b620005548a828b01620004b9565b975050602088015167ffffffffffffffff811115620005785762000577620007e0565b5b620005868a828b01620004b9565b9650506040620005998a828b01620004ec565b9550506060620005ac8a828b01620004ec565b9450506080620005bf8a828b01620004ec565b93505060a0620005d28a828b01620004ec565b92505060c088015167ffffffffffffffff811115620005f657620005f5620007e0565b5b620006048a828b01620004b9565b91505092959891949750929550565b600062000622602083620006bb565b91506200062f82620007fb565b602082019050919050565b60006020820190508181036000830152620006558162000613565b9050919050565b6000620006686200067b565b905062000676828262000742565b919050565b6000604051905090565b600067ffffffffffffffff821115620006a357620006a2620007a7565b5b620006ae82620007ea565b9050602081019050919050565b600082825260208201905092915050565b6000819050919050565b60005b83811015620006f6578082015181840152602081019050620006d9565b8381111562000706576000848401525b50505050565b600060028204905060018216806200072557607f821691505b602082108114156200073c576200073b62000778565b5b50919050565b6200074d82620007ea565b810181811067ffffffffffffffff821117156200076f576200076e620007a7565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6200082f81620006cc565b81146200083b57600080fd5b50565b6149dc806200084e6000396000f3fe6080604052600436106102c95760003560e01c806370a0823111610175578063aa66797b116100dc578063d49479eb11610095578063e985e9c51161006f578063e985e9c514610a7a578063ee89121214610ab7578063efbd73f414610ae0578063f2fde38b14610b09576102c9565b8063d49479eb146109fb578063e5a88cdb14610a24578063e7b99ec714610a4f576102c9565b8063aa66797b14610911578063b88d4fde1461093c578063bc951b9114610965578063c4ae316814610990578063c5a6534f146109a7578063c87b56dd146109be576102c9565b80638da5cb5b1161012e5780638da5cb5b14610831578063923e5f5e1461085c57806395d89b4114610885578063a0712d68146108b0578063a22cb465146108cc578063a6d612f9146108f5576102c9565b806370a0823114610737578063715018a614610774578063766b7d091461078b578063772e5748146107b45780637de55fe1146107dd5780638990694f14610806576102c9565b8063381a3506116102345780634f02c420116101ed5780635c975abb116101c75780635c975abb146106795780635e84d723146106a45780636352211e146106cf5780636c0360eb1461070c576102c9565b80634f02c420146105fa5780635503a0e81461062557806355f804b314610650576102c9565b8063381a3506146105005780633ccfd60b1461052957806342842e0e14610540578063438b63001461056957806344a0d68a146105a65780634c81433f146105cf576102c9565b806316ba10e01161028657806316ba10e0146103f257806318160ddd1461041b57806318cae2691461044657806323b872dd1461048357806326aa420a146104ac5780632cefffa7146104d5576102c9565b806301ffc9a7146102ce57806306fdde031461030b578063081812fc146103365780630855ff9a14610373578063095ea7b31461039e57806313faede6146103c7575b600080fd5b3480156102da57600080fd5b506102f560048036038101906102f09190613682565b610b32565b6040516103029190613d46565b60405180910390f35b34801561031757600080fd5b50610320610bc4565b60405161032d9190613d61565b60405180910390f35b34801561034257600080fd5b5061035d60048036038101906103589190613725565b610c56565b60405161036a9190613cbd565b60405180910390f35b34801561037f57600080fd5b50610388610cd2565b6040516103959190614003565b60405180910390f35b3480156103aa57600080fd5b506103c560048036038101906103c091906135b5565b610cd8565b005b3480156103d357600080fd5b506103dc610e19565b6040516103e99190614003565b60405180910390f35b3480156103fe57600080fd5b50610419600480360381019061041491906136dc565b610e1f565b005b34801561042757600080fd5b50610430610e41565b60405161043d9190614003565b60405180910390f35b34801561045257600080fd5b5061046d60048036038101906104689190613432565b610e58565b60405161047a9190614003565b60405180910390f35b34801561048f57600080fd5b506104aa60048036038101906104a5919061349f565b610e70565b005b3480156104b857600080fd5b506104d360048036038101906104ce9190613725565b611195565b005b3480156104e157600080fd5b506104ea6111a7565b6040516104f79190614003565b60405180910390f35b34801561050c57600080fd5b5061052760048036038101906105229190613725565b6111ad565b005b34801561053557600080fd5b5061053e6111bf565b005b34801561054c57600080fd5b506105676004803603810190610562919061349f565b6113f5565b005b34801561057557600080fd5b50610590600480360381019061058b9190613432565b611415565b60405161059d9190613d24565b60405180910390f35b3480156105b257600080fd5b506105cd60048036038101906105c89190613725565b611540565b005b3480156105db57600080fd5b506105e4611552565b6040516105f19190614003565b60405180910390f35b34801561060657600080fd5b5061060f611558565b60405161061c9190614003565b60405180910390f35b34801561063157600080fd5b5061063a61155e565b6040516106479190613d61565b60405180910390f35b34801561065c57600080fd5b50610677600480360381019061067291906136dc565b6115ec565b005b34801561068557600080fd5b5061068e61160e565b60405161069b9190613d46565b60405180910390f35b3480156106b057600080fd5b506106b9611621565b6040516106c69190614003565b60405180910390f35b3480156106db57600080fd5b506106f660048036038101906106f19190613725565b611627565b6040516107039190613cbd565b60405180910390f35b34801561071857600080fd5b50610721611639565b60405161072e9190613d61565b60405180910390f35b34801561074357600080fd5b5061075e60048036038101906107599190613432565b6116c7565b60405161076b9190614003565b60405180910390f35b34801561078057600080fd5b50610789611780565b005b34801561079757600080fd5b506107b260048036038101906107ad9190613725565b611794565b005b3480156107c057600080fd5b506107db60048036038101906107d69190613725565b6117a6565b005b3480156107e957600080fd5b5061080460048036038101906107ff91906135b5565b6117b8565b005b34801561081257600080fd5b5061081b611839565b6040516108289190614003565b60405180910390f35b34801561083d57600080fd5b5061084661183f565b6040516108539190613cbd565b60405180910390f35b34801561086857600080fd5b50610883600480360381019061087e9190613725565b611869565b005b34801561089157600080fd5b5061089a61187b565b6040516108a79190613d61565b60405180910390f35b6108ca60048036038101906108c59190613725565b61190d565b005b3480156108d857600080fd5b506108f360048036038101906108ee9190613575565b611df2565b005b61090f600480360381019061090a91906135f5565b611f6a565b005b34801561091d57600080fd5b506109266123be565b6040516109339190614003565b60405180910390f35b34801561094857600080fd5b50610963600480360381019061095e91906134f2565b6123c4565b005b34801561097157600080fd5b5061097a612437565b6040516109879190614003565b60405180910390f35b34801561099c57600080fd5b506109a561243d565b005b3480156109b357600080fd5b506109bc612471565b005b3480156109ca57600080fd5b506109e560048036038101906109e09190613725565b6124a5565b6040516109f29190613d61565b60405180910390f35b348015610a0757600080fd5b50610a226004803603810190610a1d9190613725565b61254f565b005b348015610a3057600080fd5b50610a39612561565b604051610a469190613d46565b60405180910390f35b348015610a5b57600080fd5b50610a64612574565b604051610a719190614003565b60405180910390f35b348015610a8657600080fd5b50610aa16004803603810190610a9c919061345f565b61257a565b604051610aae9190613d46565b60405180910390f35b348015610ac357600080fd5b50610ade6004803603810190610ad99190613655565b61260e565b005b348015610aec57600080fd5b50610b076004803603810190610b029190613752565b612620565b005b348015610b1557600080fd5b50610b306004803603810190610b2b9190613432565b612709565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b8d57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610bbd5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610bd390614316565b80601f0160208091040260200160405190810160405280929190818152602001828054610bff90614316565b8015610c4c5780601f10610c2157610100808354040283529160200191610c4c565b820191906000526020600020905b815481529060010190602001808311610c2f57829003601f168201915b5050505050905090565b6000610c618261278d565b610c97576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60105481565b6000610ce382611627565b90508073ffffffffffffffffffffffffffffffffffffffff16610d046127ec565b73ffffffffffffffffffffffffffffffffffffffff1614610d6757610d3081610d2b6127ec565b61257a565b610d66576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600b5481565b610e276127f4565b80600a9080519060200190610e3d9291906131db565b5050565b6000610e4b612872565b6001546000540303905090565b60186020528060005260406000206000915090505481565b6000610e7b8261287b565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ee2576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610eee84612949565b91509150610f048187610eff6127ec565b61296b565b610f5057610f1986610f146127ec565b61257a565b610f4f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610fb7576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610fc486868660016129af565b8015610fcf57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061109d856110798888876129b5565b7c0200000000000000000000000000000000000000000000000000000000176129dd565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415611125576000600185019050600060046000838152602001908152602001600020541415611123576000548114611122578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461118d8686866001612a08565b505050505050565b61119d6127f4565b80600f8190555050565b60135481565b6111b56127f4565b8060108190555050565b6111c76127f4565b6002600954141561120d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120490613fa3565b60405180910390fd5b600260098190555060004790506000811161125d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125490613fc3565b60405180910390fd5b6000739dc7a7d3c4fd55fac37f62ba311e9759f142c52573ffffffffffffffffffffffffffffffffffffffff16606460058461129991906141c8565b6112a39190614197565b6040516112af90613ca8565b60006040518083038185875af1925050503d80600081146112ec576040519150601f19603f3d011682016040523d82523d6000602084013e6112f1565b606091505b5050905080611335576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132c90613fe3565b60405180910390fd5b600061133f61183f565b73ffffffffffffffffffffffffffffffffffffffff168360405161136290613ca8565b60006040518083038185875af1925050503d806000811461139f576040519150601f19603f3d011682016040523d82523d6000602084013e6113a4565b606091505b50509050806113e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113df90613dc3565b60405180910390fd5b5050506001600981905550565b611410838383604051806020016040528060008152506123c4565b505050565b60606000611422836116c7565b905060008167ffffffffffffffff8111156114405761143f6144d3565b5b60405190808252806020026020018201604052801561146e5781602001602082028036833780820191505090505b5090506000601054601154600f546114869190614141565b6114909190614141565b905060006001905060005b84811080156114aa5750828211155b156115335760006114ba83611627565b90508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561151f5782858381518110611504576115036144a4565b5b602002602001018181525050818061151b90614379565b9250505b828061152a90614379565b9350505061149b565b8395505050505050919050565b6115486127f4565b80600b8190555050565b60145481565b60155481565b600a805461156b90614316565b80601f016020809104026020016040519081016040528092919081815260200182805461159790614316565b80156115e45780601f106115b9576101008083540402835291602001916115e4565b820191906000526020600020905b8154815290600101906020018083116115c757829003601f168201915b505050505081565b6115f46127f4565b80600e908051906020019061160a9291906131db565b5050565b601760009054906101000a900460ff1681565b600f5481565b60006116328261287b565b9050919050565b600e805461164690614316565b80601f016020809104026020016040519081016040528092919081815260200182805461167290614316565b80156116bf5780601f10611694576101008083540402835291602001916116bf565b820191906000526020600020905b8154815290600101906020018083116116a257829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561172f576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6117886127f4565b6117926000612a0e565b565b61179c6127f4565b8060128190555050565b6117ae6127f4565b8060138190555050565b6117c06127f4565b601154816014546117d19190614141565b1115611812576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180990613f23565b60405180910390fd5b61181c8282612ad4565b806014600082825461182e9190614141565b925050819055505050565b60165481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6118716127f4565b8060118190555050565b60606003805461188a90614316565b80601f01602080910402602001604051908101604052809291908181526020018280546118b690614316565b80156119035780601f106118d857610100808354040283529160200191611903565b820191906000526020600020905b8154815290600101906020018083116118e657829003601f168201915b5050505050905090565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461197b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197290613e63565b60405180910390fd5b80600081116119bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b690613f63565b60405180910390fd5b601760019054906101000a900460ff1615611ab65760135481601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a229190614141565b1115611a63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5a90613ee3565b60405180910390fd5b60105481601654611a749190614141565b1115611ab5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aac90613f03565b60405180910390fd5b5b60125481601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b049190614141565b1115611b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3c90613e43565b60405180910390fd5b600f5481601554611b569190614141565b1115611b97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8e90613f83565b60405180910390fd5b601760009054906101000a900460ff1615611be7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bde90613ea3565b60405180910390fd5b601760019054906101000a900460ff1615611c37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2e90613de3565b60405180910390fd5b6000601654601054611c499190614222565b9050806016541115611cc35782600b54611c6391906141c8565b341015611ca5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9c90613e03565b60405180910390fd5b8260156000828254611cb79190614141565b92505081905550611d8d565b60105483601654611cd49190614141565b1115611d725760008184611ce89190614222565b905080600b54611cf891906141c8565b341015611d3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3190613e03565b60405180910390fd5b8060156000828254611d4c9190614141565b925050819055508160166000828254611d659190614141565b9250508190555050611d8c565b8260166000828254611d849190614141565b925050819055505b5b611d973384612ad4565b82601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611de69190614141565b92505081905550505050565b611dfa6127ec565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e5f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611e6c6127ec565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611f196127ec565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f5e9190613d46565b60405180910390a35050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcf90613e63565b60405180910390fd5b806000811161201c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201390613f63565b60405180910390fd5b601760019054906101000a900460ff16156121135760135481601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461207f9190614141565b11156120c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b790613ee3565b60405180910390fd5b601054816016546120d19190614141565b1115612112576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210990613f03565b60405180910390fd5b5b60125481601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121619190614141565b11156121a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219990613e43565b60405180910390fd5b600f54816015546121b39190614141565b11156121f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121eb90613f83565b60405180910390fd5b601760009054906101000a900460ff161561220e57600080fd5b601760019054906101000a900460ff1661225d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225490613d83565b60405180910390fd5b6122b061226933612ae2565b858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050612b12565b6122ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e690613e23565b60405180910390fd5b81600c546122fd91906141c8565b34101561233f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233690613f43565b60405180910390fd5b6123493383612ad4565b816016600082825461235b9190614141565b9250508190555081601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123b19190614141565b9250508190555050505050565b60115481565b6123cf848484610e70565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612431576123fa84848484612b29565b612430576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60125481565b6124456127f4565b601760009054906101000a900460ff1615601760006101000a81548160ff021916908315150217905550565b6124796127f4565b601760019054906101000a900460ff1615601760016101000a81548160ff021916908315150217905550565b60606124b08261278d565b6124ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e690613ec3565b60405180910390fd5b60006124f9612c89565b905060008151116125195760405180602001604052806000815250612547565b8061252384612d1b565b600a60405160200161253793929190613c77565b6040516020818303038152906040525b915050919050565b6125576127f4565b80600c8190555050565b601760019054906101000a900460ff1681565b600c5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6126166127f4565b80600d8190555050565b6126286127f4565b6000821161266b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266290613f63565b60405180910390fd5b6000601054601154600f546126809190614141565b61268a9190614141565b90508083612696610e41565b6126a09190614141565b11156126e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d890613f83565b60405180910390fd5b6126eb8284612ad4565b82601560008282546126fd9190614141565b92505081905550505050565b6127116127f4565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277890613da3565b60405180910390fd5b61278a81612a0e565b50565b600081612798612872565b111580156127a7575060005482105b80156127e5575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b6127fc612e7c565b73ffffffffffffffffffffffffffffffffffffffff1661281a61183f565b73ffffffffffffffffffffffffffffffffffffffff1614612870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286790613e83565b60405180910390fd5b565b60006001905090565b6000808290508061288a612872565b11612912576000548110156129115760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561290f575b60008114156129055760046000836001900393508381526020019081526020016000205490506128da565b8092505050612944565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86129cc868684612e84565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612ade8282612e8d565b5050565b600081604051602001612af59190613c5c565b604051602081830303815290604052805190602001209050919050565b6000612b2182600d5485612eab565b905092915050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b4f6127ec565b8786866040518563ffffffff1660e01b8152600401612b719493929190613cd8565b602060405180830381600087803b158015612b8b57600080fd5b505af1925050508015612bbc57506040513d601f19601f82011682018060405250810190612bb991906136af565b60015b612c36573d8060008114612bec576040519150601f19603f3d011682016040523d82523d6000602084013e612bf1565b606091505b50600081511415612c2e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600e8054612c9890614316565b80601f0160208091040260200160405190810160405280929190818152602001828054612cc490614316565b8015612d115780601f10612ce657610100808354040283529160200191612d11565b820191906000526020600020905b815481529060010190602001808311612cf457829003601f168201915b5050505050905090565b60606000821415612d63576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e77565b600082905060005b60008214612d95578080612d7e90614379565b915050600a82612d8e9190614197565b9150612d6b565b60008167ffffffffffffffff811115612db157612db06144d3565b5b6040519080825280601f01601f191660200182016040528015612de35781602001600182028036833780820191505090505b5090505b60008514612e7057600182612dfc9190614222565b9150600a85612e0b91906143e6565b6030612e179190614141565b60f81b818381518110612e2d57612e2c6144a4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e699190614197565b9450612de7565b8093505050505b919050565b600033905090565b60009392505050565b612ea7828260405180602001604052806000815250612ec2565b5050565b600082612eb88584612f5f565b1490509392505050565b612ecc8383612fb5565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612f5a57600080549050600083820390505b612f0c6000868380600101945086612b29565b612f42576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612ef9578160005414612f5757600080fd5b50505b505050565b60008082905060005b8451811015612faa57612f9582868381518110612f8857612f876144a4565b5b6020026020010151613189565b91508080612fa290614379565b915050612f68565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613022576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082141561305d576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61306a60008483856129af565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506130e1836130d260008660006129b5565b6130db856131b4565b176129dd565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210613105578060008190555050506131846000848385612a08565b505050565b60008183106131a15761319c82846131c4565b6131ac565b6131ab83836131c4565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b8280546131e790614316565b90600052602060002090601f0160209004810192826132095760008555613250565b82601f1061322257805160ff1916838001178555613250565b82800160010185558215613250579182015b8281111561324f578251825591602001919060010190613234565b5b50905061325d9190613261565b5090565b5b8082111561327a576000816000905550600101613262565b5090565b600061329161328c84614043565b61401e565b9050828152602081018484840111156132ad576132ac614511565b5b6132b88482856142d4565b509392505050565b60006132d36132ce84614074565b61401e565b9050828152602081018484840111156132ef576132ee614511565b5b6132fa8482856142d4565b509392505050565b60008135905061331181614933565b92915050565b60008083601f84011261332d5761332c614507565b5b8235905067ffffffffffffffff81111561334a57613349614502565b5b6020830191508360208202830111156133665761336561450c565b5b9250929050565b60008135905061337c8161494a565b92915050565b60008135905061339181614961565b92915050565b6000813590506133a681614978565b92915050565b6000815190506133bb81614978565b92915050565b600082601f8301126133d6576133d5614507565b5b81356133e684826020860161327e565b91505092915050565b600082601f83011261340457613403614507565b5b81356134148482602086016132c0565b91505092915050565b60008135905061342c8161498f565b92915050565b6000602082840312156134485761344761451b565b5b600061345684828501613302565b91505092915050565b600080604083850312156134765761347561451b565b5b600061348485828601613302565b925050602061349585828601613302565b9150509250929050565b6000806000606084860312156134b8576134b761451b565b5b60006134c686828701613302565b93505060206134d786828701613302565b92505060406134e88682870161341d565b9150509250925092565b6000806000806080858703121561350c5761350b61451b565b5b600061351a87828801613302565b945050602061352b87828801613302565b935050604061353c8782880161341d565b925050606085013567ffffffffffffffff81111561355d5761355c614516565b5b613569878288016133c1565b91505092959194509250565b6000806040838503121561358c5761358b61451b565b5b600061359a85828601613302565b92505060206135ab8582860161336d565b9150509250929050565b600080604083850312156135cc576135cb61451b565b5b60006135da85828601613302565b92505060206135eb8582860161341d565b9150509250929050565b60008060006040848603121561360e5761360d61451b565b5b600084013567ffffffffffffffff81111561362c5761362b614516565b5b61363886828701613317565b9350935050602061364b8682870161341d565b9150509250925092565b60006020828403121561366b5761366a61451b565b5b600061367984828501613382565b91505092915050565b6000602082840312156136985761369761451b565b5b60006136a684828501613397565b91505092915050565b6000602082840312156136c5576136c461451b565b5b60006136d3848285016133ac565b91505092915050565b6000602082840312156136f2576136f161451b565b5b600082013567ffffffffffffffff8111156137105761370f614516565b5b61371c848285016133ef565b91505092915050565b60006020828403121561373b5761373a61451b565b5b60006137498482850161341d565b91505092915050565b600080604083850312156137695761376861451b565b5b60006137778582860161341d565b925050602061378885828601613302565b9150509250929050565b600061379e8383613c3e565b60208301905092915050565b6137b381614256565b82525050565b6137ca6137c582614256565b6143c2565b82525050565b60006137db826140ca565b6137e581856140f8565b93506137f0836140a5565b8060005b838110156138215781516138088882613792565b9750613813836140eb565b9250506001810190506137f4565b5085935050505092915050565b61383781614268565b82525050565b6000613848826140d5565b6138528185614109565b93506138628185602086016142e3565b61386b81614520565b840191505092915050565b6000613881826140e0565b61388b8185614125565b935061389b8185602086016142e3565b6138a481614520565b840191505092915050565b60006138ba826140e0565b6138c48185614136565b93506138d48185602086016142e3565b80840191505092915050565b600081546138ed81614316565b6138f78186614136565b94506001821660008114613912576001811461392357613956565b60ff19831686528186019350613956565b61392c856140b5565b60005b8381101561394e5781548189015260018201915060208101905061392f565b838801955050505b50505092915050565b600061396c601f83614125565b91506139778261453e565b602082019050919050565b600061398f602683614125565b915061399a82614567565b604082019050919050565b60006139b2601f83614125565b91506139bd826145b6565b602082019050919050565b60006139d5601883614125565b91506139e0826145df565b602082019050919050565b60006139f8601083614125565b9150613a0382614608565b602082019050919050565b6000613a1b601483614125565b9150613a2682614631565b602082019050919050565b6000613a3e602483614125565b9150613a498261465a565b604082019050919050565b6000613a61600e83614125565b9150613a6c826146a9565b602082019050919050565b6000613a84602083614125565b9150613a8f826146d2565b602082019050919050565b6000613aa7601783614125565b9150613ab2826146fb565b602082019050919050565b6000613aca602f83614125565b9150613ad582614724565b604082019050919050565b6000613aed60008361411a565b9150613af882614773565b600082019050919050565b6000613b10602883614125565b9150613b1b82614776565b604082019050919050565b6000613b33602083614125565b9150613b3e826147c5565b602082019050919050565b6000613b56601d83614125565b9150613b61826147ee565b602082019050919050565b6000613b79601883614125565b9150613b8482614817565b602082019050919050565b6000613b9c602483614125565b9150613ba782614840565b604082019050919050565b6000613bbf601a83614125565b9150613bca8261488f565b602082019050919050565b6000613be2601f83614125565b9150613bed826148b8565b602082019050919050565b6000613c05600c83614125565b9150613c10826148e1565b602082019050919050565b6000613c28601b83614125565b9150613c338261490a565b602082019050919050565b613c47816142ca565b82525050565b613c56816142ca565b82525050565b6000613c6882846137b9565b60148201915081905092915050565b6000613c8382866138af565b9150613c8f82856138af565b9150613c9b82846138e0565b9150819050949350505050565b6000613cb382613ae0565b9150819050919050565b6000602082019050613cd260008301846137aa565b92915050565b6000608082019050613ced60008301876137aa565b613cfa60208301866137aa565b613d076040830185613c4d565b8181036060830152613d19818461383d565b905095945050505050565b60006020820190508181036000830152613d3e81846137d0565b905092915050565b6000602082019050613d5b600083018461382e565b92915050565b60006020820190508181036000830152613d7b8184613876565b905092915050565b60006020820190508181036000830152613d9c8161395f565b9050919050565b60006020820190508181036000830152613dbc81613982565b9050919050565b60006020820190508181036000830152613ddc816139a5565b9050919050565b60006020820190508181036000830152613dfc816139c8565b9050919050565b60006020820190508181036000830152613e1c816139eb565b9050919050565b60006020820190508181036000830152613e3c81613a0e565b9050919050565b60006020820190508181036000830152613e5c81613a31565b9050919050565b60006020820190508181036000830152613e7c81613a54565b9050919050565b60006020820190508181036000830152613e9c81613a77565b9050919050565b60006020820190508181036000830152613ebc81613a9a565b9050919050565b60006020820190508181036000830152613edc81613abd565b9050919050565b60006020820190508181036000830152613efc81613b03565b9050919050565b60006020820190508181036000830152613f1c81613b26565b9050919050565b60006020820190508181036000830152613f3c81613b49565b9050919050565b60006020820190508181036000830152613f5c81613b6c565b9050919050565b60006020820190508181036000830152613f7c81613b8f565b9050919050565b60006020820190508181036000830152613f9c81613bb2565b9050919050565b60006020820190508181036000830152613fbc81613bd5565b9050919050565b60006020820190508181036000830152613fdc81613bf8565b9050919050565b60006020820190508181036000830152613ffc81613c1b565b9050919050565b60006020820190506140186000830184613c4d565b92915050565b6000614028614039565b90506140348282614348565b919050565b6000604051905090565b600067ffffffffffffffff82111561405e5761405d6144d3565b5b61406782614520565b9050602081019050919050565b600067ffffffffffffffff82111561408f5761408e6144d3565b5b61409882614520565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061414c826142ca565b9150614157836142ca565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561418c5761418b614417565b5b828201905092915050565b60006141a2826142ca565b91506141ad836142ca565b9250826141bd576141bc614446565b5b828204905092915050565b60006141d3826142ca565b91506141de836142ca565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561421757614216614417565b5b828202905092915050565b600061422d826142ca565b9150614238836142ca565b92508282101561424b5761424a614417565b5b828203905092915050565b6000614261826142aa565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156143015780820151818401526020810190506142e6565b83811115614310576000848401525b50505050565b6000600282049050600182168061432e57607f821691505b6020821081141561434257614341614475565b5b50919050565b61435182614520565b810181811067ffffffffffffffff821117156143705761436f6144d3565b5b80604052505050565b6000614384826142ca565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156143b7576143b6614417565b5b600182019050919050565b60006143cd826143d4565b9050919050565b60006143df82614531565b9050919050565b60006143f1826142ca565b91506143fc836142ca565b92508261440c5761440b614446565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f50726964653a2057686974656c697374696e67206e6f7420656e61626c656400600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4661696c656420746f2073656e6420746f206f776e65722077616c6c65742e00600082015250565b7f596f752063616e74206d696e74206f6e2050726573616c650000000000000000600082015250565b7f496e7375666669656e742066756e647300000000000000000000000000000000600082015250565b7f50726964653a20496e76616c69642070726f6f66000000000000000000000000600082015250565b7f50726964653a205075626c69632073616c6520616c6c6f77616e63652045786360008201527f6565647300000000000000000000000000000000000000000000000000000000602082015250565b7f50726964653a204e6f20626f7473000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f50726964653a2057686974656c6973742073616c6520616c6c6f77616e63652060008201527f4578636565646564000000000000000000000000000000000000000000000000602082015250565b7f5072696465203a77686974656c69737420737570706c79204578636565646564600082015250565b7f50726964653a2052657365766520737570706c79204578636565646564000000600082015250565b7f50726964653a20496e7375666669656e742066756e6473200000000000000000600082015250565b7f4d696e7420616d6f756e742073686f756c64206265206772656174657220746860008201527f616e203000000000000000000000000000000000000000000000000000000000602082015250565b7f5072696465203a4d617820737570706c79204578636565646564000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4e6f742068617665204574680000000000000000000000000000000000000000600082015250565b7f4661696c656420746f2073656e6420746f2057414c4c45545f412e0000000000600082015250565b61493c81614256565b811461494757600080fd5b50565b61495381614268565b811461495e57600080fd5b50565b61496a81614274565b811461497557600080fd5b50565b6149818161427e565b811461498c57600080fd5b50565b614998816142ca565b81146149a357600080fd5b5056fea2646970667358221220ce19d38505cf859ee60ed9d966760a4bf5c40f74fc98df682a0ac8b52e291b8e64736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000f1d000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000b5072696465456c69786972000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000250450000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5452364e3572656945556b46344e37446b624a745343704d485332516a515333564d734178596a656e44534c2f00000000000000000000

Deployed Bytecode

0x6080604052600436106102c95760003560e01c806370a0823111610175578063aa66797b116100dc578063d49479eb11610095578063e985e9c51161006f578063e985e9c514610a7a578063ee89121214610ab7578063efbd73f414610ae0578063f2fde38b14610b09576102c9565b8063d49479eb146109fb578063e5a88cdb14610a24578063e7b99ec714610a4f576102c9565b8063aa66797b14610911578063b88d4fde1461093c578063bc951b9114610965578063c4ae316814610990578063c5a6534f146109a7578063c87b56dd146109be576102c9565b80638da5cb5b1161012e5780638da5cb5b14610831578063923e5f5e1461085c57806395d89b4114610885578063a0712d68146108b0578063a22cb465146108cc578063a6d612f9146108f5576102c9565b806370a0823114610737578063715018a614610774578063766b7d091461078b578063772e5748146107b45780637de55fe1146107dd5780638990694f14610806576102c9565b8063381a3506116102345780634f02c420116101ed5780635c975abb116101c75780635c975abb146106795780635e84d723146106a45780636352211e146106cf5780636c0360eb1461070c576102c9565b80634f02c420146105fa5780635503a0e81461062557806355f804b314610650576102c9565b8063381a3506146105005780633ccfd60b1461052957806342842e0e14610540578063438b63001461056957806344a0d68a146105a65780634c81433f146105cf576102c9565b806316ba10e01161028657806316ba10e0146103f257806318160ddd1461041b57806318cae2691461044657806323b872dd1461048357806326aa420a146104ac5780632cefffa7146104d5576102c9565b806301ffc9a7146102ce57806306fdde031461030b578063081812fc146103365780630855ff9a14610373578063095ea7b31461039e57806313faede6146103c7575b600080fd5b3480156102da57600080fd5b506102f560048036038101906102f09190613682565b610b32565b6040516103029190613d46565b60405180910390f35b34801561031757600080fd5b50610320610bc4565b60405161032d9190613d61565b60405180910390f35b34801561034257600080fd5b5061035d60048036038101906103589190613725565b610c56565b60405161036a9190613cbd565b60405180910390f35b34801561037f57600080fd5b50610388610cd2565b6040516103959190614003565b60405180910390f35b3480156103aa57600080fd5b506103c560048036038101906103c091906135b5565b610cd8565b005b3480156103d357600080fd5b506103dc610e19565b6040516103e99190614003565b60405180910390f35b3480156103fe57600080fd5b50610419600480360381019061041491906136dc565b610e1f565b005b34801561042757600080fd5b50610430610e41565b60405161043d9190614003565b60405180910390f35b34801561045257600080fd5b5061046d60048036038101906104689190613432565b610e58565b60405161047a9190614003565b60405180910390f35b34801561048f57600080fd5b506104aa60048036038101906104a5919061349f565b610e70565b005b3480156104b857600080fd5b506104d360048036038101906104ce9190613725565b611195565b005b3480156104e157600080fd5b506104ea6111a7565b6040516104f79190614003565b60405180910390f35b34801561050c57600080fd5b5061052760048036038101906105229190613725565b6111ad565b005b34801561053557600080fd5b5061053e6111bf565b005b34801561054c57600080fd5b506105676004803603810190610562919061349f565b6113f5565b005b34801561057557600080fd5b50610590600480360381019061058b9190613432565b611415565b60405161059d9190613d24565b60405180910390f35b3480156105b257600080fd5b506105cd60048036038101906105c89190613725565b611540565b005b3480156105db57600080fd5b506105e4611552565b6040516105f19190614003565b60405180910390f35b34801561060657600080fd5b5061060f611558565b60405161061c9190614003565b60405180910390f35b34801561063157600080fd5b5061063a61155e565b6040516106479190613d61565b60405180910390f35b34801561065c57600080fd5b50610677600480360381019061067291906136dc565b6115ec565b005b34801561068557600080fd5b5061068e61160e565b60405161069b9190613d46565b60405180910390f35b3480156106b057600080fd5b506106b9611621565b6040516106c69190614003565b60405180910390f35b3480156106db57600080fd5b506106f660048036038101906106f19190613725565b611627565b6040516107039190613cbd565b60405180910390f35b34801561071857600080fd5b50610721611639565b60405161072e9190613d61565b60405180910390f35b34801561074357600080fd5b5061075e60048036038101906107599190613432565b6116c7565b60405161076b9190614003565b60405180910390f35b34801561078057600080fd5b50610789611780565b005b34801561079757600080fd5b506107b260048036038101906107ad9190613725565b611794565b005b3480156107c057600080fd5b506107db60048036038101906107d69190613725565b6117a6565b005b3480156107e957600080fd5b5061080460048036038101906107ff91906135b5565b6117b8565b005b34801561081257600080fd5b5061081b611839565b6040516108289190614003565b60405180910390f35b34801561083d57600080fd5b5061084661183f565b6040516108539190613cbd565b60405180910390f35b34801561086857600080fd5b50610883600480360381019061087e9190613725565b611869565b005b34801561089157600080fd5b5061089a61187b565b6040516108a79190613d61565b60405180910390f35b6108ca60048036038101906108c59190613725565b61190d565b005b3480156108d857600080fd5b506108f360048036038101906108ee9190613575565b611df2565b005b61090f600480360381019061090a91906135f5565b611f6a565b005b34801561091d57600080fd5b506109266123be565b6040516109339190614003565b60405180910390f35b34801561094857600080fd5b50610963600480360381019061095e91906134f2565b6123c4565b005b34801561097157600080fd5b5061097a612437565b6040516109879190614003565b60405180910390f35b34801561099c57600080fd5b506109a561243d565b005b3480156109b357600080fd5b506109bc612471565b005b3480156109ca57600080fd5b506109e560048036038101906109e09190613725565b6124a5565b6040516109f29190613d61565b60405180910390f35b348015610a0757600080fd5b50610a226004803603810190610a1d9190613725565b61254f565b005b348015610a3057600080fd5b50610a39612561565b604051610a469190613d46565b60405180910390f35b348015610a5b57600080fd5b50610a64612574565b604051610a719190614003565b60405180910390f35b348015610a8657600080fd5b50610aa16004803603810190610a9c919061345f565b61257a565b604051610aae9190613d46565b60405180910390f35b348015610ac357600080fd5b50610ade6004803603810190610ad99190613655565b61260e565b005b348015610aec57600080fd5b50610b076004803603810190610b029190613752565b612620565b005b348015610b1557600080fd5b50610b306004803603810190610b2b9190613432565b612709565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b8d57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610bbd5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610bd390614316565b80601f0160208091040260200160405190810160405280929190818152602001828054610bff90614316565b8015610c4c5780601f10610c2157610100808354040283529160200191610c4c565b820191906000526020600020905b815481529060010190602001808311610c2f57829003601f168201915b5050505050905090565b6000610c618261278d565b610c97576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60105481565b6000610ce382611627565b90508073ffffffffffffffffffffffffffffffffffffffff16610d046127ec565b73ffffffffffffffffffffffffffffffffffffffff1614610d6757610d3081610d2b6127ec565b61257a565b610d66576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600b5481565b610e276127f4565b80600a9080519060200190610e3d9291906131db565b5050565b6000610e4b612872565b6001546000540303905090565b60186020528060005260406000206000915090505481565b6000610e7b8261287b565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ee2576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610eee84612949565b91509150610f048187610eff6127ec565b61296b565b610f5057610f1986610f146127ec565b61257a565b610f4f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610fb7576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610fc486868660016129af565b8015610fcf57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061109d856110798888876129b5565b7c0200000000000000000000000000000000000000000000000000000000176129dd565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415611125576000600185019050600060046000838152602001908152602001600020541415611123576000548114611122578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461118d8686866001612a08565b505050505050565b61119d6127f4565b80600f8190555050565b60135481565b6111b56127f4565b8060108190555050565b6111c76127f4565b6002600954141561120d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120490613fa3565b60405180910390fd5b600260098190555060004790506000811161125d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125490613fc3565b60405180910390fd5b6000739dc7a7d3c4fd55fac37f62ba311e9759f142c52573ffffffffffffffffffffffffffffffffffffffff16606460058461129991906141c8565b6112a39190614197565b6040516112af90613ca8565b60006040518083038185875af1925050503d80600081146112ec576040519150601f19603f3d011682016040523d82523d6000602084013e6112f1565b606091505b5050905080611335576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132c90613fe3565b60405180910390fd5b600061133f61183f565b73ffffffffffffffffffffffffffffffffffffffff168360405161136290613ca8565b60006040518083038185875af1925050503d806000811461139f576040519150601f19603f3d011682016040523d82523d6000602084013e6113a4565b606091505b50509050806113e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113df90613dc3565b60405180910390fd5b5050506001600981905550565b611410838383604051806020016040528060008152506123c4565b505050565b60606000611422836116c7565b905060008167ffffffffffffffff8111156114405761143f6144d3565b5b60405190808252806020026020018201604052801561146e5781602001602082028036833780820191505090505b5090506000601054601154600f546114869190614141565b6114909190614141565b905060006001905060005b84811080156114aa5750828211155b156115335760006114ba83611627565b90508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561151f5782858381518110611504576115036144a4565b5b602002602001018181525050818061151b90614379565b9250505b828061152a90614379565b9350505061149b565b8395505050505050919050565b6115486127f4565b80600b8190555050565b60145481565b60155481565b600a805461156b90614316565b80601f016020809104026020016040519081016040528092919081815260200182805461159790614316565b80156115e45780601f106115b9576101008083540402835291602001916115e4565b820191906000526020600020905b8154815290600101906020018083116115c757829003601f168201915b505050505081565b6115f46127f4565b80600e908051906020019061160a9291906131db565b5050565b601760009054906101000a900460ff1681565b600f5481565b60006116328261287b565b9050919050565b600e805461164690614316565b80601f016020809104026020016040519081016040528092919081815260200182805461167290614316565b80156116bf5780601f10611694576101008083540402835291602001916116bf565b820191906000526020600020905b8154815290600101906020018083116116a257829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561172f576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6117886127f4565b6117926000612a0e565b565b61179c6127f4565b8060128190555050565b6117ae6127f4565b8060138190555050565b6117c06127f4565b601154816014546117d19190614141565b1115611812576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180990613f23565b60405180910390fd5b61181c8282612ad4565b806014600082825461182e9190614141565b925050819055505050565b60165481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6118716127f4565b8060118190555050565b60606003805461188a90614316565b80601f01602080910402602001604051908101604052809291908181526020018280546118b690614316565b80156119035780601f106118d857610100808354040283529160200191611903565b820191906000526020600020905b8154815290600101906020018083116118e657829003601f168201915b5050505050905090565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461197b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197290613e63565b60405180910390fd5b80600081116119bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b690613f63565b60405180910390fd5b601760019054906101000a900460ff1615611ab65760135481601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a229190614141565b1115611a63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5a90613ee3565b60405180910390fd5b60105481601654611a749190614141565b1115611ab5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aac90613f03565b60405180910390fd5b5b60125481601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b049190614141565b1115611b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3c90613e43565b60405180910390fd5b600f5481601554611b569190614141565b1115611b97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8e90613f83565b60405180910390fd5b601760009054906101000a900460ff1615611be7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bde90613ea3565b60405180910390fd5b601760019054906101000a900460ff1615611c37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2e90613de3565b60405180910390fd5b6000601654601054611c499190614222565b9050806016541115611cc35782600b54611c6391906141c8565b341015611ca5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9c90613e03565b60405180910390fd5b8260156000828254611cb79190614141565b92505081905550611d8d565b60105483601654611cd49190614141565b1115611d725760008184611ce89190614222565b905080600b54611cf891906141c8565b341015611d3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3190613e03565b60405180910390fd5b8060156000828254611d4c9190614141565b925050819055508160166000828254611d659190614141565b9250508190555050611d8c565b8260166000828254611d849190614141565b925050819055505b5b611d973384612ad4565b82601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611de69190614141565b92505081905550505050565b611dfa6127ec565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e5f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611e6c6127ec565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611f196127ec565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f5e9190613d46565b60405180910390a35050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcf90613e63565b60405180910390fd5b806000811161201c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201390613f63565b60405180910390fd5b601760019054906101000a900460ff16156121135760135481601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461207f9190614141565b11156120c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b790613ee3565b60405180910390fd5b601054816016546120d19190614141565b1115612112576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210990613f03565b60405180910390fd5b5b60125481601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121619190614141565b11156121a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219990613e43565b60405180910390fd5b600f54816015546121b39190614141565b11156121f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121eb90613f83565b60405180910390fd5b601760009054906101000a900460ff161561220e57600080fd5b601760019054906101000a900460ff1661225d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225490613d83565b60405180910390fd5b6122b061226933612ae2565b858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050612b12565b6122ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e690613e23565b60405180910390fd5b81600c546122fd91906141c8565b34101561233f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233690613f43565b60405180910390fd5b6123493383612ad4565b816016600082825461235b9190614141565b9250508190555081601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123b19190614141565b9250508190555050505050565b60115481565b6123cf848484610e70565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612431576123fa84848484612b29565b612430576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60125481565b6124456127f4565b601760009054906101000a900460ff1615601760006101000a81548160ff021916908315150217905550565b6124796127f4565b601760019054906101000a900460ff1615601760016101000a81548160ff021916908315150217905550565b60606124b08261278d565b6124ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e690613ec3565b60405180910390fd5b60006124f9612c89565b905060008151116125195760405180602001604052806000815250612547565b8061252384612d1b565b600a60405160200161253793929190613c77565b6040516020818303038152906040525b915050919050565b6125576127f4565b80600c8190555050565b601760019054906101000a900460ff1681565b600c5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6126166127f4565b80600d8190555050565b6126286127f4565b6000821161266b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266290613f63565b60405180910390fd5b6000601054601154600f546126809190614141565b61268a9190614141565b90508083612696610e41565b6126a09190614141565b11156126e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d890613f83565b60405180910390fd5b6126eb8284612ad4565b82601560008282546126fd9190614141565b92505081905550505050565b6127116127f4565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277890613da3565b60405180910390fd5b61278a81612a0e565b50565b600081612798612872565b111580156127a7575060005482105b80156127e5575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b6127fc612e7c565b73ffffffffffffffffffffffffffffffffffffffff1661281a61183f565b73ffffffffffffffffffffffffffffffffffffffff1614612870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286790613e83565b60405180910390fd5b565b60006001905090565b6000808290508061288a612872565b11612912576000548110156129115760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561290f575b60008114156129055760046000836001900393508381526020019081526020016000205490506128da565b8092505050612944565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86129cc868684612e84565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612ade8282612e8d565b5050565b600081604051602001612af59190613c5c565b604051602081830303815290604052805190602001209050919050565b6000612b2182600d5485612eab565b905092915050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b4f6127ec565b8786866040518563ffffffff1660e01b8152600401612b719493929190613cd8565b602060405180830381600087803b158015612b8b57600080fd5b505af1925050508015612bbc57506040513d601f19601f82011682018060405250810190612bb991906136af565b60015b612c36573d8060008114612bec576040519150601f19603f3d011682016040523d82523d6000602084013e612bf1565b606091505b50600081511415612c2e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600e8054612c9890614316565b80601f0160208091040260200160405190810160405280929190818152602001828054612cc490614316565b8015612d115780601f10612ce657610100808354040283529160200191612d11565b820191906000526020600020905b815481529060010190602001808311612cf457829003601f168201915b5050505050905090565b60606000821415612d63576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e77565b600082905060005b60008214612d95578080612d7e90614379565b915050600a82612d8e9190614197565b9150612d6b565b60008167ffffffffffffffff811115612db157612db06144d3565b5b6040519080825280601f01601f191660200182016040528015612de35781602001600182028036833780820191505090505b5090505b60008514612e7057600182612dfc9190614222565b9150600a85612e0b91906143e6565b6030612e179190614141565b60f81b818381518110612e2d57612e2c6144a4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e699190614197565b9450612de7565b8093505050505b919050565b600033905090565b60009392505050565b612ea7828260405180602001604052806000815250612ec2565b5050565b600082612eb88584612f5f565b1490509392505050565b612ecc8383612fb5565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612f5a57600080549050600083820390505b612f0c6000868380600101945086612b29565b612f42576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612ef9578160005414612f5757600080fd5b50505b505050565b60008082905060005b8451811015612faa57612f9582868381518110612f8857612f876144a4565b5b6020026020010151613189565b91508080612fa290614379565b915050612f68565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613022576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082141561305d576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61306a60008483856129af565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506130e1836130d260008660006129b5565b6130db856131b4565b176129dd565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210613105578060008190555050506131846000848385612a08565b505050565b60008183106131a15761319c82846131c4565b6131ac565b6131ab83836131c4565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b8280546131e790614316565b90600052602060002090601f0160209004810192826132095760008555613250565b82601f1061322257805160ff1916838001178555613250565b82800160010185558215613250579182015b8281111561324f578251825591602001919060010190613234565b5b50905061325d9190613261565b5090565b5b8082111561327a576000816000905550600101613262565b5090565b600061329161328c84614043565b61401e565b9050828152602081018484840111156132ad576132ac614511565b5b6132b88482856142d4565b509392505050565b60006132d36132ce84614074565b61401e565b9050828152602081018484840111156132ef576132ee614511565b5b6132fa8482856142d4565b509392505050565b60008135905061331181614933565b92915050565b60008083601f84011261332d5761332c614507565b5b8235905067ffffffffffffffff81111561334a57613349614502565b5b6020830191508360208202830111156133665761336561450c565b5b9250929050565b60008135905061337c8161494a565b92915050565b60008135905061339181614961565b92915050565b6000813590506133a681614978565b92915050565b6000815190506133bb81614978565b92915050565b600082601f8301126133d6576133d5614507565b5b81356133e684826020860161327e565b91505092915050565b600082601f83011261340457613403614507565b5b81356134148482602086016132c0565b91505092915050565b60008135905061342c8161498f565b92915050565b6000602082840312156134485761344761451b565b5b600061345684828501613302565b91505092915050565b600080604083850312156134765761347561451b565b5b600061348485828601613302565b925050602061349585828601613302565b9150509250929050565b6000806000606084860312156134b8576134b761451b565b5b60006134c686828701613302565b93505060206134d786828701613302565b92505060406134e88682870161341d565b9150509250925092565b6000806000806080858703121561350c5761350b61451b565b5b600061351a87828801613302565b945050602061352b87828801613302565b935050604061353c8782880161341d565b925050606085013567ffffffffffffffff81111561355d5761355c614516565b5b613569878288016133c1565b91505092959194509250565b6000806040838503121561358c5761358b61451b565b5b600061359a85828601613302565b92505060206135ab8582860161336d565b9150509250929050565b600080604083850312156135cc576135cb61451b565b5b60006135da85828601613302565b92505060206135eb8582860161341d565b9150509250929050565b60008060006040848603121561360e5761360d61451b565b5b600084013567ffffffffffffffff81111561362c5761362b614516565b5b61363886828701613317565b9350935050602061364b8682870161341d565b9150509250925092565b60006020828403121561366b5761366a61451b565b5b600061367984828501613382565b91505092915050565b6000602082840312156136985761369761451b565b5b60006136a684828501613397565b91505092915050565b6000602082840312156136c5576136c461451b565b5b60006136d3848285016133ac565b91505092915050565b6000602082840312156136f2576136f161451b565b5b600082013567ffffffffffffffff8111156137105761370f614516565b5b61371c848285016133ef565b91505092915050565b60006020828403121561373b5761373a61451b565b5b60006137498482850161341d565b91505092915050565b600080604083850312156137695761376861451b565b5b60006137778582860161341d565b925050602061378885828601613302565b9150509250929050565b600061379e8383613c3e565b60208301905092915050565b6137b381614256565b82525050565b6137ca6137c582614256565b6143c2565b82525050565b60006137db826140ca565b6137e581856140f8565b93506137f0836140a5565b8060005b838110156138215781516138088882613792565b9750613813836140eb565b9250506001810190506137f4565b5085935050505092915050565b61383781614268565b82525050565b6000613848826140d5565b6138528185614109565b93506138628185602086016142e3565b61386b81614520565b840191505092915050565b6000613881826140e0565b61388b8185614125565b935061389b8185602086016142e3565b6138a481614520565b840191505092915050565b60006138ba826140e0565b6138c48185614136565b93506138d48185602086016142e3565b80840191505092915050565b600081546138ed81614316565b6138f78186614136565b94506001821660008114613912576001811461392357613956565b60ff19831686528186019350613956565b61392c856140b5565b60005b8381101561394e5781548189015260018201915060208101905061392f565b838801955050505b50505092915050565b600061396c601f83614125565b91506139778261453e565b602082019050919050565b600061398f602683614125565b915061399a82614567565b604082019050919050565b60006139b2601f83614125565b91506139bd826145b6565b602082019050919050565b60006139d5601883614125565b91506139e0826145df565b602082019050919050565b60006139f8601083614125565b9150613a0382614608565b602082019050919050565b6000613a1b601483614125565b9150613a2682614631565b602082019050919050565b6000613a3e602483614125565b9150613a498261465a565b604082019050919050565b6000613a61600e83614125565b9150613a6c826146a9565b602082019050919050565b6000613a84602083614125565b9150613a8f826146d2565b602082019050919050565b6000613aa7601783614125565b9150613ab2826146fb565b602082019050919050565b6000613aca602f83614125565b9150613ad582614724565b604082019050919050565b6000613aed60008361411a565b9150613af882614773565b600082019050919050565b6000613b10602883614125565b9150613b1b82614776565b604082019050919050565b6000613b33602083614125565b9150613b3e826147c5565b602082019050919050565b6000613b56601d83614125565b9150613b61826147ee565b602082019050919050565b6000613b79601883614125565b9150613b8482614817565b602082019050919050565b6000613b9c602483614125565b9150613ba782614840565b604082019050919050565b6000613bbf601a83614125565b9150613bca8261488f565b602082019050919050565b6000613be2601f83614125565b9150613bed826148b8565b602082019050919050565b6000613c05600c83614125565b9150613c10826148e1565b602082019050919050565b6000613c28601b83614125565b9150613c338261490a565b602082019050919050565b613c47816142ca565b82525050565b613c56816142ca565b82525050565b6000613c6882846137b9565b60148201915081905092915050565b6000613c8382866138af565b9150613c8f82856138af565b9150613c9b82846138e0565b9150819050949350505050565b6000613cb382613ae0565b9150819050919050565b6000602082019050613cd260008301846137aa565b92915050565b6000608082019050613ced60008301876137aa565b613cfa60208301866137aa565b613d076040830185613c4d565b8181036060830152613d19818461383d565b905095945050505050565b60006020820190508181036000830152613d3e81846137d0565b905092915050565b6000602082019050613d5b600083018461382e565b92915050565b60006020820190508181036000830152613d7b8184613876565b905092915050565b60006020820190508181036000830152613d9c8161395f565b9050919050565b60006020820190508181036000830152613dbc81613982565b9050919050565b60006020820190508181036000830152613ddc816139a5565b9050919050565b60006020820190508181036000830152613dfc816139c8565b9050919050565b60006020820190508181036000830152613e1c816139eb565b9050919050565b60006020820190508181036000830152613e3c81613a0e565b9050919050565b60006020820190508181036000830152613e5c81613a31565b9050919050565b60006020820190508181036000830152613e7c81613a54565b9050919050565b60006020820190508181036000830152613e9c81613a77565b9050919050565b60006020820190508181036000830152613ebc81613a9a565b9050919050565b60006020820190508181036000830152613edc81613abd565b9050919050565b60006020820190508181036000830152613efc81613b03565b9050919050565b60006020820190508181036000830152613f1c81613b26565b9050919050565b60006020820190508181036000830152613f3c81613b49565b9050919050565b60006020820190508181036000830152613f5c81613b6c565b9050919050565b60006020820190508181036000830152613f7c81613b8f565b9050919050565b60006020820190508181036000830152613f9c81613bb2565b9050919050565b60006020820190508181036000830152613fbc81613bd5565b9050919050565b60006020820190508181036000830152613fdc81613bf8565b9050919050565b60006020820190508181036000830152613ffc81613c1b565b9050919050565b60006020820190506140186000830184613c4d565b92915050565b6000614028614039565b90506140348282614348565b919050565b6000604051905090565b600067ffffffffffffffff82111561405e5761405d6144d3565b5b61406782614520565b9050602081019050919050565b600067ffffffffffffffff82111561408f5761408e6144d3565b5b61409882614520565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061414c826142ca565b9150614157836142ca565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561418c5761418b614417565b5b828201905092915050565b60006141a2826142ca565b91506141ad836142ca565b9250826141bd576141bc614446565b5b828204905092915050565b60006141d3826142ca565b91506141de836142ca565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561421757614216614417565b5b828202905092915050565b600061422d826142ca565b9150614238836142ca565b92508282101561424b5761424a614417565b5b828203905092915050565b6000614261826142aa565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156143015780820151818401526020810190506142e6565b83811115614310576000848401525b50505050565b6000600282049050600182168061432e57607f821691505b6020821081141561434257614341614475565b5b50919050565b61435182614520565b810181811067ffffffffffffffff821117156143705761436f6144d3565b5b80604052505050565b6000614384826142ca565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156143b7576143b6614417565b5b600182019050919050565b60006143cd826143d4565b9050919050565b60006143df82614531565b9050919050565b60006143f1826142ca565b91506143fc836142ca565b92508261440c5761440b614446565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f50726964653a2057686974656c697374696e67206e6f7420656e61626c656400600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4661696c656420746f2073656e6420746f206f776e65722077616c6c65742e00600082015250565b7f596f752063616e74206d696e74206f6e2050726573616c650000000000000000600082015250565b7f496e7375666669656e742066756e647300000000000000000000000000000000600082015250565b7f50726964653a20496e76616c69642070726f6f66000000000000000000000000600082015250565b7f50726964653a205075626c69632073616c6520616c6c6f77616e63652045786360008201527f6565647300000000000000000000000000000000000000000000000000000000602082015250565b7f50726964653a204e6f20626f7473000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f50726964653a2057686974656c6973742073616c6520616c6c6f77616e63652060008201527f4578636565646564000000000000000000000000000000000000000000000000602082015250565b7f5072696465203a77686974656c69737420737570706c79204578636565646564600082015250565b7f50726964653a2052657365766520737570706c79204578636565646564000000600082015250565b7f50726964653a20496e7375666669656e742066756e6473200000000000000000600082015250565b7f4d696e7420616d6f756e742073686f756c64206265206772656174657220746860008201527f616e203000000000000000000000000000000000000000000000000000000000602082015250565b7f5072696465203a4d617820737570706c79204578636565646564000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4e6f742068617665204574680000000000000000000000000000000000000000600082015250565b7f4661696c656420746f2073656e6420746f2057414c4c45545f412e0000000000600082015250565b61493c81614256565b811461494757600080fd5b50565b61495381614268565b811461495e57600080fd5b50565b61496a81614274565b811461497557600080fd5b50565b6149818161427e565b811461498c57600080fd5b50565b614998816142ca565b81146149a357600080fd5b5056fea2646970667358221220ce19d38505cf859ee60ed9d966760a4bf5c40f74fc98df682a0ac8b52e291b8e64736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000f1d000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000b5072696465456c69786972000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000250450000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5452364e3572656945556b46344e37446b624a745343704d485332516a515333564d734178596a656e44534c2f00000000000000000000

-----Decoded View---------------
Arg [0] : _tokenName (string): PrideElixir
Arg [1] : _tokenSymbol (string): PE
Arg [2] : _publicSupply (uint256): 3000
Arg [3] : _whiteListSupply (uint256): 3869
Arg [4] : _maxMintAmountPerWallet (uint256): 3
Arg [5] : _maxMintAmountPerWhitelist (uint256): 3
Arg [6] : _initialURI (string): ipfs://QmTR6N5reiEUkF4N7DkbJtSCpMHS2QjQS3VMsAxYjenDSL/

-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000bb8
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000f1d
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [7] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [8] : 5072696465456c69786972000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [10] : 5045000000000000000000000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [12] : 697066733a2f2f516d5452364e3572656945556b46344e37446b624a74534370
Arg [13] : 4d485332516a515333564d734178596a656e44534c2f00000000000000000000


Deployed Bytecode Sourcemap

62409:11856:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32166:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37813:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39759:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62809:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39307:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62593:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72705:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31220:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63252:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49024:2800;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71539:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62959:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71742:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73426:836;;;;;;;;;;;;;:::i;:::-;;40649:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69363:709;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71159:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63040:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63075:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62533:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72515:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63161:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62768:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37602:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62740:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32845:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16757:103;;;;;;;;;;;;;:::i;:::-;;72277:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71983:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68981:263;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63103:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16109:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71332:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37982:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67099:1166;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40035:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66407:592;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62853:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40905:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62911:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72868:79;;;;;;;;;;;;;:::i;:::-;;73003:102;;;;;;;;;;;;;:::i;:::-;;70469:395;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70965:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63193:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62633:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40414:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65361:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68408:435;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17015:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32166:615;32251:4;32566:10;32551:25;;:11;:25;;;;:102;;;;32643:10;32628:25;;:11;:25;;;;32551:102;:179;;;;32720:10;32705:25;;:11;:25;;;;32551:179;32531:199;;32166:615;;;:::o;37813:100::-;37867:13;37900:5;37893:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37813:100;:::o;39759:204::-;39827:7;39852:16;39860:7;39852;:16::i;:::-;39847:64;;39877:34;;;;;;;;;;;;;;39847:64;39931:15;:24;39947:7;39931:24;;;;;;;;;;;;;;;;;;;;;39924:31;;39759:204;;;:::o;62809:37::-;;;;:::o;39307:386::-;39380:13;39396:16;39404:7;39396;:16::i;:::-;39380:32;;39452:5;39429:28;;:19;:17;:19::i;:::-;:28;;;39425:175;;39477:44;39494:5;39501:19;:17;:19::i;:::-;39477:16;:44::i;:::-;39472:128;;39549:35;;;;;;;;;;;;;;39472:128;39425:175;39639:2;39612:15;:24;39628:7;39612:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39677:7;39673:2;39657:28;;39666:5;39657:28;;;;;;;;;;;;39369:324;39307:386;;:::o;62593:33::-;;;;:::o;72705:106::-;15995:13;:11;:13::i;:::-;72793:10:::1;72781:9;:22;;;;;;;;;;;;:::i;:::-;;72705:106:::0;:::o;31220:315::-;31273:7;31501:15;:13;:15::i;:::-;31486:12;;31470:13;;:28;:46;31463:53;;31220:315;:::o;63252:55::-;;;;;;;;;;;;;;;;;:::o;49024:2800::-;49158:27;49188;49207:7;49188:18;:27::i;:::-;49158:57;;49273:4;49232:45;;49248:19;49232:45;;;49228:86;;49286:28;;;;;;;;;;;;;;49228:86;49328:27;49357:23;49384:28;49404:7;49384:19;:28::i;:::-;49327:85;;;;49512:62;49531:15;49548:4;49554:19;:17;:19::i;:::-;49512:18;:62::i;:::-;49507:174;;49594:43;49611:4;49617:19;:17;:19::i;:::-;49594:16;:43::i;:::-;49589:92;;49646:35;;;;;;;;;;;;;;49589:92;49507:174;49712:1;49698:16;;:2;:16;;;49694:52;;;49723:23;;;;;;;;;;;;;;49694:52;49759:43;49781:4;49787:2;49791:7;49800:1;49759:21;:43::i;:::-;49895:15;49892:160;;;50035:1;50014:19;50007:30;49892:160;50430:18;:24;50449:4;50430:24;;;;;;;;;;;;;;;;50428:26;;;;;;;;;;;;50499:18;:22;50518:2;50499:22;;;;;;;;;;;;;;;;50497:24;;;;;;;;;;;50821:145;50858:2;50906:45;50921:4;50927:2;50931:19;50906:14;:45::i;:::-;28448:8;50879:72;50821:18;:145::i;:::-;50792:17;:26;50810:7;50792:26;;;;;;;;;;;:174;;;;51136:1;28448:8;51086:19;:46;:51;51082:626;;;51158:19;51190:1;51180:7;:11;51158:33;;51347:1;51313:17;:30;51331:11;51313:30;;;;;;;;;;;;:35;51309:384;;;51451:13;;51436:11;:28;51432:242;;51631:19;51598:17;:30;51616:11;51598:30;;;;;;;;;;;:52;;;;51432:242;51309:384;51139:569;51082:626;51755:7;51751:2;51736:27;;51745:4;51736:27;;;;;;;;;;;;51774:42;51795:4;51801:2;51805:7;51814:1;51774:20;:42::i;:::-;49147:2677;;;49024:2800;;;:::o;71539:100::-;15995:13;:11;:13::i;:::-;71624:7:::1;71609:12;:22;;;;71539:100:::0;:::o;62959:44::-;;;;:::o;71742:106::-;15995:13;:11;:13::i;:::-;71833:7:::1;71815:15;:25;;;;71742:106:::0;:::o;73426:836::-;15995:13;:11;:13::i;:::-;1812:1:::1;2410:7;;:19;;2402:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;73497:15:::2;73515:21;73497:39;;73566:1;73555:7;:12;73547:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;73697:7;73371:42;73710:22;;73754:3;73750:1;73740:7;:11;;;;:::i;:::-;:17;;;;:::i;:::-;73710:52;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73696:66;;;73782:2;73774:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;74055:7;74076;:5;:7::i;:::-;74068:21;;74097:7;74068:41;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74054:55;;;74128:2;74120:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;73476:786;;;1768:1:::1;2722:7;:22;;;;73426:836::o:0;40649:185::-;40787:39;40804:4;40810:2;40814:7;40787:39;;;;;;;;;;;;:16;:39::i;:::-;40649:185;;;:::o;69363:709::-;69438:16;69466:23;69492:17;69502:6;69492:9;:17::i;:::-;69466:43;;69516:30;69563:15;69549:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69516:63;;69586:17;69638:15;;69621:14;;69606:12;;:29;;;;:::i;:::-;:47;;;;:::i;:::-;69586:67;;69660:22;69685:1;69660:26;;69693:23;69729:309;69754:15;69736;:33;:64;;;;;69791:9;69773:14;:27;;69736:64;69729:309;;;69811:25;69839:23;69847:14;69839:7;:23::i;:::-;69811:51;;69898:6;69877:27;;:17;:27;;;69873:131;;;69950:14;69917:13;69931:15;69917:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;69977:17;;;;;:::i;:::-;;;;69873:131;70014:16;;;;;:::i;:::-;;;;69802:236;69729:309;;;70053:13;70046:20;;;;;;;69363:709;;;:::o;71159:80::-;15995:13;:11;:13::i;:::-;71226:5:::1;71219:4;:12;;;;71159:80:::0;:::o;63040:28::-;;;;:::o;63075:21::-;;;;:::o;62533:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;72515:104::-;15995:13;:11;:13::i;:::-;72600:11:::1;72590:7;:21;;;;;;;;;;;;:::i;:::-;;72515:104:::0;:::o;63161:25::-;;;;;;;;;;;;;:::o;62768:34::-;;;;:::o;37602:144::-;37666:7;37709:27;37728:7;37709:18;:27::i;:::-;37686:52;;37602:144;;;:::o;62740:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32845:224::-;32909:7;32950:1;32933:19;;:5;:19;;;32929:60;;;32961:28;;;;;;;;;;;;;;32929:60;27400:13;33007:18;:25;33026:5;33007:25;;;;;;;;;;;;;;;;:54;33000:61;;32845:224;;;:::o;16757:103::-;15995:13;:11;:13::i;:::-;16822:30:::1;16849:1;16822:18;:30::i;:::-;16757:103::o:0;72277:152::-;15995:13;:11;:13::i;:::-;72398:23:::1;72373:22;:48;;;;72277:152:::0;:::o;71983:164::-;15995:13;:11;:13::i;:::-;72113:26:::1;72085:25;:54;;;;71983:164:::0;:::o;68981:263::-;15995:13;:11;:13::i;:::-;69116:14:::1;;69104:8;69088:13;;:24;;;;:::i;:::-;:42;;69080:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;69175:23;69185:2;69189:8;69175:9;:23::i;:::-;69226:8;69209:13;;:25;;;;;;;:::i;:::-;;;;;;;;68981:263:::0;;:::o;63103:30::-;;;;:::o;16109:87::-;16155:7;16182:6;;;;;;;;;;;16175:13;;16109:87;:::o;71332:102::-;15995:13;:11;:13::i;:::-;71419:7:::1;71402:14;:24;;;;71332:102:::0;:::o;37982:104::-;38038:13;38071:7;38064:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37982:104;:::o;67099:1166::-;64294:9;64280:23;;:10;:23;;;64272:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;67208:11:::1;64584:1;64570:11;:15;64562:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;64638:16;;;;;;;;;;;64635:293;;;64724:25;;64709:11;64674:20;:32;64695:10;64674:32;;;;;;;;;;;;;;;;:46;;;;:::i;:::-;:75;;64666:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;64862:15;;64847:11;64829:15;;:29;;;;:::i;:::-;:48;;64820:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;64635:293;64998:22;;64983:11;64948:20;:32;64969:10;64948:32;;;;;;;;;;;;;;;;:46;;;;:::i;:::-;:72;;64940:135;;;;;;;;;;;;:::i;:::-;;;;;;;;;65120:12;;65105:11;65096:6;;:20;;;;:::i;:::-;:36;;65087:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;67246:6:::2;;;;;;;;;;;67245:7;67237:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;67300:16;;;;;;;;;;;67299:17;67291:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;67416:9;67446:15;;67428;;:33;;;;:::i;:::-;67416:45;;67498:1;67480:15;;:19;67477:668;;;67579:11;67572:4;;:18;;;;:::i;:::-;67559:9;:31;;67551:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;67641:11;67632:6;;:20;;;;;;;:::i;:::-;;;;;;;;67477:668;;;67728:15;;67714:11;67696:15;;:29;;;;:::i;:::-;:47;67693:435;;;67766:9;67792:1;67778:11;:15;;;;:::i;:::-;67766:27;;67883:1;67876:4;;:8;;;;:::i;:::-;67863:9;:21;;67855:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;67962:1;67952:6;;:11;;;;;;;:::i;:::-;;;;;;;;68006:1;67987:15;;:20;;;;;;;:::i;:::-;;;;;;;;67744:305;67693:435;;;68097:11;68078:15;;:30;;;;;;;:::i;:::-;;;;;;;;67693:435;67477:668;68155:34;68165:10;68177:11;68155:9;:34::i;:::-;68236:11;68200:20;:32;68221:10;68200:32;;;;;;;;;;;;;;;;:47;;;;;;;:::i;:::-;;;;;;;;67226:1039;64337:1:::1;67099:1166:::0;:::o;40035:308::-;40146:19;:17;:19::i;:::-;40134:31;;:8;:31;;;40130:61;;;40174:17;;;;;;;;;;;;;;40130:61;40256:8;40204:18;:39;40223:19;:17;:19::i;:::-;40204:39;;;;;;;;;;;;;;;:49;40244:8;40204:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;40316:8;40280:55;;40295:19;:17;:19::i;:::-;40280:55;;;40326:8;40280:55;;;;;;:::i;:::-;;;;;;;;40035:308;;:::o;66407:592::-;64294:9;64280:23;;:10;:23;;;64272:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;66557:11:::1;64584:1;64570:11;:15;64562:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;64638:16;;;;;;;;;;;64635:293;;;64724:25;;64709:11;64674:20;:32;64695:10;64674:32;;;;;;;;;;;;;;;;:46;;;;:::i;:::-;:75;;64666:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;64862:15;;64847:11;64829:15;;:29;;;;:::i;:::-;:48;;64820:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;64635:293;64998:22;;64983:11;64948:20;:32;64969:10;64948:32;;;;;;;;;;;;;;;;:46;;;;:::i;:::-;:72;;64940:135;;;;;;;;;;;;:::i;:::-;;;;;;;;;65120:12;;65105:11;65096:6;;:20;;;;:::i;:::-;:36;;65087:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;66596:6:::2;;;;;;;;;;;66595:7;66587:16;;;::::0;::::2;;66623;;;;;;;;;;;66615:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;66695:33;66703:17;66709:10;66703:5;:17::i;:::-;66722:5;;66695:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;:33::i;:::-;66687:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;66803:11;66787:13;;:27;;;;:::i;:::-;66774:9;:40;;66766:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;66855:34;66865:10;66877:11;66855:9;:34::i;:::-;66920:11;66901:15;;:30;;;;;;;:::i;:::-;;;;;;;;66979:11;66943:20;:32;66964:10;66943:32;;;;;;;;;;;;;;;;:47;;;;;;;:::i;:::-;;;;;;;;64337:1:::1;66407:592:::0;;;:::o;62853:35::-;;;;:::o;40905:399::-;41072:31;41085:4;41091:2;41095:7;41072:12;:31::i;:::-;41136:1;41118:2;:14;;;:19;41114:183;;41157:56;41188:4;41194:2;41198:7;41207:5;41157:30;:56::i;:::-;41152:145;;41241:40;;;;;;;;;;;;;;41152:145;41114:183;40905:399;;;;:::o;62911:41::-;;;;:::o;72868:79::-;15995:13;:11;:13::i;:::-;72933:6:::1;;;;;;;;;;;72932:7;72923:6;;:16;;;;;;;;;;;;;;;;;;72868:79::o:0;73003:102::-;15995:13;:11;:13::i;:::-;73081:16:::1;;;;;;;;;;;73080:17;73061:16;;:36;;;;;;;;;;;;;;;;;;73003:102::o:0;70469:395::-;70543:13;70577:17;70585:8;70577:7;:17::i;:::-;70569:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;70659:28;70690:10;:8;:10::i;:::-;70659:41;;70749:1;70724:14;70718:28;:32;:138;;;;;;;;;;;;;;;;;70790:14;70806:19;:8;:17;:19::i;:::-;70827:9;70773:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70718:138;70711:145;;;70469:395;;;:::o;70965:98::-;15995:13;:11;:13::i;:::-;71050:5:::1;71034:13;:21;;;;70965:98:::0;:::o;63193:35::-;;;;;;;;;;;;;:::o;62633:41::-;;;;:::o;40414:164::-;40511:4;40535:18;:25;40554:5;40535:25;;;;;;;;;;;;;;;:35;40561:8;40535:35;;;;;;;;;;;;;;;;;;;;;;;;;40528:42;;40414:164;;;;:::o;65361:105::-;15995:13;:11;:13::i;:::-;65453:5:::1;65437:13;:21;;;;65361:105:::0;:::o;68408:435::-;15995:13;:11;:13::i;:::-;68540:1:::1;68526:11;:15;68518:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;68593:17;68645:15;;68628:14;;68613:12;;:29;;;;:::i;:::-;:47;;;;:::i;:::-;68593:67;;68711:9;68696:11;68680:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;68671:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;68764:33;68774:9;68785:11;68764:9;:33::i;:::-;68818:11;68808:6;;:21;;;;;;;:::i;:::-;;;;;;;;68507:336;68408:435:::0;;:::o;17015:201::-;15995:13;:11;:13::i;:::-;17124:1:::1;17104:22;;:8;:22;;;;17096:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;17180:28;17199:8;17180:18;:28::i;:::-;17015:201:::0;:::o;41559:273::-;41616:4;41672:7;41653:15;:13;:15::i;:::-;:26;;:66;;;;;41706:13;;41696:7;:23;41653:66;:152;;;;;41804:1;28170:8;41757:17;:26;41775:7;41757:26;;;;;;;;;;;;:43;:48;41653:152;41633:172;;41559:273;;;:::o;60120:105::-;60180:7;60207:10;60200:17;;60120:105;:::o;16274:132::-;16349:12;:10;:12::i;:::-;16338:23;;:7;:5;:7::i;:::-;:23;;;16330:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16274:132::o;70138:101::-;70203:7;70230:1;70223:8;;70138:101;:::o;34519:1129::-;34586:7;34606:12;34621:7;34606:22;;34689:4;34670:15;:13;:15::i;:::-;:23;34666:915;;34723:13;;34716:4;:20;34712:869;;;34761:14;34778:17;:23;34796:4;34778:23;;;;;;;;;;;;34761:40;;34894:1;28170:8;34867:6;:23;:28;34863:699;;;35386:113;35403:1;35393:6;:11;35386:113;;;35446:17;:25;35464:6;;;;;;;35446:25;;;;;;;;;;;;35437:34;;35386:113;;;35532:6;35525:13;;;;;;34863:699;34738:843;34712:869;34666:915;35609:31;;;;;;;;;;;;;;34519:1129;;;;:::o;47360:652::-;47455:27;47484:23;47525:53;47581:15;47525:71;;47767:7;47761:4;47754:21;47802:22;47796:4;47789:36;47878:4;47872;47862:21;47839:44;;47974:19;47968:26;47949:45;;47705:300;47360:652;;;:::o;48125:645::-;48267:11;48429:15;48423:4;48419:26;48411:34;;48588:15;48577:9;48573:31;48560:44;;48735:15;48724:9;48721:30;48714:4;48703:9;48700:19;48697:55;48687:65;;48125:645;;;;;:::o;58953:159::-;;;;;:::o;57265:309::-;57400:7;57420:16;28571:3;57446:19;:40;;57420:67;;28571:3;57513:31;57524:4;57530:2;57534:9;57513:10;:31::i;:::-;57505:40;;:61;;57498:68;;;57265:309;;;;;:::o;37093:447::-;37173:14;37341:15;37334:5;37330:27;37321:36;;37515:5;37501:11;37477:22;37473:40;37470:51;37463:5;37460:62;37450:72;;37093:447;;;;:::o;59771:158::-;;;;;:::o;17376:191::-;17450:16;17469:6;;;;;;;;;;;17450:25;;17495:8;17486:6;;:17;;;;;;;;;;;;;;;;;;17550:8;17519:40;;17540:8;17519:40;;;;;;;;;;;;17439:128;17376:191;:::o;73203:124::-;73286:33;73296:9;73307:11;73286:9;:33::i;:::-;73203:124;;:::o;66002:126::-;66057:7;66111;66094:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;66084:36;;;;;;66077:43;;66002:126;;;:::o;65675:186::-;65773:4;65802:51;65821:5;65828:13;;65843:9;65802:18;:51::i;:::-;65795:58;;65675:186;;;;:::o;55775:716::-;55938:4;55984:2;55959:45;;;56005:19;:17;:19::i;:::-;56026:4;56032:7;56041:5;55959:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;55955:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56259:1;56242:6;:13;:18;56238:235;;;56288:40;;;;;;;;;;;;;;56238:235;56431:6;56425:13;56416:6;56412:2;56408:15;56401:38;55955:529;56128:54;;;56118:64;;;:6;:64;;;;56111:71;;;55775:716;;;;;;:::o;70290:108::-;70350:13;70383:7;70376:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70290:108;:::o;3189:723::-;3245:13;3475:1;3466:5;:10;3462:53;;;3493:10;;;;;;;;;;;;;;;;;;;;;3462:53;3525:12;3540:5;3525:20;;3556:14;3581:78;3596:1;3588:4;:9;3581:78;;3614:8;;;;;:::i;:::-;;;;3645:2;3637:10;;;;;:::i;:::-;;;3581:78;;;3669:19;3701:6;3691:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3669:39;;3719:154;3735:1;3726:5;:10;3719:154;;3763:1;3753:11;;;;;:::i;:::-;;;3830:2;3822:5;:10;;;;:::i;:::-;3809:2;:24;;;;:::i;:::-;3796:39;;3779:6;3786;3779:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3859:2;3850:11;;;;;:::i;:::-;;;3719:154;;;3897:6;3883:21;;;;;3189:723;;;;:::o;14660:98::-;14713:7;14740:10;14733:17;;14660:98;:::o;58150:147::-;58287:6;58150:147;;;;;:::o;41916:104::-;41985:27;41995:2;41999:8;41985:27;;;;;;;;;;;;:9;:27::i;:::-;41916:104;;:::o;6475:190::-;6600:4;6653;6624:25;6637:5;6644:4;6624:12;:25::i;:::-;:33;6617:40;;6475:190;;;;;:::o;42436:681::-;42559:19;42565:2;42569:8;42559:5;:19::i;:::-;42638:1;42620:2;:14;;;:19;42616:483;;42660:11;42674:13;;42660:27;;42706:13;42728:8;42722:3;:14;42706:30;;42755:233;42786:62;42825:1;42829:2;42833:7;;;;;;42842:5;42786:30;:62::i;:::-;42781:167;;42884:40;;;;;;;;;;;;;;42781:167;42983:3;42975:5;:11;42755:233;;43070:3;43053:13;;:20;43049:34;;43075:8;;;43049:34;42641:458;;42616:483;42436:681;;;:::o;7342:296::-;7425:7;7445:20;7468:4;7445:27;;7488:9;7483:118;7507:5;:12;7503:1;:16;7483:118;;;7556:33;7566:12;7580:5;7586:1;7580:8;;;;;;;;:::i;:::-;;;;;;;;7556:9;:33::i;:::-;7541:48;;7521:3;;;;;:::i;:::-;;;;7483:118;;;;7618:12;7611:19;;;7342:296;;;;:::o;43390:1529::-;43455:20;43478:13;;43455:36;;43520:1;43506:16;;:2;:16;;;43502:48;;;43531:19;;;;;;;;;;;;;;43502:48;43577:1;43565:8;:13;43561:44;;;43587:18;;;;;;;;;;;;;;43561:44;43618:61;43648:1;43652:2;43656:12;43670:8;43618:21;:61::i;:::-;44161:1;27537:2;44132:1;:25;;44131:31;44119:8;:44;44093:18;:22;44112:2;44093:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;44440:139;44477:2;44531:33;44554:1;44558:2;44562:1;44531:14;:33::i;:::-;44498:30;44519:8;44498:20;:30::i;:::-;:66;44440:18;:139::i;:::-;44406:17;:31;44424:12;44406:31;;;;;;;;;;;:173;;;;44596:15;44614:12;44596:30;;44641:11;44670:8;44655:12;:23;44641:37;;44693:101;44745:9;;;;;;44741:2;44720:35;;44737:1;44720:35;;;;;;;;;;;;44789:3;44779:7;:13;44693:101;;44826:3;44810:13;:19;;;;43867:974;;44851:60;44880:1;44884:2;44888:12;44902:8;44851:20;:60::i;:::-;43444:1475;43390:1529;;:::o;13549:149::-;13612:7;13643:1;13639;:5;:51;;13670:20;13685:1;13688;13670:14;:20::i;:::-;13639:51;;;13647:20;13662:1;13665;13647:14;:20::i;:::-;13639:51;13632:58;;13549:149;;;;:::o;38923:322::-;38993:14;39224:1;39214:8;39211:15;39186:23;39182:45;39172:55;;38923:322;;;:::o;13706:268::-;13774:13;13881:1;13875:4;13868:15;13910:1;13904:4;13897:15;13951:4;13945;13935:21;13926:30;;13706:268;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:139::-;1762:5;1800:6;1787:20;1778:29;;1816:33;1843:5;1816:33;:::i;:::-;1716:139;;;;:::o;1861:137::-;1906:5;1944:6;1931:20;1922:29;;1960:32;1986:5;1960:32;:::i;:::-;1861:137;;;;:::o;2004:141::-;2060:5;2091:6;2085:13;2076:22;;2107:32;2133:5;2107:32;:::i;:::-;2004:141;;;;:::o;2164:338::-;2219:5;2268:3;2261:4;2253:6;2249:17;2245:27;2235:122;;2276:79;;:::i;:::-;2235:122;2393:6;2380:20;2418:78;2492:3;2484:6;2477:4;2469:6;2465:17;2418:78;:::i;:::-;2409:87;;2225:277;2164:338;;;;:::o;2522:340::-;2578:5;2627:3;2620:4;2612:6;2608:17;2604:27;2594:122;;2635:79;;:::i;:::-;2594:122;2752:6;2739:20;2777:79;2852:3;2844:6;2837:4;2829:6;2825:17;2777:79;:::i;:::-;2768:88;;2584:278;2522:340;;;;:::o;2868:139::-;2914:5;2952:6;2939:20;2930:29;;2968:33;2995:5;2968:33;:::i;:::-;2868:139;;;;:::o;3013:329::-;3072:6;3121:2;3109:9;3100:7;3096:23;3092:32;3089:119;;;3127:79;;:::i;:::-;3089:119;3247:1;3272:53;3317:7;3308:6;3297:9;3293:22;3272:53;:::i;:::-;3262:63;;3218:117;3013:329;;;;:::o;3348:474::-;3416:6;3424;3473:2;3461:9;3452:7;3448:23;3444:32;3441:119;;;3479:79;;:::i;:::-;3441:119;3599:1;3624:53;3669:7;3660:6;3649:9;3645:22;3624:53;:::i;:::-;3614:63;;3570:117;3726:2;3752:53;3797:7;3788:6;3777:9;3773:22;3752:53;:::i;:::-;3742:63;;3697:118;3348:474;;;;;:::o;3828:619::-;3905:6;3913;3921;3970:2;3958:9;3949:7;3945:23;3941:32;3938:119;;;3976:79;;:::i;:::-;3938:119;4096:1;4121:53;4166:7;4157:6;4146:9;4142:22;4121:53;:::i;:::-;4111:63;;4067:117;4223:2;4249:53;4294:7;4285:6;4274:9;4270:22;4249:53;:::i;:::-;4239:63;;4194:118;4351:2;4377:53;4422:7;4413:6;4402:9;4398:22;4377:53;:::i;:::-;4367:63;;4322:118;3828:619;;;;;:::o;4453:943::-;4548:6;4556;4564;4572;4621:3;4609:9;4600:7;4596:23;4592:33;4589:120;;;4628:79;;:::i;:::-;4589:120;4748:1;4773:53;4818:7;4809:6;4798:9;4794:22;4773:53;:::i;:::-;4763:63;;4719:117;4875:2;4901:53;4946:7;4937:6;4926:9;4922:22;4901:53;:::i;:::-;4891:63;;4846:118;5003:2;5029:53;5074:7;5065:6;5054:9;5050:22;5029:53;:::i;:::-;5019:63;;4974:118;5159:2;5148:9;5144:18;5131:32;5190:18;5182:6;5179:30;5176:117;;;5212:79;;:::i;:::-;5176:117;5317:62;5371:7;5362:6;5351:9;5347:22;5317:62;:::i;:::-;5307:72;;5102:287;4453:943;;;;;;;:::o;5402:468::-;5467:6;5475;5524:2;5512:9;5503:7;5499:23;5495:32;5492:119;;;5530:79;;:::i;:::-;5492:119;5650:1;5675:53;5720:7;5711:6;5700:9;5696:22;5675:53;:::i;:::-;5665:63;;5621:117;5777:2;5803:50;5845:7;5836:6;5825:9;5821:22;5803:50;:::i;:::-;5793:60;;5748:115;5402:468;;;;;:::o;5876:474::-;5944:6;5952;6001:2;5989:9;5980:7;5976:23;5972:32;5969:119;;;6007:79;;:::i;:::-;5969:119;6127:1;6152:53;6197:7;6188:6;6177:9;6173:22;6152:53;:::i;:::-;6142:63;;6098:117;6254:2;6280:53;6325:7;6316:6;6305:9;6301:22;6280:53;:::i;:::-;6270:63;;6225:118;5876:474;;;;;:::o;6356:704::-;6451:6;6459;6467;6516:2;6504:9;6495:7;6491:23;6487:32;6484:119;;;6522:79;;:::i;:::-;6484:119;6670:1;6659:9;6655:17;6642:31;6700:18;6692:6;6689:30;6686:117;;;6722:79;;:::i;:::-;6686:117;6835:80;6907:7;6898:6;6887:9;6883:22;6835:80;:::i;:::-;6817:98;;;;6613:312;6964:2;6990:53;7035:7;7026:6;7015:9;7011:22;6990:53;:::i;:::-;6980:63;;6935:118;6356:704;;;;;:::o;7066:329::-;7125:6;7174:2;7162:9;7153:7;7149:23;7145:32;7142:119;;;7180:79;;:::i;:::-;7142:119;7300:1;7325:53;7370:7;7361:6;7350:9;7346:22;7325:53;:::i;:::-;7315:63;;7271:117;7066:329;;;;:::o;7401:327::-;7459:6;7508:2;7496:9;7487:7;7483:23;7479:32;7476:119;;;7514:79;;:::i;:::-;7476:119;7634:1;7659:52;7703:7;7694:6;7683:9;7679:22;7659:52;:::i;:::-;7649:62;;7605:116;7401:327;;;;:::o;7734:349::-;7803:6;7852:2;7840:9;7831:7;7827:23;7823:32;7820:119;;;7858:79;;:::i;:::-;7820:119;7978:1;8003:63;8058:7;8049:6;8038:9;8034:22;8003:63;:::i;:::-;7993:73;;7949:127;7734:349;;;;:::o;8089:509::-;8158:6;8207:2;8195:9;8186:7;8182:23;8178:32;8175:119;;;8213:79;;:::i;:::-;8175:119;8361:1;8350:9;8346:17;8333:31;8391:18;8383:6;8380:30;8377:117;;;8413:79;;:::i;:::-;8377:117;8518:63;8573:7;8564:6;8553:9;8549:22;8518:63;:::i;:::-;8508:73;;8304:287;8089:509;;;;:::o;8604:329::-;8663:6;8712:2;8700:9;8691:7;8687:23;8683:32;8680:119;;;8718:79;;:::i;:::-;8680:119;8838:1;8863:53;8908:7;8899:6;8888:9;8884:22;8863:53;:::i;:::-;8853:63;;8809:117;8604:329;;;;:::o;8939:474::-;9007:6;9015;9064:2;9052:9;9043:7;9039:23;9035:32;9032:119;;;9070:79;;:::i;:::-;9032:119;9190:1;9215:53;9260:7;9251:6;9240:9;9236:22;9215:53;:::i;:::-;9205:63;;9161:117;9317:2;9343:53;9388:7;9379:6;9368:9;9364:22;9343:53;:::i;:::-;9333:63;;9288:118;8939:474;;;;;:::o;9419:179::-;9488:10;9509:46;9551:3;9543:6;9509:46;:::i;:::-;9587:4;9582:3;9578:14;9564:28;;9419:179;;;;:::o;9604:118::-;9691:24;9709:5;9691:24;:::i;:::-;9686:3;9679:37;9604:118;;:::o;9728:157::-;9833:45;9853:24;9871:5;9853:24;:::i;:::-;9833:45;:::i;:::-;9828:3;9821:58;9728:157;;:::o;9921:732::-;10040:3;10069:54;10117:5;10069:54;:::i;:::-;10139:86;10218:6;10213:3;10139:86;:::i;:::-;10132:93;;10249:56;10299:5;10249:56;:::i;:::-;10328:7;10359:1;10344:284;10369:6;10366:1;10363:13;10344:284;;;10445:6;10439:13;10472:63;10531:3;10516:13;10472:63;:::i;:::-;10465:70;;10558:60;10611:6;10558:60;:::i;:::-;10548:70;;10404:224;10391:1;10388;10384:9;10379:14;;10344:284;;;10348:14;10644:3;10637:10;;10045:608;;;9921:732;;;;:::o;10659:109::-;10740:21;10755:5;10740:21;:::i;:::-;10735:3;10728:34;10659:109;;:::o;10774:360::-;10860:3;10888:38;10920:5;10888:38;:::i;:::-;10942:70;11005:6;11000:3;10942:70;:::i;:::-;10935:77;;11021:52;11066:6;11061:3;11054:4;11047:5;11043:16;11021:52;:::i;:::-;11098:29;11120:6;11098:29;:::i;:::-;11093:3;11089:39;11082:46;;10864:270;10774:360;;;;:::o;11140:364::-;11228:3;11256:39;11289:5;11256:39;:::i;:::-;11311:71;11375:6;11370:3;11311:71;:::i;:::-;11304:78;;11391:52;11436:6;11431:3;11424:4;11417:5;11413:16;11391:52;:::i;:::-;11468:29;11490:6;11468:29;:::i;:::-;11463:3;11459:39;11452:46;;11232:272;11140:364;;;;:::o;11510:377::-;11616:3;11644:39;11677:5;11644:39;:::i;:::-;11699:89;11781:6;11776:3;11699:89;:::i;:::-;11692:96;;11797:52;11842:6;11837:3;11830:4;11823:5;11819:16;11797:52;:::i;:::-;11874:6;11869:3;11865:16;11858:23;;11620:267;11510:377;;;;:::o;11917:845::-;12020:3;12057:5;12051:12;12086:36;12112:9;12086:36;:::i;:::-;12138:89;12220:6;12215:3;12138:89;:::i;:::-;12131:96;;12258:1;12247:9;12243:17;12274:1;12269:137;;;;12420:1;12415:341;;;;12236:520;;12269:137;12353:4;12349:9;12338;12334:25;12329:3;12322:38;12389:6;12384:3;12380:16;12373:23;;12269:137;;12415:341;12482:38;12514:5;12482:38;:::i;:::-;12542:1;12556:154;12570:6;12567:1;12564:13;12556:154;;;12644:7;12638:14;12634:1;12629:3;12625:11;12618:35;12694:1;12685:7;12681:15;12670:26;;12592:4;12589:1;12585:12;12580:17;;12556:154;;;12739:6;12734:3;12730:16;12723:23;;12422:334;;12236:520;;12024:738;;11917:845;;;;:::o;12768:366::-;12910:3;12931:67;12995:2;12990:3;12931:67;:::i;:::-;12924:74;;13007:93;13096:3;13007:93;:::i;:::-;13125:2;13120:3;13116:12;13109:19;;12768:366;;;:::o;13140:::-;13282:3;13303:67;13367:2;13362:3;13303:67;:::i;:::-;13296:74;;13379:93;13468:3;13379:93;:::i;:::-;13497:2;13492:3;13488:12;13481:19;;13140:366;;;:::o;13512:::-;13654:3;13675:67;13739:2;13734:3;13675:67;:::i;:::-;13668:74;;13751:93;13840:3;13751:93;:::i;:::-;13869:2;13864:3;13860:12;13853:19;;13512:366;;;:::o;13884:::-;14026:3;14047:67;14111:2;14106:3;14047:67;:::i;:::-;14040:74;;14123:93;14212:3;14123:93;:::i;:::-;14241:2;14236:3;14232:12;14225:19;;13884:366;;;:::o;14256:::-;14398:3;14419:67;14483:2;14478:3;14419:67;:::i;:::-;14412:74;;14495:93;14584:3;14495:93;:::i;:::-;14613:2;14608:3;14604:12;14597:19;;14256:366;;;:::o;14628:::-;14770:3;14791:67;14855:2;14850:3;14791:67;:::i;:::-;14784:74;;14867:93;14956:3;14867:93;:::i;:::-;14985:2;14980:3;14976:12;14969:19;;14628:366;;;:::o;15000:::-;15142:3;15163:67;15227:2;15222:3;15163:67;:::i;:::-;15156:74;;15239:93;15328:3;15239:93;:::i;:::-;15357:2;15352:3;15348:12;15341:19;;15000:366;;;:::o;15372:::-;15514:3;15535:67;15599:2;15594:3;15535:67;:::i;:::-;15528:74;;15611:93;15700:3;15611:93;:::i;:::-;15729:2;15724:3;15720:12;15713:19;;15372:366;;;:::o;15744:::-;15886:3;15907:67;15971:2;15966:3;15907:67;:::i;:::-;15900:74;;15983:93;16072:3;15983:93;:::i;:::-;16101:2;16096:3;16092:12;16085:19;;15744:366;;;:::o;16116:::-;16258:3;16279:67;16343:2;16338:3;16279:67;:::i;:::-;16272:74;;16355:93;16444:3;16355:93;:::i;:::-;16473:2;16468:3;16464:12;16457:19;;16116:366;;;:::o;16488:::-;16630:3;16651:67;16715:2;16710:3;16651:67;:::i;:::-;16644:74;;16727:93;16816:3;16727:93;:::i;:::-;16845:2;16840:3;16836:12;16829:19;;16488:366;;;:::o;16860:398::-;17019:3;17040:83;17121:1;17116:3;17040:83;:::i;:::-;17033:90;;17132:93;17221:3;17132:93;:::i;:::-;17250:1;17245:3;17241:11;17234:18;;16860:398;;;:::o;17264:366::-;17406:3;17427:67;17491:2;17486:3;17427:67;:::i;:::-;17420:74;;17503:93;17592:3;17503:93;:::i;:::-;17621:2;17616:3;17612:12;17605:19;;17264:366;;;:::o;17636:::-;17778:3;17799:67;17863:2;17858:3;17799:67;:::i;:::-;17792:74;;17875:93;17964:3;17875:93;:::i;:::-;17993:2;17988:3;17984:12;17977:19;;17636:366;;;:::o;18008:::-;18150:3;18171:67;18235:2;18230:3;18171:67;:::i;:::-;18164:74;;18247:93;18336:3;18247:93;:::i;:::-;18365:2;18360:3;18356:12;18349:19;;18008:366;;;:::o;18380:::-;18522:3;18543:67;18607:2;18602:3;18543:67;:::i;:::-;18536:74;;18619:93;18708:3;18619:93;:::i;:::-;18737:2;18732:3;18728:12;18721:19;;18380:366;;;:::o;18752:::-;18894:3;18915:67;18979:2;18974:3;18915:67;:::i;:::-;18908:74;;18991:93;19080:3;18991:93;:::i;:::-;19109:2;19104:3;19100:12;19093:19;;18752:366;;;:::o;19124:::-;19266:3;19287:67;19351:2;19346:3;19287:67;:::i;:::-;19280:74;;19363:93;19452:3;19363:93;:::i;:::-;19481:2;19476:3;19472:12;19465:19;;19124:366;;;:::o;19496:::-;19638:3;19659:67;19723:2;19718:3;19659:67;:::i;:::-;19652:74;;19735:93;19824:3;19735:93;:::i;:::-;19853:2;19848:3;19844:12;19837:19;;19496:366;;;:::o;19868:::-;20010:3;20031:67;20095:2;20090:3;20031:67;:::i;:::-;20024:74;;20107:93;20196:3;20107:93;:::i;:::-;20225:2;20220:3;20216:12;20209:19;;19868:366;;;:::o;20240:::-;20382:3;20403:67;20467:2;20462:3;20403:67;:::i;:::-;20396:74;;20479:93;20568:3;20479:93;:::i;:::-;20597:2;20592:3;20588:12;20581:19;;20240:366;;;:::o;20612:108::-;20689:24;20707:5;20689:24;:::i;:::-;20684:3;20677:37;20612:108;;:::o;20726:118::-;20813:24;20831:5;20813:24;:::i;:::-;20808:3;20801:37;20726:118;;:::o;20850:256::-;20962:3;20977:75;21048:3;21039:6;20977:75;:::i;:::-;21077:2;21072:3;21068:12;21061:19;;21097:3;21090:10;;20850:256;;;;:::o;21112:589::-;21337:3;21359:95;21450:3;21441:6;21359:95;:::i;:::-;21352:102;;21471:95;21562:3;21553:6;21471:95;:::i;:::-;21464:102;;21583:92;21671:3;21662:6;21583:92;:::i;:::-;21576:99;;21692:3;21685:10;;21112:589;;;;;;:::o;21707:379::-;21891:3;21913:147;22056:3;21913:147;:::i;:::-;21906:154;;22077:3;22070:10;;21707:379;;;:::o;22092:222::-;22185:4;22223:2;22212:9;22208:18;22200:26;;22236:71;22304:1;22293:9;22289:17;22280:6;22236:71;:::i;:::-;22092:222;;;;:::o;22320:640::-;22515:4;22553:3;22542:9;22538:19;22530:27;;22567:71;22635:1;22624:9;22620:17;22611:6;22567:71;:::i;:::-;22648:72;22716:2;22705:9;22701:18;22692:6;22648:72;:::i;:::-;22730;22798:2;22787:9;22783:18;22774:6;22730:72;:::i;:::-;22849:9;22843:4;22839:20;22834:2;22823:9;22819:18;22812:48;22877:76;22948:4;22939:6;22877:76;:::i;:::-;22869:84;;22320:640;;;;;;;:::o;22966:373::-;23109:4;23147:2;23136:9;23132:18;23124:26;;23196:9;23190:4;23186:20;23182:1;23171:9;23167:17;23160:47;23224:108;23327:4;23318:6;23224:108;:::i;:::-;23216:116;;22966:373;;;;:::o;23345:210::-;23432:4;23470:2;23459:9;23455:18;23447:26;;23483:65;23545:1;23534:9;23530:17;23521:6;23483:65;:::i;:::-;23345:210;;;;:::o;23561:313::-;23674:4;23712:2;23701:9;23697:18;23689:26;;23761:9;23755:4;23751:20;23747:1;23736:9;23732:17;23725:47;23789:78;23862:4;23853:6;23789:78;:::i;:::-;23781:86;;23561:313;;;;:::o;23880:419::-;24046:4;24084:2;24073:9;24069:18;24061:26;;24133:9;24127:4;24123:20;24119:1;24108:9;24104:17;24097:47;24161:131;24287:4;24161:131;:::i;:::-;24153:139;;23880:419;;;:::o;24305:::-;24471:4;24509:2;24498:9;24494:18;24486:26;;24558:9;24552:4;24548:20;24544:1;24533:9;24529:17;24522:47;24586:131;24712:4;24586:131;:::i;:::-;24578:139;;24305:419;;;:::o;24730:::-;24896:4;24934:2;24923:9;24919:18;24911:26;;24983:9;24977:4;24973:20;24969:1;24958:9;24954:17;24947:47;25011:131;25137:4;25011:131;:::i;:::-;25003:139;;24730:419;;;:::o;25155:::-;25321:4;25359:2;25348:9;25344:18;25336:26;;25408:9;25402:4;25398:20;25394:1;25383:9;25379:17;25372:47;25436:131;25562:4;25436:131;:::i;:::-;25428:139;;25155:419;;;:::o;25580:::-;25746:4;25784:2;25773:9;25769:18;25761:26;;25833:9;25827:4;25823:20;25819:1;25808:9;25804:17;25797:47;25861:131;25987:4;25861:131;:::i;:::-;25853:139;;25580:419;;;:::o;26005:::-;26171:4;26209:2;26198:9;26194:18;26186:26;;26258:9;26252:4;26248:20;26244:1;26233:9;26229:17;26222:47;26286:131;26412:4;26286:131;:::i;:::-;26278:139;;26005:419;;;:::o;26430:::-;26596:4;26634:2;26623:9;26619:18;26611:26;;26683:9;26677:4;26673:20;26669:1;26658:9;26654:17;26647:47;26711:131;26837:4;26711:131;:::i;:::-;26703:139;;26430:419;;;:::o;26855:::-;27021:4;27059:2;27048:9;27044:18;27036:26;;27108:9;27102:4;27098:20;27094:1;27083:9;27079:17;27072:47;27136:131;27262:4;27136:131;:::i;:::-;27128:139;;26855:419;;;:::o;27280:::-;27446:4;27484:2;27473:9;27469:18;27461:26;;27533:9;27527:4;27523:20;27519:1;27508:9;27504:17;27497:47;27561:131;27687:4;27561:131;:::i;:::-;27553:139;;27280:419;;;:::o;27705:::-;27871:4;27909:2;27898:9;27894:18;27886:26;;27958:9;27952:4;27948:20;27944:1;27933:9;27929:17;27922:47;27986:131;28112:4;27986:131;:::i;:::-;27978:139;;27705:419;;;:::o;28130:::-;28296:4;28334:2;28323:9;28319:18;28311:26;;28383:9;28377:4;28373:20;28369:1;28358:9;28354:17;28347:47;28411:131;28537:4;28411:131;:::i;:::-;28403:139;;28130:419;;;:::o;28555:::-;28721:4;28759:2;28748:9;28744:18;28736:26;;28808:9;28802:4;28798:20;28794:1;28783:9;28779:17;28772:47;28836:131;28962:4;28836:131;:::i;:::-;28828:139;;28555:419;;;:::o;28980:::-;29146:4;29184:2;29173:9;29169:18;29161:26;;29233:9;29227:4;29223:20;29219:1;29208:9;29204:17;29197:47;29261:131;29387:4;29261:131;:::i;:::-;29253:139;;28980:419;;;:::o;29405:::-;29571:4;29609:2;29598:9;29594:18;29586:26;;29658:9;29652:4;29648:20;29644:1;29633:9;29629:17;29622:47;29686:131;29812:4;29686:131;:::i;:::-;29678:139;;29405:419;;;:::o;29830:::-;29996:4;30034:2;30023:9;30019:18;30011:26;;30083:9;30077:4;30073:20;30069:1;30058:9;30054:17;30047:47;30111:131;30237:4;30111:131;:::i;:::-;30103:139;;29830:419;;;:::o;30255:::-;30421:4;30459:2;30448:9;30444:18;30436:26;;30508:9;30502:4;30498:20;30494:1;30483:9;30479:17;30472:47;30536:131;30662:4;30536:131;:::i;:::-;30528:139;;30255:419;;;:::o;30680:::-;30846:4;30884:2;30873:9;30869:18;30861:26;;30933:9;30927:4;30923:20;30919:1;30908:9;30904:17;30897:47;30961:131;31087:4;30961:131;:::i;:::-;30953:139;;30680:419;;;:::o;31105:::-;31271:4;31309:2;31298:9;31294:18;31286:26;;31358:9;31352:4;31348:20;31344:1;31333:9;31329:17;31322:47;31386:131;31512:4;31386:131;:::i;:::-;31378:139;;31105:419;;;:::o;31530:::-;31696:4;31734:2;31723:9;31719:18;31711:26;;31783:9;31777:4;31773:20;31769:1;31758:9;31754:17;31747:47;31811:131;31937:4;31811:131;:::i;:::-;31803:139;;31530:419;;;:::o;31955:::-;32121:4;32159:2;32148:9;32144:18;32136:26;;32208:9;32202:4;32198:20;32194:1;32183:9;32179:17;32172:47;32236:131;32362:4;32236:131;:::i;:::-;32228:139;;31955:419;;;:::o;32380:222::-;32473:4;32511:2;32500:9;32496:18;32488:26;;32524:71;32592:1;32581:9;32577:17;32568:6;32524:71;:::i;:::-;32380:222;;;;:::o;32608:129::-;32642:6;32669:20;;:::i;:::-;32659:30;;32698:33;32726:4;32718:6;32698:33;:::i;:::-;32608:129;;;:::o;32743:75::-;32776:6;32809:2;32803:9;32793:19;;32743:75;:::o;32824:307::-;32885:4;32975:18;32967:6;32964:30;32961:56;;;32997:18;;:::i;:::-;32961:56;33035:29;33057:6;33035:29;:::i;:::-;33027:37;;33119:4;33113;33109:15;33101:23;;32824:307;;;:::o;33137:308::-;33199:4;33289:18;33281:6;33278:30;33275:56;;;33311:18;;:::i;:::-;33275:56;33349:29;33371:6;33349:29;:::i;:::-;33341:37;;33433:4;33427;33423:15;33415:23;;33137:308;;;:::o;33451:132::-;33518:4;33541:3;33533:11;;33571:4;33566:3;33562:14;33554:22;;33451:132;;;:::o;33589:141::-;33638:4;33661:3;33653:11;;33684:3;33681:1;33674:14;33718:4;33715:1;33705:18;33697:26;;33589:141;;;:::o;33736:114::-;33803:6;33837:5;33831:12;33821:22;;33736:114;;;:::o;33856:98::-;33907:6;33941:5;33935:12;33925:22;;33856:98;;;:::o;33960:99::-;34012:6;34046:5;34040:12;34030:22;;33960:99;;;:::o;34065:113::-;34135:4;34167;34162:3;34158:14;34150:22;;34065:113;;;:::o;34184:184::-;34283:11;34317:6;34312:3;34305:19;34357:4;34352:3;34348:14;34333:29;;34184:184;;;;:::o;34374:168::-;34457:11;34491:6;34486:3;34479:19;34531:4;34526:3;34522:14;34507:29;;34374:168;;;;:::o;34548:147::-;34649:11;34686:3;34671:18;;34548:147;;;;:::o;34701:169::-;34785:11;34819:6;34814:3;34807:19;34859:4;34854:3;34850:14;34835:29;;34701:169;;;;:::o;34876:148::-;34978:11;35015:3;35000:18;;34876:148;;;;:::o;35030:305::-;35070:3;35089:20;35107:1;35089:20;:::i;:::-;35084:25;;35123:20;35141:1;35123:20;:::i;:::-;35118:25;;35277:1;35209:66;35205:74;35202:1;35199:81;35196:107;;;35283:18;;:::i;:::-;35196:107;35327:1;35324;35320:9;35313:16;;35030:305;;;;:::o;35341:185::-;35381:1;35398:20;35416:1;35398:20;:::i;:::-;35393:25;;35432:20;35450:1;35432:20;:::i;:::-;35427:25;;35471:1;35461:35;;35476:18;;:::i;:::-;35461:35;35518:1;35515;35511:9;35506:14;;35341:185;;;;:::o;35532:348::-;35572:7;35595:20;35613:1;35595:20;:::i;:::-;35590:25;;35629:20;35647:1;35629:20;:::i;:::-;35624:25;;35817:1;35749:66;35745:74;35742:1;35739:81;35734:1;35727:9;35720:17;35716:105;35713:131;;;35824:18;;:::i;:::-;35713:131;35872:1;35869;35865:9;35854:20;;35532:348;;;;:::o;35886:191::-;35926:4;35946:20;35964:1;35946:20;:::i;:::-;35941:25;;35980:20;35998:1;35980:20;:::i;:::-;35975:25;;36019:1;36016;36013:8;36010:34;;;36024:18;;:::i;:::-;36010:34;36069:1;36066;36062:9;36054:17;;35886:191;;;;:::o;36083:96::-;36120:7;36149:24;36167:5;36149:24;:::i;:::-;36138:35;;36083:96;;;:::o;36185:90::-;36219:7;36262:5;36255:13;36248:21;36237:32;;36185:90;;;:::o;36281:77::-;36318:7;36347:5;36336:16;;36281:77;;;:::o;36364:149::-;36400:7;36440:66;36433:5;36429:78;36418:89;;36364:149;;;:::o;36519:126::-;36556:7;36596:42;36589:5;36585:54;36574:65;;36519:126;;;:::o;36651:77::-;36688:7;36717:5;36706:16;;36651:77;;;:::o;36734:154::-;36818:6;36813:3;36808;36795:30;36880:1;36871:6;36866:3;36862:16;36855:27;36734:154;;;:::o;36894:307::-;36962:1;36972:113;36986:6;36983:1;36980:13;36972:113;;;37071:1;37066:3;37062:11;37056:18;37052:1;37047:3;37043:11;37036:39;37008:2;37005:1;37001:10;36996:15;;36972:113;;;37103:6;37100:1;37097:13;37094:101;;;37183:1;37174:6;37169:3;37165:16;37158:27;37094:101;36943:258;36894:307;;;:::o;37207:320::-;37251:6;37288:1;37282:4;37278:12;37268:22;;37335:1;37329:4;37325:12;37356:18;37346:81;;37412:4;37404:6;37400:17;37390:27;;37346:81;37474:2;37466:6;37463:14;37443:18;37440:38;37437:84;;;37493:18;;:::i;:::-;37437:84;37258:269;37207:320;;;:::o;37533:281::-;37616:27;37638:4;37616:27;:::i;:::-;37608:6;37604:40;37746:6;37734:10;37731:22;37710:18;37698:10;37695:34;37692:62;37689:88;;;37757:18;;:::i;:::-;37689:88;37797:10;37793:2;37786:22;37576:238;37533:281;;:::o;37820:233::-;37859:3;37882:24;37900:5;37882:24;:::i;:::-;37873:33;;37928:66;37921:5;37918:77;37915:103;;;37998:18;;:::i;:::-;37915:103;38045:1;38038:5;38034:13;38027:20;;37820:233;;;:::o;38059:100::-;38098:7;38127:26;38147:5;38127:26;:::i;:::-;38116:37;;38059:100;;;:::o;38165:94::-;38204:7;38233:20;38247:5;38233:20;:::i;:::-;38222:31;;38165:94;;;:::o;38265:176::-;38297:1;38314:20;38332:1;38314:20;:::i;:::-;38309:25;;38348:20;38366:1;38348:20;:::i;:::-;38343:25;;38387:1;38377:35;;38392:18;;:::i;:::-;38377:35;38433:1;38430;38426:9;38421:14;;38265:176;;;;:::o;38447:180::-;38495:77;38492:1;38485:88;38592:4;38589:1;38582:15;38616:4;38613:1;38606:15;38633:180;38681:77;38678:1;38671:88;38778:4;38775:1;38768:15;38802:4;38799:1;38792:15;38819:180;38867:77;38864:1;38857:88;38964:4;38961:1;38954:15;38988:4;38985:1;38978:15;39005:180;39053:77;39050:1;39043:88;39150:4;39147:1;39140:15;39174:4;39171:1;39164:15;39191:180;39239:77;39236:1;39229:88;39336:4;39333:1;39326:15;39360:4;39357:1;39350:15;39377:117;39486:1;39483;39476:12;39500:117;39609:1;39606;39599:12;39623:117;39732:1;39729;39722:12;39746:117;39855:1;39852;39845:12;39869:117;39978:1;39975;39968:12;39992:117;40101:1;40098;40091:12;40115:102;40156:6;40207:2;40203:7;40198:2;40191:5;40187:14;40183:28;40173:38;;40115:102;;;:::o;40223:94::-;40256:8;40304:5;40300:2;40296:14;40275:35;;40223:94;;;:::o;40323:181::-;40463:33;40459:1;40451:6;40447:14;40440:57;40323:181;:::o;40510:225::-;40650:34;40646:1;40638:6;40634:14;40627:58;40719:8;40714:2;40706:6;40702:15;40695:33;40510:225;:::o;40741:181::-;40881:33;40877:1;40869:6;40865:14;40858:57;40741:181;:::o;40928:174::-;41068:26;41064:1;41056:6;41052:14;41045:50;40928:174;:::o;41108:166::-;41248:18;41244:1;41236:6;41232:14;41225:42;41108:166;:::o;41280:170::-;41420:22;41416:1;41408:6;41404:14;41397:46;41280:170;:::o;41456:223::-;41596:34;41592:1;41584:6;41580:14;41573:58;41665:6;41660:2;41652:6;41648:15;41641:31;41456:223;:::o;41685:164::-;41825:16;41821:1;41813:6;41809:14;41802:40;41685:164;:::o;41855:182::-;41995:34;41991:1;41983:6;41979:14;41972:58;41855:182;:::o;42043:173::-;42183:25;42179:1;42171:6;42167:14;42160:49;42043:173;:::o;42222:234::-;42362:34;42358:1;42350:6;42346:14;42339:58;42431:17;42426:2;42418:6;42414:15;42407:42;42222:234;:::o;42462:114::-;;:::o;42582:227::-;42722:34;42718:1;42710:6;42706:14;42699:58;42791:10;42786:2;42778:6;42774:15;42767:35;42582:227;:::o;42815:182::-;42955:34;42951:1;42943:6;42939:14;42932:58;42815:182;:::o;43003:179::-;43143:31;43139:1;43131:6;43127:14;43120:55;43003:179;:::o;43188:174::-;43328:26;43324:1;43316:6;43312:14;43305:50;43188:174;:::o;43368:223::-;43508:34;43504:1;43496:6;43492:14;43485:58;43577:6;43572:2;43564:6;43560:15;43553:31;43368:223;:::o;43597:176::-;43737:28;43733:1;43725:6;43721:14;43714:52;43597:176;:::o;43779:181::-;43919:33;43915:1;43907:6;43903:14;43896:57;43779:181;:::o;43966:162::-;44106:14;44102:1;44094:6;44090:14;44083:38;43966:162;:::o;44134:177::-;44274:29;44270:1;44262:6;44258:14;44251:53;44134:177;:::o;44317:122::-;44390:24;44408:5;44390:24;:::i;:::-;44383:5;44380:35;44370:63;;44429:1;44426;44419:12;44370:63;44317:122;:::o;44445:116::-;44515:21;44530:5;44515:21;:::i;:::-;44508:5;44505:32;44495:60;;44551:1;44548;44541:12;44495:60;44445:116;:::o;44567:122::-;44640:24;44658:5;44640:24;:::i;:::-;44633:5;44630:35;44620:63;;44679:1;44676;44669:12;44620:63;44567:122;:::o;44695:120::-;44767:23;44784:5;44767:23;:::i;:::-;44760:5;44757:34;44747:62;;44805:1;44802;44795:12;44747:62;44695:120;:::o;44821:122::-;44894:24;44912:5;44894:24;:::i;:::-;44887:5;44884:35;44874:63;;44933:1;44930;44923:12;44874:63;44821:122;:::o

Swarm Source

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