ETH Price: $2,403.10 (-1.45%)

Token

RetirementClubBabies (RCB)
 

Overview

Max Total Supply

2,265 RCB

Holders

672

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
syrrius.eth
Balance
1 RCB
0x296988fc6602320a383013a37fe7b188e4adad0d
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:
RetirementClubBabies

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-31
*/

// File @openzeppelin/contracts/utils/introspection/[email protected]


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

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


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

pragma solidity ^0.8.0;

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

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

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


// File erc721a/contracts/[email protected]


// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;


/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A is IERC721, IERC721Metadata {
    /**
     * 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();

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

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

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


// File @openzeppelin/contracts/token/ERC721/[email protected]


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

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/utils/[email protected]


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]


// 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/utils/[email protected]


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

pragma solidity ^0.8.0;

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

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

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

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

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


// File @openzeppelin/contracts/utils/introspection/[email protected]


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

pragma solidity ^0.8.0;

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


// File erc721a/contracts/[email protected]


// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;






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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract()) 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 && !_ownerships[tokenId].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 {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

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

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

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

    /**
     * @dev 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 {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

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

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

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

        address from = prevOwnership.addr;

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/cryptography/[email protected]


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

        return (signer, RecoverError.NoError);
    }

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

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

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

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


// File @openzeppelin/contracts/token/ERC20/[email protected]


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}


// File @openzeppelin/contracts/token/ERC20/utils/[email protected]


// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;


/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}


// File @openzeppelin/contracts/finance/[email protected]


// OpenZeppelin Contracts v4.4.1 (finance/PaymentSplitter.sol)

pragma solidity ^0.8.0;



/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 *
 * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and
 * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you
 * to run tests before sending real value to this contract.
 */
contract PaymentSplitter is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    mapping(IERC20 => uint256) private _erc20TotalReleased;
    mapping(IERC20 => mapping(address => uint256)) private _erc20Released;

    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor(address[] memory payees, uint256[] memory shares_) payable {
        require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }

    /**
     * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20
     * contract.
     */
    function totalReleased(IERC20 token) public view returns (uint256) {
        return _erc20TotalReleased[token];
    }

    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }

    /**
     * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an
     * IERC20 contract.
     */
    function released(IERC20 token, address account) public view returns (uint256) {
        return _erc20Released[token][account];
    }

    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address payable account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = address(this).balance + totalReleased();
        uint256 payment = _pendingPayment(account, totalReceived, released(account));

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _released[account] += payment;
        _totalReleased += payment;

        Address.sendValue(account, payment);
        emit PaymentReleased(account, payment);
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their
     * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20
     * contract.
     */
    function release(IERC20 token, address account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token);
        uint256 payment = _pendingPayment(account, totalReceived, released(token, account));

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _erc20Released[token][account] += payment;
        _erc20TotalReleased[token] += payment;

        SafeERC20.safeTransfer(token, account, payment);
        emit ERC20PaymentReleased(token, account, payment);
    }

    /**
     * @dev internal logic for computing the pending payment of an `account` given the token historical balances and
     * already released amounts.
     */
    function _pendingPayment(
        address account,
        uint256 totalReceived,
        uint256 alreadyReleased
    ) private view returns (uint256) {
        return (totalReceived * _shares[account]) / _totalShares - alreadyReleased;
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) private {
        require(account != address(0), "PaymentSplitter: account is the zero address");
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        require(_shares[account] == 0, "PaymentSplitter: account already has shares");

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}


// File @openzeppelin/contracts/security/[email protected]


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

pragma solidity ^0.8.0;

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

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

    bool private _paused;

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

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

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

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

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

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


// File @openzeppelin/contracts/access/[email protected]


// 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 contracts/RetirementClubBabies.sol

//SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.14;





