ETH Price: $2,520.75 (-0.17%)

Token

VOGUE8SIAN (EXV)
 

Overview

Max Total Supply

1,308 EXV

Holders

430

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 EXV
0xae342bc1ddace51f674151633f9fb3f52440e961
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:
EXV

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

pragma solidity ^0.8.14;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
/**
 * @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;
    }
}


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

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

    bool private _paused;

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

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

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

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

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

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

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

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


// ERC721A Contracts v4.2.3
// Creator: Chiru Labs
/**
 * @dev Interface of ERC721A.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// ERC721A Contracts v4.2.3
// Creator: Chiru Labs
/**
 * @dev Interface of ERC721 token receiver.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See {_packedOwnershipOf} implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

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

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

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

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

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

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256 packed) {
        if (_startTokenId() <= tokenId) {
            packed = _packedOwnerships[tokenId];
            // If not burned.
            if (packed & _BITMASK_BURNED == 0) {
                // If the data at the starting slot does not exist, start the scan.
                if (packed == 0) {
                    if (tokenId >= _currentIndex) revert OwnerQueryForNonexistentToken();
                    // Invariant:
                    // There will always be an initialized ownership slot
                    // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                    // before an unintialized ownership slot
                    // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                    // Hence, `tokenId` will not underflow.
                    //
                    // We can directly compare the packed value.
                    // If the address is zero, packed will be zero.
                    for (;;) {
                        unchecked {
                            packed = _packedOwnerships[--tokenId];
                        }
                        if (packed == 0) continue;
                        return packed;
                    }
                }
                // Otherwise, the data exists and is not burned. We can skip the scan.
                // This is possible because we have already achieved the target condition.
                // This saves 2143 gas on transfers of initialized tokens.
                return packed;
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

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

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

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

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account. See {ERC721A-_approve}.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     */
    function approve(address to, uint256 tokenId) public payable virtual override {
        _approve(to, tokenId, true);
    }

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

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom}
     * for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

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

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

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

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

    function tokensOfOwner(address owner) external view virtual returns (uint256[] memory) {
        uint256 tokenIdsLength = balanceOf(owner);
        uint256[] memory tokenIds;
        assembly {
            // Grab the free memory pointer.
            tokenIds := mload(0x40)
            // Allocate one word for the length, and `tokenIdsMaxLength` words
            // for the data. `shl(5, x)` is equivalent to `mul(32, x)`.
            mstore(0x40, add(tokenIds, shl(5, add(tokenIdsLength, 1))))
            // Store the length of `tokenIds`.
            mstore(tokenIds, tokenIdsLength)
        }
        address currOwnershipAddr;
        uint256 tokenIdsIdx;
        for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ) {
            TokenOwnership memory ownership = _ownershipAt(i);
            assembly {
                // if `ownership.burned == false`.
                if iszero(mload(add(ownership, 0x40))) {
                    // if `ownership.addr != address(0)`.
                    // The `addr` already has it's upper 96 bits clearned,
                    // since it is written to memory with regular Solidity.
                    if mload(ownership) {
                        currOwnershipAddr := mload(ownership)
                    }
                    // if `currOwnershipAddr == owner`.
                    // The `shl(96, x)` is to make the comparison agnostic to any
                    // dirty upper 96 bits in `owner`.
                    if iszero(shl(96, xor(currOwnershipAddr, owner))) {
                        tokenIdsIdx := add(tokenIdsIdx, 1)
                        mstore(add(tokenIds, shl(5, tokenIdsIdx)), i)
                    }
                }
                i := add(i, 1)
            }
        }
        return tokenIds;
    }

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public payable virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

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

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

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

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

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

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

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

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

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @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:
     *
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        bool approvalCheck
    ) internal virtual {
        address owner = ownerOf(tokenId);

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

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

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

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

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

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

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

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

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


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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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


// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol)
/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The tree and the proofs can be generated using our
 * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
 * You will find a quickstart guide in the readme.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 * OpenZeppelin's JavaScript library generates merkle trees that are safe
 * against this attack out of the box.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

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

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

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

    /**
     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

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

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

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

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

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

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

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

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

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


abstract contract GuaranteelistMerkle is Ownable {
    bytes32 public guaranteelistMerkleRoot;

    /* @notice constructor
       @param _premiumWhitelistMerkleRoot the root of the premium whitelist merkle tree
       @param _standardWhitelistMerkleRoot the root of the standard whitelist merkle tree
       */
    constructor(bytes32 _guaranteelistMerkleRoot) {
        guaranteelistMerkleRoot = _guaranteelistMerkleRoot;
    }

    /* @notice set the premium whitelist merkle root
       @dev If the merkle root is changed, the whitelist is reset
       @param _merkleRoot the root of the merkle tree
       */
    function setguaranteelistMerkleRoot(bytes32 _merkleRoot) external onlyOwner {
        guaranteelistMerkleRoot = _merkleRoot;
    }

    function _isguaranteeListed(address _account, bytes32[] calldata _merkleProof)
    internal
    view
    returns (bool)
    {
        return
        MerkleProof.verify(
            _merkleProof,
            guaranteelistMerkleRoot,
            keccak256(abi.encodePacked(_account))
        );
    }

    /* @notice Check if an account is premium whitelisted
       @dev verifies the merkle proof
       @param _account the account to check if it is whitelisted
       @param _merkleProof the merkle proof of for the whitelist
       @return true if the account is whitelisted
       */
    function isguaranteeListed(address _account, bytes32[] calldata _merkleProof)
    external
    view
    returns (bool)
    {
        return _isguaranteeListed(_account, _merkleProof);
    }
}

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) 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);
}

abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        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(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), msg.sender)) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
        _;
    }
}


/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 */
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
/**
 * @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);
}


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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * 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 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * 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);
}


contract EXV is ERC721A, GuaranteelistMerkle, Pausable, ReentrancyGuard, DefaultOperatorFilterer {

    uint256 public MAX_SUPPLY = 6000;
    uint256 public constant RESERVE_MAX_SUPPLY = 100;
    uint256 public MAX_FREEMINT = 100;
    uint256 public constant ALLOWLISTLIST_MAX_SUPPLY = 2000;
    uint256 public publicPrice = 22000000000000000;

    struct TimeConfig {
        uint256 premiumSaleStartTime;
        uint256 standardSaleStartTime;
        uint256 freeSaleStartTime;
    }

    TimeConfig public timeConfig;

    uint256 public mintedDevSupply;
    uint256 public mintedAllowlistSupply;
    uint256 public mintedFreeSupply;

    string public baseURI;

    mapping(address => uint256) public maxWalletMinted;
    mapping(address => bool) public freeMinted;

    constructor(string memory initBaseURI, bytes32 _guaranteelistMerkleRoot)
    ERC721A("VOGUE8SIAN", "EXV")
    GuaranteelistMerkle(_guaranteelistMerkleRoot)
    {
        baseURI = initBaseURI;
    }

    address public baycContractAddress = 0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D;
    address public maycContractAddress = 0x60E4d786628Fea6478F785A6d7e704777c86a7c6;
    address public cryptopunkContractAddress = 0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB;

    function pause() public onlyOwner {
        _pause();
    }

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

    /* Time Control */

    function setPremiumSaleStartTime(uint32 timestamp) external onlyOwner {
        timeConfig.premiumSaleStartTime = timestamp;
    }

    function setStandardSaleStartTime(uint32 timestamp) external onlyOwner {
        timeConfig.standardSaleStartTime = timestamp;
    }

    function setFreeSaleStartTime(uint32 timestamp) external onlyOwner {
        timeConfig.freeSaleStartTime = timestamp;
    }

    function setMaxSupply(uint256 _newMaxSupply) external onlyOwner {
        MAX_SUPPLY = _newMaxSupply;
    }

    function setPrice(uint256 _newPrice) external onlyOwner {
        publicPrice = _newPrice;
    }

   function setbaycContractAddress(address _address) external onlyOwner {
        baycContractAddress = _address;
    }

    function setmaycContractAddress(address _address) external onlyOwner {
        maycContractAddress = _address;
    }

    function setcryptopunkContractAddress(address _address) external onlyOwner {
        cryptopunkContractAddress = _address;
    }
    /* ETH Withdraw */

    function withdrawETH() external onlyOwner nonReentrant {
        (bool success, ) = msg.sender.call{value: address(this).balance}("");
        require(success, "Transfer failed.");
    }

    /* Minting */

    // @notice For marketing etc.
    function reserveMint(uint256 quantity) external onlyOwner {
        require(
            mintedDevSupply + quantity*2 <= RESERVE_MAX_SUPPLY,
            "too many already minted before reserve mint"
        );
        mintedDevSupply += quantity*2;
        _safeMint(msg.sender, quantity*2);
    }
