ETH Price: $3,106.89 (+1.24%)
Gas: 6 Gwei

Token

Sperm Game (SG)
 

Overview

Max Total Supply

5,526 SG

Holders

1,737

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
2 SG
0x9ba1705f0f3fd0128b4d8a6231ce65d7466efe5f
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:
SpermGame

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 12 of 13: SpermGame.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

import "./Ownable.sol";
import "./ECDSA.sol";
import "./ERC721ABurnable.sol";

contract SpermGame is ERC721ABurnable, Ownable {
    using Strings for uint;
    using ECDSA for bytes32;

    string public constant PROVENANCE_HASH = "50AE2B106A55D253EBFBEF735551BF3E4FE3F78C9618204CF3BE677595B30768";

    uint public collectionSupply;
    uint public freeMintLimit = 10;
    uint public freeMintSupply = 2222;
    uint public mintPrice = 20000000000000000; // 0.02 ETH

    bool public isRevealed;
    bool public mintAllowed;

    uint[] public wrappedTokenIds;

    string private baseURI;
    string private wrappedBaseURI;

    address private operatorAddress;

    uint internal immutable MAX_INT = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff;

    constructor(
        string memory initialURI,
        uint _MAX_TOKENS)
    ERC721A("Sperm Game", "SG") {
        collectionSupply = _MAX_TOKENS;
        isRevealed = false;
        mintAllowed = false;
        wrappedTokenIds = new uint[]((_MAX_TOKENS / 256) + 1);
        baseURI = initialURI;
        operatorAddress = msg.sender;
    }

    function mint(uint num) external payable ensureAvailabilityForMint(num) {
        require(mintAllowed, "Minting is not open yet");
        require(msg.value >= (num * mintPrice), "Insufficient payment amount");

        _safeMint(msg.sender, num);
    }

    function freeMint(uint num) external ensureAvailabilityForFreeMint(num) {
        require(mintAllowed, "Minting is not open yet");
        require((_numberMinted(msg.sender) + num) <= freeMintLimit, "Reached free mint limit for this wallet");

        _safeMint(msg.sender, num);
    }

    function wrapTokens(uint[] calldata tokenIds, bytes[] calldata signatures) external {
        require(tokenIds.length == signatures.length, "Must have one signature per tokenId");
        for (uint i = 0; i < tokenIds.length; i++) {
            require(ownerOf(tokenIds[i]) == msg.sender, "Must be owner of the token to wrap it");
            verifyTokenInFallopianPool(tokenIds[i], signatures[i]);
            setWrapped(tokenIds[i]);
        }
    }

    function unwrapTokens(uint[] calldata tokenIds) external {
        for (uint i = 0; i < tokenIds.length; i++) {
            require(ownerOf(tokenIds[i]) == msg.sender, "Must be owner of the token to unwrap");
            unsetWrapped(tokenIds[i]);
        }
    }

    function isValidSignature(bytes32 hash, bytes calldata signature) internal view returns (bool isValid) {
        bytes32 signedHash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
        return signedHash.recover(signature) == operatorAddress;
    }

    function verifyTokenInFallopianPool(uint tokenId, bytes calldata signature) internal view {
        bytes32 msgHash = keccak256(abi.encodePacked(tokenId));
        require(isValidSignature(msgHash, signature), "Invalid signature");
    }

    function tokenURI(uint tokenId) public view override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        if (isRevealed && !isWrapped(tokenId)) {
            return string(abi.encodePacked(baseURI, tokenId.toString()));
        } else if (isRevealed && isWrapped(tokenId)) {
            return string(abi.encodePacked(wrappedBaseURI, tokenId.toString()));
        } else {
            return string(abi.encodePacked(baseURI));
        }
    }

    function setTokenURI(string calldata _baseURI) external onlyOwner {
        baseURI = _baseURI;
    }

    function setWrappedBaseTokenURI(string calldata _wrappedBaseURI) external onlyOwner {
        wrappedBaseURI = _wrappedBaseURI;
    }

    function setOperatorAddress(address _address) external onlyOwner {
        operatorAddress = _address;
    }

    function setCollectionSupply(uint _supply) external onlyOwner {
        require(_supply >= freeMintSupply, "Cannot set collection supply to be lower than free mint supply");
        collectionSupply = _supply;
    }

    function setFreeMintLimit(uint _limit) external onlyOwner {
        freeMintLimit = _limit;
    }

    function setFreeMintSupply(uint _supply) external onlyOwner {
        require(_supply <= collectionSupply, "Cannot set free mint supply to be higher than collection supply");
        freeMintSupply = _supply;
    }

    function setMintPrice(uint _price) external onlyOwner {
        mintPrice = _price;
    }

    function toggleMintingAllowed() external onlyOwner {
        mintAllowed = !mintAllowed;
    }

    function toggleReveal() external onlyOwner {
        isRevealed = !isRevealed;
    }

    function burn(uint tokenId) public override onlyOwner {
        super.burn(tokenId);
    }

    function withdraw() external onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }

    function isWrapped(uint tokenId) public view returns (bool) {
        uint[] memory bitMapList = wrappedTokenIds;
        uint partitionIndex = tokenId / 256;
        uint partition = bitMapList[partitionIndex];
        if (partition == MAX_INT) {
            return true;
        }
        uint bitIndex = tokenId % 256;
        uint bit = partition & (1 << bitIndex);
        return (bit != 0);
    }

    function setWrapped(uint tokenId) internal {
        uint[] storage bitMapList = wrappedTokenIds;
        uint partitionIndex = tokenId / 256;
        uint partition = bitMapList[partitionIndex];
        uint bitIndex = tokenId % 256;
        bitMapList[partitionIndex] = partition | (1 << bitIndex);
    }

    function unsetWrapped(uint tokenId) internal {
        uint[] storage bitMapList = wrappedTokenIds;
        uint partitionIndex = tokenId / 256;
        uint partition = bitMapList[partitionIndex];
        uint bitIndex = tokenId % 256;
        bitMapList[partitionIndex] = partition & (0 << bitIndex);
    }

    function resetWrapped() external onlyOwner {
        wrappedTokenIds = new uint[]((collectionSupply / 256) + 1);
    }

    modifier ensureAvailabilityForMint(uint num) {
        require((totalSupply() + num) <= collectionSupply, "Insufficient tokens remaining in collection");
        _;
    }

    modifier ensureAvailabilityForFreeMint(uint num) {
        require((totalSupply() + num) <= freeMintSupply, "Insufficient free mints remaining in collection");
        _;
    }
}

File 1 of 13: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 2 of 13: Context.sol
// SPDX-License-Identifier: MIT
// 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 3 of 13: ECDSA.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;

import "./Strings.sol";

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

File 4 of 13: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 5 of 13: ERC721A.sol
// SPDX-License-Identifier: MIT
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721.sol';
import './IERC721Receiver.sol';
import './IERC721Metadata.sol';
import './Address.sol';
import './Context.sol';
import './Strings.sol';
import './ERC165.sol';

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

        address from = prevOwnership.addr;

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

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

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

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

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

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

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

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

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

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

File 6 of 13: ERC721ABurnable.sol
// SPDX-License-Identifier: MIT
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './ERC721A.sol';

