ETH Price: $2,604.18 (-2.75%)
Gas: 1 Gwei

Token

Prime Aeternas - The Invitation (PAI)
 

Overview

Max Total Supply

296 PAI

Holders

155

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
cybertokyo.eth
Balance
2 PAI
0x6f2bbbdf4e93aa39d36933d28ac2b1253a17aa85
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:
PrimeAeternas

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
/*

      ____  ____  ____  __  __  ____      __    ____  ____  ____  ____  _  _    __    ___ 
     (  _ \(  _ \(_  _)(  \/  )( ___)    /__\  ( ___)(_  _)( ___)(  _ \( \( )  /__\  / __)
      )___/ )   / _)(_  )    (  )__)    /(__)\  )__)   )(   )__)  )   / )  (  /(__)\ \__ \
     (__)  (_)\_)(____)(_/\/\_)(____)  (__)(__)(____) (__) (____)(_)\_)(_)\_)(__)(__)(___/

*/

// File: @openzeppelin/contracts/utils/Strings.sol
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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


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

pragma solidity ^0.8.0;

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

    /**
     * @dev 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++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: erc721a/contracts/IERC721A.sol


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

pragma solidity ^0.8.4;

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

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

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

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

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

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: erc721a/contracts/ERC721A.sol


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

pragma solidity ^0.8.4;


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

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

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

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

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

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

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

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant BITMASK_BURNED = 1 << 224;
    
    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITPOS_NEXT_INITIALIZED = 225;

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes of the XOR of
        // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165
        // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

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

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

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

    /**
     * Returns the auxillary 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 auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        assembly { // Cast aux without masking.
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

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

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP);
        ownership.burned = packed & BITMASK_BURNED != 0;
    }

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

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

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

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

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

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

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

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

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

    /**
     * @dev Casts the address to uint256 without masking.
     */
    function _addressToUint256(address value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev Casts the boolean to uint256 without branching.
     */
    function _boolToUint256(bool value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

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

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

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

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _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] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

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

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

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _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] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

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

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // 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] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_NEXT_INITIALIZED;

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // 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] =
                _addressToUint256(from) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_BURNED | 
                BITMASK_NEXT_INITIALIZED;

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

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

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

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

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

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

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function _toString(uint256 value) internal pure returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), 
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length, 
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

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

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