// 0x7fab62c37e16db44bb9d0a15b6e0b889b0bd1e4ec935644989bc25ef72db5eac
    /* @notice Safely mints NFTs from premium whitelist.
       @dev free mint
       */
    function allowlistMint(bytes32[] calldata _merkleProof, uint256 quantity) external payable whenNotPaused nonReentrant{
        uint256 _premiumSaleStartTime = uint256(timeConfig.premiumSaleStartTime);
        require(
            _premiumSaleStartTime != 0 && block.timestamp >= _premiumSaleStartTime,
            "not in the premium sale time"
        );
        require(MerkleProof.verify(_merkleProof, guaranteelistMerkleRoot, keccak256(abi.encodePacked(msg.sender))),
            "Invalid MerkleProof"
        );
        require(maxWalletMinted[msg.sender] + quantity < 5, "Max mint of 4 per wallet");
        require(
            mintedAllowlistSupply + 2 <= ALLOWLISTLIST_MAX_SUPPLY,
            "not enough remaining reserved for premium sale to support desired mint amount"
        );
        require(msg.value >= (publicPrice * quantity), "Need to send more ETH.");   
        require(msg.value <= (publicPrice * quantity), "You have tried to send too much ETH");
        mintedAllowlistSupply += 2;
        maxWalletMinted[msg.sender] += quantity;
        publicSaleMint(quantity);
    }

    /* @notice Safely mints NFTs from standard whitelist.
       @dev free mint
       */
    function freemint() public payable whenNotPaused nonReentrant {
        require(
            !freeMinted[msg.sender], "You have already claimed your free mint"
        );
        require(
            mintedFreeSupply < MAX_FREEMINT, "Free Mint has been fully claimed"
        );
        uint256 _freeSaleStartTime = uint256(timeConfig.freeSaleStartTime);
        require(
            _freeSaleStartTime != 0 && block.timestamp >= _freeSaleStartTime,
            "not in the free sale time"
        );
        IERC721 token = IERC721(baycContractAddress);
        uint256 ownerAmount = token.balanceOf(msg.sender);
        IERC721 token2 = IERC721(maycContractAddress);
        ownerAmount += token2.balanceOf(msg.sender);
        IERC721 token3 = IERC721(cryptopunkContractAddress);
        ownerAmount += token3.balanceOf(msg.sender);
        require(ownerAmount >=1, "You don't qualify for the free mint");
        mintedFreeSupply += 2;
        freeMinted[msg.sender] = true;
        _safeMint(msg.sender, 2);
    }

    /* @notice Safely mints NFTs from standard whitelist.
       @dev free mint
       */
    function mint(uint256 quantity) public payable whenNotPaused nonReentrant {
        uint256 _standardSaleStartTime = uint256(timeConfig.standardSaleStartTime);
        require(
             _standardSaleStartTime != 0 && block.timestamp >= _standardSaleStartTime,
            "sale not started"
        );
        require(quantity < 5, "Max mint of 4 per transaction");
        publicSaleMint(quantity);
    }

    function publicSaleMint(uint256 quantity)
        private
        callerIsUser
    {
        require(totalSupply() + quantity*2 <= MAX_SUPPLY, "reached max supply");
        require(msg.value >= (publicPrice * quantity), "Need to send more ETH.");
        require(msg.value <= (publicPrice * quantity), "You have tried to send too much ETH");
        _safeMint(msg.sender, quantity*2);
    }

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

    function setBaseURI(string memory _tokenBaseURI) external onlyOwner {
        baseURI = _tokenBaseURI;
    }

    /* Operator filtering */

    function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
    }

    function approve(address operator, uint256 tokenId) public payable override onlyAllowedOperatorApproval(operator) {
        super.approve(operator, tokenId);
    }

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

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

    /* Modifiers */

    modifier callerIsUser() {
        require(tx.origin == msg.sender, "The caller is another contract");
        _;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"initBaseURI","type":"string"},{"internalType":"bytes32","name":"_guaranteelistMerkleRoot","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"ALLOWLISTLIST_MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FREEMINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVE_MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"allowlistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baycContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cryptopunkContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freemint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"guaranteelistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"isguaranteeListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"maxWalletMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maycContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintedAllowlistSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintedDevSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintedFreeSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"reserveMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"timestamp","type":"uint32"}],"name":"setFreeSaleStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"timestamp","type":"uint32"}],"name":"setPremiumSaleStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"timestamp","type":"uint32"}],"name":"setStandardSaleStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setbaycContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setcryptopunkContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setguaranteelistMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setmaycContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeConfig","outputs":[{"internalType":"uint256","name":"premiumSaleStartTime","type":"uint256"},{"internalType":"uint256","name":"standardSaleStartTime","type":"uint256"},{"internalType":"uint256","name":"freeSaleStartTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052611770600c556064600d55664e28e2290f0000600e5573bc4ca0eda7647a8ab7c2061c2e118a18a936f13d601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507360e4d786628fea6478f785a6d7e704777c86a7c6601960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073b47e3cd837ddf8e4c57f05d70ab865de6e193bbb601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200012657600080fd5b5060405162005d5838038062005d5883398181016040528101906200014c919062000709565b733cc6cdda760b79bafa08df41ecfa224f810dceb66001826040518060400160405280600a81526020017f564f475545385349414e000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f45585600000000000000000000000000000000000000000000000000000000008152508160029081620001e19190620009ba565b508060039081620001f39190620009ba565b50620002046200046860201b60201c565b60008190555050506200022c620002206200046d60201b60201c565b6200047560201b60201c565b80600981905550506000600a60006101000a81548160ff0219169083151502179055506001600b8190555060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200044c57801562000312576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620002d892919062000ae6565b600060405180830381600087803b158015620002f357600080fd5b505af115801562000308573d6000803e3d6000fd5b505050506200044b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620003cc576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200039292919062000ae6565b600060405180830381600087803b158015620003ad57600080fd5b505af1158015620003c2573d6000803e3d6000fd5b505050506200044a565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b815260040162000415919062000b13565b600060405180830381600087803b1580156200043057600080fd5b505af115801562000445573d6000803e3d6000fd5b505050505b5b5b505081601590816200045f9190620009ba565b50505062000b30565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620005a48262000559565b810181811067ffffffffffffffff82111715620005c657620005c56200056a565b5b80604052505050565b6000620005db6200053b565b9050620005e9828262000599565b919050565b600067ffffffffffffffff8211156200060c576200060b6200056a565b5b620006178262000559565b9050602081019050919050565b60005b838110156200064457808201518184015260208101905062000627565b60008484015250505050565b6000620006676200066184620005ee565b620005cf565b90508281526020810184848401111562000686576200068562000554565b5b6200069384828562000624565b509392505050565b600082601f830112620006b357620006b26200054f565b5b8151620006c584826020860162000650565b91505092915050565b6000819050919050565b620006e381620006ce565b8114620006ef57600080fd5b50565b6000815190506200070381620006d8565b92915050565b6000806040838503121562000723576200072262000545565b5b600083015167ffffffffffffffff8111156200074457620007436200054a565b5b62000752858286016200069b565b92505060206200076585828601620006f2565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620007c257607f821691505b602082108103620007d857620007d76200077a565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620008427fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000803565b6200084e868362000803565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200089b620008956200088f8462000866565b62000870565b62000866565b9050919050565b6000819050919050565b620008b7836200087a565b620008cf620008c682620008a2565b84845462000810565b825550505050565b600090565b620008e6620008d7565b620008f3818484620008ac565b505050565b5b818110156200091b576200090f600082620008dc565b600181019050620008f9565b5050565b601f8211156200096a576200093481620007de565b6200093f84620007f3565b810160208510156200094f578190505b620009676200095e85620007f3565b830182620008f8565b50505b505050565b600082821c905092915050565b60006200098f600019846008026200096f565b1980831691505092915050565b6000620009aa83836200097c565b9150826002028217905092915050565b620009c5826200076f565b67ffffffffffffffff811115620009e157620009e06200056a565b5b620009ed8254620007a9565b620009fa8282856200091f565b600060209050601f83116001811462000a32576000841562000a1d578287015190505b62000a2985826200099c565b86555062000a99565b601f19841662000a4286620007de565b60005b8281101562000a6c5784890151825560018201915060208501945060208101905062000a45565b8683101562000a8c578489015162000a88601f8916826200097c565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000ace8262000aa1565b9050919050565b62000ae08162000ac1565b82525050565b600060408201905062000afd600083018562000ad5565b62000b0c602083018462000ad5565b9392505050565b600060208201905062000b2a600083018462000ad5565b92915050565b6152188062000b406000396000f3fe6080604052600436106103355760003560e01c80638456cb59116101ab578063aed8ad91116100f7578063e086e5ec11610095578063e985e9c51161006f578063e985e9c514610b84578063f2fde38b14610bc1578063f9cb63ac14610bea578063fe5df67e14610bf457610335565b8063e086e5ec14610b17578063e3c820a214610b2e578063e8ff6e6514610b5957610335565b8063c0bef6ce116100d1578063c0bef6ce14610a5b578063c269932614610a86578063c87b56dd14610ab1578063d8b3a7e614610aee57610335565b8063aed8ad91146109e9578063af45ec4714610a14578063b88d4fde14610a3f57610335565b806395d89b4111610164578063a22cb4651161013e578063a22cb4651461093f578063a5968aac14610968578063a945bf8014610993578063a9e00c3f146109be57610335565b806395d89b41146108bb5780639d718eff146108e6578063a0712d681461092357610335565b80638456cb59146107bb5780638462151c146107d257806389bfe5491461080f5780638ab120a41461083c5780638da5cb5b1461086757806391b7f5ed1461089257610335565b8063371b3c43116102855780635e676d1b116102235780636c0360eb116101fd5780636c0360eb146107135780636f8b44b01461073e57806370a0823114610767578063715018a6146107a457610335565b80635e676d1b14610684578063616225cd146106ad5780636352211e146106d657610335565b806341f434341161025f57806341f43434146105e957806342842e0e1461061457806355f804b3146106305780635c975abb1461065957610335565b8063371b3c431461056c578063389fcf06146105955780633f4ba83a146105d257610335565b80631342ff4c116102f257806323b872dd116102cc57806323b872dd146104d357806324216811146104ef57806332cb6b0c1461051857806336a75eb81461054357610335565b80631342ff4c1461045457806318160ddd1461047d5780631a14b227146104a857610335565b806301ffc9a71461033a57806306fdde0314610377578063081812fc146103a2578063095ea7b3146103df57806310c54350146103fb5780631338a83f14610438575b600080fd5b34801561034657600080fd5b50610361600480360381019061035c9190613794565b610c1d565b60405161036e91906137dc565b60405180910390f35b34801561038357600080fd5b5061038c610caf565b6040516103999190613887565b60405180910390f35b3480156103ae57600080fd5b506103c960048036038101906103c491906138df565b610d41565b6040516103d6919061394d565b60405180910390f35b6103f960048036038101906103f49190613994565b610dc0565b005b34801561040757600080fd5b50610422600480360381019061041d9190613a39565b610eca565b60405161042f91906137dc565b60405180910390f35b610452600480360381019061044d9190613a99565b610ee0565b005b34801561046057600080fd5b5061047b600480360381019061047691906138df565b611204565b005b34801561048957600080fd5b506104926112a7565b60405161049f9190613b08565b60405180910390f35b3480156104b457600080fd5b506104bd6112be565b6040516104ca919061394d565b60405180910390f35b6104ed60048036038101906104e89190613b23565b6112e4565b005b3480156104fb57600080fd5b5061051660048036038101906105119190613bb2565b611434565b005b34801561052457600080fd5b5061052d61144f565b60405161053a9190613b08565b60405180910390f35b34801561054f57600080fd5b5061056a60048036038101906105659190613bdf565b611455565b005b34801561057857600080fd5b50610593600480360381019061058e9190613bdf565b6114a1565b005b3480156105a157600080fd5b506105bc60048036038101906105b79190613bdf565b6114ed565b6040516105c991906137dc565b60405180910390f35b3480156105de57600080fd5b506105e761150d565b005b3480156105f557600080fd5b506105fe61151f565b60405161060b9190613c6b565b60405180910390f35b61062e60048036038101906106299190613b23565b611531565b005b34801561063c57600080fd5b5061065760048036038101906106529190613db6565b611681565b005b34801561066557600080fd5b5061066e61169c565b60405161067b91906137dc565b60405180910390f35b34801561069057600080fd5b506106ab60048036038101906106a69190613bb2565b6116b3565b005b3480156106b957600080fd5b506106d460048036038101906106cf9190613e35565b6116ce565b005b3480156106e257600080fd5b506106fd60048036038101906106f891906138df565b6116e0565b60405161070a919061394d565b60405180910390f35b34801561071f57600080fd5b506107286116f2565b6040516107359190613887565b60405180910390f35b34801561074a57600080fd5b50610765600480360381019061076091906138df565b611780565b005b34801561077357600080fd5b5061078e60048036038101906107899190613bdf565b611792565b60405161079b9190613b08565b60405180910390f35b3480156107b057600080fd5b506107b961184a565b005b3480156107c757600080fd5b506107d061185e565b005b3480156107de57600080fd5b506107f960048036038101906107f49190613bdf565b611870565b6040516108069190613f20565b60405180910390f35b34801561081b57600080fd5b50610824611901565b60405161083393929190613f42565b60405180910390f35b34801561084857600080fd5b50610851611919565b60405161085e9190613b08565b60405180910390f35b34801561087357600080fd5b5061087c61191f565b604051610889919061394d565b60405180910390f35b34801561089e57600080fd5b506108b960048036038101906108b491906138df565b611949565b005b3480156108c757600080fd5b506108d061195b565b6040516108dd9190613887565b60405180910390f35b3480156108f257600080fd5b5061090d60048036038101906109089190613bdf565b6119ed565b60405161091a9190613b08565b60405180910390f35b61093d600480360381019061093891906138df565b611a05565b005b34801561094b57600080fd5b5061096660048036038101906109619190613fa5565b611ac7565b005b34801561097457600080fd5b5061097d611bd1565b60405161098a9190613b08565b60405180910390f35b34801561099f57600080fd5b506109a8611bd7565b6040516109b59190613b08565b60405180910390f35b3480156109ca57600080fd5b506109d3611bdd565b6040516109e09190613ff4565b60405180910390f35b3480156109f557600080fd5b506109fe611be3565b604051610a0b9190613b08565b60405180910390f35b348015610a2057600080fd5b50610a29611be9565b604051610a36919061394d565b60405180910390f35b610a596004803603810190610a5491906140b0565b611c0f565b005b348015610a6757600080fd5b50610a70611c82565b604051610a7d9190613b08565b60405180910390f35b348015610a9257600080fd5b50610a9b611c88565b604051610aa89190613b08565b60405180910390f35b348015610abd57600080fd5b50610ad86004803603810190610ad391906138df565b611c8d565b604051610ae59190613887565b60405180910390f35b348015610afa57600080fd5b50610b156004803603810190610b109190613bb2565b611d2b565b005b348015610b2357600080fd5b50610b2c611d46565b005b348015610b3a57600080fd5b50610b43611e0d565b604051610b509190613b08565b60405180910390f35b348015610b6557600080fd5b50610b6e611e13565b604051610b7b919061394d565b60405180910390f35b348015610b9057600080fd5b50610bab6004803603810190610ba69190614133565b611e39565b604051610bb891906137dc565b60405180910390f35b348015610bcd57600080fd5b50610be86004803603810190610be39190613bdf565b611ecd565b005b610bf2611f50565b005b348015610c0057600080fd5b50610c1b6004803603810190610c169190613bdf565b61235e565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c7857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ca85750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610cbe906141a2565b80601f0160208091040260200160405190810160405280929190818152602001828054610cea906141a2565b8015610d375780601f10610d0c57610100808354040283529160200191610d37565b820191906000526020600020905b815481529060010190602001808311610d1a57829003601f168201915b5050505050905090565b6000610d4c826123aa565b610d82576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610ebb576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610e389291906141d3565b602060405180830381865afa158015610e55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e799190614211565b610eba57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610eb1919061394d565b60405180910390fd5b5b610ec58383612409565b505050565b6000610ed7848484612419565b90509392505050565b610ee8612498565b610ef06124e2565b6000600f60000154905060008114158015610f0b5750804210155b610f4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f419061428a565b60405180910390fd5b610fbe848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060095433604051602001610fa391906142f2565b60405160208183030381529060405280519060200120612531565b610ffd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff490614359565b60405180910390fd5b600582601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461104a91906143a8565b1061108a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108190614428565b60405180910390fd5b6107d0600260135461109c91906143a8565b11156110dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d4906144e0565b60405180910390fd5b81600e546110eb9190614500565b34101561112d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111249061458e565b60405180910390fd5b81600e5461113b9190614500565b34111561117d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117490614620565b60405180910390fd5b60026013600082825461119091906143a8565b9250508190555081601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111e691906143a8565b925050819055506111f682612548565b506111ff6126d2565b505050565b61120c6126dc565b606460028261121b9190614500565b60125461122891906143a8565b1115611269576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611260906146b2565b60405180910390fd5b6002816112769190614500565b6012600082825461128791906143a8565b925050819055506112a43360028361129f9190614500565b61275a565b50565b60006112b1612778565b6001546000540303905090565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611422573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036113565761135184848461277d565b61142e565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161139f9291906141d3565b602060405180830381865afa1580156113bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e09190614211565b61142157336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611418919061394d565b60405180910390fd5b5b61142d84848461277d565b5b50505050565b61143c6126dc565b8063ffffffff16600f6001018190555050565b600c5481565b61145d6126dc565b80601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6114a96126dc565b80601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60176020528060005260406000206000915054906101000a900460ff1681565b6115156126dc565b61151d612a9f565b565b6daaeb6d7670e522a718067333cd4e81565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561166f573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036115a35761159e848484612b02565b61167b565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016115ec9291906141d3565b602060405180830381865afa158015611609573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162d9190614211565b61166e57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611665919061394d565b60405180910390fd5b5b61167a848484612b02565b5b50505050565b6116896126dc565b80601590816116989190614874565b5050565b6000600a60009054906101000a900460ff16905090565b6116bb6126dc565b8063ffffffff16600f6000018190555050565b6116d66126dc565b8060098190555050565b60006116eb82612b22565b9050919050565b601580546116ff906141a2565b80601f016020809104026020016040519081016040528092919081815260200182805461172b906141a2565b80156117785780601f1061174d57610100808354040283529160200191611778565b820191906000526020600020905b81548152906001019060200180831161175b57829003601f168201915b505050505081565b6117886126dc565b80600c8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117f9576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6118526126dc565b61185c6000612c1a565b565b6118666126dc565b61186e612ce0565b565b6060600061187d83611792565b9050606060405190506001820160051b810160405281815260008060006118a2612778565b90505b8482146118f45760006118b782612d43565b905060408101516118e8578051156118ce57805193505b87841860601b6118e757600183019250818360051b8601525b5b600182019150506118a5565b5082945050505050919050565b600f8060000154908060010154908060020154905083565b6107d081565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6119516126dc565b80600e8190555050565b60606003805461196a906141a2565b80601f0160208091040260200160405190810160405280929190818152602001828054611996906141a2565b80156119e35780601f106119b8576101008083540402835291602001916119e3565b820191906000526020600020905b8154815290600101906020018083116119c657829003601f168201915b5050505050905090565b60166020528060005260406000206000915090505481565b611a0d612498565b611a156124e2565b6000600f60010154905060008114158015611a305750804210155b611a6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6690614992565b60405180910390fd5b60058210611ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa9906149fe565b60405180910390fd5b611abb82612548565b50611ac46126d2565b50565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611bc2576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611b3f9291906141d3565b602060405180830381865afa158015611b5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b809190614211565b611bc157806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611bb8919061394d565b60405180910390fd5b5b611bcc8383612d6e565b505050565b60145481565b600e5481565b60095481565b60125481565b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611c1a8484846112e4565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611c7c57611c4584848484612e79565b611c7b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60135481565b606481565b6060611c98826123aa565b611cce576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611cd8612fc9565b90506000815103611cf85760405180602001604052806000815250611d23565b80611d028461305b565b604051602001611d13929190614a5a565b6040516020818303038152906040525b915050919050565b611d336126dc565b8063ffffffff16600f6002018190555050565b611d4e6126dc565b611d566124e2565b60003373ffffffffffffffffffffffffffffffffffffffff1647604051611d7c90614aaf565b60006040518083038185875af1925050503d8060008114611db9576040519150601f19603f3d011682016040523d82523d6000602084013e611dbe565b606091505b5050905080611e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df990614b10565b60405180910390fd5b50611e0b6126d2565b565b600d5481565b601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ed56126dc565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3b90614ba2565b60405180910390fd5b611f4d81612c1a565b50565b611f58612498565b611f606124e2565b601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611fed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe490614c34565b60405180910390fd5b600d5460145410612033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202a90614ca0565b60405180910390fd5b6000600f6002015490506000811415801561204e5750804210155b61208d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208490614d0c565b60405180910390fd5b6000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016120ef919061394d565b602060405180830381865afa15801561210c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121309190614d41565b90506000601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401612192919061394d565b602060405180830381865afa1580156121af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121d39190614d41565b826121de91906143a8565b91506000601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401612240919061394d565b602060405180830381865afa15801561225d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122819190614d41565b8361228c91906143a8565b925060018310156122d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c990614de0565b60405180910390fd5b6002601460008282546122e591906143a8565b925050819055506001601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061234f33600261275a565b505050505061235c6126d2565b565b6123666126dc565b80601960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000816123b5612778565b111580156123c4575060005482105b8015612402575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b612415828260016130ab565b5050565b600061248f838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506009548660405160200161247491906142f2565b60405160208183030381529060405280519060200120612531565b90509392505050565b6124a061169c565b156124e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d790614e4c565b60405180910390fd5b565b6002600b5403612527576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251e90614eb8565b60405180910390fd5b6002600b81905550565b60008261253e85846131f7565b1490509392505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146125b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ad90614f24565b60405180910390fd5b600c546002826125c69190614500565b6125ce6112a7565b6125d891906143a8565b1115612619576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261090614f90565b60405180910390fd5b80600e546126279190614500565b341015612669576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126609061458e565b60405180910390fd5b80600e546126779190614500565b3411156126b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b090614620565b60405180910390fd5b6126cf336002836126ca9190614500565b61275a565b50565b6001600b81905550565b6126e461324d565b73ffffffffffffffffffffffffffffffffffffffff1661270261191f565b73ffffffffffffffffffffffffffffffffffffffff1614612758576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274f90614ffc565b60405180910390fd5b565b612774828260405180602001604052806000815250613255565b5050565b600090565b600061278882612b22565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146127ef576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806127fb846132f2565b91509150612811818761280c613319565b613321565b61285d5761282686612821613319565b611e39565b61285c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036128c3576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128d08686866001613365565b80156128db57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506129a98561298588888761336b565b7c020000000000000000000000000000000000000000000000000000000017613393565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603612a2f5760006001850190506000600460008381526020019081526020016000205403612a2d576000548114612a2c578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a9786868660016133be565b505050505050565b612aa76133c4565b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612aeb61324d565b604051612af8919061394d565b60405180910390a1565b612b1d83838360405180602001604052806000815250611c0f565b505050565b600081612b2d612778565b11612be3576004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612be25760008103612bdd576000548210612bb2576040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600460008360019003935083815260200190815260200160002054905060008103612c1557612bb3565b612c15565b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612ce8612498565b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612d2c61324d565b604051612d39919061394d565b60405180910390a1565b612d4b6136d9565b612d67600460008481526020019081526020016000205461340d565b9050919050565b8060076000612d7b613319565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612e28613319565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612e6d91906137dc565b60405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e9f613319565b8786866040518563ffffffff1660e01b8152600401612ec19493929190615071565b6020604051808303816000875af1925050508015612efd57506040513d601f19601f82011682018060405250810190612efa91906150d2565b60015b612f76573d8060008114612f2d576040519150601f19603f3d011682016040523d82523d6000602084013e612f32565b606091505b506000815103612f6e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060158054612fd8906141a2565b80601f0160208091040260200160405190810160405280929190818152602001828054613004906141a2565b80156130515780601f1061302657610100808354040283529160200191613051565b820191906000526020600020905b81548152906001019060200180831161303457829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b60011561309657600184039350600a81066030018453600a8104905080613074575b50828103602084039350808452505050919050565b60006130b6836116e0565b90508115613141578073ffffffffffffffffffffffffffffffffffffffff166130dd613319565b73ffffffffffffffffffffffffffffffffffffffff16146131405761310981613104613319565b611e39565b61313f576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b836006600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b60008082905060005b84518110156132425761322d828683815181106132205761321f6150ff565b5b60200260200101516134c3565b9150808061323a9061512e565b915050613200565b508091505092915050565b600033905090565b61325f83836134ee565b60008373ffffffffffffffffffffffffffffffffffffffff163b146132ed57600080549050600083820390505b61329f6000868380600101945086612e79565b6132d5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061328c5781600054146132ea57600080fd5b50505b505050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86133828686846136a9565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6133cc61169c565b61340b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613402906151c2565b60405180910390fd5b565b6134156136d9565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b60008183106134db576134d682846136b2565b6134e6565b6134e583836136b2565b5b905092915050565b6000805490506000820361352e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61353b6000848385613365565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506135b2836135a3600086600061336b565b6135ac856136c9565b17613393565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461365357808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613618565b506000820361368e576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506136a460008483856133be565b505050565b60009392505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6137718161373c565b811461377c57600080fd5b50565b60008135905061378e81613768565b92915050565b6000602082840312156137aa576137a9613732565b5b60006137b88482850161377f565b91505092915050565b60008115159050919050565b6137d6816137c1565b82525050565b60006020820190506137f160008301846137cd565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613831578082015181840152602081019050613816565b60008484015250505050565b6000601f19601f8301169050919050565b6000613859826137f7565b6138638185613802565b9350613873818560208601613813565b61387c8161383d565b840191505092915050565b600060208201905081810360008301526138a1818461384e565b905092915050565b6000819050919050565b6138bc816138a9565b81146138c757600080fd5b50565b6000813590506138d9816138b3565b92915050565b6000602082840312156138f5576138f4613732565b5b6000613903848285016138ca565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006139378261390c565b9050919050565b6139478161392c565b82525050565b6000602082019050613962600083018461393e565b92915050565b6139718161392c565b811461397c57600080fd5b50565b60008135905061398e81613968565b92915050565b600080604083850312156139ab576139aa613732565b5b60006139b98582860161397f565b92505060206139ca858286016138ca565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f8401126139f9576139f86139d4565b5b8235905067ffffffffffffffff811115613a1657613a156139d9565b5b602083019150836020820283011115613a3257613a316139de565b5b9250929050565b600080600060408486031215613a5257613a51613732565b5b6000613a608682870161397f565b935050602084013567ffffffffffffffff811115613a8157613a80613737565b5b613a8d868287016139e3565b92509250509250925092565b600080600060408486031215613ab257613ab1613732565b5b600084013567ffffffffffffffff811115613ad057613acf613737565b5b613adc868287016139e3565b93509350506020613aef868287016138ca565b9150509250925092565b613b02816138a9565b82525050565b6000602082019050613b1d6000830184613af9565b92915050565b600080600060608486031215613b3c57613b3b613732565b5b6000613b4a8682870161397f565b9350506020613b5b8682870161397f565b9250506040613b6c868287016138ca565b9150509250925092565b600063ffffffff82169050919050565b613b8f81613b76565b8114613b9a57600080fd5b50565b600081359050613bac81613b86565b92915050565b600060208284031215613bc857613bc7613732565b5b6000613bd684828501613b9d565b91505092915050565b600060208284031215613bf557613bf4613732565b5b6000613c038482850161397f565b91505092915050565b6000819050919050565b6000613c31613c2c613c278461390c565b613c0c565b61390c565b9050919050565b6000613c4382613c16565b9050919050565b6000613c5582613c38565b9050919050565b613c6581613c4a565b82525050565b6000602082019050613c806000830184613c5c565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613cc38261383d565b810181811067ffffffffffffffff82111715613ce257613ce1613c8b565b5b80604052505050565b6000613cf5613728565b9050613d018282613cba565b919050565b600067ffffffffffffffff821115613d2157613d20613c8b565b5b613d2a8261383d565b9050602081019050919050565b82818337600083830152505050565b6000613d59613d5484613d06565b613ceb565b905082815260208101848484011115613d7557613d74613c86565b5b613d80848285613d37565b509392505050565b600082601f830112613d9d57613d9c6139d4565b5b8135613dad848260208601613d46565b91505092915050565b600060208284031215613dcc57613dcb613732565b5b600082013567ffffffffffffffff811115613dea57613de9613737565b5b613df684828501613d88565b91505092915050565b6000819050919050565b613e1281613dff565b8114613e1d57600080fd5b50565b600081359050613e2f81613e09565b92915050565b600060208284031215613e4b57613e4a613732565b5b6000613e5984828501613e20565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613e97816138a9565b82525050565b6000613ea98383613e8e565b60208301905092915050565b6000602082019050919050565b6000613ecd82613e62565b613ed78185613e6d565b9350613ee283613e7e565b8060005b83811015613f13578151613efa8882613e9d565b9750613f0583613eb5565b925050600181019050613ee6565b5085935050505092915050565b60006020820190508181036000830152613f3a8184613ec2565b905092915050565b6000606082019050613f576000830186613af9565b613f646020830185613af9565b613f716040830184613af9565b949350505050565b613f82816137c1565b8114613f8d57600080fd5b50565b600081359050613f9f81613f79565b92915050565b60008060408385031215613fbc57613fbb613732565b5b6000613fca8582860161397f565b9250506020613fdb85828601613f90565b9150509250929050565b613fee81613dff565b82525050565b60006020820190506140096000830184613fe5565b92915050565b600067ffffffffffffffff82111561402a57614029613c8b565b5b6140338261383d565b9050602081019050919050565b600061405361404e8461400f565b613ceb565b90508281526020810184848401111561406f5761406e613c86565b5b61407a848285613d37565b509392505050565b600082601f830112614097576140966139d4565b5b81356140a7848260208601614040565b91505092915050565b600080600080608085870312156140ca576140c9613732565b5b60006140d88782880161397f565b94505060206140e98782880161397f565b93505060406140fa878288016138ca565b925050606085013567ffffffffffffffff81111561411b5761411a613737565b5b61412787828801614082565b91505092959194509250565b6000806040838503121561414a57614149613732565b5b60006141588582860161397f565b92505060206141698582860161397f565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806141ba57607f821691505b6020821081036141cd576141cc614173565b5b50919050565b60006040820190506141e8600083018561393e565b6141f5602083018461393e565b9392505050565b60008151905061420b81613f79565b92915050565b60006020828403121561422757614226613732565b5b6000614235848285016141fc565b91505092915050565b7f6e6f7420696e20746865207072656d69756d2073616c652074696d6500000000600082015250565b6000614274601c83613802565b915061427f8261423e565b602082019050919050565b600060208201905081810360008301526142a381614267565b9050919050565b60008160601b9050919050565b60006142c2826142aa565b9050919050565b60006142d4826142b7565b9050919050565b6142ec6142e78261392c565b6142c9565b82525050565b60006142fe82846142db565b60148201915081905092915050565b7f496e76616c6964204d65726b6c6550726f6f6600000000000000000000000000600082015250565b6000614343601383613802565b915061434e8261430d565b602082019050919050565b6000602082019050818103600083015261437281614336565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006143b3826138a9565b91506143be836138a9565b92508282019050808211156143d6576143d5614379565b5b92915050565b7f4d6178206d696e74206f662034207065722077616c6c65740000000000000000600082015250565b6000614412601883613802565b915061441d826143dc565b602082019050919050565b6000602082019050818103600083015261444181614405565b9050919050565b7f6e6f7420656e6f7567682072656d61696e696e6720726573657276656420666f60008201527f72207072656d69756d2073616c6520746f20737570706f72742064657369726560208201527f64206d696e7420616d6f756e7400000000000000000000000000000000000000604082015250565b60006144ca604d83613802565b91506144d582614448565b606082019050919050565b600060208201905081810360008301526144f9816144bd565b9050919050565b600061450b826138a9565b9150614516836138a9565b9250828202614524816138a9565b9150828204841483151761453b5761453a614379565b5b5092915050565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b6000614578601683613802565b915061458382614542565b602082019050919050565b600060208201905081810360008301526145a78161456b565b9050919050565b7f596f75206861766520747269656420746f2073656e6420746f6f206d7563682060008201527f4554480000000000000000000000000000000000000000000000000000000000602082015250565b600061460a602383613802565b9150614615826145ae565b604082019050919050565b60006020820190508181036000830152614639816145fd565b9050919050565b7f746f6f206d616e7920616c7265616479206d696e746564206265666f7265207260008201527f657365727665206d696e74000000000000000000000000000000000000000000602082015250565b600061469c602b83613802565b91506146a782614640565b604082019050919050565b600060208201905081810360008301526146cb8161468f565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026147347fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826146f7565b61473e86836146f7565b95508019841693508086168417925050509392505050565b600061477161476c614767846138a9565b613c0c565b6138a9565b9050919050565b6000819050919050565b61478b83614756565b61479f61479782614778565b848454614704565b825550505050565b600090565b6147b46147a7565b6147bf818484614782565b505050565b5b818110156147e3576147d86000826147ac565b6001810190506147c5565b5050565b601f821115614828576147f9816146d2565b614802846146e7565b81016020851015614811578190505b61482561481d856146e7565b8301826147c4565b50505b505050565b600082821c905092915050565b600061484b6000198460080261482d565b1980831691505092915050565b6000614864838361483a565b9150826002028217905092915050565b61487d826137f7565b67ffffffffffffffff81111561489657614895613c8b565b5b6148a082546141a2565b6148ab8282856147e7565b600060209050601f8311600181146148de57600084156148cc578287015190505b6148d68582614858565b86555061493e565b601f1984166148ec866146d2565b60005b82811015614914578489015182556001820191506020850194506020810190506148ef565b86831015614931578489015161492d601f89168261483a565b8355505b6001600288020188555050505b505050505050565b7f73616c65206e6f74207374617274656400000000000000000000000000000000600082015250565b600061497c601083613802565b915061498782614946565b602082019050919050565b600060208201905081810360008301526149ab8161496f565b9050919050565b7f4d6178206d696e74206f66203420706572207472616e73616374696f6e000000600082015250565b60006149e8601d83613802565b91506149f3826149b2565b602082019050919050565b60006020820190508181036000830152614a17816149db565b9050919050565b600081905092915050565b6000614a34826137f7565b614a3e8185614a1e565b9350614a4e818560208601613813565b80840191505092915050565b6000614a668285614a29565b9150614a728284614a29565b91508190509392505050565b600081905092915050565b50565b6000614a99600083614a7e565b9150614aa482614a89565b600082019050919050565b6000614aba82614a8c565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b6000614afa601083613802565b9150614b0582614ac4565b602082019050919050565b60006020820190508181036000830152614b2981614aed565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614b8c602683613802565b9150614b9782614b30565b604082019050919050565b60006020820190508181036000830152614bbb81614b7f565b9050919050565b7f596f75206861766520616c726561647920636c61696d656420796f757220667260008201527f6565206d696e7400000000000000000000000000000000000000000000000000602082015250565b6000614c1e602783613802565b9150614c2982614bc2565b604082019050919050565b60006020820190508181036000830152614c4d81614c11565b9050919050565b7f46726565204d696e7420686173206265656e2066756c6c7920636c61696d6564600082015250565b6000614c8a602083613802565b9150614c9582614c54565b602082019050919050565b60006020820190508181036000830152614cb981614c7d565b9050919050565b7f6e6f7420696e2074686520667265652073616c652074696d6500000000000000600082015250565b6000614cf6601983613802565b9150614d0182614cc0565b602082019050919050565b60006020820190508181036000830152614d2581614ce9565b9050919050565b600081519050614d3b816138b3565b92915050565b600060208284031215614d5757614d56613732565b5b6000614d6584828501614d2c565b91505092915050565b7f596f7520646f6e2774207175616c69667920666f72207468652066726565206d60008201527f696e740000000000000000000000000000000000000000000000000000000000602082015250565b6000614dca602383613802565b9150614dd582614d6e565b604082019050919050565b60006020820190508181036000830152614df981614dbd565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000614e36601083613802565b9150614e4182614e00565b602082019050919050565b60006020820190508181036000830152614e6581614e29565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614ea2601f83613802565b9150614ead82614e6c565b602082019050919050565b60006020820190508181036000830152614ed181614e95565b9050919050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b6000614f0e601e83613802565b9150614f1982614ed8565b602082019050919050565b60006020820190508181036000830152614f3d81614f01565b9050919050565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b6000614f7a601283613802565b9150614f8582614f44565b602082019050919050565b60006020820190508181036000830152614fa981614f6d565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614fe6602083613802565b9150614ff182614fb0565b602082019050919050565b6000602082019050818103600083015261501581614fd9565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006150438261501c565b61504d8185615027565b935061505d818560208601613813565b6150668161383d565b840191505092915050565b6000608082019050615086600083018761393e565b615093602083018661393e565b6150a06040830185613af9565b81810360608301526150b28184615038565b905095945050505050565b6000815190506150cc81613768565b92915050565b6000602082840312156150e8576150e7613732565b5b60006150f6848285016150bd565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000615139826138a9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361516b5761516a614379565b5b600182019050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006151ac601483613802565b91506151b782615176565b602082019050919050565b600060208201905081810360008301526151db8161519f565b905091905056fea2646970667358221220bd68bd99c13bccf1c552bb8df94938eb76f8a261e39f4171e349a2e1acccd3ae64736f6c6343000811003300000000000000000000000000000000000000000000000000000000000000401e54dbc6ca471d3ade19fd5d8ba23cc4d18369a6eeb14357d45a39ca3c57bd3400000000000000000000000000000000000000000000000000000000000000043132333400000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106103355760003560e01c80638456cb59116101ab578063aed8ad91116100f7578063e086e5ec11610095578063e985e9c51161006f578063e985e9c514610b84578063f2fde38b14610bc1578063f9cb63ac14610bea578063fe5df67e14610bf457610335565b8063e086e5ec14610b17578063e3c820a214610b2e578063e8ff6e6514610b5957610335565b8063c0bef6ce116100d1578063c0bef6ce14610a5b578063c269932614610a86578063c87b56dd14610ab1578063d8b3a7e614610aee57610335565b8063aed8ad91146109e9578063af45ec4714610a14578063b88d4fde14610a3f57610335565b806395d89b4111610164578063a22cb4651161013e578063a22cb4651461093f578063a5968aac14610968578063a945bf8014610993578063a9e00c3f146109be57610335565b806395d89b41146108bb5780639d718eff146108e6578063a0712d681461092357610335565b80638456cb59146107bb5780638462151c146107d257806389bfe5491461080f5780638ab120a41461083c5780638da5cb5b1461086757806391b7f5ed1461089257610335565b8063371b3c43116102855780635e676d1b116102235780636c0360eb116101fd5780636c0360eb146107135780636f8b44b01461073e57806370a0823114610767578063715018a6146107a457610335565b80635e676d1b14610684578063616225cd146106ad5780636352211e146106d657610335565b806341f434341161025f57806341f43434146105e957806342842e0e1461061457806355f804b3146106305780635c975abb1461065957610335565b8063371b3c431461056c578063389fcf06146105955780633f4ba83a146105d257610335565b80631342ff4c116102f257806323b872dd116102cc57806323b872dd146104d357806324216811146104ef57806332cb6b0c1461051857806336a75eb81461054357610335565b80631342ff4c1461045457806318160ddd1461047d5780631a14b227146104a857610335565b806301ffc9a71461033a57806306fdde0314610377578063081812fc146103a2578063095ea7b3146103df57806310c54350146103fb5780631338a83f14610438575b600080fd5b34801561034657600080fd5b50610361600480360381019061035c9190613794565b610c1d565b60405161036e91906137dc565b60405180910390f35b34801561038357600080fd5b5061038c610caf565b6040516103999190613887565b60405180910390f35b3480156103ae57600080fd5b506103c960048036038101906103c491906138df565b610d41565b6040516103d6919061394d565b60405180910390f35b6103f960048036038101906103f49190613994565b610dc0565b005b34801561040757600080fd5b50610422600480360381019061041d9190613a39565b610eca565b60405161042f91906137dc565b60405180910390f35b610452600480360381019061044d9190613a99565b610ee0565b005b34801561046057600080fd5b5061047b600480360381019061047691906138df565b611204565b005b34801561048957600080fd5b506104926112a7565b60405161049f9190613b08565b60405180910390f35b3480156104b457600080fd5b506104bd6112be565b6040516104ca919061394d565b60405180910390f35b6104ed60048036038101906104e89190613b23565b6112e4565b005b3480156104fb57600080fd5b5061051660048036038101906105119190613bb2565b611434565b005b34801561052457600080fd5b5061052d61144f565b60405161053a9190613b08565b60405180910390f35b34801561054f57600080fd5b5061056a60048036038101906105659190613bdf565b611455565b005b34801561057857600080fd5b50610593600480360381019061058e9190613bdf565b6114a1565b005b3480156105a157600080fd5b506105bc60048036038101906105b79190613bdf565b6114ed565b6040516105c991906137dc565b60405180910390f35b3480156105de57600080fd5b506105e761150d565b005b3480156105f557600080fd5b506105fe61151f565b60405161060b9190613c6b565b60405180910390f35b61062e60048036038101906106299190613b23565b611531565b005b34801561063c57600080fd5b5061065760048036038101906106529190613db6565b611681565b005b34801561066557600080fd5b5061066e61169c565b60405161067b91906137dc565b60405180910390f35b34801561069057600080fd5b506106ab60048036038101906106a69190613bb2565b6116b3565b005b3480156106b957600080fd5b506106d460048036038101906106cf9190613e35565b6116ce565b005b3480156106e257600080fd5b506106fd60048036038101906106f891906138df565b6116e0565b60405161070a919061394d565b60405180910390f35b34801561071f57600080fd5b506107286116f2565b6040516107359190613887565b60405180910390f35b34801561074a57600080fd5b50610765600480360381019061076091906138df565b611780565b005b34801561077357600080fd5b5061078e60048036038101906107899190613bdf565b611792565b60405161079b9190613b08565b60405180910390f35b3480156107b057600080fd5b506107b961184a565b005b3480156107c757600080fd5b506107d061185e565b005b3480156107de57600080fd5b506107f960048036038101906107f49190613bdf565b611870565b6040516108069190613f20565b60405180910390f35b34801561081b57600080fd5b50610824611901565b60405161083393929190613f42565b60405180910390f35b34801561084857600080fd5b50610851611919565b60405161085e9190613b08565b60405180910390f35b34801561087357600080fd5b5061087c61191f565b604051610889919061394d565b60405180910390f35b34801561089e57600080fd5b506108b960048036038101906108b491906138df565b611949565b005b3480156108c757600080fd5b506108d061195b565b6040516108dd9190613887565b60405180910390f35b3480156108f257600080fd5b5061090d60048036038101906109089190613bdf565b6119ed565b60405161091a9190613b08565b60405180910390f35b61093d600480360381019061093891906138df565b611a05565b005b34801561094b57600080fd5b5061096660048036038101906109619190613fa5565b611ac7565b005b34801561097457600080fd5b5061097d611bd1565b60405161098a9190613b08565b60405180910390f35b34801561099f57600080fd5b506109a8611bd7565b6040516109b59190613b08565b60405180910390f35b3480156109ca57600080fd5b506109d3611bdd565b6040516109e09190613ff4565b60405180910390f35b3480156109f557600080fd5b506109fe611be3565b604051610a0b9190613b08565b60405180910390f35b348015610a2057600080fd5b50610a29611be9565b604051610a36919061394d565b60405180910390f35b610a596004803603810190610a5491906140b0565b611c0f565b005b348015610a6757600080fd5b50610a70611c82565b604051610a7d9190613b08565b60405180910390f35b348015610a9257600080fd5b50610a9b611c88565b604051610aa89190613b08565b60405180910390f35b348015610abd57600080fd5b50610ad86004803603810190610ad391906138df565b611c8d565b604051610ae59190613887565b60405180910390f35b348015610afa57600080fd5b50610b156004803603810190610b109190613bb2565b611d2b565b005b348015610b2357600080fd5b50610b2c611d46565b005b348015610b3a57600080fd5b50610b43611e0d565b604051610b509190613b08565b60405180910390f35b348015610b6557600080fd5b50610b6e611e13565b604051610b7b919061394d565b60405180910390f35b348015610b9057600080fd5b50610bab6004803603810190610ba69190614133565b611e39565b604051610bb891906137dc565b60405180910390f35b348015610bcd57600080fd5b50610be86004803603810190610be39190613bdf565b611ecd565b005b610bf2611f50565b005b348015610c0057600080fd5b50610c1b6004803603810190610c169190613bdf565b61235e565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c7857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ca85750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610cbe906141a2565b80601f0160208091040260200160405190810160405280929190818152602001828054610cea906141a2565b8015610d375780601f10610d0c57610100808354040283529160200191610d37565b820191906000526020600020905b815481529060010190602001808311610d1a57829003601f168201915b5050505050905090565b6000610d4c826123aa565b610d82576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610ebb576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610e389291906141d3565b602060405180830381865afa158015610e55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e799190614211565b610eba57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610eb1919061394d565b60405180910390fd5b5b610ec58383612409565b505050565b6000610ed7848484612419565b90509392505050565b610ee8612498565b610ef06124e2565b6000600f60000154905060008114158015610f0b5750804210155b610f4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f419061428a565b60405180910390fd5b610fbe848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060095433604051602001610fa391906142f2565b60405160208183030381529060405280519060200120612531565b610ffd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff490614359565b60405180910390fd5b600582601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461104a91906143a8565b1061108a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108190614428565b60405180910390fd5b6107d0600260135461109c91906143a8565b11156110dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d4906144e0565b60405180910390fd5b81600e546110eb9190614500565b34101561112d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111249061458e565b60405180910390fd5b81600e5461113b9190614500565b34111561117d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117490614620565b60405180910390fd5b60026013600082825461119091906143a8565b9250508190555081601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111e691906143a8565b925050819055506111f682612548565b506111ff6126d2565b505050565b61120c6126dc565b606460028261121b9190614500565b60125461122891906143a8565b1115611269576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611260906146b2565b60405180910390fd5b6002816112769190614500565b6012600082825461128791906143a8565b925050819055506112a43360028361129f9190614500565b61275a565b50565b60006112b1612778565b6001546000540303905090565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611422573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036113565761135184848461277d565b61142e565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161139f9291906141d3565b602060405180830381865afa1580156113bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e09190614211565b61142157336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611418919061394d565b60405180910390fd5b5b61142d84848461277d565b5b50505050565b61143c6126dc565b8063ffffffff16600f6001018190555050565b600c5481565b61145d6126dc565b80601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6114a96126dc565b80601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60176020528060005260406000206000915054906101000a900460ff1681565b6115156126dc565b61151d612a9f565b565b6daaeb6d7670e522a718067333cd4e81565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561166f573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036115a35761159e848484612b02565b61167b565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016115ec9291906141d3565b602060405180830381865afa158015611609573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162d9190614211565b61166e57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611665919061394d565b60405180910390fd5b5b61167a848484612b02565b5b50505050565b6116896126dc565b80601590816116989190614874565b5050565b6000600a60009054906101000a900460ff16905090565b6116bb6126dc565b8063ffffffff16600f6000018190555050565b6116d66126dc565b8060098190555050565b60006116eb82612b22565b9050919050565b601580546116ff906141a2565b80601f016020809104026020016040519081016040528092919081815260200182805461172b906141a2565b80156117785780601f1061174d57610100808354040283529160200191611778565b820191906000526020600020905b81548152906001019060200180831161175b57829003601f168201915b505050505081565b6117886126dc565b80600c8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117f9576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6118526126dc565b61185c6000612c1a565b565b6118666126dc565b61186e612ce0565b565b6060600061187d83611792565b9050606060405190506001820160051b810160405281815260008060006118a2612778565b90505b8482146118f45760006118b782612d43565b905060408101516118e8578051156118ce57805193505b87841860601b6118e757600183019250818360051b8601525b5b600182019150506118a5565b5082945050505050919050565b600f8060000154908060010154908060020154905083565b6107d081565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6119516126dc565b80600e8190555050565b60606003805461196a906141a2565b80601f0160208091040260200160405190810160405280929190818152602001828054611996906141a2565b80156119e35780601f106119b8576101008083540402835291602001916119e3565b820191906000526020600020905b8154815290600101906020018083116119c657829003601f168201915b5050505050905090565b60166020528060005260406000206000915090505481565b611a0d612498565b611a156124e2565b6000600f60010154905060008114158015611a305750804210155b611a6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6690614992565b60405180910390fd5b60058210611ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa9906149fe565b60405180910390fd5b611abb82612548565b50611ac46126d2565b50565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611bc2576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611b3f9291906141d3565b602060405180830381865afa158015611b5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b809190614211565b611bc157806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611bb8919061394d565b60405180910390fd5b5b611bcc8383612d6e565b505050565b60145481565b600e5481565b60095481565b60125481565b601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611c1a8484846112e4565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611c7c57611c4584848484612e79565b611c7b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60135481565b606481565b6060611c98826123aa565b611cce576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611cd8612fc9565b90506000815103611cf85760405180602001604052806000815250611d23565b80611d028461305b565b604051602001611d13929190614a5a565b6040516020818303038152906040525b915050919050565b611d336126dc565b8063ffffffff16600f6002018190555050565b611d4e6126dc565b611d566124e2565b60003373ffffffffffffffffffffffffffffffffffffffff1647604051611d7c90614aaf565b60006040518083038185875af1925050503d8060008114611db9576040519150601f19603f3d011682016040523d82523d6000602084013e611dbe565b606091505b5050905080611e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df990614b10565b60405180910390fd5b50611e0b6126d2565b565b600d5481565b601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ed56126dc565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3b90614ba2565b60405180910390fd5b611f4d81612c1a565b50565b611f58612498565b611f606124e2565b601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611fed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe490614c34565b60405180910390fd5b600d5460145410612033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202a90614ca0565b60405180910390fd5b6000600f6002015490506000811415801561204e5750804210155b61208d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208490614d0c565b60405180910390fd5b6000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016120ef919061394d565b602060405180830381865afa15801561210c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121309190614d41565b90506000601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401612192919061394d565b602060405180830381865afa1580156121af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121d39190614d41565b826121de91906143a8565b91506000601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401612240919061394d565b602060405180830381865afa15801561225d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122819190614d41565b8361228c91906143a8565b925060018310156122d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c990614de0565b60405180910390fd5b6002601460008282546122e591906143a8565b925050819055506001601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061234f33600261275a565b505050505061235c6126d2565b565b6123666126dc565b80601960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000816123b5612778565b111580156123c4575060005482105b8015612402575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b612415828260016130ab565b5050565b600061248f838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506009548660405160200161247491906142f2565b60405160208183030381529060405280519060200120612531565b90509392505050565b6124a061169c565b156124e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d790614e4c565b60405180910390fd5b565b6002600b5403612527576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251e90614eb8565b60405180910390fd5b6002600b81905550565b60008261253e85846131f7565b1490509392505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146125b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ad90614f24565b60405180910390fd5b600c546002826125c69190614500565b6125ce6112a7565b6125d891906143a8565b1115612619576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261090614f90565b60405180910390fd5b80600e546126279190614500565b341015612669576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126609061458e565b60405180910390fd5b80600e546126779190614500565b3411156126b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b090614620565b60405180910390fd5b6126cf336002836126ca9190614500565b61275a565b50565b6001600b81905550565b6126e461324d565b73ffffffffffffffffffffffffffffffffffffffff1661270261191f565b73ffffffffffffffffffffffffffffffffffffffff1614612758576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274f90614ffc565b60405180910390fd5b565b612774828260405180602001604052806000815250613255565b5050565b600090565b600061278882612b22565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146127ef576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806127fb846132f2565b91509150612811818761280c613319565b613321565b61285d5761282686612821613319565b611e39565b61285c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036128c3576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128d08686866001613365565b80156128db57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506129a98561298588888761336b565b7c020000000000000000000000000000000000000000000000000000000017613393565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603612a2f5760006001850190506000600460008381526020019081526020016000205403612a2d576000548114612a2c578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a9786868660016133be565b505050505050565b612aa76133c4565b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612aeb61324d565b604051612af8919061394d565b60405180910390a1565b612b1d83838360405180602001604052806000815250611c0f565b505050565b600081612b2d612778565b11612be3576004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612be25760008103612bdd576000548210612bb2576040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600460008360019003935083815260200190815260200160002054905060008103612c1557612bb3565b612c15565b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612ce8612498565b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612d2c61324d565b604051612d39919061394d565b60405180910390a1565b612d4b6136d9565b612d67600460008481526020019081526020016000205461340d565b9050919050565b8060076000612d7b613319565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612e28613319565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612e6d91906137dc565b60405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e9f613319565b8786866040518563ffffffff1660e01b8152600401612ec19493929190615071565b6020604051808303816000875af1925050508015612efd57506040513d601f19601f82011682018060405250810190612efa91906150d2565b60015b612f76573d8060008114612f2d576040519150601f19603f3d011682016040523d82523d6000602084013e612f32565b606091505b506000815103612f6e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060158054612fd8906141a2565b80601f0160208091040260200160405190810160405280929190818152602001828054613004906141a2565b80156130515780601f1061302657610100808354040283529160200191613051565b820191906000526020600020905b81548152906001019060200180831161303457829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b60011561309657600184039350600a81066030018453600a8104905080613074575b50828103602084039350808452505050919050565b60006130b6836116e0565b90508115613141578073ffffffffffffffffffffffffffffffffffffffff166130dd613319565b73ffffffffffffffffffffffffffffffffffffffff16146131405761310981613104613319565b611e39565b61313f576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b836006600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b60008082905060005b84518110156132425761322d828683815181106132205761321f6150ff565b5b60200260200101516134c3565b9150808061323a9061512e565b915050613200565b508091505092915050565b600033905090565b61325f83836134ee565b60008373ffffffffffffffffffffffffffffffffffffffff163b146132ed57600080549050600083820390505b61329f6000868380600101945086612e79565b6132d5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061328c5781600054146132ea57600080fd5b50505b505050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86133828686846136a9565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6133cc61169c565b61340b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613402906151c2565b60405180910390fd5b565b6134156136d9565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b60008183106134db576134d682846136b2565b6134e6565b6134e583836136b2565b5b905092915050565b6000805490506000820361352e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61353b6000848385613365565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506135b2836135a3600086600061336b565b6135ac856136c9565b17613393565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461365357808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613618565b506000820361368e576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506136a460008483856133be565b505050565b60009392505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6137718161373c565b811461377c57600080fd5b50565b60008135905061378e81613768565b92915050565b6000602082840312156137aa576137a9613732565b5b60006137b88482850161377f565b91505092915050565b60008115159050919050565b6137d6816137c1565b82525050565b60006020820190506137f160008301846137cd565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613831578082015181840152602081019050613816565b60008484015250505050565b6000601f19601f8301169050919050565b6000613859826137f7565b6138638185613802565b9350613873818560208601613813565b61387c8161383d565b840191505092915050565b600060208201905081810360008301526138a1818461384e565b905092915050565b6000819050919050565b6138bc816138a9565b81146138c757600080fd5b50565b6000813590506138d9816138b3565b92915050565b6000602082840312156138f5576138f4613732565b5b6000613903848285016138ca565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006139378261390c565b9050919050565b6139478161392c565b82525050565b6000602082019050613962600083018461393e565b92915050565b6139718161392c565b811461397c57600080fd5b50565b60008135905061398e81613968565b92915050565b600080604083850312156139ab576139aa613732565b5b60006139b98582860161397f565b92505060206139ca858286016138ca565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f8401126139f9576139f86139d4565b5b8235905067ffffffffffffffff811115613a1657613a156139d9565b5b602083019150836020820283011115613a3257613a316139de565b5b9250929050565b600080600060408486031215613a5257613a51613732565b5b6000613a608682870161397f565b935050602084013567ffffffffffffffff811115613a8157613a80613737565b5b613a8d868287016139e3565b92509250509250925092565b600080600060408486031215613ab257613ab1613732565b5b600084013567ffffffffffffffff811115613ad057613acf613737565b5b613adc868287016139e3565b93509350506020613aef868287016138ca565b9150509250925092565b613b02816138a9565b82525050565b6000602082019050613b1d6000830184613af9565b92915050565b600080600060608486031215613b3c57613b3b613732565b5b6000613b4a8682870161397f565b9350506020613b5b8682870161397f565b9250506040613b6c868287016138ca565b9150509250925092565b600063ffffffff82169050919050565b613b8f81613b76565b8114613b9a57600080fd5b50565b600081359050613bac81613b86565b92915050565b600060208284031215613bc857613bc7613732565b5b6000613bd684828501613b9d565b91505092915050565b600060208284031215613bf557613bf4613732565b5b6000613c038482850161397f565b91505092915050565b6000819050919050565b6000613c31613c2c613c278461390c565b613c0c565b61390c565b9050919050565b6000613c4382613c16565b9050919050565b6000613c5582613c38565b9050919050565b613c6581613c4a565b82525050565b6000602082019050613c806000830184613c5c565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613cc38261383d565b810181811067ffffffffffffffff82111715613ce257613ce1613c8b565b5b80604052505050565b6000613cf5613728565b9050613d018282613cba565b919050565b600067ffffffffffffffff821115613d2157613d20613c8b565b5b613d2a8261383d565b9050602081019050919050565b82818337600083830152505050565b6000613d59613d5484613d06565b613ceb565b905082815260208101848484011115613d7557613d74613c86565b5b613d80848285613d37565b509392505050565b600082601f830112613d9d57613d9c6139d4565b5b8135613dad848260208601613d46565b91505092915050565b600060208284031215613dcc57613dcb613732565b5b600082013567ffffffffffffffff811115613dea57613de9613737565b5b613df684828501613d88565b91505092915050565b6000819050919050565b613e1281613dff565b8114613e1d57600080fd5b50565b600081359050613e2f81613e09565b92915050565b600060208284031215613e4b57613e4a613732565b5b6000613e5984828501613e20565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613e97816138a9565b82525050565b6000613ea98383613e8e565b60208301905092915050565b6000602082019050919050565b6000613ecd82613e62565b613ed78185613e6d565b9350613ee283613e7e565b8060005b83811015613f13578151613efa8882613e9d565b9750613f0583613eb5565b925050600181019050613ee6565b5085935050505092915050565b60006020820190508181036000830152613f3a8184613ec2565b905092915050565b6000606082019050613f576000830186613af9565b613f646020830185613af9565b613f716040830184613af9565b949350505050565b613f82816137c1565b8114613f8d57600080fd5b50565b600081359050613f9f81613f79565b92915050565b60008060408385031215613fbc57613fbb613732565b5b6000613fca8582860161397f565b9250506020613fdb85828601613f90565b9150509250929050565b613fee81613dff565b82525050565b60006020820190506140096000830184613fe5565b92915050565b600067ffffffffffffffff82111561402a57614029613c8b565b5b6140338261383d565b9050602081019050919050565b600061405361404e8461400f565b613ceb565b90508281526020810184848401111561406f5761406e613c86565b5b61407a848285613d37565b509392505050565b600082601f830112614097576140966139d4565b5b81356140a7848260208601614040565b91505092915050565b600080600080608085870312156140ca576140c9613732565b5b60006140d88782880161397f565b94505060206140e98782880161397f565b93505060406140fa878288016138ca565b925050606085013567ffffffffffffffff81111561411b5761411a613737565b5b61412787828801614082565b91505092959194509250565b6000806040838503121561414a57614149613732565b5b60006141588582860161397f565b92505060206141698582860161397f565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806141ba57607f821691505b6020821081036141cd576141cc614173565b5b50919050565b60006040820190506141e8600083018561393e565b6141f5602083018461393e565b9392505050565b60008151905061420b81613f79565b92915050565b60006020828403121561422757614226613732565b5b6000614235848285016141fc565b91505092915050565b7f6e6f7420696e20746865207072656d69756d2073616c652074696d6500000000600082015250565b6000614274601c83613802565b915061427f8261423e565b602082019050919050565b600060208201905081810360008301526142a381614267565b9050919050565b60008160601b9050919050565b60006142c2826142aa565b9050919050565b60006142d4826142b7565b9050919050565b6142ec6142e78261392c565b6142c9565b82525050565b60006142fe82846142db565b60148201915081905092915050565b7f496e76616c6964204d65726b6c6550726f6f6600000000000000000000000000600082015250565b6000614343601383613802565b915061434e8261430d565b602082019050919050565b6000602082019050818103600083015261437281614336565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006143b3826138a9565b91506143be836138a9565b92508282019050808211156143d6576143d5614379565b5b92915050565b7f4d6178206d696e74206f662034207065722077616c6c65740000000000000000600082015250565b6000614412601883613802565b915061441d826143dc565b602082019050919050565b6000602082019050818103600083015261444181614405565b9050919050565b7f6e6f7420656e6f7567682072656d61696e696e6720726573657276656420666f60008201527f72207072656d69756d2073616c6520746f20737570706f72742064657369726560208201527f64206d696e7420616d6f756e7400000000000000000000000000000000000000604082015250565b60006144ca604d83613802565b91506144d582614448565b606082019050919050565b600060208201905081810360008301526144f9816144bd565b9050919050565b600061450b826138a9565b9150614516836138a9565b9250828202614524816138a9565b9150828204841483151761453b5761453a614379565b5b5092915050565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b6000614578601683613802565b915061458382614542565b602082019050919050565b600060208201905081810360008301526145a78161456b565b9050919050565b7f596f75206861766520747269656420746f2073656e6420746f6f206d7563682060008201527f4554480000000000000000000000000000000000000000000000000000000000602082015250565b600061460a602383613802565b9150614615826145ae565b604082019050919050565b60006020820190508181036000830152614639816145fd565b9050919050565b7f746f6f206d616e7920616c7265616479206d696e746564206265666f7265207260008201527f657365727665206d696e74000000000000000000000000000000000000000000602082015250565b600061469c602b83613802565b91506146a782614640565b604082019050919050565b600060208201905081810360008301526146cb8161468f565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026147347fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826146f7565b61473e86836146f7565b95508019841693508086168417925050509392505050565b600061477161476c614767846138a9565b613c0c565b6138a9565b9050919050565b6000819050919050565b61478b83614756565b61479f61479782614778565b848454614704565b825550505050565b600090565b6147b46147a7565b6147bf818484614782565b505050565b5b818110156147e3576147d86000826147ac565b6001810190506147c5565b5050565b601f821115614828576147f9816146d2565b614802846146e7565b81016020851015614811578190505b61482561481d856146e7565b8301826147c4565b50505b505050565b600082821c905092915050565b600061484b6000198460080261482d565b1980831691505092915050565b6000614864838361483a565b9150826002028217905092915050565b61487d826137f7565b67ffffffffffffffff81111561489657614895613c8b565b5b6148a082546141a2565b6148ab8282856147e7565b600060209050601f8311600181146148de57600084156148cc578287015190505b6148d68582614858565b86555061493e565b601f1984166148ec866146d2565b60005b82811015614914578489015182556001820191506020850194506020810190506148ef565b86831015614931578489015161492d601f89168261483a565b8355505b6001600288020188555050505b505050505050565b7f73616c65206e6f74207374617274656400000000000000000000000000000000600082015250565b600061497c601083613802565b915061498782614946565b602082019050919050565b600060208201905081810360008301526149ab8161496f565b9050919050565b7f4d6178206d696e74206f66203420706572207472616e73616374696f6e000000600082015250565b60006149e8601d83613802565b91506149f3826149b2565b602082019050919050565b60006020820190508181036000830152614a17816149db565b9050919050565b600081905092915050565b6000614a34826137f7565b614a3e8185614a1e565b9350614a4e818560208601613813565b80840191505092915050565b6000614a668285614a29565b9150614a728284614a29565b91508190509392505050565b600081905092915050565b50565b6000614a99600083614a7e565b9150614aa482614a89565b600082019050919050565b6000614aba82614a8c565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b6000614afa601083613802565b9150614b0582614ac4565b602082019050919050565b60006020820190508181036000830152614b2981614aed565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614b8c602683613802565b9150614b9782614b30565b604082019050919050565b60006020820190508181036000830152614bbb81614b7f565b9050919050565b7f596f75206861766520616c726561647920636c61696d656420796f757220667260008201527f6565206d696e7400000000000000000000000000000000000000000000000000602082015250565b6000614c1e602783613802565b9150614c2982614bc2565b604082019050919050565b60006020820190508181036000830152614c4d81614c11565b9050919050565b7f46726565204d696e7420686173206265656e2066756c6c7920636c61696d6564600082015250565b6000614c8a602083613802565b9150614c9582614c54565b602082019050919050565b60006020820190508181036000830152614cb981614c7d565b9050919050565b7f6e6f7420696e2074686520667265652073616c652074696d6500000000000000600082015250565b6000614cf6601983613802565b9150614d0182614cc0565b602082019050919050565b60006020820190508181036000830152614d2581614ce9565b9050919050565b600081519050614d3b816138b3565b92915050565b600060208284031215614d5757614d56613732565b5b6000614d6584828501614d2c565b91505092915050565b7f596f7520646f6e2774207175616c69667920666f72207468652066726565206d60008201527f696e740000000000000000000000000000000000000000000000000000000000602082015250565b6000614dca602383613802565b9150614dd582614d6e565b604082019050919050565b60006020820190508181036000830152614df981614dbd565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000614e36601083613802565b9150614e4182614e00565b602082019050919050565b60006020820190508181036000830152614e6581614e29565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614ea2601f83613802565b9150614ead82614e6c565b602082019050919050565b60006020820190508181036000830152614ed181614e95565b9050919050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b6000614f0e601e83613802565b9150614f1982614ed8565b602082019050919050565b60006020820190508181036000830152614f3d81614f01565b9050919050565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b6000614f7a601283613802565b9150614f8582614f44565b602082019050919050565b60006020820190508181036000830152614fa981614f6d565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614fe6602083613802565b9150614ff182614fb0565b602082019050919050565b6000602082019050818103600083015261501581614fd9565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006150438261501c565b61504d8185615027565b935061505d818560208601613813565b6150668161383d565b840191505092915050565b6000608082019050615086600083018761393e565b615093602083018661393e565b6150a06040830185613af9565b81810360608301526150b28184615038565b905095945050505050565b6000815190506150cc81613768565b92915050565b6000602082840312156150e8576150e7613732565b5b60006150f6848285016150bd565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000615139826138a9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361516b5761516a614379565b5b600182019050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006151ac601483613802565b91506151b782615176565b602082019050919050565b600060208201905081810360008301526151db8161519f565b905091905056fea2646970667358221220bd68bd99c13bccf1c552bb8df94938eb76f8a261e39f4171e349a2e1acccd3ae64736f6c63430008110033

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