/**
 * @title ERC721A Burnable Token
 * @dev ERC721A Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721ABurnable is ERC721A {
    /**
     * @dev Burns `tokenId`. See {ERC721A-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        _burn(tokenId, true);
    }
}

File 7 of 13: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

File 8 of 13: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

File 9 of 13: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

File 10 of 13: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

File 11 of 13: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

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

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

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

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

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

File 13 of 13: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"initialURI","type":"string"},{"internalType":"uint256","name":"_MAX_TOKENS","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"PROVENANCE_HASH","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collectionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMintSupply","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":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isWrapped","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resetWrapped","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"}],"name":"setCollectionSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setFreeMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"}],"name":"setFreeMintSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setOperatorAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_wrappedBaseURI","type":"string"}],"name":"setWrappedBaseTokenURI","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":"toggleMintingAllowed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleReveal","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":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"unwrapTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"wrapTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"wrappedTokenIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60a0604052600a80556108ae600b5566470de4df820000600c556000196080523480156200002c57600080fd5b506040516200364b3803806200364b8339810160408190526200004f91620002cf565b6040518060400160405280600a815260200169537065726d2047616d6560b01b81525060405180604001604052806002815260200161534760f01b8152508160029080519060200190620000a5929190620001d6565b508051620000bb906003906020840190620001d6565b50506000805550620000cd3362000184565b6009819055600d805461ffff19169055620000eb61010082620003b4565b620000f8906001620003d7565b6001600160401b03811115620001125762000112620002b9565b6040519080825280602002602001820160405280156200013c578160200160208202803683370190505b5080516200015391600e9160209091019062000265565b5081516200016990600f906020850190620001d6565b5050601180546001600160a01b03191633179055506200043a565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001e490620003fe565b90600052602060002090601f01602090048101928262000208576000855562000253565b82601f106200022357805160ff191683800117855562000253565b8280016001018555821562000253579182015b828111156200025357825182559160200191906001019062000236565b5062000261929150620002a2565b5090565b8280548282559060005260206000209081019282156200025357916020028201828111156200025357825182559160200191906001019062000236565b5b80821115620002615760008155600101620002a3565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215620002e357600080fd5b82516001600160401b0380821115620002fb57600080fd5b818501915085601f8301126200031057600080fd5b815181811115620003255762000325620002b9565b604051601f8201601f19908116603f01168101908382118183101715620003505762000350620002b9565b816040528281526020935088848487010111156200036d57600080fd5b600091505b8282101562000391578482018401518183018501529083019062000372565b82821115620003a35760008484830101525b969092015195979596505050505050565b600082620003d257634e487b7160e01b600052601260045260246000fd5b500490565b60008219821115620003f957634e487b7160e01b600052601160045260246000fd5b500190565b600181811c908216806200041357607f821691505b6020821081036200043457634e487b7160e01b600052602260045260246000fd5b50919050565b6080516131f56200045660003960006112fc01526131f56000f3fe6080604052600436106102d15760003560e01c80636ab9208611610179578063bd2f6eb8116100d6578063e150007e1161008a578063f4a0a52811610064578063f4a0a528146107a2578063f8a80578146107c2578063ff1b6556146107d757600080fd5b8063e150007e14610723578063e985e9c514610739578063f2fde38b1461078257600080fd5b8063c4c39ed5116100bb578063c4c39ed5146106c3578063c87b56dd146106e3578063e0df5b6f1461070357600080fd5b8063bd2f6eb814610684578063c467201e146106a457600080fd5b8063902f5e3a1161012d578063a0712d6811610112578063a0712d6814610631578063a22cb46514610644578063b88d4fde1461066457600080fd5b8063902f5e3a146105fc57806395d89b411461061c57600080fd5b8063715018a61161015e578063715018a6146105a95780637c928fe9146105be5780638da5cb5b146105de57600080fd5b80636ab920861461057357806370a082311461058957600080fd5b806325539f67116102325780634b2561d2116101e657806360c21826116101c057806360c218261461051d5780636352211e1461053d5780636817c76c1461055d57600080fd5b80634b2561d2146104ce57806354214f69146104ee5780635b8ad4291461050857600080fd5b80633ccfd60b116102175780633ccfd60b1461047957806342842e0e1461048e57806342966c68146104ae57600080fd5b806325539f67146104395780632f1d5a601461045957600080fd5b8063095ea7b31161028957806316b014391161026e57806316b01439146103e057806318160ddd1461040057806323b872dd1461041957600080fd5b8063095ea7b3146103ab57806315af56cc146103cb57600080fd5b806306fdde03116102ba57806306fdde031461032d578063081812fc1461034f57806308346d851461038757600080fd5b806301ffc9a7146102d6578063069cb36c1461030b575b600080fd5b3480156102e257600080fd5b506102f66102f1366004612ace565b6107ec565b60405190151581526020015b60405180910390f35b34801561031757600080fd5b5061032b610326366004612af2565b610889565b005b34801561033957600080fd5b506103426108e7565b6040516103029190612bbc565b34801561035b57600080fd5b5061036f61036a366004612bcf565b610979565b6040516001600160a01b039091168152602001610302565b34801561039357600080fd5b5061039d600a5481565b604051908152602001610302565b3480156103b757600080fd5b5061032b6103c6366004612bff565b6109d6565b3480156103d757600080fd5b5061032b610a90565b3480156103ec57600080fd5b5061032b6103fb366004612c6e565b610af5565b34801561040c57600080fd5b506001546000540361039d565b34801561042557600080fd5b5061032b610434366004612cda565b610c92565b34801561044557600080fd5b5061032b610454366004612bcf565b610c9d565b34801561046557600080fd5b5061032b610474366004612d16565b610d62565b34801561048557600080fd5b5061032b610dd9565b34801561049a57600080fd5b5061032b6104a9366004612cda565b610e50565b3480156104ba57600080fd5b5061032b6104c9366004612bcf565b610e6b565b3480156104da57600080fd5b5061032b6104e9366004612d31565b610ebc565b3480156104fa57600080fd5b50600d546102f69060ff1681565b34801561051457600080fd5b5061032b610f8b565b34801561052957600080fd5b5061039d610538366004612bcf565b610fe7565b34801561054957600080fd5b5061036f610558366004612bcf565b611008565b34801561056957600080fd5b5061039d600c5481565b34801561057f57600080fd5b5061039d60095481565b34801561059557600080fd5b5061039d6105a4366004612d16565b61101a565b3480156105b557600080fd5b5061032b611082565b3480156105ca57600080fd5b5061032b6105d9366004612bcf565b6110d6565b3480156105ea57600080fd5b506008546001600160a01b031661036f565b34801561060857600080fd5b506102f6610617366004612bcf565b611274565b34801561062857600080fd5b5061034261134d565b61032b61063f366004612bcf565b61135c565b34801561065057600080fd5b5061032b61065f366004612d73565b61149f565b34801561067057600080fd5b5061032b61067f366004612dc5565b61154d565b34801561069057600080fd5b5061032b61069f366004612bcf565b61159e565b3480156106b057600080fd5b50600d546102f690610100900460ff1681565b3480156106cf57600080fd5b5061032b6106de366004612bcf565b6115eb565b3480156106ef57600080fd5b506103426106fe366004612bcf565b6116b0565b34801561070f57600080fd5b5061032b61071e366004612af2565b61177d565b34801561072f57600080fd5b5061039d600b5481565b34801561074557600080fd5b506102f6610754366004612ea1565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561078e57600080fd5b5061032b61079d366004612d16565b6117d1565b3480156107ae57600080fd5b5061032b6107bd366004612bcf565b61189e565b3480156107ce57600080fd5b5061032b6118eb565b3480156107e357600080fd5b506103426119a4565b60006001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000148061084f57506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061088357507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b6008546001600160a01b031633146108d65760405162461bcd60e51b815260206004820181905260248201526000805160206131a083398151915260448201526064015b60405180910390fd5b6108e2601083836129e4565b505050565b6060600280546108f690612ed4565b80601f016020809104026020016040519081016040528092919081815260200182805461092290612ed4565b801561096f5780601f106109445761010080835404028352916020019161096f565b820191906000526020600020905b81548152906001019060200180831161095257829003601f168201915b5050505050905090565b6000610984826119c0565b6109ba576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006109e182611008565b9050806001600160a01b0316836001600160a01b031603610a2e576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336001600160a01b03821614801590610a4e5750610a4c8133610754565b155b15610a85576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108e28383836119eb565b6008546001600160a01b03163314610ad85760405162461bcd60e51b815260206004820181905260248201526000805160206131a083398151915260448201526064016108cd565b600d805461ff001981166101009182900460ff1615909102179055565b828114610b6a5760405162461bcd60e51b815260206004820152602360248201527f4d7573742068617665206f6e65207369676e61747572652070657220746f6b6560448201527f6e4964000000000000000000000000000000000000000000000000000000000060648201526084016108cd565b60005b83811015610c8b5733610b97868684818110610b8b57610b8b612f0e565b90506020020135611008565b6001600160a01b031614610c135760405162461bcd60e51b815260206004820152602560248201527f4d757374206265206f776e6572206f662074686520746f6b656e20746f20777260448201527f617020697400000000000000000000000000000000000000000000000000000060648201526084016108cd565b610c58858583818110610c2857610c28612f0e565b90506020020135848484818110610c4157610c41612f0e565b9050602002810190610c539190612f24565b611a54565b610c79858583818110610c6d57610c6d612f0e565b90506020020135611ad8565b80610c8381612f81565b915050610b6d565b5050505050565b6108e2838383611b45565b6008546001600160a01b03163314610ce55760405162461bcd60e51b815260206004820181905260248201526000805160206131a083398151915260448201526064016108cd565b600b54811015610d5d5760405162461bcd60e51b815260206004820152603e60248201527f43616e6e6f742073657420636f6c6c656374696f6e20737570706c7920746f2060448201527f6265206c6f776572207468616e2066726565206d696e7420737570706c79000060648201526084016108cd565b600955565b6008546001600160a01b03163314610daa5760405162461bcd60e51b815260206004820181905260248201526000805160206131a083398151915260448201526064016108cd565b6011805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6008546001600160a01b03163314610e215760405162461bcd60e51b815260206004820181905260248201526000805160206131a083398151915260448201526064016108cd565b60405133904780156108fc02916000818181858888f19350505050158015610e4d573d6000803e3d6000fd5b50565b6108e28383836040518060200160405280600081525061154d565b6008546001600160a01b03163314610eb35760405162461bcd60e51b815260206004820181905260248201526000805160206131a083398151915260448201526064016108cd565b610e4d81611d65565b60005b818110156108e25733610edd848484818110610b8b57610b8b612f0e565b6001600160a01b031614610f585760405162461bcd60e51b8152602060048201526024808201527f4d757374206265206f776e6572206f662074686520746f6b656e20746f20756e60448201527f777261700000000000000000000000000000000000000000000000000000000060648201526084016108cd565b610f79838383818110610f6d57610f6d612f0e565b90506020020135611d70565b80610f8381612f81565b915050610ebf565b6008546001600160a01b03163314610fd35760405162461bcd60e51b815260206004820181905260248201526000805160206131a083398151915260448201526064016108cd565b600d805460ff19811660ff90911615179055565b600e8181548110610ff757600080fd5b600091825260209091200154905081565b600061101382611dc9565b5192915050565b60006001600160a01b03821661105c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b031633146110ca5760405162461bcd60e51b815260206004820181905260248201526000805160206131a083398151915260448201526064016108cd565b6110d46000611efe565b565b80600b54816110e86001546000540390565b6110f29190612f9a565b11156111665760405162461bcd60e51b815260206004820152602f60248201527f496e73756666696369656e742066726565206d696e74732072656d61696e696e60448201527f6720696e20636f6c6c656374696f6e000000000000000000000000000000000060648201526084016108cd565b600d54610100900460ff166111bd5760405162461bcd60e51b815260206004820152601760248201527f4d696e74696e67206973206e6f74206f70656e2079657400000000000000000060448201526064016108cd565b600a5433600090815260056020526040902054839068010000000000000000900467ffffffffffffffff166111f29190612f9a565b11156112665760405162461bcd60e51b815260206004820152602760248201527f526561636865642066726565206d696e74206c696d697420666f72207468697360448201527f2077616c6c65740000000000000000000000000000000000000000000000000060648201526084016108cd565b6112703383611f5d565b5050565b600080600e8054806020026020016040519081016040528092919081815260200182805480156112c357602002820191906000526020600020905b8154815260200190600101908083116112af575b505050505090506000610100846112da9190612fc8565b905060008282815181106112f0576112f0612f0e565b602002602001015190507f0000000000000000000000000000000000000000000000000000000000000000810361132c57506001949350505050565b600061133a61010087612fdc565b6001901b91909116151595945050505050565b6060600380546108f690612ed4565b806009548161136e6001546000540390565b6113789190612f9a565b11156113ec5760405162461bcd60e51b815260206004820152602b60248201527f496e73756666696369656e7420746f6b656e732072656d61696e696e6720696e60448201527f20636f6c6c656374696f6e00000000000000000000000000000000000000000060648201526084016108cd565b600d54610100900460ff166114435760405162461bcd60e51b815260206004820152601760248201527f4d696e74696e67206973206e6f74206f70656e2079657400000000000000000060448201526064016108cd565b600c546114509083612ff0565b3410156112665760405162461bcd60e51b815260206004820152601b60248201527f496e73756666696369656e74207061796d656e7420616d6f756e74000000000060448201526064016108cd565b336001600160a01b038316036114e1576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611558848484611b45565b6001600160a01b0383163b1515801561157a575061157884848484611f77565b155b15611598576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6008546001600160a01b031633146115e65760405162461bcd60e51b815260206004820181905260248201526000805160206131a083398151915260448201526064016108cd565b600a55565b6008546001600160a01b031633146116335760405162461bcd60e51b815260206004820181905260248201526000805160206131a083398151915260448201526064016108cd565b6009548111156116ab5760405162461bcd60e51b815260206004820152603f60248201527f43616e6e6f74207365742066726565206d696e7420737570706c7920746f206260448201527f6520686967686572207468616e20636f6c6c656374696f6e20737570706c790060648201526084016108cd565b600b55565b60606116bb826119c0565b6116f1576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d5460ff168015611709575061170782611274565b155b1561174057600f61171983612063565b60405160200161172a9291906130a8565b6040516020818303038152906040529050919050565b600d5460ff168015611756575061175682611274565b1561176657601061171983612063565b600f60405160200161172a91906130cd565b919050565b6008546001600160a01b031633146117c55760405162461bcd60e51b815260206004820181905260248201526000805160206131a083398151915260448201526064016108cd565b6108e2600f83836129e4565b6008546001600160a01b031633146118195760405162461bcd60e51b815260206004820181905260248201526000805160206131a083398151915260448201526064016108cd565b6001600160a01b0381166118955760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016108cd565b610e4d81611efe565b6008546001600160a01b031633146118e65760405162461bcd60e51b815260206004820181905260248201526000805160206131a083398151915260448201526064016108cd565b600c55565b6008546001600160a01b031633146119335760405162461bcd60e51b815260206004820181905260248201526000805160206131a083398151915260448201526064016108cd565b6101006009546119439190612fc8565b61194e906001612f9a565b67ffffffffffffffff81111561196657611966612daf565b60405190808252806020026020018201604052801561198f578160200160208202803683370190505b508051610e4d91600e91602090910190612a68565b6040518060600160405280604081526020016131606040913981565b6000805482108015610883575050600090815260046020526040902054600160e01b900460ff161590565b600082815260066020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600083604051602001611a6991815260200190565b604051602081830303815290604052805190602001209050611a8c818484612198565b6115985760405162461bcd60e51b815260206004820152601160248201527f496e76616c6964207369676e617475726500000000000000000000000000000060448201526064016108cd565b600e6000611ae861010084612fc8565b90506000828281548110611afe57611afe612f0e565b60009182526020822001549150611b1761010086612fdc565b9050806001901b8217848481548110611b3257611b32612f0e565b6000918252602090912001555050505050565b6000611b5082611dc9565b9050836001600160a01b031681600001516001600160a01b031614611ba1576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000336001600160a01b0386161480611bbf5750611bbf8533610754565b80611bda575033611bcf84610979565b6001600160a01b0316145b905080611bfa57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416611c3a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c46600084876119eb565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116611d1c576000548214611d1c578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610c8b565b610e4d816001612246565b600e6000611d8061010084612fc8565b90506000828281548110611d9657611d96612f0e565b60009182526020822001549150611daf61010086612fdc565b8454909150600090859085908110611b3257611b32612f0e565b604080516060810182526000808252602082018190529181019190915281600054811015611ecc57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff16151591810182905290611eca5780516001600160a01b031615611e60579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff1615159281019290925215611ec5579392505050565b611e60565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61127082826040518060200160405280600081525061243c565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611fac9033908990889088906004016130d9565b6020604051808303816000875af1925050508015611fe7575060408051601f3d908101601f19168201909252611fe491810190613115565b60015b612045573d808015612015576040519150601f19603f3d011682016040523d82523d6000602084013e61201a565b606091505b50805160000361203d576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060816000036120a657505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156120d057806120ba81612f81565b91506120c99050600a83612fc8565b91506120aa565b60008167ffffffffffffffff8111156120eb576120eb612daf565b6040519080825280601f01601f191660200182016040528015612115576020820181803683370190505b5090505b841561205b5761212a600183613132565b9150612137600a86612fdc565b612142906030612f9a565b60f81b81838151811061215757612157612f0e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612191600a86612fc8565b9450612119565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018490526000908190605c0160408051601f198184030181528282528051602091820120601154601f880183900483028501830190935286845293506001600160a01b039091169161223391879087908190840183828082843760009201919091525086939250506124499050565b6001600160a01b03161495945050505050565b600061225183611dc9565b805190915082156122b7576000336001600160a01b038316148061227a575061227a8233610754565b8061229557503361228a86610979565b6001600160a01b0316145b9050806122b557604051632ce44b5f60e11b815260040160405180910390fd5b505b6122c3600085836119eb565b6001600160a01b038082166000818152600560209081526040808320805470010000000000000000000000000000000060001967ffffffffffffffff80841691909101811667ffffffffffffffff19841681178390048216600190810183169093027fffffffffffffffff0000000000000000ffffffffffffffff0000000000000000909416179290921783558b8652600490945282852080547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff42909316600160a01b026001600160e01b03199091169097179690961716600160e01b1785559189018084529220805491949091166123f25760005482146123f2578054602087015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038716171781555b5050604051869250600091506001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a4505060018054810190555050565b6108e2838383600161246d565b60008060006124588585612681565b91509150612465816126ef565b509392505050565b6000546001600160a01b0385166124b0576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836000036124ea576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000811667ffffffffffffffff8083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b4290921691909102179055808085018380156125ab57506001600160a01b0387163b15155b15612633575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46125fc6000888480600101955088611f77565b612619576040516368d2bf6b60e11b815260040160405180910390fd5b8082036125b157826000541461262e57600080fd5b612678565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808203612634575b50600055610c8b565b60008082516041036126b75760208301516040840151606085015160001a6126ab878285856128a5565b945094505050506126e8565b82516040036126e057602083015160408401516126d5868383612992565b9350935050506126e8565b506000905060025b9250929050565b600081600481111561270357612703613149565b0361270b5750565b600181600481111561271f5761271f613149565b0361276c5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016108cd565b600281600481111561278057612780613149565b036127cd5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016108cd565b60038160048111156127e1576127e1613149565b036128395760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016108cd565b600481600481111561284d5761284d613149565b03610e4d5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016108cd565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156128dc5750600090506003612989565b8460ff16601b141580156128f457508460ff16601c14155b156129055750600090506004612989565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612959573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661298257600060019250925050612989565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316816129c860ff86901c601b612f9a565b90506129d6878288856128a5565b935093505050935093915050565b8280546129f090612ed4565b90600052602060002090601f016020900481019282612a125760008555612a58565b82601f10612a2b5782800160ff19823516178555612a58565b82800160010185558215612a58579182015b82811115612a58578235825591602001919060010190612a3d565b50612a64929150612aa3565b5090565b828054828255906000526020600020908101928215612a58579160200282015b82811115612a58578251825591602001919060010190612a88565b5b80821115612a645760008155600101612aa4565b6001600160e01b031981168114610e4d57600080fd5b600060208284031215612ae057600080fd5b8135612aeb81612ab8565b9392505050565b60008060208385031215612b0557600080fd5b823567ffffffffffffffff80821115612b1d57600080fd5b818501915085601f830112612b3157600080fd5b813581811115612b4057600080fd5b866020828501011115612b5257600080fd5b60209290920196919550909350505050565b60005b83811015612b7f578181015183820152602001612b67565b838111156115985750506000910152565b60008151808452612ba8816020860160208601612b64565b601f01601f19169290920160200192915050565b602081526000612aeb6020830184612b90565b600060208284031215612be157600080fd5b5035919050565b80356001600160a01b038116811461177857600080fd5b60008060408385031215612c1257600080fd5b612c1b83612be8565b946020939093013593505050565b60008083601f840112612c3b57600080fd5b50813567ffffffffffffffff811115612c5357600080fd5b6020830191508360208260051b85010111156126e857600080fd5b60008060008060408587031215612c8457600080fd5b843567ffffffffffffffff80821115612c9c57600080fd5b612ca888838901612c29565b90965094506020870135915080821115612cc157600080fd5b50612cce87828801612c29565b95989497509550505050565b600080600060608486031215612cef57600080fd5b612cf884612be8565b9250612d0660208501612be8565b9150604084013590509250925092565b600060208284031215612d2857600080fd5b612aeb82612be8565b60008060208385031215612d4457600080fd5b823567ffffffffffffffff811115612d5b57600080fd5b612d6785828601612c29565b90969095509350505050565b60008060408385031215612d8657600080fd5b612d8f83612be8565b915060208301358015158114612da457600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215612ddb57600080fd5b612de485612be8565b9350612df260208601612be8565b925060408501359150606085013567ffffffffffffffff80821115612e1657600080fd5b818701915087601f830112612e2a57600080fd5b813581811115612e3c57612e3c612daf565b604051601f8201601f19908116603f01168101908382118183101715612e6457612e64612daf565b816040528281528a6020848701011115612e7d57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215612eb457600080fd5b612ebd83612be8565b9150612ecb60208401612be8565b90509250929050565b600181811c90821680612ee857607f821691505b602082108103612f0857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112612f3b57600080fd5b83018035915067ffffffffffffffff821115612f5657600080fd5b6020019150368190038213156126e857600080fd5b634e487b7160e01b600052601160045260246000fd5b600060018201612f9357612f93612f6b565b5060010190565b60008219821115612fad57612fad612f6b565b500190565b634e487b7160e01b600052601260045260246000fd5b600082612fd757612fd7612fb2565b500490565b600082612feb57612feb612fb2565b500690565b600081600019048311821515161561300a5761300a612f6b565b500290565b8054600090600181811c908083168061302957607f831692505b6020808410820361304a57634e487b7160e01b600052602260045260246000fd5b81801561305e576001811461306f5761309c565b60ff1986168952848901965061309c565b60008881526020902060005b868110156130945781548b82015290850190830161307b565b505084890196505b50505050505092915050565b60006130b4828561300f565b83516130c4818360208801612b64565b01949350505050565b6000612aeb828461300f565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261310b6080830184612b90565b9695505050505050565b60006020828403121561312757600080fd5b8151612aeb81612ab8565b60008282101561314457613144612f6b565b500390565b634e487b7160e01b600052602160045260246000fdfe353041453242313036413535443235334542464245463733353535314246334534464533463738433936313832303443463342453637373539354233303736384f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212209c04d666a8a8d775f9d04be6a55f52503289185d0f607df6b7b440156dca4a5564736f6c634300080d0033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000022b80000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d615335644e67564d677262754c64656f33787158796735657352785a755446527456396632325936637634360000000000000000000000

Deployed Bytecode

0x6080604052600436106102d15760003560e01c80636ab9208611610179578063bd2f6eb8116100d6578063e150007e1161008a578063f4a0a52811610064578063f4a0a528146107a2578063f8a80578146107c2578063ff1b6556146107d757600080fd5b8063e150007e14610723578063e985e9c514610739578063f2fde38b1461078257600080fd5b8063c4c39ed5116100bb578063c4c39ed5146106c3578063c87b56dd146106e3578063e0df5b6f1461070357600080fd5b8063bd2f6eb814610684578063c467201e146106a457600080fd5b8063902f5e3a1161012d578063a0712d6811610112578063a0712d6814610631578063a22cb46514610644578063b88d4fde1461066457600080fd5b8063902f5e3a146105fc57806395d89b411461061c57600080fd5b8063715018a61161015e578063715018a6146105a95780637c928fe9146105be5780638da5cb5b146105de57600080fd5b80636ab920861461057357806370a082311461058957600080fd5b806325539f67116102325780634b2561d2116101e657806360c21826116101c057806360c218261461051d5780636352211e1461053d5780636817c76c1461055d57600080fd5b80634b2561d2146104ce57806354214f69146104ee5780635b8ad4291461050857600080fd5b80633ccfd60b116102175780633ccfd60b1461047957806342842e0e1461048e57806342966c68146104ae57600080fd5b806325539f67146104395780632f1d5a601461045957600080fd5b8063095ea7b31161028957806316b014391161026e57806316b01439146103e057806318160ddd1461040057806323b872dd1461041957600080fd5b8063095ea7b3146103ab57806315af56cc146103cb57600080fd5b806306fdde03116102ba57806306fdde031461032d578063081812fc1461034f57806308346d851461038757600080fd5b806301ffc9a7146102d6578063069cb36c1461030b575b600080fd5b3480156102e257600080fd5b506102f66102f1366004612ace565b6107ec565b60405190151581526020015b60405180910390f35b34801561031757600080fd5b5061032b610326366004612af2565b610889565b005b34801561033957600080fd5b506103426108e7565b6040516103029190612bbc565b34801561035b57600080fd5b5061036f61036a366004612bcf565b610979565b6040516001600160a01b039091168152602001610302565b34801561039357600080fd5b5061039d600a5481565b604051908152602001610302565b3480156103b757600080fd5b5061032b6103c6366004612bff565b6109d6565b3480156103d757600080fd5b5061032b610a90565b3480156103ec57600080fd5b5061032b6103fb366004612c6e565b610af5565b34801561040c57600080fd5b506001546000540361039d565b34801561042557600080fd5b5061032b610434366004612cda565b610c92565b34801561044557600080fd5b5061032b610454366004612bcf565b610c9d565b34801561046557600080fd5b5061032b610474366004612d16565b610d62565b34801561048557600080fd5b5061032b610dd9565b34801561049a57600080fd5b5061032b6104a9366004612cda565b610e50565b3480156104ba57600080fd5b5061032b6104c9366004612bcf565b610e6b565b3480156104da57600080fd5b5061032b6104e9366004612d31565b610ebc565b3480156104fa57600080fd5b50600d546102f69060ff1681565b34801561051457600080fd5b5061032b610f8b565b34801561052957600080fd5b5061039d610538366004612bcf565b610fe7565b34801561054957600080fd5b5061036f610558366004612bcf565b611008565b34801561056957600080fd5b5061039d600c5481565b34801561057f57600080fd5b5061039d60095481565b34801561059557600080fd5b5061039d6105a4366004612d16565b61101a565b3480156105b557600080fd5b5061032b611082565b3480156105ca57600080fd5b5061032b6105d9366004612bcf565b6110d6565b3480156105ea57600080fd5b506008546001600160a01b031661036f565b34801561060857600080fd5b506102f6610617366004612bcf565b611274565b34801561062857600080fd5b5061034261134d565b61032b61063f366004612bcf565b61135c565b34801561065057600080fd5b5061032b61065f366004612d73565b61149f565b34801561067057600080fd5b5061032b61067f366004612dc5565b61154d565b34801561069057600080fd5b5061032b61069f366004612bcf565b61159e565b3480156106b057600080fd5b50600d546102f690610100900460ff1681565b3480156106cf57600080fd5b5061032b6106de366004612bcf565b6115eb565b3480156106ef57600080fd5b506103426106fe366004612bcf565b6116b0565b34801561070f57600080fd5b5061032b61071e366004612af2565b61177d565b34801561072f57600080fd5b5061039d600b5481565b34801561074557600080fd5b506102f6610754366004612ea1565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561078e57600080fd5b5061032b61079d366004612d16565b6117d1565b3480156107ae57600080fd5b5061032b6107bd366004612bcf565b61189e565b3480156107ce57600080fd5b5061032b6118eb565b3480156107e357600080fd5b506103426119a4565b60006001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000148061084f57506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061088357507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b6008546001600160a01b031633146108d65760405162461bcd60e51b815260206004820181905260248201526000805160206131a083398151915260448201526064015b60405180910390fd5b6108e2601083836129e4565b505050565b6060600280546108f690612ed4565b80601f016020809104026020016040519081016040528092919081815260200182805461092290612ed4565b801561096f5780601f106109445761010080835404028352916020019161096f565b820191906000526020600020905b81548152906001019060200180831161095257829003601f168201915b5050505050905090565b6000610984826119c0565b6109ba576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006109e182611008565b9050806001600160a01b0316836001600160a01b031603610a2e576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336001600160a01b03821614801590610a4e5750610a4c8133610754565b155b15610a85576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108e28383836119eb565b6008546001600160a01b03163314610ad85760405162461bcd60e51b815260206004820181905260248201526000805160206131a083398151915260448201526064016108cd565b600d805461ff001981166101009182900460ff1615909102179055565b828114610b6a5760405162461bcd60e51b815260206004820152602360248201527f4d7573742068617665206f6e65207369676e61747572652070657220746f6b6560448201527f6e4964000000000000000000000000000000000000000000000000000000000060648201526084016108cd565b60005b83811015610c8b5733610b97868684818110610b8b57610b8b612f0e565b90506020020135611008565b6001600160a01b031614610c135760405162461bcd60e51b815260206004820152602560248201527f4d757374206265206f776e6572206f662074686520746f6b656e20746f20777260448201527f617020697400000000000000000000000000000000000000000000000000000060648201526084016108cd565b610c58858583818110610c2857610c28612f0e565b90506020020135848484818110610c4157610c41612f0e565b9050602002810190610c539190612f24565b611a54565b610c79858583818110610c6d57610c6d612f0e565b90506020020135611ad8565b80610c8381612f81565b915050610b6d565b5050505050565b6108e2838383611b45565b6008546001600160a01b03163314610ce55760405162461bcd60e51b815260206004820181905260248201526000805160206131a083398151915260448201526064016108cd565b600b54811015610d5d5760405162461bcd60e51b815260206004820152603e60248201527f43616e6e6f742073657420636f6c6c656374696f6e20737570706c7920746f2060448201527f6265206c6f776572207468616e2066726565206d696e7420737570706c79000060648201526084016108cd565b600955565b6008546001600160a01b03163314610daa5760405162461bcd60e51b815260206004820181905260248201526000805160206131a083398151915260448201526064016108cd565b6011805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6008546001600160a01b03163314610e215760405162461bcd60e51b815260206004820181905260248201526000805160206131a083398151915260448201526064016108cd565b60405133904780156108fc02916000818181858888f19350505050158015610e4d573d6000803e3d6000fd5b50565b6108e28383836040518060200160405280600081525061154d565b6008546001600160a01b03163314610eb35760405162461bcd60e51b815260206004820181905260248201526000805160206131a083398151915260448201526064016108cd565b610e4d81611d65565b60005b818110156108e25733610edd848484818110610b8b57610b8b612f0e565b6001600160a01b031614610f585760405162461bcd60e51b8152602060048201526024808201527f4d757374206265206f776e6572206f662074686520746f6b656e20746f20756e60448201527f777261700000000000000000000000000000000000000000000000000000000060648201526084016108cd565b610f79838383818110610f6d57610f6d612f0e565b90506020020135611d70565b80610f8381612f81565b915050610ebf565b6008546001600160a01b03163314610fd35760405162461bcd60e51b815260206004820181905260248201526000805160206131a083398151915260448201526064016108cd565b600d805460ff19811660ff90911615179055565b600e8181548110610ff757600080fd5b600091825260209091200154905081565b600061101382611dc9565b5192915050565b60006001600160a01b03821661105c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b031633146110ca5760405162461bcd60e51b815260206004820181905260248201526000805160206131a083398151915260448201526064016108cd565b6110d46000611efe565b565b80600b54816110e86001546000540390565b6110f29190612f9a565b11156111665760405162461bcd60e51b815260206004820152602f60248201527f496e73756666696369656e742066726565206d696e74732072656d61696e696e60448201527f6720696e20636f6c6c656374696f6e000000000000000000000000000000000060648201526084016108cd565b600d54610100900460ff166111bd5760405162461bcd60e51b815260206004820152601760248201527f4d696e74696e67206973206e6f74206f70656e2079657400000000000000000060448201526064016108cd565b600a5433600090815260056020526040902054839068010000000000000000900467ffffffffffffffff166111f29190612f9a565b11156112665760405162461bcd60e51b815260206004820152602760248201527f526561636865642066726565206d696e74206c696d697420666f72207468697360448201527f2077616c6c65740000000000000000000000000000000000000000000000000060648201526084016108cd565b6112703383611f5d565b5050565b600080600e8054806020026020016040519081016040528092919081815260200182805480156112c357602002820191906000526020600020905b8154815260200190600101908083116112af575b505050505090506000610100846112da9190612fc8565b905060008282815181106112f0576112f0612f0e565b602002602001015190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810361132c57506001949350505050565b600061133a61010087612fdc565b6001901b91909116151595945050505050565b6060600380546108f690612ed4565b806009548161136e6001546000540390565b6113789190612f9a565b11156113ec5760405162461bcd60e51b815260206004820152602b60248201527f496e73756666696369656e7420746f6b656e732072656d61696e696e6720696e60448201527f20636f6c6c656374696f6e00000000000000000000000000000000000000000060648201526084016108cd565b600d54610100900460ff166114435760405162461bcd60e51b815260206004820152601760248201527f4d696e74696e67206973206e6f74206f70656e2079657400000000000000000060448201526064016108cd565b600c546114509083612ff0565b3410156112665760405162461bcd60e51b815260206004820152601b60248201527f496e73756666696369656e74207061796d656e7420616d6f756e74000000000060448201526064016108cd565b336001600160a01b038316036114e1576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611558848484611b45565b6001600160a01b0383163b1515801561157a575061157884848484611f77565b155b15611598576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6008546001600160a01b031633146115e65760405162461bcd60e51b815260206004820181905260248201526000805160206131a083398151915260448201526064016108cd565b600a55565b6008546001600160a01b031633146116335760405162461bcd60e51b815260206004820181905260248201526000805160206131a083398151915260448201526064016108cd565b6009548111156116ab5760405162461bcd60e51b815260206004820152603f60248201527f43616e6e6f74207365742066726565206d696e7420737570706c7920746f206260448201527f6520686967686572207468616e20636f6c6c656374696f6e20737570706c790060648201526084016108cd565b600b55565b60606116bb826119c0565b6116f1576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d5460ff168015611709575061170782611274565b155b1561174057600f61171983612063565b60405160200161172a9291906130a8565b6040516020818303038152906040529050919050565b600d5460ff168015611756575061175682611274565b1561176657601061171983612063565b600f60405160200161172a91906130cd565b919050565b6008546001600160a01b031633146117c55760405162461bcd60e51b815260206004820181905260248201526000805160206131a083398151915260448201526064016108cd565b6108e2600f83836129e4565b6008546001600160a01b031633146118195760405162461bcd60e51b815260206004820181905260248201526000805160206131a083398151915260448201526064016108cd565b6001600160a01b0381166118955760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016108cd565b610e4d81611efe565b6008546001600160a01b031633146118e65760405162461bcd60e51b815260206004820181905260248201526000805160206131a083398151915260448201526064016108cd565b600c55565b6008546001600160a01b031633146119335760405162461bcd60e51b815260206004820181905260248201526000805160206131a083398151915260448201526064016108cd565b6101006009546119439190612fc8565b61194e906001612f9a565b67ffffffffffffffff81111561196657611966612daf565b60405190808252806020026020018201604052801561198f578160200160208202803683370190505b508051610e4d91600e91602090910190612a68565b6040518060600160405280604081526020016131606040913981565b6000805482108015610883575050600090815260046020526040902054600160e01b900460ff161590565b600082815260066020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600083604051602001611a6991815260200190565b604051602081830303815290604052805190602001209050611a8c818484612198565b6115985760405162461bcd60e51b815260206004820152601160248201527f496e76616c6964207369676e617475726500000000000000000000000000000060448201526064016108cd565b600e6000611ae861010084612fc8565b90506000828281548110611afe57611afe612f0e565b60009182526020822001549150611b1761010086612fdc565b9050806001901b8217848481548110611b3257611b32612f0e565b6000918252602090912001555050505050565b6000611b5082611dc9565b9050836001600160a01b031681600001516001600160a01b031614611ba1576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000336001600160a01b0386161480611bbf5750611bbf8533610754565b80611bda575033611bcf84610979565b6001600160a01b0316145b905080611bfa57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416611c3a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c46600084876119eb565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116611d1c576000548214611d1c578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610c8b565b610e4d816001612246565b600e6000611d8061010084612fc8565b90506000828281548110611d9657611d96612f0e565b60009182526020822001549150611daf61010086612fdc565b8454909150600090859085908110611b3257611b32612f0e565b604080516060810182526000808252602082018190529181019190915281600054811015611ecc57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff16151591810182905290611eca5780516001600160a01b031615611e60579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff1615159281019290925215611ec5579392505050565b611e60565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61127082826040518060200160405280600081525061243c565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611fac9033908990889088906004016130d9565b6020604051808303816000875af1925050508015611fe7575060408051601f3d908101601f19168201909252611fe491810190613115565b60015b612045573d808015612015576040519150601f19603f3d011682016040523d82523d6000602084013e61201a565b606091505b50805160000361203d576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060816000036120a657505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156120d057806120ba81612f81565b91506120c99050600a83612fc8565b91506120aa565b60008167ffffffffffffffff8111156120eb576120eb612daf565b6040519080825280601f01601f191660200182016040528015612115576020820181803683370190505b5090505b841561205b5761212a600183613132565b9150612137600a86612fdc565b612142906030612f9a565b60f81b81838151811061215757612157612f0e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612191600a86612fc8565b9450612119565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018490526000908190605c0160408051601f198184030181528282528051602091820120601154601f880183900483028501830190935286845293506001600160a01b039091169161223391879087908190840183828082843760009201919091525086939250506124499050565b6001600160a01b03161495945050505050565b600061225183611dc9565b805190915082156122b7576000336001600160a01b038316148061227a575061227a8233610754565b8061229557503361228a86610979565b6001600160a01b0316145b9050806122b557604051632ce44b5f60e11b815260040160405180910390fd5b505b6122c3600085836119eb565b6001600160a01b038082166000818152600560209081526040808320805470010000000000000000000000000000000060001967ffffffffffffffff80841691909101811667ffffffffffffffff19841681178390048216600190810183169093027fffffffffffffffff0000000000000000ffffffffffffffff0000000000000000909416179290921783558b8652600490945282852080547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff42909316600160a01b026001600160e01b03199091169097179690961716600160e01b1785559189018084529220805491949091166123f25760005482146123f2578054602087015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038716171781555b5050604051869250600091506001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a4505060018054810190555050565b6108e2838383600161246d565b60008060006124588585612681565b91509150612465816126ef565b509392505050565b6000546001600160a01b0385166124b0576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836000036124ea576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000811667ffffffffffffffff8083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b4290921691909102179055808085018380156125ab57506001600160a01b0387163b15155b15612633575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46125fc6000888480600101955088611f77565b612619576040516368d2bf6b60e11b815260040160405180910390fd5b8082036125b157826000541461262e57600080fd5b612678565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808203612634575b50600055610c8b565b60008082516041036126b75760208301516040840151606085015160001a6126ab878285856128a5565b945094505050506126e8565b82516040036126e057602083015160408401516126d5868383612992565b9350935050506126e8565b506000905060025b9250929050565b600081600481111561270357612703613149565b0361270b5750565b600181600481111561271f5761271f613149565b0361276c5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016108cd565b600281600481111561278057612780613149565b036127cd5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016108cd565b60038160048111156127e1576127e1613149565b036128395760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016108cd565b600481600481111561284d5761284d613149565b03610e4d5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016108cd565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156128dc5750600090506003612989565b8460ff16601b141580156128f457508460ff16601c14155b156129055750600090506004612989565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612959573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661298257600060019250925050612989565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316816129c860ff86901c601b612f9a565b90506129d6878288856128a5565b935093505050935093915050565b8280546129f090612ed4565b90600052602060002090601f016020900481019282612a125760008555612a58565b82601f10612a2b5782800160ff19823516178555612a58565b82800160010185558215612a58579182015b82811115612a58578235825591602001919060010190612a3d565b50612a64929150612aa3565b5090565b828054828255906000526020600020908101928215612a58579160200282015b82811115612a58578251825591602001919060010190612a88565b5b80821115612a645760008155600101612aa4565b6001600160e01b031981168114610e4d57600080fd5b600060208284031215612ae057600080fd5b8135612aeb81612ab8565b9392505050565b60008060208385031215612b0557600080fd5b823567ffffffffffffffff80821115612b1d57600080fd5b818501915085601f830112612b3157600080fd5b813581811115612b4057600080fd5b866020828501011115612b5257600080fd5b60209290920196919550909350505050565b60005b83811015612b7f578181015183820152602001612b67565b838111156115985750506000910152565b60008151808452612ba8816020860160208601612b64565b601f01601f19169290920160200192915050565b602081526000612aeb6020830184612b90565b600060208284031215612be157600080fd5b5035919050565b80356001600160a01b038116811461177857600080fd5b60008060408385031215612c1257600080fd5b612c1b83612be8565b946020939093013593505050565b60008083601f840112612c3b57600080fd5b50813567ffffffffffffffff811115612c5357600080fd5b6020830191508360208260051b85010111156126e857600080fd5b60008060008060408587031215612c8457600080fd5b843567ffffffffffffffff80821115612c9c57600080fd5b612ca888838901612c29565b90965094506020870135915080821115612cc157600080fd5b50612cce87828801612c29565b95989497509550505050565b600080600060608486031215612cef57600080fd5b612cf884612be8565b9250612d0660208501612be8565b9150604084013590509250925092565b600060208284031215612d2857600080fd5b612aeb82612be8565b60008060208385031215612d4457600080fd5b823567ffffffffffffffff811115612d5b57600080fd5b612d6785828601612c29565b90969095509350505050565b60008060408385031215612d8657600080fd5b612d8f83612be8565b915060208301358015158114612da457600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215612ddb57600080fd5b612de485612be8565b9350612df260208601612be8565b925060408501359150606085013567ffffffffffffffff80821115612e1657600080fd5b818701915087601f830112612e2a57600080fd5b813581811115612e3c57612e3c612daf565b604051601f8201601f19908116603f01168101908382118183101715612e6457612e64612daf565b816040528281528a6020848701011115612e7d57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215612eb457600080fd5b612ebd83612be8565b9150612ecb60208401612be8565b90509250929050565b600181811c90821680612ee857607f821691505b602082108103612f0857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112612f3b57600080fd5b83018035915067ffffffffffffffff821115612f5657600080fd5b6020019150368190038213156126e857600080fd5b634e487b7160e01b600052601160045260246000fd5b600060018201612f9357612f93612f6b565b5060010190565b60008219821115612fad57612fad612f6b565b500190565b634e487b7160e01b600052601260045260246000fd5b600082612fd757612fd7612fb2565b500490565b600082612feb57612feb612fb2565b500690565b600081600019048311821515161561300a5761300a612f6b565b500290565b8054600090600181811c908083168061302957607f831692505b6020808410820361304a57634e487b7160e01b600052602260045260246000fd5b81801561305e576001811461306f5761309c565b60ff1986168952848901965061309c565b60008881526020902060005b868110156130945781548b82015290850190830161307b565b505084890196505b50505050505092915050565b60006130b4828561300f565b83516130c4818360208801612b64565b01949350505050565b6000612aeb828461300f565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261310b6080830184612b90565b9695505050505050565b60006020828403121561312757600080fd5b8151612aeb81612ab8565b60008282101561314457613144612f6b565b500390565b634e487b7160e01b600052602160045260246000fdfe353041453242313036413535443235334542464245463733353535314246334534464533463738433936313832303443463342453637373539354233303736384f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212209c04d666a8a8d775f9d04be6a55f52503289185d0f607df6b7b440156dca4a5564736f6c634300080d0033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000022b80000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d615335644e67564d677262754c64656f33787158796735657352785a755446527456396632325936637634360000000000000000000000

-----Decoded View---------------
Arg [0] : initialURI (string): ipfs://QmaS5dNgVMgrbuLdeo3xqXyg5esRxZuTFRtV9f22Y6cv46
Arg [1] : _MAX_TOKENS (uint256): 8888

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000000000000000000000000000000000000000022b8
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [3] : 697066733a2f2f516d615335644e67564d677262754c64656f33787158796735
Arg [4] : 657352785a755446527456396632325936637634360000000000000000000000


Deployed Bytecode Sourcemap

143:6427:11:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4437:305:4;;;;;;;;;;-1:-1:-1;4437:305:4;;;;;:::i;:::-;;:::i;:::-;;;611:14:13;;604:22;586:41;;574:2;559:18;4437:305:4;;;;;;;;3684:135:11;;;;;;;;;;-1:-1:-1;3684:135:11;;;;;:::i;:::-;;:::i;:::-;;7550:100:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;9053:204::-;;;;;;;;;;-1:-1:-1;9053:204:4;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2335:55:13;;;2317:74;;2305:2;2290:18;9053:204:4;2171:226:13;409:30:11;;;;;;;;;;;;;;;;;;;2548:25:13;;;2536:2;2521:18;409:30:11;2402:177:13;8616:371:4;;;;;;;;;;-1:-1:-1;8616:371:4;;;;;:::i;:::-;;:::i;4602:96:11:-;;;;;;;;;;;;;:::i;1785:458::-;;;;;;;;;;-1:-1:-1;1785:458:11;;;;;:::i;:::-;;:::i;3686:303:4:-;;;;;;;;;;-1:-1:-1;3940:12:4;;3730:7;3924:13;:28;3686:303;;9918:170;;;;;;;;;;-1:-1:-1;9918:170:4;;;;;:::i;:::-;;:::i;3945:218:11:-;;;;;;;;;;-1:-1:-1;3945:218:11;;;;;:::i;:::-;;:::i;3827:110::-;;;;;;;;;;-1:-1:-1;3827:110:11;;;;;:::i;:::-;;:::i;4900:109::-;;;;;;;;;;;;;:::i;10159:185:4:-;;;;;;;;;;-1:-1:-1;10159:185:4;;;;;:::i;:::-;;:::i;4800:92:11:-;;;;;;;;;;-1:-1:-1;4800:92:11;;;;;:::i;:::-;;:::i;2251:268::-;;;;;;;;;;-1:-1:-1;2251:268:11;;;;;:::i;:::-;;:::i;548:22::-;;;;;;;;;;-1:-1:-1;548:22:11;;;;;;;;4706:86;;;;;;;;;;;;;:::i;609:29::-;;;;;;;;;;-1:-1:-1;609:29:11;;;;;:::i;:::-;;:::i;7358:125:4:-;;;;;;;;;;-1:-1:-1;7358:125:4;;;;;:::i;:::-;;:::i;486:41:11:-;;;;;;;;;;;;;;;;374:28;;;;;;;;;;;;;;;;4806:206:4;;;;;;;;;;-1:-1:-1;4806:206:4;;;;;:::i;:::-;;:::i;1714:103:10:-;;;;;;;;;;;;;:::i;1487:290:11:-;;;;;;;;;;-1:-1:-1;1487:290:11;;;;;:::i;:::-;;:::i;1063:87:10:-;;;;;;;;;;-1:-1:-1;1136:6:10;;-1:-1:-1;;;;;1136:6:10;1063:87;;5017:412:11;;;;;;;;;;-1:-1:-1;5017:412:11;;;;;:::i;:::-;;:::i;7719:104:4:-;;;;;;;;;;;;;:::i;1221:258:11:-;;;;;;:::i;:::-;;:::i;9329:287:4:-;;;;;;;;;;-1:-1:-1;9329:287:4;;;;;:::i;:::-;;:::i;10415:369::-;;;;;;;;;;-1:-1:-1;10415:369:4;;;;;:::i;:::-;;:::i;4171:99:11:-;;;;;;;;;;-1:-1:-1;4171:99:11;;;;;:::i;:::-;;:::i;577:23::-;;;;;;;;;;-1:-1:-1;577:23:11;;;;;;;;;;;4278:217;;;;;;;;;;-1:-1:-1;4278:217:11;;;;;:::i;:::-;;:::i;3061:504::-;;;;;;;;;;-1:-1:-1;3061:504:11;;;;;:::i;:::-;;:::i;3573:103::-;;;;;;;;;;-1:-1:-1;3573:103:11;;;;;:::i;:::-;;:::i;446:33::-;;;;;;;;;;;;;;;;9687:164:4;;;;;;;;;;-1:-1:-1;9687:164:4;;;;;:::i;:::-;-1:-1:-1;;;;;9808:25:4;;;9784:4;9808:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;9687:164;1972:201:10;;;;;;;;;;-1:-1:-1;1972:201:10;;;;;:::i;:::-;;:::i;4503:91:11:-;;;;;;;;;;-1:-1:-1;4503:91:11;;;;;:::i;:::-;;:::i;6079:120::-;;;;;;;;;;;;;:::i;258:107::-;;;;;;;;;;;;;:::i;4437:305:4:-;4539:4;-1:-1:-1;;;;;;4576:40:4;;4591:25;4576:40;;:105;;-1:-1:-1;;;;;;;4633:48:4;;4648:33;4633:48;4576:105;:158;;;-1:-1:-1;978:25:3;-1:-1:-1;;;;;;963:40:3;;;4698:36:4;4556:178;4437:305;-1:-1:-1;;4437:305:4:o;3684:135:11:-;1136:6:10;;-1:-1:-1;;;;;1136:6:10;736:10:1;1283:23:10;1275:68;;;;-1:-1:-1;;;1275:68:10;;7322:2:13;1275:68:10;;;7304:21:13;;;7341:18;;;7334:30;-1:-1:-1;;;;;;;;;;;7380:18:13;;;7373:62;7452:18;;1275:68:10;;;;;;;;;3779:32:11::1;:14;3796:15:::0;;3779:32:::1;:::i;:::-;;3684:135:::0;;:::o;7550:100:4:-;7604:13;7637:5;7630:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7550:100;:::o;9053:204::-;9121:7;9146:16;9154:7;9146;:16::i;:::-;9141:64;;9171:34;;;;;;;;;;;;;;9141:64;-1:-1:-1;9225:24:4;;;;:15;:24;;;;;;-1:-1:-1;;;;;9225:24:4;;9053:204::o;8616:371::-;8689:13;8705:24;8721:7;8705:15;:24::i;:::-;8689:40;;8750:5;-1:-1:-1;;;;;8744:11:4;:2;-1:-1:-1;;;;;8744:11:4;;8740:48;;8764:24;;;;;;;;;;;;;;8740:48;736:10:1;-1:-1:-1;;;;;8805:21:4;;;;;;:63;;-1:-1:-1;8831:37:4;8848:5;736:10:1;9687:164:4;:::i;8831:37::-;8830:38;8805:63;8801:138;;;8892:35;;;;;;;;;;;;;;8801:138;8951:28;8960:2;8964:7;8973:5;8951:8;:28::i;4602:96:11:-;1136:6:10;;-1:-1:-1;;;;;1136:6:10;736:10:1;1283:23:10;1275:68;;;;-1:-1:-1;;;1275:68:10;;7322:2:13;1275:68:10;;;7304:21:13;;;7341:18;;;7334:30;-1:-1:-1;;;;;;;;;;;7380:18:13;;;7373:62;7452:18;;1275:68:10;7120:356:13;1275:68:10;4679:11:11::1;::::0;;-1:-1:-1;;4664:26:11;::::1;4679:11;::::0;;;::::1;;;4678:12;4664:26:::0;;::::1;;::::0;;4602:96::o;1785:458::-;1888:36;;;1880:84;;;;-1:-1:-1;;;1880:84:11;;8125:2:13;1880:84:11;;;8107:21:13;8164:2;8144:18;;;8137:30;8203:34;8183:18;;;8176:62;8274:5;8254:18;;;8247:33;8297:19;;1880:84:11;7923:399:13;1880:84:11;1980:6;1975:261;1992:19;;;1975:261;;;2065:10;2041:20;2049:8;;2058:1;2049:11;;;;;;;:::i;:::-;;;;;;;2041:7;:20::i;:::-;-1:-1:-1;;;;;2041:34:11;;2033:84;;;;-1:-1:-1;;;2033:84:11;;8718:2:13;2033:84:11;;;8700:21:13;8757:2;8737:18;;;8730:30;8796:34;8776:18;;;8769:62;8867:7;8847:18;;;8840:35;8892:19;;2033:84:11;8516:401:13;2033:84:11;2132:54;2159:8;;2168:1;2159:11;;;;;;;:::i;:::-;;;;;;;2172:10;;2183:1;2172:13;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;2132:26;:54::i;:::-;2201:23;2212:8;;2221:1;2212:11;;;;;;;:::i;:::-;;;;;;;2201:10;:23::i;:::-;2013:3;;;;:::i;:::-;;;;1975:261;;;;1785:458;;;;:::o;9918:170:4:-;10052:28;10062:4;10068:2;10072:7;10052:9;:28::i;3945:218:11:-;1136:6:10;;-1:-1:-1;;;;;1136:6:10;736:10:1;1283:23:10;1275:68;;;;-1:-1:-1;;;1275:68:10;;7322:2:13;1275:68:10;;;7304:21:13;;;7341:18;;;7334:30;-1:-1:-1;;;;;;;;;;;7380:18:13;;;7373:62;7452:18;;1275:68:10;7120:356:13;1275:68:10;4037:14:11::1;;4026:7;:25;;4018:100;;;::::0;-1:-1:-1;;;4018:100:11;;9979:2:13;4018:100:11::1;::::0;::::1;9961:21:13::0;10018:2;9998:18;;;9991:30;10057:34;10037:18;;;10030:62;10128:32;10108:18;;;10101:60;10178:19;;4018:100:11::1;9777:426:13::0;4018:100:11::1;4129:16;:26:::0;3945:218::o;3827:110::-;1136:6:10;;-1:-1:-1;;;;;1136:6:10;736:10:1;1283:23:10;1275:68;;;;-1:-1:-1;;;1275:68:10;;7322:2:13;1275:68:10;;;7304:21:13;;;7341:18;;;7334:30;-1:-1:-1;;;;;;;;;;;7380:18:13;;;7373:62;7452:18;;1275:68:10;7120:356:13;1275:68:10;3903:15:11::1;:26:::0;;-1:-1:-1;;3903:26:11::1;-1:-1:-1::0;;;;;3903:26:11;;;::::1;::::0;;;::::1;::::0;;3827:110::o;4900:109::-;1136:6:10;;-1:-1:-1;;;;;1136:6:10;736:10:1;1283:23:10;1275:68;;;;-1:-1:-1;;;1275:68:10;;7322:2:13;1275:68:10;;;7304:21:13;;;7341:18;;;7334:30;-1:-1:-1;;;;;;;;;;;7380:18:13;;;7373:62;7452:18;;1275:68:10;7120:356:13;1275:68:10;4950:51:11::1;::::0;4958:10:::1;::::0;4979:21:::1;4950:51:::0;::::1;;;::::0;::::1;::::0;;;4979:21;4958:10;4950:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;4900:109::o:0;10159:185:4:-;10297:39;10314:4;10320:2;10324:7;10297:39;;;;;;;;;;;;:16;:39::i;4800:92:11:-;1136:6:10;;-1:-1:-1;;;;;1136:6:10;736:10:1;1283:23:10;1275:68;;;;-1:-1:-1;;;1275:68:10;;7322:2:13;1275:68:10;;;7304:21:13;;;7341:18;;;7334:30;-1:-1:-1;;;;;;;;;;;7380:18:13;;;7373:62;7452:18;;1275:68:10;7120:356:13;1275:68:10;4865:19:11::1;4876:7;4865:10;:19::i;2251:268::-:0;2324:6;2319:193;2336:19;;;2319:193;;;2409:10;2385:20;2393:8;;2402:1;2393:11;;;;;;;:::i;2385:20::-;-1:-1:-1;;;;;2385:34:11;;2377:83;;;;-1:-1:-1;;;2377:83:11;;10410:2:13;2377:83:11;;;10392:21:13;10449:2;10429:18;;;10422:30;10488:34;10468:18;;;10461:62;10559:6;10539:18;;;10532:34;10583:19;;2377:83:11;10208:400:13;2377:83:11;2475:25;2488:8;;2497:1;2488:11;;;;;;;:::i;:::-;;;;;;;2475:12;:25::i;:::-;2357:3;;;;:::i;:::-;;;;2319:193;;4706:86;1136:6:10;;-1:-1:-1;;;;;1136:6:10;736:10:1;1283:23:10;1275:68;;;;-1:-1:-1;;;1275:68:10;;7322:2:13;1275:68:10;;;7304:21:13;;;7341:18;;;7334:30;-1:-1:-1;;;;;;;;;;;7380:18:13;;;7373:62;7452:18;;1275:68:10;7120:356:13;1275:68:10;4774:10:11::1;::::0;;-1:-1:-1;;4760:24:11;::::1;4774:10;::::0;;::::1;4773:11;4760:24;::::0;;4706:86::o;609:29::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;609:29:11;:::o;7358:125:4:-;7422:7;7449:21;7462:7;7449:12;:21::i;:::-;:26;;7358:125;-1:-1:-1;;7358:125:4:o;4806:206::-;4870:7;-1:-1:-1;;;;;4894:19:4;;4890:60;;4922:28;;;;;;;;;;;;;;4890:60;-1:-1:-1;;;;;;4976:19:4;;;;;:12;:19;;;;;:27;;;;4806:206::o;1714:103:10:-;1136:6;;-1:-1:-1;;;;;1136:6:10;736:10:1;1283:23:10;1275:68;;;;-1:-1:-1;;;1275:68:10;;7322:2:13;1275:68:10;;;7304:21:13;;;7341:18;;;7334:30;-1:-1:-1;;;;;;;;;;;7380:18:13;;;7373:62;7452:18;;1275:68:10;7120:356:13;1275:68:10;1779:30:::1;1806:1;1779:18;:30::i;:::-;1714:103::o:0;1487:290:11:-;1554:3;6481:14;;6473:3;6457:13;3940:12:4;;3730:7;3924:13;:28;;3686:303;6457:13:11;:19;;;;:::i;:::-;6456:39;;6448:99;;;;-1:-1:-1;;;6448:99:11;;10948:2:13;6448:99:11;;;10930:21:13;10987:2;10967:18;;;10960:30;11026:34;11006:18;;;10999:62;11097:17;11077:18;;;11070:45;11132:19;;6448:99:11;10746:411:13;6448:99:11;1578:11:::1;::::0;::::1;::::0;::::1;;;1570:47;;;::::0;-1:-1:-1;;;1570:47:11;;11364:2:13;1570:47:11::1;::::0;::::1;11346:21:13::0;11403:2;11383:18;;;11376:30;11442:25;11422:18;;;11415:53;11485:18;;1570:47:11::1;11162:347:13::0;1570:47:11::1;1673:13;::::0;1651:10:::1;5155:7:4::0;5190:19;;;:12;:19;;;;;:32;1665:3:11;;5190:32:4;;;;;1637:31:11::1;;;;:::i;:::-;1636:50;;1628:102;;;::::0;-1:-1:-1;;;1628:102:11;;11716:2:13;1628:102:11::1;::::0;::::1;11698:21:13::0;11755:2;11735:18;;;11728:30;11794:34;11774:18;;;11767:62;11865:9;11845:18;;;11838:37;11892:19;;1628:102:11::1;11514:403:13::0;1628:102:11::1;1743:26;1753:10;1765:3;1743:9;:26::i;:::-;1487:290:::0;;:::o;5017:412::-;5071:4;5088:24;5115:15;5088:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5141:19;5173:3;5163:7;:13;;;;:::i;:::-;5141:35;;5187:14;5204:10;5215:14;5204:26;;;;;;;;:::i;:::-;;;;;;;5187:43;;5258:7;5245:9;:20;5241:64;;-1:-1:-1;5289:4:11;;5017:412;-1:-1:-1;;;;5017:412:11:o;5241:64::-;5315:13;5331;5341:3;5331:7;:13;:::i;:::-;5379:1;:13;;5366:27;;;;5412:8;;;5017:412;-1:-1:-1;;;;;5017:412:11:o;7719:104:4:-;7775:13;7808:7;7801:14;;;;;:::i;1221:258:11:-;1288:3;6296:16;;6288:3;6272:13;3940:12:4;;3730:7;3924:13;:28;;3686:303;6272:13:11;:19;;;;:::i;:::-;6271:41;;6263:97;;;;-1:-1:-1;;;6263:97:11;;12555:2:13;6263:97:11;;;12537:21:13;12594:2;12574:18;;;12567:30;12633:34;12613:18;;;12606:62;12704:13;12684:18;;;12677:41;12735:19;;6263:97:11;12353:407:13;6263:97:11;1312:11:::1;::::0;::::1;::::0;::::1;;;1304:47;;;::::0;-1:-1:-1;;;1304:47:11;;11364:2:13;1304:47:11::1;::::0;::::1;11346:21:13::0;11403:2;11383:18;;;11376:30;11442:25;11422:18;;;11415:53;11485:18;;1304:47:11::1;11162:347:13::0;1304:47:11::1;1390:9;::::0;1384:15:::1;::::0;:3;:15:::1;:::i;:::-;1370:9;:30;;1362:70;;;::::0;-1:-1:-1;;;1362:70:11;;13140:2:13;1362:70:11::1;::::0;::::1;13122:21:13::0;13179:2;13159:18;;;13152:30;13218:29;13198:18;;;13191:57;13265:18;;1362:70:11::1;12938:351:13::0;9329:287:4;736:10:1;-1:-1:-1;;;;;9428:24:4;;;9424:54;;9461:17;;;;;;;;;;;;;;9424:54;736:10:1;9491:32:4;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;9491:42:4;;;;;;;;;;;;:53;;-1:-1:-1;;9491:53:4;;;;;;;;;;9560:48;;586:41:13;;;9491:42:4;;736:10:1;9560:48:4;;559:18:13;9560:48:4;;;;;;;9329:287;;:::o;10415:369::-;10582:28;10592:4;10598:2;10602:7;10582:9;:28::i;:::-;-1:-1:-1;;;;;10625:13:4;;1505:19:0;:23;;10625:76:4;;;;;10645:56;10676:4;10682:2;10686:7;10695:5;10645:30;:56::i;:::-;10644:57;10625:76;10621:156;;;10725:40;;-1:-1:-1;;;10725:40:4;;;;;;;;;;;10621:156;10415:369;;;;:::o;4171:99:11:-;1136:6:10;;-1:-1:-1;;;;;1136:6:10;736:10:1;1283:23:10;1275:68;;;;-1:-1:-1;;;1275:68:10;;7322:2:13;1275:68:10;;;7304:21:13;;;7341:18;;;7334:30;-1:-1:-1;;;;;;;;;;;7380:18:13;;;7373:62;7452:18;;1275:68:10;7120:356:13;1275:68:10;4240:13:11::1;:22:::0;4171:99::o;4278:217::-;1136:6:10;;-1:-1:-1;;;;;1136:6:10;736:10:1;1283:23:10;1275:68;;;;-1:-1:-1;;;1275:68:10;;7322:2:13;1275:68:10;;;7304:21:13;;;7341:18;;;7334:30;-1:-1:-1;;;;;;;;;;;7380:18:13;;;7373:62;7452:18;;1275:68:10;7120:356:13;1275:68:10;4368:16:11::1;;4357:7;:27;;4349:103;;;::::0;-1:-1:-1;;;4349:103:11;;13496:2:13;4349:103:11::1;::::0;::::1;13478:21:13::0;13535:2;13515:18;;;13508:30;13574:34;13554:18;;;13547:62;13645:33;13625:18;;;13618:61;13696:19;;4349:103:11::1;13294:427:13::0;4349:103:11::1;4463:14;:24:::0;4278:217::o;3061:504::-;3123:13;3154:16;3162:7;3154;:16::i;:::-;3149:59;;3179:29;;;;;;;;;;;;;;3149:59;3225:10;;;;:33;;;;;3240:18;3250:7;3240:9;:18::i;:::-;3239:19;3225:33;3221:337;;;3306:7;3315:18;:7;:16;:18::i;:::-;3289:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3275:60;;3061:504;;;:::o;3221:337::-;3357:10;;;;:32;;;;;3371:18;3381:7;3371:9;:18::i;:::-;3353:205;;;3437:14;3453:18;:7;:16;:18::i;3353:205::-;3537:7;3520:25;;;;;;;;:::i;3353:205::-;3061:504;;;:::o;3573:103::-;1136:6:10;;-1:-1:-1;;;;;1136:6:10;736:10:1;1283:23:10;1275:68;;;;-1:-1:-1;;;1275:68:10;;7322:2:13;1275:68:10;;;7304:21:13;;;7341:18;;;7334:30;-1:-1:-1;;;;;;;;;;;7380:18:13;;;7373:62;7452:18;;1275:68:10;7120:356:13;1275:68:10;3650:18:11::1;:7;3660:8:::0;;3650:18:::1;:::i;1972:201:10:-:0;1136:6;;-1:-1:-1;;;;;1136:6:10;736:10:1;1283:23:10;1275:68;;;;-1:-1:-1;;;1275:68:10;;7322:2:13;1275:68:10;;;7304:21:13;;;7341:18;;;7334:30;-1:-1:-1;;;;;;;;;;;7380:18:13;;;7373:62;7452:18;;1275:68:10;7120:356:13;1275:68:10;-1:-1:-1;;;;;2061:22:10;::::1;2053:73;;;::::0;-1:-1:-1;;;2053:73:10;;15672:2:13;2053:73:10::1;::::0;::::1;15654:21:13::0;15711:2;15691:18;;;15684:30;15750:34;15730:18;;;15723:62;15821:8;15801:18;;;15794:36;15847:19;;2053:73:10::1;15470:402:13::0;2053:73:10::1;2137:28;2156:8;2137:18;:28::i;4503:91:11:-:0;1136:6:10;;-1:-1:-1;;;;;1136:6:10;736:10:1;1283:23:10;1275:68;;;;-1:-1:-1;;;1275:68:10;;7322:2:13;1275:68:10;;;7304:21:13;;;7341:18;;;7334:30;-1:-1:-1;;;;;;;;;;;7380:18:13;;;7373:62;7452:18;;1275:68:10;7120:356:13;1275:68:10;4568:9:11::1;:18:::0;4503:91::o;6079:120::-;1136:6:10;;-1:-1:-1;;;;;1136:6:10;736:10:1;1283:23:10;1275:68;;;;-1:-1:-1;;;1275:68:10;;7322:2:13;1275:68:10;;;7304:21:13;;;7341:18;;;7334:30;-1:-1:-1;;;;;;;;;;;7380:18:13;;;7373:62;7452:18;;1275:68:10;7120:356:13;1275:68:10;6182:3:11::1;6163:16;;:22;;;;:::i;:::-;6162:28;::::0;6189:1:::1;6162:28;:::i;:::-;6151:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;6151:40:11::1;-1:-1:-1::0;6133:58:11;;::::1;::::0;:15:::1;::::0;:58:::1;::::0;;::::1;::::0;::::1;:::i;258:107::-:0;;;;;;;;;;;;;;;;;;;:::o;11039:174:4:-;11096:4;11160:13;;11150:7;:23;11120:85;;;;-1:-1:-1;;11178:20:4;;;;:11;:20;;;;;:27;-1:-1:-1;;;11178:27:4;;;;11177:28;;11039:174::o;19196:196::-;19311:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;19311:29:4;-1:-1:-1;;;;;19311:29:4;;;;;;;;;19356:28;;19311:24;;19356:28;;;;;;;19196:196;;;:::o;2813:240:11:-;2914:15;2959:7;2942:25;;;;;;16006:19:13;;16050:2;16041:12;;15877:182;2942:25:11;;;;;;;;;;;;;2932:36;;;;;;2914:54;;2987:36;3004:7;3013:9;;2987:16;:36::i;:::-;2979:66;;;;-1:-1:-1;;;2979:66:11;;16266:2:13;2979:66:11;;;16248:21:13;16305:2;16285:18;;;16278:30;16344:19;16324:18;;;16317:47;16381:18;;2979:66:11;16064:341:13;5437:312:11;5519:15;5491:25;5567:13;5577:3;5567:7;:13;:::i;:::-;5545:35;;5591:14;5608:10;5619:14;5608:26;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;5661:13:11;5671:3;5661:7;:13;:::i;:::-;5645:29;;5732:8;5727:1;:13;;5714:9;:27;5685:10;5696:14;5685:26;;;;;;;;:::i;:::-;;;;;;;;;;:56;-1:-1:-1;;;;;5437:312:11:o;14139:2130:4:-;14254:35;14292:21;14305:7;14292:12;:21::i;:::-;14254:59;;14352:4;-1:-1:-1;;;;;14330:26:4;:13;:18;;;-1:-1:-1;;;;;14330:26:4;;14326:67;;14365:28;;;;;;;;;;;;;;14326:67;14406:22;736:10:1;-1:-1:-1;;;;;14432:20:4;;;;:73;;-1:-1:-1;14469:36:4;14486:4;736:10:1;9687:164:4;:::i;14469:36::-;14432:126;;;-1:-1:-1;736:10:1;14522:20:4;14534:7;14522:11;:20::i;:::-;-1:-1:-1;;;;;14522:36:4;;14432:126;14406:153;;14577:17;14572:66;;14603:35;;-1:-1:-1;;;14603:35:4;;;;;;;;;;;14572:66;-1:-1:-1;;;;;14653:16:4;;14649:52;;14678:23;;;;;;;;;;;;;;14649:52;14822:35;14839:1;14843:7;14852:4;14822:8;:35::i;:::-;-1:-1:-1;;;;;15153:18:4;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;15153:31:4;;;;;;;-1:-1:-1;;15153:31:4;;;;;;;15199:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;15199:29:4;;;;;;;;;;;15279:20;;;:11;:20;;;;;;15314:18;;-1:-1:-1;;;;;;15347:49:4;;;;-1:-1:-1;;;15380:15:4;15347:49;;;;;;;;;;15670:11;;15730:24;;;;;15773:13;;15279:20;;15730:24;;15773:13;15769:384;;15983:13;;15968:11;:28;15964:174;;16021:20;;16090:28;;;;16064:54;;-1:-1:-1;;;16064:54:4;-1:-1:-1;;;;;;16064:54:4;;;-1:-1:-1;;;;;16021:20:4;;16064:54;;;;15964:174;15128:1036;;;16200:7;16196:2;-1:-1:-1;;;;;16181:27:4;16190:4;-1:-1:-1;;;;;16181:27:4;;;;;;;;;;;16219:42;10415:369;452:85:5;509:20;515:7;524:4;509:5;:20::i;5757:314:11:-;5841:15;5813:25;5889:13;5899:3;5889:7;:13;:::i;:::-;5867:35;;5913:14;5930:10;5941:14;5930:26;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;5983:13:11;5993:3;5983:7;:13;:::i;:::-;6007:26;;5967:29;;-1:-1:-1;6049:1:11;;6007:10;;6018:14;;6007:26;;;;;;:::i;6187:1109:4:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;6298:7:4;6381:13;;6374:4;:20;6343:886;;;6415:31;6449:17;;;:11;:17;;;;;;;;;6415:51;;;;;;;;;-1:-1:-1;;;;;6415:51:4;;;;-1:-1:-1;;;6415:51:4;;;;;;;;;;;-1:-1:-1;;;6415:51:4;;;;;;;;;;;;;;6485:729;;6535:14;;-1:-1:-1;;;;;6535:28:4;;6531:101;;6599:9;6187:1109;-1:-1:-1;;;6187:1109:4:o;6531:101::-;-1:-1:-1;;;6974:6:4;7019:17;;;;:11;:17;;;;;;;;;7007:29;;;;;;;;;-1:-1:-1;;;;;7007:29:4;;;;;-1:-1:-1;;;7007:29:4;;;;;;;;;;;-1:-1:-1;;;7007:29:4;;;;;;;;;;;;;7067:28;7063:109;;7135:9;6187:1109;-1:-1:-1;;;6187:1109:4:o;7063:109::-;6934:261;;;6396:833;6343:886;7257:31;;;;;;;;;;;;;;2333:191:10;2426:6;;;-1:-1:-1;;;;;2443:17:10;;;-1:-1:-1;;2443:17:10;;;;;;;2476:40;;2426:6;;;2443:17;2426:6;;2476:40;;2407:16;;2476:40;2396:128;2333:191;:::o;11221:104:4:-;11290:27;11300:2;11304:8;11290:27;;;;;;;;;;;;:9;:27::i;19884:667::-;20068:72;;-1:-1:-1;;;20068:72:4;;20047:4;;-1:-1:-1;;;;;20068:36:4;;;;;:72;;736:10:1;;20119:4:4;;20125:7;;20134:5;;20068:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20068:72:4;;;;;;;;-1:-1:-1;;20068:72:4;;;;;;;;;;;;:::i;:::-;;;20064:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20302:6;:13;20319:1;20302:18;20298:235;;20348:40;;-1:-1:-1;;;20348:40:4;;;;;;;;;;;20298:235;20491:6;20485:13;20476:6;20472:2;20468:15;20461:38;20064:480;-1:-1:-1;;;;;;20187:55:4;-1:-1:-1;;;20187:55:4;;-1:-1:-1;20064:480:4;19884:667;;;;;;:::o;342:723:12:-;398:13;619:5;628:1;619:10;615:53;;-1:-1:-1;;646:10:12;;;;;;;;;;;;;;;;;;342:723::o;615:53::-;693:5;678:12;734:78;741:9;;734:78;;767:8;;;;:::i;:::-;;-1:-1:-1;790:10:12;;-1:-1:-1;798:2:12;790:10;;:::i;:::-;;;734:78;;;822:19;854:6;844:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;844:17:12;;822:39;;872:154;879:10;;872:154;;906:11;916:1;906:11;;:::i;:::-;;-1:-1:-1;975:10:12;983:2;975:5;:10;:::i;:::-;962:24;;:2;:24;:::i;:::-;949:39;;932:6;939;932:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;1003:11:12;1012:2;1003:11;;:::i;:::-;;;872:154;;2527:278:11;2672:58;;17553:66:13;2672:58:11;;;17541:79:13;17636:12;;;17629:28;;;2616:12:11;;;;17673::13;;2672:58:11;;;-1:-1:-1;;2672:58:11;;;;;;;;;2662:69;;2672:58;2662:69;;;;2782:15;;2749:29;;;;;;;;;;;;;;;;;;2662:69;-1:-1:-1;;;;;;2782:15:11;;;;2749:29;;2768:9;;;;;;2749:29;;2768:9;;;;2749:29;;;;;;;;;-1:-1:-1;2749:10:11;;:29;-1:-1:-1;;2749:18:11;:29;-1:-1:-1;2749:29:11:i;:::-;-1:-1:-1;;;;;2749:48:11;;;2527:278;-1:-1:-1;;;;;2527:278:11:o;16670:2408:4:-;16750:35;16788:21;16801:7;16788:12;:21::i;:::-;16837:18;;16750:59;;-1:-1:-1;16868:290:4;;;;16902:22;736:10:1;-1:-1:-1;;;;;16928:20:4;;;;:77;;-1:-1:-1;16969:36:4;16986:4;736:10:1;9687:164:4;:::i;16969:36::-;16928:134;;;-1:-1:-1;736:10:1;17026:20:4;17038:7;17026:11;:20::i;:::-;-1:-1:-1;;;;;17026:36:4;;16928:134;16902:161;;17085:17;17080:66;;17111:35;;-1:-1:-1;;;17111:35:4;;;;;;;;;;;17080:66;16887:271;16868:290;17286:35;17303:1;17307:7;17316:4;17286:8;:35::i;:::-;-1:-1:-1;;;;;17651:18:4;;;17617:31;17651:18;;;:12;:18;;;;;;;;17684:24;;17723:29;-1:-1:-1;;17684:24:4;;;;;;;;;;-1:-1:-1;;17684:24:4;;;;17723:29;;;;;17707:1;17723:29;;;;;;;;;;;;;;;;;;;17885:20;;;:11;:20;;;;;;17920;;18019:22;17988:15;17955:49;;;-1:-1:-1;;;17955:49:4;-1:-1:-1;;;;;;17955:49:4;;;;;;;;;;18019:22;-1:-1:-1;;;18019:22:4;;;18311:11;;;18371:24;;;;;18414:13;;17651:18;;18371:24;;18414:13;18410:384;;18624:13;;18609:11;:28;18605:174;;18662:20;;18731:28;;;;18705:54;;-1:-1:-1;;;18705:54:4;-1:-1:-1;;;;;;18705:54:4;;;-1:-1:-1;;;;;18662:20:4;;18705:54;;;;18605:174;-1:-1:-1;;18822:35:4;;18849:7;;-1:-1:-1;18845:1:4;;-1:-1:-1;;;;;;18822:35:4;;;;;18845:1;;18822:35;-1:-1:-1;;19045:12:4;:14;;;;;;-1:-1:-1;;16670:2408:4:o;11688:163::-;11811:32;11817:2;11821:8;11831:5;11838:4;11811:5;:32::i;4408:231:2:-;4486:7;4507:17;4526:18;4548:27;4559:4;4565:9;4548:10;:27::i;:::-;4506:69;;;;4586:18;4598:5;4586:11;:18::i;:::-;-1:-1:-1;4622:9:2;4408:231;-1:-1:-1;;;4408:231:2:o;12110:1775:4:-;12249:20;12272:13;-1:-1:-1;;;;;12300:16:4;;12296:48;;12325:19;;;;;;;;;;;;;;12296:48;12359:8;12371:1;12359:13;12355:44;;12381:18;;;;;;;;;;;;;;12355:44;-1:-1:-1;;;;;12750:16:4;;;;;;:12;:16;;;;;;;;:44;;12809:49;;;12750:44;;;;;;;;12809:49;;;;-1:-1:-1;;12750:44:4;;;;;;12809:49;;;;;;;;;;;;;;;;12875:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;12925:66:4;;;;-1:-1:-1;;;12975:15:4;12925:66;;;;;;;;;;12875:25;13072:23;;;13116:4;:23;;;;-1:-1:-1;;;;;;13124:13:4;;1505:19:0;:23;;13124:15:4;13112:641;;;13160:314;13191:38;;13216:12;;-1:-1:-1;;;;;13191:38:4;;;13208:1;;13191:38;;13208:1;;13191:38;13257:69;13296:1;13300:2;13304:14;;;;;;13320:5;13257:30;:69::i;:::-;13252:174;;13362:40;;-1:-1:-1;;;13362:40:4;;;;;;;;;;;13252:174;13469:3;13453:12;:19;13160:314;;13555:12;13538:13;;:29;13534:43;;13569:8;;;13534:43;13112:641;;;13618:120;13649:40;;13674:14;;;;;-1:-1:-1;;;;;13649:40:4;;;13666:1;;13649:40;;13666:1;;13649:40;13733:3;13717:12;:19;13618:120;;13112:641;-1:-1:-1;13767:13:4;:28;13817:60;10415:369;2298:1308:2;2379:7;2388:12;2613:9;:16;2633:2;2613:22;2609:990;;2909:4;2894:20;;2888:27;2959:4;2944:20;;2938:27;3017:4;3002:20;;2996:27;2652:9;2988:36;3060:25;3071:4;2988:36;2888:27;2938;3060:10;:25::i;:::-;3053:32;;;;;;;;;2609:990;3107:9;:16;3127:2;3107:22;3103:496;;3382:4;3367:20;;3361:27;3433:4;3418:20;;3412:27;3475:23;3486:4;3361:27;3412;3475:10;:23::i;:::-;3468:30;;;;;;;;3103:496;-1:-1:-1;3547:1:2;;-1:-1:-1;3551:35:2;3103:496;2298:1308;;;;;:::o;569:643::-;647:20;638:5;:29;;;;;;;;:::i;:::-;;634:571;;569:643;:::o;634:571::-;745:29;736:5;:38;;;;;;;;:::i;:::-;;732:473;;791:34;;-1:-1:-1;;;791:34:2;;18087:2:13;791:34:2;;;18069:21:13;18126:2;18106:18;;;18099:30;18165:26;18145:18;;;18138:54;18209:18;;791:34:2;17885:348:13;732:473:2;856:35;847:5;:44;;;;;;;;:::i;:::-;;843:362;;908:41;;-1:-1:-1;;;908:41:2;;18440:2:13;908:41:2;;;18422:21:13;18479:2;18459:18;;;18452:30;18518:33;18498:18;;;18491:61;18569:18;;908:41:2;18238:355:13;843:362:2;980:30;971:5;:39;;;;;;;;:::i;:::-;;967:238;;1027:44;;-1:-1:-1;;;1027:44:2;;18800:2:13;1027:44:2;;;18782:21:13;18839:2;18819:18;;;18812:30;18878:34;18858:18;;;18851:62;-1:-1:-1;;;18929:18:13;;;18922:32;18971:19;;1027:44:2;18598:398:13;967:238:2;1102:30;1093:5;:39;;;;;;;;:::i;:::-;;1089:116;;1149:44;;-1:-1:-1;;;1149:44:2;;19203:2:13;1149:44:2;;;19185:21:13;19242:2;19222:18;;;19215:30;19281:34;19261:18;;;19254:62;-1:-1:-1;;;19332:18:13;;;19325:32;19374:19;;1149:44:2;19001:398:13;5860:1632:2;5991:7;;6925:66;6912:79;;6908:163;;;-1:-1:-1;7024:1:2;;-1:-1:-1;7028:30:2;7008:51;;6908:163;7085:1;:7;;7090:2;7085:7;;:18;;;;;7096:1;:7;;7101:2;7096:7;;7085:18;7081:102;;;-1:-1:-1;7136:1:2;;-1:-1:-1;7140:30:2;7120:51;;7081:102;7297:24;;;7280:14;7297:24;;;;;;;;;19631:25:13;;;19704:4;19692:17;;19672:18;;;19665:45;;;;19726:18;;;19719:34;;;19769:18;;;19762:34;;;7297:24:2;;19603:19:13;;7297:24:2;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7297:24:2;;-1:-1:-1;;7297:24:2;;;-1:-1:-1;;;;;;;7336:20:2;;7332:103;;7389:1;7393:29;7373:50;;;;;;;7332:103;7455:6;-1:-1:-1;7463:20:2;;-1:-1:-1;5860:1632:2;;;;;;;;:::o;4902:344::-;5016:7;;5075:66;5062:80;;5016:7;5169:25;5185:3;5170:18;;;5192:2;5169:25;:::i;:::-;5153:42;;5213:25;5224:4;5230:1;5233;5236;5213:10;:25::i;:::-;5206:32;;;;;;4902:344;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:177:13;-1:-1:-1;;;;;;92:5:13;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;:::-;430:5;196:245;-1:-1:-1;;;196:245:13:o;638:592::-;709:6;717;770:2;758:9;749:7;745:23;741:32;738:52;;;786:1;783;776:12;738:52;826:9;813:23;855:18;896:2;888:6;885:14;882:34;;;912:1;909;902:12;882:34;950:6;939:9;935:22;925:32;;995:7;988:4;984:2;980:13;976:27;966:55;;1017:1;1014;1007:12;966:55;1057:2;1044:16;1083:2;1075:6;1072:14;1069:34;;;1099:1;1096;1089:12;1069:34;1144:7;1139:2;1130:6;1126:2;1122:15;1118:24;1115:37;1112:57;;;1165:1;1162;1155:12;1112:57;1196:2;1188:11;;;;;1218:6;;-1:-1:-1;638:592:13;;-1:-1:-1;;;;638:592:13:o;1235:258::-;1307:1;1317:113;1331:6;1328:1;1325:13;1317:113;;;1407:11;;;1401:18;1388:11;;;1381:39;1353:2;1346:10;1317:113;;;1448:6;1445:1;1442:13;1439:48;;;-1:-1:-1;;1483:1:13;1465:16;;1458:27;1235:258::o;1498:::-;1540:3;1578:5;1572:12;1605:6;1600:3;1593:19;1621:63;1677:6;1670:4;1665:3;1661:14;1654:4;1647:5;1643:16;1621:63;:::i;:::-;1738:2;1717:15;-1:-1:-1;;1713:29:13;1704:39;;;;1745:4;1700:50;;1498:258;-1:-1:-1;;1498:258:13:o;1761:220::-;1910:2;1899:9;1892:21;1873:4;1930:45;1971:2;1960:9;1956:18;1948:6;1930:45;:::i;1986:180::-;2045:6;2098:2;2086:9;2077:7;2073:23;2069:32;2066:52;;;2114:1;2111;2104:12;2066:52;-1:-1:-1;2137:23:13;;1986:180;-1:-1:-1;1986:180:13:o;2584:196::-;2652:20;;-1:-1:-1;;;;;2701:54:13;;2691:65;;2681:93;;2770:1;2767;2760:12;2785:254;2853:6;2861;2914:2;2902:9;2893:7;2889:23;2885:32;2882:52;;;2930:1;2927;2920:12;2882:52;2953:29;2972:9;2953:29;:::i;:::-;2943:39;3029:2;3014:18;;;;3001:32;;-1:-1:-1;;;2785:254:13:o;3044:367::-;3107:8;3117:6;3171:3;3164:4;3156:6;3152:17;3148:27;3138:55;;3189:1;3186;3179:12;3138:55;-1:-1:-1;3212:20:13;;3255:18;3244:30;;3241:50;;;3287:1;3284;3277:12;3241:50;3324:4;3316:6;3312:17;3300:29;;3384:3;3377:4;3367:6;3364:1;3360:14;3352:6;3348:27;3344:38;3341:47;3338:67;;;3401:1;3398;3391:12;3416:784;3549:6;3557;3565;3573;3626:2;3614:9;3605:7;3601:23;3597:32;3594:52;;;3642:1;3639;3632:12;3594:52;3682:9;3669:23;3711:18;3752:2;3744:6;3741:14;3738:34;;;3768:1;3765;3758:12;3738:34;3807:70;3869:7;3860:6;3849:9;3845:22;3807:70;:::i;:::-;3896:8;;-1:-1:-1;3781:96:13;-1:-1:-1;3984:2:13;3969:18;;3956:32;;-1:-1:-1;4000:16:13;;;3997:36;;;4029:1;4026;4019:12;3997:36;;4068:72;4132:7;4121:8;4110:9;4106:24;4068:72;:::i;:::-;3416:784;;;;-1:-1:-1;4159:8:13;-1:-1:-1;;;;3416:784:13:o;4205:328::-;4282:6;4290;4298;4351:2;4339:9;4330:7;4326:23;4322:32;4319:52;;;4367:1;4364;4357:12;4319:52;4390:29;4409:9;4390:29;:::i;:::-;4380:39;;4438:38;4472:2;4461:9;4457:18;4438:38;:::i;:::-;4428:48;;4523:2;4512:9;4508:18;4495:32;4485:42;;4205:328;;;;;:::o;4538:186::-;4597:6;4650:2;4638:9;4629:7;4625:23;4621:32;4618:52;;;4666:1;4663;4656:12;4618:52;4689:29;4708:9;4689:29;:::i;4729:437::-;4815:6;4823;4876:2;4864:9;4855:7;4851:23;4847:32;4844:52;;;4892:1;4889;4882:12;4844:52;4932:9;4919:23;4965:18;4957:6;4954:30;4951:50;;;4997:1;4994;4987:12;4951:50;5036:70;5098:7;5089:6;5078:9;5074:22;5036:70;:::i;:::-;5125:8;;5010:96;;-1:-1:-1;4729:437:13;-1:-1:-1;;;;4729:437:13:o;5171:347::-;5236:6;5244;5297:2;5285:9;5276:7;5272:23;5268:32;5265:52;;;5313:1;5310;5303:12;5265:52;5336:29;5355:9;5336:29;:::i;:::-;5326:39;;5415:2;5404:9;5400:18;5387:32;5462:5;5455:13;5448:21;5441:5;5438:32;5428:60;;5484:1;5481;5474:12;5428:60;5507:5;5497:15;;;5171:347;;;;;:::o;5523:184::-;-1:-1:-1;;;5572:1:13;5565:88;5672:4;5669:1;5662:15;5696:4;5693:1;5686:15;5712:1138;5807:6;5815;5823;5831;5884:3;5872:9;5863:7;5859:23;5855:33;5852:53;;;5901:1;5898;5891:12;5852:53;5924:29;5943:9;5924:29;:::i;:::-;5914:39;;5972:38;6006:2;5995:9;5991:18;5972:38;:::i;:::-;5962:48;;6057:2;6046:9;6042:18;6029:32;6019:42;;6112:2;6101:9;6097:18;6084:32;6135:18;6176:2;6168:6;6165:14;6162:34;;;6192:1;6189;6182:12;6162:34;6230:6;6219:9;6215:22;6205:32;;6275:7;6268:4;6264:2;6260:13;6256:27;6246:55;;6297:1;6294;6287:12;6246:55;6333:2;6320:16;6355:2;6351;6348:10;6345:36;;;6361:18;;:::i;:::-;6436:2;6430:9;6404:2;6490:13;;-1:-1:-1;;6486:22:13;;;6510:2;6482:31;6478:40;6466:53;;;6534:18;;;6554:22;;;6531:46;6528:72;;;6580:18;;:::i;:::-;6620:10;6616:2;6609:22;6655:2;6647:6;6640:18;6695:7;6690:2;6685;6681;6677:11;6673:20;6670:33;6667:53;;;6716:1;6713;6706:12;6667:53;6772:2;6767;6763;6759:11;6754:2;6746:6;6742:15;6729:46;6817:1;6812:2;6807;6799:6;6795:15;6791:24;6784:35;6838:6;6828:16;;;;;;;5712:1138;;;;;;;:::o;6855:260::-;6923:6;6931;6984:2;6972:9;6963:7;6959:23;6955:32;6952:52;;;7000:1;6997;6990:12;6952:52;7023:29;7042:9;7023:29;:::i;:::-;7013:39;;7071:38;7105:2;7094:9;7090:18;7071:38;:::i;:::-;7061:48;;6855:260;;;;;:::o;7481:437::-;7560:1;7556:12;;;;7603;;;7624:61;;7678:4;7670:6;7666:17;7656:27;;7624:61;7731:2;7723:6;7720:14;7700:18;7697:38;7694:218;;-1:-1:-1;;;7765:1:13;7758:88;7869:4;7866:1;7859:15;7897:4;7894:1;7887:15;7694:218;;7481:437;;;:::o;8327:184::-;-1:-1:-1;;;8376:1:13;8369:88;8476:4;8473:1;8466:15;8500:4;8497:1;8490:15;8922:521;8999:4;9005:6;9065:11;9052:25;9159:2;9155:7;9144:8;9128:14;9124:29;9120:43;9100:18;9096:68;9086:96;;9178:1;9175;9168:12;9086:96;9205:33;;9257:20;;;-1:-1:-1;9300:18:13;9289:30;;9286:50;;;9332:1;9329;9322:12;9286:50;9365:4;9353:17;;-1:-1:-1;9396:14:13;9392:27;;;9382:38;;9379:58;;;9433:1;9430;9423:12;9448:184;-1:-1:-1;;;9497:1:13;9490:88;9597:4;9594:1;9587:15;9621:4;9618:1;9611:15;9637:135;9676:3;9697:17;;;9694:43;;9717:18;;:::i;:::-;-1:-1:-1;9764:1:13;9753:13;;9637:135::o;10613:128::-;10653:3;10684:1;10680:6;10677:1;10674:13;10671:39;;;10690:18;;:::i;:::-;-1:-1:-1;10726:9:13;;10613:128::o;11922:184::-;-1:-1:-1;;;11971:1:13;11964:88;12071:4;12068:1;12061:15;12095:4;12092:1;12085:15;12111:120;12151:1;12177;12167:35;;12182:18;;:::i;:::-;-1:-1:-1;12216:9:13;;12111:120::o;12236:112::-;12268:1;12294;12284:35;;12299:18;;:::i;:::-;-1:-1:-1;12333:9:13;;12236:112::o;12765:168::-;12805:7;12871:1;12867;12863:6;12859:14;12856:1;12853:21;12848:1;12841:9;12834:17;12830:45;12827:71;;;12878:18;;:::i;:::-;-1:-1:-1;12918:9:13;;12765:168::o;13852:1030::-;13937:12;;13902:3;;13992:1;14012:18;;;;14065;;;;14092:61;;14146:4;14138:6;14134:17;14124:27;;14092:61;14172:2;14220;14212:6;14209:14;14189:18;14186:38;14183:218;;-1:-1:-1;;;14254:1:13;14247:88;14358:4;14355:1;14348:15;14386:4;14383:1;14376:15;14183:218;14417:18;14444:104;;;;14562:1;14557:319;;;;14410:466;;14444:104;-1:-1:-1;;14477:24:13;;14465:37;;14522:16;;;;-1:-1:-1;14444:104:13;;14557:319;13799:1;13792:14;;;13836:4;13823:18;;14651:1;14665:165;14679:6;14676:1;14673:13;14665:165;;;14757:14;;14744:11;;;14737:35;14800:16;;;;14694:10;;14665:165;;;14669:3;;14859:6;14854:3;14850:16;14843:23;;14410:466;;;;;;;13852:1030;;;;:::o;14887:376::-;15063:3;15091:38;15125:3;15117:6;15091:38;:::i;:::-;15158:6;15152:13;15174:52;15219:6;15215:2;15208:4;15200:6;15196:17;15174:52;:::i;:::-;15242:15;;14887:376;-1:-1:-1;;;;14887:376:13:o;15268:197::-;15396:3;15421:38;15455:3;15447:6;15421:38;:::i;16410:512::-;16604:4;-1:-1:-1;;;;;16714:2:13;16706:6;16702:15;16691:9;16684:34;16766:2;16758:6;16754:15;16749:2;16738:9;16734:18;16727:43;;16806:6;16801:2;16790:9;16786:18;16779:34;16849:3;16844:2;16833:9;16829:18;16822:31;16870:46;16911:3;16900:9;16896:19;16888:6;16870:46;:::i;:::-;16862:54;16410:512;-1:-1:-1;;;;;;16410:512:13:o;16927:249::-;16996:6;17049:2;17037:9;17028:7;17024:23;17020:32;17017:52;;;17065:1;17062;17055:12;17017:52;17097:9;17091:16;17116:30;17140:5;17116:30;:::i;17181:125::-;17221:4;17249:1;17246;17243:8;17240:34;;;17254:18;;:::i;:::-;-1:-1:-1;17291:9:13;;17181:125::o;17696:184::-;-1:-1:-1;;;17745:1:13;17738:88;17845:4;17842:1;17835:15;17869:4;17866:1;17859:15

Swarm Source

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