ETH Price: $4,006.97 (+3.04%)

Token

Lovelypop (LP)
 

Overview

Max Total Supply

5,000 LP

Holders

1,869

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
*异世界重生之我是土狗王.eth
Balance
1 LP
0x854eb34197dc141dde46708a80286457b9af32c2
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:
Lovelypop

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-14
*/

// SPDX-License-Identifier: MIT
/*
.........................................................................................................................................................................
.........................................................................................................................................................................
..............]/@@@@@`...................................................................................................................................................
.........,/@@@@@@@@@^......................................................../@@@@@/.....................................................................................
......,@@@/`.@@@@@@^........................................................=@@@@@/......................................................................................
..../@@@/.../@@@@@^........................................................=@@@@@O.......................................................................................
...@@@@`.../@@@@@^........................................................=@@@@@@...................................]]]]]]................................,]]]]]]........
..@@@@`.../@@@@@^.......]/@@@@@@`......=@@@@@@..,@@@@^......,/@@@@@@\....=@@@@@@.....@@@@@@^...=@@@@@@.............@@@@@@^]@@@@@\`........,/@@@@@@\......,@@@@@@.]@@@@@\.
.=@@@^...=@@@@@/.....,@@@@@@[[@@@^....=@@@@@@...@@@@@^...,@@@@@/`.@@@^..,@@@@@@.....@@@@@@^...=@@@@@@.............@@@@@@@@@@@@@@@@.....,@@@@@@[[\@@O.....@@@@@@@@@@@@@@@@
..,\@^..=@@@@@/..../@@@@@/...,@@@^...,@@@@@@....../@/..,@@@@@@...,@@@`.,@@@@@@`..../@@@@@^...,@@@@@@............./@@@@@/....@@@@@@...,@@@@@@`.../@@O....@@@@@@/....@@@@@@
.......=@@@@@/...,@@@@@@`.../@@@@\/@@@@@@@@......=@@../@@@@@/...=@@@`.,@@@@@@`..../@@@@@/...,@@@@@@`............/@@@@@/....,@@@@@O../@@@@@^...=@@@@@]O@@@@@@@^....=@@@@@^
......=@@@@@@...=@@@@@@.....\@@@/[`,@@@@@@`.....=@@`,@@@@@@^..,@@@/...@@@@@@`..../@@@@@/...,@@@@@@`............/@@@@@/...../@@@@@`,@@@@@@`....,@@@@[[.@@@@@@^.....@@@@@@.
.....=@@@@@@...=@@@@@@......@@@/..,@@@@@@`...../@@`,@@@@@@\/@@@/`....@@@@@@`....=@@@@@/...,@@@@@@`............=@@@@@/...../@@@@@^,@@@@@@`...../@@@.../@@@@@^.....@@@@@@`.
....,@@@@@@...=@@@@@@......@@@@...@@@@@@`....,@@@`.@@@@@@@[[`.......@@@@@@^....=@@@@@/....@@@@@@`............=@@@@@/...../@@@@@^,@@@@@@^...../@@@`../@@@@@^.....@@@@@@^..
...,@@@@@@`..,@@@@@@^....,@@@/...@@@@@@^..../@@/../@@@@@@........./@@@@@@^..../@@@@@@...,@@@@@@^.../@`......=@@@@@@.....@@@@@@^.O@@@@@/.....@@@@.../@@@@@/....,@@@@@@`...
..,@@@@@@`...=@@@@@@`..,@@@@`.../@@@@@O..,/@@@`...@@@@@@\......]@@@@@@@@@...]@@@@@@@^../@@@@@@^..,@/.......=@@@@@@..../@@@@@@`..@@@@@@^.../@@@^...=@@@@@/...,@@@@@@/.....
..@@@@@@`....=@@@@@@@@@@@@`.....O@@@@@@@@@@@`.....@@@@@@@@@@@@@/`.\@@@@@@@@@@\@@@@@@@@@@@@@@@^.]@@`.......,@@@@@@@@@@@@@@@@`....@@@@@@@@@@@@[....=@@@@@@@@@@@@@@@/.......
.@@@@@@\`.....,\@@@@@@/[........,@@@@@@@/`.........\@@@@@@@@[.....,@@@@@@@[...\@@@@@@`/@@@@@@@O`.........,@@@@@@\@@@@@@@[........\@@@@@@@[......=@@@@@@\@@@@@@/`.........
,[[\@@@@@@@\......................................................................]/@@@@@@@/.............@@@@@@`...............................=@@@@@@...................
......,\@@@@@@@].............................................................../@@/`=@@@@@/.............@@@@@@`...............................,@@@@@@....................
.........\@@@@@@@@@@@@@^.....................................................,@@^../@@@@@/.............@@@@@@^...............................,@@@@@@`....................
...........\@@@@@@@@@@^......................................................O@@\/@@@@@@`.............@@@@@@^...............................,@@@@@@`.....................
.............,@@@@@@@`.......................................................,@@@@@@@/`............../@@@@/`................................@@@@O[`......................
.........................................................................................................................................................................
.........................................................................................................................................................................
*/
// File: @openzeppelin/contracts/utils/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: erc721a/contracts/IERC721A.sol


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

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: erc721a/contracts/ERC721A.sol


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

pragma solidity ^0.8.4;


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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

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

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

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

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

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_NEXT_INITIALIZED;

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

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

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(from) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_BURNED | 
                BITMASK_NEXT_INITIALIZED;

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: contracts/lovelypop.sol


pragma solidity >= 0.8.9 < 0.9.0;




error AddressNotAllowlistVerified();