// File: contracts/primeAeternas.sol
pragma solidity >=0.8.9 <0.9.0;
contract PrimeAeternas is ERC721A, Ownable, ReentrancyGuard {
  using Strings for uint256;

  string public baseURI = "ipfs:///";
  string public hiddenMetadataUri;
  uint256 public maxAeternas = 8000;
  uint256 public teamReserve = 800; 
  uint256 public Max_Aeternas_WhitelistSale = 3;
  uint256 public Max_Aeternas_Team = 5;
  uint256 public Max_Aeternas_PublicSale = 1;
  uint256 public FreeMintCost = 0 ether;
  uint256 public AdditionalMintCost = 0.05 ether;
  uint256 public Max_Aeternas_Per_Transaction = 5;
  bool public paused = false;
  bool public revealed = false;
  bool public isPublicSaleActive = false;
  bool public isWhitelistSaleActive = true;
  bool public isTeamMintActive = false;
  bytes32 public WhitelististRootHash = 0xf846af13778cf1acb2d623f3052f2e97be7f602048f2f4a86394ab060fc3763b;
  bytes32 public TeamRootHash = 0x4c58c4bf0e2b511a28eae71079505887c0ab264c55be69f369ccb1cf4a5b7be9;
  mapping(address => uint256) public mintedByWalletWhitelist;
  mapping(address => uint256) public mintedByWalletTeam;
  mapping(address => uint256) public mintedByWalletPublic;

  modifier publicSaleActive() {
    require(isPublicSaleActive, "Public sale is not open");
    _;
  }

  modifier whitelistSaleActive() {
    require(isWhitelistSaleActive, "Whitelist sale is not open");
    _;
  }

  modifier teamMintActive() {
    require(isTeamMintActive, "Team Mint is not open");
    _;
  }

  modifier salePaused() {
    require(!paused, "Sale is paused");
    _;
  }

  modifier maxAeternasWhitelist(uint256 numberOfTokens) {
    require(
        numberOfTokens + mintedByWalletWhitelist[msg.sender] <= Max_Aeternas_WhitelistSale,
        "Address already claimed their NFTs"
    );
    _;
  }

  modifier maxAeternasPublicSale(uint256 numberOfTokens) {
    
    require(
        numberOfTokens + mintedByWalletPublic[msg.sender] <= Max_Aeternas_PublicSale,
        "Address already claimed their NFTs"
    );
    _;
  }

  modifier maxAeternasTeam(uint256 numberOfTokens) {
    
    require(
        numberOfTokens + mintedByWalletTeam[msg.sender] <= Max_Aeternas_Team,
        "Address already claimed their NFTs"
    );
    _;
  }

  modifier canMintAeternas(uint256 numberOfTokens) {
    require(
      totalSupply() + numberOfTokens <= maxAeternas - teamReserve,
      "Not enough Aeternas remaining to mint"
    );
    require(
      numberOfTokens > 0 && numberOfTokens <= Max_Aeternas_Per_Transaction, "Invalid mint amount!"
    );
    _;
  }

  modifier canTeamMintAeternas(uint256 numberOfTokens) {
    require(
      totalSupply() + numberOfTokens <= maxAeternas,
      "Not enough Aeternas remaining to mint"
    );
    require(
      numberOfTokens > 0 && numberOfTokens <= Max_Aeternas_Per_Transaction, "Invalid mint amount!"
    );
    _;
  }

  modifier isCorrectPayment(uint256 price, uint256 numberOfTokens) {
    require(
      msg.value >= price * numberOfTokens,
      "Insufficient Funds!!!"
    );
    _;
  }

  modifier isValidMerkleProof(bytes32[] calldata merkleProof, bytes32 root) {
    require(
      MerkleProof.verify(
        merkleProof,
        root,
        keccak256(abi.encodePacked(msg.sender))
      ), "Your address is not whitelisted"
    );
    _;
  }

  constructor() ERC721A("Prime Aeternas - The Invitation", "PAI") {
    setHiddenMetadataUri("ipfs://QmY2ksX2HyA6XdnrqDWM36pBwmFK67kkEEpbmWcP7m1L8A/hidden.json");
  }

  function freePublicMint(uint256 numberOfTokens)
    external
    payable
    nonReentrant
    salePaused
    publicSaleActive
    canMintAeternas(numberOfTokens)
    maxAeternasPublicSale(numberOfTokens)
    isCorrectPayment(FreeMintCost, numberOfTokens)
    {
      mintedByWalletPublic[msg.sender] += numberOfTokens;
      _safeMint(msg.sender, numberOfTokens); 
    }

  function paidPublicMint(uint256 numberOfTokens)
    external
    payable
    nonReentrant
    salePaused
    publicSaleActive
    canMintAeternas(numberOfTokens)
    isCorrectPayment(AdditionalMintCost, numberOfTokens)
    {
      _safeMint(msg.sender, numberOfTokens); 
    }

  function whitelistMint(uint numberOfTokens, bytes32[] calldata merkleProof) 
    external
    payable
    nonReentrant
    salePaused
    whitelistSaleActive
    canMintAeternas(numberOfTokens)
    maxAeternasWhitelist(numberOfTokens)
    isValidMerkleProof(merkleProof, WhitelististRootHash)
    isCorrectPayment(FreeMintCost, numberOfTokens)
    {
      mintedByWalletWhitelist[msg.sender] += numberOfTokens;
      _safeMint(msg.sender, numberOfTokens);
    }

  function teamMint(uint numberOfTokens, bytes32[] calldata merkleProof) 
    external
    payable
    nonReentrant
    salePaused
    teamMintActive
    canTeamMintAeternas(numberOfTokens)
    maxAeternasTeam(numberOfTokens)
    isValidMerkleProof(merkleProof, TeamRootHash)
    isCorrectPayment(FreeMintCost, numberOfTokens)
    {
      mintedByWalletTeam[msg.sender] += numberOfTokens;
      _safeMint(msg.sender, numberOfTokens);
    }

  // Owner quota for the team and giveaways
  function ownerMint(uint256 numberOfTokens, address _receiver)
    public
    nonReentrant
    onlyOwner
    canTeamMintAeternas(numberOfTokens)
    {
      _safeMint(_receiver, numberOfTokens);
    }
  // function getBaseURI() external view returns (string memory) {
  //   return baseURI;
  // }

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


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

  function setWhitelistRootHash(bytes32 _Root) external onlyOwner {
    WhitelististRootHash = _Root;
  }

  function setTeamRootHash(bytes32 _Root) external onlyOwner {
    TeamRootHash = _Root;
  }

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

  function openWhitelistSale() external onlyOwner {
    isWhitelistSaleActive = true;
    isPublicSaleActive = false;
    isTeamMintActive = false;
  }

  function openPublicSale() external onlyOwner {
    isWhitelistSaleActive = false;
    isPublicSaleActive = true;
    isTeamMintActive = false;
  }

  function openTeamMint() external onlyOwner {
    isWhitelistSaleActive = false;
    isPublicSaleActive = false;
    isTeamMintActive = true;
  }  

  function walletOfOwner(address _owner)
    public
    view
    returns (uint256[] memory)
  {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
    uint256 currentTokenId = 1;
    uint256 ownedTokenIndex = 0;

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

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

        ownedTokenIndex++;
      }

      currentTokenId++;
    }

    return ownedTokenIds;
  } 

  function _startTokenId() internal view virtual override returns (uint256) {
    return 1;
  }

  function tokenURI(uint256 _tokenId) public view virtual override returns (string memory){
    require(_exists(_tokenId), 'ERC721Metadata: URI query for nonexistent token');

    if (revealed == false) {
      return hiddenMetadataUri;
    }
    
    // string memory currentBaseURI = _baseURI();
    
    return bytes(baseURI).length > 0
        ? string(abi.encodePacked(baseURI, _tokenId.toString(), ".json"))
        : '';
  }

  function setAdditionalCost(uint256 _cost) external onlyOwner {
    AdditionalMintCost = _cost;
  }

  function setMaxAeternasPerTx(uint256 _maxAeternasPerTx) external onlyOwner {
    Max_Aeternas_Per_Transaction = _maxAeternasPerTx;
  }

  function setWalletLimitForWhitelist(uint256 _walletLimit) external onlyOwner {
    Max_Aeternas_WhitelistSale = _walletLimit;
  }

  function setWalletLimitForPublic(uint256 _walletLimit) external onlyOwner {
    Max_Aeternas_PublicSale = _walletLimit;
  }

  function setWalletLimitForTeam(uint256 _walletLimit) external onlyOwner {
    Max_Aeternas_Team = _walletLimit;
  }

  function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner {
    hiddenMetadataUri = _hiddenMetadataUri;
  }

  function setMaxAeternas(uint256 _maxAeternas) external onlyOwner {
      maxAeternas = _maxAeternas;
  }

  function setTeamReserve(uint256 _teamReserve) external onlyOwner {
      teamReserve = _teamReserve;
  }

  function withdraw() public onlyOwner {    
    (bool os, ) = payable(owner()).call{value: address(this).balance}("");
    require(os);    
  }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"AdditionalMintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FreeMintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Max_Aeternas_Per_Transaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Max_Aeternas_PublicSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Max_Aeternas_Team","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Max_Aeternas_WhitelistSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TeamRootHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WhitelististRootHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"freePublicMint","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":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTeamMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWhitelistSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxAeternas","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedByWalletPublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedByWalletTeam","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedByWalletWhitelist","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":"openPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"openTeamMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"openWhitelistSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"paidPublicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setAdditionalCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxAeternas","type":"uint256"}],"name":"setMaxAeternas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxAeternasPerTx","type":"uint256"}],"name":"setMaxAeternasPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_teamReserve","type":"uint256"}],"name":"setTeamReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_Root","type":"bytes32"}],"name":"setTeamRootHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_walletLimit","type":"uint256"}],"name":"setWalletLimitForPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_walletLimit","type":"uint256"}],"name":"setWalletLimitForTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_walletLimit","type":"uint256"}],"name":"setWalletLimitForWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_Root","type":"bytes32"}],"name":"setWhitelistRootHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"teamMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"teamReserve","outputs":[{"internalType":"uint256","name":"","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":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c06040526008608090815267697066733a2f2f2f60c01b60a052600a90620000299082620002e3565b50611f40600c55610320600d556003600e556005600f8190556001601055600060115566b1a2bc2ec500006012556013556014805464ffffffffff191663010000001790557ff846af13778cf1acb2d623f3052f2e97be7f602048f2f4a86394ab060fc3763b6015557f4c58c4bf0e2b511a28eae71079505887c0ab264c55be69f369ccb1cf4a5b7be9601655348015620000c357600080fd5b506040518060400160405280601f81526020017f5072696d652041657465726e6173202d2054686520496e7669746174696f6e008152506040518060400160405280600381526020016250414960e81b8152508160029081620001279190620002e3565b506003620001368282620002e3565b505060016000555062000149336200017b565b6001600981905550620001756040518060800160405280604181526020016200319260419139620001cd565b620003af565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6008546001600160a01b031633146200022c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b600b6200023a8282620002e3565b5050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200026957607f821691505b6020821081036200028a57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002de57600081815260208120601f850160051c81016020861015620002b95750805b601f850160051c820191505b81811015620002da57828155600101620002c5565b5050505b505050565b81516001600160401b03811115620002ff57620002ff6200023e565b620003178162000310845462000254565b8462000290565b602080601f8311600181146200034f5760008415620003365750858301515b600019600386901b1c1916600185901b178555620002da565b600085815260208120601f198616915b8281101562000380578886015182559484019460019091019084016200035f565b50858210156200039f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612dd380620003bf6000396000f3fe6080604052600436106103975760003560e01c80636c0360eb116101dc578063b0dd665b11610102578063d2a87a00116100a0578063e985e9c51161006f578063e985e9c514610a0b578063f2fde38b14610a2b578063fb3fb58514610a4b578063fb4f45fa14610a7857600080fd5b8063d2a87a0014610996578063d2cab056146109b8578063d52c57e0146109cb578063e0a80853146109eb57600080fd5b8063b88d4fde116100dc578063b88d4fde14610908578063b98451cf14610928578063c2ff0be714610949578063c87b56dd1461097657600080fd5b8063b0dd665b146108ca578063b0ee9f76146108e0578063b585209b146108f357600080fd5b80638da5cb5b1161017a578063a22cb46511610149578063a22cb46514610860578063a45ba8e714610880578063ac1ccbf114610895578063af630c34146108b557600080fd5b80638da5cb5b146107f75780638e4c419c1461081557806394b694551461082b57806395d89b411461084b57600080fd5b806370a08231116101b657806370a0823114610782578063715018a6146107a25780637e58e86b146107b75780638afb8d28146107d757600080fd5b80636c0360eb146107205780636c6f556d1461073557806370422cfe1461076257600080fd5b80633ccfd60b116102c157806349711bf91161025f57806355f804b31161022e57806355f804b3146106b35780635c975abb146106d357806362abf9c9146106ed5780636352211e1461070057600080fd5b806349711bf91461063e5780634fdd43cb146106545780635183022714610674578063559b55561461069357600080fd5b80634287f14a1161029b5780634287f14a146105cf578063438b6300146105e55780634910cf72146106125780634951ac921461062857600080fd5b80633ccfd60b146105845780633e5c15fb1461059957806342842e0e146105af57600080fd5b806318160ddd116103395780632ae96638116103085780632ae966381461051b5780632d6ef98a1461052e578063367998df146105445780633a37fa241461056457600080fd5b806318160ddd146104a65780631e84c413146104bb57806323b872dd146104db57806325034099146104fb57600080fd5b806307141a4c1161037557806307141a4c14610417578063081812fc1461042e578063095ea7b31461046657806316c38b3c1461048657600080fd5b806301b0749e1461039c57806301ffc9a7146103c557806306fdde03146103f5575b600080fd5b3480156103a857600080fd5b506103b2600f5481565b6040519081526020015b60405180910390f35b3480156103d157600080fd5b506103e56103e036600461252f565b610a8e565b60405190151581526020016103bc565b34801561040157600080fd5b5061040a610ae0565b6040516103bc919061259c565b34801561042357600080fd5b5061042c610b72565b005b34801561043a57600080fd5b5061044e6104493660046125af565b610bbc565b6040516001600160a01b0390911681526020016103bc565b34801561047257600080fd5b5061042c6104813660046125e4565b610c00565b34801561049257600080fd5b5061042c6104a136600461261e565b610cd2565b3480156104b257600080fd5b506103b2610d0f565b3480156104c757600080fd5b506014546103e59062010000900460ff1681565b3480156104e757600080fd5b5061042c6104f6366004612639565b610d1d565b34801561050757600080fd5b5061042c6105163660046125af565b610d2d565b61042c6105293660046125af565b610d5c565b34801561053a57600080fd5b506103b260135481565b34801561055057600080fd5b5061042c61055f3660046125af565b610eaa565b34801561057057600080fd5b5061042c61057f3660046125af565b610ed9565b34801561059057600080fd5b5061042c610f08565b3480156105a557600080fd5b506103b260115481565b3480156105bb57600080fd5b5061042c6105ca366004612639565b610fa6565b3480156105db57600080fd5b506103b2600d5481565b3480156105f157600080fd5b50610605610600366004612675565b610fc1565b6040516103bc9190612690565b34801561061e57600080fd5b506103b260105481565b34801561063457600080fd5b506103b2600c5481565b34801561064a57600080fd5b506103b260125481565b34801561066057600080fd5b5061042c61066f366004612760565b6110a1565b34801561068057600080fd5b506014546103e590610100900460ff1681565b34801561069f57600080fd5b5061042c6106ae3660046125af565b6110db565b3480156106bf57600080fd5b5061042c6106ce366004612760565b61110a565b3480156106df57600080fd5b506014546103e59060ff1681565b61042c6106fb3660046125af565b611140565b34801561070c57600080fd5b5061044e61071b3660046125af565b6112f2565b34801561072c57600080fd5b5061040a6112fd565b34801561074157600080fd5b506103b2610750366004612675565b60186020526000908152604090205481565b34801561076e57600080fd5b5061042c61077d3660046125af565b61138b565b34801561078e57600080fd5b506103b261079d366004612675565b6113ba565b3480156107ae57600080fd5b5061042c611409565b3480156107c357600080fd5b5061042c6107d23660046125af565b61143f565b3480156107e357600080fd5b5061042c6107f23660046125af565b61146e565b34801561080357600080fd5b506008546001600160a01b031661044e565b34801561082157600080fd5b506103b260165481565b34801561083757600080fd5b5061042c6108463660046125af565b61149d565b34801561085757600080fd5b5061040a6114cc565b34801561086c57600080fd5b5061042c61087b3660046127a9565b6114db565b34801561088c57600080fd5b5061040a611570565b3480156108a157600080fd5b5061042c6108b03660046125af565b61157d565b3480156108c157600080fd5b5061042c6115ac565b3480156108d657600080fd5b506103b2600e5481565b61042c6108ee3660046127dc565b6115ec565b3480156108ff57600080fd5b5061042c61185a565b34801561091457600080fd5b5061042c61092336600461285b565b611899565b34801561093457600080fd5b506014546103e5906301000000900460ff1681565b34801561095557600080fd5b506103b2610964366004612675565b60196020526000908152604090205481565b34801561098257600080fd5b5061040a6109913660046125af565b6118e3565b3480156109a257600080fd5b506014546103e590640100000000900460ff1681565b61042c6109c63660046127dc565b611a54565b3480156109d757600080fd5b5061042c6109e63660046128d7565b611c9e565b3480156109f757600080fd5b5061042c610a0636600461261e565b611d66565b348015610a1757600080fd5b506103e5610a263660046128fa565b611daa565b348015610a3757600080fd5b5061042c610a46366004612675565b611dd8565b348015610a5757600080fd5b506103b2610a66366004612675565b60176020526000908152604090205481565b348015610a8457600080fd5b506103b260155481565b60006301ffc9a760e01b6001600160e01b031983161480610abf57506380ac58cd60e01b6001600160e01b03198316145b80610ada5750635b5e139f60e01b6001600160e01b03198316145b92915050565b606060028054610aef90612924565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1b90612924565b8015610b685780601f10610b3d57610100808354040283529160200191610b68565b820191906000526020600020905b815481529060010190602001808311610b4b57829003601f168201915b5050505050905090565b6008546001600160a01b03163314610ba55760405162461bcd60e51b8152600401610b9c9061295e565b60405180910390fd5b6014805464ffffff00001916640100000000179055565b6000610bc782611e70565b610be4576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610c0b82611ea5565b9050806001600160a01b0316836001600160a01b031603610c3f5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610c7657610c598133611daa565b610c76576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b03163314610cfc5760405162461bcd60e51b8152600401610b9c9061295e565b6014805460ff1916911515919091179055565b600154600054036000190190565b610d28838383611f1b565b505050565b6008546001600160a01b03163314610d575760405162461bcd60e51b8152600401610b9c9061295e565b600f55565b600260095403610d7e5760405162461bcd60e51b8152600401610b9c90612993565b600260095560145460ff1615610da65760405162461bcd60e51b8152600401610b9c906129ca565b60145462010000900460ff16610df85760405162461bcd60e51b8152602060048201526017602482015276283ab13634b19039b0b6329034b9903737ba1037b832b760491b6044820152606401610b9c565b80600d54600c54610e099190612a08565b81610e12610d0f565b610e1c9190612a1b565b1115610e3a5760405162461bcd60e51b8152600401610b9c90612a2e565b600081118015610e4c57506013548111155b610e685760405162461bcd60e51b8152600401610b9c90612a73565b60125482610e768183612aa1565b341015610e955760405162461bcd60e51b8152600401610b9c90612ac0565b610e9f33856120c2565b505060016009555050565b6008546001600160a01b03163314610ed45760405162461bcd60e51b8152600401610b9c9061295e565b601555565b6008546001600160a01b03163314610f035760405162461bcd60e51b8152600401610b9c9061295e565b600d55565b6008546001600160a01b03163314610f325760405162461bcd60e51b8152600401610b9c9061295e565b6000610f466008546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610f90576040519150601f19603f3d011682016040523d82523d6000602084013e610f95565b606091505b5050905080610fa357600080fd5b50565b610d2883838360405180602001604052806000815250611899565b60606000610fce836113ba565b905060008167ffffffffffffffff811115610feb57610feb6126d4565b604051908082528060200260200182016040528015611014578160200160208202803683370190505b509050600160005b838110801561102d5750600c548211155b1561109757600061103d836112f2565b9050866001600160a01b0316816001600160a01b031603611084578284838151811061106b5761106b612aef565b60209081029190910101528161108081612b05565b9250505b8261108e81612b05565b9350505061101c565b5090949350505050565b6008546001600160a01b031633146110cb5760405162461bcd60e51b8152600401610b9c9061295e565b600b6110d78282612b6c565b5050565b6008546001600160a01b031633146111055760405162461bcd60e51b8152600401610b9c9061295e565b600c55565b6008546001600160a01b031633146111345760405162461bcd60e51b8152600401610b9c9061295e565b600a6110d78282612b6c565b6002600954036111625760405162461bcd60e51b8152600401610b9c90612993565b600260095560145460ff161561118a5760405162461bcd60e51b8152600401610b9c906129ca565b60145462010000900460ff166111dc5760405162461bcd60e51b8152602060048201526017602482015276283ab13634b19039b0b6329034b9903737ba1037b832b760491b6044820152606401610b9c565b80600d54600c546111ed9190612a08565b816111f6610d0f565b6112009190612a1b565b111561121e5760405162461bcd60e51b8152600401610b9c90612a2e565b60008111801561123057506013548111155b61124c5760405162461bcd60e51b8152600401610b9c90612a73565b6010543360009081526019602052604090205483919061126c9083612a1b565b111561128a5760405162461bcd60e51b8152600401610b9c90612c2c565b601154836112988183612aa1565b3410156112b75760405162461bcd60e51b8152600401610b9c90612ac0565b33600090815260196020526040812080548792906112d6908490612a1b565b909155506112e6905033866120c2565b50506001600955505050565b6000610ada82611ea5565b600a805461130a90612924565b80601f016020809104026020016040519081016040528092919081815260200182805461133690612924565b80156113835780601f1061135857610100808354040283529160200191611383565b820191906000526020600020905b81548152906001019060200180831161136657829003601f168201915b505050505081565b6008546001600160a01b031633146113b55760405162461bcd60e51b8152600401610b9c9061295e565b601055565b60006001600160a01b0382166113e3576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b031633146114335760405162461bcd60e51b8152600401610b9c9061295e565b61143d60006120dc565b565b6008546001600160a01b031633146114695760405162461bcd60e51b8152600401610b9c9061295e565b600e55565b6008546001600160a01b031633146114985760405162461bcd60e51b8152600401610b9c9061295e565b601355565b6008546001600160a01b031633146114c75760405162461bcd60e51b8152600401610b9c9061295e565b601655565b606060038054610aef90612924565b336001600160a01b038316036115045760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600b805461130a90612924565b6008546001600160a01b031633146115a75760405162461bcd60e51b8152600401610b9c9061295e565b601255565b6008546001600160a01b031633146115d65760405162461bcd60e51b8152600401610b9c9061295e565b6014805464ffffff000019166301000000179055565b60026009540361160e5760405162461bcd60e51b8152600401610b9c90612993565b600260095560145460ff16156116365760405162461bcd60e51b8152600401610b9c906129ca565b601454640100000000900460ff166116885760405162461bcd60e51b81526020600482015260156024820152742a32b0b69026b4b73a1034b9903737ba1037b832b760591b6044820152606401610b9c565b82600c5481611695610d0f565b61169f9190612a1b565b11156116bd5760405162461bcd60e51b8152600401610b9c90612a2e565b6000811180156116cf57506013548111155b6116eb5760405162461bcd60e51b8152600401610b9c90612a73565b600f543360009081526018602052604090205485919061170b9083612a1b565b11156117295760405162461bcd60e51b8152600401610b9c90612c2c565b83836016546117a1838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040516bffffffffffffffffffffffff193360601b16602082015285925060340190505b6040516020818303038152906040528051906020012061212e565b6117ed5760405162461bcd60e51b815260206004820152601f60248201527f596f75722061646472657373206973206e6f742077686974656c6973746564006044820152606401610b9c565b601154886117fb8183612aa1565b34101561181a5760405162461bcd60e51b8152600401610b9c90612ac0565b33600090815260186020526040812080548c9290611839908490612a1b565b909155506118499050338b6120c2565b505060016009555050505050505050565b6008546001600160a01b031633146118845760405162461bcd60e51b8152600401610b9c9061295e565b6014805464ffffff0000191662010000179055565b6118a4848484611f1b565b6001600160a01b0383163b156118dd576118c084848484612144565b6118dd576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b60606118ee82611e70565b6119525760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b9c565b601454610100900460ff1615156000036119f857600b805461197390612924565b80601f016020809104026020016040519081016040528092919081815260200182805461199f90612924565b80156119ec5780601f106119c1576101008083540402835291602001916119ec565b820191906000526020600020905b8154815290600101906020018083116119cf57829003601f168201915b50505050509050919050565b6000600a8054611a0790612924565b905011611a235760405180602001604052806000815250610ada565b600a611a2e83612230565b604051602001611a3f929190612c6e565b60405160208183030381529060405292915050565b600260095403611a765760405162461bcd60e51b8152600401610b9c90612993565b600260095560145460ff1615611a9e5760405162461bcd60e51b8152600401610b9c906129ca565b6014546301000000900460ff16611af75760405162461bcd60e51b815260206004820152601a60248201527f57686974656c6973742073616c65206973206e6f74206f70656e0000000000006044820152606401610b9c565b82600d54600c54611b089190612a08565b81611b11610d0f565b611b1b9190612a1b565b1115611b395760405162461bcd60e51b8152600401610b9c90612a2e565b600081118015611b4b57506013548111155b611b675760405162461bcd60e51b8152600401610b9c90612a73565b600e5433600090815260176020526040902054859190611b879083612a1b565b1115611ba55760405162461bcd60e51b8152600401610b9c90612c2c565b8383601554611c06838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040516bffffffffffffffffffffffff193360601b1660208201528592506034019050611786565b611c525760405162461bcd60e51b815260206004820152601f60248201527f596f75722061646472657373206973206e6f742077686974656c6973746564006044820152606401610b9c565b60115488611c608183612aa1565b341015611c7f5760405162461bcd60e51b8152600401610b9c90612ac0565b33600090815260176020526040812080548c9290611839908490612a1b565b600260095403611cc05760405162461bcd60e51b8152600401610b9c90612993565b60026009556008546001600160a01b03163314611cef5760405162461bcd60e51b8152600401610b9c9061295e565b81600c5481611cfc610d0f565b611d069190612a1b565b1115611d245760405162461bcd60e51b8152600401610b9c90612a2e565b600081118015611d3657506013548111155b611d525760405162461bcd60e51b8152600401610b9c90612a73565b611d5c82846120c2565b5050600160095550565b6008546001600160a01b03163314611d905760405162461bcd60e51b8152600401610b9c9061295e565b601480549115156101000261ff0019909216919091179055565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b6008546001600160a01b03163314611e025760405162461bcd60e51b8152600401610b9c9061295e565b6001600160a01b038116611e675760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b9c565b610fa3816120dc565b600081600111158015611e84575060005482105b8015610ada575050600090815260046020526040902054600160e01b161590565b60008180600111611f0257600054811015611f025760008181526004602052604081205490600160e01b82169003611f00575b80600003611ef9575060001901600081815260046020526040902054611ed8565b9392505050565b505b604051636f96cda160e11b815260040160405180910390fd5b6000611f2682611ea5565b9050836001600160a01b0316816001600160a01b031614611f595760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611f775750611f778533611daa565b80611f92575033611f8784610bbc565b6001600160a01b0316145b905080611fb257604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416611fd957604051633a954ecd60e21b815260040160405180910390fd5b600083815260066020908152604080832080546001600160a01b03191690556001600160a01b038881168452600583528184208054600019019055871683528083208054600101905585835260049091528120600160e11b4260a01b871781179091558316900361207a576001830160008181526004602052604081205490036120785760005481146120785760008181526004602052604090208390555b505b82846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b6110d7828260405180602001604052806000815250612331565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008261213b85846124a5565b14949350505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612179903390899088908890600401612d05565b6020604051808303816000875af19250505080156121b4575060408051601f3d908101601f191682019092526121b191810190612d42565b60015b612212573d8080156121e2576040519150601f19603f3d011682016040523d82523d6000602084013e6121e7565b606091505b50805160000361220a576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060816000036122575750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612281578061226b81612b05565b915061227a9050600a83612d75565b915061225b565b60008167ffffffffffffffff81111561229c5761229c6126d4565b6040519080825280601f01601f1916602001820160405280156122c6576020820181803683370190505b5090505b8415612228576122db600183612a08565b91506122e8600a86612d89565b6122f3906030612a1b565b60f81b81838151811061230857612308612aef565b60200101906001600160f81b031916908160001a90535061232a600a86612d75565b94506122ca565b6000546001600160a01b03841661235a57604051622e076360e81b815260040160405180910390fd5b8260000361237b5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03841660008181526005602090815260408083208054680100000000000000018902019055848352600490915290204260a01b86176001861460e11b1790558190818501903b15612450575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46124196000878480600101955087612144565b612436576040516368d2bf6b60e11b815260040160405180910390fd5b8082106123ce57826000541461244b57600080fd5b612495565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210612451575b5060009081556118dd9085838684565b600081815b84518110156125115760008582815181106124c7576124c7612aef565b602002602001015190508083116124ed57600083815260208290526040902092506124fe565b600081815260208490526040902092505b508061250981612b05565b9150506124aa565b509392505050565b6001600160e01b031981168114610fa357600080fd5b60006020828403121561254157600080fd5b8135611ef981612519565b60005b8381101561256757818101518382015260200161254f565b50506000910152565b6000815180845261258881602086016020860161254c565b601f01601f19169290920160200192915050565b602081526000611ef96020830184612570565b6000602082840312156125c157600080fd5b5035919050565b80356001600160a01b03811681146125df57600080fd5b919050565b600080604083850312156125f757600080fd5b612600836125c8565b946020939093013593505050565b803580151581146125df57600080fd5b60006020828403121561263057600080fd5b611ef98261260e565b60008060006060848603121561264e57600080fd5b612657846125c8565b9250612665602085016125c8565b9150604084013590509250925092565b60006020828403121561268757600080fd5b611ef9826125c8565b6020808252825182820181905260009190848201906040850190845b818110156126c8578351835292840192918401916001016126ac565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612705576127056126d4565b604051601f8501601f19908116603f0116810190828211818310171561272d5761272d6126d4565b8160405280935085815286868601111561274657600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561277257600080fd5b813567ffffffffffffffff81111561278957600080fd5b8201601f8101841361279a57600080fd5b612228848235602084016126ea565b600080604083850312156127bc57600080fd5b6127c5836125c8565b91506127d36020840161260e565b90509250929050565b6000806000604084860312156127f157600080fd5b83359250602084013567ffffffffffffffff8082111561281057600080fd5b818601915086601f83011261282457600080fd5b81358181111561283357600080fd5b8760208260051b850101111561284857600080fd5b6020830194508093505050509250925092565b6000806000806080858703121561287157600080fd5b61287a856125c8565b9350612888602086016125c8565b925060408501359150606085013567ffffffffffffffff8111156128ab57600080fd5b8501601f810187136128bc57600080fd5b6128cb878235602084016126ea565b91505092959194509250565b600080604083850312156128ea57600080fd5b823591506127d3602084016125c8565b6000806040838503121561290d57600080fd5b612916836125c8565b91506127d3602084016125c8565b600181811c9082168061293857607f821691505b60208210810361295857634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252600e908201526d14d85b19481a5cc81c185d5cd95960921b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b81810381811115610ada57610ada6129f2565b80820180821115610ada57610ada6129f2565b60208082526025908201527f4e6f7420656e6f7567682041657465726e61732072656d61696e696e6720746f604082015264081b5a5b9d60da1b606082015260800190565b602080825260149082015273496e76616c6964206d696e7420616d6f756e742160601b604082015260600190565b6000816000190483118215151615612abb57612abb6129f2565b500290565b602080825260159082015274496e73756666696369656e742046756e647321212160581b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b600060018201612b1757612b176129f2565b5060010190565b601f821115610d2857600081815260208120601f850160051c81016020861015612b455750805b601f850160051c820191505b81811015612b6457828155600101612b51565b505050505050565b815167ffffffffffffffff811115612b8657612b866126d4565b612b9a81612b948454612924565b84612b1e565b602080601f831160018114612bcf5760008415612bb75750858301515b600019600386901b1c1916600185901b178555612b64565b600085815260208120601f198616915b82811015612bfe57888601518255948401946001909101908401612bdf565b5085821015612c1c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60208082526022908201527f4164647265737320616c726561647920636c61696d6564207468656972204e46604082015261547360f01b606082015260800190565b6000808454612c7c81612924565b60018281168015612c945760018114612ca957612cd8565b60ff1984168752821515830287019450612cd8565b8860005260208060002060005b85811015612ccf5781548a820152908401908201612cb6565b50505082870194505b505050508351612cec81836020880161254c565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612d3890830184612570565b9695505050505050565b600060208284031215612d5457600080fd5b8151611ef981612519565b634e487b7160e01b600052601260045260246000fd5b600082612d8457612d84612d5f565b500490565b600082612d9857612d98612d5f565b50069056fea26469706673582212209910a8e191fa1257106f722891c238709c8746fc028ccaf9dc02159a8ea6a6b664736f6c63430008100033697066733a2f2f516d59326b7358324879413658646e727144574d33367042776d464b36376b6b454570626d576350376d314c38412f68696464656e2e6a736f6e