contract RetirementClubBabies is ERC721A, Ownable, PaymentSplitter, Pausable {
    using Strings for uint256;
    using ECDSA for bytes32;

    uint256 public constant price = 0.1 ether;

    uint256 public maxSupply = 5000; // To be updated;
    uint256 public maxMintablePaying = 2;

    address private whitelistAddress =
        0xc8d57D1405CAE581B403236919D1d6d20196647d;

    uint256 public saleStart = 1654020000;

    bool saleEnded = false;

    mapping(address => bool) public freemintClaimed;
    mapping(address => uint256) public tokensMinted;


    //Base uri for metadatas, used only after reveal
    string public baseURI;

    //uri for metadatas pre-reveal
    string public notRevealedUri;

    //Indicates if NFTs have been revealed
    bool public revealed = false;

    address[] private team_ = [
        0x7A3ee2FB91d836adE7d7D43c76cA82a7CC59fAC1,
        0x76299b8be5bA5723cF4C60fc41C76Df30E094922,
        0xbC3773c74ec532a517c8cb61A6F901A5dA591422
    ];
    uint256[] private teamShares_ = [50, 48, 2];
        
    constructor() ERC721A("RetirementClubBabies", "RCB") PaymentSplitter(team_, teamShares_) {
        _safeMint(msg.sender, 1); // For OpenSea configuration
        setNotRevealedURI("ipfs://QmX1j4GTRdq8gaaELXT4VnFVwybND9wjw4J71bsrd68ipt");
    }

    //Reveal the NFTs. Calling the function multiple time does not affect the metadatas
    function reveal() public onlyOwner {
        revealed = true;
    }

    //Change the uri for pre-reveal
    function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
        notRevealedUri = _notRevealedURI;
    }

    //Change the uri post reveal. Will be used when robbers go on robberies
    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    //Change address that needs to sign message
    function setWhitelistAddress(address _newAddress) public onlyOwner {
        require(_newAddress != address(0), "CAN'T PUT 0 ADDRESS");
        whitelistAddress = _newAddress;
    }

    //Set Max supply for this sale
    function setMaxSupply(uint256 _maxSupply) public onlyOwner {
        maxSupply = _maxSupply;
    }

    //Pause the contract in case of an emergency
    function pause() external onlyOwner {
        _pause();
    }

    //Unpause the contract
    function unpause() external onlyOwner {
        _unpause();
    }

    //Update the sale start
    function setSaleStart(uint256 _newSaleStart) external onlyOwner {
        saleStart = _newSaleStart;
    }

    //End the sale forever
    function endSale() external onlyOwner {
        saleEnded = true;
    }

    /**
     * @dev Verifies that a message has been signed by a reference address
     * @param referenceAddress The reference address
     * @param messageHash The hashed message
     * @param signature The signature of that hashed message
     */
    function verifyAddressSigner(
        address referenceAddress,
        bytes32 messageHash,
        bytes memory signature
    ) internal pure returns (bool) {
        return
            referenceAddress ==
            messageHash.toEthSignedMessageHash().recover(signature); //Recovers the signature and returns true if the referenceAddress has signed messageHash producing signature
    }

    /**
     * @dev Hash a the message needed to mint
     * @param max The maximum of amount the address is allowed to mint
     * @param sender The actual sender of the transactio
     */
    function hashMessage(uint256 max, address sender)
        private
        pure
        returns (bytes32)
    {
        return keccak256(abi.encode(max, sender));
    }

    /**
     * @dev Performs a freeMint (or whitelisted mint). Access to the whitelist is verified with a signed message from `whitelistAddress`
     * @notice As the mint is free and we are using ERC721A, we force users to mint their max amount possible.
     */
    function freeMint(uint256 max, bytes calldata signature)
        external
        payable
        whenNotPaused
    {
        require(!saleEnded, "Sale is ended");
        require(
            saleStart > 0 && block.timestamp >= saleStart,
            "Whitelist mint is not started yet!"
        );
        require(
            !freemintClaimed[msg.sender],
            "You have already claimed your Freemint"
        );
        require(
            verifyAddressSigner(
                whitelistAddress,
                hashMessage(max, msg.sender),
                signature
            ),
            "SIGNATURE_VALIDATION_FAILED"
        );
        require(totalSupply() + max <= maxSupply, "SOLD OUT!");

        freemintClaimed[msg.sender] = true;

        _safeMint(msg.sender, max);
    }

    /**
     * @dev Performs a paying mint. Access to the whitelist is verified with a signed message from `whitelistAddress`
     * @notice Users on the whitelist can buy up to 2 tokens
     */
    function payingMint(
        uint256 amount,
        uint256 max,
        bytes calldata signature
    ) external payable whenNotPaused {
        require(!saleEnded, "Sale is ended");
        require(
            saleStart > 0 && block.timestamp >= saleStart,
            "Sale not started."
        );
        // Checking is msg.sender is on the WL
        require(
            verifyAddressSigner(
                whitelistAddress,
                hashMessage(max, msg.sender),
                signature
            ),
            "SIGNATURE_VALIDATION_FAILED"
        );
        require(
            tokensMinted[msg.sender] + amount <= maxMintablePaying,
            "You can't mint more NFTs"
        );
        require(amount > 0, "You must mint at least one NFT.");
        require(totalSupply() + amount <= maxSupply, "Sold out!");
        require(msg.value >= price * amount, "Insuficient funds");

        tokensMinted[msg.sender] += amount;

        _safeMint(msg.sender, amount);
    }

    function aidrop(address to, uint256 quantity) external onlyOwner {
        require(
            quantity + totalSupply() <= maxSupply,
            "You can't mint more NFTs"
        );

        _safeMint(to, quantity);
    }

    function airdropBatch(
        address[] calldata targets,
        uint256[] calldata quantities
    ) external onlyOwner {
        require(targets.length == quantities.length, "Length mismatch");

        uint256 totalQuantity = 0;

        for (uint256 i = 0; i < quantities.length; i++) {
            totalQuantity += quantities[i];
        }

        require(
            totalQuantity + totalSupply() <= maxSupply,
            "You can't mint more NFTs"
        );

        for (uint256 i = 0; i < quantities.length; i++) {
            _safeMint(targets[i], quantities[i]);
        }
    }

        /**
     * @dev This function override the base tokenURI function to manage the revealed state.
     * @dev When the NFTs are not revealed they all have the same URI. When they are revealed the URI is formed as : `baseURI/tokenId`
     *
     */
    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721A)
        returns (string memory)
    {
        if (revealed == false) {
            return notRevealedUri;
        }

        string memory currentBaseURI = baseURI;
        return
            bytes(currentBaseURI).length > 0
                ? string(abi.encodePacked(currentBaseURI, tokenId.toString()))
                : "";
    }
}

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":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"aidrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"uint256[]","name":"quantities","type":"uint256[]"}],"name":"airdropBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"max","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"freeMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freemintClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintablePaying","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","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":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"payingMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","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":[],"name":"saleStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newSaleStart","type":"uint256"}],"name":"setSaleStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"setWhitelistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokensMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6113886011556002601255601380546001600160a01b03191673c8d57d1405cae581b403236919d1d6d20196647d17905563629657a06014556015805460ff19908116909155601a8054909116905560e0604052737a3ee2fb91d836ade7d7d43c76ca82a7cc59fac160809081527376299b8be5ba5723cf4c60fc41c76df30e09492260a05273bc3773c74ec532a517c8cb61a6f901a5da59142260c052620000ad90601b9060036200093d565b50604080516060810182526032815260306020820152600291810191909152620000dc90601c906003620009a7565b50348015620000ea57600080fd5b50601b8054806020026020016040519081016040528092919081815260200182805480156200014357602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831162000124575b5050505050601c8054806020026020016040519081016040528092919081815260200182805480156200019657602002820191906000526020600020905b81548152602001906001019080831162000181575b5050604080518082018252601481527f5265746972656d656e74436c75624261626965730000000000000000000000006020808301918252835180850190945260038452622921a160e91b908401528151919550919350620001fd925060029190620009ea565b50805162000213906003906020840190620009ea565b5050600080555062000225336200039a565b8051825114620002975760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b60648201526084015b60405180910390fd5b6000825111620002ea5760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f2070617965657300000000000060448201526064016200028e565b60005b825181101562000356576200034183828151811062000310576200031062000a7e565b60200260200101518383815181106200032d576200032d62000a7e565b6020026020010151620003ec60201b60201c565b806200034d8162000aaa565b915050620002ed565b50506010805460ff191690555062000370336001620005da565b62000394604051806060016040528060358152602001620040c26035913962000600565b62000bcb565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620004595760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b60648201526084016200028e565b60008111620004ab5760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a2073686172657320617265203000000060448201526064016200028e565b6001600160a01b0382166000908152600b602052604090205415620005275760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b60648201526084016200028e565b600d8054600181019091557fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180546001600160a01b0319166001600160a01b0384169081179091556000908152600b602052604090208190556009546200059190829062000ac6565b600955604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b620005fc8282604051806020016040528060008152506200067160201b60201c565b5050565b6008546001600160a01b031633146200065c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200028e565b8051620005fc906019906020840190620009ea565b6000546001600160a01b0384166200069b57604051622e076360e81b815260040160405180910390fd5b82600003620006bd5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260056020908152604080832080546001600160801b031981166001600160401b038083168b018116918217680100000000000000006001600160401b031990941690921783900481168b0181169092021790915585845260048352922080546001600160e01b0319168417600160a01b4290941693909302929092179091558291828601916200076691906200083a811b62001b8217901c565b15620007e5575b60405182906001600160a01b03881690600090600080516020620040f7833981519152908290a46001820191620007aa9060009088908762000849565b620007c8576040516368d2bf6b60e11b815260040160405180910390fd5b8082106200076d578260005414620007df57600080fd5b6200081a565b5b6040516001830192906001600160a01b03881690600090600080516020620040f7833981519152908290a4808210620007e6575b50600090815562000834908583866001600160e01b038516565b50505050565b6001600160a01b03163b151590565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906200088090339089908890889060040162000ae1565b6020604051808303816000875af1925050508015620008be575060408051601f3d908101601f19168201909252620008bb9181019062000b5c565b60015b62000920573d808015620008ef576040519150601f19603f3d011682016040523d82523d6000602084013e620008f4565b606091505b50805160000362000918576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b82805482825590600052602060002090810192821562000995579160200282015b828111156200099557825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906200095e565b50620009a392915062000a67565b5090565b82805482825590600052602060002090810192821562000995579160200282015b8281111562000995578251829060ff16905591602001919060010190620009c8565b828054620009f89062000b8f565b90600052602060002090601f01602090048101928262000a1c576000855562000995565b82601f1062000a3757805160ff191683800117855562000995565b8280016001018555821562000995579182015b828111156200099557825182559160200191906001019062000a4a565b5b80821115620009a3576000815560010162000a68565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820162000abf5762000abf62000a94565b5060010190565b6000821982111562000adc5762000adc62000a94565b500190565b600060018060a01b038087168352602081871681850152856040850152608060608501528451915081608085015260005b8281101562000b305785810182015185820160a00152810162000b12565b8281111562000b4357600060a084870101525b5050601f01601f19169190910160a00195945050505050565b60006020828403121562000b6f57600080fd5b81516001600160e01b03198116811462000b8857600080fd5b9392505050565b600181811c9082168062000ba457607f821691505b60208210810362000bc557634e487b7160e01b600052602260045260246000fd5b50919050565b6134e78062000bdb6000396000f3fe6080604052600436106102b25760003560e01c80636f8b44b011610175578063a22cb465116100dc578063d5abeb0111610095578063e33b7de31161006f578063e33b7de3146108ae578063e985e9c5146108c3578063f2c4ce1e1461090c578063f2fde38b1461092c57600080fd5b8063d5abeb011461084f578063d60dabdc14610865578063d79779b21461087857600080fd5b8063a22cb4651461078e578063a475b5dd146107ae578063ab0bcc41146107c3578063b88d4fde146107d9578063c87b56dd146107f9578063ce7c2ac21461081957600080fd5b80638b83209b1161012e5780638b83209b146106c95780638da5cb5b146106e957806395d89b41146107075780639852595c1461071c578063a035b1fe14610752578063a224c7451461076e57600080fd5b80636f8b44b01461062c57806370a082311461064c578063715018a61461066c578063817415c4146106815780638456cb59146106945780638a9c2d65146106a957600080fd5b80633a98ef391161021957806351830227116101d25780635183022714610578578063546104811461059257806355f804b3146105bf5780635c975abb146105df5780636352211e146105f75780636c0360eb1461061757600080fd5b80633a98ef39146104985780633f4ba83a146104ad578063406072a9146104c257806342842e0e1461050857806348b75044146105285780635117dbde1461054857600080fd5b80630a6ca4c41161026b5780630a6ca4c4146103ea57806318160ddd1461040a578063191655871461042357806323b872dd146104435780632f181f5414610463578063380d831b1461048357600080fd5b806301ffc9a71461030057806305f4f73e1461033557806306fdde0314610359578063081812fc1461037b578063081c8c44146103b3578063095ea7b3146103c857600080fd5b366102fb577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561030c57600080fd5b5061032061031b366004612d06565b61094c565b60405190151581526020015b60405180910390f35b34801561034157600080fd5b5061034b60125481565b60405190815260200161032c565b34801561036557600080fd5b5061036e61099e565b60405161032c9190612d7b565b34801561038757600080fd5b5061039b610396366004612d8e565b610a30565b6040516001600160a01b03909116815260200161032c565b3480156103bf57600080fd5b5061036e610a74565b3480156103d457600080fd5b506103e86103e3366004612dbc565b610b02565b005b3480156103f657600080fd5b506103e8610405366004612dbc565b610b88565b34801561041657600080fd5b506001546000540361034b565b34801561042f57600080fd5b506103e861043e366004612de8565b610bfb565b34801561044f57600080fd5b506103e861045e366004612e05565b610d2c565b34801561046f57600080fd5b506103e861047e366004612d8e565b610d37565b34801561048f57600080fd5b506103e8610d66565b3480156104a457600080fd5b5060095461034b565b3480156104b957600080fd5b506103e8610d9f565b3480156104ce57600080fd5b5061034b6104dd366004612e46565b6001600160a01b039182166000908152600f6020908152604080832093909416825291909152205490565b34801561051457600080fd5b506103e8610523366004612e05565b610dd3565b34801561053457600080fd5b506103e8610543366004612e46565b610dee565b34801561055457600080fd5b50610320610563366004612de8565b60166020526000908152604090205460ff1681565b34801561058457600080fd5b50601a546103209060ff1681565b34801561059e57600080fd5b5061034b6105ad366004612de8565b60176020526000908152604090205481565b3480156105cb57600080fd5b506103e86105da366004612f0a565b610fca565b3480156105eb57600080fd5b5060105460ff16610320565b34801561060357600080fd5b5061039b610612366004612d8e565b611007565b34801561062357600080fd5b5061036e611019565b34801561063857600080fd5b506103e8610647366004612d8e565b611026565b34801561065857600080fd5b5061034b610667366004612de8565b611055565b34801561067857600080fd5b506103e86110a3565b6103e861068f366004612f93565b6110d7565b3480156106a057600080fd5b506103e8611332565b3480156106b557600080fd5b506103e86106c4366004613022565b611364565b3480156106d557600080fd5b5061039b6106e4366004612d8e565b6114b3565b3480156106f557600080fd5b506008546001600160a01b031661039b565b34801561071357600080fd5b5061036e6114e3565b34801561072857600080fd5b5061034b610737366004612de8565b6001600160a01b03166000908152600c602052604090205490565b34801561075e57600080fd5b5061034b67016345785d8a000081565b34801561077a57600080fd5b506103e8610789366004612de8565b6114f2565b34801561079a57600080fd5b506103e86107a936600461309b565b61158a565b3480156107ba57600080fd5b506103e861161f565b3480156107cf57600080fd5b5061034b60145481565b3480156107e557600080fd5b506103e86107f43660046130c9565b611658565b34801561080557600080fd5b5061036e610814366004612d8e565b6116a2565b34801561082557600080fd5b5061034b610834366004612de8565b6001600160a01b03166000908152600b602052604090205490565b34801561085b57600080fd5b5061034b60115481565b6103e8610873366004613148565b611825565b34801561088457600080fd5b5061034b610893366004612de8565b6001600160a01b03166000908152600e602052604090205490565b3480156108ba57600080fd5b50600a5461034b565b3480156108cf57600080fd5b506103206108de366004612e46565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561091857600080fd5b506103e8610927366004612f0a565b611aaa565b34801561093857600080fd5b506103e8610947366004612de8565b611ae7565b60006001600160e01b031982166380ac58cd60e01b148061097d57506001600160e01b03198216635b5e139f60e01b145b8061099857506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600280546109ad9061318e565b80601f01602080910402602001604051908101604052809291908181526020018280546109d99061318e565b8015610a265780601f106109fb57610100808354040283529160200191610a26565b820191906000526020600020905b815481529060010190602001808311610a0957829003601f168201915b5050505050905090565b6000610a3b82611b91565b610a58576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60198054610a819061318e565b80601f0160208091040260200160405190810160405280929190818152602001828054610aad9061318e565b8015610afa5780601f10610acf57610100808354040283529160200191610afa565b820191906000526020600020905b815481529060010190602001808311610add57829003601f168201915b505050505081565b6000610b0d82611007565b9050806001600160a01b0316836001600160a01b031603610b415760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610b7857610b5b81336108de565b610b78576040516367d9dca160e11b815260040160405180910390fd5b610b83838383611bbc565b505050565b6008546001600160a01b03163314610bbb5760405162461bcd60e51b8152600401610bb2906131c8565b60405180910390fd5b60115460015460005403610bcf9083613213565b1115610bed5760405162461bcd60e51b8152600401610bb29061322b565b610bf78282611c18565b5050565b6001600160a01b0381166000908152600b6020526040902054610c305760405162461bcd60e51b8152600401610bb290613262565b6000610c3b600a5490565b610c459047613213565b90506000610c728383610c6d866001600160a01b03166000908152600c602052604090205490565b611c32565b905080600003610c945760405162461bcd60e51b8152600401610bb2906132a8565b6001600160a01b0383166000908152600c602052604081208054839290610cbc908490613213565b9250508190555080600a6000828254610cd59190613213565b90915550610ce590508382611c78565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b610b83838383611d91565b6008546001600160a01b03163314610d615760405162461bcd60e51b8152600401610bb2906131c8565b601455565b6008546001600160a01b03163314610d905760405162461bcd60e51b8152600401610bb2906131c8565b6015805460ff19166001179055565b6008546001600160a01b03163314610dc95760405162461bcd60e51b8152600401610bb2906131c8565b610dd1611f7e565b565b610b8383838360405180602001604052806000815250611658565b6001600160a01b0381166000908152600b6020526040902054610e235760405162461bcd60e51b8152600401610bb290613262565b6001600160a01b0382166000908152600e60205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa158015610e80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea491906132f3565b610eae9190613213565b90506000610ee78383610c6d87876001600160a01b039182166000908152600f6020908152604080832093909416825291909152205490565b905080600003610f095760405162461bcd60e51b8152600401610bb2906132a8565b6001600160a01b038085166000908152600f6020908152604080832093871683529290529081208054839290610f40908490613213565b90915550506001600160a01b0384166000908152600e602052604081208054839290610f6d908490613213565b90915550610f7e9050848483612011565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b6008546001600160a01b03163314610ff45760405162461bcd60e51b8152600401610bb2906131c8565b8051610bf7906018906020840190612c57565b600061101282612063565b5192915050565b60188054610a819061318e565b6008546001600160a01b031633146110505760405162461bcd60e51b8152600401610bb2906131c8565b601155565b60006001600160a01b03821661107e576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b031633146110cd5760405162461bcd60e51b8152600401610bb2906131c8565b610dd1600061217d565b60105460ff16156110fa5760405162461bcd60e51b8152600401610bb29061330c565b60155460ff161561113d5760405162461bcd60e51b815260206004820152600d60248201526c14d85b19481a5cc8195b991959609a1b6044820152606401610bb2565b600060145411801561115157506014544210155b6111a85760405162461bcd60e51b815260206004820152602260248201527f57686974656c697374206d696e74206973206e6f742073746172746564207965604482015261742160f01b6064820152608401610bb2565b3360009081526016602052604090205460ff16156112175760405162461bcd60e51b815260206004820152602660248201527f596f75206861766520616c726561647920636c61696d656420796f757220467260448201526519595b5a5b9d60d21b6064820152608401610bb2565b60135461126d906001600160a01b031661123185336121cf565b84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061221492505050565b6112b95760405162461bcd60e51b815260206004820152601b60248201527f5349474e41545552455f56414c49444154494f4e5f4641494c454400000000006044820152606401610bb2565b601154836112ca6001546000540390565b6112d49190613213565b111561130e5760405162461bcd60e51b8152602060048201526009602482015268534f4c44204f55542160b81b6044820152606401610bb2565b336000818152601660205260409020805460ff19166001179055610b839084611c18565b6008546001600160a01b0316331461135c5760405162461bcd60e51b8152600401610bb2906131c8565b610dd1612294565b6008546001600160a01b0316331461138e5760405162461bcd60e51b8152600401610bb2906131c8565b8281146113cf5760405162461bcd60e51b815260206004820152600f60248201526e098cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610bb2565b6000805b82811015611413578383828181106113ed576113ed613336565b90506020020135826113ff9190613213565b91508061140b8161334c565b9150506113d3565b50601154600154600054036114289083613213565b11156114465760405162461bcd60e51b8152600401610bb29061322b565b60005b828110156114ab5761149986868381811061146657611466613336565b905060200201602081019061147b9190612de8565b85858481811061148d5761148d613336565b90506020020135611c18565b806114a38161334c565b915050611449565b505050505050565b6000600d82815481106114c8576114c8613336565b6000918252602090912001546001600160a01b031692915050565b6060600380546109ad9061318e565b6008546001600160a01b0316331461151c5760405162461bcd60e51b8152600401610bb2906131c8565b6001600160a01b0381166115685760405162461bcd60e51b815260206004820152601360248201527243414e2754205055542030204144445245535360681b6044820152606401610bb2565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b336001600160a01b038316036115b35760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b031633146116495760405162461bcd60e51b8152600401610bb2906131c8565b601a805460ff19166001179055565b611663848484611d91565b6001600160a01b0383163b1561169c5761167f848484846122ec565b61169c576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b601a5460609060ff16151560000361174657601980546116c19061318e565b80601f01602080910402602001604051908101604052809291908181526020018280546116ed9061318e565b801561173a5780601f1061170f5761010080835404028352916020019161173a565b820191906000526020600020905b81548152906001019060200180831161171d57829003601f168201915b50505050509050919050565b6000601880546117559061318e565b80601f01602080910402602001604051908101604052809291908181526020018280546117819061318e565b80156117ce5780601f106117a3576101008083540402835291602001916117ce565b820191906000526020600020905b8154815290600101906020018083116117b157829003601f168201915b5050505050905060008151116117f3576040518060200160405280600081525061181e565b806117fd846123d7565b60405160200161180e929190613365565b6040516020818303038152906040525b9392505050565b60105460ff16156118485760405162461bcd60e51b8152600401610bb29061330c565b60155460ff161561188b5760405162461bcd60e51b815260206004820152600d60248201526c14d85b19481a5cc8195b991959609a1b6044820152606401610bb2565b600060145411801561189f57506014544210155b6118df5760405162461bcd60e51b815260206004820152601160248201527029b0b632903737ba1039ba30b93a32b21760791b6044820152606401610bb2565b6013546118f9906001600160a01b031661123185336121cf565b6119455760405162461bcd60e51b815260206004820152601b60248201527f5349474e41545552455f56414c49444154494f4e5f4641494c454400000000006044820152606401610bb2565b60125433600090815260176020526040902054611963908690613213565b11156119815760405162461bcd60e51b8152600401610bb29061322b565b600084116119d15760405162461bcd60e51b815260206004820152601f60248201527f596f75206d757374206d696e74206174206c65617374206f6e65204e46542e006044820152606401610bb2565b601154846119e26001546000540390565b6119ec9190613213565b1115611a265760405162461bcd60e51b8152602060048201526009602482015268536f6c64206f75742160b81b6044820152606401610bb2565b611a388467016345785d8a0000613394565b341015611a7b5760405162461bcd60e51b8152602060048201526011602482015270496e737566696369656e742066756e647360781b6044820152606401610bb2565b3360009081526017602052604081208054869290611a9a908490613213565b9091555061169c90503385611c18565b6008546001600160a01b03163314611ad45760405162461bcd60e51b8152600401610bb2906131c8565b8051610bf7906019906020840190612c57565b6008546001600160a01b03163314611b115760405162461bcd60e51b8152600401610bb2906131c8565b6001600160a01b038116611b765760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bb2565b611b7f8161217d565b50565b6001600160a01b03163b151590565b6000805482108015610998575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610bf78282604051806020016040528060008152506124d7565b6009546001600160a01b0384166000908152600b602052604081205490918391611c5c9086613394565b611c6691906133c9565b611c7091906133dd565b949350505050565b80471015611cc85760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610bb2565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611d15576040519150601f19603f3d011682016040523d82523d6000602084013e611d1a565b606091505b5050905080610b835760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610bb2565b6000611d9c82612063565b9050836001600160a01b031681600001516001600160a01b031614611dd35760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611df15750611df185336108de565b80611e0c575033611e0184610a30565b6001600160a01b0316145b905080611e2c57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416611e5357604051633a954ecd60e21b815260040160405180910390fd5b611e5f60008487611bbc565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116611f33576000548214611f3357805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b60105460ff16611fc75760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610bb2565b6010805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610b8390849061269e565b60408051606081018252600080825260208201819052918101919091528160005481101561216457600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906121625780516001600160a01b0316156120f9579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff161515928101929092521561215d579392505050565b6120f9565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600082826040516020016121f69291909182526001600160a01b0316602082015260400190565b60405160208183030381529060405280519060200120905092915050565b600061227782612271856040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b90612770565b6001600160a01b0316846001600160a01b03161490509392505050565b60105460ff16156122b75760405162461bcd60e51b8152600401610bb29061330c565b6010805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611ff43390565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906123219033908990889088906004016133f4565b6020604051808303816000875af192505050801561235c575060408051601f3d908101601f1916820190925261235991810190613431565b60015b6123ba573d80801561238a576040519150601f19603f3d011682016040523d82523d6000602084013e61238f565b606091505b5080516000036123b2576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6060816000036123fe5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561242857806124128161334c565b91506124219050600a836133c9565b9150612402565b6000816001600160401b0381111561244257612442612e7f565b6040519080825280601f01601f19166020018201604052801561246c576020820181803683370190505b5090505b8415611c70576124816001836133dd565b915061248e600a8661344e565b612499906030613213565b60f81b8183815181106124ae576124ae613336565b60200101906001600160f81b031916908160001a9053506124d0600a866133c9565b9450612470565b6000546001600160a01b03841661250057604051622e076360e81b815260040160405180910390fd5b826000036125215760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600490925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15612649575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461261260008784806001019550876122ec565b61262f576040516368d2bf6b60e11b815260040160405180910390fd5b8082106125c757826000541461264457600080fd5b61268e565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821061264a575b50600090815561169c9085838684565b60006126f3826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166127949092919063ffffffff16565b805190915015610b8357808060200190518101906127119190613462565b610b835760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610bb2565b600080600061277f85856127a3565b9150915061278c81612811565b509392505050565b6060611c7084846000856129c7565b60008082516041036127d95760208301516040840151606085015160001a6127cd87828585612af8565b9450945050505061280a565b825160400361280257602083015160408401516127f7868383612be5565b93509350505061280a565b506000905060025b9250929050565b60008160048111156128255761282561347f565b0361282d5750565b60018160048111156128415761284161347f565b0361288e5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610bb2565b60028160048111156128a2576128a261347f565b036128ef5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610bb2565b60038160048111156129035761290361347f565b0361295b5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610bb2565b600481600481111561296f5761296f61347f565b03611b7f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610bb2565b606082471015612a285760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610bb2565b6001600160a01b0385163b612a7f5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610bb2565b600080866001600160a01b03168587604051612a9b9190613495565b60006040518083038185875af1925050503d8060008114612ad8576040519150601f19603f3d011682016040523d82523d6000602084013e612add565b606091505b5091509150612aed828286612c1e565b979650505050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612b2f5750600090506003612bdc565b8460ff16601b14158015612b4757508460ff16601c14155b15612b585750600090506004612bdc565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612bac573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612bd557600060019250925050612bdc565b9150600090505b94509492505050565b6000806001600160ff1b03831681612c0260ff86901c601b613213565b9050612c1087828885612af8565b935093505050935093915050565b60608315612c2d57508161181e565b825115612c3d5782518084602001fd5b8160405162461bcd60e51b8152600401610bb29190612d7b565b828054612c639061318e565b90600052602060002090601f016020900481019282612c855760008555612ccb565b82601f10612c9e57805160ff1916838001178555612ccb565b82800160010185558215612ccb579182015b82811115612ccb578251825591602001919060010190612cb0565b50612cd7929150612cdb565b5090565b5b80821115612cd75760008155600101612cdc565b6001600160e01b031981168114611b7f57600080fd5b600060208284031215612d1857600080fd5b813561181e81612cf0565b60005b83811015612d3e578181015183820152602001612d26565b8381111561169c5750506000910152565b60008151808452612d67816020860160208601612d23565b601f01601f19169290920160200192915050565b60208152600061181e6020830184612d4f565b600060208284031215612da057600080fd5b5035919050565b6001600160a01b0381168114611b7f57600080fd5b60008060408385031215612dcf57600080fd5b8235612dda81612da7565b946020939093013593505050565b600060208284031215612dfa57600080fd5b813561181e81612da7565b600080600060608486031215612e1a57600080fd5b8335612e2581612da7565b92506020840135612e3581612da7565b929592945050506040919091013590565b60008060408385031215612e5957600080fd5b8235612e6481612da7565b91506020830135612e7481612da7565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b0380841115612eaf57612eaf612e7f565b604051601f8501601f19908116603f01168101908282118183101715612ed757612ed7612e7f565b81604052809350858152868686011115612ef057600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612f1c57600080fd5b81356001600160401b03811115612f3257600080fd5b8201601f81018413612f4357600080fd5b611c7084823560208401612e95565b60008083601f840112612f6457600080fd5b5081356001600160401b03811115612f7b57600080fd5b60208301915083602082850101111561280a57600080fd5b600080600060408486031215612fa857600080fd5b8335925060208401356001600160401b03811115612fc557600080fd5b612fd186828701612f52565b9497909650939450505050565b60008083601f840112612ff057600080fd5b5081356001600160401b0381111561300757600080fd5b6020830191508360208260051b850101111561280a57600080fd5b6000806000806040858703121561303857600080fd5b84356001600160401b038082111561304f57600080fd5b61305b88838901612fde565b9096509450602087013591508082111561307457600080fd5b5061308187828801612fde565b95989497509550505050565b8015158114611b7f57600080fd5b600080604083850312156130ae57600080fd5b82356130b981612da7565b91506020830135612e748161308d565b600080600080608085870312156130df57600080fd5b84356130ea81612da7565b935060208501356130fa81612da7565b92506040850135915060608501356001600160401b0381111561311c57600080fd5b8501601f8101871361312d57600080fd5b61313c87823560208401612e95565b91505092959194509250565b6000806000806060858703121561315e57600080fd5b843593506020850135925060408501356001600160401b0381111561318257600080fd5b61308187828801612f52565b600181811c908216806131a257607f821691505b6020821081036131c257634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115613226576132266131fd565b500190565b60208082526018908201527f596f752063616e2774206d696e74206d6f7265204e4654730000000000000000604082015260600190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b60006020828403121561330557600080fd5b5051919050565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60006001820161335e5761335e6131fd565b5060010190565b60008351613377818460208801612d23565b83519083019061338b818360208801612d23565b01949350505050565b60008160001904831182151516156133ae576133ae6131fd565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826133d8576133d86133b3565b500490565b6000828210156133ef576133ef6131fd565b500390565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061342790830184612d4f565b9695505050505050565b60006020828403121561344357600080fd5b815161181e81612cf0565b60008261345d5761345d6133b3565b500690565b60006020828403121561347457600080fd5b815161181e8161308d565b634e487b7160e01b600052602160045260246000fd5b600082516134a7818460208701612d23565b919091019291505056fea264697066735822122033115997046f72aa1ac257761ad7bd8c78cd6a767fa2c842c4c970dd28d1434264736f6c634300080e0033697066733a2f2f516d58316a34475452647138676161454c585434566e46567779624e4439776a77344a3731627372643638697074ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef

Deployed Bytecode

0x6080604052600436106102b25760003560e01c80636f8b44b011610175578063a22cb465116100dc578063d5abeb0111610095578063e33b7de31161006f578063e33b7de3146108ae578063e985e9c5146108c3578063f2c4ce1e1461090c578063f2fde38b1461092c57600080fd5b8063d5abeb011461084f578063d60dabdc14610865578063d79779b21461087857600080fd5b8063a22cb4651461078e578063a475b5dd146107ae578063ab0bcc41146107c3578063b88d4fde146107d9578063c87b56dd146107f9578063ce7c2ac21461081957600080fd5b80638b83209b1161012e5780638b83209b146106c95780638da5cb5b146106e957806395d89b41146107075780639852595c1461071c578063a035b1fe14610752578063a224c7451461076e57600080fd5b80636f8b44b01461062c57806370a082311461064c578063715018a61461066c578063817415c4146106815780638456cb59146106945780638a9c2d65146106a957600080fd5b80633a98ef391161021957806351830227116101d25780635183022714610578578063546104811461059257806355f804b3146105bf5780635c975abb146105df5780636352211e146105f75780636c0360eb1461061757600080fd5b80633a98ef39146104985780633f4ba83a146104ad578063406072a9146104c257806342842e0e1461050857806348b75044146105285780635117dbde1461054857600080fd5b80630a6ca4c41161026b5780630a6ca4c4146103ea57806318160ddd1461040a578063191655871461042357806323b872dd146104435780632f181f5414610463578063380d831b1461048357600080fd5b806301ffc9a71461030057806305f4f73e1461033557806306fdde0314610359578063081812fc1461037b578063081c8c44146103b3578063095ea7b3146103c857600080fd5b366102fb577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561030c57600080fd5b5061032061031b366004612d06565b61094c565b60405190151581526020015b60405180910390f35b34801561034157600080fd5b5061034b60125481565b60405190815260200161032c565b34801561036557600080fd5b5061036e61099e565b60405161032c9190612d7b565b34801561038757600080fd5b5061039b610396366004612d8e565b610a30565b6040516001600160a01b03909116815260200161032c565b3480156103bf57600080fd5b5061036e610a74565b3480156103d457600080fd5b506103e86103e3366004612dbc565b610b02565b005b3480156103f657600080fd5b506103e8610405366004612dbc565b610b88565b34801561041657600080fd5b506001546000540361034b565b34801561042f57600080fd5b506103e861043e366004612de8565b610bfb565b34801561044f57600080fd5b506103e861045e366004612e05565b610d2c565b34801561046f57600080fd5b506103e861047e366004612d8e565b610d37565b34801561048f57600080fd5b506103e8610d66565b3480156104a457600080fd5b5060095461034b565b3480156104b957600080fd5b506103e8610d9f565b3480156104ce57600080fd5b5061034b6104dd366004612e46565b6001600160a01b039182166000908152600f6020908152604080832093909416825291909152205490565b34801561051457600080fd5b506103e8610523366004612e05565b610dd3565b34801561053457600080fd5b506103e8610543366004612e46565b610dee565b34801561055457600080fd5b50610320610563366004612de8565b60166020526000908152604090205460ff1681565b34801561058457600080fd5b50601a546103209060ff1681565b34801561059e57600080fd5b5061034b6105ad366004612de8565b60176020526000908152604090205481565b3480156105cb57600080fd5b506103e86105da366004612f0a565b610fca565b3480156105eb57600080fd5b5060105460ff16610320565b34801561060357600080fd5b5061039b610612366004612d8e565b611007565b34801561062357600080fd5b5061036e611019565b34801561063857600080fd5b506103e8610647366004612d8e565b611026565b34801561065857600080fd5b5061034b610667366004612de8565b611055565b34801561067857600080fd5b506103e86110a3565b6103e861068f366004612f93565b6110d7565b3480156106a057600080fd5b506103e8611332565b3480156106b557600080fd5b506103e86106c4366004613022565b611364565b3480156106d557600080fd5b5061039b6106e4366004612d8e565b6114b3565b3480156106f557600080fd5b506008546001600160a01b031661039b565b34801561071357600080fd5b5061036e6114e3565b34801561072857600080fd5b5061034b610737366004612de8565b6001600160a01b03166000908152600c602052604090205490565b34801561075e57600080fd5b5061034b67016345785d8a000081565b34801561077a57600080fd5b506103e8610789366004612de8565b6114f2565b34801561079a57600080fd5b506103e86107a936600461309b565b61158a565b3480156107ba57600080fd5b506103e861161f565b3480156107cf57600080fd5b5061034b60145481565b3480156107e557600080fd5b506103e86107f43660046130c9565b611658565b34801561080557600080fd5b5061036e610814366004612d8e565b6116a2565b34801561082557600080fd5b5061034b610834366004612de8565b6001600160a01b03166000908152600b602052604090205490565b34801561085b57600080fd5b5061034b60115481565b6103e8610873366004613148565b611825565b34801561088457600080fd5b5061034b610893366004612de8565b6001600160a01b03166000908152600e602052604090205490565b3480156108ba57600080fd5b50600a5461034b565b3480156108cf57600080fd5b506103206108de366004612e46565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561091857600080fd5b506103e8610927366004612f0a565b611aaa565b34801561093857600080fd5b506103e8610947366004612de8565b611ae7565b60006001600160e01b031982166380ac58cd60e01b148061097d57506001600160e01b03198216635b5e139f60e01b145b8061099857506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600280546109ad9061318e565b80601f01602080910402602001604051908101604052809291908181526020018280546109d99061318e565b8015610a265780601f106109fb57610100808354040283529160200191610a26565b820191906000526020600020905b815481529060010190602001808311610a0957829003601f168201915b5050505050905090565b6000610a3b82611b91565b610a58576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60198054610a819061318e565b80601f0160208091040260200160405190810160405280929190818152602001828054610aad9061318e565b8015610afa5780601f10610acf57610100808354040283529160200191610afa565b820191906000526020600020905b815481529060010190602001808311610add57829003601f168201915b505050505081565b6000610b0d82611007565b9050806001600160a01b0316836001600160a01b031603610b415760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610b7857610b5b81336108de565b610b78576040516367d9dca160e11b815260040160405180910390fd5b610b83838383611bbc565b505050565b6008546001600160a01b03163314610bbb5760405162461bcd60e51b8152600401610bb2906131c8565b60405180910390fd5b60115460015460005403610bcf9083613213565b1115610bed5760405162461bcd60e51b8152600401610bb29061322b565b610bf78282611c18565b5050565b6001600160a01b0381166000908152600b6020526040902054610c305760405162461bcd60e51b8152600401610bb290613262565b6000610c3b600a5490565b610c459047613213565b90506000610c728383610c6d866001600160a01b03166000908152600c602052604090205490565b611c32565b905080600003610c945760405162461bcd60e51b8152600401610bb2906132a8565b6001600160a01b0383166000908152600c602052604081208054839290610cbc908490613213565b9250508190555080600a6000828254610cd59190613213565b90915550610ce590508382611c78565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b610b83838383611d91565b6008546001600160a01b03163314610d615760405162461bcd60e51b8152600401610bb2906131c8565b601455565b6008546001600160a01b03163314610d905760405162461bcd60e51b8152600401610bb2906131c8565b6015805460ff19166001179055565b6008546001600160a01b03163314610dc95760405162461bcd60e51b8152600401610bb2906131c8565b610dd1611f7e565b565b610b8383838360405180602001604052806000815250611658565b6001600160a01b0381166000908152600b6020526040902054610e235760405162461bcd60e51b8152600401610bb290613262565b6001600160a01b0382166000908152600e60205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa158015610e80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea491906132f3565b610eae9190613213565b90506000610ee78383610c6d87876001600160a01b039182166000908152600f6020908152604080832093909416825291909152205490565b905080600003610f095760405162461bcd60e51b8152600401610bb2906132a8565b6001600160a01b038085166000908152600f6020908152604080832093871683529290529081208054839290610f40908490613213565b90915550506001600160a01b0384166000908152600e602052604081208054839290610f6d908490613213565b90915550610f7e9050848483612011565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b6008546001600160a01b03163314610ff45760405162461bcd60e51b8152600401610bb2906131c8565b8051610bf7906018906020840190612c57565b600061101282612063565b5192915050565b60188054610a819061318e565b6008546001600160a01b031633146110505760405162461bcd60e51b8152600401610bb2906131c8565b601155565b60006001600160a01b03821661107e576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b031633146110cd5760405162461bcd60e51b8152600401610bb2906131c8565b610dd1600061217d565b60105460ff16156110fa5760405162461bcd60e51b8152600401610bb29061330c565b60155460ff161561113d5760405162461bcd60e51b815260206004820152600d60248201526c14d85b19481a5cc8195b991959609a1b6044820152606401610bb2565b600060145411801561115157506014544210155b6111a85760405162461bcd60e51b815260206004820152602260248201527f57686974656c697374206d696e74206973206e6f742073746172746564207965604482015261742160f01b6064820152608401610bb2565b3360009081526016602052604090205460ff16156112175760405162461bcd60e51b815260206004820152602660248201527f596f75206861766520616c726561647920636c61696d656420796f757220467260448201526519595b5a5b9d60d21b6064820152608401610bb2565b60135461126d906001600160a01b031661123185336121cf565b84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061221492505050565b6112b95760405162461bcd60e51b815260206004820152601b60248201527f5349474e41545552455f56414c49444154494f4e5f4641494c454400000000006044820152606401610bb2565b601154836112ca6001546000540390565b6112d49190613213565b111561130e5760405162461bcd60e51b8152602060048201526009602482015268534f4c44204f55542160b81b6044820152606401610bb2565b336000818152601660205260409020805460ff19166001179055610b839084611c18565b6008546001600160a01b0316331461135c5760405162461bcd60e51b8152600401610bb2906131c8565b610dd1612294565b6008546001600160a01b0316331461138e5760405162461bcd60e51b8152600401610bb2906131c8565b8281146113cf5760405162461bcd60e51b815260206004820152600f60248201526e098cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610bb2565b6000805b82811015611413578383828181106113ed576113ed613336565b90506020020135826113ff9190613213565b91508061140b8161334c565b9150506113d3565b50601154600154600054036114289083613213565b11156114465760405162461bcd60e51b8152600401610bb29061322b565b60005b828110156114ab5761149986868381811061146657611466613336565b905060200201602081019061147b9190612de8565b85858481811061148d5761148d613336565b90506020020135611c18565b806114a38161334c565b915050611449565b505050505050565b6000600d82815481106114c8576114c8613336565b6000918252602090912001546001600160a01b031692915050565b6060600380546109ad9061318e565b6008546001600160a01b0316331461151c5760405162461bcd60e51b8152600401610bb2906131c8565b6001600160a01b0381166115685760405162461bcd60e51b815260206004820152601360248201527243414e2754205055542030204144445245535360681b6044820152606401610bb2565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b336001600160a01b038316036115b35760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b031633146116495760405162461bcd60e51b8152600401610bb2906131c8565b601a805460ff19166001179055565b611663848484611d91565b6001600160a01b0383163b1561169c5761167f848484846122ec565b61169c576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b601a5460609060ff16151560000361174657601980546116c19061318e565b80601f01602080910402602001604051908101604052809291908181526020018280546116ed9061318e565b801561173a5780601f1061170f5761010080835404028352916020019161173a565b820191906000526020600020905b81548152906001019060200180831161171d57829003601f168201915b50505050509050919050565b6000601880546117559061318e565b80601f01602080910402602001604051908101604052809291908181526020018280546117819061318e565b80156117ce5780601f106117a3576101008083540402835291602001916117ce565b820191906000526020600020905b8154815290600101906020018083116117b157829003601f168201915b5050505050905060008151116117f3576040518060200160405280600081525061181e565b806117fd846123d7565b60405160200161180e929190613365565b6040516020818303038152906040525b9392505050565b60105460ff16156118485760405162461bcd60e51b8152600401610bb29061330c565b60155460ff161561188b5760405162461bcd60e51b815260206004820152600d60248201526c14d85b19481a5cc8195b991959609a1b6044820152606401610bb2565b600060145411801561189f57506014544210155b6118df5760405162461bcd60e51b815260206004820152601160248201527029b0b632903737ba1039ba30b93a32b21760791b6044820152606401610bb2565b6013546118f9906001600160a01b031661123185336121cf565b6119455760405162461bcd60e51b815260206004820152601b60248201527f5349474e41545552455f56414c49444154494f4e5f4641494c454400000000006044820152606401610bb2565b60125433600090815260176020526040902054611963908690613213565b11156119815760405162461bcd60e51b8152600401610bb29061322b565b600084116119d15760405162461bcd60e51b815260206004820152601f60248201527f596f75206d757374206d696e74206174206c65617374206f6e65204e46542e006044820152606401610bb2565b601154846119e26001546000540390565b6119ec9190613213565b1115611a265760405162461bcd60e51b8152602060048201526009602482015268536f6c64206f75742160b81b6044820152606401610bb2565b611a388467016345785d8a0000613394565b341015611a7b5760405162461bcd60e51b8152602060048201526011602482015270496e737566696369656e742066756e647360781b6044820152606401610bb2565b3360009081526017602052604081208054869290611a9a908490613213565b9091555061169c90503385611c18565b6008546001600160a01b03163314611ad45760405162461bcd60e51b8152600401610bb2906131c8565b8051610bf7906019906020840190612c57565b6008546001600160a01b03163314611b115760405162461bcd60e51b8152600401610bb2906131c8565b6001600160a01b038116611b765760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bb2565b611b7f8161217d565b50565b6001600160a01b03163b151590565b6000805482108015610998575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610bf78282604051806020016040528060008152506124d7565b6009546001600160a01b0384166000908152600b602052604081205490918391611c5c9086613394565b611c6691906133c9565b611c7091906133dd565b949350505050565b80471015611cc85760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610bb2565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611d15576040519150601f19603f3d011682016040523d82523d6000602084013e611d1a565b606091505b5050905080610b835760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610bb2565b6000611d9c82612063565b9050836001600160a01b031681600001516001600160a01b031614611dd35760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611df15750611df185336108de565b80611e0c575033611e0184610a30565b6001600160a01b0316145b905080611e2c57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416611e5357604051633a954ecd60e21b815260040160405180910390fd5b611e5f60008487611bbc565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116611f33576000548214611f3357805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b60105460ff16611fc75760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610bb2565b6010805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610b8390849061269e565b60408051606081018252600080825260208201819052918101919091528160005481101561216457600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906121625780516001600160a01b0316156120f9579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff161515928101929092521561215d579392505050565b6120f9565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600082826040516020016121f69291909182526001600160a01b0316602082015260400190565b60405160208183030381529060405280519060200120905092915050565b600061227782612271856040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b90612770565b6001600160a01b0316846001600160a01b03161490509392505050565b60105460ff16156122b75760405162461bcd60e51b8152600401610bb29061330c565b6010805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611ff43390565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906123219033908990889088906004016133f4565b6020604051808303816000875af192505050801561235c575060408051601f3d908101601f1916820190925261235991810190613431565b60015b6123ba573d80801561238a576040519150601f19603f3d011682016040523d82523d6000602084013e61238f565b606091505b5080516000036123b2576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6060816000036123fe5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561242857806124128161334c565b91506124219050600a836133c9565b9150612402565b6000816001600160401b0381111561244257612442612e7f565b6040519080825280601f01601f19166020018201604052801561246c576020820181803683370190505b5090505b8415611c70576124816001836133dd565b915061248e600a8661344e565b612499906030613213565b60f81b8183815181106124ae576124ae613336565b60200101906001600160f81b031916908160001a9053506124d0600a866133c9565b9450612470565b6000546001600160a01b03841661250057604051622e076360e81b815260040160405180910390fd5b826000036125215760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600490925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15612649575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461261260008784806001019550876122ec565b61262f576040516368d2bf6b60e11b815260040160405180910390fd5b8082106125c757826000541461264457600080fd5b61268e565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821061264a575b50600090815561169c9085838684565b60006126f3826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166127949092919063ffffffff16565b805190915015610b8357808060200190518101906127119190613462565b610b835760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610bb2565b600080600061277f85856127a3565b9150915061278c81612811565b509392505050565b6060611c7084846000856129c7565b60008082516041036127d95760208301516040840151606085015160001a6127cd87828585612af8565b9450945050505061280a565b825160400361280257602083015160408401516127f7868383612be5565b93509350505061280a565b506000905060025b9250929050565b60008160048111156128255761282561347f565b0361282d5750565b60018160048111156128415761284161347f565b0361288e5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610bb2565b60028160048111156128a2576128a261347f565b036128ef5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610bb2565b60038160048111156129035761290361347f565b0361295b5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610bb2565b600481600481111561296f5761296f61347f565b03611b7f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610bb2565b606082471015612a285760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610bb2565b6001600160a01b0385163b612a7f5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610bb2565b600080866001600160a01b03168587604051612a9b9190613495565b60006040518083038185875af1925050503d8060008114612ad8576040519150601f19603f3d011682016040523d82523d6000602084013e612add565b606091505b5091509150612aed828286612c1e565b979650505050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612b2f5750600090506003612bdc565b8460ff16601b14158015612b4757508460ff16601c14155b15612b585750600090506004612bdc565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612bac573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612bd557600060019250925050612bdc565b9150600090505b94509492505050565b6000806001600160ff1b03831681612c0260ff86901c601b613213565b9050612c1087828885612af8565b935093505050935093915050565b60608315612c2d57508161181e565b825115612c3d5782518084602001fd5b8160405162461bcd60e51b8152600401610bb29190612d7b565b828054612c639061318e565b90600052602060002090601f016020900481019282612c855760008555612ccb565b82601f10612c9e57805160ff1916838001178555612ccb565b82800160010185558215612ccb579182015b82811115612ccb578251825591602001919060010190612cb0565b50612cd7929150612cdb565b5090565b5b80821115612cd75760008155600101612cdc565b6001600160e01b031981168114611b7f57600080fd5b600060208284031215612d1857600080fd5b813561181e81612cf0565b60005b83811015612d3e578181015183820152602001612d26565b8381111561169c5750506000910152565b60008151808452612d67816020860160208601612d23565b601f01601f19169290920160200192915050565b60208152600061181e6020830184612d4f565b600060208284031215612da057600080fd5b5035919050565b6001600160a01b0381168114611b7f57600080fd5b60008060408385031215612dcf57600080fd5b8235612dda81612da7565b946020939093013593505050565b600060208284031215612dfa57600080fd5b813561181e81612da7565b600080600060608486031215612e1a57600080fd5b8335612e2581612da7565b92506020840135612e3581612da7565b929592945050506040919091013590565b60008060408385031215612e5957600080fd5b8235612e6481612da7565b91506020830135612e7481612da7565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b0380841115612eaf57612eaf612e7f565b604051601f8501601f19908116603f01168101908282118183101715612ed757612ed7612e7f565b81604052809350858152868686011115612ef057600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612f1c57600080fd5b81356001600160401b03811115612f3257600080fd5b8201601f81018413612f4357600080fd5b611c7084823560208401612e95565b60008083601f840112612f6457600080fd5b5081356001600160401b03811115612f7b57600080fd5b60208301915083602082850101111561280a57600080fd5b600080600060408486031215612fa857600080fd5b8335925060208401356001600160401b03811115612fc557600080fd5b612fd186828701612f52565b9497909650939450505050565b60008083601f840112612ff057600080fd5b5081356001600160401b0381111561300757600080fd5b6020830191508360208260051b850101111561280a57600080fd5b6000806000806040858703121561303857600080fd5b84356001600160401b038082111561304f57600080fd5b61305b88838901612fde565b9096509450602087013591508082111561307457600080fd5b5061308187828801612fde565b95989497509550505050565b8015158114611b7f57600080fd5b600080604083850312156130ae57600080fd5b82356130b981612da7565b91506020830135612e748161308d565b600080600080608085870312156130df57600080fd5b84356130ea81612da7565b935060208501356130fa81612da7565b92506040850135915060608501356001600160401b0381111561311c57600080fd5b8501601f8101871361312d57600080fd5b61313c87823560208401612e95565b91505092959194509250565b6000806000806060858703121561315e57600080fd5b843593506020850135925060408501356001600160401b0381111561318257600080fd5b61308187828801612f52565b600181811c908216806131a257607f821691505b6020821081036131c257634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115613226576132266131fd565b500190565b60208082526018908201527f596f752063616e2774206d696e74206d6f7265204e4654730000000000000000604082015260600190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b60006020828403121561330557600080fd5b5051919050565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60006001820161335e5761335e6131fd565b5060010190565b60008351613377818460208801612d23565b83519083019061338b818360208801612d23565b01949350505050565b60008160001904831182151516156133ae576133ae6131fd565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826133d8576133d86133b3565b500490565b6000828210156133ef576133ef6131fd565b500390565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061342790830184612d4f565b9695505050505050565b60006020828403121561344357600080fd5b815161181e81612cf0565b60008261345d5761345d6133b3565b500690565b60006020828403121561347457600080fd5b815161181e8161308d565b634e487b7160e01b600052602160045260246000fd5b600082516134a7818460208701612d23565b919091019291505056fea264697066735822122033115997046f72aa1ac257761ad7bd8c78cd6a767fa2c842c4c970dd28d1434264736f6c634300080e0033

