ETH Price: $3,024.97 (-6.22%)
Gas: 8 Gwei

Token

Pokedots (PKD)
 

Overview

Max Total Supply

1,364 PKD

Holders

150

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 PKD
0x1BCC053177aB963a6e684AA37Cb2bC123d2EcEAD
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:
Pokedots_Contract

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-03-25
*/

// File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol)
// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.

pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 *
 * [WARNING]
 * ====
 * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure
 * unusable.
 * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
 *
 * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an
 * array of EnumerableSet.
 * ====
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastValue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastValue;
                // Update the index for the moved value
                set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        bytes32[] memory store = _values(set._inner);
        bytes32[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }
}

// File: contracts/IOperatorFilterRegistry.sol


pragma solidity ^0.8.13;


interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}
// File: contracts/OperatorFilterer.sol


pragma solidity ^0.8.13;


contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry constant operatorFilterRegistry =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(operatorFilterRegistry).code.length > 0) {
            if (subscribe) {
                operatorFilterRegistry.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    operatorFilterRegistry.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    operatorFilterRegistry.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator() virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(operatorFilterRegistry).code.length > 0) {
            if (!operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender)) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }
}
// File: contracts/DefaultOperatorFilterer.sol


pragma solidity ^0.8.13;


contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}
// File: contracts/Pokedots.sol

/**
 *Submitted for verification at Etherscan.io on 2023-02-23
*/

/**
 *Submitted for verification at Etherscan.io on 2022-12-09
*/

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/interfaces/IERC2981.sol


// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

// File: @openzeppelin/contracts/token/common/ERC2981.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;



/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}

// File: annunakis.sol

/**
 *Submitted for verification at Etherscan.io on 2022-09-13
*/


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


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

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */

// File: contracts/rose.sol

/**
 *Submitted for verification at Etherscan.io on 2022-07-22
*/



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

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */

abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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


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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.6.0) (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 `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

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


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

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */

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


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

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

// File: ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;








error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error 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 1;
    }

    /**
     * @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: Contract.sol


pragma solidity ^0.8.7;

contract Pokedots_Contract is ERC721A, ERC2981, Ownable, ReentrancyGuard,DefaultOperatorFilterer {
    using Strings for uint256;
    mapping(address => uint256) public publicClaimed;

    string public baseURI;
    string public hiddenMetadataURI = "ipfs://bafkreihnpjkud5jloy4wsevz32go7mvm2p27iogxidl6sxk5pxvchao6bq/";
    bool public revealed;
    bool public paused = true;
    address public ROYALITY__ADDRESS;
    uint96 public ROYALITY__VALUE;
    uint256 public publicPrice = 0.0055 ether;
    uint256 public publicMintPerTx = 50;
    uint256 public maxSupply = 5555;

    constructor() ERC721A("Pokedots", "PKD") {
        ROYALITY__ADDRESS = msg.sender;
        ROYALITY__VALUE = 440;
        _setDefaultRoyalty(ROYALITY__ADDRESS, ROYALITY__VALUE);
        
    }

     

    // ============ PUBLIC FUNCTIONS FOR MINTING ============
    function mint(uint256 quantity) external payable nonReentrant {
        require(!paused, "The contract is paused!");
        require(quantity > 0 && totalSupply() + quantity <= maxSupply, "Invalid amount!");
        require(publicClaimed[msg.sender] + quantity <= publicMintPerTx, "You can't mint this amount");
        if (publicClaimed[msg.sender] == 0)
        require(msg.value >= publicPrice * (quantity-1), "Insufficient Funds!");
        else
             require(msg.value >= publicPrice * quantity, "Insufficient Funds!");
         publicClaimed[msg.sender] += quantity;
        _safeMint(msg.sender, quantity);
    }

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


    // ============ PUBLIC READ-ONLY FUNCTIONS ============

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );
        string memory currentBaseURI = _baseURI();
         if (revealed == false)
                return hiddenMetadataURI;
        return
            bytes(currentBaseURI).length > 0
                ? string(
                    abi.encodePacked(
                        currentBaseURI,
                        tokenId.toString(),
                        ".json"
                    )
                )
                : "";
    }
    function supportsInterface(bytes4 interfaceId)
    public
    view
    override(ERC721A, ERC2981)
    returns (bool)
    {
        return
            ERC721A.supportsInterface(interfaceId)
            || ERC2981.supportsInterface(interfaceId);
    }
   
    function setRoyalties(address receiver, uint96 royaltyFraction) external onlyOwner {
        _setDefaultRoyalty(receiver, royaltyFraction);
    }
   
   
    function setCost(uint256 _newPublicCost) external onlyOwner {
        publicPrice = _newPublicCost;
    }
   
 
    function setMaxPublic(uint256 _newMaxPublic) external onlyOwner {
        publicMintPerTx = _newMaxPublic;
    }

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

   function setRevealed(bool _state) external onlyOwner {
        revealed = _state;
    }

    function setPaused(bool _state) external onlyOwner {
        paused = _state;
    }

    function setBaseURI(string memory _newBaseURI) external onlyOwner {
        baseURI = _newBaseURI;
    }
   
    function airDrop(uint256 quantity, address _address) external onlyOwner {
        _safeMint(_address, quantity);
    }
    

    function airDropBatch(address[] memory _addresses) external onlyOwner {
        for(uint256 i = 0 ;i < _addresses.length; i ++) {
            _safeMint(_addresses[i], 1);
        }
    }

    function setHiddenMetadataURI(string memory _URI) external onlyOwner {
        hiddenMetadataURI = _URI;
    }

    function withdraw() public onlyOwner {
         // Do not remove this otherwise you will not be able to withdraw the funds.
        // =============================================================================
        (bool ts, ) = payable(owner()).call{value: address(this).balance}("");
        require(ts);
        // =============================================================================
    }

    function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
        public
        override
        onlyAllowedOperator
    {
        super.safeTransferFrom(from, to, tokenId, data);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","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"},{"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":"ROYALITY__ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROYALITY__VALUE","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"_address","type":"address"}],"name":"airDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"airDropBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"publicClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPublicCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_URI","type":"string"}],"name":"setHiddenMetadataURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxPublic","type":"uint256"}],"name":"setMaxPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"royaltyFraction","type":"uint96"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060800160405280604381526020016200581c60439139600e90816200002e919062000912565b506001600f60016101000a81548160ff02191690831515021790555066138a388a43c00060115560326012556115b36013553480156200006d57600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600881526020017f506f6b65646f74730000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f504b440000000000000000000000000000000000000000000000000000000000815250816002908162000102919062000912565b50806003908162000114919062000912565b50620001256200041460201b60201c565b60008190555050506200014d620001416200041d60201b60201c565b6200042560201b60201c565b6001600b8190555060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200034a57801562000210576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620001d692919062000a3e565b600060405180830381600087803b158015620001f157600080fd5b505af115801562000206573d6000803e3d6000fd5b5050505062000349565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620002ca576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200029092919062000a3e565b600060405180830381600087803b158015620002ab57600080fd5b505af1158015620002c0573d6000803e3d6000fd5b5050505062000348565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b815260040162000313919062000a6b565b600060405180830381600087803b1580156200032e57600080fd5b505af115801562000343573d6000803e3d6000fd5b505050505b5b5b505033600f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506101b8601060006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055506200040e600f60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a90046bffffffffffffffffffffffff16620004eb60201b60201c565b62000ba3565b60006001905090565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620004fb6200068e60201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff1611156200055c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005539062000b0f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620005ce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005c59062000b81565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000612710905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200071a57607f821691505b60208210810362000730576200072f620006d2565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200079a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200075b565b620007a686836200075b565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620007f3620007ed620007e784620007be565b620007c8565b620007be565b9050919050565b6000819050919050565b6200080f83620007d2565b620008276200081e82620007fa565b84845462000768565b825550505050565b600090565b6200083e6200082f565b6200084b81848462000804565b505050565b5b8181101562000873576200086760008262000834565b60018101905062000851565b5050565b601f821115620008c2576200088c8162000736565b62000897846200074b565b81016020851015620008a7578190505b620008bf620008b6856200074b565b83018262000850565b50505b505050565b600082821c905092915050565b6000620008e760001984600802620008c7565b1980831691505092915050565b6000620009028383620008d4565b9150826002028217905092915050565b6200091d8262000698565b67ffffffffffffffff811115620009395762000938620006a3565b5b62000945825462000701565b6200095282828562000877565b600060209050601f8311600181146200098a576000841562000975578287015190505b620009818582620008f4565b865550620009f1565b601f1984166200099a8662000736565b60005b82811015620009c4578489015182556001820191506020850194506020810190506200099d565b86831015620009e45784890151620009e0601f891682620008d4565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000a2682620009f9565b9050919050565b62000a388162000a19565b82525050565b600060408201905062000a55600083018562000a2d565b62000a64602083018462000a2d565b9392505050565b600060208201905062000a82600083018462000a2d565b92915050565b600082825260208201905092915050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600062000af7602a8362000a88565b915062000b048262000a99565b604082019050919050565b6000602082019050818103600083015262000b2a8162000ae8565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600062000b6960198362000a88565b915062000b768262000b31565b602082019050919050565b6000602082019050818103600083015262000b9c8162000b5a565b9050919050565b614c698062000bb36000396000f3fe60806040526004361061023b5760003560e01c806370a082311161012e578063b88d4fde116100ab578063e0a808531161006f578063e0a8085314610851578063e985e9c51461087a578063f2fde38b146108b7578063fae1f6e2146108e0578063fbdb8494146109095761023b565b8063b88d4fde1461076c578063ba9e12f714610795578063c21b471b146107c0578063c87b56dd146107e9578063d5abeb01146108265761023b565b8063a0712d68116100f2578063a0712d6814610696578063a22cb465146106b2578063a945bf80146106db578063aed3801514610706578063b5b1cd7c1461072f5761023b565b806370a08231146105c1578063715018a6146105fe5780638da5cb5b1461061557806395d89b41146106405780639a87a46d1461066b5761023b565b80633ccfd60b116101bc57806355f804b31161018057806355f804b3146104dc5780635c975abb146105055780636352211e146105305780636c0360eb1461056d5780636f8b44b0146105985761023b565b80633ccfd60b1461041f57806342842e0e1461043657806344a0d68a1461045f578063512507c61461048857806351830227146104b15761023b565b806316c38b3c1161020357806316c38b3c1461033957806318160ddd146103625780631f32975e1461038d57806323b872dd146103b85780632a55205a146103e15761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063095ea7b3146102e55780630caea53b1461030e575b600080fd5b34801561024c57600080fd5b50610267600480360381019061026291906137b2565b610932565b60405161027491906137fa565b60405180910390f35b34801561028957600080fd5b50610292610954565b60405161029f91906138a5565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca91906138fd565b6109e6565b6040516102dc919061396b565b60405180910390f35b3480156102f157600080fd5b5061030c600480360381019061030791906139b2565b610a62565b005b34801561031a57600080fd5b50610323610b6c565b6040516103309190613a01565b60405180910390f35b34801561034557600080fd5b50610360600480360381019061035b9190613a48565b610b72565b005b34801561036e57600080fd5b50610377610c0b565b6040516103849190613a01565b60405180910390f35b34801561039957600080fd5b506103a2610c22565b6040516103af9190613a9c565b60405180910390f35b3480156103c457600080fd5b506103df60048036038101906103da9190613ab7565b610c40565b005b3480156103ed57600080fd5b5061040860048036038101906104039190613b0a565b610d4c565b604051610416929190613b4a565b60405180910390f35b34801561042b57600080fd5b50610434610f36565b005b34801561044257600080fd5b5061045d60048036038101906104589190613ab7565b611032565b005b34801561046b57600080fd5b50610486600480360381019061048191906138fd565b61113e565b005b34801561049457600080fd5b506104af60048036038101906104aa9190613ca8565b6111c4565b005b3480156104bd57600080fd5b506104c6611253565b6040516104d391906137fa565b60405180910390f35b3480156104e857600080fd5b5061050360048036038101906104fe9190613ca8565b611266565b005b34801561051157600080fd5b5061051a6112f5565b60405161052791906137fa565b60405180910390f35b34801561053c57600080fd5b50610557600480360381019061055291906138fd565b611308565b604051610564919061396b565b60405180910390f35b34801561057957600080fd5b5061058261131e565b60405161058f91906138a5565b60405180910390f35b3480156105a457600080fd5b506105bf60048036038101906105ba91906138fd565b6113ac565b005b3480156105cd57600080fd5b506105e860048036038101906105e39190613cf1565b611432565b6040516105f59190613a01565b60405180910390f35b34801561060a57600080fd5b50610613611501565b005b34801561062157600080fd5b5061062a611589565b604051610637919061396b565b60405180910390f35b34801561064c57600080fd5b506106556115b3565b60405161066291906138a5565b60405180910390f35b34801561067757600080fd5b50610680611645565b60405161068d919061396b565b60405180910390f35b6106b060048036038101906106ab91906138fd565b61166b565b005b3480156106be57600080fd5b506106d960048036038101906106d49190613d1e565b61195e565b005b3480156106e757600080fd5b506106f0611ad5565b6040516106fd9190613a01565b60405180910390f35b34801561071257600080fd5b5061072d60048036038101906107289190613d5e565b611adb565b005b34801561073b57600080fd5b5061075660048036038101906107519190613cf1565b611b65565b6040516107639190613a01565b60405180910390f35b34801561077857600080fd5b50610793600480360381019061078e9190613e3f565b611b7d565b005b3480156107a157600080fd5b506107aa611c8b565b6040516107b791906138a5565b60405180910390f35b3480156107cc57600080fd5b506107e760048036038101906107e29190613eee565b611d19565b005b3480156107f557600080fd5b50610810600480360381019061080b91906138fd565b611da3565b60405161081d91906138a5565b60405180910390f35b34801561083257600080fd5b5061083b611ef9565b6040516108489190613a01565b60405180910390f35b34801561085d57600080fd5b5061087860048036038101906108739190613a48565b611eff565b005b34801561088657600080fd5b506108a1600480360381019061089c9190613f2e565b611f98565b6040516108ae91906137fa565b60405180910390f35b3480156108c357600080fd5b506108de60048036038101906108d99190613cf1565b61202c565b005b3480156108ec57600080fd5b5061090760048036038101906109029190614036565b612123565b005b34801561091557600080fd5b50610930600480360381019061092b91906138fd565b6121e7565b005b600061093d8261226d565b8061094d575061094c8261234f565b5b9050919050565b606060028054610963906140ae565b80601f016020809104026020016040519081016040528092919081815260200182805461098f906140ae565b80156109dc5780601f106109b1576101008083540402835291602001916109dc565b820191906000526020600020905b8154815290600101906020018083116109bf57829003601f168201915b5050505050905090565b60006109f1826123c9565b610a27576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a6d82611308565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ad4576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610af3612417565b73ffffffffffffffffffffffffffffffffffffffff1614158015610b255750610b2381610b1e612417565b611f98565b155b15610b5c576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b6783838361241f565b505050565b60125481565b610b7a612417565b73ffffffffffffffffffffffffffffffffffffffff16610b98611589565b73ffffffffffffffffffffffffffffffffffffffff1614610bee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be59061412b565b60405180910390fd5b80600f60016101000a81548160ff02191690831515021790555050565b6000610c156124d1565b6001546000540303905090565b601060009054906101000a90046bffffffffffffffffffffffff1681565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610d3c576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610cb792919061414b565b6020604051808303816000875af1158015610cd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cfa9190614189565b610d3b57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610d32919061396b565b60405180910390fd5b5b610d478383836124da565b505050565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610ee15760086040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610eeb6124ea565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610f1791906141e5565b610f219190614256565b90508160000151819350935050509250929050565b610f3e612417565b73ffffffffffffffffffffffffffffffffffffffff16610f5c611589565b73ffffffffffffffffffffffffffffffffffffffff1614610fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa99061412b565b60405180910390fd5b6000610fbc611589565b73ffffffffffffffffffffffffffffffffffffffff1647604051610fdf906142b8565b60006040518083038185875af1925050503d806000811461101c576040519150601f19603f3d011682016040523d82523d6000602084013e611021565b606091505b505090508061102f57600080fd5b50565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561112e576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016110a992919061414b565b6020604051808303816000875af11580156110c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ec9190614189565b61112d57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611124919061396b565b60405180910390fd5b5b6111398383836124f4565b505050565b611146612417565b73ffffffffffffffffffffffffffffffffffffffff16611164611589565b73ffffffffffffffffffffffffffffffffffffffff16146111ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b19061412b565b60405180910390fd5b8060118190555050565b6111cc612417565b73ffffffffffffffffffffffffffffffffffffffff166111ea611589565b73ffffffffffffffffffffffffffffffffffffffff1614611240576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112379061412b565b60405180910390fd5b80600e908161124f9190614479565b5050565b600f60009054906101000a900460ff1681565b61126e612417565b73ffffffffffffffffffffffffffffffffffffffff1661128c611589565b73ffffffffffffffffffffffffffffffffffffffff16146112e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d99061412b565b60405180910390fd5b80600d90816112f19190614479565b5050565b600f60019054906101000a900460ff1681565b600061131382612514565b600001519050919050565b600d805461132b906140ae565b80601f0160208091040260200160405190810160405280929190818152602001828054611357906140ae565b80156113a45780601f10611379576101008083540402835291602001916113a4565b820191906000526020600020905b81548152906001019060200180831161138757829003601f168201915b505050505081565b6113b4612417565b73ffffffffffffffffffffffffffffffffffffffff166113d2611589565b73ffffffffffffffffffffffffffffffffffffffff1614611428576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141f9061412b565b60405180910390fd5b8060138190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611499576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611509612417565b73ffffffffffffffffffffffffffffffffffffffff16611527611589565b73ffffffffffffffffffffffffffffffffffffffff161461157d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115749061412b565b60405180910390fd5b61158760006127a3565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546115c2906140ae565b80601f01602080910402602001604051908101604052809291908181526020018280546115ee906140ae565b801561163b5780601f106116105761010080835404028352916020019161163b565b820191906000526020600020905b81548152906001019060200180831161161e57829003601f168201915b5050505050905090565b600f60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6002600b54036116b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a790614597565b60405180910390fd5b6002600b81905550600f60019054906101000a900460ff1615611708576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ff90614603565b60405180910390fd5b60008111801561172c57506013548161171f610c0b565b6117299190614623565b11155b61176b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611762906146a3565b60405180910390fd5b60125481600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117b99190614623565b11156117fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f19061470f565b60405180910390fd5b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054036118a25760018161184e919061472f565b60115461185b91906141e5565b34101561189d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611894906147af565b60405180910390fd5b6118f3565b806011546118b091906141e5565b3410156118f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e9906147af565b60405180910390fd5b5b80600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119429190614623565b925050819055506119533382612869565b6001600b8190555050565b611966612417565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119ca576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006119d7612417565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a84612417565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ac991906137fa565b60405180910390a35050565b60115481565b611ae3612417565b73ffffffffffffffffffffffffffffffffffffffff16611b01611589565b73ffffffffffffffffffffffffffffffffffffffff1614611b57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4e9061412b565b60405180910390fd5b611b618183612869565b5050565b600c6020528060005260406000206000915090505481565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611c79576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611bf492919061414b565b6020604051808303816000875af1158015611c13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c379190614189565b611c7857336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611c6f919061396b565b60405180910390fd5b5b611c8584848484612887565b50505050565b600e8054611c98906140ae565b80601f0160208091040260200160405190810160405280929190818152602001828054611cc4906140ae565b8015611d115780601f10611ce657610100808354040283529160200191611d11565b820191906000526020600020905b815481529060010190602001808311611cf457829003601f168201915b505050505081565b611d21612417565b73ffffffffffffffffffffffffffffffffffffffff16611d3f611589565b73ffffffffffffffffffffffffffffffffffffffff1614611d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8c9061412b565b60405180910390fd5b611d9f8282612903565b5050565b6060611dae826123c9565b611ded576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de490614841565b60405180910390fd5b6000611df7612a98565b905060001515600f60009054906101000a900460ff16151503611ea757600e8054611e21906140ae565b80601f0160208091040260200160405190810160405280929190818152602001828054611e4d906140ae565b8015611e9a5780601f10611e6f57610100808354040283529160200191611e9a565b820191906000526020600020905b815481529060010190602001808311611e7d57829003601f168201915b5050505050915050611ef4565b6000815111611ec55760405180602001604052806000815250611ef0565b80611ecf84612b2a565b604051602001611ee09291906148e9565b6040516020818303038152906040525b9150505b919050565b60135481565b611f07612417565b73ffffffffffffffffffffffffffffffffffffffff16611f25611589565b73ffffffffffffffffffffffffffffffffffffffff1614611f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f729061412b565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612034612417565b73ffffffffffffffffffffffffffffffffffffffff16612052611589565b73ffffffffffffffffffffffffffffffffffffffff16146120a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209f9061412b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612117576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210e9061498a565b60405180910390fd5b612120816127a3565b50565b61212b612417565b73ffffffffffffffffffffffffffffffffffffffff16612149611589565b73ffffffffffffffffffffffffffffffffffffffff161461219f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121969061412b565b60405180910390fd5b60005b81518110156121e3576121d08282815181106121c1576121c06149aa565b5b60200260200101516001612869565b80806121db906149d9565b9150506121a2565b5050565b6121ef612417565b73ffffffffffffffffffffffffffffffffffffffff1661220d611589565b73ffffffffffffffffffffffffffffffffffffffff1614612263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225a9061412b565b60405180910390fd5b8060128190555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061233857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612348575061234782612c8a565b5b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806123c257506123c18261226d565b5b9050919050565b6000816123d46124d1565b111580156123e3575060005482105b8015612410575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6124e5838383612cf4565b505050565b6000612710905090565b61250f83838360405180602001604052806000815250611b7d565b505050565b61251c613703565b60008290508061252a6124d1565b11158015612539575060005481105b1561276c576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161276a57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461264e57809250505061279e565b5b60011561276957818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461276457809250505061279e565b61264f565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6128838282604051806020016040528060008152506131a8565b5050565b612892848484612cf4565b6128b18373ffffffffffffffffffffffffffffffffffffffff166131ba565b80156128c657506128c4848484846131dd565b155b156128fd576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b61290b6124ea565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115612969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296090614a93565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036129d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129cf90614aff565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6060600d8054612aa7906140ae565b80601f0160208091040260200160405190810160405280929190818152602001828054612ad3906140ae565b8015612b205780601f10612af557610100808354040283529160200191612b20565b820191906000526020600020905b815481529060010190602001808311612b0357829003601f168201915b5050505050905090565b606060008203612b71576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c85565b600082905060005b60008214612ba3578080612b8c906149d9565b915050600a82612b9c9190614256565b9150612b79565b60008167ffffffffffffffff811115612bbf57612bbe613b7d565b5b6040519080825280601f01601f191660200182016040528015612bf15781602001600182028036833780820191505090505b5090505b60008514612c7e57600182612c0a919061472f565b9150600a85612c199190614b1f565b6030612c259190614623565b60f81b818381518110612c3b57612c3a6149aa565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c779190614256565b9450612bf5565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000612cff82612514565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d6a576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16612d8b612417565b73ffffffffffffffffffffffffffffffffffffffff161480612dba5750612db985612db4612417565b611f98565b5b80612dff5750612dc8612417565b73ffffffffffffffffffffffffffffffffffffffff16612de7846109e6565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612e38576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612e9e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612eab858585600161332d565b612eb76000848761241f565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361313657600054821461313557878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131a18585856001613333565b5050505050565b6131b58383836001613339565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613203612417565b8786866040518563ffffffff1660e01b81526004016132259493929190614ba5565b6020604051808303816000875af192505050801561326157506040513d601f19601f8201168201806040525081019061325e9190614c06565b60015b6132da573d8060008114613291576040519150601f19603f3d011682016040523d82523d6000602084013e613296565b606091505b5060008151036132d2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036133a5576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084036133df576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6133ec600086838761332d565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156135b657506135b58773ffffffffffffffffffffffffffffffffffffffff166131ba565b5b1561367b575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461362b60008884806001019550886131dd565b613661576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082036135bc57826000541461367657600080fd5b6136e6565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480820361367c575b8160008190555050506136fc6000868387613333565b5050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61378f8161375a565b811461379a57600080fd5b50565b6000813590506137ac81613786565b92915050565b6000602082840312156137c8576137c7613750565b5b60006137d68482850161379d565b91505092915050565b60008115159050919050565b6137f4816137df565b82525050565b600060208201905061380f60008301846137eb565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561384f578082015181840152602081019050613834565b60008484015250505050565b6000601f19601f8301169050919050565b600061387782613815565b6138818185613820565b9350613891818560208601613831565b61389a8161385b565b840191505092915050565b600060208201905081810360008301526138bf818461386c565b905092915050565b6000819050919050565b6138da816138c7565b81146138e557600080fd5b50565b6000813590506138f7816138d1565b92915050565b60006020828403121561391357613912613750565b5b6000613921848285016138e8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006139558261392a565b9050919050565b6139658161394a565b82525050565b6000602082019050613980600083018461395c565b92915050565b61398f8161394a565b811461399a57600080fd5b50565b6000813590506139ac81613986565b92915050565b600080604083850312156139c9576139c8613750565b5b60006139d78582860161399d565b92505060206139e8858286016138e8565b9150509250929050565b6139fb816138c7565b82525050565b6000602082019050613a1660008301846139f2565b92915050565b613a25816137df565b8114613a3057600080fd5b50565b600081359050613a4281613a1c565b92915050565b600060208284031215613a5e57613a5d613750565b5b6000613a6c84828501613a33565b91505092915050565b60006bffffffffffffffffffffffff82169050919050565b613a9681613a75565b82525050565b6000602082019050613ab16000830184613a8d565b92915050565b600080600060608486031215613ad057613acf613750565b5b6000613ade8682870161399d565b9350506020613aef8682870161399d565b9250506040613b00868287016138e8565b9150509250925092565b60008060408385031215613b2157613b20613750565b5b6000613b2f858286016138e8565b9250506020613b40858286016138e8565b9150509250929050565b6000604082019050613b5f600083018561395c565b613b6c60208301846139f2565b9392505050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613bb58261385b565b810181811067ffffffffffffffff82111715613bd457613bd3613b7d565b5b80604052505050565b6000613be7613746565b9050613bf38282613bac565b919050565b600067ffffffffffffffff821115613c1357613c12613b7d565b5b613c1c8261385b565b9050602081019050919050565b82818337600083830152505050565b6000613c4b613c4684613bf8565b613bdd565b905082815260208101848484011115613c6757613c66613b78565b5b613c72848285613c29565b509392505050565b600082601f830112613c8f57613c8e613b73565b5b8135613c9f848260208601613c38565b91505092915050565b600060208284031215613cbe57613cbd613750565b5b600082013567ffffffffffffffff811115613cdc57613cdb613755565b5b613ce884828501613c7a565b91505092915050565b600060208284031215613d0757613d06613750565b5b6000613d158482850161399d565b91505092915050565b60008060408385031215613d3557613d34613750565b5b6000613d438582860161399d565b9250506020613d5485828601613a33565b9150509250929050565b60008060408385031215613d7557613d74613750565b5b6000613d83858286016138e8565b9250506020613d948582860161399d565b9150509250929050565b600067ffffffffffffffff821115613db957613db8613b7d565b5b613dc28261385b565b9050602081019050919050565b6000613de2613ddd84613d9e565b613bdd565b905082815260208101848484011115613dfe57613dfd613b78565b5b613e09848285613c29565b509392505050565b600082601f830112613e2657613e25613b73565b5b8135613e36848260208601613dcf565b91505092915050565b60008060008060808587031215613e5957613e58613750565b5b6000613e678782880161399d565b9450506020613e788782880161399d565b9350506040613e89878288016138e8565b925050606085013567ffffffffffffffff811115613eaa57613ea9613755565b5b613eb687828801613e11565b91505092959194509250565b613ecb81613a75565b8114613ed657600080fd5b50565b600081359050613ee881613ec2565b92915050565b60008060408385031215613f0557613f04613750565b5b6000613f138582860161399d565b9250506020613f2485828601613ed9565b9150509250929050565b60008060408385031215613f4557613f44613750565b5b6000613f538582860161399d565b9250506020613f648582860161399d565b9150509250929050565b600067ffffffffffffffff821115613f8957613f88613b7d565b5b602082029050602081019050919050565b600080fd5b6000613fb2613fad84613f6e565b613bdd565b90508083825260208201905060208402830185811115613fd557613fd4613f9a565b5b835b81811015613ffe5780613fea888261399d565b845260208401935050602081019050613fd7565b5050509392505050565b600082601f83011261401d5761401c613b73565b5b813561402d848260208601613f9f565b91505092915050565b60006020828403121561404c5761404b613750565b5b600082013567ffffffffffffffff81111561406a57614069613755565b5b61407684828501614008565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806140c657607f821691505b6020821081036140d9576140d861407f565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614115602083613820565b9150614120826140df565b602082019050919050565b6000602082019050818103600083015261414481614108565b9050919050565b6000604082019050614160600083018561395c565b61416d602083018461395c565b9392505050565b60008151905061418381613a1c565b92915050565b60006020828403121561419f5761419e613750565b5b60006141ad84828501614174565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006141f0826138c7565b91506141fb836138c7565b9250828202614209816138c7565b915082820484148315176142205761421f6141b6565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614261826138c7565b915061426c836138c7565b92508261427c5761427b614227565b5b828204905092915050565b600081905092915050565b50565b60006142a2600083614287565b91506142ad82614292565b600082019050919050565b60006142c382614295565b9150819050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261432f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826142f2565b61433986836142f2565b95508019841693508086168417925050509392505050565b6000819050919050565b600061437661437161436c846138c7565b614351565b6138c7565b9050919050565b6000819050919050565b6143908361435b565b6143a461439c8261437d565b8484546142ff565b825550505050565b600090565b6143b96143ac565b6143c4818484614387565b505050565b5b818110156143e8576143dd6000826143b1565b6001810190506143ca565b5050565b601f82111561442d576143fe816142cd565b614407846142e2565b81016020851015614416578190505b61442a614422856142e2565b8301826143c9565b50505b505050565b600082821c905092915050565b600061445060001984600802614432565b1980831691505092915050565b6000614469838361443f565b9150826002028217905092915050565b61448282613815565b67ffffffffffffffff81111561449b5761449a613b7d565b5b6144a582546140ae565b6144b08282856143ec565b600060209050601f8311600181146144e357600084156144d1578287015190505b6144db858261445d565b865550614543565b601f1984166144f1866142cd565b60005b82811015614519578489015182556001820191506020850194506020810190506144f4565b868310156145365784890151614532601f89168261443f565b8355505b6001600288020188555050505b505050505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614581601f83613820565b915061458c8261454b565b602082019050919050565b600060208201905081810360008301526145b081614574565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b60006145ed601783613820565b91506145f8826145b7565b602082019050919050565b6000602082019050818103600083015261461c816145e0565b9050919050565b600061462e826138c7565b9150614639836138c7565b9250828201905080821115614651576146506141b6565b5b92915050565b7f496e76616c696420616d6f756e74210000000000000000000000000000000000600082015250565b600061468d600f83613820565b915061469882614657565b602082019050919050565b600060208201905081810360008301526146bc81614680565b9050919050565b7f596f752063616e2774206d696e74207468697320616d6f756e74000000000000600082015250565b60006146f9601a83613820565b9150614704826146c3565b602082019050919050565b60006020820190508181036000830152614728816146ec565b9050919050565b600061473a826138c7565b9150614745836138c7565b925082820390508181111561475d5761475c6141b6565b5b92915050565b7f496e73756666696369656e742046756e64732100000000000000000000000000600082015250565b6000614799601383613820565b91506147a482614763565b602082019050919050565b600060208201905081810360008301526147c88161478c565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061482b602f83613820565b9150614836826147cf565b604082019050919050565b6000602082019050818103600083015261485a8161481e565b9050919050565b600081905092915050565b600061487782613815565b6148818185614861565b9350614891818560208601613831565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006148d3600583614861565b91506148de8261489d565b600582019050919050565b60006148f5828561486c565b9150614901828461486c565b915061490c826148c6565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614974602683613820565b915061497f82614918565b604082019050919050565b600060208201905081810360008301526149a381614967565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006149e4826138c7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614a1657614a156141b6565b5b600182019050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000614a7d602a83613820565b9150614a8882614a21565b604082019050919050565b60006020820190508181036000830152614aac81614a70565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6000614ae9601983613820565b9150614af482614ab3565b602082019050919050565b60006020820190508181036000830152614b1881614adc565b9050919050565b6000614b2a826138c7565b9150614b35836138c7565b925082614b4557614b44614227565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000614b7782614b50565b614b818185614b5b565b9350614b91818560208601613831565b614b9a8161385b565b840191505092915050565b6000608082019050614bba600083018761395c565b614bc7602083018661395c565b614bd460408301856139f2565b8181036060830152614be68184614b6c565b905095945050505050565b600081519050614c0081613786565b92915050565b600060208284031215614c1c57614c1b613750565b5b6000614c2a84828501614bf1565b9150509291505056fea2646970667358221220240ca51bb5893da71806d703c04e9a6a37342f09057889833154a7ddb0b8495264736f6c63430008120033697066733a2f2f6261666b726569686e706a6b7564356a6c6f7934777365767a3332676f376d766d32703237696f677869646c3673786b357078766368616f3662712f

Deployed Bytecode

0x60806040526004361061023b5760003560e01c806370a082311161012e578063b88d4fde116100ab578063e0a808531161006f578063e0a8085314610851578063e985e9c51461087a578063f2fde38b146108b7578063fae1f6e2146108e0578063fbdb8494146109095761023b565b8063b88d4fde1461076c578063ba9e12f714610795578063c21b471b146107c0578063c87b56dd146107e9578063d5abeb01146108265761023b565b8063a0712d68116100f2578063a0712d6814610696578063a22cb465146106b2578063a945bf80146106db578063aed3801514610706578063b5b1cd7c1461072f5761023b565b806370a08231146105c1578063715018a6146105fe5780638da5cb5b1461061557806395d89b41146106405780639a87a46d1461066b5761023b565b80633ccfd60b116101bc57806355f804b31161018057806355f804b3146104dc5780635c975abb146105055780636352211e146105305780636c0360eb1461056d5780636f8b44b0146105985761023b565b80633ccfd60b1461041f57806342842e0e1461043657806344a0d68a1461045f578063512507c61461048857806351830227146104b15761023b565b806316c38b3c1161020357806316c38b3c1461033957806318160ddd146103625780631f32975e1461038d57806323b872dd146103b85780632a55205a146103e15761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063095ea7b3146102e55780630caea53b1461030e575b600080fd5b34801561024c57600080fd5b50610267600480360381019061026291906137b2565b610932565b60405161027491906137fa565b60405180910390f35b34801561028957600080fd5b50610292610954565b60405161029f91906138a5565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca91906138fd565b6109e6565b6040516102dc919061396b565b60405180910390f35b3480156102f157600080fd5b5061030c600480360381019061030791906139b2565b610a62565b005b34801561031a57600080fd5b50610323610b6c565b6040516103309190613a01565b60405180910390f35b34801561034557600080fd5b50610360600480360381019061035b9190613a48565b610b72565b005b34801561036e57600080fd5b50610377610c0b565b6040516103849190613a01565b60405180910390f35b34801561039957600080fd5b506103a2610c22565b6040516103af9190613a9c565b60405180910390f35b3480156103c457600080fd5b506103df60048036038101906103da9190613ab7565b610c40565b005b3480156103ed57600080fd5b5061040860048036038101906104039190613b0a565b610d4c565b604051610416929190613b4a565b60405180910390f35b34801561042b57600080fd5b50610434610f36565b005b34801561044257600080fd5b5061045d60048036038101906104589190613ab7565b611032565b005b34801561046b57600080fd5b50610486600480360381019061048191906138fd565b61113e565b005b34801561049457600080fd5b506104af60048036038101906104aa9190613ca8565b6111c4565b005b3480156104bd57600080fd5b506104c6611253565b6040516104d391906137fa565b60405180910390f35b3480156104e857600080fd5b5061050360048036038101906104fe9190613ca8565b611266565b005b34801561051157600080fd5b5061051a6112f5565b60405161052791906137fa565b60405180910390f35b34801561053c57600080fd5b50610557600480360381019061055291906138fd565b611308565b604051610564919061396b565b60405180910390f35b34801561057957600080fd5b5061058261131e565b60405161058f91906138a5565b60405180910390f35b3480156105a457600080fd5b506105bf60048036038101906105ba91906138fd565b6113ac565b005b3480156105cd57600080fd5b506105e860048036038101906105e39190613cf1565b611432565b6040516105f59190613a01565b60405180910390f35b34801561060a57600080fd5b50610613611501565b005b34801561062157600080fd5b5061062a611589565b604051610637919061396b565b60405180910390f35b34801561064c57600080fd5b506106556115b3565b60405161066291906138a5565b60405180910390f35b34801561067757600080fd5b50610680611645565b60405161068d919061396b565b60405180910390f35b6106b060048036038101906106ab91906138fd565b61166b565b005b3480156106be57600080fd5b506106d960048036038101906106d49190613d1e565b61195e565b005b3480156106e757600080fd5b506106f0611ad5565b6040516106fd9190613a01565b60405180910390f35b34801561071257600080fd5b5061072d60048036038101906107289190613d5e565b611adb565b005b34801561073b57600080fd5b5061075660048036038101906107519190613cf1565b611b65565b6040516107639190613a01565b60405180910390f35b34801561077857600080fd5b50610793600480360381019061078e9190613e3f565b611b7d565b005b3480156107a157600080fd5b506107aa611c8b565b6040516107b791906138a5565b60405180910390f35b3480156107cc57600080fd5b506107e760048036038101906107e29190613eee565b611d19565b005b3480156107f557600080fd5b50610810600480360381019061080b91906138fd565b611da3565b60405161081d91906138a5565b60405180910390f35b34801561083257600080fd5b5061083b611ef9565b6040516108489190613a01565b60405180910390f35b34801561085d57600080fd5b5061087860048036038101906108739190613a48565b611eff565b005b34801561088657600080fd5b506108a1600480360381019061089c9190613f2e565b611f98565b6040516108ae91906137fa565b60405180910390f35b3480156108c357600080fd5b506108de60048036038101906108d99190613cf1565b61202c565b005b3480156108ec57600080fd5b5061090760048036038101906109029190614036565b612123565b005b34801561091557600080fd5b50610930600480360381019061092b91906138fd565b6121e7565b005b600061093d8261226d565b8061094d575061094c8261234f565b5b9050919050565b606060028054610963906140ae565b80601f016020809104026020016040519081016040528092919081815260200182805461098f906140ae565b80156109dc5780601f106109b1576101008083540402835291602001916109dc565b820191906000526020600020905b8154815290600101906020018083116109bf57829003601f168201915b5050505050905090565b60006109f1826123c9565b610a27576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a6d82611308565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ad4576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610af3612417565b73ffffffffffffffffffffffffffffffffffffffff1614158015610b255750610b2381610b1e612417565b611f98565b155b15610b5c576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b6783838361241f565b505050565b60125481565b610b7a612417565b73ffffffffffffffffffffffffffffffffffffffff16610b98611589565b73ffffffffffffffffffffffffffffffffffffffff1614610bee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be59061412b565b60405180910390fd5b80600f60016101000a81548160ff02191690831515021790555050565b6000610c156124d1565b6001546000540303905090565b601060009054906101000a90046bffffffffffffffffffffffff1681565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610d3c576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610cb792919061414b565b6020604051808303816000875af1158015610cd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cfa9190614189565b610d3b57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610d32919061396b565b60405180910390fd5b5b610d478383836124da565b505050565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610ee15760086040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610eeb6124ea565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610f1791906141e5565b610f219190614256565b90508160000151819350935050509250929050565b610f3e612417565b73ffffffffffffffffffffffffffffffffffffffff16610f5c611589565b73ffffffffffffffffffffffffffffffffffffffff1614610fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa99061412b565b60405180910390fd5b6000610fbc611589565b73ffffffffffffffffffffffffffffffffffffffff1647604051610fdf906142b8565b60006040518083038185875af1925050503d806000811461101c576040519150601f19603f3d011682016040523d82523d6000602084013e611021565b606091505b505090508061102f57600080fd5b50565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561112e576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016110a992919061414b565b6020604051808303816000875af11580156110c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ec9190614189565b61112d57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611124919061396b565b60405180910390fd5b5b6111398383836124f4565b505050565b611146612417565b73ffffffffffffffffffffffffffffffffffffffff16611164611589565b73ffffffffffffffffffffffffffffffffffffffff16146111ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b19061412b565b60405180910390fd5b8060118190555050565b6111cc612417565b73ffffffffffffffffffffffffffffffffffffffff166111ea611589565b73ffffffffffffffffffffffffffffffffffffffff1614611240576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112379061412b565b60405180910390fd5b80600e908161124f9190614479565b5050565b600f60009054906101000a900460ff1681565b61126e612417565b73ffffffffffffffffffffffffffffffffffffffff1661128c611589565b73ffffffffffffffffffffffffffffffffffffffff16146112e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d99061412b565b60405180910390fd5b80600d90816112f19190614479565b5050565b600f60019054906101000a900460ff1681565b600061131382612514565b600001519050919050565b600d805461132b906140ae565b80601f0160208091040260200160405190810160405280929190818152602001828054611357906140ae565b80156113a45780601f10611379576101008083540402835291602001916113a4565b820191906000526020600020905b81548152906001019060200180831161138757829003601f168201915b505050505081565b6113b4612417565b73ffffffffffffffffffffffffffffffffffffffff166113d2611589565b73ffffffffffffffffffffffffffffffffffffffff1614611428576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141f9061412b565b60405180910390fd5b8060138190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611499576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611509612417565b73ffffffffffffffffffffffffffffffffffffffff16611527611589565b73ffffffffffffffffffffffffffffffffffffffff161461157d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115749061412b565b60405180910390fd5b61158760006127a3565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546115c2906140ae565b80601f01602080910402602001604051908101604052809291908181526020018280546115ee906140ae565b801561163b5780601f106116105761010080835404028352916020019161163b565b820191906000526020600020905b81548152906001019060200180831161161e57829003601f168201915b5050505050905090565b600f60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6002600b54036116b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a790614597565b60405180910390fd5b6002600b81905550600f60019054906101000a900460ff1615611708576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ff90614603565b60405180910390fd5b60008111801561172c57506013548161171f610c0b565b6117299190614623565b11155b61176b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611762906146a3565b60405180910390fd5b60125481600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117b99190614623565b11156117fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f19061470f565b60405180910390fd5b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054036118a25760018161184e919061472f565b60115461185b91906141e5565b34101561189d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611894906147af565b60405180910390fd5b6118f3565b806011546118b091906141e5565b3410156118f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e9906147af565b60405180910390fd5b5b80600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119429190614623565b925050819055506119533382612869565b6001600b8190555050565b611966612417565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119ca576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006119d7612417565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a84612417565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ac991906137fa565b60405180910390a35050565b60115481565b611ae3612417565b73ffffffffffffffffffffffffffffffffffffffff16611b01611589565b73ffffffffffffffffffffffffffffffffffffffff1614611b57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4e9061412b565b60405180910390fd5b611b618183612869565b5050565b600c6020528060005260406000206000915090505481565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611c79576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611bf492919061414b565b6020604051808303816000875af1158015611c13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c379190614189565b611c7857336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611c6f919061396b565b60405180910390fd5b5b611c8584848484612887565b50505050565b600e8054611c98906140ae565b80601f0160208091040260200160405190810160405280929190818152602001828054611cc4906140ae565b8015611d115780601f10611ce657610100808354040283529160200191611d11565b820191906000526020600020905b815481529060010190602001808311611cf457829003601f168201915b505050505081565b611d21612417565b73ffffffffffffffffffffffffffffffffffffffff16611d3f611589565b73ffffffffffffffffffffffffffffffffffffffff1614611d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8c9061412b565b60405180910390fd5b611d9f8282612903565b5050565b6060611dae826123c9565b611ded576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de490614841565b60405180910390fd5b6000611df7612a98565b905060001515600f60009054906101000a900460ff16151503611ea757600e8054611e21906140ae565b80601f0160208091040260200160405190810160405280929190818152602001828054611e4d906140ae565b8015611e9a5780601f10611e6f57610100808354040283529160200191611e9a565b820191906000526020600020905b815481529060010190602001808311611e7d57829003601f168201915b5050505050915050611ef4565b6000815111611ec55760405180602001604052806000815250611ef0565b80611ecf84612b2a565b604051602001611ee09291906148e9565b6040516020818303038152906040525b9150505b919050565b60135481565b611f07612417565b73ffffffffffffffffffffffffffffffffffffffff16611f25611589565b73ffffffffffffffffffffffffffffffffffffffff1614611f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f729061412b565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612034612417565b73ffffffffffffffffffffffffffffffffffffffff16612052611589565b73ffffffffffffffffffffffffffffffffffffffff16146120a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209f9061412b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612117576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210e9061498a565b60405180910390fd5b612120816127a3565b50565b61212b612417565b73ffffffffffffffffffffffffffffffffffffffff16612149611589565b73ffffffffffffffffffffffffffffffffffffffff161461219f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121969061412b565b60405180910390fd5b60005b81518110156121e3576121d08282815181106121c1576121c06149aa565b5b60200260200101516001612869565b80806121db906149d9565b9150506121a2565b5050565b6121ef612417565b73ffffffffffffffffffffffffffffffffffffffff1661220d611589565b73ffffffffffffffffffffffffffffffffffffffff1614612263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225a9061412b565b60405180910390fd5b8060128190555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061233857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612348575061234782612c8a565b5b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806123c257506123c18261226d565b5b9050919050565b6000816123d46124d1565b111580156123e3575060005482105b8015612410575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6124e5838383612cf4565b505050565b6000612710905090565b61250f83838360405180602001604052806000815250611b7d565b505050565b61251c613703565b60008290508061252a6124d1565b11158015612539575060005481105b1561276c576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161276a57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461264e57809250505061279e565b5b60011561276957818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461276457809250505061279e565b61264f565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6128838282604051806020016040528060008152506131a8565b5050565b612892848484612cf4565b6128b18373ffffffffffffffffffffffffffffffffffffffff166131ba565b80156128c657506128c4848484846131dd565b155b156128fd576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b61290b6124ea565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115612969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296090614a93565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036129d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129cf90614aff565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6060600d8054612aa7906140ae565b80601f0160208091040260200160405190810160405280929190818152602001828054612ad3906140ae565b8015612b205780601f10612af557610100808354040283529160200191612b20565b820191906000526020600020905b815481529060010190602001808311612b0357829003601f168201915b5050505050905090565b606060008203612b71576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c85565b600082905060005b60008214612ba3578080612b8c906149d9565b915050600a82612b9c9190614256565b9150612b79565b60008167ffffffffffffffff811115612bbf57612bbe613b7d565b5b6040519080825280601f01601f191660200182016040528015612bf15781602001600182028036833780820191505090505b5090505b60008514612c7e57600182612c0a919061472f565b9150600a85612c199190614b1f565b6030612c259190614623565b60f81b818381518110612c3b57612c3a6149aa565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c779190614256565b9450612bf5565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000612cff82612514565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d6a576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16612d8b612417565b73ffffffffffffffffffffffffffffffffffffffff161480612dba5750612db985612db4612417565b611f98565b5b80612dff5750612dc8612417565b73ffffffffffffffffffffffffffffffffffffffff16612de7846109e6565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612e38576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612e9e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612eab858585600161332d565b612eb76000848761241f565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361313657600054821461313557878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131a18585856001613333565b5050505050565b6131b58383836001613339565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613203612417565b8786866040518563ffffffff1660e01b81526004016132259493929190614ba5565b6020604051808303816000875af192505050801561326157506040513d601f19601f8201168201806040525081019061325e9190614c06565b60015b6132da573d8060008114613291576040519150601f19603f3d011682016040523d82523d6000602084013e613296565b606091505b5060008151036132d2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036133a5576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084036133df576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6133ec600086838761332d565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156135b657506135b58773ffffffffffffffffffffffffffffffffffffffff166131ba565b5b1561367b575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461362b60008884806001019550886131dd565b613661576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082036135bc57826000541461367657600080fd5b6136e6565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480820361367c575b8160008190555050506136fc6000868387613333565b5050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61378f8161375a565b811461379a57600080fd5b50565b6000813590506137ac81613786565b92915050565b6000602082840312156137c8576137c7613750565b5b60006137d68482850161379d565b91505092915050565b60008115159050919050565b6137f4816137df565b82525050565b600060208201905061380f60008301846137eb565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561384f578082015181840152602081019050613834565b60008484015250505050565b6000601f19601f8301169050919050565b600061387782613815565b6138818185613820565b9350613891818560208601613831565b61389a8161385b565b840191505092915050565b600060208201905081810360008301526138bf818461386c565b905092915050565b6000819050919050565b6138da816138c7565b81146138e557600080fd5b50565b6000813590506138f7816138d1565b92915050565b60006020828403121561391357613912613750565b5b6000613921848285016138e8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006139558261392a565b9050919050565b6139658161394a565b82525050565b6000602082019050613980600083018461395c565b92915050565b61398f8161394a565b811461399a57600080fd5b50565b6000813590506139ac81613986565b92915050565b600080604083850312156139c9576139c8613750565b5b60006139d78582860161399d565b92505060206139e8858286016138e8565b9150509250929050565b6139fb816138c7565b82525050565b6000602082019050613a1660008301846139f2565b92915050565b613a25816137df565b8114613a3057600080fd5b50565b600081359050613a4281613a1c565b92915050565b600060208284031215613a5e57613a5d613750565b5b6000613a6c84828501613a33565b91505092915050565b60006bffffffffffffffffffffffff82169050919050565b613a9681613a75565b82525050565b6000602082019050613ab16000830184613a8d565b92915050565b600080600060608486031215613ad057613acf613750565b5b6000613ade8682870161399d565b9350506020613aef8682870161399d565b9250506040613b00868287016138e8565b9150509250925092565b60008060408385031215613b2157613b20613750565b5b6000613b2f858286016138e8565b9250506020613b40858286016138e8565b9150509250929050565b6000604082019050613b5f600083018561395c565b613b6c60208301846139f2565b9392505050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613bb58261385b565b810181811067ffffffffffffffff82111715613bd457613bd3613b7d565b5b80604052505050565b6000613be7613746565b9050613bf38282613bac565b919050565b600067ffffffffffffffff821115613c1357613c12613b7d565b5b613c1c8261385b565b9050602081019050919050565b82818337600083830152505050565b6000613c4b613c4684613bf8565b613bdd565b905082815260208101848484011115613c6757613c66613b78565b5b613c72848285613c29565b509392505050565b600082601f830112613c8f57613c8e613b73565b5b8135613c9f848260208601613c38565b91505092915050565b600060208284031215613cbe57613cbd613750565b5b600082013567ffffffffffffffff811115613cdc57613cdb613755565b5b613ce884828501613c7a565b91505092915050565b600060208284031215613d0757613d06613750565b5b6000613d158482850161399d565b91505092915050565b60008060408385031215613d3557613d34613750565b5b6000613d438582860161399d565b9250506020613d5485828601613a33565b9150509250929050565b60008060408385031215613d7557613d74613750565b5b6000613d83858286016138e8565b9250506020613d948582860161399d565b9150509250929050565b600067ffffffffffffffff821115613db957613db8613b7d565b5b613dc28261385b565b9050602081019050919050565b6000613de2613ddd84613d9e565b613bdd565b905082815260208101848484011115613dfe57613dfd613b78565b5b613e09848285613c29565b509392505050565b600082601f830112613e2657613e25613b73565b5b8135613e36848260208601613dcf565b91505092915050565b60008060008060808587031215613e5957613e58613750565b5b6000613e678782880161399d565b9450506020613e788782880161399d565b9350506040613e89878288016138e8565b925050606085013567ffffffffffffffff811115613eaa57613ea9613755565b5b613eb687828801613e11565b91505092959194509250565b613ecb81613a75565b8114613ed657600080fd5b50565b600081359050613ee881613ec2565b92915050565b60008060408385031215613f0557613f04613750565b5b6000613f138582860161399d565b9250506020613f2485828601613ed9565b9150509250929050565b60008060408385031215613f4557613f44613750565b5b6000613f538582860161399d565b9250506020613f648582860161399d565b9150509250929050565b600067ffffffffffffffff821115613f8957613f88613b7d565b5b602082029050602081019050919050565b600080fd5b6000613fb2613fad84613f6e565b613bdd565b90508083825260208201905060208402830185811115613fd557613fd4613f9a565b5b835b81811015613ffe5780613fea888261399d565b845260208401935050602081019050613fd7565b5050509392505050565b600082601f83011261401d5761401c613b73565b5b813561402d848260208601613f9f565b91505092915050565b60006020828403121561404c5761404b613750565b5b600082013567ffffffffffffffff81111561406a57614069613755565b5b61407684828501614008565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806140c657607f821691505b6020821081036140d9576140d861407f565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614115602083613820565b9150614120826140df565b602082019050919050565b6000602082019050818103600083015261414481614108565b9050919050565b6000604082019050614160600083018561395c565b61416d602083018461395c565b9392505050565b60008151905061418381613a1c565b92915050565b60006020828403121561419f5761419e613750565b5b60006141ad84828501614174565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006141f0826138c7565b91506141fb836138c7565b9250828202614209816138c7565b915082820484148315176142205761421f6141b6565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614261826138c7565b915061426c836138c7565b92508261427c5761427b614227565b5b828204905092915050565b600081905092915050565b50565b60006142a2600083614287565b91506142ad82614292565b600082019050919050565b60006142c382614295565b9150819050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261432f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826142f2565b61433986836142f2565b95508019841693508086168417925050509392505050565b6000819050919050565b600061437661437161436c846138c7565b614351565b6138c7565b9050919050565b6000819050919050565b6143908361435b565b6143a461439c8261437d565b8484546142ff565b825550505050565b600090565b6143b96143ac565b6143c4818484614387565b505050565b5b818110156143e8576143dd6000826143b1565b6001810190506143ca565b5050565b601f82111561442d576143fe816142cd565b614407846142e2565b81016020851015614416578190505b61442a614422856142e2565b8301826143c9565b50505b505050565b600082821c905092915050565b600061445060001984600802614432565b1980831691505092915050565b6000614469838361443f565b9150826002028217905092915050565b61448282613815565b67ffffffffffffffff81111561449b5761449a613b7d565b5b6144a582546140ae565b6144b08282856143ec565b600060209050601f8311600181146144e357600084156144d1578287015190505b6144db858261445d565b865550614543565b601f1984166144f1866142cd565b60005b82811015614519578489015182556001820191506020850194506020810190506144f4565b868310156145365784890151614532601f89168261443f565b8355505b6001600288020188555050505b505050505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614581601f83613820565b915061458c8261454b565b602082019050919050565b600060208201905081810360008301526145b081614574565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b60006145ed601783613820565b91506145f8826145b7565b602082019050919050565b6000602082019050818103600083015261461c816145e0565b9050919050565b600061462e826138c7565b9150614639836138c7565b9250828201905080821115614651576146506141b6565b5b92915050565b7f496e76616c696420616d6f756e74210000000000000000000000000000000000600082015250565b600061468d600f83613820565b915061469882614657565b602082019050919050565b600060208201905081810360008301526146bc81614680565b9050919050565b7f596f752063616e2774206d696e74207468697320616d6f756e74000000000000600082015250565b60006146f9601a83613820565b9150614704826146c3565b602082019050919050565b60006020820190508181036000830152614728816146ec565b9050919050565b600061473a826138c7565b9150614745836138c7565b925082820390508181111561475d5761475c6141b6565b5b92915050565b7f496e73756666696369656e742046756e64732100000000000000000000000000600082015250565b6000614799601383613820565b91506147a482614763565b602082019050919050565b600060208201905081810360008301526147c88161478c565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061482b602f83613820565b9150614836826147cf565b604082019050919050565b6000602082019050818103600083015261485a8161481e565b9050919050565b600081905092915050565b600061487782613815565b6148818185614861565b9350614891818560208601613831565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006148d3600583614861565b91506148de8261489d565b600582019050919050565b60006148f5828561486c565b9150614901828461486c565b915061490c826148c6565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614974602683613820565b915061497f82614918565b604082019050919050565b600060208201905081810360008301526149a381614967565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006149e4826138c7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614a1657614a156141b6565b5b600182019050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000614a7d602a83613820565b9150614a8882614a21565b604082019050919050565b60006020820190508181036000830152614aac81614a70565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6000614ae9601983613820565b9150614af482614ab3565b602082019050919050565b60006020820190508181036000830152614b1881614adc565b9050919050565b6000614b2a826138c7565b9150614b35836138c7565b925082614b4557614b44614227565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000614b7782614b50565b614b818185614b5b565b9350614b91818560208601613831565b614b9a8161385b565b840191505092915050565b6000608082019050614bba600083018761395c565b614bc7602083018661395c565b614bd460408301856139f2565b8181036060830152614be68184614b6c565b905095945050505050565b600081519050614c0081613786565b92915050565b600060208284031215614c1c57614c1b613750565b5b6000614c2a84828501614bf1565b9150509291505056fea2646970667358221220240ca51bb5893da71806d703c04e9a6a37342f09057889833154a7ddb0b8495264736f6c63430008120033

Deployed Bytecode Sourcemap

72597:4934:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75010:258;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57913:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59416:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58979:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73110:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75885:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54049:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73026:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76968:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22119:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;76547:413;;;;;;;;;;;;;:::i;:::-;;77133:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75442:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76427:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72928:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75978:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72955:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57721:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72790:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75685:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55169:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33266:103;;;;;;;;;;;;;:::i;:::-;;32615:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58082:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72987:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73469:636;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59692:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73062:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76095:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72733:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77306:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72818:103;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75279:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74294:710;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73152:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75788:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60050:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33524:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76229:190;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75563:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75010:258;75125:4;75167:38;75193:11;75167:25;:38::i;:::-;:93;;;;75222:38;75248:11;75222:25;:38::i;:::-;75167:93;75147:113;;75010:258;;;:::o;57913:100::-;57967:13;58000:5;57993:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57913:100;:::o;59416:204::-;59484:7;59509:16;59517:7;59509;:16::i;:::-;59504:64;;59534:34;;;;;;;;;;;;;;59504:64;59588:15;:24;59604:7;59588:24;;;;;;;;;;;;;;;;;;;;;59581:31;;59416:204;;;:::o;58979:371::-;59052:13;59068:24;59084:7;59068:15;:24::i;:::-;59052:40;;59113:5;59107:11;;:2;:11;;;59103:48;;59127:24;;;;;;;;;;;;;;59103:48;59184:5;59168:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;59194:37;59211:5;59218:12;:10;:12::i;:::-;59194:16;:37::i;:::-;59193:38;59168:63;59164:138;;;59255:35;;;;;;;;;;;;;;59164:138;59314:28;59323:2;59327:7;59336:5;59314:8;:28::i;:::-;59041:309;58979:371;;:::o;73110:35::-;;;;:::o;75885:85::-;32846:12;:10;:12::i;:::-;32835:23;;:7;:5;:7::i;:::-;:23;;;32827:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75956:6:::1;75947;;:15;;;;;;;;;;;;;;;;;;75885:85:::0;:::o;54049:303::-;54093:7;54318:15;:13;:15::i;:::-;54303:12;;54287:13;;:28;:46;54280:53;;54049:303;:::o;73026:29::-;;;;;;;;;;;;;:::o;76968:157::-;16935:1;15761:42;16889:43;;;:47;16885:225;;;15761:42;16958:40;;;17007:4;17014:10;16958:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16953:146;;17072:10;17053:30;;;;;;;;;;;:::i;:::-;;;;;;;;16953:146;16885:225;77080:37:::1;77099:4;77105:2;77109:7;77080:18;:37::i;:::-;76968:157:::0;;;:::o;22119:442::-;22216:7;22225;22245:26;22274:17;:27;22292:8;22274:27;;;;;;;;;;;22245:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22346:1;22318:30;;:7;:16;;;:30;;;22314:92;;22375:19;22365:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22314:92;22418:21;22483:17;:15;:17::i;:::-;22442:58;;22456:7;:23;;;22443:36;;:10;:36;;;;:::i;:::-;22442:58;;;;:::i;:::-;22418:82;;22521:7;:16;;;22539:13;22513:40;;;;;;22119:442;;;;;:::o;76547:413::-;32846:12;:10;:12::i;:::-;32835:23;;:7;:5;:7::i;:::-;:23;;;32827:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76772:7:::1;76793;:5;:7::i;:::-;76785:21;;76814;76785:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76771:69;;;76859:2;76851:11;;;::::0;::::1;;76584:376;76547:413::o:0;77133:165::-;16935:1;15761:42;16889:43;;;:47;16885:225;;;15761:42;16958:40;;;17007:4;17014:10;16958:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16953:146;;17072:10;17053:30;;;;;;;;;;;:::i;:::-;;;;;;;;16953:146;16885:225;77249:41:::1;77272:4;77278:2;77282:7;77249:22;:41::i;:::-;77133:165:::0;;;:::o;75442:107::-;32846:12;:10;:12::i;:::-;32835:23;;:7;:5;:7::i;:::-;:23;;;32827:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75527:14:::1;75513:11;:28;;;;75442:107:::0;:::o;76427:112::-;32846:12;:10;:12::i;:::-;32835:23;;:7;:5;:7::i;:::-;:23;;;32827:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76527:4:::1;76507:17;:24;;;;;;:::i;:::-;;76427:112:::0;:::o;72928:20::-;;;;;;;;;;;;;:::o;75978:106::-;32846:12;:10;:12::i;:::-;32835:23;;:7;:5;:7::i;:::-;:23;;;32827:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76065:11:::1;76055:7;:21;;;;;;:::i;:::-;;75978:106:::0;:::o;72955:25::-;;;;;;;;;;;;;:::o;57721:125::-;57785:7;57812:21;57825:7;57812:12;:21::i;:::-;:26;;;57805:33;;57721:125;;;:::o;72790:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;75685:96::-;32846:12;:10;:12::i;:::-;32835:23;;:7;:5;:7::i;:::-;:23;;;32827:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75766:7:::1;75754:9;:19;;;;75685:96:::0;:::o;55169:206::-;55233:7;55274:1;55257:19;;:5;:19;;;55253:60;;55285:28;;;;;;;;;;;;;;55253:60;55339:12;:19;55352:5;55339:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;55331:36;;55324:43;;55169:206;;;:::o;33266:103::-;32846:12;:10;:12::i;:::-;32835:23;;:7;:5;:7::i;:::-;:23;;;32827:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33331:30:::1;33358:1;33331:18;:30::i;:::-;33266:103::o:0;32615:87::-;32661:7;32688:6;;;;;;;;;;;32681:13;;32615:87;:::o;58082:104::-;58138:13;58171:7;58164:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58082:104;:::o;72987:32::-;;;;;;;;;;;;;:::o;73469:636::-;27428:1;28026:7;;:19;28018:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;27428:1;28159:7;:18;;;;73551:6:::1;;;;;;;;;;;73550:7;73542:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;73615:1;73604:8;:12;:53;;;;;73648:9;;73636:8;73620:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:37;;73604:53;73596:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;73736:15;;73724:8;73696:13;:25;73710:10;73696:25;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:55;;73688:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;73826:1;73797:13;:25;73811:10;73797:25;;;;;;;;;;;;;;;;:30:::0;73793:213:::1;;73883:1;73874:8;:10;;;;:::i;:::-;73859:11;;:26;;;;:::i;:::-;73846:9;:39;;73838:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;73793:213;;;73974:8;73960:11;;:22;;;;:::i;:::-;73947:9;:35;;73939:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;73793:213;74047:8;74018:13;:25;74032:10;74018:25;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;74066:31;74076:10;74088:8;74066:9;:31::i;:::-;27384:1:::0;28338:7;:22;;;;73469:636;:::o;59692:287::-;59803:12;:10;:12::i;:::-;59791:24;;:8;:24;;;59787:54;;59824:17;;;;;;;;;;;;;;59787:54;59899:8;59854:18;:32;59873:12;:10;:12::i;:::-;59854:32;;;;;;;;;;;;;;;:42;59887:8;59854:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;59952:8;59923:48;;59938:12;:10;:12::i;:::-;59923:48;;;59962:8;59923:48;;;;;;:::i;:::-;;;;;;;;59692:287;;:::o;73062:41::-;;;;:::o;76095:120::-;32846:12;:10;:12::i;:::-;32835:23;;:7;:5;:7::i;:::-;:23;;;32827:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76178:29:::1;76188:8;76198;76178:9;:29::i;:::-;76095:120:::0;;:::o;72733:48::-;;;;;;;;;;;;;;;;;:::o;77306:222::-;16935:1;15761:42;16889:43;;;:47;16885:225;;;15761:42;16958:40;;;17007:4;17014:10;16958:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16953:146;;17072:10;17053:30;;;;;;;;;;;:::i;:::-;;;;;;;;16953:146;16885:225;77473:47:::1;77496:4;77502:2;77506:7;77515:4;77473:22;:47::i;:::-;77306:222:::0;;;;:::o;72818:103::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;75279:147::-;32846:12;:10;:12::i;:::-;32835:23;;:7;:5;:7::i;:::-;:23;;;32827:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75373:45:::1;75392:8;75402:15;75373:18;:45::i;:::-;75279:147:::0;;:::o;74294:710::-;74412:13;74465:16;74473:7;74465;:16::i;:::-;74443:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;74567:28;74598:10;:8;:10::i;:::-;74567:41;;74636:5;74624:17;;:8;;;;;;;;;;;:17;;;74620:64;;74667:17;74660:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74620:64;74746:1;74721:14;74715:28;:32;:281;;;;;;;;;;;;;;;;;74839:14;74880:18;:7;:16;:18::i;:::-;74796:159;;;;;;;;;:::i;:::-;;;;;;;;;;;;;74715:281;74695:301;;;74294:710;;;;:::o;73152:31::-;;;;:::o;75788:89::-;32846:12;:10;:12::i;:::-;32835:23;;:7;:5;:7::i;:::-;:23;;;32827:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75863:6:::1;75852:8;;:17;;;;;;;;;;;;;;;;;;75788:89:::0;:::o;60050:164::-;60147:4;60171:18;:25;60190:5;60171:25;;;;;;;;;;;;;;;:35;60197:8;60171:35;;;;;;;;;;;;;;;;;;;;;;;;;60164:42;;60050:164;;;;:::o;33524:201::-;32846:12;:10;:12::i;:::-;32835:23;;:7;:5;:7::i;:::-;:23;;;32827:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33633:1:::1;33613:22;;:8;:22;;::::0;33605:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;33689:28;33708:8;33689:18;:28::i;:::-;33524:201:::0;:::o;76229:190::-;32846:12;:10;:12::i;:::-;32835:23;;:7;:5;:7::i;:::-;:23;;;32827:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76314:9:::1;76310:102;76333:10;:17;76329:1;:21;76310:102;;;76373:27;76383:10;76394:1;76383:13;;;;;;;;:::i;:::-;;;;;;;;76398:1;76373:9;:27::i;:::-;76352:4;;;;;:::i;:::-;;;;76310:102;;;;76229:190:::0;:::o;75563:114::-;32846:12;:10;:12::i;:::-;32835:23;;:7;:5;:7::i;:::-;:23;;;32827:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75656:13:::1;75638:15;:31;;;;75563:114:::0;:::o;54800:305::-;54902:4;54954:25;54939:40;;;:11;:40;;;;:105;;;;55011:33;54996:48;;;:11;:48;;;;54939:105;:158;;;;55061:36;55085:11;55061:23;:36::i;:::-;54939:158;54919:178;;54800:305;;;:::o;21849:215::-;21951:4;21990:26;21975:41;;;:11;:41;;;;:81;;;;22020:36;22044:11;22020:23;:36::i;:::-;21975:81;21968:88;;21849:215;;;:::o;61402:174::-;61459:4;61502:7;61483:15;:13;:15::i;:::-;:26;;:53;;;;;61523:13;;61513:7;:23;61483:53;:85;;;;;61541:11;:20;61553:7;61541:20;;;;;;;;;;;:27;;;;;;;;;;;;61540:28;61483:85;61476:92;;61402:174;;;:::o;31339:98::-;31392:7;31419:10;31412:17;;31339:98;:::o;69559:196::-;69701:2;69674:15;:24;69690:7;69674:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;69739:7;69735:2;69719:28;;69728:5;69719:28;;;;;;;;;;;;69559:196;;;:::o;53823:92::-;53879:7;53906:1;53899:8;;53823:92;:::o;60281:170::-;60415:28;60425:4;60431:2;60435:7;60415:9;:28::i;:::-;60281:170;;;:::o;22843:97::-;22901:6;22927:5;22920:12;;22843:97;:::o;60522:185::-;60660:39;60677:4;60683:2;60687:7;60660:39;;;;;;;;;;;;:16;:39::i;:::-;60522:185;;;:::o;56550:1109::-;56612:21;;:::i;:::-;56646:12;56661:7;56646:22;;56729:4;56710:15;:13;:15::i;:::-;:23;;:47;;;;;56744:13;;56737:4;:20;56710:47;56706:886;;;56778:31;56812:11;:17;56824:4;56812:17;;;;;;;;;;;56778:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56853:9;:16;;;56848:729;;56924:1;56898:28;;:9;:14;;;:28;;;56894:101;;56962:9;56955:16;;;;;;56894:101;57297:261;57304:4;57297:261;;;57337:6;;;;;;;;57382:11;:17;57394:4;57382:17;;;;;;;;;;;57370:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57456:1;57430:28;;:9;:14;;;:28;;;57426:109;;57498:9;57491:16;;;;;;57426:109;57297:261;;;56848:729;56759:833;56706:886;57620:31;;;;;;;;;;;;;;56550:1109;;;;:::o;33885:191::-;33959:16;33978:6;;;;;;;;;;;33959:25;;34004:8;33995:6;;:17;;;;;;;;;;;;;;;;;;34059:8;34028:40;;34049:8;34028:40;;;;;;;;;;;;33948:128;33885:191;:::o;61584:104::-;61653:27;61663:2;61667:8;61653:27;;;;;;;;;;;;:9;:27::i;:::-;61584:104;;:::o;60778:369::-;60945:28;60955:4;60961:2;60965:7;60945:9;:28::i;:::-;60988:15;:2;:13;;;:15::i;:::-;:76;;;;;61008:56;61039:4;61045:2;61049:7;61058:5;61008:30;:56::i;:::-;61007:57;60988:76;60984:156;;;61088:40;;;;;;;;;;;;;;60984:156;60778:369;;;;:::o;23211:332::-;23330:17;:15;:17::i;:::-;23314:33;;:12;:33;;;;23306:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;23433:1;23413:22;;:8;:22;;;23405:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;23500:35;;;;;;;;23512:8;23500:35;;;;;;23522:12;23500:35;;;;;23478:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23211:332;;:::o;74113:108::-;74173:13;74206:7;74199:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74113:108;:::o;28901:723::-;28957:13;29187:1;29178:5;:10;29174:53;;29205:10;;;;;;;;;;;;;;;;;;;;;29174:53;29237:12;29252:5;29237:20;;29268:14;29293:78;29308:1;29300:4;:9;29293:78;;29326:8;;;;;:::i;:::-;;;;29357:2;29349:10;;;;;:::i;:::-;;;29293:78;;;29381:19;29413:6;29403:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29381:39;;29431:154;29447:1;29438:5;:10;29431:154;;29475:1;29465:11;;;;;:::i;:::-;;;29542:2;29534:5;:10;;;;:::i;:::-;29521:2;:24;;;;:::i;:::-;29508:39;;29491:6;29498;29491:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;29571:2;29562:11;;;;;:::i;:::-;;;29431:154;;;29609:6;29595:21;;;;;28901:723;;;;:::o;19401:157::-;19486:4;19525:25;19510:40;;;:11;:40;;;;19503:47;;19401:157;;;:::o;64502:2130::-;64617:35;64655:21;64668:7;64655:12;:21::i;:::-;64617:59;;64715:4;64693:26;;:13;:18;;;:26;;;64689:67;;64728:28;;;;;;;;;;;;;;64689:67;64769:22;64811:4;64795:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;64832:36;64849:4;64855:12;:10;:12::i;:::-;64832:16;:36::i;:::-;64795:73;:126;;;;64909:12;:10;:12::i;:::-;64885:36;;:20;64897:7;64885:11;:20::i;:::-;:36;;;64795:126;64769:153;;64940:17;64935:66;;64966:35;;;;;;;;;;;;;;64935:66;65030:1;65016:16;;:2;:16;;;65012:52;;65041:23;;;;;;;;;;;;;;65012:52;65077:43;65099:4;65105:2;65109:7;65118:1;65077:21;:43::i;:::-;65185:35;65202:1;65206:7;65215:4;65185:8;:35::i;:::-;65546:1;65516:12;:18;65529:4;65516:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65590:1;65562:12;:16;65575:2;65562:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65608:31;65642:11;:20;65654:7;65642:20;;;;;;;;;;;65608:54;;65693:2;65677:8;:13;;;:18;;;;;;;;;;;;;;;;;;65743:15;65710:8;:23;;;:49;;;;;;;;;;;;;;;;;;66011:19;66043:1;66033:7;:11;66011:33;;66059:31;66093:11;:24;66105:11;66093:24;;;;;;;;;;;66059:58;;66161:1;66136:27;;:8;:13;;;;;;;;;;;;:27;;;66132:384;;66346:13;;66331:11;:28;66327:174;;66400:4;66384:8;:13;;;:20;;;;;;;;;;;;;;;;;;66453:13;:28;;;66427:8;:23;;;:54;;;;;;;;;;;;;;;;;;66327:174;66132:384;65491:1036;;;66563:7;66559:2;66544:27;;66553:4;66544:27;;;;;;;;;;;;66582:42;66603:4;66609:2;66613:7;66622:1;66582:20;:42::i;:::-;64606:2026;;64502:2130;;;:::o;62051:163::-;62174:32;62180:2;62184:8;62194:5;62201:4;62174:5;:32::i;:::-;62051:163;;;:::o;35316:326::-;35376:4;35633:1;35611:7;:19;;;:23;35604:30;;35316:326;;;:::o;70247:667::-;70410:4;70447:2;70431:36;;;70468:12;:10;:12::i;:::-;70482:4;70488:7;70497:5;70431:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;70427:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70682:1;70665:6;:13;:18;70661:235;;70711:40;;;;;;;;;;;;;;70661:235;70854:6;70848:13;70839:6;70835:2;70831:15;70824:38;70427:480;70560:45;;;70550:55;;;:6;:55;;;;70543:62;;;70247:667;;;;;;:::o;71562:159::-;;;;;:::o;72380:158::-;;;;;:::o;62473:1775::-;62612:20;62635:13;;62612:36;;62677:1;62663:16;;:2;:16;;;62659:48;;62688:19;;;;;;;;;;;;;;62659:48;62734:1;62722:8;:13;62718:44;;62744:18;;;;;;;;;;;;;;62718:44;62775:61;62805:1;62809:2;62813:12;62827:8;62775:21;:61::i;:::-;63148:8;63113:12;:16;63126:2;63113:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63212:8;63172:12;:16;63185:2;63172:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63271:2;63238:11;:25;63250:12;63238:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;63338:15;63288:11;:25;63300:12;63288:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;63371:20;63394:12;63371:35;;63421:11;63450:8;63435:12;:23;63421:37;;63479:4;:23;;;;;63487:15;:2;:13;;;:15::i;:::-;63479:23;63475:641;;;63523:314;63579:12;63575:2;63554:38;;63571:1;63554:38;;;;;;;;;;;;63620:69;63659:1;63663:2;63667:14;;;;;;63683:5;63620:30;:69::i;:::-;63615:174;;63725:40;;;;;;;;;;;;;;63615:174;63832:3;63816:12;:19;63523:314;;63918:12;63901:13;;:29;63897:43;;63932:8;;;63897:43;63475:641;;;63981:120;64037:14;;;;;;64033:2;64012:40;;64029:1;64012:40;;;;;;;;;;;;64096:3;64080:12;:19;63981:120;;63475:641;64146:12;64130:13;:28;;;;63088:1082;;64180:60;64209:1;64213:2;64217:12;64231:8;64180:20;:60::i;:::-;62601:1647;62473:1775;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:116::-;5312:21;5327:5;5312:21;:::i;:::-;5305:5;5302:32;5292:60;;5348:1;5345;5338:12;5292:60;5242:116;:::o;5364:133::-;5407:5;5445:6;5432:20;5423:29;;5461:30;5485:5;5461:30;:::i;:::-;5364:133;;;;:::o;5503:323::-;5559:6;5608:2;5596:9;5587:7;5583:23;5579:32;5576:119;;;5614:79;;:::i;:::-;5576:119;5734:1;5759:50;5801:7;5792:6;5781:9;5777:22;5759:50;:::i;:::-;5749:60;;5705:114;5503:323;;;;:::o;5832:109::-;5868:7;5908:26;5901:5;5897:38;5886:49;;5832:109;;;:::o;5947:115::-;6032:23;6049:5;6032:23;:::i;:::-;6027:3;6020:36;5947:115;;:::o;6068:218::-;6159:4;6197:2;6186:9;6182:18;6174:26;;6210:69;6276:1;6265:9;6261:17;6252:6;6210:69;:::i;:::-;6068:218;;;;:::o;6292:619::-;6369:6;6377;6385;6434:2;6422:9;6413:7;6409:23;6405:32;6402:119;;;6440:79;;:::i;:::-;6402:119;6560:1;6585:53;6630:7;6621:6;6610:9;6606:22;6585:53;:::i;:::-;6575:63;;6531:117;6687:2;6713:53;6758:7;6749:6;6738:9;6734:22;6713:53;:::i;:::-;6703:63;;6658:118;6815:2;6841:53;6886:7;6877:6;6866:9;6862:22;6841:53;:::i;:::-;6831:63;;6786:118;6292:619;;;;;:::o;6917:474::-;6985:6;6993;7042:2;7030:9;7021:7;7017:23;7013:32;7010:119;;;7048:79;;:::i;:::-;7010:119;7168:1;7193:53;7238:7;7229:6;7218:9;7214:22;7193:53;:::i;:::-;7183:63;;7139:117;7295:2;7321:53;7366:7;7357:6;7346:9;7342:22;7321:53;:::i;:::-;7311:63;;7266:118;6917:474;;;;;:::o;7397:332::-;7518:4;7556:2;7545:9;7541:18;7533:26;;7569:71;7637:1;7626:9;7622:17;7613:6;7569:71;:::i;:::-;7650:72;7718:2;7707:9;7703:18;7694:6;7650:72;:::i;:::-;7397:332;;;;;:::o;7735:117::-;7844:1;7841;7834:12;7858:117;7967:1;7964;7957:12;7981:180;8029:77;8026:1;8019:88;8126:4;8123:1;8116:15;8150:4;8147:1;8140:15;8167:281;8250:27;8272:4;8250:27;:::i;:::-;8242:6;8238:40;8380:6;8368:10;8365:22;8344:18;8332:10;8329:34;8326:62;8323:88;;;8391:18;;:::i;:::-;8323:88;8431:10;8427:2;8420:22;8210:238;8167:281;;:::o;8454:129::-;8488:6;8515:20;;:::i;:::-;8505:30;;8544:33;8572:4;8564:6;8544:33;:::i;:::-;8454:129;;;:::o;8589:308::-;8651:4;8741:18;8733:6;8730:30;8727:56;;;8763:18;;:::i;:::-;8727:56;8801:29;8823:6;8801:29;:::i;:::-;8793:37;;8885:4;8879;8875:15;8867:23;;8589:308;;;:::o;8903:146::-;9000:6;8995:3;8990;8977:30;9041:1;9032:6;9027:3;9023:16;9016:27;8903:146;;;:::o;9055:425::-;9133:5;9158:66;9174:49;9216:6;9174:49;:::i;:::-;9158:66;:::i;:::-;9149:75;;9247:6;9240:5;9233:21;9285:4;9278:5;9274:16;9323:3;9314:6;9309:3;9305:16;9302:25;9299:112;;;9330:79;;:::i;:::-;9299:112;9420:54;9467:6;9462:3;9457;9420:54;:::i;:::-;9139:341;9055:425;;;;;:::o;9500:340::-;9556:5;9605:3;9598:4;9590:6;9586:17;9582:27;9572:122;;9613:79;;:::i;:::-;9572:122;9730:6;9717:20;9755:79;9830:3;9822:6;9815:4;9807:6;9803:17;9755:79;:::i;:::-;9746:88;;9562:278;9500:340;;;;:::o;9846:509::-;9915:6;9964:2;9952:9;9943:7;9939:23;9935:32;9932:119;;;9970:79;;:::i;:::-;9932:119;10118:1;10107:9;10103:17;10090:31;10148:18;10140:6;10137:30;10134:117;;;10170:79;;:::i;:::-;10134:117;10275:63;10330:7;10321:6;10310:9;10306:22;10275:63;:::i;:::-;10265:73;;10061:287;9846:509;;;;:::o;10361:329::-;10420:6;10469:2;10457:9;10448:7;10444:23;10440:32;10437:119;;;10475:79;;:::i;:::-;10437:119;10595:1;10620:53;10665:7;10656:6;10645:9;10641:22;10620:53;:::i;:::-;10610:63;;10566:117;10361:329;;;;:::o;10696:468::-;10761:6;10769;10818:2;10806:9;10797:7;10793:23;10789:32;10786:119;;;10824:79;;:::i;:::-;10786:119;10944:1;10969:53;11014:7;11005:6;10994:9;10990:22;10969:53;:::i;:::-;10959:63;;10915:117;11071:2;11097:50;11139:7;11130:6;11119:9;11115:22;11097:50;:::i;:::-;11087:60;;11042:115;10696:468;;;;;:::o;11170:474::-;11238:6;11246;11295:2;11283:9;11274:7;11270:23;11266:32;11263:119;;;11301:79;;:::i;:::-;11263:119;11421:1;11446:53;11491:7;11482:6;11471:9;11467:22;11446:53;:::i;:::-;11436:63;;11392:117;11548:2;11574:53;11619:7;11610:6;11599:9;11595:22;11574:53;:::i;:::-;11564:63;;11519:118;11170:474;;;;;:::o;11650:307::-;11711:4;11801:18;11793:6;11790:30;11787:56;;;11823:18;;:::i;:::-;11787:56;11861:29;11883:6;11861:29;:::i;:::-;11853:37;;11945:4;11939;11935:15;11927:23;;11650:307;;;:::o;11963:423::-;12040:5;12065:65;12081:48;12122:6;12081:48;:::i;:::-;12065:65;:::i;:::-;12056:74;;12153:6;12146:5;12139:21;12191:4;12184:5;12180:16;12229:3;12220:6;12215:3;12211:16;12208:25;12205:112;;;12236:79;;:::i;:::-;12205:112;12326:54;12373:6;12368:3;12363;12326:54;:::i;:::-;12046:340;11963:423;;;;;:::o;12405:338::-;12460:5;12509:3;12502:4;12494:6;12490:17;12486:27;12476:122;;12517:79;;:::i;:::-;12476:122;12634:6;12621:20;12659:78;12733:3;12725:6;12718:4;12710:6;12706:17;12659:78;:::i;:::-;12650:87;;12466:277;12405:338;;;;:::o;12749:943::-;12844:6;12852;12860;12868;12917:3;12905:9;12896:7;12892:23;12888:33;12885:120;;;12924:79;;:::i;:::-;12885:120;13044:1;13069:53;13114:7;13105:6;13094:9;13090:22;13069:53;:::i;:::-;13059:63;;13015:117;13171:2;13197:53;13242:7;13233:6;13222:9;13218:22;13197:53;:::i;:::-;13187:63;;13142:118;13299:2;13325:53;13370:7;13361:6;13350:9;13346:22;13325:53;:::i;:::-;13315:63;;13270:118;13455:2;13444:9;13440:18;13427:32;13486:18;13478:6;13475:30;13472:117;;;13508:79;;:::i;:::-;13472:117;13613:62;13667:7;13658:6;13647:9;13643:22;13613:62;:::i;:::-;13603:72;;13398:287;12749:943;;;;;;;:::o;13698:120::-;13770:23;13787:5;13770:23;:::i;:::-;13763:5;13760:34;13750:62;;13808:1;13805;13798:12;13750:62;13698:120;:::o;13824:137::-;13869:5;13907:6;13894:20;13885:29;;13923:32;13949:5;13923:32;:::i;:::-;13824:137;;;;:::o;13967:472::-;14034:6;14042;14091:2;14079:9;14070:7;14066:23;14062:32;14059:119;;;14097:79;;:::i;:::-;14059:119;14217:1;14242:53;14287:7;14278:6;14267:9;14263:22;14242:53;:::i;:::-;14232:63;;14188:117;14344:2;14370:52;14414:7;14405:6;14394:9;14390:22;14370:52;:::i;:::-;14360:62;;14315:117;13967:472;;;;;:::o;14445:474::-;14513:6;14521;14570:2;14558:9;14549:7;14545:23;14541:32;14538:119;;;14576:79;;:::i;:::-;14538:119;14696:1;14721:53;14766:7;14757:6;14746:9;14742:22;14721:53;:::i;:::-;14711:63;;14667:117;14823:2;14849:53;14894:7;14885:6;14874:9;14870:22;14849:53;:::i;:::-;14839:63;;14794:118;14445:474;;;;;:::o;14925:311::-;15002:4;15092:18;15084:6;15081:30;15078:56;;;15114:18;;:::i;:::-;15078:56;15164:4;15156:6;15152:17;15144:25;;15224:4;15218;15214:15;15206:23;;14925:311;;;:::o;15242:117::-;15351:1;15348;15341:12;15382:710;15478:5;15503:81;15519:64;15576:6;15519:64;:::i;:::-;15503:81;:::i;:::-;15494:90;;15604:5;15633:6;15626:5;15619:21;15667:4;15660:5;15656:16;15649:23;;15720:4;15712:6;15708:17;15700:6;15696:30;15749:3;15741:6;15738:15;15735:122;;;15768:79;;:::i;:::-;15735:122;15883:6;15866:220;15900:6;15895:3;15892:15;15866:220;;;15975:3;16004:37;16037:3;16025:10;16004:37;:::i;:::-;15999:3;15992:50;16071:4;16066:3;16062:14;16055:21;;15942:144;15926:4;15921:3;15917:14;15910:21;;15866:220;;;15870:21;15484:608;;15382:710;;;;;:::o;16115:370::-;16186:5;16235:3;16228:4;16220:6;16216:17;16212:27;16202:122;;16243:79;;:::i;:::-;16202:122;16360:6;16347:20;16385:94;16475:3;16467:6;16460:4;16452:6;16448:17;16385:94;:::i;:::-;16376:103;;16192:293;16115:370;;;;:::o;16491:539::-;16575:6;16624:2;16612:9;16603:7;16599:23;16595:32;16592:119;;;16630:79;;:::i;:::-;16592:119;16778:1;16767:9;16763:17;16750:31;16808:18;16800:6;16797:30;16794:117;;;16830:79;;:::i;:::-;16794:117;16935:78;17005:7;16996:6;16985:9;16981:22;16935:78;:::i;:::-;16925:88;;16721:302;16491:539;;;;:::o;17036:180::-;17084:77;17081:1;17074:88;17181:4;17178:1;17171:15;17205:4;17202:1;17195:15;17222:320;17266:6;17303:1;17297:4;17293:12;17283:22;;17350:1;17344:4;17340:12;17371:18;17361:81;;17427:4;17419:6;17415:17;17405:27;;17361:81;17489:2;17481:6;17478:14;17458:18;17455:38;17452:84;;17508:18;;:::i;:::-;17452:84;17273:269;17222:320;;;:::o;17548:182::-;17688:34;17684:1;17676:6;17672:14;17665:58;17548:182;:::o;17736:366::-;17878:3;17899:67;17963:2;17958:3;17899:67;:::i;:::-;17892:74;;17975:93;18064:3;17975:93;:::i;:::-;18093:2;18088:3;18084:12;18077:19;;17736:366;;;:::o;18108:419::-;18274:4;18312:2;18301:9;18297:18;18289:26;;18361:9;18355:4;18351:20;18347:1;18336:9;18332:17;18325:47;18389:131;18515:4;18389:131;:::i;:::-;18381:139;;18108:419;;;:::o;18533:332::-;18654:4;18692:2;18681:9;18677:18;18669:26;;18705:71;18773:1;18762:9;18758:17;18749:6;18705:71;:::i;:::-;18786:72;18854:2;18843:9;18839:18;18830:6;18786:72;:::i;:::-;18533:332;;;;;:::o;18871:137::-;18925:5;18956:6;18950:13;18941:22;;18972:30;18996:5;18972:30;:::i;:::-;18871:137;;;;:::o;19014:345::-;19081:6;19130:2;19118:9;19109:7;19105:23;19101:32;19098:119;;;19136:79;;:::i;:::-;19098:119;19256:1;19281:61;19334:7;19325:6;19314:9;19310:22;19281:61;:::i;:::-;19271:71;;19227:125;19014:345;;;;:::o;19365:180::-;19413:77;19410:1;19403:88;19510:4;19507:1;19500:15;19534:4;19531:1;19524:15;19551:410;19591:7;19614:20;19632:1;19614:20;:::i;:::-;19609:25;;19648:20;19666:1;19648:20;:::i;:::-;19643:25;;19703:1;19700;19696:9;19725:30;19743:11;19725:30;:::i;:::-;19714:41;;19904:1;19895:7;19891:15;19888:1;19885:22;19865:1;19858:9;19838:83;19815:139;;19934:18;;:::i;:::-;19815:139;19599:362;19551:410;;;;:::o;19967:180::-;20015:77;20012:1;20005:88;20112:4;20109:1;20102:15;20136:4;20133:1;20126:15;20153:185;20193:1;20210:20;20228:1;20210:20;:::i;:::-;20205:25;;20244:20;20262:1;20244:20;:::i;:::-;20239:25;;20283:1;20273:35;;20288:18;;:::i;:::-;20273:35;20330:1;20327;20323:9;20318:14;;20153:185;;;;:::o;20344:147::-;20445:11;20482:3;20467:18;;20344:147;;;;:::o;20497:114::-;;:::o;20617:398::-;20776:3;20797:83;20878:1;20873:3;20797:83;:::i;:::-;20790:90;;20889:93;20978:3;20889:93;:::i;:::-;21007:1;21002:3;20998:11;20991:18;;20617:398;;;:::o;21021:379::-;21205:3;21227:147;21370:3;21227:147;:::i;:::-;21220:154;;21391:3;21384:10;;21021:379;;;:::o;21406:141::-;21455:4;21478:3;21470:11;;21501:3;21498:1;21491:14;21535:4;21532:1;21522:18;21514:26;;21406:141;;;:::o;21553:93::-;21590:6;21637:2;21632;21625:5;21621:14;21617:23;21607:33;;21553:93;;;:::o;21652:107::-;21696:8;21746:5;21740:4;21736:16;21715:37;;21652:107;;;;:::o;21765:393::-;21834:6;21884:1;21872:10;21868:18;21907:97;21937:66;21926:9;21907:97;:::i;:::-;22025:39;22055:8;22044:9;22025:39;:::i;:::-;22013:51;;22097:4;22093:9;22086:5;22082:21;22073:30;;22146:4;22136:8;22132:19;22125:5;22122:30;22112:40;;21841:317;;21765:393;;;;;:::o;22164:60::-;22192:3;22213:5;22206:12;;22164:60;;;:::o;22230:142::-;22280:9;22313:53;22331:34;22340:24;22358:5;22340:24;:::i;:::-;22331:34;:::i;:::-;22313:53;:::i;:::-;22300:66;;22230:142;;;:::o;22378:75::-;22421:3;22442:5;22435:12;;22378:75;;;:::o;22459:269::-;22569:39;22600:7;22569:39;:::i;:::-;22630:91;22679:41;22703:16;22679:41;:::i;:::-;22671:6;22664:4;22658:11;22630:91;:::i;:::-;22624:4;22617:105;22535:193;22459:269;;;:::o;22734:73::-;22779:3;22734:73;:::o;22813:189::-;22890:32;;:::i;:::-;22931:65;22989:6;22981;22975:4;22931:65;:::i;:::-;22866:136;22813:189;;:::o;23008:186::-;23068:120;23085:3;23078:5;23075:14;23068:120;;;23139:39;23176:1;23169:5;23139:39;:::i;:::-;23112:1;23105:5;23101:13;23092:22;;23068:120;;;23008:186;;:::o;23200:543::-;23301:2;23296:3;23293:11;23290:446;;;23335:38;23367:5;23335:38;:::i;:::-;23419:29;23437:10;23419:29;:::i;:::-;23409:8;23405:44;23602:2;23590:10;23587:18;23584:49;;;23623:8;23608:23;;23584:49;23646:80;23702:22;23720:3;23702:22;:::i;:::-;23692:8;23688:37;23675:11;23646:80;:::i;:::-;23305:431;;23290:446;23200:543;;;:::o;23749:117::-;23803:8;23853:5;23847:4;23843:16;23822:37;;23749:117;;;;:::o;23872:169::-;23916:6;23949:51;23997:1;23993:6;23985:5;23982:1;23978:13;23949:51;:::i;:::-;23945:56;24030:4;24024;24020:15;24010:25;;23923:118;23872:169;;;;:::o;24046:295::-;24122:4;24268:29;24293:3;24287:4;24268:29;:::i;:::-;24260:37;;24330:3;24327:1;24323:11;24317:4;24314:21;24306:29;;24046:295;;;;:::o;24346:1395::-;24463:37;24496:3;24463:37;:::i;:::-;24565:18;24557:6;24554:30;24551:56;;;24587:18;;:::i;:::-;24551:56;24631:38;24663:4;24657:11;24631:38;:::i;:::-;24716:67;24776:6;24768;24762:4;24716:67;:::i;:::-;24810:1;24834:4;24821:17;;24866:2;24858:6;24855:14;24883:1;24878:618;;;;25540:1;25557:6;25554:77;;;25606:9;25601:3;25597:19;25591:26;25582:35;;25554:77;25657:67;25717:6;25710:5;25657:67;:::i;:::-;25651:4;25644:81;25513:222;24848:887;;24878:618;24930:4;24926:9;24918:6;24914:22;24964:37;24996:4;24964:37;:::i;:::-;25023:1;25037:208;25051:7;25048:1;25045:14;25037:208;;;25130:9;25125:3;25121:19;25115:26;25107:6;25100:42;25181:1;25173:6;25169:14;25159:24;;25228:2;25217:9;25213:18;25200:31;;25074:4;25071:1;25067:12;25062:17;;25037:208;;;25273:6;25264:7;25261:19;25258:179;;;25331:9;25326:3;25322:19;25316:26;25374:48;25416:4;25408:6;25404:17;25393:9;25374:48;:::i;:::-;25366:6;25359:64;25281:156;25258:179;25483:1;25479;25471:6;25467:14;25463:22;25457:4;25450:36;24885:611;;;24848:887;;24438:1303;;;24346:1395;;:::o;25747:181::-;25887:33;25883:1;25875:6;25871:14;25864:57;25747:181;:::o;25934:366::-;26076:3;26097:67;26161:2;26156:3;26097:67;:::i;:::-;26090:74;;26173:93;26262:3;26173:93;:::i;:::-;26291:2;26286:3;26282:12;26275:19;;25934:366;;;:::o;26306:419::-;26472:4;26510:2;26499:9;26495:18;26487:26;;26559:9;26553:4;26549:20;26545:1;26534:9;26530:17;26523:47;26587:131;26713:4;26587:131;:::i;:::-;26579:139;;26306:419;;;:::o;26731:173::-;26871:25;26867:1;26859:6;26855:14;26848:49;26731:173;:::o;26910:366::-;27052:3;27073:67;27137:2;27132:3;27073:67;:::i;:::-;27066:74;;27149:93;27238:3;27149:93;:::i;:::-;27267:2;27262:3;27258:12;27251:19;;26910:366;;;:::o;27282:419::-;27448:4;27486:2;27475:9;27471:18;27463:26;;27535:9;27529:4;27525:20;27521:1;27510:9;27506:17;27499:47;27563:131;27689:4;27563:131;:::i;:::-;27555:139;;27282:419;;;:::o;27707:191::-;27747:3;27766:20;27784:1;27766:20;:::i;:::-;27761:25;;27800:20;27818:1;27800:20;:::i;:::-;27795:25;;27843:1;27840;27836:9;27829:16;;27864:3;27861:1;27858:10;27855:36;;;27871:18;;:::i;:::-;27855:36;27707:191;;;;:::o;27904:165::-;28044:17;28040:1;28032:6;28028:14;28021:41;27904:165;:::o;28075:366::-;28217:3;28238:67;28302:2;28297:3;28238:67;:::i;:::-;28231:74;;28314:93;28403:3;28314:93;:::i;:::-;28432:2;28427:3;28423:12;28416:19;;28075:366;;;:::o;28447:419::-;28613:4;28651:2;28640:9;28636:18;28628:26;;28700:9;28694:4;28690:20;28686:1;28675:9;28671:17;28664:47;28728:131;28854:4;28728:131;:::i;:::-;28720:139;;28447:419;;;:::o;28872:176::-;29012:28;29008:1;29000:6;28996:14;28989:52;28872:176;:::o;29054:366::-;29196:3;29217:67;29281:2;29276:3;29217:67;:::i;:::-;29210:74;;29293:93;29382:3;29293:93;:::i;:::-;29411:2;29406:3;29402:12;29395:19;;29054:366;;;:::o;29426:419::-;29592:4;29630:2;29619:9;29615:18;29607:26;;29679:9;29673:4;29669:20;29665:1;29654:9;29650:17;29643:47;29707:131;29833:4;29707:131;:::i;:::-;29699:139;;29426:419;;;:::o;29851:194::-;29891:4;29911:20;29929:1;29911:20;:::i;:::-;29906:25;;29945:20;29963:1;29945:20;:::i;:::-;29940:25;;29989:1;29986;29982:9;29974:17;;30013:1;30007:4;30004:11;30001:37;;;30018:18;;:::i;:::-;30001:37;29851:194;;;;:::o;30051:169::-;30191:21;30187:1;30179:6;30175:14;30168:45;30051:169;:::o;30226:366::-;30368:3;30389:67;30453:2;30448:3;30389:67;:::i;:::-;30382:74;;30465:93;30554:3;30465:93;:::i;:::-;30583:2;30578:3;30574:12;30567:19;;30226:366;;;:::o;30598:419::-;30764:4;30802:2;30791:9;30787:18;30779:26;;30851:9;30845:4;30841:20;30837:1;30826:9;30822:17;30815:47;30879:131;31005:4;30879:131;:::i;:::-;30871:139;;30598:419;;;:::o;31023:234::-;31163:34;31159:1;31151:6;31147:14;31140:58;31232:17;31227:2;31219:6;31215:15;31208:42;31023:234;:::o;31263:366::-;31405:3;31426:67;31490:2;31485:3;31426:67;:::i;:::-;31419:74;;31502:93;31591:3;31502:93;:::i;:::-;31620:2;31615:3;31611:12;31604:19;;31263:366;;;:::o;31635:419::-;31801:4;31839:2;31828:9;31824:18;31816:26;;31888:9;31882:4;31878:20;31874:1;31863:9;31859:17;31852:47;31916:131;32042:4;31916:131;:::i;:::-;31908:139;;31635:419;;;:::o;32060:148::-;32162:11;32199:3;32184:18;;32060:148;;;;:::o;32214:390::-;32320:3;32348:39;32381:5;32348:39;:::i;:::-;32403:89;32485:6;32480:3;32403:89;:::i;:::-;32396:96;;32501:65;32559:6;32554:3;32547:4;32540:5;32536:16;32501:65;:::i;:::-;32591:6;32586:3;32582:16;32575:23;;32324:280;32214:390;;;;:::o;32610:155::-;32750:7;32746:1;32738:6;32734:14;32727:31;32610:155;:::o;32771:400::-;32931:3;32952:84;33034:1;33029:3;32952:84;:::i;:::-;32945:91;;33045:93;33134:3;33045:93;:::i;:::-;33163:1;33158:3;33154:11;33147:18;;32771:400;;;:::o;33177:701::-;33458:3;33480:95;33571:3;33562:6;33480:95;:::i;:::-;33473:102;;33592:95;33683:3;33674:6;33592:95;:::i;:::-;33585:102;;33704:148;33848:3;33704:148;:::i;:::-;33697:155;;33869:3;33862:10;;33177:701;;;;;:::o;33884:225::-;34024:34;34020:1;34012:6;34008:14;34001:58;34093:8;34088:2;34080:6;34076:15;34069:33;33884:225;:::o;34115:366::-;34257:3;34278:67;34342:2;34337:3;34278:67;:::i;:::-;34271:74;;34354:93;34443:3;34354:93;:::i;:::-;34472:2;34467:3;34463:12;34456:19;;34115:366;;;:::o;34487:419::-;34653:4;34691:2;34680:9;34676:18;34668:26;;34740:9;34734:4;34730:20;34726:1;34715:9;34711:17;34704:47;34768:131;34894:4;34768:131;:::i;:::-;34760:139;;34487:419;;;:::o;34912:180::-;34960:77;34957:1;34950:88;35057:4;35054:1;35047:15;35081:4;35078:1;35071:15;35098:233;35137:3;35160:24;35178:5;35160:24;:::i;:::-;35151:33;;35206:66;35199:5;35196:77;35193:103;;35276:18;;:::i;:::-;35193:103;35323:1;35316:5;35312:13;35305:20;;35098:233;;;:::o;35337:229::-;35477:34;35473:1;35465:6;35461:14;35454:58;35546:12;35541:2;35533:6;35529:15;35522:37;35337:229;:::o;35572:366::-;35714:3;35735:67;35799:2;35794:3;35735:67;:::i;:::-;35728:74;;35811:93;35900:3;35811:93;:::i;:::-;35929:2;35924:3;35920:12;35913:19;;35572:366;;;:::o;35944:419::-;36110:4;36148:2;36137:9;36133:18;36125:26;;36197:9;36191:4;36187:20;36183:1;36172:9;36168:17;36161:47;36225:131;36351:4;36225:131;:::i;:::-;36217:139;;35944:419;;;:::o;36369:175::-;36509:27;36505:1;36497:6;36493:14;36486:51;36369:175;:::o;36550:366::-;36692:3;36713:67;36777:2;36772:3;36713:67;:::i;:::-;36706:74;;36789:93;36878:3;36789:93;:::i;:::-;36907:2;36902:3;36898:12;36891:19;;36550:366;;;:::o;36922:419::-;37088:4;37126:2;37115:9;37111:18;37103:26;;37175:9;37169:4;37165:20;37161:1;37150:9;37146:17;37139:47;37203:131;37329:4;37203:131;:::i;:::-;37195:139;;36922:419;;;:::o;37347:176::-;37379:1;37396:20;37414:1;37396:20;:::i;:::-;37391:25;;37430:20;37448:1;37430:20;:::i;:::-;37425:25;;37469:1;37459:35;;37474:18;;:::i;:::-;37459:35;37515:1;37512;37508:9;37503:14;;37347:176;;;;:::o;37529:98::-;37580:6;37614:5;37608:12;37598:22;;37529:98;;;:::o;37633:168::-;37716:11;37750:6;37745:3;37738:19;37790:4;37785:3;37781:14;37766:29;;37633:168;;;;:::o;37807:373::-;37893:3;37921:38;37953:5;37921:38;:::i;:::-;37975:70;38038:6;38033:3;37975:70;:::i;:::-;37968:77;;38054:65;38112:6;38107:3;38100:4;38093:5;38089:16;38054:65;:::i;:::-;38144:29;38166:6;38144:29;:::i;:::-;38139:3;38135:39;38128:46;;37897:283;37807:373;;;;:::o;38186:640::-;38381:4;38419:3;38408:9;38404:19;38396:27;;38433:71;38501:1;38490:9;38486:17;38477:6;38433:71;:::i;:::-;38514:72;38582:2;38571:9;38567:18;38558:6;38514:72;:::i;:::-;38596;38664:2;38653:9;38649:18;38640:6;38596:72;:::i;:::-;38715:9;38709:4;38705:20;38700:2;38689:9;38685:18;38678:48;38743:76;38814:4;38805:6;38743:76;:::i;:::-;38735:84;;38186:640;;;;;;;:::o;38832:141::-;38888:5;38919:6;38913:13;38904:22;;38935:32;38961:5;38935:32;:::i;:::-;38832:141;;;;:::o;38979:349::-;39048:6;39097:2;39085:9;39076:7;39072:23;39068:32;39065:119;;;39103:79;;:::i;:::-;39065:119;39223:1;39248:63;39303:7;39294:6;39283:9;39279:22;39248:63;:::i;:::-;39238:73;;39194:127;38979:349;;;;:::o

Swarm Source

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