Deployed Bytecode

0x6080604052600436106103975760003560e01c80636c0360eb116101dc578063b0dd665b11610102578063d2a87a00116100a0578063e985e9c51161006f578063e985e9c514610a0b578063f2fde38b14610a2b578063fb3fb58514610a4b578063fb4f45fa14610a7857600080fd5b8063d2a87a0014610996578063d2cab056146109b8578063d52c57e0146109cb578063e0a80853146109eb57600080fd5b8063b88d4fde116100dc578063b88d4fde14610908578063b98451cf14610928578063c2ff0be714610949578063c87b56dd1461097657600080fd5b8063b0dd665b146108ca578063b0ee9f76146108e0578063b585209b146108f357600080fd5b80638da5cb5b1161017a578063a22cb46511610149578063a22cb46514610860578063a45ba8e714610880578063ac1ccbf114610895578063af630c34146108b557600080fd5b80638da5cb5b146107f75780638e4c419c1461081557806394b694551461082b57806395d89b411461084b57600080fd5b806370a08231116101b657806370a0823114610782578063715018a6146107a25780637e58e86b146107b75780638afb8d28146107d757600080fd5b80636c0360eb146107205780636c6f556d1461073557806370422cfe1461076257600080fd5b80633ccfd60b116102c157806349711bf91161025f57806355f804b31161022e57806355f804b3146106b35780635c975abb146106d357806362abf9c9146106ed5780636352211e1461070057600080fd5b806349711bf91461063e5780634fdd43cb146106545780635183022714610674578063559b55561461069357600080fd5b80634287f14a1161029b5780634287f14a146105cf578063438b6300146105e55780634910cf72146106125780634951ac921461062857600080fd5b80633ccfd60b146105845780633e5c15fb1461059957806342842e0e146105af57600080fd5b806318160ddd116103395780632ae96638116103085780632ae966381461051b5780632d6ef98a1461052e578063367998df146105445780633a37fa241461056457600080fd5b806318160ddd146104a65780631e84c413146104bb57806323b872dd146104db57806325034099146104fb57600080fd5b806307141a4c1161037557806307141a4c14610417578063081812fc1461042e578063095ea7b31461046657806316c38b3c1461048657600080fd5b806301b0749e1461039c57806301ffc9a7146103c557806306fdde03146103f5575b600080fd5b3480156103a857600080fd5b506103b2600f5481565b6040519081526020015b60405180910390f35b3480156103d157600080fd5b506103e56103e036600461252f565b610a8e565b60405190151581526020016103bc565b34801561040157600080fd5b5061040a610ae0565b6040516103bc919061259c565b34801561042357600080fd5b5061042c610b72565b005b34801561043a57600080fd5b5061044e6104493660046125af565b610bbc565b6040516001600160a01b0390911681526020016103bc565b34801561047257600080fd5b5061042c6104813660046125e4565b610c00565b34801561049257600080fd5b5061042c6104a136600461261e565b610cd2565b3480156104b257600080fd5b506103b2610d0f565b3480156104c757600080fd5b506014546103e59062010000900460ff1681565b3480156104e757600080fd5b5061042c6104f6366004612639565b610d1d565b34801561050757600080fd5b5061042c6105163660046125af565b610d2d565b61042c6105293660046125af565b610d5c565b34801561053a57600080fd5b506103b260135481565b34801561055057600080fd5b5061042c61055f3660046125af565b610eaa565b34801561057057600080fd5b5061042c61057f3660046125af565b610ed9565b34801561059057600080fd5b5061042c610f08565b3480156105a557600080fd5b506103b260115481565b3480156105bb57600080fd5b5061042c6105ca366004612639565b610fa6565b3480156105db57600080fd5b506103b2600d5481565b3480156105f157600080fd5b50610605610600366004612675565b610fc1565b6040516103bc9190612690565b34801561061e57600080fd5b506103b260105481565b34801561063457600080fd5b506103b2600c5481565b34801561064a57600080fd5b506103b260125481565b34801561066057600080fd5b5061042c61066f366004612760565b6110a1565b34801561068057600080fd5b506014546103e590610100900460ff1681565b34801561069f57600080fd5b5061042c6106ae3660046125af565b6110db565b3480156106bf57600080fd5b5061042c6106ce366004612760565b61110a565b3480156106df57600080fd5b506014546103e59060ff1681565b61042c6106fb3660046125af565b611140565b34801561070c57600080fd5b5061044e61071b3660046125af565b6112f2565b34801561072c57600080fd5b5061040a6112fd565b34801561074157600080fd5b506103b2610750366004612675565b60186020526000908152604090205481565b34801561076e57600080fd5b5061042c61077d3660046125af565b61138b565b34801561078e57600080fd5b506103b261079d366004612675565b6113ba565b3480156107ae57600080fd5b5061042c611409565b3480156107c357600080fd5b5061042c6107d23660046125af565b61143f565b3480156107e357600080fd5b5061042c6107f23660046125af565b61146e565b34801561080357600080fd5b506008546001600160a01b031661044e565b34801561082157600080fd5b506103b260165481565b34801561083757600080fd5b5061042c6108463660046125af565b61149d565b34801561085757600080fd5b5061040a6114cc565b34801561086c57600080fd5b5061042c61087b3660046127a9565b6114db565b34801561088c57600080fd5b5061040a611570565b3480156108a157600080fd5b5061042c6108b03660046125af565b61157d565b3480156108c157600080fd5b5061042c6115ac565b3480156108d657600080fd5b506103b2600e5481565b61042c6108ee3660046127dc565b6115ec565b3480156108ff57600080fd5b5061042c61185a565b34801561091457600080fd5b5061042c61092336600461285b565b611899565b34801561093457600080fd5b506014546103e5906301000000900460ff1681565b34801561095557600080fd5b506103b2610964366004612675565b60196020526000908152604090205481565b34801561098257600080fd5b5061040a6109913660046125af565b6118e3565b3480156109a257600080fd5b506014546103e590640100000000900460ff1681565b61042c6109c63660046127dc565b611a54565b3480156109d757600080fd5b5061042c6109e63660046128d7565b611c9e565b3480156109f757600080fd5b5061042c610a0636600461261e565b611d66565b348015610a1757600080fd5b506103e5610a263660046128fa565b611daa565b348015610a3757600080fd5b5061042c610a46366004612675565b611dd8565b348015610a5757600080fd5b506103b2610a66366004612675565b60176020526000908152604090205481565b348015610a8457600080fd5b506103b260155481565b60006301ffc9a760e01b6001600160e01b031983161480610abf57506380ac58cd60e01b6001600160e01b03198316145b80610ada5750635b5e139f60e01b6001600160e01b03198316145b92915050565b606060028054610aef90612924565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1b90612924565b8015610b685780601f10610b3d57610100808354040283529160200191610b68565b820191906000526020600020905b815481529060010190602001808311610b4b57829003601f168201915b5050505050905090565b6008546001600160a01b03163314610ba55760405162461bcd60e51b8152600401610b9c9061295e565b60405180910390fd5b6014805464ffffff00001916640100000000179055565b6000610bc782611e70565b610be4576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610c0b82611ea5565b9050806001600160a01b0316836001600160a01b031603610c3f5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610c7657610c598133611daa565b610c76576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b03163314610cfc5760405162461bcd60e51b8152600401610b9c9061295e565b6014805460ff1916911515919091179055565b600154600054036000190190565b610d28838383611f1b565b505050565b6008546001600160a01b03163314610d575760405162461bcd60e51b8152600401610b9c9061295e565b600f55565b600260095403610d7e5760405162461bcd60e51b8152600401610b9c90612993565b600260095560145460ff1615610da65760405162461bcd60e51b8152600401610b9c906129ca565b60145462010000900460ff16610df85760405162461bcd60e51b8152602060048201526017602482015276283ab13634b19039b0b6329034b9903737ba1037b832b760491b6044820152606401610b9c565b80600d54600c54610e099190612a08565b81610e12610d0f565b610e1c9190612a1b565b1115610e3a5760405162461bcd60e51b8152600401610b9c90612a2e565b600081118015610e4c57506013548111155b610e685760405162461bcd60e51b8152600401610b9c90612a73565b60125482610e768183612aa1565b341015610e955760405162461bcd60e51b8152600401610b9c90612ac0565b610e9f33856120c2565b505060016009555050565b6008546001600160a01b03163314610ed45760405162461bcd60e51b8152600401610b9c9061295e565b601555565b6008546001600160a01b03163314610f035760405162461bcd60e51b8152600401610b9c9061295e565b600d55565b6008546001600160a01b03163314610f325760405162461bcd60e51b8152600401610b9c9061295e565b6000610f466008546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610f90576040519150601f19603f3d011682016040523d82523d6000602084013e610f95565b606091505b5050905080610fa357600080fd5b50565b610d2883838360405180602001604052806000815250611899565b60606000610fce836113ba565b905060008167ffffffffffffffff811115610feb57610feb6126d4565b604051908082528060200260200182016040528015611014578160200160208202803683370190505b509050600160005b838110801561102d5750600c548211155b1561109757600061103d836112f2565b9050866001600160a01b0316816001600160a01b031603611084578284838151811061106b5761106b612aef565b60209081029190910101528161108081612b05565b9250505b8261108e81612b05565b9350505061101c565b5090949350505050565b6008546001600160a01b031633146110cb5760405162461bcd60e51b8152600401610b9c9061295e565b600b6110d78282612b6c565b5050565b6008546001600160a01b031633146111055760405162461bcd60e51b8152600401610b9c9061295e565b600c55565b6008546001600160a01b031633146111345760405162461bcd60e51b8152600401610b9c9061295e565b600a6110d78282612b6c565b6002600954036111625760405162461bcd60e51b8152600401610b9c90612993565b600260095560145460ff161561118a5760405162461bcd60e51b8152600401610b9c906129ca565b60145462010000900460ff166111dc5760405162461bcd60e51b8152602060048201526017602482015276283ab13634b19039b0b6329034b9903737ba1037b832b760491b6044820152606401610b9c565b80600d54600c546111ed9190612a08565b816111f6610d0f565b6112009190612a1b565b111561121e5760405162461bcd60e51b8152600401610b9c90612a2e565b60008111801561123057506013548111155b61124c5760405162461bcd60e51b8152600401610b9c90612a73565b6010543360009081526019602052604090205483919061126c9083612a1b565b111561128a5760405162461bcd60e51b8152600401610b9c90612c2c565b601154836112988183612aa1565b3410156112b75760405162461bcd60e51b8152600401610b9c90612ac0565b33600090815260196020526040812080548792906112d6908490612a1b565b909155506112e6905033866120c2565b50506001600955505050565b6000610ada82611ea5565b600a805461130a90612924565b80601f016020809104026020016040519081016040528092919081815260200182805461133690612924565b80156113835780601f1061135857610100808354040283529160200191611383565b820191906000526020600020905b81548152906001019060200180831161136657829003601f168201915b505050505081565b6008546001600160a01b031633146113b55760405162461bcd60e51b8152600401610b9c9061295e565b601055565b60006001600160a01b0382166113e3576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b031633146114335760405162461bcd60e51b8152600401610b9c9061295e565b61143d60006120dc565b565b6008546001600160a01b031633146114695760405162461bcd60e51b8152600401610b9c9061295e565b600e55565b6008546001600160a01b031633146114985760405162461bcd60e51b8152600401610b9c9061295e565b601355565b6008546001600160a01b031633146114c75760405162461bcd60e51b8152600401610b9c9061295e565b601655565b606060038054610aef90612924565b336001600160a01b038316036115045760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600b805461130a90612924565b6008546001600160a01b031633146115a75760405162461bcd60e51b8152600401610b9c9061295e565b601255565b6008546001600160a01b031633146115d65760405162461bcd60e51b8152600401610b9c9061295e565b6014805464ffffff000019166301000000179055565b60026009540361160e5760405162461bcd60e51b8152600401610b9c90612993565b600260095560145460ff16156116365760405162461bcd60e51b8152600401610b9c906129ca565b601454640100000000900460ff166116885760405162461bcd60e51b81526020600482015260156024820152742a32b0b69026b4b73a1034b9903737ba1037b832b760591b6044820152606401610b9c565b82600c5481611695610d0f565b61169f9190612a1b565b11156116bd5760405162461bcd60e51b8152600401610b9c90612a2e565b6000811180156116cf57506013548111155b6116eb5760405162461bcd60e51b8152600401610b9c90612a73565b600f543360009081526018602052604090205485919061170b9083612a1b565b11156117295760405162461bcd60e51b8152600401610b9c90612c2c565b83836016546117a1838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040516bffffffffffffffffffffffff193360601b16602082015285925060340190505b6040516020818303038152906040528051906020012061212e565b6117ed5760405162461bcd60e51b815260206004820152601f60248201527f596f75722061646472657373206973206e6f742077686974656c6973746564006044820152606401610b9c565b601154886117fb8183612aa1565b34101561181a5760405162461bcd60e51b8152600401610b9c90612ac0565b33600090815260186020526040812080548c9290611839908490612a1b565b909155506118499050338b6120c2565b505060016009555050505050505050565b6008546001600160a01b031633146118845760405162461bcd60e51b8152600401610b9c9061295e565b6014805464ffffff0000191662010000179055565b6118a4848484611f1b565b6001600160a01b0383163b156118dd576118c084848484612144565b6118dd576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b60606118ee82611e70565b6119525760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b9c565b601454610100900460ff1615156000036119f857600b805461197390612924565b80601f016020809104026020016040519081016040528092919081815260200182805461199f90612924565b80156119ec5780601f106119c1576101008083540402835291602001916119ec565b820191906000526020600020905b8154815290600101906020018083116119cf57829003601f168201915b50505050509050919050565b6000600a8054611a0790612924565b905011611a235760405180602001604052806000815250610ada565b600a611a2e83612230565b604051602001611a3f929190612c6e565b60405160208183030381529060405292915050565b600260095403611a765760405162461bcd60e51b8152600401610b9c90612993565b600260095560145460ff1615611a9e5760405162461bcd60e51b8152600401610b9c906129ca565b6014546301000000900460ff16611af75760405162461bcd60e51b815260206004820152601a60248201527f57686974656c6973742073616c65206973206e6f74206f70656e0000000000006044820152606401610b9c565b82600d54600c54611b089190612a08565b81611b11610d0f565b611b1b9190612a1b565b1115611b395760405162461bcd60e51b8152600401610b9c90612a2e565b600081118015611b4b57506013548111155b611b675760405162461bcd60e51b8152600401610b9c90612a73565b600e5433600090815260176020526040902054859190611b879083612a1b565b1115611ba55760405162461bcd60e51b8152600401610b9c90612c2c565b8383601554611c06838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040516bffffffffffffffffffffffff193360601b1660208201528592506034019050611786565b611c525760405162461bcd60e51b815260206004820152601f60248201527f596f75722061646472657373206973206e6f742077686974656c6973746564006044820152606401610b9c565b60115488611c608183612aa1565b341015611c7f5760405162461bcd60e51b8152600401610b9c90612ac0565b33600090815260176020526040812080548c9290611839908490612a1b565b600260095403611cc05760405162461bcd60e51b8152600401610b9c90612993565b60026009556008546001600160a01b03163314611cef5760405162461bcd60e51b8152600401610b9c9061295e565b81600c5481611cfc610d0f565b611d069190612a1b565b1115611d245760405162461bcd60e51b8152600401610b9c90612a2e565b600081118015611d3657506013548111155b611d525760405162461bcd60e51b8152600401610b9c90612a73565b611d5c82846120c2565b5050600160095550565b6008546001600160a01b03163314611d905760405162461bcd60e51b8152600401610b9c9061295e565b601480549115156101000261ff0019909216919091179055565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b6008546001600160a01b03163314611e025760405162461bcd60e51b8152600401610b9c9061295e565b6001600160a01b038116611e675760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b9c565b610fa3816120dc565b600081600111158015611e84575060005482105b8015610ada575050600090815260046020526040902054600160e01b161590565b60008180600111611f0257600054811015611f025760008181526004602052604081205490600160e01b82169003611f00575b80600003611ef9575060001901600081815260046020526040902054611ed8565b9392505050565b505b604051636f96cda160e11b815260040160405180910390fd5b6000611f2682611ea5565b9050836001600160a01b0316816001600160a01b031614611f595760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611f775750611f778533611daa565b80611f92575033611f8784610bbc565b6001600160a01b0316145b905080611fb257604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416611fd957604051633a954ecd60e21b815260040160405180910390fd5b600083815260066020908152604080832080546001600160a01b03191690556001600160a01b038881168452600583528184208054600019019055871683528083208054600101905585835260049091528120600160e11b4260a01b871781179091558316900361207a576001830160008181526004602052604081205490036120785760005481146120785760008181526004602052604090208390555b505b82846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b6110d7828260405180602001604052806000815250612331565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008261213b85846124a5565b14949350505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612179903390899088908890600401612d05565b6020604051808303816000875af19250505080156121b4575060408051601f3d908101601f191682019092526121b191810190612d42565b60015b612212573d8080156121e2576040519150601f19603f3d011682016040523d82523d6000602084013e6121e7565b606091505b50805160000361220a576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060816000036122575750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612281578061226b81612b05565b915061227a9050600a83612d75565b915061225b565b60008167ffffffffffffffff81111561229c5761229c6126d4565b6040519080825280601f01601f1916602001820160405280156122c6576020820181803683370190505b5090505b8415612228576122db600183612a08565b91506122e8600a86612d89565b6122f3906030612a1b565b60f81b81838151811061230857612308612aef565b60200101906001600160f81b031916908160001a90535061232a600a86612d75565b94506122ca565b6000546001600160a01b03841661235a57604051622e076360e81b815260040160405180910390fd5b8260000361237b5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03841660008181526005602090815260408083208054680100000000000000018902019055848352600490915290204260a01b86176001861460e11b1790558190818501903b15612450575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46124196000878480600101955087612144565b612436576040516368d2bf6b60e11b815260040160405180910390fd5b8082106123ce57826000541461244b57600080fd5b612495565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210612451575b5060009081556118dd9085838684565b600081815b84518110156125115760008582815181106124c7576124c7612aef565b602002602001015190508083116124ed57600083815260208290526040902092506124fe565b600081815260208490526040902092505b508061250981612b05565b9150506124aa565b509392505050565b6001600160e01b031981168114610fa357600080fd5b60006020828403121561254157600080fd5b8135611ef981612519565b60005b8381101561256757818101518382015260200161254f565b50506000910152565b6000815180845261258881602086016020860161254c565b601f01601f19169290920160200192915050565b602081526000611ef96020830184612570565b6000602082840312156125c157600080fd5b5035919050565b80356001600160a01b03811681146125df57600080fd5b919050565b600080604083850312156125f757600080fd5b612600836125c8565b946020939093013593505050565b803580151581146125df57600080fd5b60006020828403121561263057600080fd5b611ef98261260e565b60008060006060848603121561264e57600080fd5b612657846125c8565b9250612665602085016125c8565b9150604084013590509250925092565b60006020828403121561268757600080fd5b611ef9826125c8565b6020808252825182820181905260009190848201906040850190845b818110156126c8578351835292840192918401916001016126ac565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612705576127056126d4565b604051601f8501601f19908116603f0116810190828211818310171561272d5761272d6126d4565b8160405280935085815286868601111561274657600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561277257600080fd5b813567ffffffffffffffff81111561278957600080fd5b8201601f8101841361279a57600080fd5b612228848235602084016126ea565b600080604083850312156127bc57600080fd5b6127c5836125c8565b91506127d36020840161260e565b90509250929050565b6000806000604084860312156127f157600080fd5b83359250602084013567ffffffffffffffff8082111561281057600080fd5b818601915086601f83011261282457600080fd5b81358181111561283357600080fd5b8760208260051b850101111561284857600080fd5b6020830194508093505050509250925092565b6000806000806080858703121561287157600080fd5b61287a856125c8565b9350612888602086016125c8565b925060408501359150606085013567ffffffffffffffff8111156128ab57600080fd5b8501601f810187136128bc57600080fd5b6128cb878235602084016126ea565b91505092959194509250565b600080604083850312156128ea57600080fd5b823591506127d3602084016125c8565b6000806040838503121561290d57600080fd5b612916836125c8565b91506127d3602084016125c8565b600181811c9082168061293857607f821691505b60208210810361295857634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252600e908201526d14d85b19481a5cc81c185d5cd95960921b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b81810381811115610ada57610ada6129f2565b80820180821115610ada57610ada6129f2565b60208082526025908201527f4e6f7420656e6f7567682041657465726e61732072656d61696e696e6720746f604082015264081b5a5b9d60da1b606082015260800190565b602080825260149082015273496e76616c6964206d696e7420616d6f756e742160601b604082015260600190565b6000816000190483118215151615612abb57612abb6129f2565b500290565b602080825260159082015274496e73756666696369656e742046756e647321212160581b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b600060018201612b1757612b176129f2565b5060010190565b601f821115610d2857600081815260208120601f850160051c81016020861015612b455750805b601f850160051c820191505b81811015612b6457828155600101612b51565b505050505050565b815167ffffffffffffffff811115612b8657612b866126d4565b612b9a81612b948454612924565b84612b1e565b602080601f831160018114612bcf5760008415612bb75750858301515b600019600386901b1c1916600185901b178555612b64565b600085815260208120601f198616915b82811015612bfe57888601518255948401946001909101908401612bdf565b5085821015612c1c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60208082526022908201527f4164647265737320616c726561647920636c61696d6564207468656972204e46604082015261547360f01b606082015260800190565b6000808454612c7c81612924565b60018281168015612c945760018114612ca957612cd8565b60ff1984168752821515830287019450612cd8565b8860005260208060002060005b85811015612ccf5781548a820152908401908201612cb6565b50505082870194505b505050508351612cec81836020880161254c565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612d3890830184612570565b9695505050505050565b600060208284031215612d5457600080fd5b8151611ef981612519565b634e487b7160e01b600052601260045260246000fd5b600082612d8457612d84612d5f565b500490565b600082612d9857612d98612d5f565b50069056fea26469706673582212209910a8e191fa1257106f722891c238709c8746fc028ccaf9dc02159a8ea6a6b664736f6c63430008100033

