ETH Price: $2,571.03 (-4.00%)
Gas: 2 Gwei

Token

PAPC- Punk Ape Pixel Club Genesis (PAPC-G)
 

Overview

Max Total Supply

2,019 PAPC-G

Holders

264

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
first48.eth
Balance
1 PAPC-G
0xc4881181b90d6db4c1a88dbce29fdbf20535602d
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:
PAPC_G

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

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

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

/**
 * @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;
    address private _previousOwner;
    uint256 private _lockTime;

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

    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        _previousOwner = _owner;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function owner() public view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        _previousOwner = address(0);
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
    
    function geUnlockTime() public view returns (uint256) {
        return _lockTime;
    }

    function lock(uint256 time) public virtual onlyOwner {
        _previousOwner = _owner;
        _owner = address(0);
        _lockTime = block.timestamp + time;
        emit OwnershipTransferred(_owner, address(0));
    }

    function unlock() public virtual {
        require(_previousOwner == msg.sender, "You don't have permission to unlock");
        require(block.timestamp > _lockTime , "Contract is locked for a while");
        emit OwnershipTransferred(_owner, _previousOwner);
        _owner = _previousOwner;
    }
}

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

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


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

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, 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 whiteed 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 Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @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 if the `operator` is whiteed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

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


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

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


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

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

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

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


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

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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


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

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // 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;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @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) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _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 {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @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.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @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`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is whiteed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

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

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * 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
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a 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 _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}


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

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}


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


/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this whites for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}


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


// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}




/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Does not support burning tokens to address(0).
 */