Deployed Bytecode Sourcemap

73914:7655:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64573:40;19927:10;64573:40;;;-1:-1:-1;;;;;206:32:1;;;188:51;;64603:9:0;270:2:1;255:18;;248:34;161:18;64573:40:0;;;;;;;73914:7655;;;;;26083:305;;;;;;;;;;-1:-1:-1;26083:305:0;;;;;:::i;:::-;;:::i;:::-;;;844:14:1;;837:22;819:41;;807:2;792:18;26083:305:0;;;;;;;;74168:36;;;;;;;;;;;;;;;;;;;1017:25:1;;;1005:2;990:18;74168:36:0;871:177:1;29198:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;30702:204::-;;;;;;;;;;-1:-1:-1;30702:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2153:32:1;;;2135:51;;2123:2;2108:18;30702:204:0;1989:203:1;74617:28:0;;;;;;;;;;;;;:::i;30264:372::-;;;;;;;;;;-1:-1:-1;30264:372:0;;;;;:::i;:::-;;:::i;:::-;;80011:231;;;;;;;;;;-1:-1:-1;80011:231:0;;;;;:::i;:::-;;:::i;25323:312::-;;;;;;;;;;-1:-1:-1;25586:12:0;;25376:7;25570:13;:28;25323:312;;66359:566;;;;;;;;;;-1:-1:-1;66359:566:0;;;;;:::i;:::-;;:::i;31567:170::-;;;;;;;;;;-1:-1:-1;31567:170:0;;;;;:::i;:::-;;:::i;76412:108::-;;;;;;;;;;-1:-1:-1;76412:108:0;;;;;:::i;:::-;;:::i;76556:73::-;;;;;;;;;;;;;:::i;64704:91::-;;;;;;;;;;-1:-1:-1;64775:12:0;;64704:91;;76308:67;;;;;;;;;;;;;:::i;65833:135::-;;;;;;;;;;-1:-1:-1;65833:135:0;;;;;:::i;:::-;-1:-1:-1;;;;;65930:21:0;;;65903:7;65930:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;65833:135;31808:185;;;;;;;;;;-1:-1:-1;31808:185:0;;;;;:::i;:::-;;:::i;67193:641::-;;;;;;;;;;-1:-1:-1;67193:641:0;;;;;:::i;:::-;;:::i;74385:47::-;;;;;;;;;;-1:-1:-1;74385:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;74698:28;;;;;;;;;;-1:-1:-1;74698:28:0;;;;;;;;74439:47;;;;;;;;;;-1:-1:-1;74439:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;75662:104;;;;;;;;;;-1:-1:-1;75662:104:0;;;;;:::i;:::-;;:::i;70070:86::-;;;;;;;;;;-1:-1:-1;70141:7:0;;;;70070:86;;29006:125;;;;;;;;;;-1:-1:-1;29006:125:0;;;;;:::i;:::-;;:::i;74551:21::-;;;;;;;;;;;;;:::i;76051:100::-;;;;;;;;;;-1:-1:-1;76051:100:0;;;;;:::i;:::-;;:::i;26452:206::-;;;;;;;;;;-1:-1:-1;26452:206:0;;;;;:::i;:::-;;:::i;72975:103::-;;;;;;;;;;;;;:::i;77944:825::-;;;;;;:::i;:::-;;:::i;76209:63::-;;;;;;;;;;;;;:::i;80250:614::-;;;;;;;;;;-1:-1:-1;80250:614:0;;;;;:::i;:::-;;:::i;66059:100::-;;;;;;;;;;-1:-1:-1;66059:100:0;;;;;:::i;:::-;;:::i;72324:87::-;;;;;;;;;;-1:-1:-1;72397:6:0;;-1:-1:-1;;;;;72397:6:0;72324:87;;29367:104;;;;;;;;;;;;;:::i;65555:109::-;;;;;;;;;;-1:-1:-1;65555:109:0;;;;;:::i;:::-;-1:-1:-1;;;;;65638:18:0;65611:7;65638:18;;;:9;:18;;;;;;;65555:109;74062:41;;;;;;;;;;;;74094:9;74062:41;;75823:184;;;;;;;;;;-1:-1:-1;75823:184:0;;;;;:::i;:::-;;:::i;30978:287::-;;;;;;;;;;-1:-1:-1;30978:287:0;;;;;:::i;:::-;;:::i;75337:69::-;;;;;;;;;;;;;:::i;74308:37::-;;;;;;;;;;;;;;;;32064:370;;;;;;;;;;-1:-1:-1;32064:370:0;;;;;:::i;:::-;;:::i;81131:435::-;;;;;;;;;;-1:-1:-1;81131:435:0;;;;;:::i;:::-;;:::i;65351:105::-;;;;;;;;;;-1:-1:-1;65351:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;65432:16:0;65405:7;65432:16;;;:7;:16;;;;;;;65351:105;74112:31;;;;;;;;;;;;;;;;78976:1027;;;;;;:::i;:::-;;:::i;65141:119::-;;;;;;;;;;-1:-1:-1;65141:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;65226:26:0;65199:7;65226:26;;;:19;:26;;;;;;;65141:119;64889:95;;;;;;;;;;-1:-1:-1;64962:14:0;;64889:95;;31336:164;;;;;;;;;;-1:-1:-1;31336:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;31457:25:0;;;31433:4;31457:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;31336:164;75451:126;;;;;;;;;;-1:-1:-1;75451:126:0;;;;;:::i;:::-;;:::i;73233:201::-;;;;;;;;;;-1:-1:-1;73233:201:0;;;;;:::i;:::-;;:::i;26083:305::-;26185:4;-1:-1:-1;;;;;;26222:40:0;;-1:-1:-1;;;26222:40:0;;:105;;-1:-1:-1;;;;;;;26279:48:0;;-1:-1:-1;;;26279:48:0;26222:105;:158;;;-1:-1:-1;;;;;;;;;;23173:40:0;;;26344:36;26202:178;26083:305;-1:-1:-1;;26083:305:0:o;29198:100::-;29252:13;29285:5;29278:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29198:100;:::o;30702:204::-;30770:7;30795:16;30803:7;30795;:16::i;:::-;30790:64;;30820:34;;-1:-1:-1;;;30820:34:0;;;;;;;;;;;30790:64;-1:-1:-1;30874:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;30874:24:0;;30702:204::o;74617:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30264:372::-;30337:13;30353:24;30369:7;30353:15;:24::i;:::-;30337:40;;30398:5;-1:-1:-1;;;;;30392:11:0;:2;-1:-1:-1;;;;;30392:11:0;;30388:48;;30412:24;;-1:-1:-1;;;30412:24:0;;;;;;;;;;;30388:48;19927:10;-1:-1:-1;;;;;30453:21:0;;;30449:139;;30480:37;30497:5;19927:10;31336:164;:::i;30480:37::-;30476:112;;30541:35;;-1:-1:-1;;;30541:35:0;;;;;;;;;;;30476:112;30600:28;30609:2;30613:7;30622:5;30600:8;:28::i;:::-;30326:310;30264:372;;:::o;80011:231::-;72397:6;;-1:-1:-1;;;;;72397:6:0;19927:10;72544:23;72536:68;;;;-1:-1:-1;;;72536:68:0;;;;;;;:::i;:::-;;;;;;;;;80137:9:::1;::::0;25586:12;;25376:7;25570:13;:28;80109:24:::1;::::0;:8;:24:::1;:::i;:::-;:37;;80087:111;;;;-1:-1:-1::0;;;80087:111:0::1;;;;;;;:::i;:::-;80211:23;80221:2;80225:8;80211:9;:23::i;:::-;80011:231:::0;;:::o;66359:566::-;-1:-1:-1;;;;;66435:16:0;;66454:1;66435:16;;;:7;:16;;;;;;66427:71;;;;-1:-1:-1;;;66427:71:0;;;;;;;:::i;:::-;66511:21;66559:15;64962:14;;;64889:95;66559:15;66535:39;;:21;:39;:::i;:::-;66511:63;;66585:15;66603:58;66619:7;66628:13;66643:17;66652:7;-1:-1:-1;;;;;65638:18:0;65611:7;65638:18;;;:9;:18;;;;;;;65555:109;66643:17;66603:15;:58::i;:::-;66585:76;;66682:7;66693:1;66682:12;66674:68;;;;-1:-1:-1;;;66674:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;66755:18:0;;;;;;:9;:18;;;;;:29;;66777:7;;66755:18;:29;;66777:7;;66755:29;:::i;:::-;;;;;;;;66813:7;66795:14;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;66833:35:0;;-1:-1:-1;66851:7:0;66860;66833:17;:35::i;:::-;66884:33;;;-1:-1:-1;;;;;206:32:1;;188:51;;270:2;255:18;;248:34;;;66884:33:0;;161:18:1;66884:33:0;;;;;;;66416:509;;66359:566;:::o;31567:170::-;31701:28;31711:4;31717:2;31721:7;31701:9;:28::i;76412:108::-;72397:6;;-1:-1:-1;;;;;72397:6:0;19927:10;72544:23;72536:68;;;;-1:-1:-1;;;72536:68:0;;;;;;;:::i;:::-;76487:9:::1;:25:::0;76412:108::o;76556:73::-;72397:6;;-1:-1:-1;;;;;72397:6:0;19927:10;72544:23;72536:68;;;;-1:-1:-1;;;72536:68:0;;;;;;;:::i;:::-;76605:9:::1;:16:::0;;-1:-1:-1;;76605:16:0::1;76617:4;76605:16;::::0;;76556:73::o;76308:67::-;72397:6;;-1:-1:-1;;;;;72397:6:0;19927:10;72544:23;72536:68;;;;-1:-1:-1;;;72536:68:0;;;;;;;:::i;:::-;76357:10:::1;:8;:10::i;:::-;76308:67::o:0;31808:185::-;31946:39;31963:4;31969:2;31973:7;31946:39;;;;;;;;;;;;:16;:39::i;67193:641::-;-1:-1:-1;;;;;67275:16:0;;67294:1;67275:16;;;:7;:16;;;;;;67267:71;;;;-1:-1:-1;;;67267:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;65226:26:0;;67351:21;65226:26;;;:19;:26;;;;;;67375:30;;-1:-1:-1;;;67375:30:0;;67399:4;67375:30;;;2135:51:1;-1:-1:-1;;;;;67375:15:0;;;;;2108:18:1;;67375:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;67351:77;;67439:15;67457:65;67473:7;67482:13;67497:24;67506:5;67513:7;-1:-1:-1;;;;;65930:21:0;;;65903:7;65930:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;65833:135;67457:65;67439:83;;67543:7;67554:1;67543:12;67535:68;;;;-1:-1:-1;;;67535:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;67616:21:0;;;;;;;:14;:21;;;;;;;;:30;;;;;;;;;;;:41;;67650:7;;67616:21;:41;;67650:7;;67616:41;:::i;:::-;;;;-1:-1:-1;;;;;;;67668:26:0;;;;;;:19;:26;;;;;:37;;67698:7;;67668:26;:37;;67698:7;;67668:37;:::i;:::-;;;;-1:-1:-1;67718:47:0;;-1:-1:-1;67741:5:0;67748:7;67757;67718:22;:47::i;:::-;67781:45;;;-1:-1:-1;;;;;206:32:1;;;188:51;;270:2;255:18;;248:34;;;67781:45:0;;;;;161:18:1;67781:45:0;;;;;;;67256:578;;67193:641;;:::o;75662:104::-;72397:6;;-1:-1:-1;;;;;72397:6:0;19927:10;72544:23;72536:68;;;;-1:-1:-1;;;72536:68:0;;;;;;;:::i;:::-;75737:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;29006:125::-:0;29070:7;29097:21;29110:7;29097:12;:21::i;:::-;:26;;29006:125;-1:-1:-1;;29006:125:0:o;74551:21::-;;;;;;;:::i;76051:100::-;72397:6;;-1:-1:-1;;;;;72397:6:0;19927:10;72544:23;72536:68;;;;-1:-1:-1;;;72536:68:0;;;;;;;:::i;:::-;76121:9:::1;:22:::0;76051:100::o;26452:206::-;26516:7;-1:-1:-1;;;;;26540:19:0;;26536:60;;26568:28;;-1:-1:-1;;;26568:28:0;;;;;;;;;;;26536:60;-1:-1:-1;;;;;;26622:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;26622:27:0;;26452:206::o;72975:103::-;72397:6;;-1:-1:-1;;;;;72397:6:0;19927:10;72544:23;72536:68;;;;-1:-1:-1;;;72536:68:0;;;;;;;:::i;:::-;73040:30:::1;73067:1;73040:18;:30::i;77944:825::-:0;70141:7;;;;70395:9;70387:38;;;;-1:-1:-1;;;70387:38:0;;;;;;;:::i;:::-;78084:9:::1;::::0;::::1;;78083:10;78075:36;;;::::0;-1:-1:-1;;;78075:36:0;;12969:2:1;78075:36:0::1;::::0;::::1;12951:21:1::0;13008:2;12988:18;;;12981:30;-1:-1:-1;;;13027:18:1;;;13020:43;13080:18;;78075:36:0::1;12767:337:1::0;78075:36:0::1;78156:1;78144:9;;:13;:45;;;;;78180:9;;78161:15;:28;;78144:45;78122:129;;;::::0;-1:-1:-1;;;78122:129:0;;13311:2:1;78122:129:0::1;::::0;::::1;13293:21:1::0;13350:2;13330:18;;;13323:30;13389:34;13369:18;;;13362:62;-1:-1:-1;;;13440:18:1;;;13433:32;13482:19;;78122:129:0::1;13109:398:1::0;78122:129:0::1;78301:10;78285:27;::::0;;;:15:::1;:27;::::0;;;;;::::1;;78284:28;78262:116;;;::::0;-1:-1:-1;;;78262:116:0;;13714:2:1;78262:116:0::1;::::0;::::1;13696:21:1::0;13753:2;13733:18;;;13726:30;13792:34;13772:18;;;13765:62;-1:-1:-1;;;13843:18:1;;;13836:36;13889:19;;78262:116:0::1;13512:402:1::0;78262:116:0::1;78449:16;::::0;78411:144:::1;::::0;-1:-1:-1;;;;;78449:16:0::1;78484:28;78496:3:::0;78501:10:::1;78484:11;:28::i;:::-;78531:9;;78411:144;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;78411:19:0::1;::::0;-1:-1:-1;;;78411:144:0:i:1;:::-;78389:221;;;::::0;-1:-1:-1;;;78389:221:0;;14121:2:1;78389:221:0::1;::::0;::::1;14103:21:1::0;14160:2;14140:18;;;14133:30;14199:29;14179:18;;;14172:57;14246:18;;78389:221:0::1;13919:351:1::0;78389:221:0::1;78652:9;;78645:3;78629:13;25586:12:::0;;25376:7;25570:13;:28;;25323:312;78629:13:::1;:19;;;;:::i;:::-;:32;;78621:54;;;::::0;-1:-1:-1;;;78621:54:0;;14477:2:1;78621:54:0::1;::::0;::::1;14459:21:1::0;14516:1;14496:18;;;14489:29;-1:-1:-1;;;14534:18:1;;;14527:39;14583:18;;78621:54:0::1;14275:332:1::0;78621:54:0::1;78704:10;78688:27;::::0;;;:15:::1;:27;::::0;;;;:34;;-1:-1:-1;;78688:34:0::1;78718:4;78688:34;::::0;;78735:26:::1;::::0;78757:3;78735:9:::1;:26::i;76209:63::-:0;72397:6;;-1:-1:-1;;;;;72397:6:0;19927:10;72544:23;72536:68;;;;-1:-1:-1;;;72536:68:0;;;;;;;:::i;:::-;76256:8:::1;:6;:8::i;80250:614::-:0;72397:6;;-1:-1:-1;;;;;72397:6:0;19927:10;72544:23;72536:68;;;;-1:-1:-1;;;72536:68:0;;;;;;;:::i;:::-;80394:35;;::::1;80386:63;;;::::0;-1:-1:-1;;;80386:63:0;;14814:2:1;80386:63:0::1;::::0;::::1;14796:21:1::0;14853:2;14833:18;;;14826:30;-1:-1:-1;;;14872:18:1;;;14865:45;14927:18;;80386:63:0::1;14612:339:1::0;80386:63:0::1;80462:21;80505:9:::0;80500:105:::1;80520:21:::0;;::::1;80500:105;;;80580:10;;80591:1;80580:13;;;;;;;:::i;:::-;;;;;;;80563:30;;;;;:::i;:::-;::::0;-1:-1:-1;80543:3:0;::::1;::::0;::::1;:::i;:::-;;;;80500:105;;;-1:-1:-1::0;80672:9:0::1;::::0;25586:12;;25376:7;25570:13;:28;80639:29:::1;::::0;:13;:29:::1;:::i;:::-;:42;;80617:116;;;;-1:-1:-1::0;;;80617:116:0::1;;;;;;;:::i;:::-;80751:9;80746:111;80766:21:::0;;::::1;80746:111;;;80809:36;80819:7;;80827:1;80819:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;80831;;80842:1;80831:13;;;;;;;:::i;:::-;;;;;;;80809:9;:36::i;:::-;80789:3:::0;::::1;::::0;::::1;:::i;:::-;;;;80746:111;;;;80375:489;80250:614:::0;;;;:::o;66059:100::-;66110:7;66137;66145:5;66137:14;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;66137:14:0;;66059:100;-1:-1:-1;;66059:100:0:o;29367:104::-;29423:13;29456:7;29449:14;;;;;:::i;75823:184::-;72397:6;;-1:-1:-1;;;;;72397:6:0;19927:10;72544:23;72536:68;;;;-1:-1:-1;;;72536:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;75909:25:0;::::1;75901:57;;;::::0;-1:-1:-1;;;75901:57:0;;15430:2:1;75901:57:0::1;::::0;::::1;15412:21:1::0;15469:2;15449:18;;;15442:30;-1:-1:-1;;;15488:18:1;;;15481:49;15547:18;;75901:57:0::1;15228:343:1::0;75901:57:0::1;75969:16;:30:::0;;-1:-1:-1;;;;;;75969:30:0::1;-1:-1:-1::0;;;;;75969:30:0;;;::::1;::::0;;;::::1;::::0;;75823:184::o;30978:287::-;19927:10;-1:-1:-1;;;;;31077:24:0;;;31073:54;;31110:17;;-1:-1:-1;;;31110:17:0;;;;;;;;;;;31073:54;19927:10;31140:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;31140:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;31140:53:0;;;;;;;;;;31209:48;;819:41:1;;;31140:42:0;;19927:10;31209:48;;792:18:1;31209:48:0;;;;;;;30978:287;;:::o;75337:69::-;72397:6;;-1:-1:-1;;;;;72397:6:0;19927:10;72544:23;72536:68;;;;-1:-1:-1;;;72536:68:0;;;;;;;:::i;:::-;75383:8:::1;:15:::0;;-1:-1:-1;;75383:15:0::1;75394:4;75383:15;::::0;;75337:69::o;32064:370::-;32231:28;32241:4;32247:2;32251:7;32231:9;:28::i;:::-;-1:-1:-1;;;;;32274:13:0;;12185:19;:23;32270:157;;32295:56;32326:4;32332:2;32336:7;32345:5;32295:30;:56::i;:::-;32291:136;;32375:40;;-1:-1:-1;;;32375:40:0;;;;;;;;;;;32291:136;32064:370;;;;:::o;81131:435::-;81276:8;;81241:13;;81276:8;;:17;;:8;:17;81272:71;;81317:14;81310:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81131:435;;;:::o;81272:71::-;81355:28;81386:7;81355:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81455:1;81430:14;81424:28;:32;:134;;;;;;;;;;;;;;;;;81500:14;81516:18;:7;:16;:18::i;:::-;81483:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;81424:134;81404:154;81131:435;-1:-1:-1;;;81131:435:0:o;78976:1027::-;70141:7;;;;70395:9;70387:38;;;;-1:-1:-1;;;70387:38:0;;;;;;;:::i;:::-;79136:9:::1;::::0;::::1;;79135:10;79127:36;;;::::0;-1:-1:-1;;;79127:36:0;;12969:2:1;79127:36:0::1;::::0;::::1;12951:21:1::0;13008:2;12988:18;;;12981:30;-1:-1:-1;;;13027:18:1;;;13020:43;13080:18;;79127:36:0::1;12767:337:1::0;79127:36:0::1;79208:1;79196:9;;:13;:45;;;;;79232:9;;79213:15;:28;;79196:45;79174:112;;;::::0;-1:-1:-1;;;79174:112:0;;16253:2:1;79174:112:0::1;::::0;::::1;16235:21:1::0;16292:2;16272:18;;;16265:30;-1:-1:-1;;;16311:18:1;;;16304:47;16368:18;;79174:112:0::1;16051:341:1::0;79174:112:0::1;79405:16;::::0;79367:144:::1;::::0;-1:-1:-1;;;;;79405:16:0::1;79440:28;79452:3:::0;79457:10:::1;79440:11;:28::i;79367:144::-;79345:221;;;::::0;-1:-1:-1;;;79345:221:0;;14121:2:1;79345:221:0::1;::::0;::::1;14103:21:1::0;14160:2;14140:18;;;14133:30;14199:29;14179:18;;;14172:57;14246:18;;79345:221:0::1;13919:351:1::0;79345:221:0::1;79636:17;::::0;79612:10:::1;79599:24;::::0;;;:12:::1;:24;::::0;;;;;:33:::1;::::0;79626:6;;79599:33:::1;:::i;:::-;:54;;79577:128;;;;-1:-1:-1::0;;;79577:128:0::1;;;;;;;:::i;:::-;79733:1;79724:6;:10;79716:54;;;::::0;-1:-1:-1;;;79716:54:0;;16599:2:1;79716:54:0::1;::::0;::::1;16581:21:1::0;16638:2;16618:18;;;16611:30;16677:33;16657:18;;;16650:61;16728:18;;79716:54:0::1;16397:355:1::0;79716:54:0::1;79815:9;;79805:6;79789:13;25586:12:::0;;25376:7;25570:13;:28;;25323:312;79789:13:::1;:22;;;;:::i;:::-;:35;;79781:57;;;::::0;-1:-1:-1;;;79781:57:0;;16959:2:1;79781:57:0::1;::::0;::::1;16941:21:1::0;16998:1;16978:18;;;16971:29;-1:-1:-1;;;17016:18:1;;;17009:39;17065:18;;79781:57:0::1;16757:332:1::0;79781:57:0::1;79870:14;79878:6:::0;74094:9:::1;79870:14;:::i;:::-;79857:9;:27;;79849:57;;;::::0;-1:-1:-1;;;79849:57:0;;17469:2:1;79849:57:0::1;::::0;::::1;17451:21:1::0;17508:2;17488:18;;;17481:30;-1:-1:-1;;;17527:18:1;;;17520:47;17584:18;;79849:57:0::1;17267:341:1::0;79849:57:0::1;79932:10;79919:24;::::0;;;:12:::1;:24;::::0;;;;:34;;79947:6;;79919:24;:34:::1;::::0;79947:6;;79919:34:::1;:::i;:::-;::::0;;;-1:-1:-1;79966:29:0::1;::::0;-1:-1:-1;79976:10:0::1;79988:6:::0;79966:9:::1;:29::i;75451:126::-:0;72397:6;;-1:-1:-1;;;;;72397:6:0;19927:10;72544:23;72536:68;;;;-1:-1:-1;;;72536:68:0;;;;;;;:::i;:::-;75537:32;;::::1;::::0;:14:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;73233:201::-:0;72397:6;;-1:-1:-1;;;;;72397:6:0;19927:10;72544:23;72536:68;;;;-1:-1:-1;;;72536:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;73322:22:0;::::1;73314:73;;;::::0;-1:-1:-1;;;73314:73:0;;17815:2:1;73314:73:0::1;::::0;::::1;17797:21:1::0;17854:2;17834:18;;;17827:30;17893:34;17873:18;;;17866:62;-1:-1:-1;;;17944:18:1;;;17937:36;17990:19;;73314:73:0::1;17613:402:1::0;73314:73:0::1;73398:28;73417:8;73398:18;:28::i;:::-;73233:201:::0;:::o;11890:326::-;-1:-1:-1;;;;;12185:19:0;;:23;;;11890:326::o;32689:174::-;32746:4;32810:13;;32800:7;:23;32770:85;;;;-1:-1:-1;;32828:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;32828:27:0;;;;32827:28;;32689:174::o;41911:196::-;42026:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;42026:29:0;-1:-1:-1;;;;;42026:29:0;;;;;;;;;42071:28;;42026:24;;42071:28;;;;;;;41911:196;;;:::o;32947:104::-;33016:27;33026:2;33030:8;33016:27;;;;;;;;;;;;:9;:27::i;68012:248::-;68222:12;;-1:-1:-1;;;;;68202:16:0;;68158:7;68202:16;;;:7;:16;;;;;;68158:7;;68237:15;;68186:32;;:13;:32;:::i;:::-;68185:49;;;;:::i;:::-;:67;;;;:::i;:::-;68178:74;68012:248;-1:-1:-1;;;;68012:248:0:o;13151:317::-;13266:6;13241:21;:31;;13233:73;;;;-1:-1:-1;;;13233:73:0;;18609:2:1;13233:73:0;;;18591:21:1;18648:2;18628:18;;;18621:30;18687:31;18667:18;;;18660:59;18736:18;;13233:73:0;18407:353:1;13233:73:0;13320:12;13338:9;-1:-1:-1;;;;;13338:14:0;13360:6;13338:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13319:52;;;13390:7;13382:78;;;;-1:-1:-1;;;13382:78:0;;19177:2:1;13382:78:0;;;19159:21:1;19216:2;19196:18;;;19189:30;19255:34;19235:18;;;19228:62;19326:28;19306:18;;;19299:56;19372:19;;13382:78:0;18975:422:1;36859:2130:0;36974:35;37012:21;37025:7;37012:12;:21::i;:::-;36974:59;;37072:4;-1:-1:-1;;;;;37050:26:0;:13;:18;;;-1:-1:-1;;;;;37050:26:0;;37046:67;;37085:28;;-1:-1:-1;;;37085:28:0;;;;;;;;;;;37046:67;37126:22;19927:10;-1:-1:-1;;;;;37152:20:0;;;;:73;;-1:-1:-1;37189:36:0;37206:4;19927:10;31336:164;:::i;37189:36::-;37152:126;;;-1:-1:-1;19927:10:0;37242:20;37254:7;37242:11;:20::i;:::-;-1:-1:-1;;;;;37242:36:0;;37152:126;37126:153;;37297:17;37292:66;;37323:35;;-1:-1:-1;;;37323:35:0;;;;;;;;;;;37292:66;-1:-1:-1;;;;;37373:16:0;;37369:52;;37398:23;;-1:-1:-1;;;37398:23:0;;;;;;;;;;;37369:52;37542:35;37559:1;37563:7;37572:4;37542:8;:35::i;:::-;-1:-1:-1;;;;;37873:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;37873:31:0;;;-1:-1:-1;;;;;37873:31:0;;;-1:-1:-1;;37873:31:0;;;;;;;37919:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;37919:29:0;;;;;;;;;;;37999:20;;;:11;:20;;;;;;38034:18;;-1:-1:-1;;;;;;38067:49:0;;;;-1:-1:-1;;;38100:15:0;38067:49;;;;;;;;;;38390:11;;38450:24;;;;;38493:13;;37999:20;;38450:24;;38493:13;38489:384;;38703:13;;38688:11;:28;38684:174;;38741:20;;38810:28;;;;-1:-1:-1;;;;;38784:54:0;-1:-1:-1;;;38784:54:0;-1:-1:-1;;;;;;38784:54:0;;;-1:-1:-1;;;;;38741:20:0;;38784:54;;;;38684:174;37848:1036;;;38920:7;38916:2;-1:-1:-1;;;;;38901:27:0;38910:4;-1:-1:-1;;;;;38901:27:0;;;;;;;;;;;36963:2026;;36859:2130;;;:::o;71129:120::-;70141:7;;;;70665:41;;;;-1:-1:-1;;;70665:41:0;;19604:2:1;70665:41:0;;;19586:21:1;19643:2;19623:18;;;19616:30;-1:-1:-1;;;19662:18:1;;;19655:50;19722:18;;70665:41:0;19402:344:1;70665:41:0;71188:7:::1;:15:::0;;-1:-1:-1;;71188:15:0::1;::::0;;71219:22:::1;19927:10:::0;71228:12:::1;71219:22;::::0;-1:-1:-1;;;;;2153:32:1;;;2135:51;;2123:2;2108:18;71219:22:0::1;;;;;;;71129:120::o:0;58027:211::-;58171:58;;;-1:-1:-1;;;;;206:32:1;;58171:58:0;;;188:51:1;255:18;;;;248:34;;;58171:58:0;;;;;;;;;;161:18:1;;;;58171:58:0;;;;;;;;-1:-1:-1;;;;;58171:58:0;-1:-1:-1;;;58171:58:0;;;58144:86;;58164:5;;58144:19;:86::i;27833:1111::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;27944:7:0;28029:13;;28022:4;:20;28018:859;;;28063:31;28097:17;;;:11;:17;;;;;;;;;28063:51;;;;;;;;;-1:-1:-1;;;;;28063:51:0;;;;-1:-1:-1;;;28063:51:0;;-1:-1:-1;;;;;28063:51:0;;;;;;;;-1:-1:-1;;;28063:51:0;;;;;;;;;;;;;;28133:729;;28183:14;;-1:-1:-1;;;;;28183:28:0;;28179:101;;28247:9;27833:1111;-1:-1:-1;;;27833:1111:0:o;28179:101::-;-1:-1:-1;;;28622:6:0;28667:17;;;;:11;:17;;;;;;;;;28655:29;;;;;;;;;-1:-1:-1;;;;;28655:29:0;;;;;-1:-1:-1;;;28655:29:0;;-1:-1:-1;;;;;28655:29:0;;;;;;;;-1:-1:-1;;;28655:29:0;;;;;;;;;;;;;28715:28;28711:109;;28783:9;27833:1111;-1:-1:-1;;;27833:1111:0:o;28711:109::-;28582:261;;;28044:833;28018:859;28905:31;;-1:-1:-1;;;28905:31:0;;;;;;;;;;;73594:191;73687:6;;;-1:-1:-1;;;;;73704:17:0;;;-1:-1:-1;;;;;;73704:17:0;;;;;;;73737:40;;73687:6;;;73704:17;73687:6;;73737:40;;73668:16;;73737:40;73657:128;73594:191;:::o;77495:173::-;77594:7;77647:3;77652:6;77636:23;;;;;;;;19925:25:1;;;-1:-1:-1;;;;;19986:32:1;19981:2;19966:18;;19959:60;19913:2;19898:18;;19751:274;77636:23:0;;;;;;;;;;;;;77626:34;;;;;;77619:41;;77495:173;;;;:::o;76893:399::-;77050:4;77120:55;77165:9;77120:36;:11;53324:58;;21798:66:1;53324:58:0;;;21786:79:1;21881:12;;;21874:28;;;53191:7:0;;21918:12:1;;53324:58:0;;;;;;;;;;;;53314:69;;;;;;53307:76;;53122:269;;;;77120:36;:44;;:55::i;:::-;-1:-1:-1;;;;;77087:88:0;:16;-1:-1:-1;;;;;77087:88:0;;77067:108;;76893:399;;;;;:::o;70870:118::-;70141:7;;;;70395:9;70387:38;;;;-1:-1:-1;;;70387:38:0;;;;;;;:::i;:::-;70930:7:::1;:14:::0;;-1:-1:-1;;70930:14:0::1;70940:4;70930:14;::::0;;70960:20:::1;70967:12;19927:10:::0;;19847:98;42599:667;42783:72;;-1:-1:-1;;;42783:72:0;;42762:4;;-1:-1:-1;;;;;42783:36:0;;;;;:72;;19927:10;;42834:4;;42840:7;;42849:5;;42783:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42783:72:0;;;;;;;;-1:-1:-1;;42783:72:0;;;;;;;;;;;;:::i;:::-;;;42779:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43017:6;:13;43034:1;43017:18;43013:235;;43063:40;;-1:-1:-1;;;43063:40:0;;;;;;;;;;;43013:235;43206:6;43200:13;43191:6;43187:2;43183:15;43176:38;42779:480;-1:-1:-1;;;;;;42902:55:0;-1:-1:-1;;;42902:55:0;;-1:-1:-1;42599:667:0;;;;;;:::o;20434:723::-;20490:13;20711:5;20720:1;20711:10;20707:53;;-1:-1:-1;;20738:10:0;;;;;;;;;;;;-1:-1:-1;;;20738:10:0;;;;;20434:723::o;20707:53::-;20785:5;20770:12;20826:78;20833:9;;20826:78;;20859:8;;;;:::i;:::-;;-1:-1:-1;20882:10:0;;-1:-1:-1;20890:2:0;20882:10;;:::i;:::-;;;20826:78;;;20914:19;20946:6;-1:-1:-1;;;;;20936:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20936:17:0;;20914:39;;20964:154;20971:10;;20964:154;;20998:11;21008:1;20998:11;;:::i;:::-;;-1:-1:-1;21067:10:0;21075:2;21067:5;:10;:::i;:::-;21054:24;;:2;:24;:::i;:::-;21041:39;;21024:6;21031;21024:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;21024:56:0;;;;;;;;-1:-1:-1;21095:11:0;21104:2;21095:11;;:::i;:::-;;;20964:154;;33424:1749;33547:20;33570:13;-1:-1:-1;;;;;33598:16:0;;33594:48;;33623:19;;-1:-1:-1;;;33623:19:0;;;;;;;;;;;33594:48;33657:8;33669:1;33657:13;33653:44;;33679:18;;-1:-1:-1;;;33679:18:0;;;;;;;;;;;33653:44;-1:-1:-1;;;;;34048:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;34107:49:0;;-1:-1:-1;;;;;34048:44:0;;;;;;;34107:49;;;;-1:-1:-1;;34048:44:0;;;;;;34107:49;;;;;;;;;;;;;;;;34173:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;34223:66:0;;;-1:-1:-1;;;34273:15:0;34223:66;;;;;;;;;;;;;34173:25;;34370:23;;;;12185:19;:23;34410:631;;34450:313;34481:38;;34506:12;;-1:-1:-1;;;;;34481:38:0;;;34498:1;;34481:38;;34498:1;;34481:38;34547:69;34586:1;34590:2;34594:14;;;;;;34610:5;34547:30;:69::i;:::-;34542:174;;34652:40;;-1:-1:-1;;;34652:40:0;;;;;;;;;;;34542:174;34758:3;34743:12;:18;34450:313;;34844:12;34827:13;;:29;34823:43;;34858:8;;;34823:43;34410:631;;;34907:119;34938:40;;34963:14;;;;;-1:-1:-1;;;;;34938:40:0;;;34955:1;;34938:40;;34955:1;;34938:40;35021:3;35006:12;:18;34907:119;;34410:631;-1:-1:-1;35055:13:0;:28;;;35105:60;;35138:2;35142:12;35156:8;35105:60;:::i;60600:716::-;61024:23;61050:69;61078:4;61050:69;;;;;;;;;;;;;;;;;61058:5;-1:-1:-1;;;;;61050:27:0;;;:69;;;;;:::i;:::-;61134:17;;61024:95;;-1:-1:-1;61134:21:0;61130:179;;61231:10;61220:30;;;;;;;;;;;;:::i;:::-;61212:85;;;;-1:-1:-1;;;61212:85:0;;21347:2:1;61212:85:0;;;21329:21:1;21386:2;21366:18;;;21359:30;21425:34;21405:18;;;21398:62;-1:-1:-1;;;21476:18:1;;;21469:40;21526:19;;61212:85:0;21145:406:1;49320:231:0;49398:7;49419:17;49438:18;49460:27;49471:4;49477:9;49460:10;:27::i;:::-;49418:69;;;;49498:18;49510:5;49498:11;:18::i;:::-;-1:-1:-1;49534:9:0;49320:231;-1:-1:-1;;;49320:231:0:o;14635:229::-;14772:12;14804:52;14826:6;14834:4;14840:1;14843:12;14804:21;:52::i;47210:1308::-;47291:7;47300:12;47525:9;:16;47545:2;47525:22;47521:990;;47821:4;47806:20;;47800:27;47871:4;47856:20;;47850:27;47929:4;47914:20;;47908:27;47564:9;47900:36;47972:25;47983:4;47900:36;47800:27;47850;47972:10;:25::i;:::-;47965:32;;;;;;;;;47521:990;48019:9;:16;48039:2;48019:22;48015:496;;48294:4;48279:20;;48273:27;48345:4;48330:20;;48324:27;48387:23;48398:4;48273:27;48324;48387:10;:23::i;:::-;48380:30;;;;;;;;48015:496;-1:-1:-1;48459:1:0;;-1:-1:-1;48463:35:0;48015:496;47210:1308;;;;;:::o;45481:643::-;45559:20;45550:5;:29;;;;;;;;:::i;:::-;;45546:571;;45481:643;:::o;45546:571::-;45657:29;45648:5;:38;;;;;;;;:::i;:::-;;45644:473;;45703:34;;-1:-1:-1;;;45703:34:0;;22275:2:1;45703:34:0;;;22257:21:1;22314:2;22294:18;;;22287:30;22353:26;22333:18;;;22326:54;22397:18;;45703:34:0;22073:348:1;45644:473:0;45768:35;45759:5;:44;;;;;;;;:::i;:::-;;45755:362;;45820:41;;-1:-1:-1;;;45820:41:0;;22628:2:1;45820:41:0;;;22610:21:1;22667:2;22647:18;;;22640:30;22706:33;22686:18;;;22679:61;22757:18;;45820:41:0;22426:355:1;45755:362:0;45892:30;45883:5;:39;;;;;;;;:::i;:::-;;45879:238;;45939:44;;-1:-1:-1;;;45939:44:0;;22988:2:1;45939:44:0;;;22970:21:1;23027:2;23007:18;;;23000:30;23066:34;23046:18;;;23039:62;-1:-1:-1;;;23117:18:1;;;23110:32;23159:19;;45939:44:0;22786:398:1;45879:238:0;46014:30;46005:5;:39;;;;;;;;:::i;:::-;;46001:116;;46061:44;;-1:-1:-1;;;46061:44:0;;23391:2:1;46061:44:0;;;23373:21:1;23430:2;23410:18;;;23403:30;23469:34;23449:18;;;23442:62;-1:-1:-1;;;23520:18:1;;;23513:32;23562:19;;46061:44:0;23189:398:1;15755:510:0;15925:12;15983:5;15958:21;:30;;15950:81;;;;-1:-1:-1;;;15950:81:0;;23794:2:1;15950:81:0;;;23776:21:1;23833:2;23813:18;;;23806:30;23872:34;23852:18;;;23845:62;-1:-1:-1;;;23923:18:1;;;23916:36;23969:19;;15950:81:0;23592:402:1;15950:81:0;-1:-1:-1;;;;;12185:19:0;;;16042:60;;;;-1:-1:-1;;;16042:60:0;;24201:2:1;16042:60:0;;;24183:21:1;24240:2;24220:18;;;24213:30;24279:31;24259:18;;;24252:59;24328:18;;16042:60:0;23999:353:1;16042:60:0;16116:12;16130:23;16157:6;-1:-1:-1;;;;;16157:11:0;16176:5;16183:4;16157:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16115:73;;;;16206:51;16223:7;16232:10;16244:12;16206:16;:51::i;:::-;16199:58;15755:510;-1:-1:-1;;;;;;;15755:510:0:o;50772:1632::-;50903:7;;51837:66;51824:79;;51820:163;;;-1:-1:-1;51936:1:0;;-1:-1:-1;51940:30:0;51920:51;;51820:163;51997:1;:7;;52002:2;51997:7;;:18;;;;;52008:1;:7;;52013:2;52008:7;;51997:18;51993:102;;;-1:-1:-1;52048:1:0;;-1:-1:-1;52052:30:0;52032:51;;51993:102;52209:24;;;52192:14;52209:24;;;;;;;;;24863:25:1;;;24936:4;24924:17;;24904:18;;;24897:45;;;;24958:18;;;24951:34;;;25001:18;;;24994:34;;;52209:24:0;;24835:19:1;;52209:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52209:24:0;;-1:-1:-1;;52209:24:0;;;-1:-1:-1;;;;;;;52248:20:0;;52244:103;;52301:1;52305:29;52285:50;;;;;;;52244:103;52367:6;-1:-1:-1;52375:20:0;;-1:-1:-1;50772:1632:0;;;;;;;;:::o;49814:344::-;49928:7;;-1:-1:-1;;;;;49974:80:0;;49928:7;50081:25;50097:3;50082:18;;;50104:2;50081:25;:::i;:::-;50065:42;;50125:25;50136:4;50142:1;50145;50148;50125:10;:25::i;:::-;50118:32;;;;;;49814:344;;;;;;:::o;18441:712::-;18591:12;18620:7;18616:530;;;-1:-1:-1;18651:10:0;18644:17;;18616:530;18765:17;;:21;18761:374;;18963:10;18957:17;19024:15;19011:10;19007:2;19003:19;18996:44;18761:374;19106:12;19099:20;;-1:-1:-1;;;19099:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;293:131:1;-1:-1:-1;;;;;;367:32:1;;357:43;;347:71;;414:1;411;404:12;429:245;487:6;540:2;528:9;519:7;515:23;511:32;508:52;;;556:1;553;546:12;508:52;595:9;582:23;614:30;638:5;614:30;:::i;1053:258::-;1125:1;1135:113;1149:6;1146:1;1143:13;1135:113;;;1225:11;;;1219:18;1206:11;;;1199:39;1171:2;1164:10;1135:113;;;1266:6;1263:1;1260:13;1257:48;;;-1:-1:-1;;1301:1:1;1283:16;;1276:27;1053:258::o;1316:::-;1358:3;1396:5;1390:12;1423:6;1418:3;1411:19;1439:63;1495:6;1488:4;1483:3;1479:14;1472:4;1465:5;1461:16;1439:63;:::i;:::-;1556:2;1535:15;-1:-1:-1;;1531:29:1;1522:39;;;;1563:4;1518:50;;1316:258;-1:-1:-1;;1316:258:1:o;1579:220::-;1728:2;1717:9;1710:21;1691:4;1748:45;1789:2;1778:9;1774:18;1766:6;1748:45;:::i;1804:180::-;1863:6;1916:2;1904:9;1895:7;1891:23;1887:32;1884:52;;;1932:1;1929;1922:12;1884:52;-1:-1:-1;1955:23:1;;1804:180;-1:-1:-1;1804:180:1:o;2197:131::-;-1:-1:-1;;;;;2272:31:1;;2262:42;;2252:70;;2318:1;2315;2308:12;2333:315;2401:6;2409;2462:2;2450:9;2441:7;2437:23;2433:32;2430:52;;;2478:1;2475;2468:12;2430:52;2517:9;2504:23;2536:31;2561:5;2536:31;:::i;:::-;2586:5;2638:2;2623:18;;;;2610:32;;-1:-1:-1;;;2333:315:1:o;2653:255::-;2720:6;2773:2;2761:9;2752:7;2748:23;2744:32;2741:52;;;2789:1;2786;2779:12;2741:52;2828:9;2815:23;2847:31;2872:5;2847:31;:::i;2913:456::-;2990:6;2998;3006;3059:2;3047:9;3038:7;3034:23;3030:32;3027:52;;;3075:1;3072;3065:12;3027:52;3114:9;3101:23;3133:31;3158:5;3133:31;:::i;:::-;3183:5;-1:-1:-1;3240:2:1;3225:18;;3212:32;3253:33;3212:32;3253:33;:::i;:::-;2913:456;;3305:7;;-1:-1:-1;;;3359:2:1;3344:18;;;;3331:32;;2913:456::o;3374:403::-;3457:6;3465;3518:2;3506:9;3497:7;3493:23;3489:32;3486:52;;;3534:1;3531;3524:12;3486:52;3573:9;3560:23;3592:31;3617:5;3592:31;:::i;:::-;3642:5;-1:-1:-1;3699:2:1;3684:18;;3671:32;3712:33;3671:32;3712:33;:::i;:::-;3764:7;3754:17;;;3374:403;;;;;:::o;4034:127::-;4095:10;4090:3;4086:20;4083:1;4076:31;4126:4;4123:1;4116:15;4150:4;4147:1;4140:15;4166:632;4231:5;-1:-1:-1;;;;;4302:2:1;4294:6;4291:14;4288:40;;;4308:18;;:::i;:::-;4383:2;4377:9;4351:2;4437:15;;-1:-1:-1;;4433:24:1;;;4459:2;4429:33;4425:42;4413:55;;;4483:18;;;4503:22;;;4480:46;4477:72;;;4529:18;;:::i;:::-;4569:10;4565:2;4558:22;4598:6;4589:15;;4628:6;4620;4613:22;4668:3;4659:6;4654:3;4650:16;4647:25;4644:45;;;4685:1;4682;4675:12;4644:45;4735:6;4730:3;4723:4;4715:6;4711:17;4698:44;4790:1;4783:4;4774:6;4766;4762:19;4758:30;4751:41;;;;4166:632;;;;;:::o;4803:451::-;4872:6;4925:2;4913:9;4904:7;4900:23;4896:32;4893:52;;;4941:1;4938;4931:12;4893:52;4981:9;4968:23;-1:-1:-1;;;;;5006:6:1;5003:30;5000:50;;;5046:1;5043;5036:12;5000:50;5069:22;;5122:4;5114:13;;5110:27;-1:-1:-1;5100:55:1;;5151:1;5148;5141:12;5100:55;5174:74;5240:7;5235:2;5222:16;5217:2;5213;5209:11;5174:74;:::i;5259:347::-;5310:8;5320:6;5374:3;5367:4;5359:6;5355:17;5351:27;5341:55;;5392:1;5389;5382:12;5341:55;-1:-1:-1;5415:20:1;;-1:-1:-1;;;;;5447:30:1;;5444:50;;;5490:1;5487;5480:12;5444:50;5527:4;5519:6;5515:17;5503:29;;5579:3;5572:4;5563:6;5555;5551:19;5547:30;5544:39;5541:59;;;5596:1;5593;5586:12;5611:477;5690:6;5698;5706;5759:2;5747:9;5738:7;5734:23;5730:32;5727:52;;;5775:1;5772;5765:12;5727:52;5811:9;5798:23;5788:33;;5872:2;5861:9;5857:18;5844:32;-1:-1:-1;;;;;5891:6:1;5888:30;5885:50;;;5931:1;5928;5921:12;5885:50;5970:58;6020:7;6011:6;6000:9;5996:22;5970:58;:::i;:::-;5611:477;;6047:8;;-1:-1:-1;5944:84:1;;-1:-1:-1;;;;5611:477:1:o;6093:367::-;6156:8;6166:6;6220:3;6213:4;6205:6;6201:17;6197:27;6187:55;;6238:1;6235;6228:12;6187:55;-1:-1:-1;6261:20:1;;-1:-1:-1;;;;;6293:30:1;;6290:50;;;6336:1;6333;6326:12;6290:50;6373:4;6365:6;6361:17;6349:29;;6433:3;6426:4;6416:6;6413:1;6409:14;6401:6;6397:27;6393:38;6390:47;6387:67;;;6450:1;6447;6440:12;6465:773;6587:6;6595;6603;6611;6664:2;6652:9;6643:7;6639:23;6635:32;6632:52;;;6680:1;6677;6670:12;6632:52;6720:9;6707:23;-1:-1:-1;;;;;6790:2:1;6782:6;6779:14;6776:34;;;6806:1;6803;6796:12;6776:34;6845:70;6907:7;6898:6;6887:9;6883:22;6845:70;:::i;:::-;6934:8;;-1:-1:-1;6819:96:1;-1:-1:-1;7022:2:1;7007:18;;6994:32;;-1:-1:-1;7038:16:1;;;7035:36;;;7067:1;7064;7057:12;7035:36;;7106:72;7170:7;7159:8;7148:9;7144:24;7106:72;:::i;:::-;6465:773;;;;-1:-1:-1;7197:8:1;-1:-1:-1;;;;6465:773:1:o;7243:118::-;7329:5;7322:13;7315:21;7308:5;7305:32;7295:60;;7351:1;7348;7341:12;7366:382;7431:6;7439;7492:2;7480:9;7471:7;7467:23;7463:32;7460:52;;;7508:1;7505;7498:12;7460:52;7547:9;7534:23;7566:31;7591:5;7566:31;:::i;:::-;7616:5;-1:-1:-1;7673:2:1;7658:18;;7645:32;7686:30;7645:32;7686:30;:::i;7753:795::-;7848:6;7856;7864;7872;7925:3;7913:9;7904:7;7900:23;7896:33;7893:53;;;7942:1;7939;7932:12;7893:53;7981:9;7968:23;8000:31;8025:5;8000:31;:::i;:::-;8050:5;-1:-1:-1;8107:2:1;8092:18;;8079:32;8120:33;8079:32;8120:33;:::i;:::-;8172:7;-1:-1:-1;8226:2:1;8211:18;;8198:32;;-1:-1:-1;8281:2:1;8266:18;;8253:32;-1:-1:-1;;;;;8297:30:1;;8294:50;;;8340:1;8337;8330:12;8294:50;8363:22;;8416:4;8408:13;;8404:27;-1:-1:-1;8394:55:1;;8445:1;8442;8435:12;8394:55;8468:74;8534:7;8529:2;8516:16;8511:2;8507;8503:11;8468:74;:::i;:::-;8458:84;;;7753:795;;;;;;;:::o;8553:545::-;8641:6;8649;8657;8665;8718:2;8706:9;8697:7;8693:23;8689:32;8686:52;;;8734:1;8731;8724:12;8686:52;8770:9;8757:23;8747:33;;8827:2;8816:9;8812:18;8799:32;8789:42;;8882:2;8871:9;8867:18;8854:32;-1:-1:-1;;;;;8901:6:1;8898:30;8895:50;;;8941:1;8938;8931:12;8895:50;8980:58;9030:7;9021:6;9010:9;9006:22;8980:58;:::i;9763:380::-;9842:1;9838:12;;;;9885;;;9906:61;;9960:4;9952:6;9948:17;9938:27;;9906:61;10013:2;10005:6;10002:14;9982:18;9979:38;9976:161;;10059:10;10054:3;10050:20;10047:1;10040:31;10094:4;10091:1;10084:15;10122:4;10119:1;10112:15;9976:161;;9763:380;;;:::o;10148:356::-;10350:2;10332:21;;;10369:18;;;10362:30;10428:34;10423:2;10408:18;;10401:62;10495:2;10480:18;;10148:356::o;10509:127::-;10570:10;10565:3;10561:20;10558:1;10551:31;10601:4;10598:1;10591:15;10625:4;10622:1;10615:15;10641:128;10681:3;10712:1;10708:6;10705:1;10702:13;10699:39;;;10718:18;;:::i;:::-;-1:-1:-1;10754:9:1;;10641:128::o;10774:348::-;10976:2;10958:21;;;11015:2;10995:18;;;10988:30;11054:26;11049:2;11034:18;;11027:54;11113:2;11098:18;;10774:348::o;11127:402::-;11329:2;11311:21;;;11368:2;11348:18;;;11341:30;11407:34;11402:2;11387:18;;11380:62;-1:-1:-1;;;11473:2:1;11458:18;;11451:36;11519:3;11504:19;;11127:402::o;11534:407::-;11736:2;11718:21;;;11775:2;11755:18;;;11748:30;11814:34;11809:2;11794:18;;11787:62;-1:-1:-1;;;11880:2:1;11865:18;;11858:41;11931:3;11916:19;;11534:407::o;12233:184::-;12303:6;12356:2;12344:9;12335:7;12331:23;12327:32;12324:52;;;12372:1;12369;12362:12;12324:52;-1:-1:-1;12395:16:1;;12233:184;-1:-1:-1;12233:184:1:o;12422:340::-;12624:2;12606:21;;;12663:2;12643:18;;;12636:30;-1:-1:-1;;;12697:2:1;12682:18;;12675:46;12753:2;12738:18;;12422:340::o;14956:127::-;15017:10;15012:3;15008:20;15005:1;14998:31;15048:4;15045:1;15038:15;15072:4;15069:1;15062:15;15088:135;15127:3;15148:17;;;15145:43;;15168:18;;:::i;:::-;-1:-1:-1;15215:1:1;15204:13;;15088:135::o;15576:470::-;15755:3;15793:6;15787:13;15809:53;15855:6;15850:3;15843:4;15835:6;15831:17;15809:53;:::i;:::-;15925:13;;15884:16;;;;15947:57;15925:13;15884:16;15981:4;15969:17;;15947:57;:::i;:::-;16020:20;;15576:470;-1:-1:-1;;;;15576:470:1:o;17094:168::-;17134:7;17200:1;17196;17192:6;17188:14;17185:1;17182:21;17177:1;17170:9;17163:17;17159:45;17156:71;;;17207:18;;:::i;:::-;-1:-1:-1;17247:9:1;;17094:168::o;18020:127::-;18081:10;18076:3;18072:20;18069:1;18062:31;18112:4;18109:1;18102:15;18136:4;18133:1;18126:15;18152:120;18192:1;18218;18208:35;;18223:18;;:::i;:::-;-1:-1:-1;18257:9:1;;18152:120::o;18277:125::-;18317:4;18345:1;18342;18339:8;18336:34;;;18350:18;;:::i;:::-;-1:-1:-1;18387:9:1;;18277:125::o;20030:489::-;-1:-1:-1;;;;;20299:15:1;;;20281:34;;20351:15;;20346:2;20331:18;;20324:43;20398:2;20383:18;;20376:34;;;20446:3;20441:2;20426:18;;20419:31;;;20224:4;;20467:46;;20493:19;;20485:6;20467:46;:::i;:::-;20459:54;20030:489;-1:-1:-1;;;;;;20030:489:1:o;20524:249::-;20593:6;20646:2;20634:9;20625:7;20621:23;20617:32;20614:52;;;20662:1;20659;20652:12;20614:52;20694:9;20688:16;20713:30;20737:5;20713:30;:::i;20778:112::-;20810:1;20836;20826:35;;20841:18;;:::i;:::-;-1:-1:-1;20875:9:1;;20778:112::o;20895:245::-;20962:6;21015:2;21003:9;20994:7;20990:23;20986:32;20983:52;;;21031:1;21028;21021:12;20983:52;21063:9;21057:16;21082:28;21104:5;21082:28;:::i;21941:127::-;22002:10;21997:3;21993:20;21990:1;21983:31;22033:4;22030:1;22023:15;22057:4;22054:1;22047:15;24357:274;24486:3;24524:6;24518:13;24540:53;24586:6;24581:3;24574:4;24566:6;24562:17;24540:53;:::i;:::-;24609:16;;;;;24357:274;-1:-1:-1;;24357:274:1:o

Swarm Source

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