Deployed Bytecode Sourcemap

49820:8768:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50118:36;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;50118:36:0;;;;;;;;24475:615;;;;;;;;;;-1:-1:-1;24475:615:0;;;;;:::i;:::-;;:::i;:::-;;;747:14:1;;740:22;722:41;;710:2;695:18;24475:615:0;582:187:1;29488:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;56089:148::-;;;;;;;;;;;;;:::i;:::-;;31556:204;;;;;;;;;;-1:-1:-1;31556:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1879:32:1;;;1861:51;;1849:2;1834:18;31556:204:0;1715:203:1;31016:474:0;;;;;;;;;;-1:-1:-1;31016:474:0;;;;;:::i;:::-;;:::i;55689:79::-;;;;;;;;;;-1:-1:-1;55689:79:0;;;;;:::i;:::-;;:::i;23529:315::-;;;;;;;;;;;;;:::i;50415:38::-;;;;;;;;;;-1:-1:-1;50415:38:0;;;;;;;;;;;32442:170;;;;;;;;;;-1:-1:-1;32442:170:0;;;;;:::i;:::-;;:::i;57953:117::-;;;;;;;;;;-1:-1:-1;57953:117:0;;;;;:::i;:::-;;:::i;53704:286::-;;;;;;:::i;:::-;;:::i;50299:47::-;;;;;;;;;;;;;;;;55480:105;;;;;;;;;;-1:-1:-1;55480:105:0;;;;;:::i;:::-;;:::i;58326:106::-;;;;;;;;;;-1:-1:-1;58326:106:0;;;;;:::i;:::-;;:::i;58438:145::-;;;;;;;;;;;;;:::i;50206:37::-;;;;;;;;;;;;;;;;32683:185;;;;;;;;;;-1:-1:-1;32683:185:0;;;;;:::i;:::-;;:::i;50030:32::-;;;;;;;;;;;;;;;;56245:637;;;;;;;;;;-1:-1:-1;56245:637:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;50159:42::-;;;;;;;;;;;;;;;;49992:33;;;;;;;;;;;;;;;;50248:46;;;;;;;;;;;;;;;;58076:132;;;;;;;;;;-1:-1:-1;58076:132:0;;;;;:::i;:::-;;:::i;50382:28::-;;;;;;;;;;-1:-1:-1;50382:28:0;;;;;;;;;;;58214:106;;;;;;;;;;-1:-1:-1;58214:106:0;;;;;:::i;:::-;;:::i;55289:94::-;;;;;;;;;;-1:-1:-1;55289:94:0;;;;;:::i;:::-;;:::i;50351:26::-;;;;;;;;;;-1:-1:-1;50351:26:0;;;;;;;;53316:382;;;;;;:::i;:::-;;:::i;29277:144::-;;;;;;;;;;-1:-1:-1;29277:144:0;;;;;:::i;:::-;;:::i;49917:34::-;;;;;;;;;;;;;:::i;50817:53::-;;;;;;;;;;-1:-1:-1;50817:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;57822:125;;;;;;;;;;-1:-1:-1;57822:125:0;;;;;:::i;:::-;;:::i;25154:224::-;;;;;;;;;;-1:-1:-1;25154:224:0;;;;;:::i;:::-;;:::i;10585:103::-;;;;;;;;;;;;;:::i;57685:131::-;;;;;;;;;;-1:-1:-1;57685:131:0;;;;;:::i;:::-;;:::i;57543:136::-;;;;;;;;;;-1:-1:-1;57543:136:0;;;;;:::i;:::-;;:::i;9934:87::-;;;;;;;;;;-1:-1:-1;10007:6:0;;-1:-1:-1;;;;;10007:6:0;9934:87;;50653:96;;;;;;;;;;;;;;;;55591:92;;;;;;;;;;-1:-1:-1;55591:92:0;;;;;:::i;:::-;;:::i;29657:104::-;;;;;;;;;;;;;:::i;31832:308::-;;;;;;;;;;-1:-1:-1;31832:308:0;;;;;:::i;:::-;;:::i;49956:31::-;;;;;;;;;;;;;:::i;57437:100::-;;;;;;;;;;-1:-1:-1;57437:100:0;;;;;:::i;:::-;;:::i;55774:153::-;;;;;;;;;;;;;:::i;50068:45::-;;;;;;;;;;;;;;;;54476:450;;;;;;:::i;:::-;;:::i;55933:150::-;;;;;;;;;;;;;:::i;32939:396::-;;;;;;;;;;-1:-1:-1;32939:396:0;;;;;:::i;:::-;;:::i;50458:40::-;;;;;;;;;;-1:-1:-1;50458:40:0;;;;;;;;;;;50875:55;;;;;;;;;;-1:-1:-1;50875:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;56990:441;;;;;;;;;;-1:-1:-1;56990:441:0;;;;;:::i;:::-;;:::i;50503:36::-;;;;;;;;;;-1:-1:-1;50503:36:0;;;;;;;;;;;53996:474;;;;;;:::i;:::-;;:::i;54977:206::-;;;;;;;;;;-1:-1:-1;54977:206:0;;;;;:::i;:::-;;:::i;55391:83::-;;;;;;;;;;-1:-1:-1;55391:83:0;;;;;:::i;:::-;;:::i;32211:164::-;;;;;;;;;;-1:-1:-1;32211:164:0;;;;;:::i;:::-;;:::i;10843:201::-;;;;;;;;;;-1:-1:-1;10843:201:0;;;;;:::i;:::-;;:::i;50754:58::-;;;;;;;;;;-1:-1:-1;50754:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;50544:104;;;;;;;;;;;;;;;;24475:615;24560:4;-1:-1:-1;;;;;;;;;24860:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;24937:25:0;;;24860:102;:179;;;-1:-1:-1;;;;;;;;;;25014:25:0;;;24860:179;24840:199;24475:615;-1:-1:-1;;24475:615:0:o;29488:100::-;29542:13;29575:5;29568:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29488:100;:::o;56089:148::-;10007:6;;-1:-1:-1;;;;;10007:6:0;8738:10;10154:23;10146:68;;;;-1:-1:-1;;;10146:68:0;;;;;;;:::i;:::-;;;;;;;;;56139:21:::1;:29:::0;;-1:-1:-1;;56208:23:0;;::::1;::::0;;56089:148::o;31556:204::-;31624:7;31649:16;31657:7;31649;:16::i;:::-;31644:64;;31674:34;;-1:-1:-1;;;31674:34:0;;;;;;;;;;;31644:64;-1:-1:-1;31728:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;31728:24:0;;31556:204::o;31016:474::-;31089:13;31121:27;31140:7;31121:18;:27::i;:::-;31089:61;;31171:5;-1:-1:-1;;;;;31165:11:0;:2;-1:-1:-1;;;;;31165:11:0;;31161:48;;31185:24;;-1:-1:-1;;;31185:24:0;;;;;;;;;;;31161:48;8738:10;-1:-1:-1;;;;;31226:28:0;;;31222:175;;31274:44;31291:5;8738:10;32211:164;:::i;31274:44::-;31269:128;;31346:35;;-1:-1:-1;;;31346:35:0;;;;;;;;;;;31269:128;31409:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;31409:29:0;-1:-1:-1;;;;;31409:29:0;;;;;;;;;31454:28;;31409:24;;31454:28;;;;;;;31078:412;31016:474;;:::o;55689:79::-;10007:6;;-1:-1:-1;;;;;10007:6:0;8738:10;10154:23;10146:68;;;;-1:-1:-1;;;10146:68:0;;;;;;;:::i;:::-;55747:6:::1;:15:::0;;-1:-1:-1;;55747:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;55689:79::o;23529:315::-;56977:1;23795:12;23582:7;23779:13;:28;-1:-1:-1;;23779:46:0;;23529:315::o;32442:170::-;32576:28;32586:4;32592:2;32596:7;32576:9;:28::i;:::-;32442:170;;;:::o;57953:117::-;10007:6;;-1:-1:-1;;;;;10007:6:0;8738:10;10154:23;10146:68;;;;-1:-1:-1;;;10146:68:0;;;;;;;:::i;:::-;58032:17:::1;:32:::0;57953:117::o;53704:286::-;4347:1;4945:7;;:19;4937:63;;;;-1:-1:-1;;;4937:63:0;;;;;;;:::i;:::-;4347:1;5078:7;:18;51305:6:::1;::::0;::::1;;51304:7;51296:34;;;;-1:-1:-1::0;;;51296:34:0::1;;;;;;;:::i;:::-;50980:18:::2;::::0;;;::::2;;;50972:54;;;::::0;-1:-1:-1;;;50972:54:0;;9257:2:1;50972:54:0::2;::::0;::::2;9239:21:1::0;9296:2;9276:18;;;9269:30;-1:-1:-1;;;9315:18:1;;;9308:53;9378:18;;50972:54:0::2;9055:347:1::0;50972:54:0::2;53856:14:::3;52163:11;;52149;;:25;;;;:::i;:::-;52131:14;52115:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:59;;52099:130;;;;-1:-1:-1::0;;;52099:130:0::3;;;;;;;:::i;:::-;52269:1;52252:14;:18;:68;;;;;52292:28;;52274:14;:46;;52252:68;52236:115;;;;-1:-1:-1::0;;;52236:115:0::3;;;;;;;:::i;:::-;53894:18:::4;::::0;53914:14;52790:22:::4;53914:14:::0;53894:18;52790:22:::4;:::i;:::-;52777:9;:35;;52761:90;;;;-1:-1:-1::0;;;52761:90:0::4;;;;;;;:::i;:::-;53944:37:::5;53954:10;53966:14;53944:9;:37::i;:::-;-1:-1:-1::0;;4303:1:0;5257:7;:22;-1:-1:-1;;53704:286:0:o;55480:105::-;10007:6;;-1:-1:-1;;;;;10007:6:0;8738:10;10154:23;10146:68;;;;-1:-1:-1;;;10146:68:0;;;;;;;:::i;:::-;55551:20:::1;:28:::0;55480:105::o;58326:106::-;10007:6;;-1:-1:-1;;;;;10007:6:0;8738:10;10154:23;10146:68;;;;-1:-1:-1;;;10146:68:0;;;;;;;:::i;:::-;58400:11:::1;:26:::0;58326:106::o;58438:145::-;10007:6;;-1:-1:-1;;;;;10007:6:0;8738:10;10154:23;10146:68;;;;-1:-1:-1;;;10146:68:0;;;;;;;:::i;:::-;58487:7:::1;58508;10007:6:::0;;-1:-1:-1;;;;;10007:6:0;;9934:87;58508:7:::1;-1:-1:-1::0;;;;;58500:21:0::1;58529;58500:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58486:69;;;58570:2;58562:11;;;::::0;::::1;;58475:108;58438:145::o:0;32683:185::-;32821:39;32838:4;32844:2;32848:7;32821:39;;;;;;;;;;;;:16;:39::i;56245:637::-;56320:16;56348:23;56374:17;56384:6;56374:9;:17::i;:::-;56348:43;;56398:30;56445:15;56431:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56431:30:0;-1:-1:-1;56398:63:0;-1:-1:-1;56493:1:0;56468:22;56537:311;56562:15;56544;:33;:66;;;;;56599:11;;56581:14;:29;;56544:66;56537:311;;;56621:25;56649:23;56657:14;56649:7;:23::i;:::-;56621:51;;56708:6;-1:-1:-1;;;;;56687:27:0;:17;-1:-1:-1;;;;;56687:27:0;;56683:131;;56760:14;56727:13;56741:15;56727:30;;;;;;;;:::i;:::-;;;;;;;;;;:47;56787:17;;;;:::i;:::-;;;;56683:131;56824:16;;;;:::i;:::-;;;;56612:236;56537:311;;;-1:-1:-1;56863:13:0;;56245:637;-1:-1:-1;;;;56245:637:0:o;58076:132::-;10007:6;;-1:-1:-1;;;;;10007:6:0;8738:10;10154:23;10146:68;;;;-1:-1:-1;;;10146:68:0;;;;;;;:::i;:::-;58164:17:::1;:38;58184:18:::0;58164:17;:38:::1;:::i;:::-;;58076:132:::0;:::o;58214:106::-;10007:6;;-1:-1:-1;;;;;10007:6:0;8738:10;10154:23;10146:68;;;;-1:-1:-1;;;10146:68:0;;;;;;;:::i;:::-;58288:11:::1;:26:::0;58214:106::o;55289:94::-;10007:6;;-1:-1:-1;;;;;10007:6:0;8738:10;10154:23;10146:68;;;;-1:-1:-1;;;10146:68:0;;;;;;;:::i;:::-;55359:7:::1;:18;55369:8:::0;55359:7;:18:::1;:::i;53316:382::-:0;4347:1;4945:7;;:19;4937:63;;;;-1:-1:-1;;;4937:63:0;;;;;;;:::i;:::-;4347:1;5078:7;:18;51305:6:::1;::::0;::::1;;51304:7;51296:34;;;;-1:-1:-1::0;;;51296:34:0::1;;;;;;;:::i;:::-;50980:18:::2;::::0;;;::::2;;;50972:54;;;::::0;-1:-1:-1;;;50972:54:0;;9257:2:1;50972:54:0::2;::::0;::::2;9239:21:1::0;9296:2;9276:18;;;9269:30;-1:-1:-1;;;9315:18:1;;;9308:53;9378:18;;50972:54:0::2;9055:347:1::0;50972:54:0::2;53468:14:::3;52163:11;;52149;;:25;;;;:::i;:::-;52131:14;52115:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:59;;52099:130;;;;-1:-1:-1::0;;;52099:130:0::3;;;;;;;:::i;:::-;52269:1;52252:14;:18;:68;;;;;52292:28;;52274:14;:46;;52252:68;52236:115;;;;-1:-1:-1::0;;;52236:115:0::3;;;;;;;:::i;:::-;51724:23:::4;::::0;51709:10:::4;51688:32;::::0;;;:20:::4;:32;::::0;;;;;53511:14;;51724:23;51671:49:::4;::::0;53511:14;51671:49:::4;:::i;:::-;:76;;51653:148;;;;-1:-1:-1::0;;;51653:148:0::4;;;;;;;:::i;:::-;53549:12:::5;::::0;53563:14;52790:22:::5;53563:14:::0;53549:12;52790:22:::5;:::i;:::-;52777:9;:35;;52761:90;;;;-1:-1:-1::0;;;52761:90:0::5;;;;;;;:::i;:::-;53614:10:::6;53593:32;::::0;;;:20:::6;:32;::::0;;;;:50;;53629:14;;53593:32;:50:::6;::::0;53629:14;;53593:50:::6;:::i;:::-;::::0;;;-1:-1:-1;53652:37:0::6;::::0;-1:-1:-1;53662:10:0::6;53674:14:::0;53652:9:::6;:37::i;:::-;-1:-1:-1::0;;4303:1:0;5257:7;:22;-1:-1:-1;;;53316:382:0:o;29277:144::-;29341:7;29384:27;29403:7;29384:18;:27::i;49917:34::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;57822:125::-;10007:6;;-1:-1:-1;;;;;10007:6:0;8738:10;10154:23;10146:68;;;;-1:-1:-1;;;10146:68:0;;;;;;;:::i;:::-;57903:23:::1;:38:::0;57822:125::o;25154:224::-;25218:7;-1:-1:-1;;;;;25242:19:0;;25238:60;;25270:28;;-1:-1:-1;;;25270:28:0;;;;;;;;;;;25238:60;-1:-1:-1;;;;;;25316:25:0;;;;;:18;:25;;;;;;20493:13;25316:54;;25154:224::o;10585:103::-;10007:6;;-1:-1:-1;;;;;10007:6:0;8738:10;10154:23;10146:68;;;;-1:-1:-1;;;10146:68:0;;;;;;;:::i;:::-;10650:30:::1;10677:1;10650:18;:30::i;:::-;10585:103::o:0;57685:131::-;10007:6;;-1:-1:-1;;;;;10007:6:0;8738:10;10154:23;10146:68;;;;-1:-1:-1;;;10146:68:0;;;;;;;:::i;:::-;57769:26:::1;:41:::0;57685:131::o;57543:136::-;10007:6;;-1:-1:-1;;;;;10007:6:0;8738:10;10154:23;10146:68;;;;-1:-1:-1;;;10146:68:0;;;;;;;:::i;:::-;57625:28:::1;:48:::0;57543:136::o;55591:92::-;10007:6;;-1:-1:-1;;;;;10007:6:0;8738:10;10154:23;10146:68;;;;-1:-1:-1;;;10146:68:0;;;;;;;:::i;:::-;55657:12:::1;:20:::0;55591:92::o;29657:104::-;29713:13;29746:7;29739:14;;;;;:::i;31832:308::-;8738:10;-1:-1:-1;;;;;31931:31:0;;;31927:61;;31971:17;;-1:-1:-1;;;31971:17:0;;;;;;;;;;;31927:61;8738:10;32001:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;32001:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;32001:60:0;;;;;;;;;;32077:55;;722:41:1;;;32001:49:0;;8738:10;32077:55;;695:18:1;32077:55:0;;;;;;;31832:308;;:::o;49956:31::-;;;;;;;:::i;57437:100::-;10007:6;;-1:-1:-1;;;;;10007:6:0;8738:10;10154:23;10146:68;;;;-1:-1:-1;;;10146:68:0;;;;;;;:::i;:::-;57505:18:::1;:26:::0;57437:100::o;55774:153::-;10007:6;;-1:-1:-1;;;;;10007:6:0;8738:10;10154:23;10146:68;;;;-1:-1:-1;;;10146:68:0;;;;;;;:::i;:::-;55829:21:::1;:28:::0;;-1:-1:-1;;55897:24:0;55829:28;55897:24;;;55774:153::o;54476:450::-;4347:1;4945:7;;:19;4937:63;;;;-1:-1:-1;;;4937:63:0;;;;;;;:::i;:::-;4347:1;5078:7;:18;51305:6:::1;::::0;::::1;;51304:7;51296:34;;;;-1:-1:-1::0;;;51296:34:0::1;;;;;;;:::i;:::-;51205:16:::2;::::0;;;::::2;;;51197:50;;;::::0;-1:-1:-1;;;51197:50:0;;14371:2:1;51197:50:0::2;::::0;::::2;14353:21:1::0;14410:2;14390:18;;;14383:30;-1:-1:-1;;;14429:18:1;;;14422:51;14490:18;;51197:50:0::2;14169:345:1::0;51197:50:0::2;54654:14:::3;52481:11;;52463:14;52447:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:45;;52431:116;;;;-1:-1:-1::0;;;52431:116:0::3;;;;;;;:::i;:::-;52587:1;52570:14;:18;:68;;;;;52610:28;;52592:14;:46;;52570:68;52554:115;;;;-1:-1:-1::0;;;52554:115:0::3;;;;;;;:::i;:::-;51952:17:::4;::::0;51937:10:::4;51918:30;::::0;;;:18:::4;:30;::::0;;;;;54691:14;;51952:17;51901:47:::4;::::0;54691:14;51901:47:::4;:::i;:::-;:68;;51883:140;;;;-1:-1:-1::0;;;51883:140:0::4;;;;;;;:::i;:::-;54731:11:::5;;54744:12;;52968:114;52997:11;;52968:114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::5;::::0;;;;-1:-1:-1;;53044:28:0::5;::::0;-1:-1:-1;;53061:10:0::5;14668:2:1::0;14664:15;14660:53;53044:28:0::5;::::0;::::5;14648:66:1::0;53019:4:0;;-1:-1:-1;14730:12:1;;;-1:-1:-1;53044:28:0::5;;;;;;;;;;;;;53034:39;;;;;;52968:18;:114::i;:::-;52952:172;;;::::0;-1:-1:-1;;;52952:172:0;;14955:2:1;52952:172:0::5;::::0;::::5;14937:21:1::0;14994:2;14974:18;;;14967:30;15033:33;15013:18;;;15006:61;15084:18;;52952:172:0::5;14753:355:1::0;52952:172:0::5;54780:12:::6;::::0;54794:14;52790:22:::6;54794:14:::0;54780:12;52790:22:::6;:::i;:::-;52777:9;:35;;52761:90;;;;-1:-1:-1::0;;;52761:90:0::6;;;;;;;:::i;:::-;54843:10:::7;54824:30;::::0;;;:18:::7;:30;::::0;;;;:48;;54858:14;;54824:30;:48:::7;::::0;54858:14;;54824:48:::7;:::i;:::-;::::0;;;-1:-1:-1;54881:37:0::7;::::0;-1:-1:-1;54891:10:0::7;54903:14:::0;54881:9:::7;:37::i;:::-;-1:-1:-1::0;;4303:1:0;5257:7;:22;-1:-1:-1;;;;;;;;54476:450:0:o;55933:150::-;10007:6;;-1:-1:-1;;;;;10007:6:0;8738:10;10154:23;10146:68;;;;-1:-1:-1;;;10146:68:0;;;;;;;:::i;:::-;55985:21:::1;:29:::0;;-1:-1:-1;;56053:24:0;56021:25;56053:24;;;55933:150::o;32939:396::-;33106:28;33116:4;33122:2;33126:7;33106:9;:28::i;:::-;-1:-1:-1;;;;;33149:14:0;;;:19;33145:183;;33188:56;33219:4;33225:2;33229:7;33238:5;33188:30;:56::i;:::-;33183:145;;33272:40;;-1:-1:-1;;;33272:40:0;;;;;;;;;;;33183:145;32939:396;;;;:::o;56990:441::-;57064:13;57093:17;57101:8;57093:7;:17::i;:::-;57085:77;;;;-1:-1:-1;;;57085:77:0;;15315:2:1;57085:77:0;;;15297:21:1;15354:2;15334:18;;;15327:30;15393:34;15373:18;;;15366:62;-1:-1:-1;;;15444:18:1;;;15437:45;15499:19;;57085:77:0;15113:411:1;57085:77:0;57175:8;;;;;;;:17;;57187:5;57175:17;57171:64;;57210:17;57203:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56990:441;;;:::o;57171:64::-;57335:1;57317:7;57311:21;;;;;:::i;:::-;;;:25;:114;;;;;;;;;;;;;;;;;57372:7;57381:19;:8;:17;:19::i;:::-;57355:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57304:121;56990:441;-1:-1:-1;;56990:441:0:o;53996:474::-;4347:1;4945:7;;:19;4937:63;;;;-1:-1:-1;;;4937:63:0;;;;;;;:::i;:::-;4347:1;5078:7;:18;51305:6:::1;::::0;::::1;;51304:7;51296:34;;;;-1:-1:-1::0;;;51296:34:0::1;;;;;;;:::i;:::-;51092:21:::2;::::0;;;::::2;;;51084:60;;;::::0;-1:-1:-1;;;51084:60:0;;16923:2:1;51084:60:0::2;::::0;::::2;16905:21:1::0;16962:2;16942:18;;;16935:30;17001:28;16981:18;;;16974:56;17047:18;;51084:60:0::2;16721:350:1::0;51084:60:0::2;54180:14:::3;52163:11;;52149;;:25;;;;:::i;:::-;52131:14;52115:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:59;;52099:130;;;;-1:-1:-1::0;;;52099:130:0::3;;;;;;;:::i;:::-;52269:1;52252:14;:18;:68;;;;;52292:28;;52274:14;:46;;52252:68;52236:115;;;;-1:-1:-1::0;;;52236:115:0::3;;;;;;;:::i;:::-;51485:26:::4;::::0;51470:10:::4;51446:35;::::0;;;:23:::4;:35;::::0;;;;;54222:14;;51485:26;51429:52:::4;::::0;54222:14;51429:52:::4;:::i;:::-;:82;;51411:154;;;;-1:-1:-1::0;;;51411:154:0::4;;;;;;;:::i;:::-;54262:11:::5;;54275:20;;52968:114;52997:11;;52968:114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::5;::::0;;;;-1:-1:-1;;53044:28:0::5;::::0;-1:-1:-1;;53061:10:0::5;14668:2:1::0;14664:15;14660:53;53044:28:0::5;::::0;::::5;14648:66:1::0;53019:4:0;;-1:-1:-1;14730:12:1;;;-1:-1:-1;53044:28:0::5;14519:229:1::0;52968:114:0::5;52952:172;;;::::0;-1:-1:-1;;;52952:172:0;;14955:2:1;52952:172:0::5;::::0;::::5;14937:21:1::0;14994:2;14974:18;;;14967:30;15033:33;15013:18;;;15006:61;15084:18;;52952:172:0::5;14753:355:1::0;52952:172:0::5;54319:12:::6;::::0;54333:14;52790:22:::6;54333:14:::0;54319:12;52790:22:::6;:::i;:::-;52777:9;:35;;52761:90;;;;-1:-1:-1::0;;;52761:90:0::6;;;;;;;:::i;:::-;54387:10:::7;54363:35;::::0;;;:23:::7;:35;::::0;;;;:53;;54402:14;;54363:35;:53:::7;::::0;54402:14;;54363:53:::7;:::i;54977:206::-:0;4347:1;4945:7;;:19;4937:63;;;;-1:-1:-1;;;4937:63:0;;;;;;;:::i;:::-;4347:1;5078:7;:18;10007:6;;-1:-1:-1;;;;;10007:6:0;8738:10;10154:23:::1;10146:68;;;;-1:-1:-1::0;;;10146:68:0::1;;;;;;;:::i;:::-;55109:14:::2;52481:11;;52463:14;52447:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:45;;52431:116;;;;-1:-1:-1::0;;;52431:116:0::2;;;;;;;:::i;:::-;52587:1;52570:14;:18;:68;;;;;52610:28;;52592:14;:46;;52570:68;52554:115;;;;-1:-1:-1::0;;;52554:115:0::2;;;;;;;:::i;:::-;55139:36:::3;55149:9;55160:14;55139:9;:36::i;:::-;-1:-1:-1::0;;4303:1:0;5257:7;:22;-1:-1:-1;54977:206:0:o;55391:83::-;10007:6;;-1:-1:-1;;;;;10007:6:0;8738:10;10154:23;10146:68;;;;-1:-1:-1;;;10146:68:0;;;;;;;:::i;:::-;55451:8:::1;:17:::0;;;::::1;;;;-1:-1:-1::0;;55451:17:0;;::::1;::::0;;;::::1;::::0;;55391:83::o;32211:164::-;-1:-1:-1;;;;;32332:25:0;;;32308:4;32332:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;32211:164::o;10843:201::-;10007:6;;-1:-1:-1;;;;;10007:6:0;8738:10;10154:23;10146:68;;;;-1:-1:-1;;;10146:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10932:22:0;::::1;10924:73;;;::::0;-1:-1:-1;;;10924:73:0;;17278:2:1;10924:73:0::1;::::0;::::1;17260:21:1::0;17317:2;17297:18;;;17290:30;17356:34;17336:18;;;17329:62;-1:-1:-1;;;17407:18:1;;;17400:36;17453:19;;10924:73:0::1;17076:402:1::0;10924:73:0::1;11008:28;11027:8;11008:18;:28::i;33590:273::-:0;33647:4;33703:7;56977:1;33684:26;;:66;;;;;33737:13;;33727:7;:23;33684:66;:152;;;;-1:-1:-1;;33788:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;33788:43:0;:48;;33590:273::o;26792:1129::-;26859:7;26894;;56977:1;26943:23;26939:915;;26996:13;;26989:4;:20;26985:869;;;27034:14;27051:23;;;:17;:23;;;;;;;-1:-1:-1;;;27140:23:0;;:28;;27136:699;;27659:113;27666:6;27676:1;27666:11;27659:113;;-1:-1:-1;;;27737:6:0;27719:25;;;;:17;:25;;;;;;27659:113;;;27805:6;26792:1129;-1:-1:-1;;;26792:1129:0:o;27136:699::-;27011:843;26985:869;27882:31;;-1:-1:-1;;;27882:31:0;;;;;;;;;;;38829:2515;38944:27;38974;38993:7;38974:18;:27::i;:::-;38944:57;;39059:4;-1:-1:-1;;;;;39018:45:0;39034:19;-1:-1:-1;;;;;39018:45:0;;39014:86;;39072:28;;-1:-1:-1;;;39072:28:0;;;;;;;;;;;39014:86;39113:22;8738:10;-1:-1:-1;;;;;39139:27:0;;;;:87;;-1:-1:-1;39183:43:0;39200:4;8738:10;32211:164;:::i;39183:43::-;39139:147;;;-1:-1:-1;8738:10:0;39243:20;39255:7;39243:11;:20::i;:::-;-1:-1:-1;;;;;39243:43:0;;39139:147;39113:174;;39305:17;39300:66;;39331:35;;-1:-1:-1;;;39331:35:0;;;;;;;;;;;39300:66;-1:-1:-1;;;;;39381:16:0;;39377:52;;39406:23;;-1:-1:-1;;;39406:23:0;;;;;;;;;;;39377:52;39558:24;;;;:15;:24;;;;;;;;39551:31;;-1:-1:-1;;;;;;39551:31:0;;;-1:-1:-1;;;;;39950:24:0;;;;;:18;:24;;;;;39948:26;;-1:-1:-1;;39948:26:0;;;40019:22;;;;;;;40017:24;;-1:-1:-1;40017:24:0;;;40312:26;;;:17;:26;;;;;-1:-1:-1;;;40400:15:0;21147:3;40400:41;40358:84;;:128;;40312:174;;;40606:46;;:51;;40602:626;;40710:1;40700:11;;40678:19;40833:30;;;:17;:30;;;;;;:35;;40829:384;;40971:13;;40956:11;:28;40952:242;;41118:30;;;;:17;:30;;;;;:52;;;40952:242;40659:569;40602:626;41275:7;41271:2;-1:-1:-1;;;;;41256:27:0;41265:4;-1:-1:-1;;;;;41256:27:0;;;;;;;;;;;38933:2411;;38829:2515;;;:::o;33947:104::-;34016:27;34026:2;34030:8;34016:27;;;;;;;;;;;;:9;:27::i;11204:191::-;11297:6;;;-1:-1:-1;;;;;11314:17:0;;;-1:-1:-1;;;;;;11314:17:0;;;;;;;11347:40;;11297:6;;;11314:17;11297:6;;11347:40;;11278:16;;11347:40;11267:128;11204:191;:::o;6514:190::-;6639:4;6692;6663:25;6676:5;6683:4;6663:12;:25::i;:::-;:33;;6514:190;-1:-1:-1;;;;6514:190:0:o;45041:716::-;45225:88;;-1:-1:-1;;;45225:88:0;;45204:4;;-1:-1:-1;;;;;45225:45:0;;;;;:88;;8738:10;;45292:4;;45298:7;;45307:5;;45225:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45225:88:0;;;;;;;;-1:-1:-1;;45225:88:0;;;;;;;;;;;;:::i;:::-;;;45221:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45508:6;:13;45525:1;45508:18;45504:235;;45554:40;;-1:-1:-1;;;45554:40:0;;;;;;;;;;;45504:235;45697:6;45691:13;45682:6;45678:2;45674:15;45667:38;45221:529;-1:-1:-1;;;;;;45384:64:0;-1:-1:-1;;;45384:64:0;;-1:-1:-1;45221:529:0;45041:716;;;;;;:::o;776:723::-;832:13;1053:5;1062:1;1053:10;1049:53;;-1:-1:-1;;1080:10:0;;;;;;;;;;;;-1:-1:-1;;;1080:10:0;;;;;776:723::o;1049:53::-;1127:5;1112:12;1168:78;1175:9;;1168:78;;1201:8;;;;:::i;:::-;;-1:-1:-1;1224:10:0;;-1:-1:-1;1232:2:0;1224:10;;:::i;:::-;;;1168:78;;;1256:19;1288:6;1278:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1278:17:0;;1256:39;;1306:154;1313:10;;1306:154;;1340:11;1350:1;1340:11;;:::i;:::-;;-1:-1:-1;1409:10:0;1417:2;1409:5;:10;:::i;:::-;1396:24;;:2;:24;:::i;:::-;1383:39;;1366:6;1373;1366:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;1366:56:0;;;;;;;;-1:-1:-1;1437:11:0;1446:2;1437:11;;:::i;:::-;;;1306:154;;34424:2236;34547:20;34570:13;-1:-1:-1;;;;;34598:16:0;;34594:48;;34623:19;;-1:-1:-1;;;34623:19:0;;;;;;;;;;;34594:48;34657:8;34669:1;34657:13;34653:44;;34679:18;;-1:-1:-1;;;34679:18:0;;;;;;;;;;;34653:44;-1:-1:-1;;;;;35246:22:0;;;;;;:18;:22;;;;20630:2;35246:22;;;:70;;35284:31;35272:44;;35246:70;;;35559:31;;;:17;:31;;;;;35652:15;21147:3;35652:41;35610:84;;-1:-1:-1;35730:13:0;;21410:3;35715:56;35610:162;35559:213;;:31;;35853:23;;;;35897:14;:19;35893:635;;35937:313;35968:38;;35993:12;;-1:-1:-1;;;;;35968:38:0;;;35985:1;;35968:38;;35985:1;;35968:38;36034:69;36073:1;36077:2;36081:14;;;;;;36097:5;36034:30;:69::i;:::-;36029:174;;36139:40;;-1:-1:-1;;;36139:40:0;;;;;;;;;;;36029:174;36245:3;36230:12;:18;35937:313;;36331:12;36314:13;;:29;36310:43;;36345:8;;;36310:43;35893:635;;;36394:119;36425:40;;36450:14;;;;;-1:-1:-1;;;;;36425:40:0;;;36442:1;;36425:40;;36442:1;;36425:40;36508:3;36493:12;:18;36394:119;;35893:635;-1:-1:-1;36542:13:0;:28;;;36592:60;;36625:2;36629:12;36643:8;36592:60;:::i;7065:675::-;7148:7;7191:4;7148:7;7206:497;7230:5;:12;7226:1;:16;7206:497;;;7264:20;7287:5;7293:1;7287:8;;;;;;;;:::i;:::-;;;;;;;7264:31;;7330:12;7314;:28;7310:382;;7816:13;7866:15;;;7902:4;7895:15;;;7949:4;7933:21;;7442:57;;7310:382;;;7816:13;7866:15;;;7902:4;7895:15;;;7949:4;7933:21;;7619:57;;7310:382;-1:-1:-1;7244:3:0;;;;:::i;:::-;;;;7206:497;;;-1:-1:-1;7720:12:0;7065:675;-1:-1:-1;;;7065:675:0:o;196:131:1:-;-1:-1:-1;;;;;;270:32:1;;260:43;;250:71;;317:1;314;307:12;332:245;390:6;443:2;431:9;422:7;418:23;414:32;411:52;;;459:1;456;449:12;411:52;498:9;485:23;517:30;541:5;517:30;:::i;774:250::-;859:1;869:113;883:6;880:1;877:13;869:113;;;959:11;;;953:18;940:11;;;933:39;905:2;898:10;869:113;;;-1:-1:-1;;1016:1:1;998:16;;991:27;774:250::o;1029:271::-;1071:3;1109:5;1103:12;1136:6;1131:3;1124:19;1152:76;1221:6;1214:4;1209:3;1205:14;1198:4;1191:5;1187:16;1152:76;:::i;:::-;1282:2;1261:15;-1:-1:-1;;1257:29:1;1248:39;;;;1289:4;1244:50;;1029:271;-1:-1:-1;;1029:271:1:o;1305:220::-;1454:2;1443:9;1436:21;1417:4;1474:45;1515:2;1504:9;1500:18;1492:6;1474:45;:::i;1530:180::-;1589:6;1642:2;1630:9;1621:7;1617:23;1613:32;1610:52;;;1658:1;1655;1648:12;1610:52;-1:-1:-1;1681:23:1;;1530:180;-1:-1:-1;1530:180:1:o;1923:173::-;1991:20;;-1:-1:-1;;;;;2040:31:1;;2030:42;;2020:70;;2086:1;2083;2076:12;2020:70;1923:173;;;:::o;2101:254::-;2169:6;2177;2230:2;2218:9;2209:7;2205:23;2201:32;2198:52;;;2246:1;2243;2236:12;2198:52;2269:29;2288:9;2269:29;:::i;:::-;2259:39;2345:2;2330:18;;;;2317:32;;-1:-1:-1;;;2101:254:1:o;2360:160::-;2425:20;;2481:13;;2474:21;2464:32;;2454:60;;2510:1;2507;2500:12;2525:180;2581:6;2634:2;2622:9;2613:7;2609:23;2605:32;2602:52;;;2650:1;2647;2640:12;2602:52;2673:26;2689:9;2673:26;:::i;2710:328::-;2787:6;2795;2803;2856:2;2844:9;2835:7;2831:23;2827:32;2824:52;;;2872:1;2869;2862:12;2824:52;2895:29;2914:9;2895:29;:::i;:::-;2885:39;;2943:38;2977:2;2966:9;2962:18;2943:38;:::i;:::-;2933:48;;3028:2;3017:9;3013:18;3000:32;2990:42;;2710:328;;;;;:::o;3228:186::-;3287:6;3340:2;3328:9;3319:7;3315:23;3311:32;3308:52;;;3356:1;3353;3346:12;3308:52;3379:29;3398:9;3379:29;:::i;3419:632::-;3590:2;3642:21;;;3712:13;;3615:18;;;3734:22;;;3561:4;;3590:2;3813:15;;;;3787:2;3772:18;;;3561:4;3856:169;3870:6;3867:1;3864:13;3856:169;;;3931:13;;3919:26;;4000:15;;;;3965:12;;;;3892:1;3885:9;3856:169;;;-1:-1:-1;4042:3:1;;3419:632;-1:-1:-1;;;;;;3419:632:1:o;4056:127::-;4117:10;4112:3;4108:20;4105:1;4098:31;4148:4;4145:1;4138:15;4172:4;4169:1;4162:15;4188:632;4253:5;4283:18;4324:2;4316:6;4313:14;4310:40;;;4330:18;;:::i;:::-;4405:2;4399:9;4373:2;4459:15;;-1:-1:-1;;4455:24:1;;;4481:2;4451:33;4447:42;4435:55;;;4505:18;;;4525:22;;;4502:46;4499:72;;;4551:18;;:::i;:::-;4591:10;4587:2;4580:22;4620:6;4611:15;;4650:6;4642;4635:22;4690:3;4681:6;4676:3;4672:16;4669:25;4666:45;;;4707:1;4704;4697:12;4666:45;4757:6;4752:3;4745:4;4737:6;4733:17;4720:44;4812:1;4805:4;4796:6;4788;4784:19;4780:30;4773:41;;;;4188:632;;;;;:::o;4825:451::-;4894:6;4947:2;4935:9;4926:7;4922:23;4918:32;4915:52;;;4963:1;4960;4953:12;4915:52;5003:9;4990:23;5036:18;5028:6;5025:30;5022:50;;;5068:1;5065;5058:12;5022:50;5091:22;;5144:4;5136:13;;5132:27;-1:-1:-1;5122:55:1;;5173:1;5170;5163:12;5122:55;5196:74;5262:7;5257:2;5244:16;5239:2;5235;5231:11;5196:74;:::i;5463:254::-;5528:6;5536;5589:2;5577:9;5568:7;5564:23;5560:32;5557:52;;;5605:1;5602;5595:12;5557:52;5628:29;5647:9;5628:29;:::i;:::-;5618:39;;5676:35;5707:2;5696:9;5692:18;5676:35;:::i;:::-;5666:45;;5463:254;;;;;:::o;5722:683::-;5817:6;5825;5833;5886:2;5874:9;5865:7;5861:23;5857:32;5854:52;;;5902:1;5899;5892:12;5854:52;5938:9;5925:23;5915:33;;5999:2;5988:9;5984:18;5971:32;6022:18;6063:2;6055:6;6052:14;6049:34;;;6079:1;6076;6069:12;6049:34;6117:6;6106:9;6102:22;6092:32;;6162:7;6155:4;6151:2;6147:13;6143:27;6133:55;;6184:1;6181;6174:12;6133:55;6224:2;6211:16;6250:2;6242:6;6239:14;6236:34;;;6266:1;6263;6256:12;6236:34;6319:7;6314:2;6304:6;6301:1;6297:14;6293:2;6289:23;6285:32;6282:45;6279:65;;;6340:1;6337;6330:12;6279:65;6371:2;6367;6363:11;6353:21;;6393:6;6383:16;;;;;5722:683;;;;;:::o;6410:667::-;6505:6;6513;6521;6529;6582:3;6570:9;6561:7;6557:23;6553:33;6550:53;;;6599:1;6596;6589:12;6550:53;6622:29;6641:9;6622:29;:::i;:::-;6612:39;;6670:38;6704:2;6693:9;6689:18;6670:38;:::i;:::-;6660:48;;6755:2;6744:9;6740:18;6727:32;6717:42;;6810:2;6799:9;6795:18;6782:32;6837:18;6829:6;6826:30;6823:50;;;6869:1;6866;6859:12;6823:50;6892:22;;6945:4;6937:13;;6933:27;-1:-1:-1;6923:55:1;;6974:1;6971;6964:12;6923:55;6997:74;7063:7;7058:2;7045:16;7040:2;7036;7032:11;6997:74;:::i;:::-;6987:84;;;6410:667;;;;;;;:::o;7082:254::-;7150:6;7158;7211:2;7199:9;7190:7;7186:23;7182:32;7179:52;;;7227:1;7224;7217:12;7179:52;7263:9;7250:23;7240:33;;7292:38;7326:2;7315:9;7311:18;7292:38;:::i;7341:260::-;7409:6;7417;7470:2;7458:9;7449:7;7445:23;7441:32;7438:52;;;7486:1;7483;7476:12;7438:52;7509:29;7528:9;7509:29;:::i;:::-;7499:39;;7557:38;7591:2;7580:9;7576:18;7557:38;:::i;7606:380::-;7685:1;7681:12;;;;7728;;;7749:61;;7803:4;7795:6;7791:17;7781:27;;7749:61;7856:2;7848:6;7845:14;7825:18;7822:38;7819:161;;7902:10;7897:3;7893:20;7890:1;7883:31;7937:4;7934:1;7927:15;7965:4;7962:1;7955:15;7819:161;;7606:380;;;:::o;7991:356::-;8193:2;8175:21;;;8212:18;;;8205:30;8271:34;8266:2;8251:18;;8244:62;8338:2;8323:18;;7991:356::o;8352:355::-;8554:2;8536:21;;;8593:2;8573:18;;;8566:30;8632:33;8627:2;8612:18;;8605:61;8698:2;8683:18;;8352:355::o;8712:338::-;8914:2;8896:21;;;8953:2;8933:18;;;8926:30;-1:-1:-1;;;8987:2:1;8972:18;;8965:44;9041:2;9026:18;;8712:338::o;9407:127::-;9468:10;9463:3;9459:20;9456:1;9449:31;9499:4;9496:1;9489:15;9523:4;9520:1;9513:15;9539:128;9606:9;;;9627:11;;;9624:37;;;9641:18;;:::i;9672:125::-;9737:9;;;9758:10;;;9755:36;;;9771:18;;:::i;9802:401::-;10004:2;9986:21;;;10043:2;10023:18;;;10016:30;10082:34;10077:2;10062:18;;10055:62;-1:-1:-1;;;10148:2:1;10133:18;;10126:35;10193:3;10178:19;;9802:401::o;10208:344::-;10410:2;10392:21;;;10449:2;10429:18;;;10422:30;-1:-1:-1;;;10483:2:1;10468:18;;10461:50;10543:2;10528:18;;10208:344::o;10557:168::-;10597:7;10663:1;10659;10655:6;10651:14;10648:1;10645:21;10640:1;10633:9;10626:17;10622:45;10619:71;;;10670:18;;:::i;:::-;-1:-1:-1;10710:9:1;;10557:168::o;10730:345::-;10932:2;10914:21;;;10971:2;10951:18;;;10944:30;-1:-1:-1;;;11005:2:1;10990:18;;10983:51;11066:2;11051:18;;10730:345::o;11290:127::-;11351:10;11346:3;11342:20;11339:1;11332:31;11382:4;11379:1;11372:15;11406:4;11403:1;11396:15;11422:135;11461:3;11482:17;;;11479:43;;11502:18;;:::i;:::-;-1:-1:-1;11549:1:1;11538:13;;11422:135::o;11688:545::-;11790:2;11785:3;11782:11;11779:448;;;11826:1;11851:5;11847:2;11840:17;11896:4;11892:2;11882:19;11966:2;11954:10;11950:19;11947:1;11943:27;11937:4;11933:38;12002:4;11990:10;11987:20;11984:47;;;-1:-1:-1;12025:4:1;11984:47;12080:2;12075:3;12071:12;12068:1;12064:20;12058:4;12054:31;12044:41;;12135:82;12153:2;12146:5;12143:13;12135:82;;;12198:17;;;12179:1;12168:13;12135:82;;;12139:3;;;11688:545;;;:::o;12409:1352::-;12535:3;12529:10;12562:18;12554:6;12551:30;12548:56;;;12584:18;;:::i;:::-;12613:97;12703:6;12663:38;12695:4;12689:11;12663:38;:::i;:::-;12657:4;12613:97;:::i;:::-;12765:4;;12829:2;12818:14;;12846:1;12841:663;;;;13548:1;13565:6;13562:89;;;-1:-1:-1;13617:19:1;;;13611:26;13562:89;-1:-1:-1;;12366:1:1;12362:11;;;12358:24;12354:29;12344:40;12390:1;12386:11;;;12341:57;13664:81;;12811:944;;12841:663;11635:1;11628:14;;;11672:4;11659:18;;-1:-1:-1;;12877:20:1;;;12995:236;13009:7;13006:1;13003:14;12995:236;;;13098:19;;;13092:26;13077:42;;13190:27;;;;13158:1;13146:14;;;;13025:19;;12995:236;;;12999:3;13259:6;13250:7;13247:19;13244:201;;;13320:19;;;13314:26;-1:-1:-1;;13403:1:1;13399:14;;;13415:3;13395:24;13391:37;13387:42;13372:58;13357:74;;13244:201;-1:-1:-1;;;;;13491:1:1;13475:14;;;13471:22;13458:36;;-1:-1:-1;12409:1352:1:o;13766:398::-;13968:2;13950:21;;;14007:2;13987:18;;;13980:30;14046:34;14041:2;14026:18;;14019:62;-1:-1:-1;;;14112:2:1;14097:18;;14090:32;14154:3;14139:19;;13766:398::o;15529:1187::-;15806:3;15835:1;15868:6;15862:13;15898:36;15924:9;15898:36;:::i;:::-;15953:1;15970:18;;;15997:133;;;;16144:1;16139:356;;;;15963:532;;15997:133;-1:-1:-1;;16030:24:1;;16018:37;;16103:14;;16096:22;16084:35;;16075:45;;;-1:-1:-1;15997:133:1;;16139:356;16170:6;16167:1;16160:17;16200:4;16245:2;16242:1;16232:16;16270:1;16284:165;16298:6;16295:1;16292:13;16284:165;;;16376:14;;16363:11;;;16356:35;16419:16;;;;16313:10;;16284:165;;;16288:3;;;16478:6;16473:3;16469:16;16462:23;;15963:532;;;;;16526:6;16520:13;16542:68;16601:8;16596:3;16589:4;16581:6;16577:17;16542:68;:::i;:::-;-1:-1:-1;;;16632:18:1;;16659:22;;;16708:1;16697:13;;15529:1187;-1:-1:-1;;;;15529:1187:1:o;17483:489::-;-1:-1:-1;;;;;17752:15:1;;;17734:34;;17804:15;;17799:2;17784:18;;17777:43;17851:2;17836:18;;17829:34;;;17899:3;17894:2;17879:18;;17872:31;;;17677:4;;17920:46;;17946:19;;17938:6;17920:46;:::i;:::-;17912:54;17483:489;-1:-1:-1;;;;;;17483:489:1:o;17977:249::-;18046:6;18099:2;18087:9;18078:7;18074:23;18070:32;18067:52;;;18115:1;18112;18105:12;18067:52;18147:9;18141:16;18166:30;18190:5;18166:30;:::i;18231:127::-;18292:10;18287:3;18283:20;18280:1;18273:31;18323:4;18320:1;18313:15;18347:4;18344:1;18337:15;18363:120;18403:1;18429;18419:35;;18434:18;;:::i;:::-;-1:-1:-1;18468:9:1;;18363:120::o;18488:112::-;18520:1;18546;18536:35;;18551:18;;:::i;:::-;-1:-1:-1;18585:9:1;;18488:112::o

Swarm Source

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