contract Lovelypop is Ownable, ERC721A {
    uint256 public immutable maxPerAddressDuringMint;
    uint256 public immutable collectionSize;
    uint256 public immutable amountForDevs;

    struct SaleConfig {
        uint32 publicSaleStartTime;
        uint64 publicPriceWei;
    }


    SaleConfig public saleConfig;

    // metadata URI
    string private _baseTokenURI;

    constructor(
        uint256 maxBatchSize_,
        uint256 collectionSize_,
        uint256 amountForDevs_
    ) ERC721A("Lovelypop", "LP") {
        require(
            maxBatchSize_ < collectionSize_,
            "MaxBarchSize should be smaller than collectionSize"
        );
        maxPerAddressDuringMint = maxBatchSize_;
        collectionSize = collectionSize_;
        amountForDevs = amountForDevs_;
    }

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

    function devMint(uint256 quantity) external onlyOwner {
        require(
            quantity <= amountForDevs,
            "Too many already minted before dev mint"
        );
        require(
            totalSupply() + quantity <= collectionSize,
            "Reached max supply"
        );
        _safeMint(msg.sender, quantity);
    }
    // Public Mint
    // *****************************************************************************
    // Public Functions
    function mint(uint256 quantity)
    external
    payable
    callerIsUser
    {
        require(isPublicSaleOn(), "Public sale has not begun yet");
        require(
            totalSupply() + quantity <= collectionSize,
            "Reached max supply"
        );
        require(
            numberMinted(msg.sender) + quantity <= maxPerAddressDuringMint,
            "Reached max quantity that one wallet can mint"
        );

        uint256 minted = numberMinted(msg.sender);
        uint256 priceWei;
        if (minted > 0) {
            priceWei = quantity * saleConfig.publicPriceWei;
        } else {
            priceWei = (quantity - 1) * saleConfig.publicPriceWei;
        }
        require(msg.value >= priceWei, "Insufficient funds");

        _safeMint(msg.sender, quantity);
        refundIfOver(priceWei);
    }

    function isPublicSaleOn() public view returns(bool) {
        require(
            saleConfig.publicSaleStartTime != 0,
            "Public Sale Time is TBD."
        );

        return block.timestamp >= saleConfig.publicSaleStartTime;
    }

    // Owner Controls

    // Public Views
    // *****************************************************************************
    function numberMinted(address minter) public view returns(uint256) {
        return _numberMinted(minter);
    }

    // Contract Controls (onlyOwner)
    // *****************************************************************************
    function setBaseURI(string calldata baseURI) external onlyOwner {
        _baseTokenURI = baseURI;
    }

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

    function setupSaleInfo(
        uint64 publicPriceWei,
        uint32 publicSaleStartTime
    ) public onlyOwner {
        saleConfig = SaleConfig(
            publicSaleStartTime,
            publicPriceWei
        );
    }

    // Internal Functions
    // *****************************************************************************

    function refundIfOver(uint256 price) internal {
        require(msg.value >= price, "Need to send more ETH.");
        if (msg.value > price) {
            payable(msg.sender).transfer(msg.value - price);
        }
    }

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

    function tokenURI(uint256 _tokenId) public view override returns (string memory) {
        require(_exists(_tokenId), "Token does not exist.");
        return bytes(_baseTokenURI).length > 0 ? string(
            abi.encodePacked(
              _baseTokenURI,
              Strings.toString(_tokenId),
              ".json"
            )
        ) : "";
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"maxBatchSize_","type":"uint256"},{"internalType":"uint256","name":"collectionSize_","type":"uint256"},{"internalType":"uint256","name":"amountForDevs_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"amountForDevs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectionSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","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":"isPublicSaleOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerAddressDuringMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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":"saleConfig","outputs":[{"internalType":"uint32","name":"publicSaleStartTime","type":"uint32"},{"internalType":"uint64","name":"publicPriceWei","type":"uint64"}],"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":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"publicPriceWei","type":"uint64"},{"internalType":"uint32","name":"publicSaleStartTime","type":"uint32"}],"name":"setupSaleInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60e06040523480156200001157600080fd5b5060405162003c4338038062003c43833981810160405281019062000037919062000334565b6040518060400160405280600981526020017f4c6f76656c79706f7000000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f4c50000000000000000000000000000000000000000000000000000000000000815250620000c3620000b76200017360201b60201c565b6200017b60201b60201c565b8160039080519060200190620000db92919062000244565b508060049080519060200190620000f492919062000244565b50620001056200023f60201b60201c565b600181905550505081831062000152576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001499062000417565b60405180910390fd5b82608081815250508160a081815250508060c081815250505050506200049e565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b828054620002529062000468565b90600052602060002090601f016020900481019282620002765760008555620002c2565b82601f106200029157805160ff1916838001178555620002c2565b82800160010185558215620002c2579182015b82811115620002c1578251825591602001919060010190620002a4565b5b509050620002d19190620002d5565b5090565b5b80821115620002f0576000816000905550600101620002d6565b5090565b600080fd5b6000819050919050565b6200030e81620002f9565b81146200031a57600080fd5b50565b6000815190506200032e8162000303565b92915050565b60008060006060848603121562000350576200034f620002f4565b5b600062000360868287016200031d565b935050602062000373868287016200031d565b925050604062000386868287016200031d565b9150509250925092565b600082825260208201905092915050565b7f4d6178426172636853697a652073686f756c6420626520736d616c6c6572207460008201527f68616e20636f6c6c656374696f6e53697a650000000000000000000000000000602082015250565b6000620003ff60328362000390565b91506200040c82620003a1565b604082019050919050565b600060208201905081810360008301526200043281620003f0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200048157607f821691505b6020821081141562000498576200049762000439565b5b50919050565b60805160a05160c051613759620004ea60003960008181610a92015261181b015260008181610af501528181610c1b0152610fee015260008181610e24015261106301526137596000f3fe6080604052600436106101b75760003560e01c80638bc35c2f116100ec578063b88d4fde1161008a578063dc33e68111610064578063dc33e681146105d8578063e985e9c514610615578063f2fde38b14610652578063fbe1aa511461067b576101b7565b8063b88d4fde14610549578063b97f020214610572578063c87b56dd1461059b576101b7565b806395d89b41116100c657806395d89b41146104c2578063a0712d68146104ed578063a22cb46514610509578063ac44600214610532576101b7565b80638bc35c2f146104405780638da5cb5b1461046b57806390aa0b0f14610496576101b7565b80633f5e47411161015957806355f804b31161013357806355f804b3146103865780636352211e146103af57806370a08231146103ec578063715018a614610429576101b7565b80633f5e47411461030757806342842e0e1461033257806345c0f5331461035b576101b7565b8063095ea7b311610195578063095ea7b31461026157806318160ddd1461028a57806323b872dd146102b5578063375a069a146102de576101b7565b806301ffc9a7146101bc57806306fdde03146101f9578063081812fc14610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de91906125a9565b6106a6565b6040516101f091906125f1565b60405180910390f35b34801561020557600080fd5b5061020e610738565b60405161021b91906126a5565b60405180910390f35b34801561023057600080fd5b5061024b600480360381019061024691906126fd565b6107ca565b604051610258919061276b565b60405180910390f35b34801561026d57600080fd5b50610288600480360381019061028391906127b2565b610846565b005b34801561029657600080fd5b5061029f6109ed565b6040516102ac9190612801565b60405180910390f35b3480156102c157600080fd5b506102dc60048036038101906102d7919061281c565b610a04565b005b3480156102ea57600080fd5b50610305600480360381019061030091906126fd565b610a14565b005b34801561031357600080fd5b5061031c610b75565b60405161032991906125f1565b60405180910390f35b34801561033e57600080fd5b506103596004803603810190610354919061281c565b610bf9565b005b34801561036757600080fd5b50610370610c19565b60405161037d9190612801565b60405180910390f35b34801561039257600080fd5b506103ad60048036038101906103a891906128d4565b610c3d565b005b3480156103bb57600080fd5b506103d660048036038101906103d191906126fd565b610ccf565b6040516103e3919061276b565b60405180910390f35b3480156103f857600080fd5b50610413600480360381019061040e9190612921565b610ce1565b6040516104209190612801565b60405180910390f35b34801561043557600080fd5b5061043e610d9a565b005b34801561044c57600080fd5b50610455610e22565b6040516104629190612801565b60405180910390f35b34801561047757600080fd5b50610480610e46565b60405161048d919061276b565b60405180910390f35b3480156104a257600080fd5b506104ab610e6f565b6040516104b9929190612990565b60405180910390f35b3480156104ce57600080fd5b506104d7610ea5565b6040516104e491906126a5565b60405180910390f35b610507600480360381019061050291906126fd565b610f37565b005b34801561051557600080fd5b50610530600480360381019061052b91906129e5565b6111bd565b005b34801561053e57600080fd5b50610547611335565b005b34801561055557600080fd5b50610570600480360381019061056b9190612b55565b611460565b005b34801561057e57600080fd5b5061059960048036038101906105949190612c30565b6114d3565b005b3480156105a757600080fd5b506105c260048036038101906105bd91906126fd565b6115d3565b6040516105cf91906126a5565b60405180910390f35b3480156105e457600080fd5b506105ff60048036038101906105fa9190612921565b61167b565b60405161060c9190612801565b60405180910390f35b34801561062157600080fd5b5061063c60048036038101906106379190612c70565b61168d565b60405161064991906125f1565b60405180910390f35b34801561065e57600080fd5b5061067960048036038101906106749190612921565b611721565b005b34801561068757600080fd5b50610690611819565b60405161069d9190612801565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061070157506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107315750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606003805461074790612cdf565b80601f016020809104026020016040519081016040528092919081815260200182805461077390612cdf565b80156107c05780601f10610795576101008083540402835291602001916107c0565b820191906000526020600020905b8154815290600101906020018083116107a357829003601f168201915b5050505050905090565b60006107d58261183d565b61080b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108518261189c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108b9576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108d861196a565b73ffffffffffffffffffffffffffffffffffffffff161461093b57610904816108ff61196a565b61168d565b61093a576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006109f7611972565b6002546001540303905090565b610a0f838383611977565b505050565b610a1c611d21565b73ffffffffffffffffffffffffffffffffffffffff16610a3a610e46565b73ffffffffffffffffffffffffffffffffffffffff1614610a90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8790612d5d565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000811115610af3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aea90612def565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081610b1d6109ed565b610b279190612e3e565b1115610b68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5f90612ee0565b60405180910390fd5b610b723382611d29565b50565b600080600960000160009054906101000a900463ffffffff1663ffffffff161415610bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcc90612f4c565b60405180910390fd5b600960000160009054906101000a900463ffffffff1663ffffffff16421015905090565b610c1483838360405180602001604052806000815250611460565b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610c45611d21565b73ffffffffffffffffffffffffffffffffffffffff16610c63610e46565b73ffffffffffffffffffffffffffffffffffffffff1614610cb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb090612d5d565b60405180910390fd5b8181600a9190610cca92919061249a565b505050565b6000610cda8261189c565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d49576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610da2611d21565b73ffffffffffffffffffffffffffffffffffffffff16610dc0610e46565b73ffffffffffffffffffffffffffffffffffffffff1614610e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0d90612d5d565b60405180910390fd5b610e206000611d47565b565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60098060000160009054906101000a900463ffffffff16908060000160049054906101000a900467ffffffffffffffff16905082565b606060048054610eb490612cdf565b80601f0160208091040260200160405190810160405280929190818152602001828054610ee090612cdf565b8015610f2d5780601f10610f0257610100808354040283529160200191610f2d565b820191906000526020600020905b815481529060010190602001808311610f1057829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610fa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9c90612fb8565b60405180910390fd5b610fad610b75565b610fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe390613024565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000816110166109ed565b6110209190612e3e565b1115611061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105890612ee0565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008161108c3361167b565b6110969190612e3e565b11156110d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ce906130b6565b60405180910390fd5b60006110e23361167b565b905060008082111561112457600960000160049054906101000a900467ffffffffffffffff1667ffffffffffffffff168361111d91906130d6565b9050611162565b600960000160049054906101000a900467ffffffffffffffff1667ffffffffffffffff166001846111559190613130565b61115f91906130d6565b90505b803410156111a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119c906131b0565b60405180910390fd5b6111af3384611d29565b6111b881611e0b565b505050565b6111c561196a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561122a576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806008600061123761196a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166112e461196a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161132991906125f1565b60405180910390a35050565b61133d611d21565b73ffffffffffffffffffffffffffffffffffffffff1661135b610e46565b73ffffffffffffffffffffffffffffffffffffffff16146113b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a890612d5d565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16476040516113d790613201565b60006040518083038185875af1925050503d8060008114611414576040519150601f19603f3d011682016040523d82523d6000602084013e611419565b606091505b505090508061145d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145490613262565b60405180910390fd5b50565b61146b848484611977565b60008373ffffffffffffffffffffffffffffffffffffffff163b146114cd5761149684848484611eac565b6114cc576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6114db611d21565b73ffffffffffffffffffffffffffffffffffffffff166114f9610e46565b73ffffffffffffffffffffffffffffffffffffffff161461154f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154690612d5d565b60405180910390fd5b60405180604001604052808263ffffffff1681526020018367ffffffffffffffff16815250600960008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505050565b60606115de8261183d565b61161d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611614906132ce565b60405180910390fd5b6000600a805461162c90612cdf565b9050116116485760405180602001604052806000815250611674565b600a6116538361200c565b60405160200161166492919061340a565b6040516020818303038152906040525b9050919050565b60006116868261216d565b9050919050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611729611d21565b73ffffffffffffffffffffffffffffffffffffffff16611747610e46565b73ffffffffffffffffffffffffffffffffffffffff161461179d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179490612d5d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561180d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611804906134ab565b60405180910390fd5b61181681611d47565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b600081611848611972565b11158015611857575060015482105b8015611895575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600080829050806118ab611972565b11611933576001548110156119325760006005600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611930575b60008114156119265760056000836001900393508381526020019081526020016000205490506118fb565b8092505050611965565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b60006119828261189c565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146119e9576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611a0a61196a565b73ffffffffffffffffffffffffffffffffffffffff161480611a395750611a3885611a3361196a565b61168d565b5b80611a7e5750611a4761196a565b73ffffffffffffffffffffffffffffffffffffffff16611a66846107ca565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611ab7576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611b1e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b2b85858560016121c4565b6007600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611c28866121ca565b1717600560008581526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415611cb2576000600184019050600060056000838152602001908152602001600020541415611cb0576001548114611caf578260056000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611d1a85858560016121d4565b5050505050565b600033905090565b611d438282604051806020016040528060008152506121da565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80341015611e4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4590613517565b60405180910390fd5b80341115611ea9573373ffffffffffffffffffffffffffffffffffffffff166108fc8234611e7c9190613130565b9081150290604051600060405180830381858888f19350505050158015611ea7573d6000803e3d6000fd5b505b50565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611ed261196a565b8786866040518563ffffffff1660e01b8152600401611ef4949392919061358c565b602060405180830381600087803b158015611f0e57600080fd5b505af1925050508015611f3f57506040513d601f19601f82011682018060405250810190611f3c91906135ed565b60015b611fb9573d8060008114611f6f576040519150601f19603f3d011682016040523d82523d6000602084013e611f74565b606091505b50600081511415611fb1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415612054576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612168565b600082905060005b6000821461208657808061206f9061361a565b915050600a8261207f9190613692565b915061205c565b60008167ffffffffffffffff8111156120a2576120a1612a2a565b5b6040519080825280601f01601f1916602001820160405280156120d45781602001600182028036833780820191505090505b5090505b60008514612161576001826120ed9190613130565b9150600a856120fc91906136c3565b60306121089190612e3e565b60f81b81838151811061211e5761211d6136f4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561215a9190613692565b94506120d8565b8093505050505b919050565b600067ffffffffffffffff6040600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b50505050565b6000819050919050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612248576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415612283576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61229060008583866121c4565b600160406001901b178302600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16122f560018514612490565b901b60a042901b612305866121ca565b1717600560008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612409575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123b96000878480600101955087611eac565b6123ef576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061234a57826001541461240457600080fd5b612474565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061240a575b81600181905550505061248a60008583866121d4565b50505050565b6000819050919050565b8280546124a690612cdf565b90600052602060002090601f0160209004810192826124c8576000855561250f565b82601f106124e157803560ff191683800117855561250f565b8280016001018555821561250f579182015b8281111561250e5782358255916020019190600101906124f3565b5b50905061251c9190612520565b5090565b5b80821115612539576000816000905550600101612521565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61258681612551565b811461259157600080fd5b50565b6000813590506125a38161257d565b92915050565b6000602082840312156125bf576125be612547565b5b60006125cd84828501612594565b91505092915050565b60008115159050919050565b6125eb816125d6565b82525050565b600060208201905061260660008301846125e2565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561264657808201518184015260208101905061262b565b83811115612655576000848401525b50505050565b6000601f19601f8301169050919050565b60006126778261260c565b6126818185612617565b9350612691818560208601612628565b61269a8161265b565b840191505092915050565b600060208201905081810360008301526126bf818461266c565b905092915050565b6000819050919050565b6126da816126c7565b81146126e557600080fd5b50565b6000813590506126f7816126d1565b92915050565b60006020828403121561271357612712612547565b5b6000612721848285016126e8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127558261272a565b9050919050565b6127658161274a565b82525050565b6000602082019050612780600083018461275c565b92915050565b61278f8161274a565b811461279a57600080fd5b50565b6000813590506127ac81612786565b92915050565b600080604083850312156127c9576127c8612547565b5b60006127d78582860161279d565b92505060206127e8858286016126e8565b9150509250929050565b6127fb816126c7565b82525050565b600060208201905061281660008301846127f2565b92915050565b60008060006060848603121561283557612834612547565b5b60006128438682870161279d565b93505060206128548682870161279d565b9250506040612865868287016126e8565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f8401126128945761289361286f565b5b8235905067ffffffffffffffff8111156128b1576128b0612874565b5b6020830191508360018202830111156128cd576128cc612879565b5b9250929050565b600080602083850312156128eb576128ea612547565b5b600083013567ffffffffffffffff8111156129095761290861254c565b5b6129158582860161287e565b92509250509250929050565b60006020828403121561293757612936612547565b5b60006129458482850161279d565b91505092915050565b600063ffffffff82169050919050565b6129678161294e565b82525050565b600067ffffffffffffffff82169050919050565b61298a8161296d565b82525050565b60006040820190506129a5600083018561295e565b6129b26020830184612981565b9392505050565b6129c2816125d6565b81146129cd57600080fd5b50565b6000813590506129df816129b9565b92915050565b600080604083850312156129fc576129fb612547565b5b6000612a0a8582860161279d565b9250506020612a1b858286016129d0565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612a628261265b565b810181811067ffffffffffffffff82111715612a8157612a80612a2a565b5b80604052505050565b6000612a9461253d565b9050612aa08282612a59565b919050565b600067ffffffffffffffff821115612ac057612abf612a2a565b5b612ac98261265b565b9050602081019050919050565b82818337600083830152505050565b6000612af8612af384612aa5565b612a8a565b905082815260208101848484011115612b1457612b13612a25565b5b612b1f848285612ad6565b509392505050565b600082601f830112612b3c57612b3b61286f565b5b8135612b4c848260208601612ae5565b91505092915050565b60008060008060808587031215612b6f57612b6e612547565b5b6000612b7d8782880161279d565b9450506020612b8e8782880161279d565b9350506040612b9f878288016126e8565b925050606085013567ffffffffffffffff811115612bc057612bbf61254c565b5b612bcc87828801612b27565b91505092959194509250565b612be18161296d565b8114612bec57600080fd5b50565b600081359050612bfe81612bd8565b92915050565b612c0d8161294e565b8114612c1857600080fd5b50565b600081359050612c2a81612c04565b92915050565b60008060408385031215612c4757612c46612547565b5b6000612c5585828601612bef565b9250506020612c6685828601612c1b565b9150509250929050565b60008060408385031215612c8757612c86612547565b5b6000612c958582860161279d565b9250506020612ca68582860161279d565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612cf757607f821691505b60208210811415612d0b57612d0a612cb0565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612d47602083612617565b9150612d5282612d11565b602082019050919050565b60006020820190508181036000830152612d7681612d3a565b9050919050565b7f546f6f206d616e7920616c7265616479206d696e746564206265666f7265206460008201527f6576206d696e7400000000000000000000000000000000000000000000000000602082015250565b6000612dd9602783612617565b9150612de482612d7d565b604082019050919050565b60006020820190508181036000830152612e0881612dcc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612e49826126c7565b9150612e54836126c7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e8957612e88612e0f565b5b828201905092915050565b7f52656163686564206d617820737570706c790000000000000000000000000000600082015250565b6000612eca601283612617565b9150612ed582612e94565b602082019050919050565b60006020820190508181036000830152612ef981612ebd565b9050919050565b7f5075626c69632053616c652054696d65206973205442442e0000000000000000600082015250565b6000612f36601883612617565b9150612f4182612f00565b602082019050919050565b60006020820190508181036000830152612f6581612f29565b9050919050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b6000612fa2601e83612617565b9150612fad82612f6c565b602082019050919050565b60006020820190508181036000830152612fd181612f95565b9050919050565b7f5075626c69632073616c6520686173206e6f7420626567756e20796574000000600082015250565b600061300e601d83612617565b915061301982612fd8565b602082019050919050565b6000602082019050818103600083015261303d81613001565b9050919050565b7f52656163686564206d6178207175616e746974792074686174206f6e6520776160008201527f6c6c65742063616e206d696e7400000000000000000000000000000000000000602082015250565b60006130a0602d83612617565b91506130ab82613044565b604082019050919050565b600060208201905081810360008301526130cf81613093565b9050919050565b60006130e1826126c7565b91506130ec836126c7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561312557613124612e0f565b5b828202905092915050565b600061313b826126c7565b9150613146836126c7565b92508282101561315957613158612e0f565b5b828203905092915050565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b600061319a601283612617565b91506131a582613164565b602082019050919050565b600060208201905081810360008301526131c98161318d565b9050919050565b600081905092915050565b50565b60006131eb6000836131d0565b91506131f6826131db565b600082019050919050565b600061320c826131de565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b600061324c601083612617565b915061325782613216565b602082019050919050565b6000602082019050818103600083015261327b8161323f565b9050919050565b7f546f6b656e20646f6573206e6f742065786973742e0000000000000000000000600082015250565b60006132b8601583612617565b91506132c382613282565b602082019050919050565b600060208201905081810360008301526132e7816132ab565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461331b81612cdf565b61332581866132ee565b94506001821660008114613340576001811461335157613384565b60ff19831686528186019350613384565b61335a856132f9565b60005b8381101561337c5781548189015260018201915060208101905061335d565b838801955050505b50505092915050565b60006133988261260c565b6133a281856132ee565b93506133b2818560208601612628565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006133f46005836132ee565b91506133ff826133be565b600582019050919050565b6000613416828561330e565b9150613422828461338d565b915061342d826133e7565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613495602683612617565b91506134a082613439565b604082019050919050565b600060208201905081810360008301526134c481613488565b9050919050565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b6000613501601683612617565b915061350c826134cb565b602082019050919050565b60006020820190508181036000830152613530816134f4565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061355e82613537565b6135688185613542565b9350613578818560208601612628565b6135818161265b565b840191505092915050565b60006080820190506135a1600083018761275c565b6135ae602083018661275c565b6135bb60408301856127f2565b81810360608301526135cd8184613553565b905095945050505050565b6000815190506135e78161257d565b92915050565b60006020828403121561360357613602612547565b5b6000613611848285016135d8565b91505092915050565b6000613625826126c7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561365857613657612e0f565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061369d826126c7565b91506136a8836126c7565b9250826136b8576136b7613663565b5b828204905092915050565b60006136ce826126c7565b91506136d9836126c7565b9250826136e9576136e8613663565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220159f83eaa19c2ecb07e75a54ef79ba84d0ca60e55d302a38c9e0b11ad6c0e13964736f6c634300080900330000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000003e8

Deployed Bytecode

0x6080604052600436106101b75760003560e01c80638bc35c2f116100ec578063b88d4fde1161008a578063dc33e68111610064578063dc33e681146105d8578063e985e9c514610615578063f2fde38b14610652578063fbe1aa511461067b576101b7565b8063b88d4fde14610549578063b97f020214610572578063c87b56dd1461059b576101b7565b806395d89b41116100c657806395d89b41146104c2578063a0712d68146104ed578063a22cb46514610509578063ac44600214610532576101b7565b80638bc35c2f146104405780638da5cb5b1461046b57806390aa0b0f14610496576101b7565b80633f5e47411161015957806355f804b31161013357806355f804b3146103865780636352211e146103af57806370a08231146103ec578063715018a614610429576101b7565b80633f5e47411461030757806342842e0e1461033257806345c0f5331461035b576101b7565b8063095ea7b311610195578063095ea7b31461026157806318160ddd1461028a57806323b872dd146102b5578063375a069a146102de576101b7565b806301ffc9a7146101bc57806306fdde03146101f9578063081812fc14610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de91906125a9565b6106a6565b6040516101f091906125f1565b60405180910390f35b34801561020557600080fd5b5061020e610738565b60405161021b91906126a5565b60405180910390f35b34801561023057600080fd5b5061024b600480360381019061024691906126fd565b6107ca565b604051610258919061276b565b60405180910390f35b34801561026d57600080fd5b50610288600480360381019061028391906127b2565b610846565b005b34801561029657600080fd5b5061029f6109ed565b6040516102ac9190612801565b60405180910390f35b3480156102c157600080fd5b506102dc60048036038101906102d7919061281c565b610a04565b005b3480156102ea57600080fd5b50610305600480360381019061030091906126fd565b610a14565b005b34801561031357600080fd5b5061031c610b75565b60405161032991906125f1565b60405180910390f35b34801561033e57600080fd5b506103596004803603810190610354919061281c565b610bf9565b005b34801561036757600080fd5b50610370610c19565b60405161037d9190612801565b60405180910390f35b34801561039257600080fd5b506103ad60048036038101906103a891906128d4565b610c3d565b005b3480156103bb57600080fd5b506103d660048036038101906103d191906126fd565b610ccf565b6040516103e3919061276b565b60405180910390f35b3480156103f857600080fd5b50610413600480360381019061040e9190612921565b610ce1565b6040516104209190612801565b60405180910390f35b34801561043557600080fd5b5061043e610d9a565b005b34801561044c57600080fd5b50610455610e22565b6040516104629190612801565b60405180910390f35b34801561047757600080fd5b50610480610e46565b60405161048d919061276b565b60405180910390f35b3480156104a257600080fd5b506104ab610e6f565b6040516104b9929190612990565b60405180910390f35b3480156104ce57600080fd5b506104d7610ea5565b6040516104e491906126a5565b60405180910390f35b610507600480360381019061050291906126fd565b610f37565b005b34801561051557600080fd5b50610530600480360381019061052b91906129e5565b6111bd565b005b34801561053e57600080fd5b50610547611335565b005b34801561055557600080fd5b50610570600480360381019061056b9190612b55565b611460565b005b34801561057e57600080fd5b5061059960048036038101906105949190612c30565b6114d3565b005b3480156105a757600080fd5b506105c260048036038101906105bd91906126fd565b6115d3565b6040516105cf91906126a5565b60405180910390f35b3480156105e457600080fd5b506105ff60048036038101906105fa9190612921565b61167b565b60405161060c9190612801565b60405180910390f35b34801561062157600080fd5b5061063c60048036038101906106379190612c70565b61168d565b60405161064991906125f1565b60405180910390f35b34801561065e57600080fd5b5061067960048036038101906106749190612921565b611721565b005b34801561068757600080fd5b50610690611819565b60405161069d9190612801565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061070157506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107315750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606003805461074790612cdf565b80601f016020809104026020016040519081016040528092919081815260200182805461077390612cdf565b80156107c05780601f10610795576101008083540402835291602001916107c0565b820191906000526020600020905b8154815290600101906020018083116107a357829003601f168201915b5050505050905090565b60006107d58261183d565b61080b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108518261189c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108b9576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108d861196a565b73ffffffffffffffffffffffffffffffffffffffff161461093b57610904816108ff61196a565b61168d565b61093a576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006109f7611972565b6002546001540303905090565b610a0f838383611977565b505050565b610a1c611d21565b73ffffffffffffffffffffffffffffffffffffffff16610a3a610e46565b73ffffffffffffffffffffffffffffffffffffffff1614610a90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8790612d5d565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000003e8811115610af3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aea90612def565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000271081610b1d6109ed565b610b279190612e3e565b1115610b68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5f90612ee0565b60405180910390fd5b610b723382611d29565b50565b600080600960000160009054906101000a900463ffffffff1663ffffffff161415610bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcc90612f4c565b60405180910390fd5b600960000160009054906101000a900463ffffffff1663ffffffff16421015905090565b610c1483838360405180602001604052806000815250611460565b505050565b7f000000000000000000000000000000000000000000000000000000000000271081565b610c45611d21565b73ffffffffffffffffffffffffffffffffffffffff16610c63610e46565b73ffffffffffffffffffffffffffffffffffffffff1614610cb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb090612d5d565b60405180910390fd5b8181600a9190610cca92919061249a565b505050565b6000610cda8261189c565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d49576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610da2611d21565b73ffffffffffffffffffffffffffffffffffffffff16610dc0610e46565b73ffffffffffffffffffffffffffffffffffffffff1614610e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0d90612d5d565b60405180910390fd5b610e206000611d47565b565b7f000000000000000000000000000000000000000000000000000000000000000581565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60098060000160009054906101000a900463ffffffff16908060000160049054906101000a900467ffffffffffffffff16905082565b606060048054610eb490612cdf565b80601f0160208091040260200160405190810160405280929190818152602001828054610ee090612cdf565b8015610f2d5780601f10610f0257610100808354040283529160200191610f2d565b820191906000526020600020905b815481529060010190602001808311610f1057829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610fa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9c90612fb8565b60405180910390fd5b610fad610b75565b610fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe390613024565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000002710816110166109ed565b6110209190612e3e565b1115611061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105890612ee0565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000058161108c3361167b565b6110969190612e3e565b11156110d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ce906130b6565b60405180910390fd5b60006110e23361167b565b905060008082111561112457600960000160049054906101000a900467ffffffffffffffff1667ffffffffffffffff168361111d91906130d6565b9050611162565b600960000160049054906101000a900467ffffffffffffffff1667ffffffffffffffff166001846111559190613130565b61115f91906130d6565b90505b803410156111a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119c906131b0565b60405180910390fd5b6111af3384611d29565b6111b881611e0b565b505050565b6111c561196a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561122a576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806008600061123761196a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166112e461196a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161132991906125f1565b60405180910390a35050565b61133d611d21565b73ffffffffffffffffffffffffffffffffffffffff1661135b610e46565b73ffffffffffffffffffffffffffffffffffffffff16146113b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a890612d5d565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16476040516113d790613201565b60006040518083038185875af1925050503d8060008114611414576040519150601f19603f3d011682016040523d82523d6000602084013e611419565b606091505b505090508061145d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145490613262565b60405180910390fd5b50565b61146b848484611977565b60008373ffffffffffffffffffffffffffffffffffffffff163b146114cd5761149684848484611eac565b6114cc576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6114db611d21565b73ffffffffffffffffffffffffffffffffffffffff166114f9610e46565b73ffffffffffffffffffffffffffffffffffffffff161461154f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154690612d5d565b60405180910390fd5b60405180604001604052808263ffffffff1681526020018367ffffffffffffffff16815250600960008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505050565b60606115de8261183d565b61161d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611614906132ce565b60405180910390fd5b6000600a805461162c90612cdf565b9050116116485760405180602001604052806000815250611674565b600a6116538361200c565b60405160200161166492919061340a565b6040516020818303038152906040525b9050919050565b60006116868261216d565b9050919050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611729611d21565b73ffffffffffffffffffffffffffffffffffffffff16611747610e46565b73ffffffffffffffffffffffffffffffffffffffff161461179d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179490612d5d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561180d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611804906134ab565b60405180910390fd5b61181681611d47565b50565b7f00000000000000000000000000000000000000000000000000000000000003e881565b600081611848611972565b11158015611857575060015482105b8015611895575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600080829050806118ab611972565b11611933576001548110156119325760006005600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611930575b60008114156119265760056000836001900393508381526020019081526020016000205490506118fb565b8092505050611965565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b60006119828261189c565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146119e9576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611a0a61196a565b73ffffffffffffffffffffffffffffffffffffffff161480611a395750611a3885611a3361196a565b61168d565b5b80611a7e5750611a4761196a565b73ffffffffffffffffffffffffffffffffffffffff16611a66846107ca565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611ab7576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611b1e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b2b85858560016121c4565b6007600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611c28866121ca565b1717600560008581526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415611cb2576000600184019050600060056000838152602001908152602001600020541415611cb0576001548114611caf578260056000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611d1a85858560016121d4565b5050505050565b600033905090565b611d438282604051806020016040528060008152506121da565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80341015611e4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4590613517565b60405180910390fd5b80341115611ea9573373ffffffffffffffffffffffffffffffffffffffff166108fc8234611e7c9190613130565b9081150290604051600060405180830381858888f19350505050158015611ea7573d6000803e3d6000fd5b505b50565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611ed261196a565b8786866040518563ffffffff1660e01b8152600401611ef4949392919061358c565b602060405180830381600087803b158015611f0e57600080fd5b505af1925050508015611f3f57506040513d601f19601f82011682018060405250810190611f3c91906135ed565b60015b611fb9573d8060008114611f6f576040519150601f19603f3d011682016040523d82523d6000602084013e611f74565b606091505b50600081511415611fb1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415612054576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612168565b600082905060005b6000821461208657808061206f9061361a565b915050600a8261207f9190613692565b915061205c565b60008167ffffffffffffffff8111156120a2576120a1612a2a565b5b6040519080825280601f01601f1916602001820160405280156120d45781602001600182028036833780820191505090505b5090505b60008514612161576001826120ed9190613130565b9150600a856120fc91906136c3565b60306121089190612e3e565b60f81b81838151811061211e5761211d6136f4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561215a9190613692565b94506120d8565b8093505050505b919050565b600067ffffffffffffffff6040600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b50505050565b6000819050919050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612248576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415612283576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61229060008583866121c4565b600160406001901b178302600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16122f560018514612490565b901b60a042901b612305866121ca565b1717600560008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612409575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123b96000878480600101955087611eac565b6123ef576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061234a57826001541461240457600080fd5b612474565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061240a575b81600181905550505061248a60008583866121d4565b50505050565b6000819050919050565b8280546124a690612cdf565b90600052602060002090601f0160209004810192826124c8576000855561250f565b82601f106124e157803560ff191683800117855561250f565b8280016001018555821561250f579182015b8281111561250e5782358255916020019190600101906124f3565b5b50905061251c9190612520565b5090565b5b80821115612539576000816000905550600101612521565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61258681612551565b811461259157600080fd5b50565b6000813590506125a38161257d565b92915050565b6000602082840312156125bf576125be612547565b5b60006125cd84828501612594565b91505092915050565b60008115159050919050565b6125eb816125d6565b82525050565b600060208201905061260660008301846125e2565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561264657808201518184015260208101905061262b565b83811115612655576000848401525b50505050565b6000601f19601f8301169050919050565b60006126778261260c565b6126818185612617565b9350612691818560208601612628565b61269a8161265b565b840191505092915050565b600060208201905081810360008301526126bf818461266c565b905092915050565b6000819050919050565b6126da816126c7565b81146126e557600080fd5b50565b6000813590506126f7816126d1565b92915050565b60006020828403121561271357612712612547565b5b6000612721848285016126e8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127558261272a565b9050919050565b6127658161274a565b82525050565b6000602082019050612780600083018461275c565b92915050565b61278f8161274a565b811461279a57600080fd5b50565b6000813590506127ac81612786565b92915050565b600080604083850312156127c9576127c8612547565b5b60006127d78582860161279d565b92505060206127e8858286016126e8565b9150509250929050565b6127fb816126c7565b82525050565b600060208201905061281660008301846127f2565b92915050565b60008060006060848603121561283557612834612547565b5b60006128438682870161279d565b93505060206128548682870161279d565b9250506040612865868287016126e8565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f8401126128945761289361286f565b5b8235905067ffffffffffffffff8111156128b1576128b0612874565b5b6020830191508360018202830111156128cd576128cc612879565b5b9250929050565b600080602083850312156128eb576128ea612547565b5b600083013567ffffffffffffffff8111156129095761290861254c565b5b6129158582860161287e565b92509250509250929050565b60006020828403121561293757612936612547565b5b60006129458482850161279d565b91505092915050565b600063ffffffff82169050919050565b6129678161294e565b82525050565b600067ffffffffffffffff82169050919050565b61298a8161296d565b82525050565b60006040820190506129a5600083018561295e565b6129b26020830184612981565b9392505050565b6129c2816125d6565b81146129cd57600080fd5b50565b6000813590506129df816129b9565b92915050565b600080604083850312156129fc576129fb612547565b5b6000612a0a8582860161279d565b9250506020612a1b858286016129d0565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612a628261265b565b810181811067ffffffffffffffff82111715612a8157612a80612a2a565b5b80604052505050565b6000612a9461253d565b9050612aa08282612a59565b919050565b600067ffffffffffffffff821115612ac057612abf612a2a565b5b612ac98261265b565b9050602081019050919050565b82818337600083830152505050565b6000612af8612af384612aa5565b612a8a565b905082815260208101848484011115612b1457612b13612a25565b5b612b1f848285612ad6565b509392505050565b600082601f830112612b3c57612b3b61286f565b5b8135612b4c848260208601612ae5565b91505092915050565b60008060008060808587031215612b6f57612b6e612547565b5b6000612b7d8782880161279d565b9450506020612b8e8782880161279d565b9350506040612b9f878288016126e8565b925050606085013567ffffffffffffffff811115612bc057612bbf61254c565b5b612bcc87828801612b27565b91505092959194509250565b612be18161296d565b8114612bec57600080fd5b50565b600081359050612bfe81612bd8565b92915050565b612c0d8161294e565b8114612c1857600080fd5b50565b600081359050612c2a81612c04565b92915050565b60008060408385031215612c4757612c46612547565b5b6000612c5585828601612bef565b9250506020612c6685828601612c1b565b9150509250929050565b60008060408385031215612c8757612c86612547565b5b6000612c958582860161279d565b9250506020612ca68582860161279d565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612cf757607f821691505b60208210811415612d0b57612d0a612cb0565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612d47602083612617565b9150612d5282612d11565b602082019050919050565b60006020820190508181036000830152612d7681612d3a565b9050919050565b7f546f6f206d616e7920616c7265616479206d696e746564206265666f7265206460008201527f6576206d696e7400000000000000000000000000000000000000000000000000602082015250565b6000612dd9602783612617565b9150612de482612d7d565b604082019050919050565b60006020820190508181036000830152612e0881612dcc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612e49826126c7565b9150612e54836126c7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e8957612e88612e0f565b5b828201905092915050565b7f52656163686564206d617820737570706c790000000000000000000000000000600082015250565b6000612eca601283612617565b9150612ed582612e94565b602082019050919050565b60006020820190508181036000830152612ef981612ebd565b9050919050565b7f5075626c69632053616c652054696d65206973205442442e0000000000000000600082015250565b6000612f36601883612617565b9150612f4182612f00565b602082019050919050565b60006020820190508181036000830152612f6581612f29565b9050919050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b6000612fa2601e83612617565b9150612fad82612f6c565b602082019050919050565b60006020820190508181036000830152612fd181612f95565b9050919050565b7f5075626c69632073616c6520686173206e6f7420626567756e20796574000000600082015250565b600061300e601d83612617565b915061301982612fd8565b602082019050919050565b6000602082019050818103600083015261303d81613001565b9050919050565b7f52656163686564206d6178207175616e746974792074686174206f6e6520776160008201527f6c6c65742063616e206d696e7400000000000000000000000000000000000000602082015250565b60006130a0602d83612617565b91506130ab82613044565b604082019050919050565b600060208201905081810360008301526130cf81613093565b9050919050565b60006130e1826126c7565b91506130ec836126c7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561312557613124612e0f565b5b828202905092915050565b600061313b826126c7565b9150613146836126c7565b92508282101561315957613158612e0f565b5b828203905092915050565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b600061319a601283612617565b91506131a582613164565b602082019050919050565b600060208201905081810360008301526131c98161318d565b9050919050565b600081905092915050565b50565b60006131eb6000836131d0565b91506131f6826131db565b600082019050919050565b600061320c826131de565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b600061324c601083612617565b915061325782613216565b602082019050919050565b6000602082019050818103600083015261327b8161323f565b9050919050565b7f546f6b656e20646f6573206e6f742065786973742e0000000000000000000000600082015250565b60006132b8601583612617565b91506132c382613282565b602082019050919050565b600060208201905081810360008301526132e7816132ab565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461331b81612cdf565b61332581866132ee565b94506001821660008114613340576001811461335157613384565b60ff19831686528186019350613384565b61335a856132f9565b60005b8381101561337c5781548189015260018201915060208101905061335d565b838801955050505b50505092915050565b60006133988261260c565b6133a281856132ee565b93506133b2818560208601612628565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006133f46005836132ee565b91506133ff826133be565b600582019050919050565b6000613416828561330e565b9150613422828461338d565b915061342d826133e7565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613495602683612617565b91506134a082613439565b604082019050919050565b600060208201905081810360008301526134c481613488565b9050919050565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b6000613501601683612617565b915061350c826134cb565b602082019050919050565b60006020820190508181036000830152613530816134f4565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061355e82613537565b6135688185613542565b9350613578818560208601612628565b6135818161265b565b840191505092915050565b60006080820190506135a1600083018761275c565b6135ae602083018661275c565b6135bb60408301856127f2565b81810360608301526135cd8184613553565b905095945050505050565b6000815190506135e78161257d565b92915050565b60006020828403121561360357613602612547565b5b6000613611848285016135d8565b91505092915050565b6000613625826126c7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561365857613657612e0f565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061369d826126c7565b91506136a8836126c7565b9250826136b8576136b7613663565b5b828204905092915050565b60006136ce826126c7565b91506136d9836126c7565b9250826136e9576136e8613663565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220159f83eaa19c2ecb07e75a54ef79ba84d0ca60e55d302a38c9e0b11ad6c0e13964736f6c63430008090033

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

0000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000003e8

-----Decoded View---------------
Arg [0] : maxBatchSize_ (uint256): 5
Arg [1] : collectionSize_ (uint256): 10000
Arg [2] : amountForDevs_ (uint256): 1000

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [1] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [2] : 00000000000000000000000000000000000000000000000000000000000003e8


Deployed Bytecode Sourcemap

48331:4328:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19513:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24526:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26594:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26054:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18567:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27480:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49291:350;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50641:249;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27721:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48432:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51276:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24315:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20192:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47393:103;;;;;;;;;;;;;:::i;:::-;;48377:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46742:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48630:28;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;24695:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49778:855;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26870:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51390:181;;;;;;;;;;;;;:::i;:::-;;27977:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51579:232;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52288:368;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51030:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27249:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47651:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48478:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19513:615;19598:4;19913:10;19898:25;;:11;:25;;;;:102;;;;19990:10;19975:25;;:11;:25;;;;19898:102;:179;;;;20067:10;20052:25;;:11;:25;;;;19898:179;19878:199;;19513:615;;;:::o;24526:100::-;24580:13;24613:5;24606:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24526:100;:::o;26594:204::-;26662:7;26687:16;26695:7;26687;:16::i;:::-;26682:64;;26712:34;;;;;;;;;;;;;;26682:64;26766:15;:24;26782:7;26766:24;;;;;;;;;;;;;;;;;;;;;26759:31;;26594:204;;;:::o;26054:474::-;26127:13;26159:27;26178:7;26159:18;:27::i;:::-;26127:61;;26209:5;26203:11;;:2;:11;;;26199:48;;;26223:24;;;;;;;;;;;;;;26199:48;26287:5;26264:28;;:19;:17;:19::i;:::-;:28;;;26260:175;;26312:44;26329:5;26336:19;:17;:19::i;:::-;26312:16;:44::i;:::-;26307:128;;26384:35;;;;;;;;;;;;;;26307:128;26260:175;26474:2;26447:15;:24;26463:7;26447:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;26512:7;26508:2;26492:28;;26501:5;26492:28;;;;;;;;;;;;26116:412;26054:474;;:::o;18567:315::-;18620:7;18848:15;:13;:15::i;:::-;18833:12;;18817:13;;:28;:46;18810:53;;18567:315;:::o;27480:170::-;27614:28;27624:4;27630:2;27634:7;27614:9;:28::i;:::-;27480:170;;;:::o;49291:350::-;46973:12;:10;:12::i;:::-;46962:23;;:7;:5;:7::i;:::-;:23;;;46954:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49390:13:::1;49378:8;:25;;49356:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;49531:14;49519:8;49503:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:42;;49481:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;49602:31;49612:10;49624:8;49602:9;:31::i;:::-;49291:350:::0;:::o;50641:249::-;50687:4;50760:1;50726:10;:30;;;;;;;;;;;;:35;;;;50704:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;50852:10;:30;;;;;;;;;;;;50833:49;;:15;:49;;50826:56;;50641:249;:::o;27721:185::-;27859:39;27876:4;27882:2;27886:7;27859:39;;;;;;;;;;;;:16;:39::i;:::-;27721:185;;;:::o;48432:39::-;;;:::o;51276:106::-;46973:12;:10;:12::i;:::-;46962:23;;:7;:5;:7::i;:::-;:23;;;46954:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51367:7:::1;;51351:13;:23;;;;;;;:::i;:::-;;51276:106:::0;;:::o;24315:144::-;24379:7;24422:27;24441:7;24422:18;:27::i;:::-;24399:52;;24315:144;;;:::o;20192:224::-;20256:7;20297:1;20280:19;;:5;:19;;;20276:60;;;20308:28;;;;;;;;;;;;;;20276:60;15531:13;20354:18;:25;20373:5;20354:25;;;;;;;;;;;;;;;;:54;20347:61;;20192:224;;;:::o;47393:103::-;46973:12;:10;:12::i;:::-;46962:23;;:7;:5;:7::i;:::-;:23;;;46954:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47458:30:::1;47485:1;47458:18;:30::i;:::-;47393:103::o:0;48377:48::-;;;:::o;46742:87::-;46788:7;46815:6;;;;;;;;;;;46808:13;;46742:87;:::o;48630:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24695:104::-;24751:13;24784:7;24777:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24695:104;:::o;49778:855::-;49218:10;49205:23;;:9;:23;;;49197:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;49879:16:::1;:14;:16::i;:::-;49871:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;49990:14;49978:8;49962:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:42;;49940:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;50122:23;50110:8;50083:24;50096:10;50083:12;:24::i;:::-;:35;;;;:::i;:::-;:62;;50061:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;50231:14;50248:24;50261:10;50248:12;:24::i;:::-;50231:41;;50283:16;50323:1:::0;50314:6:::1;:10;50310:176;;;50363:10;:25;;;;;;;;;;;;50352:36;;:8;:36;;;;:::i;:::-;50341:47;;50310:176;;;50449:10;:25;;;;;;;;;;;;50432:42;;50444:1;50433:8;:12;;;;:::i;:::-;50432:42;;;;:::i;:::-;50421:53;;50310:176;50517:8;50504:9;:21;;50496:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;50561:31;50571:10;50583:8;50561:9;:31::i;:::-;50603:22;50616:8;50603:12;:22::i;:::-;49860:773;;49778:855:::0;:::o;26870:308::-;26981:19;:17;:19::i;:::-;26969:31;;:8;:31;;;26965:61;;;27009:17;;;;;;;;;;;;;;26965:61;27091:8;27039:18;:39;27058:19;:17;:19::i;:::-;27039:39;;;;;;;;;;;;;;;:49;27079:8;27039:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;27151:8;27115:55;;27130:19;:17;:19::i;:::-;27115:55;;;27161:8;27115:55;;;;;;:::i;:::-;;;;;;;;26870:308;;:::o;51390:181::-;46973:12;:10;:12::i;:::-;46962:23;;:7;:5;:7::i;:::-;:23;;;46954:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51446:12:::1;51464:10;:15;;51488:21;51464:52;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51445:71;;;51535:7;51527:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;51434:137;51390:181::o:0;27977:396::-;28144:28;28154:4;28160:2;28164:7;28144:9;:28::i;:::-;28205:1;28187:2;:14;;;:19;28183:183;;28226:56;28257:4;28263:2;28267:7;28276:5;28226:30;:56::i;:::-;28221:145;;28310:40;;;;;;;;;;;;;;28221:145;28183:183;27977:396;;;;:::o;51579:232::-;46973:12;:10;:12::i;:::-;46962:23;;:7;:5;:7::i;:::-;:23;;;46954:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51719:84:::1;;;;;;;;51744:19;51719:84;;;;;;51778:14;51719:84;;;;::::0;51706:10:::1;:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51579:232:::0;;:::o;52288:368::-;52354:13;52388:17;52396:8;52388:7;:17::i;:::-;52380:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;52479:1;52455:13;52449:27;;;;;:::i;:::-;;;:31;:199;;;;;;;;;;;;;;;;;52537:13;52567:26;52584:8;52567:16;:26::i;:::-;52504:128;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52449:199;52442:206;;52288:368;;;:::o;51030:114::-;51088:7;51115:21;51129:6;51115:13;:21::i;:::-;51108:28;;51030:114;;;:::o;27249:164::-;27346:4;27370:18;:25;27389:5;27370:25;;;;;;;;;;;;;;;:35;27396:8;27370:35;;;;;;;;;;;;;;;;;;;;;;;;;27363:42;;27249:164;;;;:::o;47651:201::-;46973:12;:10;:12::i;:::-;46962:23;;:7;:5;:7::i;:::-;:23;;;46954:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47760:1:::1;47740:22;;:8;:22;;;;47732:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;47816:28;47835:8;47816:18;:28::i;:::-;47651:201:::0;:::o;48478:38::-;;;:::o;28628:273::-;28685:4;28741:7;28722:15;:13;:15::i;:::-;:26;;:66;;;;;28775:13;;28765:7;:23;28722:66;:152;;;;;28873:1;16301:8;28826:17;:26;28844:7;28826:26;;;;;;;;;;;;:43;:48;28722:152;28702:172;;28628:273;;;:::o;21830:1129::-;21897:7;21917:12;21932:7;21917:22;;22000:4;21981:15;:13;:15::i;:::-;:23;21977:915;;22034:13;;22027:4;:20;22023:869;;;22072:14;22089:17;:23;22107:4;22089:23;;;;;;;;;;;;22072:40;;22205:1;16301:8;22178:6;:23;:28;22174:699;;;22697:113;22714:1;22704:6;:11;22697:113;;;22757:17;:25;22775:6;;;;;;;22757:25;;;;;;;;;;;;22748:34;;22697:113;;;22843:6;22836:13;;;;;;22174:699;22049:843;22023:869;21977:915;22920:31;;;;;;;;;;;;;;21830:1129;;;;:::o;42610:105::-;42670:7;42697:10;42690:17;;42610:105;:::o;18090:92::-;18146:7;18090:92;:::o;33867:2515::-;33982:27;34012;34031:7;34012:18;:27::i;:::-;33982:57;;34097:4;34056:45;;34072:19;34056:45;;;34052:86;;34110:28;;;;;;;;;;;;;;34052:86;34151:22;34200:4;34177:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;34221:43;34238:4;34244:19;:17;:19::i;:::-;34221:16;:43::i;:::-;34177:87;:147;;;;34305:19;:17;:19::i;:::-;34281:43;;:20;34293:7;34281:11;:20::i;:::-;:43;;;34177:147;34151:174;;34343:17;34338:66;;34369:35;;;;;;;;;;;;;;34338:66;34433:1;34419:16;;:2;:16;;;34415:52;;;34444:23;;;;;;;;;;;;;;34415:52;34480:43;34502:4;34508:2;34512:7;34521:1;34480:21;:43::i;:::-;34596:15;:24;34612:7;34596:24;;;;;;;;;;;;34589:31;;;;;;;;;;;34988:18;:24;35007:4;34988:24;;;;;;;;;;;;;;;;34986:26;;;;;;;;;;;;35057:18;:22;35076:2;35057:22;;;;;;;;;;;;;;;;35055:24;;;;;;;;;;;16583:8;16185:3;35438:15;:41;;35396:21;35414:2;35396:17;:21::i;:::-;:84;:128;35350:17;:26;35368:7;35350:26;;;;;;;;;;;:174;;;;35694:1;16583:8;35644:19;:46;:51;35640:626;;;35716:19;35748:1;35738:7;:11;35716:33;;35905:1;35871:17;:30;35889:11;35871:30;;;;;;;;;;;;:35;35867:384;;;36009:13;;35994:11;:28;35990:242;;36189:19;36156:17;:30;36174:11;36156:30;;;;;;;;;;;:52;;;;35990:242;35867:384;35697:569;35640:626;36313:7;36309:2;36294:27;;36303:4;36294:27;;;;;;;;;;;;36332:42;36353:4;36359:2;36363:7;36372:1;36332:20;:42::i;:::-;33971:2411;;33867:2515;;;:::o;45466:98::-;45519:7;45546:10;45539:17;;45466:98;:::o;28985:104::-;29054:27;29064:2;29068:8;29054:27;;;;;;;;;;;;:9;:27::i;:::-;28985:104;;:::o;48012:191::-;48086:16;48105:6;;;;;;;;;;;48086:25;;48131:8;48122:6;;:17;;;;;;;;;;;;;;;;;;48186:8;48155:40;;48176:8;48155:40;;;;;;;;;;;;48075:128;48012:191;:::o;51934:225::-;52012:5;51999:9;:18;;51991:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;52071:5;52059:9;:17;52055:97;;;52101:10;52093:28;;:47;52134:5;52122:9;:17;;;;:::i;:::-;52093:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52055:97;51934:225;:::o;40079:716::-;40242:4;40288:2;40263:45;;;40309:19;:17;:19::i;:::-;40330:4;40336:7;40345:5;40263:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40259:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40563:1;40546:6;:13;:18;40542:235;;;40592:40;;;;;;;;;;;;;;40542:235;40735:6;40729:13;40720:6;40716:2;40712:15;40705:38;40259:529;40432:54;;;40422:64;;;:6;:64;;;;40415:71;;;40079:716;;;;;;:::o;4681:723::-;4737:13;4967:1;4958:5;:10;4954:53;;;4985:10;;;;;;;;;;;;;;;;;;;;;4954:53;5017:12;5032:5;5017:20;;5048:14;5073:78;5088:1;5080:4;:9;5073:78;;5106:8;;;;;:::i;:::-;;;;5137:2;5129:10;;;;;:::i;:::-;;;5073:78;;;5161:19;5193:6;5183:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5161:39;;5211:154;5227:1;5218:5;:10;5211:154;;5255:1;5245:11;;;;;:::i;:::-;;;5322:2;5314:5;:10;;;;:::i;:::-;5301:2;:24;;;;:::i;:::-;5288:39;;5271:6;5278;5271:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;5351:2;5342:11;;;;;:::i;:::-;;;5211:154;;;5389:6;5375:21;;;;;4681:723;;;;:::o;20498:176::-;20559:7;15531:13;15668:2;20587:18;:25;20606:5;20587:25;;;;;;;;;;;;;;;;:49;;20586:80;20579:87;;20498:176;;;:::o;41443:159::-;;;;;:::o;25615:148::-;25679:14;25740:5;25730:15;;25615:148;;;:::o;42261:158::-;;;;;:::o;29462:2236::-;29585:20;29608:13;;29585:36;;29650:1;29636:16;;:2;:16;;;29632:48;;;29661:19;;;;;;;;;;;;;;29632:48;29707:1;29695:8;:13;29691:44;;;29717:18;;;;;;;;;;;;;;29691:44;29748:61;29778:1;29782:2;29786:12;29800:8;29748:21;:61::i;:::-;30352:1;15668:2;30323:1;:25;;30322:31;30310:8;:44;30284:18;:22;30303:2;30284:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;16448:3;30753:29;30780:1;30768:8;:13;30753:14;:29::i;:::-;:56;;16185:3;30690:15;:41;;30648:21;30666:2;30648:17;:21::i;:::-;:84;:162;30597:17;:31;30615:12;30597:31;;;;;;;;;;;:213;;;;30827:20;30850:12;30827:35;;30877:11;30906:8;30891:12;:23;30877:37;;30953:1;30935:2;:14;;;:19;30931:635;;30975:313;31031:12;31027:2;31006:38;;31023:1;31006:38;;;;;;;;;;;;31072:69;31111:1;31115:2;31119:14;;;;;;31135:5;31072:30;:69::i;:::-;31067:174;;31177:40;;;;;;;;;;;;;;31067:174;31283:3;31268:12;:18;30975:313;;31369:12;31352:13;;:29;31348:43;;31383:8;;;31348:43;30931:635;;;31432:119;31488:14;;;;;;31484:2;31463:40;;31480:1;31463:40;;;;;;;;;;;;31546:3;31531:12;:18;31432:119;;30931:635;31596:12;31580:13;:28;;;;30061:1559;;31630:60;31659:1;31663:2;31667:12;31681:8;31630:20;:60::i;:::-;29574:2124;29462:2236;;;:::o;25850:142::-;25908:14;25969:5;25959:15;;25850:142;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:117::-;6024:1;6021;6014:12;6038:117;6147:1;6144;6137:12;6161:117;6270:1;6267;6260:12;6298:553;6356:8;6366:6;6416:3;6409:4;6401:6;6397:17;6393:27;6383:122;;6424:79;;:::i;:::-;6383:122;6537:6;6524:20;6514:30;;6567:18;6559:6;6556:30;6553:117;;;6589:79;;:::i;:::-;6553:117;6703:4;6695:6;6691:17;6679:29;;6757:3;6749:4;6741:6;6737:17;6727:8;6723:32;6720:41;6717:128;;;6764:79;;:::i;:::-;6717:128;6298:553;;;;;:::o;6857:529::-;6928:6;6936;6985:2;6973:9;6964:7;6960:23;6956:32;6953:119;;;6991:79;;:::i;:::-;6953:119;7139:1;7128:9;7124:17;7111:31;7169:18;7161:6;7158:30;7155:117;;;7191:79;;:::i;:::-;7155:117;7304:65;7361:7;7352:6;7341:9;7337:22;7304:65;:::i;:::-;7286:83;;;;7082:297;6857:529;;;;;:::o;7392:329::-;7451:6;7500:2;7488:9;7479:7;7475:23;7471:32;7468:119;;;7506:79;;:::i;:::-;7468:119;7626:1;7651:53;7696:7;7687:6;7676:9;7672:22;7651:53;:::i;:::-;7641:63;;7597:117;7392:329;;;;:::o;7727:93::-;7763:7;7803:10;7796:5;7792:22;7781:33;;7727:93;;;:::o;7826:115::-;7911:23;7928:5;7911:23;:::i;:::-;7906:3;7899:36;7826:115;;:::o;7947:101::-;7983:7;8023:18;8016:5;8012:30;8001:41;;7947:101;;;:::o;8054:115::-;8139:23;8156:5;8139:23;:::i;:::-;8134:3;8127:36;8054:115;;:::o;8175:324::-;8292:4;8330:2;8319:9;8315:18;8307:26;;8343:69;8409:1;8398:9;8394:17;8385:6;8343:69;:::i;:::-;8422:70;8488:2;8477:9;8473:18;8464:6;8422:70;:::i;:::-;8175:324;;;;;:::o;8505:116::-;8575:21;8590:5;8575:21;:::i;:::-;8568:5;8565:32;8555:60;;8611:1;8608;8601:12;8555:60;8505:116;:::o;8627:133::-;8670:5;8708:6;8695:20;8686:29;;8724:30;8748:5;8724:30;:::i;:::-;8627:133;;;;:::o;8766:468::-;8831:6;8839;8888:2;8876:9;8867:7;8863:23;8859:32;8856:119;;;8894:79;;:::i;:::-;8856:119;9014:1;9039:53;9084:7;9075:6;9064:9;9060:22;9039:53;:::i;:::-;9029:63;;8985:117;9141:2;9167:50;9209:7;9200:6;9189:9;9185:22;9167:50;:::i;:::-;9157:60;;9112:115;8766:468;;;;;:::o;9240:117::-;9349:1;9346;9339:12;9363:180;9411:77;9408:1;9401:88;9508:4;9505:1;9498:15;9532:4;9529:1;9522:15;9549:281;9632:27;9654:4;9632:27;:::i;:::-;9624:6;9620:40;9762:6;9750:10;9747:22;9726:18;9714:10;9711:34;9708:62;9705:88;;;9773:18;;:::i;:::-;9705:88;9813:10;9809:2;9802:22;9592:238;9549:281;;:::o;9836:129::-;9870:6;9897:20;;:::i;:::-;9887:30;;9926:33;9954:4;9946:6;9926:33;:::i;:::-;9836:129;;;:::o;9971:307::-;10032:4;10122:18;10114:6;10111:30;10108:56;;;10144:18;;:::i;:::-;10108:56;10182:29;10204:6;10182:29;:::i;:::-;10174:37;;10266:4;10260;10256:15;10248:23;;9971:307;;;:::o;10284:154::-;10368:6;10363:3;10358;10345:30;10430:1;10421:6;10416:3;10412:16;10405:27;10284:154;;;:::o;10444:410::-;10521:5;10546:65;10562:48;10603:6;10562:48;:::i;:::-;10546:65;:::i;:::-;10537:74;;10634:6;10627:5;10620:21;10672:4;10665:5;10661:16;10710:3;10701:6;10696:3;10692:16;10689:25;10686:112;;;10717:79;;:::i;:::-;10686:112;10807:41;10841:6;10836:3;10831;10807:41;:::i;:::-;10527:327;10444:410;;;;;:::o;10873:338::-;10928:5;10977:3;10970:4;10962:6;10958:17;10954:27;10944:122;;10985:79;;:::i;:::-;10944:122;11102:6;11089:20;11127:78;11201:3;11193:6;11186:4;11178:6;11174:17;11127:78;:::i;:::-;11118:87;;10934:277;10873:338;;;;:::o;11217:943::-;11312:6;11320;11328;11336;11385:3;11373:9;11364:7;11360:23;11356:33;11353:120;;;11392:79;;:::i;:::-;11353:120;11512:1;11537:53;11582:7;11573:6;11562:9;11558:22;11537:53;:::i;:::-;11527:63;;11483:117;11639:2;11665:53;11710:7;11701:6;11690:9;11686:22;11665:53;:::i;:::-;11655:63;;11610:118;11767:2;11793:53;11838:7;11829:6;11818:9;11814:22;11793:53;:::i;:::-;11783:63;;11738:118;11923:2;11912:9;11908:18;11895:32;11954:18;11946:6;11943:30;11940:117;;;11976:79;;:::i;:::-;11940:117;12081:62;12135:7;12126:6;12115:9;12111:22;12081:62;:::i;:::-;12071:72;;11866:287;11217:943;;;;;;;:::o;12166:120::-;12238:23;12255:5;12238:23;:::i;:::-;12231:5;12228:34;12218:62;;12276:1;12273;12266:12;12218:62;12166:120;:::o;12292:137::-;12337:5;12375:6;12362:20;12353:29;;12391:32;12417:5;12391:32;:::i;:::-;12292:137;;;;:::o;12435:120::-;12507:23;12524:5;12507:23;:::i;:::-;12500:5;12497:34;12487:62;;12545:1;12542;12535:12;12487:62;12435:120;:::o;12561:137::-;12606:5;12644:6;12631:20;12622:29;;12660:32;12686:5;12660:32;:::i;:::-;12561:137;;;;:::o;12704:470::-;12770:6;12778;12827:2;12815:9;12806:7;12802:23;12798:32;12795:119;;;12833:79;;:::i;:::-;12795:119;12953:1;12978:52;13022:7;13013:6;13002:9;12998:22;12978:52;:::i;:::-;12968:62;;12924:116;13079:2;13105:52;13149:7;13140:6;13129:9;13125:22;13105:52;:::i;:::-;13095:62;;13050:117;12704:470;;;;;:::o;13180:474::-;13248:6;13256;13305:2;13293:9;13284:7;13280:23;13276:32;13273:119;;;13311:79;;:::i;:::-;13273:119;13431:1;13456:53;13501:7;13492:6;13481:9;13477:22;13456:53;:::i;:::-;13446:63;;13402:117;13558:2;13584:53;13629:7;13620:6;13609:9;13605:22;13584:53;:::i;:::-;13574:63;;13529:118;13180:474;;;;;:::o;13660:180::-;13708:77;13705:1;13698:88;13805:4;13802:1;13795:15;13829:4;13826:1;13819:15;13846:320;13890:6;13927:1;13921:4;13917:12;13907:22;;13974:1;13968:4;13964:12;13995:18;13985:81;;14051:4;14043:6;14039:17;14029:27;;13985:81;14113:2;14105:6;14102:14;14082:18;14079:38;14076:84;;;14132:18;;:::i;:::-;14076:84;13897:269;13846:320;;;:::o;14172:182::-;14312:34;14308:1;14300:6;14296:14;14289:58;14172:182;:::o;14360:366::-;14502:3;14523:67;14587:2;14582:3;14523:67;:::i;:::-;14516:74;;14599:93;14688:3;14599:93;:::i;:::-;14717:2;14712:3;14708:12;14701:19;;14360:366;;;:::o;14732:419::-;14898:4;14936:2;14925:9;14921:18;14913:26;;14985:9;14979:4;14975:20;14971:1;14960:9;14956:17;14949:47;15013:131;15139:4;15013:131;:::i;:::-;15005:139;;14732:419;;;:::o;15157:226::-;15297:34;15293:1;15285:6;15281:14;15274:58;15366:9;15361:2;15353:6;15349:15;15342:34;15157:226;:::o;15389:366::-;15531:3;15552:67;15616:2;15611:3;15552:67;:::i;:::-;15545:74;;15628:93;15717:3;15628:93;:::i;:::-;15746:2;15741:3;15737:12;15730:19;;15389:366;;;:::o;15761:419::-;15927:4;15965:2;15954:9;15950:18;15942:26;;16014:9;16008:4;16004:20;16000:1;15989:9;15985:17;15978:47;16042:131;16168:4;16042:131;:::i;:::-;16034:139;;15761:419;;;:::o;16186:180::-;16234:77;16231:1;16224:88;16331:4;16328:1;16321:15;16355:4;16352:1;16345:15;16372:305;16412:3;16431:20;16449:1;16431:20;:::i;:::-;16426:25;;16465:20;16483:1;16465:20;:::i;:::-;16460:25;;16619:1;16551:66;16547:74;16544:1;16541:81;16538:107;;;16625:18;;:::i;:::-;16538:107;16669:1;16666;16662:9;16655:16;;16372:305;;;;:::o;16683:168::-;16823:20;16819:1;16811:6;16807:14;16800:44;16683:168;:::o;16857:366::-;16999:3;17020:67;17084:2;17079:3;17020:67;:::i;:::-;17013:74;;17096:93;17185:3;17096:93;:::i;:::-;17214:2;17209:3;17205:12;17198:19;;16857:366;;;:::o;17229:419::-;17395:4;17433:2;17422:9;17418:18;17410:26;;17482:9;17476:4;17472:20;17468:1;17457:9;17453:17;17446:47;17510:131;17636:4;17510:131;:::i;:::-;17502:139;;17229:419;;;:::o;17654:174::-;17794:26;17790:1;17782:6;17778:14;17771:50;17654:174;:::o;17834:366::-;17976:3;17997:67;18061:2;18056:3;17997:67;:::i;:::-;17990:74;;18073:93;18162:3;18073:93;:::i;:::-;18191:2;18186:3;18182:12;18175:19;;17834:366;;;:::o;18206:419::-;18372:4;18410:2;18399:9;18395:18;18387:26;;18459:9;18453:4;18449:20;18445:1;18434:9;18430:17;18423:47;18487:131;18613:4;18487:131;:::i;:::-;18479:139;;18206:419;;;:::o;18631:180::-;18771:32;18767:1;18759:6;18755:14;18748:56;18631:180;:::o;18817:366::-;18959:3;18980:67;19044:2;19039:3;18980:67;:::i;:::-;18973:74;;19056:93;19145:3;19056:93;:::i;:::-;19174:2;19169:3;19165:12;19158:19;;18817:366;;;:::o;19189:419::-;19355:4;19393:2;19382:9;19378:18;19370:26;;19442:9;19436:4;19432:20;19428:1;19417:9;19413:17;19406:47;19470:131;19596:4;19470:131;:::i;:::-;19462:139;;19189:419;;;:::o;19614:179::-;19754:31;19750:1;19742:6;19738:14;19731:55;19614:179;:::o;19799:366::-;19941:3;19962:67;20026:2;20021:3;19962:67;:::i;:::-;19955:74;;20038:93;20127:3;20038:93;:::i;:::-;20156:2;20151:3;20147:12;20140:19;;19799:366;;;:::o;20171:419::-;20337:4;20375:2;20364:9;20360:18;20352:26;;20424:9;20418:4;20414:20;20410:1;20399:9;20395:17;20388:47;20452:131;20578:4;20452:131;:::i;:::-;20444:139;;20171:419;;;:::o;20596:232::-;20736:34;20732:1;20724:6;20720:14;20713:58;20805:15;20800:2;20792:6;20788:15;20781:40;20596:232;:::o;20834:366::-;20976:3;20997:67;21061:2;21056:3;20997:67;:::i;:::-;20990:74;;21073:93;21162:3;21073:93;:::i;:::-;21191:2;21186:3;21182:12;21175:19;;20834:366;;;:::o;21206:419::-;21372:4;21410:2;21399:9;21395:18;21387:26;;21459:9;21453:4;21449:20;21445:1;21434:9;21430:17;21423:47;21487:131;21613:4;21487:131;:::i;:::-;21479:139;;21206:419;;;:::o;21631:348::-;21671:7;21694:20;21712:1;21694:20;:::i;:::-;21689:25;;21728:20;21746:1;21728:20;:::i;:::-;21723:25;;21916:1;21848:66;21844:74;21841:1;21838:81;21833:1;21826:9;21819:17;21815:105;21812:131;;;21923:18;;:::i;:::-;21812:131;21971:1;21968;21964:9;21953:20;;21631:348;;;;:::o;21985:191::-;22025:4;22045:20;22063:1;22045:20;:::i;:::-;22040:25;;22079:20;22097:1;22079:20;:::i;:::-;22074:25;;22118:1;22115;22112:8;22109:34;;;22123:18;;:::i;:::-;22109:34;22168:1;22165;22161:9;22153:17;;21985:191;;;;:::o;22182:168::-;22322:20;22318:1;22310:6;22306:14;22299:44;22182:168;:::o;22356:366::-;22498:3;22519:67;22583:2;22578:3;22519:67;:::i;:::-;22512:74;;22595:93;22684:3;22595:93;:::i;:::-;22713:2;22708:3;22704:12;22697:19;;22356:366;;;:::o;22728:419::-;22894:4;22932:2;22921:9;22917:18;22909:26;;22981:9;22975:4;22971:20;22967:1;22956:9;22952:17;22945:47;23009:131;23135:4;23009:131;:::i;:::-;23001:139;;22728:419;;;:::o;23153:147::-;23254:11;23291:3;23276:18;;23153:147;;;;:::o;23306:114::-;;:::o;23426:398::-;23585:3;23606:83;23687:1;23682:3;23606:83;:::i;:::-;23599:90;;23698:93;23787:3;23698:93;:::i;:::-;23816:1;23811:3;23807:11;23800:18;;23426:398;;;:::o;23830:379::-;24014:3;24036:147;24179:3;24036:147;:::i;:::-;24029:154;;24200:3;24193:10;;23830:379;;;:::o;24215:166::-;24355:18;24351:1;24343:6;24339:14;24332:42;24215:166;:::o;24387:366::-;24529:3;24550:67;24614:2;24609:3;24550:67;:::i;:::-;24543:74;;24626:93;24715:3;24626:93;:::i;:::-;24744:2;24739:3;24735:12;24728:19;;24387:366;;;:::o;24759:419::-;24925:4;24963:2;24952:9;24948:18;24940:26;;25012:9;25006:4;25002:20;24998:1;24987:9;24983:17;24976:47;25040:131;25166:4;25040:131;:::i;:::-;25032:139;;24759:419;;;:::o;25184:171::-;25324:23;25320:1;25312:6;25308:14;25301:47;25184:171;:::o;25361:366::-;25503:3;25524:67;25588:2;25583:3;25524:67;:::i;:::-;25517:74;;25600:93;25689:3;25600:93;:::i;:::-;25718:2;25713:3;25709:12;25702:19;;25361:366;;;:::o;25733:419::-;25899:4;25937:2;25926:9;25922:18;25914:26;;25986:9;25980:4;25976:20;25972:1;25961:9;25957:17;25950:47;26014:131;26140:4;26014:131;:::i;:::-;26006:139;;25733:419;;;:::o;26158:148::-;26260:11;26297:3;26282:18;;26158:148;;;;:::o;26312:141::-;26361:4;26384:3;26376:11;;26407:3;26404:1;26397:14;26441:4;26438:1;26428:18;26420:26;;26312:141;;;:::o;26483:845::-;26586:3;26623:5;26617:12;26652:36;26678:9;26652:36;:::i;:::-;26704:89;26786:6;26781:3;26704:89;:::i;:::-;26697:96;;26824:1;26813:9;26809:17;26840:1;26835:137;;;;26986:1;26981:341;;;;26802:520;;26835:137;26919:4;26915:9;26904;26900:25;26895:3;26888:38;26955:6;26950:3;26946:16;26939:23;;26835:137;;26981:341;27048:38;27080:5;27048:38;:::i;:::-;27108:1;27122:154;27136:6;27133:1;27130:13;27122:154;;;27210:7;27204:14;27200:1;27195:3;27191:11;27184:35;27260:1;27251:7;27247:15;27236:26;;27158:4;27155:1;27151:12;27146:17;;27122:154;;;27305:6;27300:3;27296:16;27289:23;;26988:334;;26802:520;;26590:738;;26483:845;;;;:::o;27334:377::-;27440:3;27468:39;27501:5;27468:39;:::i;:::-;27523:89;27605:6;27600:3;27523:89;:::i;:::-;27516:96;;27621:52;27666:6;27661:3;27654:4;27647:5;27643:16;27621:52;:::i;:::-;27698:6;27693:3;27689:16;27682:23;;27444:267;27334:377;;;;:::o;27717:155::-;27857:7;27853:1;27845:6;27841:14;27834:31;27717:155;:::o;27878:400::-;28038:3;28059:84;28141:1;28136:3;28059:84;:::i;:::-;28052:91;;28152:93;28241:3;28152:93;:::i;:::-;28270:1;28265:3;28261:11;28254:18;;27878:400;;;:::o;28284:695::-;28562:3;28584:92;28672:3;28663:6;28584:92;:::i;:::-;28577:99;;28693:95;28784:3;28775:6;28693:95;:::i;:::-;28686:102;;28805:148;28949:3;28805:148;:::i;:::-;28798:155;;28970:3;28963:10;;28284:695;;;;;:::o;28985:225::-;29125:34;29121:1;29113:6;29109:14;29102:58;29194:8;29189:2;29181:6;29177:15;29170:33;28985:225;:::o;29216:366::-;29358:3;29379:67;29443:2;29438:3;29379:67;:::i;:::-;29372:74;;29455:93;29544:3;29455:93;:::i;:::-;29573:2;29568:3;29564:12;29557:19;;29216:366;;;:::o;29588:419::-;29754:4;29792:2;29781:9;29777:18;29769:26;;29841:9;29835:4;29831:20;29827:1;29816:9;29812:17;29805:47;29869:131;29995:4;29869:131;:::i;:::-;29861:139;;29588:419;;;:::o;30013:172::-;30153:24;30149:1;30141:6;30137:14;30130:48;30013:172;:::o;30191:366::-;30333:3;30354:67;30418:2;30413:3;30354:67;:::i;:::-;30347:74;;30430:93;30519:3;30430:93;:::i;:::-;30548:2;30543:3;30539:12;30532:19;;30191:366;;;:::o;30563:419::-;30729:4;30767:2;30756:9;30752:18;30744:26;;30816:9;30810:4;30806:20;30802:1;30791:9;30787:17;30780:47;30844:131;30970:4;30844:131;:::i;:::-;30836:139;;30563:419;;;:::o;30988:98::-;31039:6;31073:5;31067:12;31057:22;;30988:98;;;:::o;31092:168::-;31175:11;31209:6;31204:3;31197:19;31249:4;31244:3;31240:14;31225:29;;31092:168;;;;:::o;31266:360::-;31352:3;31380:38;31412:5;31380:38;:::i;:::-;31434:70;31497:6;31492:3;31434:70;:::i;:::-;31427:77;;31513:52;31558:6;31553:3;31546:4;31539:5;31535:16;31513:52;:::i;:::-;31590:29;31612:6;31590:29;:::i;:::-;31585:3;31581:39;31574:46;;31356:270;31266:360;;;;:::o;31632:640::-;31827:4;31865:3;31854:9;31850:19;31842:27;;31879:71;31947:1;31936:9;31932:17;31923:6;31879:71;:::i;:::-;31960:72;32028:2;32017:9;32013:18;32004:6;31960:72;:::i;:::-;32042;32110:2;32099:9;32095:18;32086:6;32042:72;:::i;:::-;32161:9;32155:4;32151:20;32146:2;32135:9;32131:18;32124:48;32189:76;32260:4;32251:6;32189:76;:::i;:::-;32181:84;;31632:640;;;;;;;:::o;32278:141::-;32334:5;32365:6;32359:13;32350:22;;32381:32;32407:5;32381:32;:::i;:::-;32278:141;;;;:::o;32425:349::-;32494:6;32543:2;32531:9;32522:7;32518:23;32514:32;32511:119;;;32549:79;;:::i;:::-;32511:119;32669:1;32694:63;32749:7;32740:6;32729:9;32725:22;32694:63;:::i;:::-;32684:73;;32640:127;32425:349;;;;:::o;32780:233::-;32819:3;32842:24;32860:5;32842:24;:::i;:::-;32833:33;;32888:66;32881:5;32878:77;32875:103;;;32958:18;;:::i;:::-;32875:103;33005:1;32998:5;32994:13;32987:20;;32780:233;;;:::o;33019:180::-;33067:77;33064:1;33057:88;33164:4;33161:1;33154:15;33188:4;33185:1;33178:15;33205:185;33245:1;33262:20;33280:1;33262:20;:::i;:::-;33257:25;;33296:20;33314:1;33296:20;:::i;:::-;33291:25;;33335:1;33325:35;;33340:18;;:::i;:::-;33325:35;33382:1;33379;33375:9;33370:14;;33205:185;;;;:::o;33396:176::-;33428:1;33445:20;33463:1;33445:20;:::i;:::-;33440:25;;33479:20;33497:1;33479:20;:::i;:::-;33474:25;;33518:1;33508:35;;33523:18;;:::i;:::-;33508:35;33564:1;33561;33557:9;33552:14;;33396:176;;;;:::o;33578:180::-;33626:77;33623:1;33616:88;33723:4;33720:1;33713:15;33747:4;33744:1;33737:15

Swarm Source

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