contract ERC721A is
  Context,
  ERC165,
  IERC721,
  IERC721Metadata,
  IERC721Enumerable
{
  using Address for address;
  using Strings for uint256;

  struct TokenOwnership {
    address addr;
    uint64 startTimestamp;
  }

  struct AddressData {
    uint128 balance;
    uint128 numberMinted;
  }

  uint256 private currentIndex = 0;

  uint256 internal immutable maxBatchSize;

  // Token name
  string private _name;

  // Token symbol
  string private _symbol;

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

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

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

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

  /**
   * @dev
   * `maxBatchSize` refers to how much a minter can mint at a time.
   */
  constructor(
    string memory name_,
    string memory symbol_,
    uint256 maxBatchSize_
  ) {
    require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero");
    _name = name_;
    _symbol = symbol_;
    maxBatchSize = maxBatchSize_;
  }

  /**
   * @dev See {IERC721Enumerable-totalSupply}.
   */
  function totalSupply() public view override returns (uint256) {
    return currentIndex;
  }

  /**
   * @dev See {IERC721Enumerable-tokenByIndex}.
   */
  function tokenByIndex(uint256 index) public view override returns (uint256) {
    require(index < totalSupply(), "ERC721A: global index out of bounds");
    return index;
  }

  /**
   * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
   * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
   * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
   */
  function tokenOfOwnerByIndex(address owner, uint256 index)
    public
    view
    override
    returns (uint256)
  {
    require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
    uint256 numMintedSoFar = totalSupply();
    uint256 tokenIdsIdx = 0;
    address currOwnershipAddr = address(0);
    for (uint256 i = 0; i < numMintedSoFar; i++) {
      TokenOwnership memory ownership = _ownerships[i];
      if (ownership.addr != address(0)) {
        currOwnershipAddr = ownership.addr;
      }
      if (currOwnershipAddr == owner) {
        if (tokenIdsIdx == index) {
          return i;
        }
        tokenIdsIdx++;
      }
    }
    revert("ERC721A: unable to get token of owner by index");
  }

  function walletOfOwner(address owner) public view returns(uint256[] memory) {
    uint256 tokenCount = balanceOf(owner);

    uint256[] memory tokenIds = new uint256[](tokenCount);
    if (tokenCount == 0)
    {
      return tokenIds;
    }

    uint256 numMintedSoFar = totalSupply();
    uint256 tokenIdsIdx = 0;
    address currOwnershipAddr = address(0);
    for (uint256 i = 0; i < numMintedSoFar; i++) {
      TokenOwnership memory ownership = _ownerships[i];
      if (ownership.addr != address(0)) {
        currOwnershipAddr = ownership.addr;
      }
      if (currOwnershipAddr == owner) {
        tokenIds[tokenIdsIdx] = i;
        tokenIdsIdx++;
        if (tokenIdsIdx == tokenCount) {
          return tokenIds;
        }
      }
    }
    revert("ERC721A: unable to get walletOfOwner");
  }

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

  /**
   * @dev See {IERC721-balanceOf}.
   */
  function balanceOf(address owner) public view override returns (uint256) {
    require(owner != address(0), "ERC721A: balance query for the zero address");
    return uint256(_addressData[owner].balance);
  }

  function _numberMinted(address owner) internal view returns (uint256) {
    require(
      owner != address(0),
      "ERC721A: number minted query for the zero address"
    );
    return uint256(_addressData[owner].numberMinted);
  }

  function ownershipOf(uint256 tokenId)
    internal
    view
    returns (TokenOwnership memory)
  {
    require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

    uint256 lowestTokenToCheck;
    if (tokenId >= maxBatchSize) {
      lowestTokenToCheck = tokenId - maxBatchSize + 1;
    }

    for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) {
      TokenOwnership memory ownership = _ownerships[curr];
      if (ownership.addr != address(0)) {
        return ownership;
      }
    }

    revert("ERC721A: unable to determine the owner of token");
  }

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

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

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

  /**
   * @dev See {IERC721Metadata-tokenURI}.
   */
  function tokenURI(uint256 tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
      tokenId = tokenId;
    require(
      _exists(tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );

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

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

  /**
   * @dev See {IERC721-approve}.
   */
  function approve(address to, uint256 tokenId) public override {
    address owner = ERC721A.ownerOf(tokenId);
    require(to != owner, "ERC721A: approval to current owner");

    require(
      _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
      "ERC721A: approve caller is not owner nor approved for all"
    );

    _approve(to, tokenId, owner);
  }

  /**
   * @dev See {IERC721-getApproved}.
   */
  function getApproved(uint256 tokenId) public view override returns (address) {
    require(_exists(tokenId), "ERC721A: approved query for nonexistent token");

    return _tokenApprovals[tokenId];
  }

  /**
   * @dev See {IERC721-setApprovalForAll}.
   */
  function setApprovalForAll(address operator, bool approved) public override {
    require(operator != _msgSender(), "ERC721A: approve to caller");

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

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

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

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

  /**
   * @dev See {IERC721-safeTransferFrom}.
   */
  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) public virtual override {
    _transfer(from, to, tokenId);
    require(
      _checkOnERC721Received(from, to, tokenId, _data),
      "ERC721A: transfer to non ERC721Receiver implementer"
    );
  }

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

  function _safeMint(address to, uint256 quantity) internal {
    _safeMint(to, quantity, "");
  }

  /**
   * @dev Mints `quantity` tokens and transfers them to `to`.
   *
   * Requirements:
   *
   * - `to` cannot be the zero address.
   * - `quantity` cannot be larger than the max batch size.
   *
   * Emits a {Transfer} event.
   */
  function _safeMint(
    address to,
    uint256 quantity,
    bytes memory _data
  ) internal {
    uint256 startTokenId = currentIndex;
    require(to != address(0), "ERC721A: mint to the zero address");
    // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
    require(!_exists(startTokenId), "ERC721A: token already minted");
    require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high");

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

    AddressData memory addressData = _addressData[to];
    _addressData[to] = AddressData(
      addressData.balance + uint128(quantity),
      addressData.numberMinted + uint128(quantity)
    );
    _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

    uint256 updatedIndex = startTokenId;

    for (uint256 i = 0; i < quantity; i++) {
      emit Transfer(address(0), to, updatedIndex);
      require(
        _checkOnERC721Received(address(0), to, updatedIndex, _data),
        "ERC721A: transfer to non ERC721Receiver implementer"
      );
      updatedIndex++;
    }

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

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

    bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
      getApproved(tokenId) == _msgSender() ||
      isApprovedForAll(prevOwnership.addr, _msgSender()));

    require(
      isApprovedOrOwner,
      "ERC721A: transfer caller is not owner nor approved"
    );

    require(
      prevOwnership.addr == from,
      "ERC721A: transfer from incorrect owner"
    );
    require(to != address(0), "ERC721A: transfer to the zero address");

    _beforeTokenTransfers(from, to, tokenId, 1);

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

    _addressData[from].balance -= 1;
    _addressData[to].balance += 1;
    _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

    // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
    // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
    uint256 nextTokenId = tokenId + 1;
    if (_ownerships[nextTokenId].addr == address(0)) {
      if (_exists(nextTokenId)) {
        _ownerships[nextTokenId] = TokenOwnership(
          prevOwnership.addr,
          prevOwnership.startTimestamp
        );
      }
    }

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

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

  uint256 public nextOwnerToExplicitlySet = 0;

  /**
   * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
   */
  function _setOwnersExplicit(uint256 quantity) internal {
    uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
    require(quantity > 0, "quantity must be nonzero");
    uint256 endIndex = oldNextOwnerToSet + quantity - 1;
    if (endIndex > currentIndex - 1) {
      endIndex = currentIndex - 1;
    }
    // We know if the last one in the group exists, all in the group exist, due to serial ordering.
    require(_exists(endIndex), "not enough minted yet for this cleanup");
    for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
      if (_ownerships[i].addr == address(0)) {
        TokenOwnership memory ownership = ownershipOf(i);
        _ownerships[i] = TokenOwnership(
          ownership.addr,
          ownership.startTimestamp
        );
      }
    }
    nextOwnerToExplicitlySet = endIndex + 1;
  }

  /**
   * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
   * The call is not executed if the target address is not a 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 _checkOnERC721Received(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) private returns (bool) {
    if (to.isContract()) {
      try
        IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data)
      returns (bytes4 retval) {
        return retval == IERC721Receiver(to).onERC721Received.selector;
      } catch (bytes memory reason) {
        if (reason.length == 0) {
          revert("ERC721A: transfer to non ERC721Receiver implementer");
        } else {
          assembly {
            revert(add(32, reason), mload(reason))
          }
        }
      }
    } else {
      return true;
    }
  }

  /**
   * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
   *
   * 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`.
   */
  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.
   *
   * 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` and `to` are never both zero.
   */
  function _afterTokenTransfers(
    address from,
    address to,
    uint256 startTokenId,
    uint256 quantity
  ) internal virtual {}
}

contract PAPC_G is ERC721A, Ownable {
    string private _baseUri = "https://ipfs.io/ipfs/QmXng4M2LvUdc1a5vzYbx6UrJJNe61mignwsmDGJAiegBV/";

    uint256 public constant MAX_SUPPLY = 5000;
    uint256 public constant PRICE_SALE = 0.01 ether;
    uint256 private _mintCount = 0;

    bool public _isMintingActive = false;
    bool public _isMintedForTreasury = false;

    uint256 public constant START_SALE = 1048238400;

    address treasuryWallet = 0xeffd3ac8EA0e9EBF3FDF4371109FA5CaEE2D4aB1;

    mapping(address => bool) private oldHolderForFreeMint;
    mapping(address => bool) private activedHolderForFreeMint;

    event Mint(address _to, uint256 _amount);

    constructor(address[] memory holderForFreeMint) ERC721A("PAPC- Punk Ape Pixel Club Genesis", "PAPC-G", 100) {

        for (uint i = 0; i < holderForFreeMint.length; i++) {
            oldHolderForFreeMint[holderForFreeMint[i]] = true;
            activedHolderForFreeMint[holderForFreeMint[i]] = false;
        }
    }

    function getBalance() public view returns(uint) {
        return address(this).balance;
    }

    function withdraw() public onlyOwner{
        address payable to = payable(msg.sender);
        to.transfer(getBalance());
    } 

    function treasuryMint() public onlyOwner {
        require(_isMintedForTreasury == false, "NFTs are already minted for teasury wallet");
        _safeMint(treasuryWallet, 100);

        _isMintedForTreasury = true;
    }

    function freeMint(address receiver, uint256 quantity) public onlyOwner {
        _safeMint(receiver, quantity);
        
        emit Mint(receiver, quantity);
    }

    function holderMint() external {
        require(_isMintingActive && block.timestamp >= START_SALE, "PAPC-G: holder mint is not active");
        require(oldHolderForFreeMint[msg.sender] == true, "PAPC-G: You are not allowed!");
        require(activedHolderForFreeMint[msg.sender] == false, "PAPC-G: You are already free minted");

        _safeMint(msg.sender, 10);
        _mintCount = _mintCount + 10;
        activedHolderForFreeMint[msg.sender] = true;

        emit Mint(msg.sender, 10);
    }

    function isActivedHolderForFreeMint(address holder) public view returns(bool) {
        return activedHolderForFreeMint[holder];
    }

    function mint(uint256 quantity) external payable {
        require(_isMintingActive && block.timestamp >= START_SALE, "PAPC-G: sale is not active");
        require(quantity <= 25, "PAPC-G: minting too many");
        require(_mintCount + quantity <= MAX_SUPPLY, "PAPC-G: exceeds max supply");
        require(quantity * PRICE_SALE == msg.value, "PAPC-G: must send correct ETH amount");

        _safeMint(msg.sender, quantity);
        _mintCount = _mintCount + quantity;

        emit Mint(msg.sender, quantity);
    }

    function setBaseURI(string memory baseUri) public onlyOwner {
        _baseUri = baseUri;
    }

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

    function toggleMinting() public onlyOwner {
        _isMintingActive = !_isMintingActive;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address[]","name":"holderForFreeMint","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"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":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Mint","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":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_SALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"START_SALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_isMintedForTreasury","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_isMintingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"geUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"holderMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"isActivedHolderForFreeMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","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":[{"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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6000808055600755610120604052604460a08181529062002dc360c03980516200003291600b916020909101906200021a565b506000600c55600d80546001600160b01b03191675effd3ac8ea0e9ebf3fdf4371109fa5caee2d4ab100001790553480156200006d57600080fd5b5060405162002e0738038062002e078339810160408190526200009091620002f3565b60405180606001604052806021815260200162002da260219139604080518082019091526006815265504150432d4760d01b602082015260648251620000de9060019060208601906200021a565b508151620000f49060029060208501906200021a565b50608052505060088054336001600160a01b03199182168117909255600980549091168217905560405181906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060005b815181101562000212576001600e6000848481518110620001715762000171620003c5565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600f6000848481518110620001cb57620001cb620003c5565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806200020981620003db565b9150506200014c565b505062000442565b828054620002289062000405565b90600052602060002090601f0160209004810192826200024c576000855562000297565b82601f106200026757805160ff191683800117855562000297565b8280016001018555821562000297579182015b82811115620002975782518255916020019190600101906200027a565b50620002a5929150620002a9565b5090565b5b80821115620002a55760008155600101620002aa565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b0381168114620002ee57600080fd5b919050565b600060208083850312156200030757600080fd5b82516001600160401b03808211156200031f57600080fd5b818501915085601f8301126200033457600080fd5b815181811115620003495762000349620002c0565b8060051b604051601f19603f83011681018181108582111715620003715762000371620002c0565b6040529182528482019250838101850191888311156200039057600080fd5b938501935b82851015620003b957620003a985620002d6565b8452938501939285019262000395565b98975050505050505050565b634e487b7160e01b600052603260045260246000fd5b6000600019821415620003fe57634e487b7160e01b600052601160045260246000fd5b5060010190565b600181811c908216806200041a57607f821691505b602082108114156200043c57634e487b7160e01b600052602260045260246000fd5b50919050565b6080516129366200046c60003960008181611c6601528181611c90015261205701526129366000f3fe6080604052600436106102245760003560e01c806355f804b311610123578063a0712d68116100ab578063c87b56dd1161006f578063c87b56dd14610611578063d7224ba014610631578063dd46706414610647578063e985e9c514610667578063f2fde38b146106b057600080fd5b8063a0712d6814610594578063a22cb465146105a7578063a69df4b5146105c7578063b6c52324146105dc578063b88d4fde146105f157600080fd5b8063715018a6116100f2578063715018a6146105175780637d55094d1461052c5780638da5cb5b1461054157806395d89b411461055f5780639883566e1461057457600080fd5b806355f804b314610498578063593cfd9d146104b85780636352211e146104d757806370a08231146104f757600080fd5b806320df16bf116101b15780633ccfd60b116101755780633ccfd60b146103fc57806342842e0e14610411578063438b6300146104315780634ef15e061461045e5780634f6ccce71461047857600080fd5b806320df16bf1461035557806323b872dd1461036d5780632f745c591461038d57806332cb6b0c146103ad578063360bad67146103c357600080fd5b8063095ea7b3116101f8578063095ea7b3146102cf5780630e31db48146102ef5780630e80d8b91461030457806312065fe01461032d57806318160ddd1461034057600080fd5b80620322351461022957806301ffc9a71461024057806306fdde0314610275578063081812fc14610297575b600080fd5b34801561023557600080fd5b5061023e6106d0565b005b34801561024c57600080fd5b5061026061025b36600461231e565b61079c565b60405190151581526020015b60405180910390f35b34801561028157600080fd5b5061028a610809565b60405161026c9190612393565b3480156102a357600080fd5b506102b76102b23660046123a6565b61089b565b6040516001600160a01b03909116815260200161026c565b3480156102db57600080fd5b5061023e6102ea3660046123db565b610926565b3480156102fb57600080fd5b5061023e610a3e565b34801561031057600080fd5b5061031f662386f26fc1000081565b60405190815260200161026c565b34801561033957600080fd5b504761031f565b34801561034c57600080fd5b5060005461031f565b34801561036157600080fd5b5061031f633e7ad94081565b34801561037957600080fd5b5061023e610388366004612405565b610bec565b34801561039957600080fd5b5061031f6103a83660046123db565b610bf7565b3480156103b957600080fd5b5061031f61138881565b3480156103cf57600080fd5b506102606103de366004612441565b6001600160a01b03166000908152600f602052604090205460ff1690565b34801561040857600080fd5b5061023e610d65565b34801561041d57600080fd5b5061023e61042c366004612405565b610dc1565b34801561043d57600080fd5b5061045161044c366004612441565b610ddc565b60405161026c919061245c565b34801561046a57600080fd5b50600d546102609060ff1681565b34801561048457600080fd5b5061031f6104933660046123a6565b610f5b565b3480156104a457600080fd5b5061023e6104b336600461252c565b610fbd565b3480156104c457600080fd5b50600d5461026090610100900460ff1681565b3480156104e357600080fd5b506102b76104f23660046123a6565b610ffa565b34801561050357600080fd5b5061031f610512366004612441565b61100c565b34801561052357600080fd5b5061023e61109d565b34801561053857600080fd5b5061023e61110f565b34801561054d57600080fd5b506008546001600160a01b03166102b7565b34801561056b57600080fd5b5061028a61114d565b34801561058057600080fd5b5061023e61058f3660046123db565b61115c565b61023e6105a23660046123a6565b6111d6565b3480156105b357600080fd5b5061023e6105c2366004612575565b6113aa565b3480156105d357600080fd5b5061023e61146f565b3480156105e857600080fd5b50600a5461031f565b3480156105fd57600080fd5b5061023e61060c3660046125b1565b611577565b34801561061d57600080fd5b5061028a61062c3660046123a6565b6115b0565b34801561063d57600080fd5b5061031f60075481565b34801561065357600080fd5b5061023e6106623660046123a6565b611688565b34801561067357600080fd5b5061026061068236600461262d565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b3480156106bc57600080fd5b5061023e6106cb366004612441565b61170d565b6008546001600160a01b031633146107035760405162461bcd60e51b81526004016106fa90612660565b60405180910390fd5b600d54610100900460ff161561076e5760405162461bcd60e51b815260206004820152602a60248201527f4e4654732061726520616c7265616479206d696e74656420666f7220746561736044820152691d5c9e481dd85b1b195d60b21b60648201526084016106fa565b600d5461078b906201000090046001600160a01b031660646117e6565b600d805461ff001916610100179055565b60006001600160e01b031982166380ac58cd60e01b14806107cd57506001600160e01b03198216635b5e139f60e01b145b806107e857506001600160e01b0319821663780e9d6360e01b145b8061080357506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606001805461081890612695565b80601f016020809104026020016040519081016040528092919081815260200182805461084490612695565b80156108915780601f1061086657610100808354040283529160200191610891565b820191906000526020600020905b81548152906001019060200180831161087457829003601f168201915b5050505050905090565b60006108a8826000541190565b61090a5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084016106fa565b506000908152600560205260409020546001600160a01b031690565b600061093182610ffa565b9050806001600160a01b0316836001600160a01b031614156109a05760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b60648201526084016106fa565b336001600160a01b03821614806109bc57506109bc8133610682565b610a2e5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c0000000000000060648201526084016106fa565b610a39838383611800565b505050565b600d5460ff168015610a545750633e7ad9404210155b610aaa5760405162461bcd60e51b815260206004820152602160248201527f504150432d473a20686f6c646572206d696e74206973206e6f742061637469766044820152606560f81b60648201526084016106fa565b336000908152600e602052604090205460ff161515600114610b0e5760405162461bcd60e51b815260206004820152601c60248201527f504150432d473a20596f7520617265206e6f7420616c6c6f776564210000000060448201526064016106fa565b336000908152600f602052604090205460ff1615610b7a5760405162461bcd60e51b815260206004820152602360248201527f504150432d473a20596f752061726520616c72656164792066726565206d696e6044820152621d195960ea1b60648201526084016106fa565b610b8533600a6117e6565b600c54610b9390600a6126e6565b600c55336000818152600f6020908152604091829020805460ff191660011790558151928352600a908301527f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885910160405180910390a1565b610a3983838361185c565b6000610c028361100c565b8210610c5b5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016106fa565b600080549080805b83811015610d05576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610cb657805192505b876001600160a01b0316836001600160a01b03161415610cf25786841415610ce45750935061080392505050565b83610cee816126fe565b9450505b5080610cfd816126fe565b915050610c63565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b60648201526084016106fa565b6008546001600160a01b03163314610d8f5760405162461bcd60e51b81526004016106fa90612660565b33806108fc476040518115909202916000818181858888f19350505050158015610dbd573d6000803e3d6000fd5b5050565b610a3983838360405180602001604052806000815250611577565b60606000610de98361100c565b905060008167ffffffffffffffff811115610e0657610e066124a0565b604051908082528060200260200182016040528015610e2f578160200160208202803683370190505b50905081610e3e579392505050565b600080549080805b83811015610f06576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610e9957805192505b886001600160a01b0316836001600160a01b03161415610ef35781868581518110610ec657610ec6612719565b602090810291909101015283610edb816126fe565b94505086841415610ef3575093979650505050505050565b5080610efe816126fe565b915050610e46565b5060405162461bcd60e51b8152602060048201526024808201527f455243373231413a20756e61626c6520746f206765742077616c6c65744f664f6044820152633bb732b960e11b60648201526084016106fa565b600080548210610fb95760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b60648201526084016106fa565b5090565b6008546001600160a01b03163314610fe75760405162461bcd60e51b81526004016106fa90612660565b8051610dbd90600b906020840190612275565b600061100582611be4565b5192915050565b60006001600160a01b0382166110785760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084016106fa565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6008546001600160a01b031633146110c75760405162461bcd60e51b81526004016106fa90612660565b600980546001600160a01b03191690556008546040516000916001600160a01b0316906000805160206128e1833981519152908390a3600880546001600160a01b0319169055565b6008546001600160a01b031633146111395760405162461bcd60e51b81526004016106fa90612660565b600d805460ff19811660ff90911615179055565b60606002805461081890612695565b6008546001600160a01b031633146111865760405162461bcd60e51b81526004016106fa90612660565b61119082826117e6565b604080516001600160a01b0384168152602081018390527f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885910160405180910390a15050565b600d5460ff1680156111ec5750633e7ad9404210155b6112385760405162461bcd60e51b815260206004820152601a60248201527f504150432d473a2073616c65206973206e6f742061637469766500000000000060448201526064016106fa565b60198111156112895760405162461bcd60e51b815260206004820152601860248201527f504150432d473a206d696e74696e6720746f6f206d616e79000000000000000060448201526064016106fa565b61138881600c5461129a91906126e6565b11156112e85760405162461bcd60e51b815260206004820152601a60248201527f504150432d473a2065786365656473206d617820737570706c7900000000000060448201526064016106fa565b346112fa662386f26fc100008361272f565b146113535760405162461bcd60e51b8152602060048201526024808201527f504150432d473a206d7573742073656e6420636f72726563742045544820616d6044820152631bdd5b9d60e21b60648201526084016106fa565b61135d33826117e6565b80600c5461136b91906126e6565b600c5560408051338152602081018390527f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885910160405180910390a150565b6001600160a01b0382163314156114035760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c657200000000000060448201526064016106fa565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6009546001600160a01b031633146114d55760405162461bcd60e51b815260206004820152602360248201527f596f7520646f6e27742068617665207065726d697373696f6e20746f20756e6c6044820152626f636b60e81b60648201526084016106fa565b600a5442116115265760405162461bcd60e51b815260206004820152601e60248201527f436f6e7472616374206973206c6f636b656420666f722061207768696c65000060448201526064016106fa565b6009546008546040516001600160a01b0392831692909116906000805160206128e183398151915290600090a3600954600880546001600160a01b0319166001600160a01b03909216919091179055565b61158284848461185c565b61158e84848484611d8e565b6115aa5760405162461bcd60e51b81526004016106fa9061274e565b50505050565b60606115bd826000541190565b6116215760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016106fa565b600061162b611e8d565b9050600081511161164b5760405180602001604052806000815250611681565b8061166061165b8561022c6126e6565b611e9c565b6040516020016116719291906127a1565b6040516020818303038152906040525b9392505050565b6008546001600160a01b031633146116b25760405162461bcd60e51b81526004016106fa90612660565b60088054600980546001600160a01b03199081166001600160a01b038416179091551690556116e181426126e6565b600a556008546040516000916001600160a01b0316906000805160206128e1833981519152908390a350565b6008546001600160a01b031633146117375760405162461bcd60e51b81526004016106fa90612660565b6001600160a01b03811661179c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106fa565b6008546040516001600160a01b038084169216906000805160206128e183398151915290600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b610dbd828260405180602001604052806000815250611f9a565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061186782611be4565b80519091506000906001600160a01b0316336001600160a01b0316148061189e5750336118938461089b565b6001600160a01b0316145b806118b0575081516118b09033610682565b90508061191a5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016106fa565b846001600160a01b031682600001516001600160a01b03161461198e5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b60648201526084016106fa565b6001600160a01b0384166119f25760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016106fa565b611a026000848460000151611800565b6001600160a01b0385166000908152600460205260408120805460019290611a349084906001600160801b03166127d0565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526004602052604081208054600194509092611a80918591166127f8565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff428116602080850191825260008981526003909152948520935184549151909216600160a01b026001600160e01b03199091169190921617179055611b088460016126e6565b6000818152600360205260409020549091506001600160a01b0316611b9a57611b32816000541190565b15611b9a5760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6040805180820190915260008082526020820152611c03826000541190565b611c625760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b60648201526084016106fa565b60007f00000000000000000000000000000000000000000000000000000000000000008310611cc357611cb57f00000000000000000000000000000000000000000000000000000000000000008461281a565b611cc09060016126e6565b90505b825b818110611d2d576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215611d1a57949350505050565b5080611d2581612831565b915050611cc5565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b60648201526084016106fa565b60006001600160a01b0384163b15611e8157604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611dd2903390899088908890600401612848565b6020604051808303816000875af1925050508015611e0d575060408051601f3d908101601f19168201909252611e0a91810190612885565b60015b611e67573d808015611e3b576040519150601f19603f3d011682016040523d82523d6000602084013e611e40565b606091505b508051611e5f5760405162461bcd60e51b81526004016106fa9061274e565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611e85565b5060015b949350505050565b6060600b805461081890612695565b606081611ec05750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611eea5780611ed4816126fe565b9150611ee39050600a836128b8565b9150611ec4565b60008167ffffffffffffffff811115611f0557611f056124a0565b6040519080825280601f01601f191660200182016040528015611f2f576020820181803683370190505b5090505b8415611e8557611f4460018361281a565b9150611f51600a866128cc565b611f5c9060306126e6565b60f81b818381518110611f7157611f71612719565b60200101906001600160f81b031916908160001a905350611f93600a866128b8565b9450611f33565b6000546001600160a01b038416611ffd5760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016106fa565b612008816000541190565b156120555760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e74656400000060448201526064016106fa565b7f00000000000000000000000000000000000000000000000000000000000000008311156120d05760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b60648201526084016106fa565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b909104169181019190915281518083019092528051909190819061212c9087906127f8565b6001600160801b0316815260200185836020015161214a91906127f8565b6001600160801b039081169091526001600160a01b0380881660008181526004602090815260408083208751978301518716600160801b0297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b8581101561226a5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461222e6000888488611d8e565b61224a5760405162461bcd60e51b81526004016106fa9061274e565b81612254816126fe565b9250508080612262906126fe565b9150506121e1565b506000819055611bdc565b82805461228190612695565b90600052602060002090601f0160209004810192826122a357600085556122e9565b82601f106122bc57805160ff19168380011785556122e9565b828001600101855582156122e9579182015b828111156122e95782518255916020019190600101906122ce565b50610fb99291505b80821115610fb957600081556001016122f1565b6001600160e01b03198116811461231b57600080fd5b50565b60006020828403121561233057600080fd5b813561168181612305565b60005b8381101561235657818101518382015260200161233e565b838111156115aa5750506000910152565b6000815180845261237f81602086016020860161233b565b601f01601f19169290920160200192915050565b6020815260006116816020830184612367565b6000602082840312156123b857600080fd5b5035919050565b80356001600160a01b03811681146123d657600080fd5b919050565b600080604083850312156123ee57600080fd5b6123f7836123bf565b946020939093013593505050565b60008060006060848603121561241a57600080fd5b612423846123bf565b9250612431602085016123bf565b9150604084013590509250925092565b60006020828403121561245357600080fd5b611681826123bf565b6020808252825182820181905260009190848201906040850190845b8181101561249457835183529284019291840191600101612478565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156124d1576124d16124a0565b604051601f8501601f19908116603f011681019082821181831017156124f9576124f96124a0565b8160405280935085815286868601111561251257600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561253e57600080fd5b813567ffffffffffffffff81111561255557600080fd5b8201601f8101841361256657600080fd5b611e85848235602084016124b6565b6000806040838503121561258857600080fd5b612591836123bf565b9150602083013580151581146125a657600080fd5b809150509250929050565b600080600080608085870312156125c757600080fd5b6125d0856123bf565b93506125de602086016123bf565b925060408501359150606085013567ffffffffffffffff81111561260157600080fd5b8501601f8101871361261257600080fd5b612621878235602084016124b6565b91505092959194509250565b6000806040838503121561264057600080fd5b612649836123bf565b9150612657602084016123bf565b90509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c908216806126a957607f821691505b602082108114156126ca57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156126f9576126f96126d0565b500190565b6000600019821415612712576127126126d0565b5060010190565b634e487b7160e01b600052603260045260246000fd5b6000816000190483118215151615612749576127496126d0565b500290565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b600083516127b381846020880161233b565b8351908301906127c781836020880161233b565b01949350505050565b60006001600160801b03838116908316818110156127f0576127f06126d0565b039392505050565b60006001600160801b038083168185168083038211156127c7576127c76126d0565b60008282101561282c5761282c6126d0565b500390565b600081612840576128406126d0565b506000190190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061287b90830184612367565b9695505050505050565b60006020828403121561289757600080fd5b815161168181612305565b634e487b7160e01b600052601260045260246000fd5b6000826128c7576128c76128a2565b500490565b6000826128db576128db6128a2565b50069056fe8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0a26469706673582212205bdf68f524c88496df46e95ed09a1c53e4e9ed458645d3a52b850a58912ea6dc64736f6c634300080c0033504150432d2050756e6b2041706520506978656c20436c75622047656e6573697368747470733a2f2f697066732e696f2f697066732f516d586e67344d324c76556463316135767a5962783655724a4a4e6536316d69676e77736d44474a4169656742562f0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000011bcae640854069270b25e877185bfa73fb5286e000000000000000000000000ecd80140dd982c3729d3958141dfd99f0c037d85000000000000000000000000fef291cdf09ccd447760708c530bb713a72a57c9000000000000000000000000c1c986b475dc8423ce01e42355e426f2bc5534420000000000000000000000006d366f344adaa242e92ad41efb355cec06a6dcd500000000000000000000000016180d8645a5ef2ebb77d02e317ac9000be16f4d0000000000000000000000009eda9317771080ec5c5da3b88b4d349103d18eec000000000000000000000000fbca803f600df1f90820a98e03e7afbdfa6b37cc000000000000000000000000c419146e71b288e5b4dcdb3c8960b50a20a7d35a000000000000000000000000b378768b38dd75a69e13336eba4fd93dda7fac490000000000000000000000004190269f4b4dcbba9d7ee384da050b617563c4c60000000000000000000000003b23ce311828f1efee8fee9edce9d85066f39c540000000000000000000000003cbe31e52972885826b01bcbd8a77859c3fa76550000000000000000000000000d6b660899b4cbf7d75f81ad8a5d3fb80f778c79000000000000000000000000f16bb84a62f4e82ca842a3d8c9ba4236f09af2060000000000000000000000001140b071d0922cb09606d23edaf355424b5bce0f000000000000000000000000357fd125e734a5f4df97e0cd909ff3ebc59c784a000000000000000000000000c793c82f1b69ad046dd7a7d15e7486c5356a93d6000000000000000000000000fc3efa70a2f60188a8caa490d9be981f111a239200000000000000000000000026dd2afc3c091bee25fcb0d03a21452803b3986700000000000000000000000004b989ba52b62cfdc7637db70309fbba1cdb6f2d000000000000000000000000e4cdbb0274b900bfdffe75a4a1c381328f1bd2c4000000000000000000000000b8fca963d699d65a10187058476986d5ef457b0a000000000000000000000000a79042d975c435b5b02196e363f4a09147230ebf00000000000000000000000099fe780697069b8ce7d3151790da849862495ba7000000000000000000000000e50eeb5a28750c47d27db7899765d7e487d623af0000000000000000000000004da054fb5eef39b2b6021458c5afb95317c9a3a1000000000000000000000000903a91a52d1c39a3d5cac5aaa53d3db2956e125a0000000000000000000000004a09ff78126fa258439fcad90394c1f1b6529ea000000000000000000000000011bcae640854069270b25e877185bfa73fb5286e0000000000000000000000009eda9317771080ec5c5da3b88b4d349103d18eec000000000000000000000000b285f929d244e74b13f2737ecff70e6e80058c1c0000000000000000000000002711831f3ebcc36541aac7ca4b0ddfac56d0e2e00000000000000000000000008d25c288883f17d4d27d89bdbc008f7925afe498000000000000000000000000cf21bab2be7487e05b4d7618e3cd7548bd0728b7000000000000000000000000c4bab062617db618bb10867c94a7fb523566c14700000000000000000000000016180d8645a5ef2ebb77d02e317ac9000be16f4d00000000000000000000000084bdd8dce2c51ae4d3a293cf227958ddacd4ef2e0000000000000000000000006d366f344adaa242e92ad41efb355cec06a6dcd5000000000000000000000000771c82dd5c6e1011adcf4372e77cf5e5587a90540000000000000000000000007b01970caf724d333ff4982dbeaf5f52d5d30b460000000000000000000000006268e630aaed2cb764a6474c998399943813a0e0000000000000000000000000ada1a2e9e818d1f760eddc49878e0b4085c31a6300000000000000000000000016180d8645a5ef2ebb77d02e317ac9000be16f4d0000000000000000000000004da054fb5eef39b2b6021458c5afb95317c9a3a1000000000000000000000000131638b5577ab6296971a9f1b252e6fc5ddf12c30000000000000000000000001dd069d70b9d359b047ec53986a9f602b35165d6000000000000000000000000dc1d1a5682e5331f94a99f0bcab3b6414701b356000000000000000000000000eca4521e70df66b468525f2d902d7ee1967d60c40000000000000000000000003a1be905c46bd35a9d7dc1ada56e8141ab607e2e000000000000000000000000cf21bab2be7487e05b4d7618e3cd7548bd0728b70000000000000000000000008d0ca99dd5bf7b133f7bba74676fb33a03867f9a00000000000000000000000084bdd8dce2c51ae4d3a293cf227958ddacd4ef2e00000000000000000000000069d7959a5b1d0a80fe6cc7065b492dc9dfbe8025000000000000000000000000ac52bf6c83b218f51414ae6d82562075c866139c0000000000000000000000004a09ff78126fa258439fcad90394c1f1b6529ea000000000000000000000000026dd2afc3c091bee25fcb0d03a21452803b39867000000000000000000000000903a91a52d1c39a3d5cac5aaa53d3db2956e125a000000000000000000000000cbcbb480d7151551035442cbe7ac85d2f69f672b0000000000000000000000008906939e9f401299ee218ac7c3035be564655a2d000000000000000000000000b3aae6397e24961c0440b107ccdf947863cfebff000000000000000000000000cc5b724be4e2bf02e6fd15d55f5d1453594eb692000000000000000000000000a9faa3933b1f7e1ad0a416f02dae9481ec9ac8c9000000000000000000000000a84691dafaee5084531386a969013fac9964c7ad000000000000000000000000771c82dd5c6e1011adcf4372e77cf5e5587a905400000000000000000000000077a40fde3ee2bb9e30d4466fce58ae8f6ef8aff700000000000000000000000075671888fd4090fbe05bd130ab8999e72e21b7c0000000000000000000000000fcdc51b7478ac150e5d426344ad16433b2a5755e00000000000000000000000047e4c0bcfa9c5ed7f281542226e3d1a91b1b2c85000000000000000000000000cd75b8ef4e07cc786844fca2ad1316c4c5b0890c00000000000000000000000054b1c409f41c885f5165eef76aa508b684540d81000000000000000000000000055177792e162d146dba34a92b501107c10a2fc100000000000000000000000086aec8737e5420385a2e2043ebb113fc3f215765000000000000000000000000151482ba55fd7cf1ece5540636c495f9492a0123000000000000000000000000d78337c89fe34debea3b8571f00cc1914849d7f500000000000000000000000075671888fd4090fbe05bd130ab8999e72e21b7c0000000000000000000000000c1d4a4ef157940e2c655aaed5682faeeabfe0d0e0000000000000000000000006d366f344adaa242e92ad41efb355cec06a6dcd5000000000000000000000000a9faa3933b1f7e1ad0a416f02dae9481ec9ac8c900000000000000000000000016180d8645a5ef2ebb77d02e317ac9000be16f4d000000000000000000000000f408bee3443d0397e2c1cde588fb060ac657006f000000000000000000000000c4bab062617db618bb10867c94a7fb523566c1470000000000000000000000001fadf251f0bc8e3da83ead9f1d4d9c7e24ba0f380000000000000000000000004de1705f53f2ac799ff5acf4e642afdbca72eb62000000000000000000000000bddb00d82aee89b522e3d176cc692878f265ee970000000000000000000000003b23ce311828f1efee8fee9edce9d85066f39c54000000000000000000000000ed8f2e1ffd40b3f7edd26af367fa40108ffa9b400000000000000000000000008d25c288883f17d4d27d89bdbc008f7925afe49800000000000000000000000038e5e3cf26198fa534cad474311b1a118a75f84f0000000000000000000000003cbe31e52972885826b01bcbd8a77859c3fa7655000000000000000000000000fbca803f600df1f90820a98e03e7afbdfa6b37cc00000000000000000000000099fe780697069b8ce7d3151790da849862495ba7

Deployed Bytecode

0x6080604052600436106102245760003560e01c806355f804b311610123578063a0712d68116100ab578063c87b56dd1161006f578063c87b56dd14610611578063d7224ba014610631578063dd46706414610647578063e985e9c514610667578063f2fde38b146106b057600080fd5b8063a0712d6814610594578063a22cb465146105a7578063a69df4b5146105c7578063b6c52324146105dc578063b88d4fde146105f157600080fd5b8063715018a6116100f2578063715018a6146105175780637d55094d1461052c5780638da5cb5b1461054157806395d89b411461055f5780639883566e1461057457600080fd5b806355f804b314610498578063593cfd9d146104b85780636352211e146104d757806370a08231146104f757600080fd5b806320df16bf116101b15780633ccfd60b116101755780633ccfd60b146103fc57806342842e0e14610411578063438b6300146104315780634ef15e061461045e5780634f6ccce71461047857600080fd5b806320df16bf1461035557806323b872dd1461036d5780632f745c591461038d57806332cb6b0c146103ad578063360bad67146103c357600080fd5b8063095ea7b3116101f8578063095ea7b3146102cf5780630e31db48146102ef5780630e80d8b91461030457806312065fe01461032d57806318160ddd1461034057600080fd5b80620322351461022957806301ffc9a71461024057806306fdde0314610275578063081812fc14610297575b600080fd5b34801561023557600080fd5b5061023e6106d0565b005b34801561024c57600080fd5b5061026061025b36600461231e565b61079c565b60405190151581526020015b60405180910390f35b34801561028157600080fd5b5061028a610809565b60405161026c9190612393565b3480156102a357600080fd5b506102b76102b23660046123a6565b61089b565b6040516001600160a01b03909116815260200161026c565b3480156102db57600080fd5b5061023e6102ea3660046123db565b610926565b3480156102fb57600080fd5b5061023e610a3e565b34801561031057600080fd5b5061031f662386f26fc1000081565b60405190815260200161026c565b34801561033957600080fd5b504761031f565b34801561034c57600080fd5b5060005461031f565b34801561036157600080fd5b5061031f633e7ad94081565b34801561037957600080fd5b5061023e610388366004612405565b610bec565b34801561039957600080fd5b5061031f6103a83660046123db565b610bf7565b3480156103b957600080fd5b5061031f61138881565b3480156103cf57600080fd5b506102606103de366004612441565b6001600160a01b03166000908152600f602052604090205460ff1690565b34801561040857600080fd5b5061023e610d65565b34801561041d57600080fd5b5061023e61042c366004612405565b610dc1565b34801561043d57600080fd5b5061045161044c366004612441565b610ddc565b60405161026c919061245c565b34801561046a57600080fd5b50600d546102609060ff1681565b34801561048457600080fd5b5061031f6104933660046123a6565b610f5b565b3480156104a457600080fd5b5061023e6104b336600461252c565b610fbd565b3480156104c457600080fd5b50600d5461026090610100900460ff1681565b3480156104e357600080fd5b506102b76104f23660046123a6565b610ffa565b34801561050357600080fd5b5061031f610512366004612441565b61100c565b34801561052357600080fd5b5061023e61109d565b34801561053857600080fd5b5061023e61110f565b34801561054d57600080fd5b506008546001600160a01b03166102b7565b34801561056b57600080fd5b5061028a61114d565b34801561058057600080fd5b5061023e61058f3660046123db565b61115c565b61023e6105a23660046123a6565b6111d6565b3480156105b357600080fd5b5061023e6105c2366004612575565b6113aa565b3480156105d357600080fd5b5061023e61146f565b3480156105e857600080fd5b50600a5461031f565b3480156105fd57600080fd5b5061023e61060c3660046125b1565b611577565b34801561061d57600080fd5b5061028a61062c3660046123a6565b6115b0565b34801561063d57600080fd5b5061031f60075481565b34801561065357600080fd5b5061023e6106623660046123a6565b611688565b34801561067357600080fd5b5061026061068236600461262d565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b3480156106bc57600080fd5b5061023e6106cb366004612441565b61170d565b6008546001600160a01b031633146107035760405162461bcd60e51b81526004016106fa90612660565b60405180910390fd5b600d54610100900460ff161561076e5760405162461bcd60e51b815260206004820152602a60248201527f4e4654732061726520616c7265616479206d696e74656420666f7220746561736044820152691d5c9e481dd85b1b195d60b21b60648201526084016106fa565b600d5461078b906201000090046001600160a01b031660646117e6565b600d805461ff001916610100179055565b60006001600160e01b031982166380ac58cd60e01b14806107cd57506001600160e01b03198216635b5e139f60e01b145b806107e857506001600160e01b0319821663780e9d6360e01b145b8061080357506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606001805461081890612695565b80601f016020809104026020016040519081016040528092919081815260200182805461084490612695565b80156108915780601f1061086657610100808354040283529160200191610891565b820191906000526020600020905b81548152906001019060200180831161087457829003601f168201915b5050505050905090565b60006108a8826000541190565b61090a5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084016106fa565b506000908152600560205260409020546001600160a01b031690565b600061093182610ffa565b9050806001600160a01b0316836001600160a01b031614156109a05760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b60648201526084016106fa565b336001600160a01b03821614806109bc57506109bc8133610682565b610a2e5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c0000000000000060648201526084016106fa565b610a39838383611800565b505050565b600d5460ff168015610a545750633e7ad9404210155b610aaa5760405162461bcd60e51b815260206004820152602160248201527f504150432d473a20686f6c646572206d696e74206973206e6f742061637469766044820152606560f81b60648201526084016106fa565b336000908152600e602052604090205460ff161515600114610b0e5760405162461bcd60e51b815260206004820152601c60248201527f504150432d473a20596f7520617265206e6f7420616c6c6f776564210000000060448201526064016106fa565b336000908152600f602052604090205460ff1615610b7a5760405162461bcd60e51b815260206004820152602360248201527f504150432d473a20596f752061726520616c72656164792066726565206d696e6044820152621d195960ea1b60648201526084016106fa565b610b8533600a6117e6565b600c54610b9390600a6126e6565b600c55336000818152600f6020908152604091829020805460ff191660011790558151928352600a908301527f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885910160405180910390a1565b610a3983838361185c565b6000610c028361100c565b8210610c5b5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016106fa565b600080549080805b83811015610d05576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610cb657805192505b876001600160a01b0316836001600160a01b03161415610cf25786841415610ce45750935061080392505050565b83610cee816126fe565b9450505b5080610cfd816126fe565b915050610c63565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b60648201526084016106fa565b6008546001600160a01b03163314610d8f5760405162461bcd60e51b81526004016106fa90612660565b33806108fc476040518115909202916000818181858888f19350505050158015610dbd573d6000803e3d6000fd5b5050565b610a3983838360405180602001604052806000815250611577565b60606000610de98361100c565b905060008167ffffffffffffffff811115610e0657610e066124a0565b604051908082528060200260200182016040528015610e2f578160200160208202803683370190505b50905081610e3e579392505050565b600080549080805b83811015610f06576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610e9957805192505b886001600160a01b0316836001600160a01b03161415610ef35781868581518110610ec657610ec6612719565b602090810291909101015283610edb816126fe565b94505086841415610ef3575093979650505050505050565b5080610efe816126fe565b915050610e46565b5060405162461bcd60e51b8152602060048201526024808201527f455243373231413a20756e61626c6520746f206765742077616c6c65744f664f6044820152633bb732b960e11b60648201526084016106fa565b600080548210610fb95760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b60648201526084016106fa565b5090565b6008546001600160a01b03163314610fe75760405162461bcd60e51b81526004016106fa90612660565b8051610dbd90600b906020840190612275565b600061100582611be4565b5192915050565b60006001600160a01b0382166110785760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084016106fa565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6008546001600160a01b031633146110c75760405162461bcd60e51b81526004016106fa90612660565b600980546001600160a01b03191690556008546040516000916001600160a01b0316906000805160206128e1833981519152908390a3600880546001600160a01b0319169055565b6008546001600160a01b031633146111395760405162461bcd60e51b81526004016106fa90612660565b600d805460ff19811660ff90911615179055565b60606002805461081890612695565b6008546001600160a01b031633146111865760405162461bcd60e51b81526004016106fa90612660565b61119082826117e6565b604080516001600160a01b0384168152602081018390527f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885910160405180910390a15050565b600d5460ff1680156111ec5750633e7ad9404210155b6112385760405162461bcd60e51b815260206004820152601a60248201527f504150432d473a2073616c65206973206e6f742061637469766500000000000060448201526064016106fa565b60198111156112895760405162461bcd60e51b815260206004820152601860248201527f504150432d473a206d696e74696e6720746f6f206d616e79000000000000000060448201526064016106fa565b61138881600c5461129a91906126e6565b11156112e85760405162461bcd60e51b815260206004820152601a60248201527f504150432d473a2065786365656473206d617820737570706c7900000000000060448201526064016106fa565b346112fa662386f26fc100008361272f565b146113535760405162461bcd60e51b8152602060048201526024808201527f504150432d473a206d7573742073656e6420636f72726563742045544820616d6044820152631bdd5b9d60e21b60648201526084016106fa565b61135d33826117e6565b80600c5461136b91906126e6565b600c5560408051338152602081018390527f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885910160405180910390a150565b6001600160a01b0382163314156114035760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c657200000000000060448201526064016106fa565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6009546001600160a01b031633146114d55760405162461bcd60e51b815260206004820152602360248201527f596f7520646f6e27742068617665207065726d697373696f6e20746f20756e6c6044820152626f636b60e81b60648201526084016106fa565b600a5442116115265760405162461bcd60e51b815260206004820152601e60248201527f436f6e7472616374206973206c6f636b656420666f722061207768696c65000060448201526064016106fa565b6009546008546040516001600160a01b0392831692909116906000805160206128e183398151915290600090a3600954600880546001600160a01b0319166001600160a01b03909216919091179055565b61158284848461185c565b61158e84848484611d8e565b6115aa5760405162461bcd60e51b81526004016106fa9061274e565b50505050565b60606115bd826000541190565b6116215760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016106fa565b600061162b611e8d565b9050600081511161164b5760405180602001604052806000815250611681565b8061166061165b8561022c6126e6565b611e9c565b6040516020016116719291906127a1565b6040516020818303038152906040525b9392505050565b6008546001600160a01b031633146116b25760405162461bcd60e51b81526004016106fa90612660565b60088054600980546001600160a01b03199081166001600160a01b038416179091551690556116e181426126e6565b600a556008546040516000916001600160a01b0316906000805160206128e1833981519152908390a350565b6008546001600160a01b031633146117375760405162461bcd60e51b81526004016106fa90612660565b6001600160a01b03811661179c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106fa565b6008546040516001600160a01b038084169216906000805160206128e183398151915290600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b610dbd828260405180602001604052806000815250611f9a565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061186782611be4565b80519091506000906001600160a01b0316336001600160a01b0316148061189e5750336118938461089b565b6001600160a01b0316145b806118b0575081516118b09033610682565b90508061191a5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016106fa565b846001600160a01b031682600001516001600160a01b03161461198e5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b60648201526084016106fa565b6001600160a01b0384166119f25760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016106fa565b611a026000848460000151611800565b6001600160a01b0385166000908152600460205260408120805460019290611a349084906001600160801b03166127d0565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526004602052604081208054600194509092611a80918591166127f8565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff428116602080850191825260008981526003909152948520935184549151909216600160a01b026001600160e01b03199091169190921617179055611b088460016126e6565b6000818152600360205260409020549091506001600160a01b0316611b9a57611b32816000541190565b15611b9a5760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6040805180820190915260008082526020820152611c03826000541190565b611c625760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b60648201526084016106fa565b60007f00000000000000000000000000000000000000000000000000000000000000648310611cc357611cb57f00000000000000000000000000000000000000000000000000000000000000648461281a565b611cc09060016126e6565b90505b825b818110611d2d576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215611d1a57949350505050565b5080611d2581612831565b915050611cc5565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b60648201526084016106fa565b60006001600160a01b0384163b15611e8157604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611dd2903390899088908890600401612848565b6020604051808303816000875af1925050508015611e0d575060408051601f3d908101601f19168201909252611e0a91810190612885565b60015b611e67573d808015611e3b576040519150601f19603f3d011682016040523d82523d6000602084013e611e40565b606091505b508051611e5f5760405162461bcd60e51b81526004016106fa9061274e565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611e85565b5060015b949350505050565b6060600b805461081890612695565b606081611ec05750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611eea5780611ed4816126fe565b9150611ee39050600a836128b8565b9150611ec4565b60008167ffffffffffffffff811115611f0557611f056124a0565b6040519080825280601f01601f191660200182016040528015611f2f576020820181803683370190505b5090505b8415611e8557611f4460018361281a565b9150611f51600a866128cc565b611f5c9060306126e6565b60f81b818381518110611f7157611f71612719565b60200101906001600160f81b031916908160001a905350611f93600a866128b8565b9450611f33565b6000546001600160a01b038416611ffd5760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016106fa565b612008816000541190565b156120555760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e74656400000060448201526064016106fa565b7f00000000000000000000000000000000000000000000000000000000000000648311156120d05760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b60648201526084016106fa565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b909104169181019190915281518083019092528051909190819061212c9087906127f8565b6001600160801b0316815260200185836020015161214a91906127f8565b6001600160801b039081169091526001600160a01b0380881660008181526004602090815260408083208751978301518716600160801b0297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b8581101561226a5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461222e6000888488611d8e565b61224a5760405162461bcd60e51b81526004016106fa9061274e565b81612254816126fe565b9250508080612262906126fe565b9150506121e1565b506000819055611bdc565b82805461228190612695565b90600052602060002090601f0160209004810192826122a357600085556122e9565b82601f106122bc57805160ff19168380011785556122e9565b828001600101855582156122e9579182015b828111156122e95782518255916020019190600101906122ce565b50610fb99291505b80821115610fb957600081556001016122f1565b6001600160e01b03198116811461231b57600080fd5b50565b60006020828403121561233057600080fd5b813561168181612305565b60005b8381101561235657818101518382015260200161233e565b838111156115aa5750506000910152565b6000815180845261237f81602086016020860161233b565b601f01601f19169290920160200192915050565b6020815260006116816020830184612367565b6000602082840312156123b857600080fd5b5035919050565b80356001600160a01b03811681146123d657600080fd5b919050565b600080604083850312156123ee57600080fd5b6123f7836123bf565b946020939093013593505050565b60008060006060848603121561241a57600080fd5b612423846123bf565b9250612431602085016123bf565b9150604084013590509250925092565b60006020828403121561245357600080fd5b611681826123bf565b6020808252825182820181905260009190848201906040850190845b8181101561249457835183529284019291840191600101612478565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156124d1576124d16124a0565b604051601f8501601f19908116603f011681019082821181831017156124f9576124f96124a0565b8160405280935085815286868601111561251257600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561253e57600080fd5b813567ffffffffffffffff81111561255557600080fd5b8201601f8101841361256657600080fd5b611e85848235602084016124b6565b6000806040838503121561258857600080fd5b612591836123bf565b9150602083013580151581146125a657600080fd5b809150509250929050565b600080600080608085870312156125c757600080fd5b6125d0856123bf565b93506125de602086016123bf565b925060408501359150606085013567ffffffffffffffff81111561260157600080fd5b8501601f8101871361261257600080fd5b612621878235602084016124b6565b91505092959194509250565b6000806040838503121561264057600080fd5b612649836123bf565b9150612657602084016123bf565b90509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c908216806126a957607f821691505b602082108114156126ca57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156126f9576126f96126d0565b500190565b6000600019821415612712576127126126d0565b5060010190565b634e487b7160e01b600052603260045260246000fd5b6000816000190483118215151615612749576127496126d0565b500290565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b600083516127b381846020880161233b565b8351908301906127c781836020880161233b565b01949350505050565b60006001600160801b03838116908316818110156127f0576127f06126d0565b039392505050565b60006001600160801b038083168185168083038211156127c7576127c76126d0565b60008282101561282c5761282c6126d0565b500390565b600081612840576128406126d0565b506000190190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061287b90830184612367565b9695505050505050565b60006020828403121561289757600080fd5b815161168181612305565b634e487b7160e01b600052601260045260246000fd5b6000826128c7576128c76128a2565b500490565b6000826128db576128db6128a2565b50069056fe8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0a26469706673582212205bdf68f524c88496df46e95ed09a1c53e4e9ed458645d3a52b850a58912ea6dc64736f6c634300080c0033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000011bcae640854069270b25e877185bfa73fb5286e000000000000000000000000ecd80140dd982c3729d3958141dfd99f0c037d85000000000000000000000000fef291cdf09ccd447760708c530bb713a72a57c9000000000000000000000000c1c986b475dc8423ce01e42355e426f2bc5534420000000000000000000000006d366f344adaa242e92ad41efb355cec06a6dcd500000000000000000000000016180d8645a5ef2ebb77d02e317ac9000be16f4d0000000000000000000000009eda9317771080ec5c5da3b88b4d349103d18eec000000000000000000000000fbca803f600df1f90820a98e03e7afbdfa6b37cc000000000000000000000000c419146e71b288e5b4dcdb3c8960b50a20a7d35a000000000000000000000000b378768b38dd75a69e13336eba4fd93dda7fac490000000000000000000000004190269f4b4dcbba9d7ee384da050b617563c4c60000000000000000000000003b23ce311828f1efee8fee9edce9d85066f39c540000000000000000000000003cbe31e52972885826b01bcbd8a77859c3fa76550000000000000000000000000d6b660899b4cbf7d75f81ad8a5d3fb80f778c79000000000000000000000000f16bb84a62f4e82ca842a3d8c9ba4236f09af2060000000000000000000000001140b071d0922cb09606d23edaf355424b5bce0f000000000000000000000000357fd125e734a5f4df97e0cd909ff3ebc59c784a000000000000000000000000c793c82f1b69ad046dd7a7d15e7486c5356a93d6000000000000000000000000fc3efa70a2f60188a8caa490d9be981f111a239200000000000000000000000026dd2afc3c091bee25fcb0d03a21452803b3986700000000000000000000000004b989ba52b62cfdc7637db70309fbba1cdb6f2d000000000000000000000000e4cdbb0274b900bfdffe75a4a1c381328f1bd2c4000000000000000000000000b8fca963d699d65a10187058476986d5ef457b0a000000000000000000000000a79042d975c435b5b02196e363f4a09147230ebf00000000000000000000000099fe780697069b8ce7d3151790da849862495ba7000000000000000000000000e50eeb5a28750c47d27db7899765d7e487d623af0000000000000000000000004da054fb5eef39b2b6021458c5afb95317c9a3a1000000000000000000000000903a91a52d1c39a3d5cac5aaa53d3db2956e125a0000000000000000000000004a09ff78126fa258439fcad90394c1f1b6529ea000000000000000000000000011bcae640854069270b25e877185bfa73fb5286e0000000000000000000000009eda9317771080ec5c5da3b88b4d349103d18eec000000000000000000000000b285f929d244e74b13f2737ecff70e6e80058c1c0000000000000000000000002711831f3ebcc36541aac7ca4b0ddfac56d0e2e00000000000000000000000008d25c288883f17d4d27d89bdbc008f7925afe498000000000000000000000000cf21bab2be7487e05b4d7618e3cd7548bd0728b7000000000000000000000000c4bab062617db618bb10867c94a7fb523566c14700000000000000000000000016180d8645a5ef2ebb77d02e317ac9000be16f4d00000000000000000000000084bdd8dce2c51ae4d3a293cf227958ddacd4ef2e0000000000000000000000006d366f344adaa242e92ad41efb355cec06a6dcd5000000000000000000000000771c82dd5c6e1011adcf4372e77cf5e5587a90540000000000000000000000007b01970caf724d333ff4982dbeaf5f52d5d30b460000000000000000000000006268e630aaed2cb764a6474c998399943813a0e0000000000000000000000000ada1a2e9e818d1f760eddc49878e0b4085c31a6300000000000000000000000016180d8645a5ef2ebb77d02e317ac9000be16f4d0000000000000000000000004da054fb5eef39b2b6021458c5afb95317c9a3a1000000000000000000000000131638b5577ab6296971a9f1b252e6fc5ddf12c30000000000000000000000001dd069d70b9d359b047ec53986a9f602b35165d6000000000000000000000000dc1d1a5682e5331f94a99f0bcab3b6414701b356000000000000000000000000eca4521e70df66b468525f2d902d7ee1967d60c40000000000000000000000003a1be905c46bd35a9d7dc1ada56e8141ab607e2e000000000000000000000000cf21bab2be7487e05b4d7618e3cd7548bd0728b70000000000000000000000008d0ca99dd5bf7b133f7bba74676fb33a03867f9a00000000000000000000000084bdd8dce2c51ae4d3a293cf227958ddacd4ef2e00000000000000000000000069d7959a5b1d0a80fe6cc7065b492dc9dfbe8025000000000000000000000000ac52bf6c83b218f51414ae6d82562075c866139c0000000000000000000000004a09ff78126fa258439fcad90394c1f1b6529ea000000000000000000000000026dd2afc3c091bee25fcb0d03a21452803b39867000000000000000000000000903a91a52d1c39a3d5cac5aaa53d3db2956e125a000000000000000000000000cbcbb480d7151551035442cbe7ac85d2f69f672b0000000000000000000000008906939e9f401299ee218ac7c3035be564655a2d000000000000000000000000b3aae6397e24961c0440b107ccdf947863cfebff000000000000000000000000cc5b724be4e2bf02e6fd15d55f5d1453594eb692000000000000000000000000a9faa3933b1f7e1ad0a416f02dae9481ec9ac8c9000000000000000000000000a84691dafaee5084531386a969013fac9964c7ad000000000000000000000000771c82dd5c6e1011adcf4372e77cf5e5587a905400000000000000000000000077a40fde3ee2bb9e30d4466fce58ae8f6ef8aff700000000000000000000000075671888fd4090fbe05bd130ab8999e72e21b7c0000000000000000000000000fcdc51b7478ac150e5d426344ad16433b2a5755e00000000000000000000000047e4c0bcfa9c5ed7f281542226e3d1a91b1b2c85000000000000000000000000cd75b8ef4e07cc786844fca2ad1316c4c5b0890c00000000000000000000000054b1c409f41c885f5165eef76aa508b684540d81000000000000000000000000055177792e162d146dba34a92b501107c10a2fc100000000000000000000000086aec8737e5420385a2e2043ebb113fc3f215765000000000000000000000000151482ba55fd7cf1ece5540636c495f9492a0123000000000000000000000000d78337c89fe34debea3b8571f00cc1914849d7f500000000000000000000000075671888fd4090fbe05bd130ab8999e72e21b7c0000000000000000000000000c1d4a4ef157940e2c655aaed5682faeeabfe0d0e0000000000000000000000006d366f344adaa242e92ad41efb355cec06a6dcd5000000000000000000000000a9faa3933b1f7e1ad0a416f02dae9481ec9ac8c900000000000000000000000016180d8645a5ef2ebb77d02e317ac9000be16f4d000000000000000000000000f408bee3443d0397e2c1cde588fb060ac657006f000000000000000000000000c4bab062617db618bb10867c94a7fb523566c1470000000000000000000000001fadf251f0bc8e3da83ead9f1d4d9c7e24ba0f380000000000000000000000004de1705f53f2ac799ff5acf4e642afdbca72eb62000000000000000000000000bddb00d82aee89b522e3d176cc692878f265ee970000000000000000000000003b23ce311828f1efee8fee9edce9d85066f39c54000000000000000000000000ed8f2e1ffd40b3f7edd26af367fa40108ffa9b400000000000000000000000008d25c288883f17d4d27d89bdbc008f7925afe49800000000000000000000000038e5e3cf26198fa534cad474311b1a118a75f84f0000000000000000000000003cbe31e52972885826b01bcbd8a77859c3fa7655000000000000000000000000fbca803f600df1f90820a98e03e7afbdfa6b37cc00000000000000000000000099fe780697069b8ce7d3151790da849862495ba7

-----Decoded View---------------
Arg [0] : holderForFreeMint (address[]): 0x11bcAE640854069270b25E877185BFA73Fb5286e,0xecD80140DD982c3729D3958141dfd99f0c037D85,0xfeF291cDF09Ccd447760708C530bB713a72a57C9,0xC1C986B475DC8423CE01E42355e426f2bc553442,0x6d366F344adAa242E92aD41Efb355cEC06A6dcd5,0x16180d8645A5Ef2eBB77d02e317ac9000BE16f4D,0x9eDA9317771080eC5c5Da3b88b4D349103D18EEc,0xFbCA803F600DF1F90820a98E03E7aFBDFA6b37Cc,0xc419146E71B288E5B4DcDB3c8960b50a20A7d35A,0xB378768b38dd75A69E13336eBA4FD93Dda7fac49,0x4190269f4B4dcBBa9d7ee384Da050B617563c4C6,0x3b23cE311828F1eFeE8fee9EDcE9d85066f39c54,0x3cBE31e52972885826b01BcBD8a77859c3fA7655,0x0D6b660899B4cBF7d75f81ad8a5D3FB80f778C79,0xf16Bb84a62f4E82ca842a3D8C9Ba4236F09af206,0x1140b071D0922Cb09606D23Edaf355424B5bCe0F,0x357fD125E734A5F4df97E0cd909FF3EBC59C784A,0xc793C82f1B69aD046DD7a7D15e7486c5356a93d6,0xFC3EfA70a2F60188a8caA490D9be981f111a2392,0x26DD2aFc3C091bEe25fCb0d03a21452803B39867,0x04b989ba52b62CFDC7637db70309fBBA1cDb6f2D,0xe4cdBb0274B900bFDFFE75A4a1c381328f1bD2c4,0xb8fca963D699D65A10187058476986D5ef457B0A,0xA79042D975C435b5B02196e363F4A09147230ebf,0x99FE780697069b8CE7d3151790da849862495BA7,0xE50eeb5a28750c47D27DB7899765D7E487d623aF,0x4da054fb5EEf39b2B6021458C5AFb95317C9A3a1,0x903A91A52d1C39A3d5Cac5AaA53D3db2956e125a,0x4a09FF78126fa258439FCAd90394C1f1b6529ea0,0x11bcAE640854069270b25E877185BFA73Fb5286e,0x9eDA9317771080eC5c5Da3b88b4D349103D18EEc,0xB285F929d244e74B13F2737EcFF70E6e80058C1C,0x2711831f3EbCc36541aAc7cA4B0dDfaC56D0E2e0,0x8d25c288883f17d4d27d89bdbC008f7925AFe498,0xcF21BAb2BE7487e05B4d7618E3cd7548bd0728b7,0xC4baB062617Db618Bb10867C94a7fb523566c147,0x16180d8645A5Ef2eBB77d02e317ac9000BE16f4D,0x84bdd8dCE2C51Ae4D3a293cf227958dDAcD4EF2E,0x6d366F344adAa242E92aD41Efb355cEC06A6dcd5,0x771c82DD5c6e1011adcF4372E77cf5E5587A9054,0x7B01970CaF724d333Ff4982DBeAF5f52d5D30B46,0x6268e630Aaed2Cb764a6474c998399943813A0e0,0xAda1A2e9e818D1F760eddc49878e0b4085c31a63,0x16180d8645A5Ef2eBB77d02e317ac9000BE16f4D,0x4da054fb5EEf39b2B6021458C5AFb95317C9A3a1,0x131638b5577ab6296971A9f1B252E6fc5dDf12c3,0x1dD069D70B9d359B047Ec53986a9F602b35165d6,0xDc1D1A5682E5331f94A99F0bCab3b6414701B356,0xeca4521e70df66B468525F2D902d7EE1967d60c4,0x3A1BE905c46bD35a9d7dC1aDa56E8141Ab607E2E,0xcF21BAb2BE7487e05B4d7618E3cd7548bd0728b7,0x8D0ca99dd5Bf7B133F7bbA74676fB33A03867f9A,0x84bdd8dCE2C51Ae4D3a293cf227958dDAcD4EF2E,0x69d7959A5b1D0A80FE6Cc7065b492dc9Dfbe8025,0xAC52BF6c83b218f51414AE6D82562075C866139C,0x4a09FF78126fa258439FCAd90394C1f1b6529ea0,0x26DD2aFc3C091bEe25fCb0d03a21452803B39867,0x903A91A52d1C39A3d5Cac5AaA53D3db2956e125a,0xCBCbB480D7151551035442CbE7AC85d2f69f672b,0x8906939E9F401299EE218ac7c3035BE564655a2d,0xB3AaE6397e24961C0440b107CCDf947863CFebff,0xcc5B724bE4e2bF02E6FD15d55F5d1453594eb692,0xA9fAa3933B1f7e1aD0A416F02dAE9481EC9ac8c9,0xa84691DaFaEe5084531386A969013FaC9964C7ad,0x771c82DD5c6e1011adcF4372E77cf5E5587A9054,0x77a40fDE3ee2BB9E30D4466FCE58aE8F6EF8aff7,0x75671888fD4090FbE05bD130aB8999E72e21B7c0,0xFcdc51b7478ac150e5D426344Ad16433b2A5755e,0x47e4C0BcFa9c5Ed7f281542226E3D1a91b1B2c85,0xcD75B8ef4E07cc786844Fca2Ad1316C4c5B0890c,0x54b1C409F41C885F5165Eef76aA508B684540D81,0x055177792E162D146dBa34a92b501107C10A2Fc1,0x86AeC8737e5420385a2E2043EbB113Fc3f215765,0x151482bA55Fd7CF1EcE5540636C495f9492a0123,0xD78337C89FE34debEa3B8571F00CC1914849D7F5,0x75671888fD4090FbE05bD130aB8999E72e21B7c0,0xC1d4A4EF157940E2c655aAed5682faeEabFe0D0e,0x6d366F344adAa242E92aD41Efb355cEC06A6dcd5,0xA9fAa3933B1f7e1aD0A416F02dAE9481EC9ac8c9,0x16180d8645A5Ef2eBB77d02e317ac9000BE16f4D,0xf408Bee3443D0397e2c1cdE588Fb060AC657006F,0xC4baB062617Db618Bb10867C94a7fb523566c147,0x1fadF251F0BC8E3da83EAD9F1D4D9C7E24Ba0f38,0x4DE1705F53F2ac799ff5AcF4E642AfDbCa72Eb62,0xbddB00D82aee89B522e3D176cc692878F265EE97,0x3b23cE311828F1eFeE8fee9EDcE9d85066f39c54,0xED8F2E1FFD40B3F7eDd26AF367fa40108FFA9b40,0x8d25c288883f17d4d27d89bdbC008f7925AFe498,0x38E5E3Cf26198fA534cAd474311B1a118A75F84f,0x3cBE31e52972885826b01BcBD8a77859c3fA7655,0xFbCA803F600DF1F90820a98E03E7aFBDFA6b37Cc,0x99FE780697069b8CE7d3151790da849862495BA7

-----Encoded View---------------
94 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 000000000000000000000000000000000000000000000000000000000000005c
Arg [2] : 00000000000000000000000011bcae640854069270b25e877185bfa73fb5286e
Arg [3] : 000000000000000000000000ecd80140dd982c3729d3958141dfd99f0c037d85
Arg [4] : 000000000000000000000000fef291cdf09ccd447760708c530bb713a72a57c9
Arg [5] : 000000000000000000000000c1c986b475dc8423ce01e42355e426f2bc553442
Arg [6] : 0000000000000000000000006d366f344adaa242e92ad41efb355cec06a6dcd5
Arg [7] : 00000000000000000000000016180d8645a5ef2ebb77d02e317ac9000be16f4d
Arg [8] : 0000000000000000000000009eda9317771080ec5c5da3b88b4d349103d18eec
Arg [9] : 000000000000000000000000fbca803f600df1f90820a98e03e7afbdfa6b37cc
Arg [10] : 000000000000000000000000c419146e71b288e5b4dcdb3c8960b50a20a7d35a
Arg [11] : 000000000000000000000000b378768b38dd75a69e13336eba4fd93dda7fac49
Arg [12] : 0000000000000000000000004190269f4b4dcbba9d7ee384da050b617563c4c6
Arg [13] : 0000000000000000000000003b23ce311828f1efee8fee9edce9d85066f39c54
Arg [14] : 0000000000000000000000003cbe31e52972885826b01bcbd8a77859c3fa7655
Arg [15] : 0000000000000000000000000d6b660899b4cbf7d75f81ad8a5d3fb80f778c79
Arg [16] : 000000000000000000000000f16bb84a62f4e82ca842a3d8c9ba4236f09af206
Arg [17] : 0000000000000000000000001140b071d0922cb09606d23edaf355424b5bce0f
Arg [18] : 000000000000000000000000357fd125e734a5f4df97e0cd909ff3ebc59c784a
Arg [19] : 000000000000000000000000c793c82f1b69ad046dd7a7d15e7486c5356a93d6
Arg [20] : 000000000000000000000000fc3efa70a2f60188a8caa490d9be981f111a2392
Arg [21] : 00000000000000000000000026dd2afc3c091bee25fcb0d03a21452803b39867
Arg [22] : 00000000000000000000000004b989ba52b62cfdc7637db70309fbba1cdb6f2d
Arg [23] : 000000000000000000000000e4cdbb0274b900bfdffe75a4a1c381328f1bd2c4
Arg [24] : 000000000000000000000000b8fca963d699d65a10187058476986d5ef457b0a
Arg [25] : 000000000000000000000000a79042d975c435b5b02196e363f4a09147230ebf
Arg [26] : 00000000000000000000000099fe780697069b8ce7d3151790da849862495ba7
Arg [27] : 000000000000000000000000e50eeb5a28750c47d27db7899765d7e487d623af
Arg [28] : 0000000000000000000000004da054fb5eef39b2b6021458c5afb95317c9a3a1
Arg [29] : 000000000000000000000000903a91a52d1c39a3d5cac5aaa53d3db2956e125a
Arg [30] : 0000000000000000000000004a09ff78126fa258439fcad90394c1f1b6529ea0
Arg [31] : 00000000000000000000000011bcae640854069270b25e877185bfa73fb5286e
Arg [32] : 0000000000000000000000009eda9317771080ec5c5da3b88b4d349103d18eec
Arg [33] : 000000000000000000000000b285f929d244e74b13f2737ecff70e6e80058c1c
Arg [34] : 0000000000000000000000002711831f3ebcc36541aac7ca4b0ddfac56d0e2e0
Arg [35] : 0000000000000000000000008d25c288883f17d4d27d89bdbc008f7925afe498
Arg [36] : 000000000000000000000000cf21bab2be7487e05b4d7618e3cd7548bd0728b7
Arg [37] : 000000000000000000000000c4bab062617db618bb10867c94a7fb523566c147
Arg [38] : 00000000000000000000000016180d8645a5ef2ebb77d02e317ac9000be16f4d
Arg [39] : 00000000000000000000000084bdd8dce2c51ae4d3a293cf227958ddacd4ef2e
Arg [40] : 0000000000000000000000006d366f344adaa242e92ad41efb355cec06a6dcd5
Arg [41] : 000000000000000000000000771c82dd5c6e1011adcf4372e77cf5e5587a9054
Arg [42] : 0000000000000000000000007b01970caf724d333ff4982dbeaf5f52d5d30b46
Arg [43] : 0000000000000000000000006268e630aaed2cb764a6474c998399943813a0e0
Arg [44] : 000000000000000000000000ada1a2e9e818d1f760eddc49878e0b4085c31a63
Arg [45] : 00000000000000000000000016180d8645a5ef2ebb77d02e317ac9000be16f4d
Arg [46] : 0000000000000000000000004da054fb5eef39b2b6021458c5afb95317c9a3a1
Arg [47] : 000000000000000000000000131638b5577ab6296971a9f1b252e6fc5ddf12c3
Arg [48] : 0000000000000000000000001dd069d70b9d359b047ec53986a9f602b35165d6
Arg [49] : 000000000000000000000000dc1d1a5682e5331f94a99f0bcab3b6414701b356
Arg [50] : 000000000000000000000000eca4521e70df66b468525f2d902d7ee1967d60c4
Arg [51] : 0000000000000000000000003a1be905c46bd35a9d7dc1ada56e8141ab607e2e
Arg [52] : 000000000000000000000000cf21bab2be7487e05b4d7618e3cd7548bd0728b7
Arg [53] : 0000000000000000000000008d0ca99dd5bf7b133f7bba74676fb33a03867f9a
Arg [54] : 00000000000000000000000084bdd8dce2c51ae4d3a293cf227958ddacd4ef2e
Arg [55] : 00000000000000000000000069d7959a5b1d0a80fe6cc7065b492dc9dfbe8025
Arg [56] : 000000000000000000000000ac52bf6c83b218f51414ae6d82562075c866139c
Arg [57] : 0000000000000000000000004a09ff78126fa258439fcad90394c1f1b6529ea0
Arg [58] : 00000000000000000000000026dd2afc3c091bee25fcb0d03a21452803b39867
Arg [59] : 000000000000000000000000903a91a52d1c39a3d5cac5aaa53d3db2956e125a
Arg [60] : 000000000000000000000000cbcbb480d7151551035442cbe7ac85d2f69f672b
Arg [61] : 0000000000000000000000008906939e9f401299ee218ac7c3035be564655a2d
Arg [62] : 000000000000000000000000b3aae6397e24961c0440b107ccdf947863cfebff
Arg [63] : 000000000000000000000000cc5b724be4e2bf02e6fd15d55f5d1453594eb692
Arg [64] : 000000000000000000000000a9faa3933b1f7e1ad0a416f02dae9481ec9ac8c9
Arg [65] : 000000000000000000000000a84691dafaee5084531386a969013fac9964c7ad
Arg [66] : 000000000000000000000000771c82dd5c6e1011adcf4372e77cf5e5587a9054
Arg [67] : 00000000000000000000000077a40fde3ee2bb9e30d4466fce58ae8f6ef8aff7
Arg [68] : 00000000000000000000000075671888fd4090fbe05bd130ab8999e72e21b7c0
Arg [69] : 000000000000000000000000fcdc51b7478ac150e5d426344ad16433b2a5755e
Arg [70] : 00000000000000000000000047e4c0bcfa9c5ed7f281542226e3d1a91b1b2c85
Arg [71] : 000000000000000000000000cd75b8ef4e07cc786844fca2ad1316c4c5b0890c
Arg [72] : 00000000000000000000000054b1c409f41c885f5165eef76aa508b684540d81
Arg [73] : 000000000000000000000000055177792e162d146dba34a92b501107c10a2fc1
Arg [74] : 00000000000000000000000086aec8737e5420385a2e2043ebb113fc3f215765
Arg [75] : 000000000000000000000000151482ba55fd7cf1ece5540636c495f9492a0123
Arg [76] : 000000000000000000000000d78337c89fe34debea3b8571f00cc1914849d7f5
Arg [77] : 00000000000000000000000075671888fd4090fbe05bd130ab8999e72e21b7c0
Arg [78] : 000000000000000000000000c1d4a4ef157940e2c655aaed5682faeeabfe0d0e
Arg [79] : 0000000000000000000000006d366f344adaa242e92ad41efb355cec06a6dcd5
Arg [80] : 000000000000000000000000a9faa3933b1f7e1ad0a416f02dae9481ec9ac8c9
Arg [81] : 00000000000000000000000016180d8645a5ef2ebb77d02e317ac9000be16f4d
Arg [82] : 000000000000000000000000f408bee3443d0397e2c1cde588fb060ac657006f
Arg [83] : 000000000000000000000000c4bab062617db618bb10867c94a7fb523566c147
Arg [84] : 0000000000000000000000001fadf251f0bc8e3da83ead9f1d4d9c7e24ba0f38
Arg [85] : 0000000000000000000000004de1705f53f2ac799ff5acf4e642afdbca72eb62
Arg [86] : 000000000000000000000000bddb00d82aee89b522e3d176cc692878f265ee97
Arg [87] : 0000000000000000000000003b23ce311828f1efee8fee9edce9d85066f39c54
Arg [88] : 000000000000000000000000ed8f2e1ffd40b3f7edd26af367fa40108ffa9b40
Arg [89] : 0000000000000000000000008d25c288883f17d4d27d89bdbc008f7925afe498
Arg [90] : 00000000000000000000000038e5e3cf26198fa534cad474311b1a118a75f84f
Arg [91] : 0000000000000000000000003cbe31e52972885826b01bcbd8a77859c3fa7655
Arg [92] : 000000000000000000000000fbca803f600df1f90820a98e03e7afbdfa6b37cc
Arg [93] : 00000000000000000000000099fe780697069b8ce7d3151790da849862495ba7


Deployed Bytecode Sourcemap

66254:3196:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67518:225;;;;;;;;;;;;;:::i;:::-;;53980:370;;;;;;;;;;-1:-1:-1;53980:370:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;53980:370:0;;;;;;;;55706:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;57265:204::-;;;;;;;;;;-1:-1:-1;57265:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;57265:204:0;1528:203:1;56828:379:0;;;;;;;;;;-1:-1:-1;56828:379:0;;;;;:::i;:::-;;:::i;67928:510::-;;;;;;;;;;;;;:::i;66450:47::-;;;;;;;;;;;;66487:10;66450:47;;;;;2319:25:1;;;2307:2;2292:18;66450:47:0;2173:177:1;67275:95:0;;;;;;;;;;-1:-1:-1;67341:21:0;67275:95;;51707:94;;;;;;;;;;-1:-1:-1;51760:7:0;51783:12;51707:94;;66635:47;;;;;;;;;;;;66672:10;66635:47;;58115:150;;;;;;;;;;-1:-1:-1;58115:150:0;;;;;:::i;:::-;;:::i;52335:744::-;;;;;;;;;;-1:-1:-1;52335:744:0;;;;;:::i;:::-;;:::i;66402:41::-;;;;;;;;;;;;66439:4;66402:41;;68446:136;;;;;;;;;;-1:-1:-1;68446:136:0;;;;;:::i;:::-;-1:-1:-1;;;;;68542:32:0;68518:4;68542:32;;;:24;:32;;;;;;;;;68446:136;67378:131;;;;;;;;;;;;;:::i;58328:165::-;;;;;;;;;;-1:-1:-1;58328:165:0;;;;;:::i;:::-;;:::i;53085:831::-;;;;;;;;;;-1:-1:-1;53085:831:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;66543:36::-;;;;;;;;;;-1:-1:-1;66543:36:0;;;;;;;;51870:177;;;;;;;;;;-1:-1:-1;51870:177:0;;;;;:::i;:::-;;:::i;69128:97::-;;;;;;;;;;-1:-1:-1;69128:97:0;;;;;:::i;:::-;;:::i;66586:40::-;;;;;;;;;;-1:-1:-1;66586:40:0;;;;;;;;;;;55529:118;;;;;;;;;;-1:-1:-1;55529:118:0;;;;;:::i;:::-;;:::i;54406:211::-;;;;;;;;;;-1:-1:-1;54406:211:0;;;;;:::i;:::-;;:::i;2089:186::-;;;;;;;;;;;;;:::i;69350:97::-;;;;;;;;;;;;;:::i;1875:79::-;;;;;;;;;;-1:-1:-1;1940:6:0;;-1:-1:-1;;;;;1940:6:0;1875:79;;55861:98;;;;;;;;;;;;;:::i;67751:169::-;;;;;;;;;;-1:-1:-1;67751:169:0;;;;;:::i;:::-;;:::i;68590:530::-;;;;;;:::i;:::-;;:::i;57533:274::-;;;;;;;;;;-1:-1:-1;57533:274:0;;;;;:::i;:::-;;:::i;2870:304::-;;;;;;;;;;;;;:::i;2539:89::-;;;;;;;;;;-1:-1:-1;2611:9:0;;2539:89;;58556:319;;;;;;;;;;-1:-1:-1;58556:319:0;;;;;:::i;:::-;;:::i;56022:428::-;;;;;;;;;;-1:-1:-1;56022:428:0;;;;;:::i;:::-;;:::i;62895:43::-;;;;;;;;;;;;;;;;2636:226;;;;;;;;;;-1:-1:-1;2636:226:0;;;;;:::i;:::-;;:::i;57870:186::-;;;;;;;;;;-1:-1:-1;57870:186:0;;;;;:::i;:::-;-1:-1:-1;;;;;58015:25:0;;;57992:4;58015:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;57870:186;2283:244;;;;;;;;;;-1:-1:-1;2283:244:0;;;;;:::i;:::-;;:::i;67518:225::-;2002:6;;-1:-1:-1;;;;;2002:6:0;740:10;2002:22;1994:67;;;;-1:-1:-1;;;1994:67:0;;;;;;;:::i;:::-;;;;;;;;;67578:20:::1;::::0;::::1;::::0;::::1;;;:29;67570:84;;;::::0;-1:-1:-1;;;67570:84:0;;6593:2:1;67570:84:0::1;::::0;::::1;6575:21:1::0;6632:2;6612:18;;;6605:30;6671:34;6651:18;;;6644:62;-1:-1:-1;;;6722:18:1;;;6715:40;6772:19;;67570:84:0::1;6391:406:1::0;67570:84:0::1;67675:14;::::0;67665:30:::1;::::0;67675:14;;::::1;-1:-1:-1::0;;;;;67675:14:0::1;67691:3;67665:9;:30::i;:::-;67708:20;:27:::0;;-1:-1:-1;;67708:27:0::1;;;::::0;;67518:225::o;53980:370::-;54107:4;-1:-1:-1;;;;;;54137:40:0;;-1:-1:-1;;;54137:40:0;;:99;;-1:-1:-1;;;;;;;54188:48:0;;-1:-1:-1;;;54188:48:0;54137:99;:160;;;-1:-1:-1;;;;;;;54247:50:0;;-1:-1:-1;;;54247:50:0;54137:160;:207;;;-1:-1:-1;;;;;;;;;;21429:40:0;;;54308:36;54123:221;53980:370;-1:-1:-1;;53980:370:0:o;55706:94::-;55760:13;55789:5;55782:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55706:94;:::o;57265:204::-;57333:7;57357:16;57365:7;59171:4;59201:12;-1:-1:-1;59191:22:0;59114:105;57357:16;57349:74;;;;-1:-1:-1;;;57349:74:0;;7389:2:1;57349:74:0;;;7371:21:1;7428:2;7408:18;;;7401:30;7467:34;7447:18;;;7440:62;-1:-1:-1;;;7518:18:1;;;7511:43;7571:19;;57349:74:0;7187:409:1;57349:74:0;-1:-1:-1;57439:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;57439:24:0;;57265:204::o;56828:379::-;56897:13;56913:24;56929:7;56913:15;:24::i;:::-;56897:40;;56958:5;-1:-1:-1;;;;;56952:11:0;:2;-1:-1:-1;;;;;56952:11:0;;;56944:58;;;;-1:-1:-1;;;56944:58:0;;7803:2:1;56944:58:0;;;7785:21:1;7842:2;7822:18;;;7815:30;7881:34;7861:18;;;7854:62;-1:-1:-1;;;7932:18:1;;;7925:32;7974:19;;56944:58:0;7601:398:1;56944:58:0;740:10;-1:-1:-1;;;;;57027:21:0;;;;:62;;-1:-1:-1;57052:37:0;57069:5;740:10;57870:186;:::i;57052:37::-;57011:153;;;;-1:-1:-1;;;57011:153:0;;8206:2:1;57011:153:0;;;8188:21:1;8245:2;8225:18;;;8218:30;8284:34;8264:18;;;8257:62;8355:27;8335:18;;;8328:55;8400:19;;57011:153:0;8004:421:1;57011:153:0;57173:28;57182:2;57186:7;57195:5;57173:8;:28::i;:::-;56890:317;56828:379;;:::o;67928:510::-;67978:16;;;;:49;;;;;66672:10;67998:15;:29;;67978:49;67970:95;;;;-1:-1:-1;;;67970:95:0;;8632:2:1;67970:95:0;;;8614:21:1;8671:2;8651:18;;;8644:30;8710:34;8690:18;;;8683:62;-1:-1:-1;;;8761:18:1;;;8754:31;8802:19;;67970:95:0;8430:397:1;67970:95:0;68105:10;68084:32;;;;:20;:32;;;;;;;;:40;;:32;:40;68076:81;;;;-1:-1:-1;;;68076:81:0;;9034:2:1;68076:81:0;;;9016:21:1;9073:2;9053:18;;;9046:30;9112;9092:18;;;9085:58;9160:18;;68076:81:0;8832:352:1;68076:81:0;68201:10;68176:36;;;;:24;:36;;;;;;;;:45;68168:93;;;;-1:-1:-1;;;68168:93:0;;9391:2:1;68168:93:0;;;9373:21:1;9430:2;9410:18;;;9403:30;9469:34;9449:18;;;9442:62;-1:-1:-1;;;9520:18:1;;;9513:33;9563:19;;68168:93:0;9189:399:1;68168:93:0;68274:25;68284:10;68296:2;68274:9;:25::i;:::-;68323:10;;:15;;68336:2;68323:15;:::i;:::-;68310:10;:28;68374:10;68349:36;;;;:24;:36;;;;;;;;;:43;;-1:-1:-1;;68349:43:0;68388:4;68349:43;;;68410:20;;10041:51:1;;;68427:2:0;10108:18:1;;;10101:34;68410:20:0;;10014:18:1;68410:20:0;;;;;;;67928:510::o;58115:150::-;58231:28;58241:4;58247:2;58251:7;58231:9;:28::i;52335:744::-;52444:7;52479:16;52489:5;52479:9;:16::i;:::-;52471:5;:24;52463:71;;;;-1:-1:-1;;;52463:71:0;;10348:2:1;52463:71:0;;;10330:21:1;10387:2;10367:18;;;10360:30;10426:34;10406:18;;;10399:62;-1:-1:-1;;;10477:18:1;;;10470:32;10519:19;;52463:71:0;10146:398:1;52463:71:0;52541:22;51783:12;;;52541:22;;52661:350;52685:14;52681:1;:18;52661:350;;;52715:31;52749:14;;;:11;:14;;;;;;;;;52715:48;;;;;;;;;-1:-1:-1;;;;;52715:48:0;;;;;-1:-1:-1;;;52715:48:0;;;;;;;;;;;;52776:28;52772:89;;52837:14;;;-1:-1:-1;52772:89:0;52894:5;-1:-1:-1;;;;;52873:26:0;:17;-1:-1:-1;;;;;52873:26:0;;52869:135;;;52931:5;52916:11;:20;52912:59;;;-1:-1:-1;52958:1:0;-1:-1:-1;52951:8:0;;-1:-1:-1;;;52951:8:0;52912:59;52981:13;;;;:::i;:::-;;;;52869:135;-1:-1:-1;52701:3:0;;;;:::i;:::-;;;;52661:350;;;-1:-1:-1;53017:56:0;;-1:-1:-1;;;53017:56:0;;10891:2:1;53017:56:0;;;10873:21:1;10930:2;10910:18;;;10903:30;10969:34;10949:18;;;10942:62;-1:-1:-1;;;11020:18:1;;;11013:44;11074:19;;53017:56:0;10689:410:1;67378:131:0;2002:6;;-1:-1:-1;;;;;2002:6:0;740:10;2002:22;1994:67;;;;-1:-1:-1;;;1994:67:0;;;;;;;:::i;:::-;67454:10:::1;::::0;67476:25:::1;67341:21:::0;67476:25:::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;67414:95;67378:131::o:0;58328:165::-;58448:39;58465:4;58471:2;58475:7;58448:39;;;;;;;;;;;;:16;:39::i;53085:831::-;53143:16;53168:18;53189:16;53199:5;53189:9;:16::i;:::-;53168:37;;53214:25;53256:10;53242:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53242:25:0;-1:-1:-1;53214:53:0;-1:-1:-1;53278:15:0;53274:58;;53316:8;53085:831;-1:-1:-1;;;53085:831:0:o;53274:58::-;53340:22;51783:12;;;53340:22;;53460:398;53484:14;53480:1;:18;53460:398;;;53514:31;53548:14;;;:11;:14;;;;;;;;;53514:48;;;;;;;;;-1:-1:-1;;;;;53514:48:0;;;;;-1:-1:-1;;;53514:48:0;;;;;;;;;;;;53575:28;53571:89;;53636:14;;;-1:-1:-1;53571:89:0;53693:5;-1:-1:-1;;;;;53672:26:0;:17;-1:-1:-1;;;;;53672:26:0;;53668:183;;;53735:1;53711:8;53720:11;53711:21;;;;;;;;:::i;:::-;;;;;;;;;;:25;53747:13;;;;:::i;:::-;;;;53790:10;53775:11;:25;53771:71;;;-1:-1:-1;53822:8:0;;53085:831;-1:-1:-1;;;;;;;53085:831:0:o;53771:71::-;-1:-1:-1;53500:3:0;;;;:::i;:::-;;;;53460:398;;;-1:-1:-1;53864:46:0;;-1:-1:-1;;;53864:46:0;;11438:2:1;53864:46:0;;;11420:21:1;11477:2;11457:18;;;11450:30;11516:34;11496:18;;;11489:62;-1:-1:-1;;;11567:18:1;;;11560:34;11611:19;;53864:46:0;11236:400:1;51870:177:0;51937:7;51783:12;;51961:5;:21;51953:69;;;;-1:-1:-1;;;51953:69:0;;11843:2:1;51953:69:0;;;11825:21:1;11882:2;11862:18;;;11855:30;11921:34;11901:18;;;11894:62;-1:-1:-1;;;11972:18:1;;;11965:33;12015:19;;51953:69:0;11641:399:1;51953:69:0;-1:-1:-1;52036:5:0;51870:177::o;69128:97::-;2002:6;;-1:-1:-1;;;;;2002:6:0;740:10;2002:22;1994:67;;;;-1:-1:-1;;;1994:67:0;;;;;;;:::i;:::-;69199:18;;::::1;::::0;:8:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;55529:118::-:0;55593:7;55616:20;55628:7;55616:11;:20::i;:::-;:25;;55529:118;-1:-1:-1;;55529:118:0:o;54406:211::-;54470:7;-1:-1:-1;;;;;54494:19:0;;54486:75;;;;-1:-1:-1;;;54486:75:0;;12247:2:1;54486:75:0;;;12229:21:1;12286:2;12266:18;;;12259:30;12325:34;12305:18;;;12298:62;-1:-1:-1;;;12376:18:1;;;12369:41;12427:19;;54486:75:0;12045:407:1;54486:75:0;-1:-1:-1;;;;;;54583:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;54583:27:0;;54406:211::o;2089:186::-;2002:6;;-1:-1:-1;;;;;2002:6:0;740:10;2002:22;1994:67;;;;-1:-1:-1;;;1994:67:0;;;;;;;:::i;:::-;2154:14:::1;:27:::0;;-1:-1:-1;;;;;;2154:27:0::1;::::0;;2218:6:::1;::::0;2197:40:::1;::::0;2179:1:::1;::::0;-1:-1:-1;;;;;2218:6:0::1;::::0;-1:-1:-1;;;;;;;;;;;2197:40:0;2179:1;;2197:40:::1;2248:6;:19:::0;;-1:-1:-1;;;;;;2248:19:0::1;::::0;;2089:186::o;69350:97::-;2002:6;;-1:-1:-1;;;;;2002:6:0;740:10;2002:22;1994:67;;;;-1:-1:-1;;;1994:67:0;;;;;;;:::i;:::-;69423:16:::1;::::0;;-1:-1:-1;;69403:36:0;::::1;69423:16;::::0;;::::1;69422:17;69403:36;::::0;;69350:97::o;55861:98::-;55917:13;55946:7;55939:14;;;;;:::i;67751:169::-;2002:6;;-1:-1:-1;;;;;2002:6:0;740:10;2002:22;1994:67;;;;-1:-1:-1;;;1994:67:0;;;;;;;:::i;:::-;67833:29:::1;67843:8;67853;67833:9;:29::i;:::-;67888:24;::::0;;-1:-1:-1;;;;;10059:32:1;;10041:51;;10123:2;10108:18;;10101:34;;;67888:24:0::1;::::0;10014:18:1;67888:24:0::1;;;;;;;67751:169:::0;;:::o;68590:530::-;68658:16;;;;:49;;;;;66672:10;68678:15;:29;;68658:49;68650:88;;;;-1:-1:-1;;;68650:88:0;;12938:2:1;68650:88:0;;;12920:21:1;12977:2;12957:18;;;12950:30;13016:28;12996:18;;;12989:56;13062:18;;68650:88:0;12736:350:1;68650:88:0;68769:2;68757:8;:14;;68749:51;;;;-1:-1:-1;;;68749:51:0;;13293:2:1;68749:51:0;;;13275:21:1;13332:2;13312:18;;;13305:30;13371:26;13351:18;;;13344:54;13415:18;;68749:51:0;13091:348:1;68749:51:0;66439:4;68832:8;68819:10;;:21;;;;:::i;:::-;:35;;68811:74;;;;-1:-1:-1;;;68811:74:0;;13646:2:1;68811:74:0;;;13628:21:1;13685:2;13665:18;;;13658:30;13724:28;13704:18;;;13697:56;13770:18;;68811:74:0;13444:350:1;68811:74:0;68929:9;68904:21;66487:10;68904:8;:21;:::i;:::-;:34;68896:83;;;;-1:-1:-1;;;68896:83:0;;14174:2:1;68896:83:0;;;14156:21:1;14213:2;14193:18;;;14186:30;14252:34;14232:18;;;14225:62;-1:-1:-1;;;14303:18:1;;;14296:34;14347:19;;68896:83:0;13972:400:1;68896:83:0;68992:31;69002:10;69014:8;68992:9;:31::i;:::-;69060:8;69047:10;;:21;;;;:::i;:::-;69034:10;:34;69086:26;;;69091:10;10041:51:1;;10123:2;10108:18;;10101:34;;;69086:26:0;;10014:18:1;69086:26:0;;;;;;;68590:530;:::o;57533:274::-;-1:-1:-1;;;;;57624:24:0;;740:10;57624:24;;57616:63;;;;-1:-1:-1;;;57616:63:0;;14579:2:1;57616:63:0;;;14561:21:1;14618:2;14598:18;;;14591:30;14657:28;14637:18;;;14630:56;14703:18;;57616:63:0;14377:350:1;57616:63:0;740:10;57688:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;57688:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;57688:53:0;;;;;;;;;;57753:48;;540:41:1;;;57688:42:0;;740:10;57753:48;;513:18:1;57753:48:0;;;;;;;57533:274;;:::o;2870:304::-;2922:14;;-1:-1:-1;;;;;2922:14:0;2940:10;2922:28;2914:76;;;;-1:-1:-1;;;2914:76:0;;14934:2:1;2914:76:0;;;14916:21:1;14973:2;14953:18;;;14946:30;15012:34;14992:18;;;14985:62;-1:-1:-1;;;15063:18:1;;;15056:33;15106:19;;2914:76:0;14732:399:1;2914:76:0;3027:9;;3009:15;:27;3001:71;;;;-1:-1:-1;;;3001:71:0;;15338:2:1;3001:71:0;;;15320:21:1;15377:2;15357:18;;;15350:30;15416:32;15396:18;;;15389:60;15466:18;;3001:71:0;15136:354:1;3001:71:0;3117:14;;3109:6;;3088:44;;-1:-1:-1;;;;;3117:14:0;;;;3109:6;;;;-1:-1:-1;;;;;;;;;;;3088:44:0;3117:14;;3088:44;3152:14;;3143:6;:23;;-1:-1:-1;;;;;;3143:23:0;-1:-1:-1;;;;;3152:14:0;;;3143:23;;;;;;2870:304::o;58556:319::-;58701:28;58711:4;58717:2;58721:7;58701:9;:28::i;:::-;58752:48;58775:4;58781:2;58785:7;58794:5;58752:22;:48::i;:::-;58736:133;;;;-1:-1:-1;;;58736:133:0;;;;;;;:::i;:::-;58556:319;;;;:::o;56022:428::-;56120:13;56187:16;56195:7;59171:4;59201:12;-1:-1:-1;59191:22:0;59114:105;56187:16;56171:97;;;;-1:-1:-1;;;56171:97:0;;16117:2:1;56171:97:0;;;16099:21:1;16156:2;16136:18;;;16129:30;16195:34;16175:18;;;16168:62;-1:-1:-1;;;16246:18:1;;;16239:45;16301:19;;56171:97:0;15915:411:1;56171:97:0;56277:21;56301:10;:8;:10::i;:::-;56277:34;;56356:1;56338:7;56332:21;:25;:112;;;;;;;;;;;;;;;;;56393:7;56402:26;56403:13;:7;56413:3;56403:13;:::i;:::-;56402:24;:26::i;:::-;56376:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56332:112;56318:126;56022:428;-1:-1:-1;;;56022:428:0:o;2636:226::-;2002:6;;-1:-1:-1;;;;;2002:6:0;740:10;2002:22;1994:67;;;;-1:-1:-1;;;1994:67:0;;;;;;;:::i;:::-;2717:6:::1;::::0;;2700:14:::1;:23:::0;;-1:-1:-1;;;;;;2700:23:0;;::::1;-1:-1:-1::0;;;;;2717:6:0;::::1;2700:23;::::0;;;2734:19:::1;::::0;;2776:22:::1;2794:4:::0;2776:15:::1;:22;:::i;:::-;2764:9;:34:::0;2835:6:::1;::::0;2814:40:::1;::::0;2851:1:::1;::::0;-1:-1:-1;;;;;2835:6:0::1;::::0;-1:-1:-1;;;;;;;;;;;2814:40:0;2851:1;;2814:40:::1;2636:226:::0;:::o;2283:244::-;2002:6;;-1:-1:-1;;;;;2002:6:0;740:10;2002:22;1994:67;;;;-1:-1:-1;;;1994:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2372:22:0;::::1;2364:73;;;::::0;-1:-1:-1;;;2364:73:0;;17008:2:1;2364:73:0::1;::::0;::::1;16990:21:1::0;17047:2;17027:18;;;17020:30;17086:34;17066:18;;;17059:62;-1:-1:-1;;;17137:18:1;;;17130:36;17183:19;;2364:73:0::1;16806:402:1::0;2364:73:0::1;2474:6;::::0;2453:38:::1;::::0;-1:-1:-1;;;;;2453:38:0;;::::1;::::0;2474:6:::1;::::0;-1:-1:-1;;;;;;;;;;;2453:38:0;2474:6:::1;::::0;2453:38:::1;2502:6;:17:::0;;-1:-1:-1;;;;;;2502:17:0::1;-1:-1:-1::0;;;;;2502:17:0;;;::::1;::::0;;;::::1;::::0;;2283:244::o;59225:98::-;59290:27;59300:2;59304:8;59290:27;;;;;;;;;;;;:9;:27::i;62717:172::-;62814:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;62814:29:0;-1:-1:-1;;;;;62814:29:0;;;;;;;;;62855:28;;62814:24;;62855:28;;;;;;;62717:172;;;:::o;61082:1529::-;61179:35;61217:20;61229:7;61217:11;:20::i;:::-;61288:18;;61179:58;;-1:-1:-1;61246:22:0;;-1:-1:-1;;;;;61272:34:0;740:10;-1:-1:-1;;;;;61272:34:0;;:81;;;-1:-1:-1;740:10:0;61317:20;61329:7;61317:11;:20::i;:::-;-1:-1:-1;;;;;61317:36:0;;61272:81;:142;;;-1:-1:-1;61381:18:0;;61364:50;;740:10;57870:186;:::i;61364:50::-;61246:169;;61440:17;61424:101;;;;-1:-1:-1;;;61424:101:0;;17415:2:1;61424:101:0;;;17397:21:1;17454:2;17434:18;;;17427:30;17493:34;17473:18;;;17466:62;-1:-1:-1;;;17544:18:1;;;17537:48;17602:19;;61424:101:0;17213:414:1;61424:101:0;61572:4;-1:-1:-1;;;;;61550:26:0;:13;:18;;;-1:-1:-1;;;;;61550:26:0;;61534:98;;;;-1:-1:-1;;;61534:98:0;;17834:2:1;61534:98:0;;;17816:21:1;17873:2;17853:18;;;17846:30;17912:34;17892:18;;;17885:62;-1:-1:-1;;;17963:18:1;;;17956:36;18009:19;;61534:98:0;17632:402:1;61534:98:0;-1:-1:-1;;;;;61647:16:0;;61639:66;;;;-1:-1:-1;;;61639:66:0;;18241:2:1;61639:66:0;;;18223:21:1;18280:2;18260:18;;;18253:30;18319:34;18299:18;;;18292:62;-1:-1:-1;;;18370:18:1;;;18363:35;18415:19;;61639:66:0;18039:401:1;61639:66:0;61814:49;61831:1;61835:7;61844:13;:18;;;61814:8;:49::i;:::-;-1:-1:-1;;;;;61872:18:0;;;;;;:12;:18;;;;;:31;;61902:1;;61872:18;:31;;61902:1;;-1:-1:-1;;;;;61872:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;61872:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;61910:16:0;;-1:-1:-1;61910:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;61910:16:0;;:29;;-1:-1:-1;;61910:29:0;;:::i;:::-;;;-1:-1:-1;;;;;61910:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61969:43:0;;;;;;;;-1:-1:-1;;;;;61969:43:0;;;;;;61995:15;61969:43;;;;;;;;;-1:-1:-1;61946:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;61946:66:0;-1:-1:-1;;;;;;61946:66:0;;;;;;;;;;;62262:11;61958:7;-1:-1:-1;62262:11:0;:::i;:::-;62325:1;62284:24;;;:11;:24;;;;;:29;62240:33;;-1:-1:-1;;;;;;62284:29:0;62280:236;;62342:20;62350:11;59171:4;59201:12;-1:-1:-1;59191:22:0;59114:105;62342:20;62338:171;;;62402:97;;;;;;;;62429:18;;-1:-1:-1;;;;;62402:97:0;;;;;;62460:28;;;;62402:97;;;;;;;;;;-1:-1:-1;62375:24:0;;;:11;:24;;;;;;;:124;;;;;;;;;-1:-1:-1;;;62375:124:0;-1:-1:-1;;;;;;62375:124:0;;;;;;;;;;;;62338:171;62548:7;62544:2;-1:-1:-1;;;;;62529:27:0;62538:4;-1:-1:-1;;;;;62529:27:0;;;;;;;;;;;62563:42;61172:1439;;;61082:1529;;;:::o;54869:606::-;-1:-1:-1;;;;;;;;;;;;;;;;;54986:16:0;54994:7;59171:4;59201:12;-1:-1:-1;59191:22:0;59114:105;54986:16;54978:71;;;;-1:-1:-1;;;54978:71:0;;19156:2:1;54978:71:0;;;19138:21:1;19195:2;19175:18;;;19168:30;19234:34;19214:18;;;19207:62;-1:-1:-1;;;19285:18:1;;;19278:40;19335:19;;54978:71:0;18954:406:1;54978:71:0;55058:26;55106:12;55095:7;:23;55091:93;;55150:22;55160:12;55150:7;:22;:::i;:::-;:26;;55175:1;55150:26;:::i;:::-;55129:47;;55091:93;55212:7;55192:212;55229:18;55221:4;:26;55192:212;;55266:31;55300:17;;;:11;:17;;;;;;;;;55266:51;;;;;;;;;-1:-1:-1;;;;;55266:51:0;;;;;-1:-1:-1;;;55266:51:0;;;;;;;;;;;;55330:28;55326:71;;55378:9;54869:606;-1:-1:-1;;;;54869:606:0:o;55326:71::-;-1:-1:-1;55249:6:0;;;;:::i;:::-;;;;55192:212;;;-1:-1:-1;55412:57:0;;-1:-1:-1;;;55412:57:0;;19838:2:1;55412:57:0;;;19820:21:1;19877:2;19857:18;;;19850:30;19916:34;19896:18;;;19889:62;-1:-1:-1;;;19967:18:1;;;19960:45;20022:19;;55412:57:0;19636:411:1;64428:690:0;64565:4;-1:-1:-1;;;;;64582:13:0;;11494:20;11542:8;64578:535;;64621:72;;-1:-1:-1;;;64621:72:0;;-1:-1:-1;;;;;64621:36:0;;;;;:72;;740:10;;64672:4;;64678:7;;64687:5;;64621:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64621:72:0;;;;;;;;-1:-1:-1;;64621:72:0;;;;;;;;;;;;:::i;:::-;;;64608:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64852:13:0;;64848:215;;64885:61;;-1:-1:-1;;;64885:61:0;;;;;;;:::i;64848:215::-;65031:6;65025:13;65016:6;65012:2;65008:15;65001:38;64608:464;-1:-1:-1;;;;;;64743:55:0;-1:-1:-1;;;64743:55:0;;-1:-1:-1;64736:62:0;;64578:535;-1:-1:-1;65101:4:0;64578:535;64428:690;;;;;;:::o;69233:109::-;69293:13;69326:8;69319:15;;;;;:::i;18788:723::-;18844:13;19065:10;19061:53;;-1:-1:-1;;19092:10:0;;;;;;;;;;;;-1:-1:-1;;;19092:10:0;;;;;18788:723::o;19061:53::-;19139:5;19124:12;19180:78;19187:9;;19180:78;;19213:8;;;;:::i;:::-;;-1:-1:-1;19236:10:0;;-1:-1:-1;19244:2:0;19236:10;;:::i;:::-;;;19180:78;;;19268:19;19300:6;19290:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19290:17:0;;19268:39;;19318:154;19325:10;;19318:154;;19352:11;19362:1;19352:11;;:::i;:::-;;-1:-1:-1;19421:10:0;19429:2;19421:5;:10;:::i;:::-;19408:24;;:2;:24;:::i;:::-;19395:39;;19378:6;19385;19378:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;19378:56:0;;;;;;;;-1:-1:-1;19449:11:0;19458:2;19449:11;;:::i;:::-;;;19318:154;;59578:1272;59683:20;59706:12;-1:-1:-1;;;;;59733:16:0;;59725:62;;;;-1:-1:-1;;;59725:62:0;;21376:2:1;59725:62:0;;;21358:21:1;21415:2;21395:18;;;21388:30;21454:34;21434:18;;;21427:62;-1:-1:-1;;;21505:18:1;;;21498:31;21546:19;;59725:62:0;21174:397:1;59725:62:0;59924:21;59932:12;59171:4;59201:12;-1:-1:-1;59191:22:0;59114:105;59924:21;59923:22;59915:64;;;;-1:-1:-1;;;59915:64:0;;21778:2:1;59915:64:0;;;21760:21:1;21817:2;21797:18;;;21790:30;21856:31;21836:18;;;21829:59;21905:18;;59915:64:0;21576:353:1;59915:64:0;60006:12;59994:8;:24;;59986:71;;;;-1:-1:-1;;;59986:71:0;;22136:2:1;59986:71:0;;;22118:21:1;22175:2;22155:18;;;22148:30;22214:34;22194:18;;;22187:62;-1:-1:-1;;;22265:18:1;;;22258:32;22307:19;;59986:71:0;21934:398:1;59986:71:0;-1:-1:-1;;;;;60169:16:0;;60136:30;60169:16;;;:12;:16;;;;;;;;;60136:49;;;;;;;;;-1:-1:-1;;;;;60136:49:0;;;;;-1:-1:-1;;;60136:49:0;;;;;;;;;;;60211:119;;;;;;;;60231:19;;60136:49;;60211:119;;;60231:39;;60261:8;;60231:39;:::i;:::-;-1:-1:-1;;;;;60211:119:0;;;;;60314:8;60279:11;:24;;;:44;;;;:::i;:::-;-1:-1:-1;;;;;60211:119:0;;;;;;-1:-1:-1;;;;;60192:16:0;;;;;;;:12;:16;;;;;;;;:138;;;;;;;;-1:-1:-1;;;60192:138:0;;;;;;;;;;;;60365:43;;;;;;;;;;;60391:15;60365:43;;;;;;;;60337:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;60337:71:0;-1:-1:-1;;;;;;60337:71:0;;;;;;;;;;;;;;;;;;60349:12;;60461:281;60485:8;60481:1;:12;60461:281;;;60514:38;;60539:12;;-1:-1:-1;;;;;60514:38:0;;;60531:1;;60514:38;;60531:1;;60514:38;60579:59;60610:1;60614:2;60618:12;60632:5;60579:22;:59::i;:::-;60561:150;;;;-1:-1:-1;;;60561:150:0;;;;;;;:::i;:::-;60720:14;;;;:::i;:::-;;;;60495:3;;;;;:::i;:::-;;;;60461:281;;;-1:-1:-1;60750:12:0;:27;;;60784:60;58556:319;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;68:71;14:131;:::o;150:245::-;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:1;;1843:42;;1833:70;;1899:1;1896;1889:12;1833:70;1736:173;;;:::o;1914:254::-;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:1:o;2355:328::-;2432:6;2440;2448;2501:2;2489:9;2480:7;2476:23;2472:32;2469:52;;;2517:1;2514;2507:12;2469:52;2540:29;2559:9;2540:29;:::i;:::-;2530:39;;2588:38;2622:2;2611:9;2607:18;2588:38;:::i;:::-;2578:48;;2673:2;2662:9;2658:18;2645:32;2635:42;;2355:328;;;;;:::o;2688:186::-;2747:6;2800:2;2788:9;2779:7;2775:23;2771:32;2768:52;;;2816:1;2813;2806:12;2768:52;2839:29;2858:9;2839:29;:::i;2879:632::-;3050:2;3102:21;;;3172:13;;3075:18;;;3194:22;;;3021:4;;3050:2;3273:15;;;;3247:2;3232:18;;;3021:4;3316:169;3330:6;3327:1;3324:13;3316:169;;;3391:13;;3379:26;;3460:15;;;;3425:12;;;;3352:1;3345:9;3316:169;;;-1:-1:-1;3502:3:1;;2879:632;-1:-1:-1;;;;;;2879:632:1:o;3516:127::-;3577:10;3572:3;3568:20;3565:1;3558:31;3608:4;3605:1;3598:15;3632:4;3629:1;3622:15;3648:632;3713:5;3743:18;3784:2;3776:6;3773:14;3770:40;;;3790:18;;:::i;:::-;3865:2;3859:9;3833:2;3919:15;;-1:-1:-1;;3915:24:1;;;3941:2;3911:33;3907:42;3895:55;;;3965:18;;;3985:22;;;3962:46;3959:72;;;4011:18;;:::i;:::-;4051:10;4047:2;4040:22;4080:6;4071:15;;4110:6;4102;4095:22;4150:3;4141:6;4136:3;4132:16;4129:25;4126:45;;;4167:1;4164;4157:12;4126:45;4217:6;4212:3;4205:4;4197:6;4193:17;4180:44;4272:1;4265:4;4256:6;4248;4244:19;4240:30;4233:41;;;;3648:632;;;;;:::o;4285:451::-;4354:6;4407:2;4395:9;4386:7;4382:23;4378:32;4375:52;;;4423:1;4420;4413:12;4375:52;4463:9;4450:23;4496:18;4488:6;4485:30;4482:50;;;4528:1;4525;4518:12;4482:50;4551:22;;4604:4;4596:13;;4592:27;-1:-1:-1;4582:55:1;;4633:1;4630;4623:12;4582:55;4656:74;4722:7;4717:2;4704:16;4699:2;4695;4691:11;4656:74;:::i;4741:347::-;4806:6;4814;4867:2;4855:9;4846:7;4842:23;4838:32;4835:52;;;4883:1;4880;4873:12;4835:52;4906:29;4925:9;4906:29;:::i;:::-;4896:39;;4985:2;4974:9;4970:18;4957:32;5032:5;5025:13;5018:21;5011:5;5008:32;4998:60;;5054:1;5051;5044:12;4998:60;5077:5;5067:15;;;4741:347;;;;;:::o;5093:667::-;5188:6;5196;5204;5212;5265:3;5253:9;5244:7;5240:23;5236:33;5233:53;;;5282:1;5279;5272:12;5233:53;5305:29;5324:9;5305:29;:::i;:::-;5295:39;;5353:38;5387:2;5376:9;5372:18;5353:38;:::i;:::-;5343:48;;5438:2;5427:9;5423:18;5410:32;5400:42;;5493:2;5482:9;5478:18;5465:32;5520:18;5512:6;5509:30;5506:50;;;5552:1;5549;5542:12;5506:50;5575:22;;5628:4;5620:13;;5616:27;-1:-1:-1;5606:55:1;;5657:1;5654;5647:12;5606:55;5680:74;5746:7;5741:2;5728:16;5723:2;5719;5715:11;5680:74;:::i;:::-;5670:84;;;5093:667;;;;;;;:::o;5765:260::-;5833:6;5841;5894:2;5882:9;5873:7;5869:23;5865:32;5862:52;;;5910:1;5907;5900:12;5862:52;5933:29;5952:9;5933:29;:::i;:::-;5923:39;;5981:38;6015:2;6004:9;6000:18;5981:38;:::i;:::-;5971:48;;5765:260;;;;;:::o;6030:356::-;6232:2;6214:21;;;6251:18;;;6244:30;6310:34;6305:2;6290:18;;6283:62;6377:2;6362:18;;6030:356::o;6802:380::-;6881:1;6877:12;;;;6924;;;6945:61;;6999:4;6991:6;6987:17;6977:27;;6945:61;7052:2;7044:6;7041:14;7021:18;7018:38;7015:161;;;7098:10;7093:3;7089:20;7086:1;7079:31;7133:4;7130:1;7123:15;7161:4;7158:1;7151:15;7015:161;;6802:380;;;:::o;9593:127::-;9654:10;9649:3;9645:20;9642:1;9635:31;9685:4;9682:1;9675:15;9709:4;9706:1;9699:15;9725:128;9765:3;9796:1;9792:6;9789:1;9786:13;9783:39;;;9802:18;;:::i;:::-;-1:-1:-1;9838:9:1;;9725:128::o;10549:135::-;10588:3;-1:-1:-1;;10609:17:1;;10606:43;;;10629:18;;:::i;:::-;-1:-1:-1;10676:1:1;10665:13;;10549:135::o;11104:127::-;11165:10;11160:3;11156:20;11153:1;11146:31;11196:4;11193:1;11186:15;11220:4;11217:1;11210:15;13799:168;13839:7;13905:1;13901;13897:6;13893:14;13890:1;13887:21;13882:1;13875:9;13868:17;13864:45;13861:71;;;13912:18;;:::i;:::-;-1:-1:-1;13952:9:1;;13799:168::o;15495:415::-;15697:2;15679:21;;;15736:2;15716:18;;;15709:30;15775:34;15770:2;15755:18;;15748:62;-1:-1:-1;;;15841:2:1;15826:18;;15819:49;15900:3;15885:19;;15495:415::o;16331:470::-;16510:3;16548:6;16542:13;16564:53;16610:6;16605:3;16598:4;16590:6;16586:17;16564:53;:::i;:::-;16680:13;;16639:16;;;;16702:57;16680:13;16639:16;16736:4;16724:17;;16702:57;:::i;:::-;16775:20;;16331:470;-1:-1:-1;;;;16331:470:1:o;18445:246::-;18485:4;-1:-1:-1;;;;;18598:10:1;;;;18568;;18620:12;;;18617:38;;;18635:18;;:::i;:::-;18672:13;;18445:246;-1:-1:-1;;;18445:246:1:o;18696:253::-;18736:3;-1:-1:-1;;;;;18825:2:1;18822:1;18818:10;18855:2;18852:1;18848:10;18886:3;18882:2;18878:12;18873:3;18870:21;18867:47;;;18894:18;;:::i;19365:125::-;19405:4;19433:1;19430;19427:8;19424:34;;;19438:18;;:::i;:::-;-1:-1:-1;19475:9:1;;19365:125::o;19495:136::-;19534:3;19562:5;19552:39;;19571:18;;:::i;:::-;-1:-1:-1;;;19607:18:1;;19495:136::o;20052:489::-;-1:-1:-1;;;;;20321:15:1;;;20303:34;;20373:15;;20368:2;20353:18;;20346:43;20420:2;20405:18;;20398:34;;;20468:3;20463:2;20448:18;;20441:31;;;20246:4;;20489:46;;20515:19;;20507:6;20489:46;:::i;:::-;20481:54;20052:489;-1:-1:-1;;;;;;20052:489:1:o;20546:249::-;20615:6;20668:2;20656:9;20647:7;20643:23;20639:32;20636:52;;;20684:1;20681;20674:12;20636:52;20716:9;20710:16;20735:30;20759:5;20735:30;:::i;20800:127::-;20861:10;20856:3;20852:20;20849:1;20842:31;20892:4;20889:1;20882:15;20916:4;20913:1;20906:15;20932:120;20972:1;20998;20988:35;;21003:18;;:::i;:::-;-1:-1:-1;21037:9:1;;20932:120::o;21057:112::-;21089:1;21115;21105:35;;21120:18;;:::i;:::-;-1:-1:-1;21154:9:1;;21057:112::o

Swarm Source

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