00000000000000000000000000000000000000000000000000000000000000401e54dbc6ca471d3ade19fd5d8ba23cc4d18369a6eeb14357d45a39ca3c57bd3400000000000000000000000000000000000000000000000000000000000000043132333400000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : initBaseURI (string): 1234
Arg [1] : _guaranteelistMerkleRoot (bytes32): 0x1e54dbc6ca471d3ade19fd5d8ba23cc4d18369a6eeb14357d45a39ca3c57bd34

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 1e54dbc6ca471d3ade19fd5d8ba23cc4d18369a6eeb14357d45a39ca3c57bd34
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [3] : 3132333400000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

84923:7550:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24513:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25415:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31815:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91787:165;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74043:195;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;88147:1116;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;87674:304;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21166:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85935:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91960:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;86509:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85029:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87259:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;87007:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85673:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86270:65;;;;;;;;;;;;;:::i;:::-;;76454:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92139:179;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91453:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5272:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86369:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73294;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26808:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85586:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86785:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22350:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62382:103;;;;;;;;;;;;;:::i;:::-;;86201:61;;;;;;;;;;;;;:::i;:::-;;34842:1826;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85429:28;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;85163:55;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61734:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86902:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25591:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85616:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90505:417;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91603:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85546:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85225:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72718:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85466:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86021:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41000:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85503:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85068:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25801:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86651:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;87421:189;;;;;;;;;;;;;:::i;:::-;;85123:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86107:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32764:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62640:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;89364:1040;;;:::i;:::-;;87133:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24513:639;24598:4;24937:10;24922:25;;:11;:25;;;;:102;;;;25014:10;24999:25;;:11;:25;;;;24922:102;:179;;;;25091:10;25076:25;;:11;:25;;;;24922:179;24902:199;;24513:639;;;:::o;25415:100::-;25469:13;25502:5;25495:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25415:100;:::o;31815:218::-;31891:7;31916:16;31924:7;31916;:16::i;:::-;31911:64;;31941:34;;;;;;;;;;;;;;31911:64;31995:15;:24;32011:7;31995:24;;;;;;;;;;;:30;;;;;;;;;;;;31988:37;;31815:218;;;:::o;91787:165::-;91891:8;78496:1;76554:42;78448:45;;;:49;78444:225;;;76554:42;78519;;;78570:4;78577:8;78519:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;78514:144;;78633:8;78614:28;;;;;;;;;;;:::i;:::-;;;;;;;;78514:144;78444:225;91912:32:::1;91926:8;91936:7;91912:13;:32::i;:::-;91787:165:::0;;;:::o;74043:195::-;74159:4;74188:42;74207:8;74217:12;;74188:18;:42::i;:::-;74181:49;;74043:195;;;;;:::o;88147:1116::-;4877:19;:17;:19::i;:::-;2277:21:::1;:19;:21::i;:::-;88275:29:::2;88315:10;:31;;;88275:72;;88405:1;88380:21;:26;;:70;;;;;88429:21;88410:15;:40;;88380:70;88358:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;88525:98;88544:12;;88525:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;88558:23;;88610:10;88593:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;88583:39;;;;;;88525:18;:98::i;:::-;88517:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;88730:1;88719:8;88689:15;:27;88705:10;88689:27;;;;;;;;;;;;;;;;:38;;;;:::i;:::-;:42;88681:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;85214:4;88817:1;88793:21;;:25;;;;:::i;:::-;:53;;88771:180;;;;;;;;;;;;:::i;:::-;;;;;;;;;88998:8;88984:11;;:22;;;;:::i;:::-;88970:9;:37;;88962:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;89084:8;89070:11;;:22;;;;:::i;:::-;89056:9;:37;;89048:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;89169:1;89144:21;;:26;;;;;;;:::i;:::-;;;;;;;;89212:8;89181:15;:27;89197:10;89181:27;;;;;;;;;;;;;;;;:39;;;;;;;:::i;:::-;;;;;;;;89231:24;89246:8;89231:14;:24::i;:::-;88264:999;2321:20:::1;:18;:20::i;:::-;88147:1116:::0;;;:::o;87674:304::-;61620:13;:11;:13::i;:::-;85113:3:::1;87792:1;87783:8;:10;;;;:::i;:::-;87765:15;;:28;;;;:::i;:::-;:50;;87743:143;;;;;;;;;;;;:::i;:::-;;;;;;;;;87925:1;87916:8;:10;;;;:::i;:::-;87897:15;;:29;;;;;;;:::i;:::-;;;;;;;;87937:33;87947:10;87968:1;87959:8;:10;;;;:::i;:::-;87937:9;:33::i;:::-;87674:304:::0;:::o;21166:323::-;21227:7;21455:15;:13;:15::i;:::-;21440:12;;21424:13;;:28;:46;21417:53;;21166:323;:::o;85935:79::-;;;;;;;;;;;;;:::o;91960:171::-;92069:4;77750:1;76554:42;77702:45;;;:49;77698:539;;;77991:10;77983:18;;:4;:18;;;77979:85;;92086:37:::1;92105:4;92111:2;92115:7;92086:18;:37::i;:::-;78042:7:::0;;77979:85;76554:42;78083;;;78134:4;78141:10;78083:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;78078:148;;78199:10;78180:30;;;;;;;;;;;:::i;:::-;;;;;;;;78078:148;77698:539;92086:37:::1;92105:4;92111:2;92115:7;92086:18;:37::i;:::-;91960:171:::0;;;;;:::o;86509:134::-;61620:13;:11;:13::i;:::-;86626:9:::1;86591:44;;:10;:32;;:44;;;;86509:134:::0;:::o;85029:32::-;;;;:::o;87259:130::-;61620:13;:11;:13::i;:::-;87373:8:::1;87345:25;;:36;;;;;;;;;;;;;;;;;;87259:130:::0;:::o;87007:118::-;61620:13;:11;:13::i;:::-;87109:8:::1;87087:19;;:30;;;;;;;;;;;;;;;;;;87007:118:::0;:::o;85673:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;86270:65::-;61620:13;:11;:13::i;:::-;86317:10:::1;:8;:10::i;:::-;86270:65::o:0;76454:143::-;76554:42;76454:143;:::o;92139:179::-;92252:4;77750:1;76554:42;77702:45;;;:49;77698:539;;;77991:10;77983:18;;:4;:18;;;77979:85;;92269:41:::1;92292:4;92298:2;92302:7;92269:22;:41::i;:::-;78042:7:::0;;77979:85;76554:42;78083;;;78134:4;78141:10;78083:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;78078:148;;78199:10;78180:30;;;;;;;;;;;:::i;:::-;;;;;;;;78078:148;77698:539;92269:41:::1;92292:4;92298:2;92302:7;92269:22;:41::i;:::-;92139:179:::0;;;;;:::o;91453:110::-;61620:13;:11;:13::i;:::-;91542::::1;91532:7;:23;;;;;;:::i;:::-;;91453:110:::0;:::o;5272:86::-;5319:4;5343:7;;;;;;;;;;;5336:14;;5272:86;:::o;86369:132::-;61620:13;:11;:13::i;:::-;86484:9:::1;86450:43;;:10;:31;;:43;;;;86369:132:::0;:::o;73294:::-;61620:13;:11;:13::i;:::-;73407:11:::1;73381:23;:37;;;;73294:132:::0;:::o;26808:152::-;26880:7;26923:27;26942:7;26923:18;:27::i;:::-;26900:52;;26808:152;;;:::o;85586:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;86785:109::-;61620:13;:11;:13::i;:::-;86873::::1;86860:10;:26;;;;86785:109:::0;:::o;22350:233::-;22422:7;22463:1;22446:19;;:5;:19;;;22442:60;;22474:28;;;;;;;;;;;;;;22442:60;16509:13;22520:18;:25;22539:5;22520:25;;;;;;;;;;;;;;;;:55;22513:62;;22350:233;;;:::o;62382:103::-;61620:13;:11;:13::i;:::-;62447:30:::1;62474:1;62447:18;:30::i;:::-;62382:103::o:0;86201:61::-;61620:13;:11;:13::i;:::-;86246:8:::1;:6;:8::i;:::-;86201:61::o:0;34842:1826::-;34911:16;34940:22;34965:16;34975:5;34965:9;:16::i;:::-;34940:41;;34992:25;35116:4;35110:11;35098:23;;35342:1;35326:14;35322:22;35319:1;35315:30;35305:8;35301:45;35295:4;35288:59;35426:14;35416:8;35409:32;35462:25;35498:19;35533:9;35545:15;:13;:15::i;:::-;35533:27;;35528:1107;35577:14;35562:11;:29;35528:1107;;35610:31;35644:15;35657:1;35644:12;:15::i;:::-;35610:49;;35785:4;35774:9;35770:20;35764:27;35754:823;;36037:9;36031:16;36028:107;;;36102:9;36096:16;36075:37;;36028:107;36394:5;36375:17;36371:29;36367:2;36363:38;36353:205;;36462:1;36449:11;36445:19;36430:34;;36533:1;36518:11;36515:1;36511:19;36501:8;36497:34;36490:45;36353:205;35754:823;36607:1;36604;36600:9;36595:14;;35683:941;35528:1107;;;;36652:8;36645:15;;;;;;34842:1826;;;:::o;85429:28::-;;;;;;;;;;;;;;;;;;;:::o;85163:55::-;85214:4;85163:55;:::o;61734:87::-;61780:7;61807:6;;;;;;;;;;;61800:13;;61734:87;:::o;86902:98::-;61620:13;:11;:13::i;:::-;86983:9:::1;86969:11;:23;;;;86902:98:::0;:::o;25591:104::-;25647:13;25680:7;25673:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25591:104;:::o;85616:50::-;;;;;;;;;;;;;;;;;:::o;90505:417::-;4877:19;:17;:19::i;:::-;2277:21:::1;:19;:21::i;:::-;90590:30:::2;90631:10;:32;;;90590:74;;90724:1;90698:22;:27;;:72;;;;;90748:22;90729:15;:41;;90698:72;90675:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;90844:1;90833:8;:12;90825:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;90890:24;90905:8;90890:14;:24::i;:::-;90579:343;2321:20:::1;:18;:20::i;:::-;90505:417:::0;:::o;91603:176::-;91707:8;78496:1;76554:42;78448:45;;;:49;78444:225;;;76554:42;78519;;;78570:4;78577:8;78519:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;78514:144;;78633:8;78614:28;;;;;;;;;;;:::i;:::-;;;;;;;;78514:144;78444:225;91728:43:::1;91752:8;91762;91728:23;:43::i;:::-;91603:176:::0;;;:::o;85546:31::-;;;;:::o;85225:46::-;;;;:::o;72718:38::-;;;;:::o;85466:30::-;;;;:::o;86021:79::-;;;;;;;;;;;;;:::o;41000:407::-;41175:31;41188:4;41194:2;41198:7;41175:12;:31::i;:::-;41239:1;41221:2;:14;;;:19;41217:183;;41260:56;41291:4;41297:2;41301:7;41310:5;41260:30;:56::i;:::-;41255:145;;41344:40;;;;;;;;;;;;;;41255:145;41217:183;41000:407;;;;:::o;85503:36::-;;;;:::o;85068:48::-;85113:3;85068:48;:::o;25801:318::-;25874:13;25905:16;25913:7;25905;:16::i;:::-;25900:59;;25930:29;;;;;;;;;;;;;;25900:59;25972:21;25996:10;:8;:10::i;:::-;25972:34;;26049:1;26030:7;26024:21;:26;:87;;;;;;;;;;;;;;;;;26077:7;26086:18;26096:7;26086:9;:18::i;:::-;26060:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26024:87;26017:94;;;25801:318;;;:::o;86651:126::-;61620:13;:11;:13::i;:::-;86760:9:::1;86729:40;;:10;:28;;:40;;;;86651:126:::0;:::o;87421:189::-;61620:13;:11;:13::i;:::-;2277:21:::1;:19;:21::i;:::-;87488:12:::2;87506:10;:15;;87529:21;87506:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87487:68;;;87574:7;87566:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;87476:134;2321:20:::1;:18;:20::i;:::-;87421:189::o:0;85123:33::-;;;;:::o;86107:85::-;;;;;;;;;;;;;:::o;32764:164::-;32861:4;32885:18;:25;32904:5;32885:25;;;;;;;;;;;;;;;:35;32911:8;32885:35;;;;;;;;;;;;;;;;;;;;;;;;;32878:42;;32764:164;;;;:::o;62640:201::-;61620:13;:11;:13::i;:::-;62749:1:::1;62729:22;;:8;:22;;::::0;62721:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;62805:28;62824:8;62805:18;:28::i;:::-;62640:201:::0;:::o;89364:1040::-;4877:19;:17;:19::i;:::-;2277:21:::1;:19;:21::i;:::-;89460:10:::2;:22;89471:10;89460:22;;;;;;;;;;;;;;;;;;;;;;;;;89459:23;89437:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;89588:12;;89569:16;;:31;89547:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;89658:26;89695:10;:28;;;89658:66;;89779:1;89757:18;:23;;:64;;;;;89803:18;89784:15;:37;;89757:64;89735:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;89885:13;89909:19;;;;;;;;;;;89885:44;;89940:19;89962:5;:15;;;89978:10;89962:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;89940:49;;90000:14;90025:19;;;;;;;;;;;90000:45;;90071:6;:16;;;90088:10;90071:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;90056:43;;;;;:::i;:::-;;;90110:14;90135:25;;;;;;;;;;;90110:51;;90187:6;:16;;;90204:10;90187:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;90172:43;;;;;:::i;:::-;;;90248:1;90234:11;:15;;90226:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;90320:1;90300:16;;:21;;;;;;;:::i;:::-;;;;;;;;90357:4;90332:10;:22;90343:10;90332:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;90372:24;90382:10;90394:1;90372:9;:24::i;:::-;89426:978;;;;;2321:20:::1;:18;:20::i;:::-;89364:1040::o:0;87133:118::-;61620:13;:11;:13::i;:::-;87235:8:::1;87213:19;;:30;;;;;;;;;;;;;;;;;;87133:118:::0;:::o;33186:282::-;33251:4;33307:7;33288:15;:13;:15::i;:::-;:26;;:66;;;;;33341:13;;33331:7;:23;33288:66;:153;;;;;33440:1;17285:8;33392:17;:26;33410:7;33392:26;;;;;;;;;;;;:44;:49;33288:153;33268:173;;33186:282;;;:::o;31532:124::-;31621:27;31630:2;31634:7;31643:4;31621:8;:27::i;:::-;31532:124;;:::o;73434:309::-;73551:4;73589:146;73622:12;;73589:146;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73649:23;;73714:8;73697:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;73687:37;;;;;;73589:18;:146::i;:::-;73573:162;;73434:309;;;;;:::o;5431:108::-;5502:8;:6;:8::i;:::-;5501:9;5493:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;5431:108::o;2357:293::-;1759:1;2491:7;;:19;2483:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1759:1;2624:7;:18;;;;2357:293::o;64321:190::-;64446:4;64499;64470:25;64483:5;64490:4;64470:12;:25::i;:::-;:33;64463:40;;64321:190;;;;;:::o;90930:399::-;92405:10;92392:23;;:9;:23;;;92384:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;91065:10:::1;;91060:1;91051:8;:10;;;;:::i;:::-;91035:13;:11;:13::i;:::-;:26;;;;:::i;:::-;:40;;91027:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;91145:8;91131:11;;:22;;;;:::i;:::-;91117:9;:37;;91109:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;91228:8;91214:11;;:22;;;;:::i;:::-;91200:9;:37;;91192:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;91288:33;91298:10;91319:1;91310:8;:10;;;;:::i;:::-;91288:9;:33::i;:::-;90930:399:::0;:::o;2658:213::-;1715:1;2841:7;:22;;;;2658:213::o;61899:132::-;61974:12;:10;:12::i;:::-;61963:23;;:7;:5;:7::i;:::-;:23;;;61955:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61899:132::o;51160:112::-;51237:27;51247:2;51251:8;51237:27;;;;;;;;;;;;:9;:27::i;:::-;51160:112;;:::o;20682:92::-;20738:7;20682:92;:::o;37288:2825::-;37430:27;37460;37479:7;37460:18;:27::i;:::-;37430:57;;37545:4;37504:45;;37520:19;37504:45;;;37500:86;;37558:28;;;;;;;;;;;;;;37500:86;37600:27;37629:23;37656:35;37683:7;37656:26;:35::i;:::-;37599:92;;;;37791:68;37816:15;37833:4;37839:19;:17;:19::i;:::-;37791:24;:68::i;:::-;37786:180;;37879:43;37896:4;37902:19;:17;:19::i;:::-;37879:16;:43::i;:::-;37874:92;;37931:35;;;;;;;;;;;;;;37874:92;37786:180;37997:1;37983:16;;:2;:16;;;37979:52;;38008:23;;;;;;;;;;;;;;37979:52;38044:43;38066:4;38072:2;38076:7;38085:1;38044:21;:43::i;:::-;38180:15;38177:160;;;38320:1;38299:19;38292:30;38177:160;38717:18;:24;38736:4;38717:24;;;;;;;;;;;;;;;;38715:26;;;;;;;;;;;;38786:18;:22;38805:2;38786:22;;;;;;;;;;;;;;;;38784:24;;;;;;;;;;;39108:146;39145:2;39194:45;39209:4;39215:2;39219:19;39194:14;:45::i;:::-;17565:8;39166:73;39108:18;:146::i;:::-;39079:17;:26;39097:7;39079:26;;;;;;;;;;;:175;;;;39425:1;17565:8;39374:19;:47;:52;39370:627;;39447:19;39479:1;39469:7;:11;39447:33;;39636:1;39602:17;:30;39620:11;39602:30;;;;;;;;;;;;:35;39598:384;;39740:13;;39725:11;:28;39721:242;;39920:19;39887:17;:30;39905:11;39887:30;;;;;;;;;;;:52;;;;39721:242;39598:384;39428:569;39370:627;40044:7;40040:2;40025:27;;40034:4;40025:27;;;;;;;;;;;;40063:42;40084:4;40090:2;40094:7;40103:1;40063:20;:42::i;:::-;37419:2694;;;37288:2825;;;:::o;6127:120::-;5136:16;:14;:16::i;:::-;6196:5:::1;6186:7;;:15;;;;;;;;;;;;;;;;;;6217:22;6226:12;:10;:12::i;:::-;6217:22;;;;;;:::i;:::-;;;;;;;;6127:120::o:0;40209:193::-;40355:39;40372:4;40378:2;40382:7;40355:39;;;;;;;;;;;;:16;:39::i;:::-;40209:193;;;:::o;27963:1712::-;28030:14;28080:7;28061:15;:13;:15::i;:::-;:26;28057:1562;;28113:17;:26;28131:7;28113:26;;;;;;;;;;;;28104:35;;28217:1;17285:8;28189:6;:24;:29;28185:1423;;28338:1;28328:6;:11;28324:981;;28379:13;;28368:7;:24;28364:68;;28401:31;;;;;;;;;;;;;;28364:68;29029:257;29115:17;:28;29133:9;;;;;;;29115:28;;;;;;;;;;;;29106:37;;29211:1;29201:6;:11;29249:13;29197:25;29029:257;;28324:981;29579:13;;28185:1423;28057:1562;29636:31;;;;;;;;;;;;;;27963:1712;;;;:::o;63001:191::-;63075:16;63094:6;;;;;;;;;;;63075:25;;63120:8;63111:6;;:17;;;;;;;;;;;;;;;;;;63175:8;63144:40;;63165:8;63144:40;;;;;;;;;;;;63064:128;63001:191;:::o;5868:118::-;4877:19;:17;:19::i;:::-;5938:4:::1;5928:7;;:14;;;;;;;;;;;;;;;;;;5958:20;5965:12;:10;:12::i;:::-;5958:20;;;;;;:::i;:::-;;;;;;;;5868:118::o:0;27411:161::-;27479:21;;:::i;:::-;27520:44;27539:17;:24;27557:5;27539:24;;;;;;;;;;;;27520:18;:44::i;:::-;27513:51;;27411:161;;;:::o;32373:234::-;32520:8;32468:18;:39;32487:19;:17;:19::i;:::-;32468:39;;;;;;;;;;;;;;;:49;32508:8;32468:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;32580:8;32544:55;;32559:19;:17;:19::i;:::-;32544:55;;;32590:8;32544:55;;;;;;:::i;:::-;;;;;;;;32373:234;;:::o;43491:716::-;43654:4;43700:2;43675:45;;;43721:19;:17;:19::i;:::-;43742:4;43748:7;43757:5;43675:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;43671:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43975:1;43958:6;:13;:18;43954:235;;44004:40;;;;;;;;;;;;;;43954:235;44147:6;44141:13;44132:6;44128:2;44124:15;44117:38;43671:529;43844:54;;;43834:64;;;:6;:64;;;;43827:71;;;43491:716;;;;;;:::o;91337:108::-;91397:13;91430:7;91423:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;91337:108;:::o;58833:1745::-;58898:17;59332:4;59325;59319:11;59315:22;59424:1;59418:4;59411:15;59499:4;59496:1;59492:12;59485:19;;59581:1;59576:3;59569:14;59685:3;59924:5;59906:428;59932:1;59906:428;;;59972:1;59967:3;59963:11;59956:18;;60143:2;60137:4;60133:13;60129:2;60125:22;60120:3;60112:36;60237:2;60231:4;60227:13;60219:21;;60304:4;59906:428;60294:25;59906:428;59910:21;60373:3;60368;60364:13;60488:4;60483:3;60479:14;60472:21;;60553:6;60548:3;60541:19;58937:1634;;;58833:1745;;;:::o;52078:492::-;52207:13;52223:16;52231:7;52223;:16::i;:::-;52207:32;;52256:13;52252:219;;;52311:5;52288:28;;:19;:17;:19::i;:::-;:28;;;52284:187;;52340:44;52357:5;52364:19;:17;:19::i;:::-;52340:16;:44::i;:::-;52335:136;;52416:35;;;;;;;;;;;;;;52335:136;52284:187;52252:219;52516:2;52483:15;:24;52499:7;52483:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;52554:7;52550:2;52534:28;;52543:5;52534:28;;;;;;;;;;;;52196:374;52078:492;;;:::o;65188:296::-;65271:7;65291:20;65314:4;65291:27;;65334:9;65329:118;65353:5;:12;65349:1;:16;65329:118;;;65402:33;65412:12;65426:5;65432:1;65426:8;;;;;;;;:::i;:::-;;;;;;;;65402:9;:33::i;:::-;65387:48;;65367:3;;;;;:::i;:::-;;;;65329:118;;;;65464:12;65457:19;;;65188:296;;;;:::o;3474:98::-;3527:7;3554:10;3547:17;;3474:98;:::o;50387:689::-;50518:19;50524:2;50528:8;50518:5;:19::i;:::-;50597:1;50579:2;:14;;;:19;50575:483;;50619:11;50633:13;;50619:27;;50665:13;50687:8;50681:3;:14;50665:30;;50714:233;50745:62;50784:1;50788:2;50792:7;;;;;;50801:5;50745:30;:62::i;:::-;50740:167;;50843:40;;;;;;;;;;;;;;50740:167;50942:3;50934:5;:11;50714:233;;51029:3;51012:13;;:20;51008:34;;51034:8;;;51008:34;50600:458;;50575:483;50387:689;;;:::o;34349:485::-;34451:27;34480:23;34521:38;34562:15;:24;34578:7;34562:24;;;;;;;;;;;34521:65;;34739:18;34716:41;;34796:19;34790:26;34771:45;;34701:126;34349:485;;;:::o;58626:105::-;58686:7;58713:10;58706:17;;58626:105;:::o;33577:659::-;33726:11;33891:16;33884:5;33880:28;33871:37;;34051:16;34040:9;34036:32;34023:45;;34201:15;34190:9;34187:30;34179:5;34168:9;34165:20;34162:56;34152:66;;33577:659;;;;;:::o;42069:159::-;;;;;:::o;57935:311::-;58070:7;58090:16;17689:3;58116:19;:41;;58090:68;;17689:3;58184:31;58195:4;58201:2;58205:9;58184:10;:31::i;:::-;58176:40;;:62;;58169:69;;;57935:311;;;;;:::o;30223:450::-;30303:14;30471:16;30464:5;30460:28;30451:37;;30648:5;30634:11;30609:23;30605:41;30602:52;30595:5;30592:63;30582:73;;30223:450;;;;:::o;42893:158::-;;;;;:::o;5616:108::-;5683:8;:6;:8::i;:::-;5675:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;5616:108::o;29774:366::-;29840:31;;:::i;:::-;29917:6;29884:9;:14;;:41;;;;;;;;;;;17168:3;29970:6;:33;;29936:9;:24;;:68;;;;;;;;;;;30062:1;17285:8;30034:6;:24;:29;;30015:9;:16;;:48;;;;;;;;;;;17689:3;30103:6;:28;;30074:9;:19;;:58;;;;;;;;;;;29774:366;;;:::o;72228:149::-;72291:7;72322:1;72318;:5;:51;;72349:20;72364:1;72367;72349:14;:20::i;:::-;72318:51;;;72326:20;72341:1;72344;72326:14;:20::i;:::-;72318:51;72311:58;;72228:149;;;;:::o;44669:2966::-;44742:20;44765:13;;44742:36;;44805:1;44793:8;:13;44789:44;;44815:18;;;;;;;;;;;;;;44789:44;44846:61;44876:1;44880:2;44884:12;44898:8;44846:21;:61::i;:::-;45390:1;16647:2;45360:1;:26;;45359:32;45347:8;:45;45321:18;:22;45340:2;45321:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;45669:139;45706:2;45760:33;45783:1;45787:2;45791:1;45760:14;:33::i;:::-;45727:30;45748:8;45727:20;:30::i;:::-;:66;45669:18;:139::i;:::-;45635:17;:31;45653:12;45635:31;;;;;;;;;;;:173;;;;45825:16;45856:11;45885:8;45870:12;:23;45856:37;;46406:16;46402:2;46398:25;46386:37;;46778:12;46738:8;46697:1;46635:25;46576:1;46515;46488:335;47149:1;47135:12;47131:20;47089:346;47190:3;47181:7;47178:16;47089:346;;47408:7;47398:8;47395:1;47368:25;47365:1;47362;47357:59;47243:1;47234:7;47230:15;47219:26;;47089:346;;;47093:77;47480:1;47468:8;:13;47464:45;;47490:19;;;;;;;;;;;;;;47464:45;47542:3;47526:13;:19;;;;45095:2462;;47567:60;47596:1;47600:2;47604:12;47618:8;47567:20;:60::i;:::-;44731:2904;44669:2966;;:::o;57636:147::-;57773:6;57636:147;;;;;:::o;72385:268::-;72453:13;72560:1;72554:4;72547:15;72589:1;72583:4;72576:15;72630:4;72624;72614:21;72605:30;;72385:268;;;;:::o;30775:324::-;30845:14;31078:1;31068:8;31065:15;31039:24;31035:46;31025:56;;30775:324;;;:::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:117::-;4999:1;4996;4989:12;5013:117;5122:1;5119;5112:12;5136:117;5245:1;5242;5235:12;5276:568;5349:8;5359:6;5409:3;5402:4;5394:6;5390:17;5386:27;5376:122;;5417:79;;:::i;:::-;5376:122;5530:6;5517:20;5507:30;;5560:18;5552:6;5549:30;5546:117;;;5582:79;;:::i;:::-;5546:117;5696:4;5688:6;5684:17;5672:29;;5750:3;5742:4;5734:6;5730:17;5720:8;5716:32;5713:41;5710:128;;;5757:79;;:::i;:::-;5710:128;5276:568;;;;;:::o;5850:704::-;5945:6;5953;5961;6010:2;5998:9;5989:7;5985:23;5981:32;5978:119;;;6016:79;;:::i;:::-;5978:119;6136:1;6161:53;6206:7;6197:6;6186:9;6182:22;6161:53;:::i;:::-;6151:63;;6107:117;6291:2;6280:9;6276:18;6263:32;6322:18;6314:6;6311:30;6308:117;;;6344:79;;:::i;:::-;6308:117;6457:80;6529:7;6520:6;6509:9;6505:22;6457:80;:::i;:::-;6439:98;;;;6234:313;5850:704;;;;;:::o;6560:::-;6655:6;6663;6671;6720:2;6708:9;6699:7;6695:23;6691:32;6688:119;;;6726:79;;:::i;:::-;6688:119;6874:1;6863:9;6859:17;6846:31;6904:18;6896:6;6893:30;6890:117;;;6926:79;;:::i;:::-;6890:117;7039:80;7111:7;7102:6;7091:9;7087:22;7039:80;:::i;:::-;7021:98;;;;6817:312;7168:2;7194:53;7239:7;7230:6;7219:9;7215:22;7194:53;:::i;:::-;7184:63;;7139:118;6560:704;;;;;:::o;7270:118::-;7357:24;7375:5;7357:24;:::i;:::-;7352:3;7345:37;7270:118;;:::o;7394:222::-;7487:4;7525:2;7514:9;7510:18;7502:26;;7538:71;7606:1;7595:9;7591:17;7582:6;7538:71;:::i;:::-;7394:222;;;;:::o;7622:619::-;7699:6;7707;7715;7764:2;7752:9;7743:7;7739:23;7735:32;7732:119;;;7770:79;;:::i;:::-;7732:119;7890:1;7915:53;7960:7;7951:6;7940:9;7936:22;7915:53;:::i;:::-;7905:63;;7861:117;8017:2;8043:53;8088:7;8079:6;8068:9;8064:22;8043:53;:::i;:::-;8033:63;;7988:118;8145:2;8171:53;8216:7;8207:6;8196:9;8192:22;8171:53;:::i;:::-;8161:63;;8116:118;7622:619;;;;;:::o;8247:93::-;8283:7;8323:10;8316:5;8312:22;8301:33;;8247:93;;;:::o;8346:120::-;8418:23;8435:5;8418:23;:::i;:::-;8411:5;8408:34;8398:62;;8456:1;8453;8446:12;8398:62;8346:120;:::o;8472:137::-;8517:5;8555:6;8542:20;8533:29;;8571:32;8597:5;8571:32;:::i;:::-;8472:137;;;;:::o;8615:327::-;8673:6;8722:2;8710:9;8701:7;8697:23;8693:32;8690:119;;;8728:79;;:::i;:::-;8690:119;8848:1;8873:52;8917:7;8908:6;8897:9;8893:22;8873:52;:::i;:::-;8863:62;;8819:116;8615:327;;;;:::o;8948:329::-;9007:6;9056:2;9044:9;9035:7;9031:23;9027:32;9024:119;;;9062:79;;:::i;:::-;9024:119;9182:1;9207:53;9252:7;9243:6;9232:9;9228:22;9207:53;:::i;:::-;9197:63;;9153:117;8948:329;;;;:::o;9283:60::-;9311:3;9332:5;9325:12;;9283:60;;;:::o;9349:142::-;9399:9;9432:53;9450:34;9459:24;9477:5;9459:24;:::i;:::-;9450:34;:::i;:::-;9432:53;:::i;:::-;9419:66;;9349:142;;;:::o;9497:126::-;9547:9;9580:37;9611:5;9580:37;:::i;:::-;9567:50;;9497:126;;;:::o;9629:158::-;9711:9;9744:37;9775:5;9744:37;:::i;:::-;9731:50;;9629:158;;;:::o;9793:195::-;9912:69;9975:5;9912:69;:::i;:::-;9907:3;9900:82;9793:195;;:::o;9994:286::-;10119:4;10157:2;10146:9;10142:18;10134:26;;10170:103;10270:1;10259:9;10255:17;10246:6;10170:103;:::i;:::-;9994:286;;;;:::o;10286:117::-;10395:1;10392;10385:12;10409:180;10457:77;10454:1;10447:88;10554:4;10551:1;10544:15;10578:4;10575:1;10568:15;10595:281;10678:27;10700:4;10678:27;:::i;:::-;10670:6;10666:40;10808:6;10796:10;10793:22;10772:18;10760:10;10757:34;10754:62;10751:88;;;10819:18;;:::i;:::-;10751:88;10859:10;10855:2;10848:22;10638:238;10595:281;;:::o;10882:129::-;10916:6;10943:20;;:::i;:::-;10933:30;;10972:33;11000:4;10992:6;10972:33;:::i;:::-;10882:129;;;:::o;11017:308::-;11079:4;11169:18;11161:6;11158:30;11155:56;;;11191:18;;:::i;:::-;11155:56;11229:29;11251:6;11229:29;:::i;:::-;11221:37;;11313:4;11307;11303:15;11295:23;;11017:308;;;:::o;11331:146::-;11428:6;11423:3;11418;11405:30;11469:1;11460:6;11455:3;11451:16;11444:27;11331:146;;;:::o;11483:425::-;11561:5;11586:66;11602:49;11644:6;11602:49;:::i;:::-;11586:66;:::i;:::-;11577:75;;11675:6;11668:5;11661:21;11713:4;11706:5;11702:16;11751:3;11742:6;11737:3;11733:16;11730:25;11727:112;;;11758:79;;:::i;:::-;11727:112;11848:54;11895:6;11890:3;11885;11848:54;:::i;:::-;11567:341;11483:425;;;;;:::o;11928:340::-;11984:5;12033:3;12026:4;12018:6;12014:17;12010:27;12000:122;;12041:79;;:::i;:::-;12000:122;12158:6;12145:20;12183:79;12258:3;12250:6;12243:4;12235:6;12231:17;12183:79;:::i;:::-;12174:88;;11990:278;11928:340;;;;:::o;12274:509::-;12343:6;12392:2;12380:9;12371:7;12367:23;12363:32;12360:119;;;12398:79;;:::i;:::-;12360:119;12546:1;12535:9;12531:17;12518:31;12576:18;12568:6;12565:30;12562:117;;;12598:79;;:::i;:::-;12562:117;12703:63;12758:7;12749:6;12738:9;12734:22;12703:63;:::i;:::-;12693:73;;12489:287;12274:509;;;;:::o;12789:77::-;12826:7;12855:5;12844:16;;12789:77;;;:::o;12872:122::-;12945:24;12963:5;12945:24;:::i;:::-;12938:5;12935:35;12925:63;;12984:1;12981;12974:12;12925:63;12872:122;:::o;13000:139::-;13046:5;13084:6;13071:20;13062:29;;13100:33;13127:5;13100:33;:::i;:::-;13000:139;;;;:::o;13145:329::-;13204:6;13253:2;13241:9;13232:7;13228:23;13224:32;13221:119;;;13259:79;;:::i;:::-;13221:119;13379:1;13404:53;13449:7;13440:6;13429:9;13425:22;13404:53;:::i;:::-;13394:63;;13350:117;13145:329;;;;:::o;13480:114::-;13547:6;13581:5;13575:12;13565:22;;13480:114;;;:::o;13600:184::-;13699:11;13733:6;13728:3;13721:19;13773:4;13768:3;13764:14;13749:29;;13600:184;;;;:::o;13790:132::-;13857:4;13880:3;13872:11;;13910:4;13905:3;13901:14;13893:22;;13790:132;;;:::o;13928:108::-;14005:24;14023:5;14005:24;:::i;:::-;14000:3;13993:37;13928:108;;:::o;14042:179::-;14111:10;14132:46;14174:3;14166:6;14132:46;:::i;:::-;14210:4;14205:3;14201:14;14187:28;;14042:179;;;;:::o;14227:113::-;14297:4;14329;14324:3;14320:14;14312:22;;14227:113;;;:::o;14376:732::-;14495:3;14524:54;14572:5;14524:54;:::i;:::-;14594:86;14673:6;14668:3;14594:86;:::i;:::-;14587:93;;14704:56;14754:5;14704:56;:::i;:::-;14783:7;14814:1;14799:284;14824:6;14821:1;14818:13;14799:284;;;14900:6;14894:13;14927:63;14986:3;14971:13;14927:63;:::i;:::-;14920:70;;15013:60;15066:6;15013:60;:::i;:::-;15003:70;;14859:224;14846:1;14843;14839:9;14834:14;;14799:284;;;14803:14;15099:3;15092:10;;14500:608;;;14376:732;;;;:::o;15114:373::-;15257:4;15295:2;15284:9;15280:18;15272:26;;15344:9;15338:4;15334:20;15330:1;15319:9;15315:17;15308:47;15372:108;15475:4;15466:6;15372:108;:::i;:::-;15364:116;;15114:373;;;;:::o;15493:442::-;15642:4;15680:2;15669:9;15665:18;15657:26;;15693:71;15761:1;15750:9;15746:17;15737:6;15693:71;:::i;:::-;15774:72;15842:2;15831:9;15827:18;15818:6;15774:72;:::i;:::-;15856;15924:2;15913:9;15909:18;15900:6;15856:72;:::i;:::-;15493:442;;;;;;:::o;15941:116::-;16011:21;16026:5;16011:21;:::i;:::-;16004:5;16001:32;15991:60;;16047:1;16044;16037:12;15991:60;15941:116;:::o;16063:133::-;16106:5;16144:6;16131:20;16122:29;;16160:30;16184:5;16160:30;:::i;:::-;16063:133;;;;:::o;16202:468::-;16267:6;16275;16324:2;16312:9;16303:7;16299:23;16295:32;16292:119;;;16330:79;;:::i;:::-;16292:119;16450:1;16475:53;16520:7;16511:6;16500:9;16496:22;16475:53;:::i;:::-;16465:63;;16421:117;16577:2;16603:50;16645:7;16636:6;16625:9;16621:22;16603:50;:::i;:::-;16593:60;;16548:115;16202:468;;;;;:::o;16676:118::-;16763:24;16781:5;16763:24;:::i;:::-;16758:3;16751:37;16676:118;;:::o;16800:222::-;16893:4;16931:2;16920:9;16916:18;16908:26;;16944:71;17012:1;17001:9;16997:17;16988:6;16944:71;:::i;:::-;16800:222;;;;:::o;17028:307::-;17089:4;17179:18;17171:6;17168:30;17165:56;;;17201:18;;:::i;:::-;17165:56;17239:29;17261:6;17239:29;:::i;:::-;17231:37;;17323:4;17317;17313:15;17305:23;;17028:307;;;:::o;17341:423::-;17418:5;17443:65;17459:48;17500:6;17459:48;:::i;:::-;17443:65;:::i;:::-;17434:74;;17531:6;17524:5;17517:21;17569:4;17562:5;17558:16;17607:3;17598:6;17593:3;17589:16;17586:25;17583:112;;;17614:79;;:::i;:::-;17583:112;17704:54;17751:6;17746:3;17741;17704:54;:::i;:::-;17424:340;17341:423;;;;;:::o;17783:338::-;17838:5;17887:3;17880:4;17872:6;17868:17;17864:27;17854:122;;17895:79;;:::i;:::-;17854:122;18012:6;17999:20;18037:78;18111:3;18103:6;18096:4;18088:6;18084:17;18037:78;:::i;:::-;18028:87;;17844:277;17783:338;;;;:::o;18127:943::-;18222:6;18230;18238;18246;18295:3;18283:9;18274:7;18270:23;18266:33;18263:120;;;18302:79;;:::i;:::-;18263:120;18422:1;18447:53;18492:7;18483:6;18472:9;18468:22;18447:53;:::i;:::-;18437:63;;18393:117;18549:2;18575:53;18620:7;18611:6;18600:9;18596:22;18575:53;:::i;:::-;18565:63;;18520:118;18677:2;18703:53;18748:7;18739:6;18728:9;18724:22;18703:53;:::i;:::-;18693:63;;18648:118;18833:2;18822:9;18818:18;18805:32;18864:18;18856:6;18853:30;18850:117;;;18886:79;;:::i;:::-;18850:117;18991:62;19045:7;19036:6;19025:9;19021:22;18991:62;:::i;:::-;18981:72;;18776:287;18127:943;;;;;;;:::o;19076:474::-;19144:6;19152;19201:2;19189:9;19180:7;19176:23;19172:32;19169:119;;;19207:79;;:::i;:::-;19169:119;19327:1;19352:53;19397:7;19388:6;19377:9;19373:22;19352:53;:::i;:::-;19342:63;;19298:117;19454:2;19480:53;19525:7;19516:6;19505:9;19501:22;19480:53;:::i;:::-;19470:63;;19425:118;19076:474;;;;;:::o;19556:180::-;19604:77;19601:1;19594:88;19701:4;19698:1;19691:15;19725:4;19722:1;19715:15;19742:320;19786:6;19823:1;19817:4;19813:12;19803:22;;19870:1;19864:4;19860:12;19891:18;19881:81;;19947:4;19939:6;19935:17;19925:27;;19881:81;20009:2;20001:6;19998:14;19978:18;19975:38;19972:84;;20028:18;;:::i;:::-;19972:84;19793:269;19742:320;;;:::o;20068:332::-;20189:4;20227:2;20216:9;20212:18;20204:26;;20240:71;20308:1;20297:9;20293:17;20284:6;20240:71;:::i;:::-;20321:72;20389:2;20378:9;20374:18;20365:6;20321:72;:::i;:::-;20068:332;;;;;:::o;20406:137::-;20460:5;20491:6;20485:13;20476:22;;20507:30;20531:5;20507:30;:::i;:::-;20406:137;;;;:::o;20549:345::-;20616:6;20665:2;20653:9;20644:7;20640:23;20636:32;20633:119;;;20671:79;;:::i;:::-;20633:119;20791:1;20816:61;20869:7;20860:6;20849:9;20845:22;20816:61;:::i;:::-;20806:71;;20762:125;20549:345;;;;:::o;20900:178::-;21040:30;21036:1;21028:6;21024:14;21017:54;20900:178;:::o;21084:366::-;21226:3;21247:67;21311:2;21306:3;21247:67;:::i;:::-;21240:74;;21323:93;21412:3;21323:93;:::i;:::-;21441:2;21436:3;21432:12;21425:19;;21084:366;;;:::o;21456:419::-;21622:4;21660:2;21649:9;21645:18;21637:26;;21709:9;21703:4;21699:20;21695:1;21684:9;21680:17;21673:47;21737:131;21863:4;21737:131;:::i;:::-;21729:139;;21456:419;;;:::o;21881:94::-;21914:8;21962:5;21958:2;21954:14;21933:35;;21881:94;;;:::o;21981:::-;22020:7;22049:20;22063:5;22049:20;:::i;:::-;22038:31;;21981:94;;;:::o;22081:100::-;22120:7;22149:26;22169:5;22149:26;:::i;:::-;22138:37;;22081:100;;;:::o;22187:157::-;22292:45;22312:24;22330:5;22312:24;:::i;:::-;22292:45;:::i;:::-;22287:3;22280:58;22187:157;;:::o;22350:256::-;22462:3;22477:75;22548:3;22539:6;22477:75;:::i;:::-;22577:2;22572:3;22568:12;22561:19;;22597:3;22590:10;;22350:256;;;;:::o;22612:169::-;22752:21;22748:1;22740:6;22736:14;22729:45;22612:169;:::o;22787:366::-;22929:3;22950:67;23014:2;23009:3;22950:67;:::i;:::-;22943:74;;23026:93;23115:3;23026:93;:::i;:::-;23144:2;23139:3;23135:12;23128:19;;22787:366;;;:::o;23159:419::-;23325:4;23363:2;23352:9;23348:18;23340:26;;23412:9;23406:4;23402:20;23398:1;23387:9;23383:17;23376:47;23440:131;23566:4;23440:131;:::i;:::-;23432:139;;23159:419;;;:::o;23584:180::-;23632:77;23629:1;23622:88;23729:4;23726:1;23719:15;23753:4;23750:1;23743:15;23770:191;23810:3;23829:20;23847:1;23829:20;:::i;:::-;23824:25;;23863:20;23881:1;23863:20;:::i;:::-;23858:25;;23906:1;23903;23899:9;23892:16;;23927:3;23924:1;23921:10;23918:36;;;23934:18;;:::i;:::-;23918:36;23770:191;;;;:::o;23967:174::-;24107:26;24103:1;24095:6;24091:14;24084:50;23967:174;:::o;24147:366::-;24289:3;24310:67;24374:2;24369:3;24310:67;:::i;:::-;24303:74;;24386:93;24475:3;24386:93;:::i;:::-;24504:2;24499:3;24495:12;24488:19;;24147:366;;;:::o;24519:419::-;24685:4;24723:2;24712:9;24708:18;24700:26;;24772:9;24766:4;24762:20;24758:1;24747:9;24743:17;24736:47;24800:131;24926:4;24800:131;:::i;:::-;24792:139;;24519:419;;;:::o;24944:301::-;25084:34;25080:1;25072:6;25068:14;25061:58;25153:34;25148:2;25140:6;25136:15;25129:59;25222:15;25217:2;25209:6;25205:15;25198:40;24944:301;:::o;25251:366::-;25393:3;25414:67;25478:2;25473:3;25414:67;:::i;:::-;25407:74;;25490:93;25579:3;25490:93;:::i;:::-;25608:2;25603:3;25599:12;25592:19;;25251:366;;;:::o;25623:419::-;25789:4;25827:2;25816:9;25812:18;25804:26;;25876:9;25870:4;25866:20;25862:1;25851:9;25847:17;25840:47;25904:131;26030:4;25904:131;:::i;:::-;25896:139;;25623:419;;;:::o;26048:410::-;26088:7;26111:20;26129:1;26111:20;:::i;:::-;26106:25;;26145:20;26163:1;26145:20;:::i;:::-;26140:25;;26200:1;26197;26193:9;26222:30;26240:11;26222:30;:::i;:::-;26211:41;;26401:1;26392:7;26388:15;26385:1;26382:22;26362:1;26355:9;26335:83;26312:139;;26431:18;;:::i;:::-;26312:139;26096:362;26048:410;;;;:::o;26464:172::-;26604:24;26600:1;26592:6;26588:14;26581:48;26464:172;:::o;26642:366::-;26784:3;26805:67;26869:2;26864:3;26805:67;:::i;:::-;26798:74;;26881:93;26970:3;26881:93;:::i;:::-;26999:2;26994:3;26990:12;26983:19;;26642:366;;;:::o;27014:419::-;27180:4;27218:2;27207:9;27203:18;27195:26;;27267:9;27261:4;27257:20;27253:1;27242:9;27238:17;27231:47;27295:131;27421:4;27295:131;:::i;:::-;27287:139;;27014:419;;;:::o;27439:222::-;27579:34;27575:1;27567:6;27563:14;27556:58;27648:5;27643:2;27635:6;27631:15;27624:30;27439:222;:::o;27667:366::-;27809:3;27830:67;27894:2;27889:3;27830:67;:::i;:::-;27823:74;;27906:93;27995:3;27906:93;:::i;:::-;28024:2;28019:3;28015:12;28008:19;;27667:366;;;:::o;28039:419::-;28205:4;28243:2;28232:9;28228:18;28220:26;;28292:9;28286:4;28282:20;28278:1;28267:9;28263:17;28256:47;28320:131;28446:4;28320:131;:::i;:::-;28312:139;;28039:419;;;:::o;28464:230::-;28604:34;28600:1;28592:6;28588:14;28581:58;28673:13;28668:2;28660:6;28656:15;28649:38;28464:230;:::o;28700:366::-;28842:3;28863:67;28927:2;28922:3;28863:67;:::i;:::-;28856:74;;28939:93;29028:3;28939:93;:::i;:::-;29057:2;29052:3;29048:12;29041:19;;28700:366;;;:::o;29072:419::-;29238:4;29276:2;29265:9;29261:18;29253:26;;29325:9;29319:4;29315:20;29311:1;29300:9;29296:17;29289:47;29353:131;29479:4;29353:131;:::i;:::-;29345:139;;29072:419;;;:::o;29497:141::-;29546:4;29569:3;29561:11;;29592:3;29589:1;29582:14;29626:4;29623:1;29613:18;29605:26;;29497:141;;;:::o;29644:93::-;29681:6;29728:2;29723;29716:5;29712:14;29708:23;29698:33;;29644:93;;;:::o;29743:107::-;29787:8;29837:5;29831:4;29827:16;29806:37;;29743:107;;;;:::o;29856:393::-;29925:6;29975:1;29963:10;29959:18;29998:97;30028:66;30017:9;29998:97;:::i;:::-;30116:39;30146:8;30135:9;30116:39;:::i;:::-;30104:51;;30188:4;30184:9;30177:5;30173:21;30164:30;;30237:4;30227:8;30223:19;30216:5;30213:30;30203:40;;29932:317;;29856:393;;;;;:::o;30255:142::-;30305:9;30338:53;30356:34;30365:24;30383:5;30365:24;:::i;:::-;30356:34;:::i;:::-;30338:53;:::i;:::-;30325:66;;30255:142;;;:::o;30403:75::-;30446:3;30467:5;30460:12;;30403:75;;;:::o;30484:269::-;30594:39;30625:7;30594:39;:::i;:::-;30655:91;30704:41;30728:16;30704:41;:::i;:::-;30696:6;30689:4;30683:11;30655:91;:::i;:::-;30649:4;30642:105;30560:193;30484:269;;;:::o;30759:73::-;30804:3;30759:73;:::o;30838:189::-;30915:32;;:::i;:::-;30956:65;31014:6;31006;31000:4;30956:65;:::i;:::-;30891:136;30838:189;;:::o;31033:186::-;31093:120;31110:3;31103:5;31100:14;31093:120;;;31164:39;31201:1;31194:5;31164:39;:::i;:::-;31137:1;31130:5;31126:13;31117:22;;31093:120;;;31033:186;;:::o;31225:543::-;31326:2;31321:3;31318:11;31315:446;;;31360:38;31392:5;31360:38;:::i;:::-;31444:29;31462:10;31444:29;:::i;:::-;31434:8;31430:44;31627:2;31615:10;31612:18;31609:49;;;31648:8;31633:23;;31609:49;31671:80;31727:22;31745:3;31727:22;:::i;:::-;31717:8;31713:37;31700:11;31671:80;:::i;:::-;31330:431;;31315:446;31225:543;;;:::o;31774:117::-;31828:8;31878:5;31872:4;31868:16;31847:37;;31774:117;;;;:::o;31897:169::-;31941:6;31974:51;32022:1;32018:6;32010:5;32007:1;32003:13;31974:51;:::i;:::-;31970:56;32055:4;32049;32045:15;32035:25;;31948:118;31897:169;;;;:::o;32071:295::-;32147:4;32293:29;32318:3;32312:4;32293:29;:::i;:::-;32285:37;;32355:3;32352:1;32348:11;32342:4;32339:21;32331:29;;32071:295;;;;:::o;32371:1395::-;32488:37;32521:3;32488:37;:::i;:::-;32590:18;32582:6;32579:30;32576:56;;;32612:18;;:::i;:::-;32576:56;32656:38;32688:4;32682:11;32656:38;:::i;:::-;32741:67;32801:6;32793;32787:4;32741:67;:::i;:::-;32835:1;32859:4;32846:17;;32891:2;32883:6;32880:14;32908:1;32903:618;;;;33565:1;33582:6;33579:77;;;33631:9;33626:3;33622:19;33616:26;33607:35;;33579:77;33682:67;33742:6;33735:5;33682:67;:::i;:::-;33676:4;33669:81;33538:222;32873:887;;32903:618;32955:4;32951:9;32943:6;32939:22;32989:37;33021:4;32989:37;:::i;:::-;33048:1;33062:208;33076:7;33073:1;33070:14;33062:208;;;33155:9;33150:3;33146:19;33140:26;33132:6;33125:42;33206:1;33198:6;33194:14;33184:24;;33253:2;33242:9;33238:18;33225:31;;33099:4;33096:1;33092:12;33087:17;;33062:208;;;33298:6;33289:7;33286:19;33283:179;;;33356:9;33351:3;33347:19;33341:26;33399:48;33441:4;33433:6;33429:17;33418:9;33399:48;:::i;:::-;33391:6;33384:64;33306:156;33283:179;33508:1;33504;33496:6;33492:14;33488:22;33482:4;33475:36;32910:611;;;32873:887;;32463:1303;;;32371:1395;;:::o;33772:166::-;33912:18;33908:1;33900:6;33896:14;33889:42;33772:166;:::o;33944:366::-;34086:3;34107:67;34171:2;34166:3;34107:67;:::i;:::-;34100:74;;34183:93;34272:3;34183:93;:::i;:::-;34301:2;34296:3;34292:12;34285:19;;33944:366;;;:::o;34316:419::-;34482:4;34520:2;34509:9;34505:18;34497:26;;34569:9;34563:4;34559:20;34555:1;34544:9;34540:17;34533:47;34597:131;34723:4;34597:131;:::i;:::-;34589:139;;34316:419;;;:::o;34741:179::-;34881:31;34877:1;34869:6;34865:14;34858:55;34741:179;:::o;34926:366::-;35068:3;35089:67;35153:2;35148:3;35089:67;:::i;:::-;35082:74;;35165:93;35254:3;35165:93;:::i;:::-;35283:2;35278:3;35274:12;35267:19;;34926:366;;;:::o;35298:419::-;35464:4;35502:2;35491:9;35487:18;35479:26;;35551:9;35545:4;35541:20;35537:1;35526:9;35522:17;35515:47;35579:131;35705:4;35579:131;:::i;:::-;35571:139;;35298:419;;;:::o;35723:148::-;35825:11;35862:3;35847:18;;35723:148;;;;:::o;35877:390::-;35983:3;36011:39;36044:5;36011:39;:::i;:::-;36066:89;36148:6;36143:3;36066:89;:::i;:::-;36059:96;;36164:65;36222:6;36217:3;36210:4;36203:5;36199:16;36164:65;:::i;:::-;36254:6;36249:3;36245:16;36238:23;;35987:280;35877:390;;;;:::o;36273:435::-;36453:3;36475:95;36566:3;36557:6;36475:95;:::i;:::-;36468:102;;36587:95;36678:3;36669:6;36587:95;:::i;:::-;36580:102;;36699:3;36692:10;;36273:435;;;;;:::o;36714:147::-;36815:11;36852:3;36837:18;;36714:147;;;;:::o;36867:114::-;;:::o;36987:398::-;37146:3;37167:83;37248:1;37243:3;37167:83;:::i;:::-;37160:90;;37259:93;37348:3;37259:93;:::i;:::-;37377:1;37372:3;37368:11;37361:18;;36987:398;;;:::o;37391:379::-;37575:3;37597:147;37740:3;37597:147;:::i;:::-;37590:154;;37761:3;37754:10;;37391:379;;;:::o;37776:166::-;37916:18;37912:1;37904:6;37900:14;37893:42;37776:166;:::o;37948:366::-;38090:3;38111:67;38175:2;38170:3;38111:67;:::i;:::-;38104:74;;38187:93;38276:3;38187:93;:::i;:::-;38305:2;38300:3;38296:12;38289:19;;37948:366;;;:::o;38320:419::-;38486:4;38524:2;38513:9;38509:18;38501:26;;38573:9;38567:4;38563:20;38559:1;38548:9;38544:17;38537:47;38601:131;38727:4;38601:131;:::i;:::-;38593:139;;38320:419;;;:::o;38745:225::-;38885:34;38881:1;38873:6;38869:14;38862:58;38954:8;38949:2;38941:6;38937:15;38930:33;38745:225;:::o;38976:366::-;39118:3;39139:67;39203:2;39198:3;39139:67;:::i;:::-;39132:74;;39215:93;39304:3;39215:93;:::i;:::-;39333:2;39328:3;39324:12;39317:19;;38976:366;;;:::o;39348:419::-;39514:4;39552:2;39541:9;39537:18;39529:26;;39601:9;39595:4;39591:20;39587:1;39576:9;39572:17;39565:47;39629:131;39755:4;39629:131;:::i;:::-;39621:139;;39348:419;;;:::o;39773:226::-;39913:34;39909:1;39901:6;39897:14;39890:58;39982:9;39977:2;39969:6;39965:15;39958:34;39773:226;:::o;40005:366::-;40147:3;40168:67;40232:2;40227:3;40168:67;:::i;:::-;40161:74;;40244:93;40333:3;40244:93;:::i;:::-;40362:2;40357:3;40353:12;40346:19;;40005:366;;;:::o;40377:419::-;40543:4;40581:2;40570:9;40566:18;40558:26;;40630:9;40624:4;40620:20;40616:1;40605:9;40601:17;40594:47;40658:131;40784:4;40658:131;:::i;:::-;40650:139;;40377:419;;;:::o;40802:182::-;40942:34;40938:1;40930:6;40926:14;40919:58;40802:182;:::o;40990:366::-;41132:3;41153:67;41217:2;41212:3;41153:67;:::i;:::-;41146:74;;41229:93;41318:3;41229:93;:::i;:::-;41347:2;41342:3;41338:12;41331:19;;40990:366;;;:::o;41362:419::-;41528:4;41566:2;41555:9;41551:18;41543:26;;41615:9;41609:4;41605:20;41601:1;41590:9;41586:17;41579:47;41643:131;41769:4;41643:131;:::i;:::-;41635:139;;41362:419;;;:::o;41787:175::-;41927:27;41923:1;41915:6;41911:14;41904:51;41787:175;:::o;41968:366::-;42110:3;42131:67;42195:2;42190:3;42131:67;:::i;:::-;42124:74;;42207:93;42296:3;42207:93;:::i;:::-;42325:2;42320:3;42316:12;42309:19;;41968:366;;;:::o;42340:419::-;42506:4;42544:2;42533:9;42529:18;42521:26;;42593:9;42587:4;42583:20;42579:1;42568:9;42564:17;42557:47;42621:131;42747:4;42621:131;:::i;:::-;42613:139;;42340:419;;;:::o;42765:143::-;42822:5;42853:6;42847:13;42838:22;;42869:33;42896:5;42869:33;:::i;:::-;42765:143;;;;:::o;42914:351::-;42984:6;43033:2;43021:9;43012:7;43008:23;43004:32;43001:119;;;43039:79;;:::i;:::-;43001:119;43159:1;43184:64;43240:7;43231:6;43220:9;43216:22;43184:64;:::i;:::-;43174:74;;43130:128;42914:351;;;;:::o;43271:222::-;43411:34;43407:1;43399:6;43395:14;43388:58;43480:5;43475:2;43467:6;43463:15;43456:30;43271:222;:::o;43499:366::-;43641:3;43662:67;43726:2;43721:3;43662:67;:::i;:::-;43655:74;;43738:93;43827:3;43738:93;:::i;:::-;43856:2;43851:3;43847:12;43840:19;;43499:366;;;:::o;43871:419::-;44037:4;44075:2;44064:9;44060:18;44052:26;;44124:9;44118:4;44114:20;44110:1;44099:9;44095:17;44088:47;44152:131;44278:4;44152:131;:::i;:::-;44144:139;;43871:419;;;:::o;44296:166::-;44436:18;44432:1;44424:6;44420:14;44413:42;44296:166;:::o;44468:366::-;44610:3;44631:67;44695:2;44690:3;44631:67;:::i;:::-;44624:74;;44707:93;44796:3;44707:93;:::i;:::-;44825:2;44820:3;44816:12;44809:19;;44468:366;;;:::o;44840:419::-;45006:4;45044:2;45033:9;45029:18;45021:26;;45093:9;45087:4;45083:20;45079:1;45068:9;45064:17;45057:47;45121:131;45247:4;45121:131;:::i;:::-;45113:139;;44840:419;;;:::o;45265:181::-;45405:33;45401:1;45393:6;45389:14;45382:57;45265:181;:::o;45452:366::-;45594:3;45615:67;45679:2;45674:3;45615:67;:::i;:::-;45608:74;;45691:93;45780:3;45691:93;:::i;:::-;45809:2;45804:3;45800:12;45793:19;;45452:366;;;:::o;45824:419::-;45990:4;46028:2;46017:9;46013:18;46005:26;;46077:9;46071:4;46067:20;46063:1;46052:9;46048:17;46041:47;46105:131;46231:4;46105:131;:::i;:::-;46097:139;;45824:419;;;:::o;46249:180::-;46389:32;46385:1;46377:6;46373:14;46366:56;46249:180;:::o;46435:366::-;46577:3;46598:67;46662:2;46657:3;46598:67;:::i;:::-;46591:74;;46674:93;46763:3;46674:93;:::i;:::-;46792:2;46787:3;46783:12;46776:19;;46435:366;;;:::o;46807:419::-;46973:4;47011:2;47000:9;46996:18;46988:26;;47060:9;47054:4;47050:20;47046:1;47035:9;47031:17;47024:47;47088:131;47214:4;47088:131;:::i;:::-;47080:139;;46807:419;;;:::o;47232:168::-;47372:20;47368:1;47360:6;47356:14;47349:44;47232:168;:::o;47406:366::-;47548:3;47569:67;47633:2;47628:3;47569:67;:::i;:::-;47562:74;;47645:93;47734:3;47645:93;:::i;:::-;47763:2;47758:3;47754:12;47747:19;;47406:366;;;:::o;47778:419::-;47944:4;47982:2;47971:9;47967:18;47959:26;;48031:9;48025:4;48021:20;48017:1;48006:9;48002:17;47995:47;48059:131;48185:4;48059:131;:::i;:::-;48051:139;;47778:419;;;:::o;48203:182::-;48343:34;48339:1;48331:6;48327:14;48320:58;48203:182;:::o;48391:366::-;48533:3;48554:67;48618:2;48613:3;48554:67;:::i;:::-;48547:74;;48630:93;48719:3;48630:93;:::i;:::-;48748:2;48743:3;48739:12;48732:19;;48391:366;;;:::o;48763:419::-;48929:4;48967:2;48956:9;48952:18;48944:26;;49016:9;49010:4;49006:20;49002:1;48991:9;48987:17;48980:47;49044:131;49170:4;49044:131;:::i;:::-;49036:139;;48763:419;;;:::o;49188:98::-;49239:6;49273:5;49267:12;49257:22;;49188:98;;;:::o;49292:168::-;49375:11;49409:6;49404:3;49397:19;49449:4;49444:3;49440:14;49425:29;;49292:168;;;;:::o;49466:373::-;49552:3;49580:38;49612:5;49580:38;:::i;:::-;49634:70;49697:6;49692:3;49634:70;:::i;:::-;49627:77;;49713:65;49771:6;49766:3;49759:4;49752:5;49748:16;49713:65;:::i;:::-;49803:29;49825:6;49803:29;:::i;:::-;49798:3;49794:39;49787:46;;49556:283;49466:373;;;;:::o;49845:640::-;50040:4;50078:3;50067:9;50063:19;50055:27;;50092:71;50160:1;50149:9;50145:17;50136:6;50092:71;:::i;:::-;50173:72;50241:2;50230:9;50226:18;50217:6;50173:72;:::i;:::-;50255;50323:2;50312:9;50308:18;50299:6;50255:72;:::i;:::-;50374:9;50368:4;50364:20;50359:2;50348:9;50344:18;50337:48;50402:76;50473:4;50464:6;50402:76;:::i;:::-;50394:84;;49845:640;;;;;;;:::o;50491:141::-;50547:5;50578:6;50572:13;50563:22;;50594:32;50620:5;50594:32;:::i;:::-;50491:141;;;;:::o;50638:349::-;50707:6;50756:2;50744:9;50735:7;50731:23;50727:32;50724:119;;;50762:79;;:::i;:::-;50724:119;50882:1;50907:63;50962:7;50953:6;50942:9;50938:22;50907:63;:::i;:::-;50897:73;;50853:127;50638:349;;;;:::o;50993:180::-;51041:77;51038:1;51031:88;51138:4;51135:1;51128:15;51162:4;51159:1;51152:15;51179:233;51218:3;51241:24;51259:5;51241:24;:::i;:::-;51232:33;;51287:66;51280:5;51277:77;51274:103;;51357:18;;:::i;:::-;51274:103;51404:1;51397:5;51393:13;51386:20;;51179:233;;;:::o;51418:170::-;51558:22;51554:1;51546:6;51542:14;51535:46;51418:170;:::o;51594:366::-;51736:3;51757:67;51821:2;51816:3;51757:67;:::i;:::-;51750:74;;51833:93;51922:3;51833:93;:::i;:::-;51951:2;51946:3;51942:12;51935:19;;51594:366;;;:::o;51966:419::-;52132:4;52170:2;52159:9;52155:18;52147:26;;52219:9;52213:4;52209:20;52205:1;52194:9;52190:17;52183:47;52247:131;52373:4;52247:131;:::i;:::-;52239:139;;51966:419;;;:::o

Swarm Source

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