ETH Price: $2,943.45 (-4.05%)
Gas: 2 Gwei

Token

RockGuy (RockGuy)
 

Overview

Max Total Supply

1,000 RockGuy

Holders

569

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 RockGuy
0x735e59b365a9e41630fc100933d250c39f6aba29
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:
RockGuyContract

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

interface IERC165 {
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}


pragma solidity ^0.8.0;

abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

pragma solidity ^0.8.0;

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private 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);
            }
        }
    }
}

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

pragma solidity ^0.8.0;

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

/**
 * @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..).
 *
 * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128.
 *
 * 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 TotalToken;
  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.
   * `TotalToken_` refers to how many tokens are in the collection.
   */
  constructor(
    string memory name_,
    string memory symbol_,
    uint256 maxBatchSize_,
    uint256 TotalToken_
  ) {
    require(
      TotalToken_ > 0,
      "ERC721A: collection must have a nonzero supply"
    );
    require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero");
    _name = name_;
    _symbol = symbol_;
    maxBatchSize = maxBatchSize_;
    TotalToken = TotalToken_;
  }

  /**
   * @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(TotalToken). 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");
  }

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

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


  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 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:
   *
   * - there must be `quantity` tokens remaining unminted in the total collection.
   * - `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 > TotalToken - 1) {
      endIndex = TotalToken - 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 {}
}



pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}




pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */



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

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

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

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

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

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

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

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

        return (signer, RecoverError.NoError);
    }

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

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

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

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

pragma solidity ^0.8.0;


contract RockGuyContract is Ownable, ERC721A, ReentrancyGuard {
    uint256 public  TotalFreeToken; 
    uint256 public  TotalFreeTokenPerwallet;   
    uint public     MaxMintPerTx; 
    mapping(address => uint256) public MintPerWallet;
    bool public     bMintStart;
    bool public     bWLMintStart;
    uint256 public  TotalCollectionSize;
    uint256 public  saleprice;  
    address private _signer;

 constructor(
    uint256 maxBatchSize_,
    uint256 TotalToken_
  ) ERC721A("RockGuy", "RockGuy", maxBatchSize_, TotalToken_) {
    MaxMintPerTx = maxBatchSize_;
    TotalCollectionSize = TotalToken_; 
    bMintStart = false;  
    bWLMintStart = true;      
    saleprice =   9000000000000000;
    TotalFreeToken = 4444;
    TotalFreeTokenPerwallet = 1;
  }

  
  function MintbyDev(address _to,uint256 mintamount) external onlyOwner {        
    require(totalSupply() + mintamount <= TotalCollectionSize, "Can not mint more than max token");

    _safeMint(_to, mintamount);
  }

    function recoverSigner(bytes32 hash, bytes memory signature) public pure returns (address) {
        bytes32 messageDigest = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
        return ECDSA.recover(messageDigest, signature);
    }

  function Mint(uint256 mintamount,  bytes32 hash, bytes memory signature) external payable {
    uint free = MintPerWallet[msg.sender] == 0 ? 1 : 0;
    uint256 cost = saleprice*(mintamount-free);
              
    require(bMintStart || bWLMintStart, "Sale is not started");
    require(totalSupply() + mintamount <= TotalCollectionSize, "Can not mint more than max token");    
    require(mintamount > 0 && mintamount <= MaxMintPerTx, "Can not mint more than max per tx");
    require(msg.value >= cost, "Not paid enough ETH.");
    if (bWLMintStart) {
       require(recoverSigner(hash, signature) == _signer, 
            "Address is not allowlisted");
    }

    MintPerWallet[msg.sender] += mintamount;
    _safeMint(msg.sender, mintamount);
  } 


  function Mint(uint256 mintamount) external payable {
    uint free = MintPerWallet[msg.sender] == 0 ? 1 : 0;
    uint256 cost = saleprice*(mintamount-free);
              
    require(bMintStart, "Sale is not started");
    require(totalSupply() + mintamount <= TotalCollectionSize, "Can not mint more than max token");    
    require(mintamount > 0 && mintamount <= MaxMintPerTx, "Can not mint more than 20 per tx");
    require(msg.value >= cost, "Not paid enough ETH.");

    MintPerWallet[msg.sender] += mintamount;
    _safeMint(msg.sender, mintamount);
  } 

  function setSigner(address newSigner) public onlyOwner {
    _signer = newSigner;
  }

  function setMaxMintPerTx(uint _MaxMintPerTx) external onlyOwner {
    MaxMintPerTx = _MaxMintPerTx;
  }   

  function setTotalCollectionSize(uint _TotalToken) external onlyOwner {
    TotalCollectionSize = _TotalToken;
  }

  function setsaleprice(uint _saleprice) external onlyOwner {
    saleprice = _saleprice;
  }        

  function setTotalFreeTokenPerwallet(uint _TotalFreeTokenPerwallet) external onlyOwner {
    TotalFreeTokenPerwallet = _TotalFreeTokenPerwallet;
  }         

  function setTotalFreeToken(uint _TotalFreeToken) external onlyOwner {
    TotalFreeToken = _TotalFreeToken;
  } 

  function SetSalesStart() public onlyOwner {
    bMintStart = !bMintStart;
  }

  function SetWLSalesStart() public onlyOwner {
    bWLMintStart = !bWLMintStart;
  }

  function setOwnersExplicit(uint256 quantity) external onlyOwner nonReentrant {
    _setOwnersExplicit(quantity);
  }
  
  string private _baseAPIURI;

  function setBaseURI(string calldata baseURI) external onlyOwner {
    _baseAPIURI = baseURI;
  }

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

  function getOwnershipData(uint256 tokenId)
    external
    view
    returns (TokenOwnership memory)
  {
    return ownershipOf(tokenId);
  }

  function tokensOfOwner(address _owner) external view returns(uint256[] memory ) {
    uint256 tokenCount = balanceOf(_owner);
    if (tokenCount == 0) {
        return new uint256[](0);
    } else {
        uint256[] memory result = new uint256[](tokenCount);
        uint256 index;
        for (index = 0; index < tokenCount; index++) {
            result[index] = tokenOfOwnerByIndex(_owner, index);
        }
        return result;
    }
  } 

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

 }

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"maxBatchSize_","type":"uint256"},{"internalType":"uint256","name":"TotalToken_","type":"uint256"}],"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":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":"MaxMintPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintamount","type":"uint256"}],"name":"Mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintamount","type":"uint256"},{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"Mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"MintPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"mintamount","type":"uint256"}],"name":"MintbyDev","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"SetSalesStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"SetWLSalesStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TotalCollectionSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TotalFreeToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TotalFreeTokenPerwallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bMintStart","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bWLMintStart","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"recoverSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleprice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_MaxMintPerTx","type":"uint256"}],"name":"setMaxMintPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"setOwnersExplicit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newSigner","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_TotalToken","type":"uint256"}],"name":"setTotalCollectionSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_TotalFreeToken","type":"uint256"}],"name":"setTotalFreeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_TotalFreeTokenPerwallet","type":"uint256"}],"name":"setTotalFreeTokenPerwallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_saleprice","type":"uint256"}],"name":"setsaleprice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c0604052600060015560006008553480156200001b57600080fd5b506040516200345f3803806200345f8339810160408190526200003e91620002d3565b60405180604001604052806007815260200166526f636b47757960c81b81525060405180604001604052806007815260200166526f636b47757960c81b81525083836200009a62000094620001d960201b60201c565b620001dd565b60008111620001075760405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060448201526d6e6f6e7a65726f20737570706c7960901b60648201526084015b60405180910390fd5b60008211620001695760405162461bcd60e51b815260206004820152602760248201527f455243373231413a206d61782062617463682073697a65206d757374206265206044820152666e6f6e7a65726f60c81b6064820152608401620000fe565b83516200017e9060029060208701906200022d565b508251620001949060039060208601906200022d565b5060a091909152608052505060016009819055600c92909255600f55600e805461ffff1916610100179055661ff973cafa800060105561115c600a55600b5562000335565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200023b90620002f8565b90600052602060002090601f0160209004810192826200025f5760008555620002aa565b82601f106200027a57805160ff1916838001178555620002aa565b82800160010185558215620002aa579182015b82811115620002aa5782518255916020019190600101906200028d565b50620002b8929150620002bc565b5090565b5b80821115620002b85760008155600101620002bd565b60008060408385031215620002e757600080fd5b505080516020909101519092909150565b600181811c908216806200030d57607f821691505b602082108114156200032f57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a0516130ef6200037060003960008181611f8101528181611fab01526123ea015260008181611d870152611db901526130ef6000f3fe6080604052600436106102725760003560e01c80636352211e1161014f57806397aba7f9116100c1578063c87b56dd1161007a578063c87b56dd14610742578063d7224ba014610762578063e985e9c514610778578063f0c0ebc6146107c1578063f2fde38b146107e1578063fb41438b1461080157600080fd5b806397aba7f91461068e5780639b969525146106ae5780639d92de56146106c3578063a22cb465146106e3578063afd75c1f14610703578063b88d4fde1461072257600080fd5b8063823903a911610113578063823903a9146105b55780638462151c146105cb5780638da5cb5b146105f85780638ec65209146106165780639231ab2a1461062c57806395d89b411461067957600080fd5b80636352211e146105205780636c19e7831461054057806370a0823114610560578063715018a61461058057806379fe3a331461059557600080fd5b80632f745c59116101e857806350c45f37116101ac57806350c45f371461048957806354870bc61461049f57806355f804b3146104b457806357eea110146104d45780635b7a0d88146104ea578063616cdb1e1461050057600080fd5b80632f745c59146103e75780633ccfd60b1461040757806342842e0e1461041c5780634e695f341461043c5780634f6ccce71461046957600080fd5b806318160ddd1161023a57806318160ddd1461033b5780631f4b962d1461035a578063201bc3771461037457806323b872dd146103875780632b46853c146103a75780632d20fb60146103c757600080fd5b806301ffc9a71461027757806306fdde03146102ac57806307883703146102ce578063081812fc146102e3578063095ea7b31461031b575b600080fd5b34801561028357600080fd5b50610297610292366004612c23565b610821565b60405190151581526020015b60405180910390f35b3480156102b857600080fd5b506102c161088e565b6040516102a39190612e12565b6102e16102dc366004612cce565b610920565b005b3480156102ef57600080fd5b506103036102fe366004612cce565b610abb565b6040516001600160a01b0390911681526020016102a3565b34801561032757600080fd5b506102e1610336366004612bb3565b610b46565b34801561034757600080fd5b506001545b6040519081526020016102a3565b34801561036657600080fd5b50600e546102979060ff1681565b6102e1610382366004612ce7565b610c59565b34801561039357600080fd5b506102e16103a2366004612ad4565b610e89565b3480156103b357600080fd5b506102e16103c2366004612cce565b610e94565b3480156103d357600080fd5b506102e16103e2366004612cce565b610ec3565b3480156103f357600080fd5b5061034c610402366004612bb3565b610f56565b34801561041357600080fd5b506102e16110ce565b34801561042857600080fd5b506102e1610437366004612ad4565b6111db565b34801561044857600080fd5b5061034c610457366004612a86565b600d6020526000908152604090205481565b34801561047557600080fd5b5061034c610484366004612cce565b6111f6565b34801561049557600080fd5b5061034c600a5481565b3480156104ab57600080fd5b506102e161125f565b3480156104c057600080fd5b506102e16104cf366004612c5d565b61129d565b3480156104e057600080fd5b5061034c60105481565b3480156104f657600080fd5b5061034c600f5481565b34801561050c57600080fd5b506102e161051b366004612cce565b6112d3565b34801561052c57600080fd5b5061030361053b366004612cce565b611302565b34801561054c57600080fd5b506102e161055b366004612a86565b611314565b34801561056c57600080fd5b5061034c61057b366004612a86565b611360565b34801561058c57600080fd5b506102e16113f1565b3480156105a157600080fd5b506102e16105b0366004612cce565b611427565b3480156105c157600080fd5b5061034c600c5481565b3480156105d757600080fd5b506105eb6105e6366004612a86565b611456565b6040516102a39190612dce565b34801561060457600080fd5b506000546001600160a01b0316610303565b34801561062257600080fd5b5061034c600b5481565b34801561063857600080fd5b5061064c610647366004612cce565b611514565b6040805182516001600160a01b031681526020928301516001600160401b031692810192909252016102a3565b34801561068557600080fd5b506102c1611531565b34801561069a57600080fd5b506103036106a9366004612bdd565b611540565b3480156106ba57600080fd5b506102e16115a2565b3480156106cf57600080fd5b506102e16106de366004612bb3565b6115e9565b3480156106ef57600080fd5b506102e16106fe366004612b77565b611656565b34801561070f57600080fd5b50600e5461029790610100900460ff1681565b34801561072e57600080fd5b506102e161073d366004612b10565b61171b565b34801561074e57600080fd5b506102c161075d366004612cce565b611754565b34801561076e57600080fd5b5061034c60085481565b34801561078457600080fd5b50610297610793366004612aa1565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156107cd57600080fd5b506102e16107dc366004612cce565b611821565b3480156107ed57600080fd5b506102e16107fc366004612a86565b611850565b34801561080d57600080fd5b506102e161081c366004612cce565b6118eb565b60006001600160e01b031982166380ac58cd60e01b148061085257506001600160e01b03198216635b5e139f60e01b145b8061086d57506001600160e01b0319821663780e9d6360e01b145b8061088857506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606002805461089d90612fd1565b80601f01602080910402602001604051908101604052809291908181526020018280546108c990612fd1565b80156109165780601f106108eb57610100808354040283529160200191610916565b820191906000526020600020905b8154815290600101906020018083116108f957829003601f168201915b5050505050905090565b336000908152600d60205260408120541561093c57600061093f565b60015b60ff16905060006109508284612f77565b60105461095d9190612f30565b600e5490915060ff166109ad5760405162461bcd60e51b815260206004820152601360248201527214d85b19481a5cc81b9bdd081cdd185c9d1959606a1b60448201526064015b60405180910390fd5b600f54836109ba60015490565b6109c49190612f04565b11156109e25760405162461bcd60e51b81526004016109a490612e5a565b6000831180156109f45750600c548311155b610a405760405162461bcd60e51b815260206004820181905260248201527f43616e206e6f74206d696e74206d6f7265207468616e2032302070657220747860448201526064016109a4565b80341015610a875760405162461bcd60e51b81526020600482015260146024820152732737ba103830b4b21032b737bab3b41022aa241760611b60448201526064016109a4565b336000908152600d602052604081208054859290610aa6908490612f04565b90915550610ab69050338461191a565b505050565b6000610ac8826001541190565b610b2a5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084016109a4565b506000908152600660205260409020546001600160a01b031690565b6000610b5182611302565b9050806001600160a01b0316836001600160a01b03161415610bc05760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b60648201526084016109a4565b336001600160a01b0382161480610bdc5750610bdc8133610793565b610c4e5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c0000000000000060648201526084016109a4565b610ab6838383611934565b336000908152600d602052604081205415610c75576000610c78565b60015b60ff1690506000610c898286612f77565b601054610c969190612f30565b600e5490915060ff1680610cb15750600e54610100900460ff165b610cf35760405162461bcd60e51b815260206004820152601360248201527214d85b19481a5cc81b9bdd081cdd185c9d1959606a1b60448201526064016109a4565b600f5485610d0060015490565b610d0a9190612f04565b1115610d285760405162461bcd60e51b81526004016109a490612e5a565b600085118015610d3a5750600c548511155b610d905760405162461bcd60e51b815260206004820152602160248201527f43616e206e6f74206d696e74206d6f7265207468616e206d61782070657220746044820152600f60fb1b60648201526084016109a4565b80341015610dd75760405162461bcd60e51b81526020600482015260146024820152732737ba103830b4b21032b737bab3b41022aa241760611b60448201526064016109a4565b600e54610100900460ff1615610e53576011546001600160a01b0316610dfd8585611540565b6001600160a01b031614610e535760405162461bcd60e51b815260206004820152601a60248201527f41646472657373206973206e6f7420616c6c6f776c697374656400000000000060448201526064016109a4565b336000908152600d602052604081208054879290610e72908490612f04565b90915550610e829050338661191a565b5050505050565b610ab6838383611990565b6000546001600160a01b03163314610ebe5760405162461bcd60e51b81526004016109a490612e25565b600a55565b6000546001600160a01b03163314610eed5760405162461bcd60e51b81526004016109a490612e25565b60026009541415610f405760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109a4565b6002600955610f4e81611d16565b506001600955565b6000610f6183611360565b8210610fba5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016109a4565b6000610fc560015490565b905060008060005b8381101561106e576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561101f57805192505b876001600160a01b0316836001600160a01b0316141561105b578684141561104d5750935061088892505050565b8361105781613006565b9450505b508061106681613006565b915050610fcd565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b60648201526084016109a4565b6000546001600160a01b031633146110f85760405162461bcd60e51b81526004016109a490612e25565b6002600954141561114b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109a4565b6002600955604051600090339047908381818185875af1925050503d8060008114611192576040519150601f19603f3d011682016040523d82523d6000602084013e611197565b606091505b5050905080610f4e5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b60448201526064016109a4565b610ab68383836040518060200160405280600081525061171b565b600061120160015490565b821061125b5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b60648201526084016109a4565b5090565b6000546001600160a01b031633146112895760405162461bcd60e51b81526004016109a490612e25565b600e805460ff19811660ff90911615179055565b6000546001600160a01b031633146112c75760405162461bcd60e51b81526004016109a490612e25565b610ab66012838361294e565b6000546001600160a01b031633146112fd5760405162461bcd60e51b81526004016109a490612e25565b600c55565b600061130d82611eff565b5192915050565b6000546001600160a01b0316331461133e5760405162461bcd60e51b81526004016109a490612e25565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b0382166113cc5760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084016109a4565b506001600160a01b03166000908152600560205260409020546001600160801b031690565b6000546001600160a01b0316331461141b5760405162461bcd60e51b81526004016109a490612e25565b61142560006120a8565b565b6000546001600160a01b031633146114515760405162461bcd60e51b81526004016109a490612e25565b600b55565b6060600061146383611360565b9050806114845760408051600080825260208201909252905b509392505050565b6000816001600160401b0381111561149e5761149e61308d565b6040519080825280602002602001820160405280156114c7578160200160208202803683370190505b50905060005b8281101561147c576114df8582610f56565b8282815181106114f1576114f1613077565b60209081029190910101528061150681613006565b9150506114cd565b50919050565b604080518082019091526000808252602082015261088882611eff565b60606003805461089d90612fd1565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018390526000908190605c0160405160208183030381529060405280519060200120905061159a81846120f8565b949350505050565b6000546001600160a01b031633146115cc5760405162461bcd60e51b81526004016109a490612e25565b600e805461ff001981166101009182900460ff1615909102179055565b6000546001600160a01b031633146116135760405162461bcd60e51b81526004016109a490612e25565b600f548161162060015490565b61162a9190612f04565b11156116485760405162461bcd60e51b81526004016109a490612e5a565b611652828261191a565b5050565b6001600160a01b0382163314156116af5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c657200000000000060448201526064016109a4565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611726848484611990565b61173284848484612114565b61174e5760405162461bcd60e51b81526004016109a490612e8f565b50505050565b6060611761826001541190565b6117c55760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109a4565b60006117cf612221565b905060008151116117ef576040518060200160405280600081525061181a565b806117f984612230565b60405160200161180a929190612d62565b6040516020818303038152906040525b9392505050565b6000546001600160a01b0316331461184b5760405162461bcd60e51b81526004016109a490612e25565b601055565b6000546001600160a01b0316331461187a5760405162461bcd60e51b81526004016109a490612e25565b6001600160a01b0381166118df5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109a4565b6118e8816120a8565b50565b6000546001600160a01b031633146119155760405162461bcd60e51b81526004016109a490612e25565b600f55565b61165282826040518060200160405280600081525061232d565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061199b82611eff565b80519091506000906001600160a01b0316336001600160a01b031614806119d25750336119c784610abb565b6001600160a01b0316145b806119e4575081516119e49033610793565b905080611a4e5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016109a4565b846001600160a01b031682600001516001600160a01b031614611ac25760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b60648201526084016109a4565b6001600160a01b038416611b265760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016109a4565b611b366000848460000151611934565b6001600160a01b0385166000908152600560205260408120805460019290611b689084906001600160801b0316612f4f565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526005602052604081208054600194509092611bb491859116612ee2565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526004909152948520935184549151909216600160a01b026001600160e01b03199091169190921617179055611c3b846001612f04565b6000818152600460205260409020549091506001600160a01b0316611ccc57611c65816001541190565b15611ccc5760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600490935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b60085481611d665760405162461bcd60e51b815260206004820152601860248201527f7175616e74697479206d757374206265206e6f6e7a65726f000000000000000060448201526064016109a4565b60006001611d748484612f04565b611d7e9190612f77565b9050611dab60017f0000000000000000000000000000000000000000000000000000000000000000612f77565b811115611de057611ddd60017f0000000000000000000000000000000000000000000000000000000000000000612f77565b90505b611deb816001541190565b611e465760405162461bcd60e51b815260206004820152602660248201527f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360448201526506c65616e75760d41b60648201526084016109a4565b815b818111611eeb576000818152600460205260409020546001600160a01b0316611ed9576000611e7682611eff565b60408051808201825282516001600160a01b0390811682526020938401516001600160401b039081168584019081526000888152600490965293909420915182549351909416600160a01b026001600160e01b0319909316931692909217179055505b80611ee381613006565b915050611e48565b50611ef7816001612f04565b600855505050565b6040805180820190915260008082526020820152611f1e826001541190565b611f7d5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b60648201526084016109a4565b60007f00000000000000000000000000000000000000000000000000000000000000008310611fde57611fd07f000000000000000000000000000000000000000000000000000000000000000084612f77565b611fdb906001612f04565b90505b825b818110612047576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561203457949350505050565b508061203f81612fba565b915050611fe0565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b60648201526084016109a4565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008060006121078585612607565b9150915061147c81612677565b60006001600160a01b0384163b1561221657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612158903390899088908890600401612d91565b602060405180830381600087803b15801561217257600080fd5b505af19250505080156121a2575060408051601f3d908101601f1916820190925261219f91810190612c40565b60015b6121fc573d8080156121d0576040519150601f19603f3d011682016040523d82523d6000602084013e6121d5565b606091505b5080516121f45760405162461bcd60e51b81526004016109a490612e8f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061159a565b506001949350505050565b60606012805461089d90612fd1565b6060816122545750506040805180820190915260018152600360fc1b602082015290565b8160005b811561227e578061226881613006565b91506122779050600a83612f1c565b9150612258565b6000816001600160401b038111156122985761229861308d565b6040519080825280601f01601f1916602001820160405280156122c2576020820181803683370190505b5090505b841561159a576122d7600183612f77565b91506122e4600a86613021565b6122ef906030612f04565b60f81b81838151811061230457612304613077565b60200101906001600160f81b031916908160001a905350612326600a86612f1c565b94506122c6565b6001546001600160a01b0384166123905760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016109a4565b61239b816001541190565b156123e85760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e74656400000060448201526064016109a4565b7f00000000000000000000000000000000000000000000000000000000000000008311156124635760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b60648201526084016109a4565b6001600160a01b0384166000908152600560209081526040918290208251808401845290546001600160801b038082168352600160801b90910416918101919091528151808301909252805190919081906124bf908790612ee2565b6001600160801b031681526020018583602001516124dd9190612ee2565b6001600160801b039081169091526001600160a01b0380881660008181526005602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526004909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b858110156125fc5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46125c06000888488612114565b6125dc5760405162461bcd60e51b81526004016109a490612e8f565b816125e681613006565b92505080806125f490613006565b915050612573565b506001819055611d0e565b60008082516041141561263e5760208301516040840151606085015160001a61263287828585612832565b94509450505050612670565b825160401415612668576020830151604084015161265d86838361291f565b935093505050612670565b506000905060025b9250929050565b600081600481111561268b5761268b613061565b14156126945750565b60018160048111156126a8576126a8613061565b14156126f65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016109a4565b600281600481111561270a5761270a613061565b14156127585760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016109a4565b600381600481111561276c5761276c613061565b14156127c55760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016109a4565b60048160048111156127d9576127d9613061565b14156118e85760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016109a4565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156128695750600090506003612916565b8460ff16601b1415801561288157508460ff16601c14155b156128925750600090506004612916565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156128e6573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661290f57600060019250925050612916565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b0161294087828885612832565b935093505050935093915050565b82805461295a90612fd1565b90600052602060002090601f01602090048101928261297c57600085556129c2565b82601f106129955782800160ff198235161785556129c2565b828001600101855582156129c2579182015b828111156129c25782358255916020019190600101906129a7565b5061125b9291505b8082111561125b57600081556001016129ca565b80356001600160a01b03811681146129f557600080fd5b919050565b600082601f830112612a0b57600080fd5b81356001600160401b0380821115612a2557612a2561308d565b604051601f8301601f19908116603f01168101908282118183101715612a4d57612a4d61308d565b81604052838152866020858801011115612a6657600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060208284031215612a9857600080fd5b61181a826129de565b60008060408385031215612ab457600080fd5b612abd836129de565b9150612acb602084016129de565b90509250929050565b600080600060608486031215612ae957600080fd5b612af2846129de565b9250612b00602085016129de565b9150604084013590509250925092565b60008060008060808587031215612b2657600080fd5b612b2f856129de565b9350612b3d602086016129de565b92506040850135915060608501356001600160401b03811115612b5f57600080fd5b612b6b878288016129fa565b91505092959194509250565b60008060408385031215612b8a57600080fd5b612b93836129de565b915060208301358015158114612ba857600080fd5b809150509250929050565b60008060408385031215612bc657600080fd5b612bcf836129de565b946020939093013593505050565b60008060408385031215612bf057600080fd5b8235915060208301356001600160401b03811115612c0d57600080fd5b612c19858286016129fa565b9150509250929050565b600060208284031215612c3557600080fd5b813561181a816130a3565b600060208284031215612c5257600080fd5b815161181a816130a3565b60008060208385031215612c7057600080fd5b82356001600160401b0380821115612c8757600080fd5b818501915085601f830112612c9b57600080fd5b813581811115612caa57600080fd5b866020828501011115612cbc57600080fd5b60209290920196919550909350505050565b600060208284031215612ce057600080fd5b5035919050565b600080600060608486031215612cfc57600080fd5b833592506020840135915060408401356001600160401b03811115612d2057600080fd5b612d2c868287016129fa565b9150509250925092565b60008151808452612d4e816020860160208601612f8e565b601f01601f19169290920160200192915050565b60008351612d74818460208801612f8e565b835190830190612d88818360208801612f8e565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612dc490830184612d36565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612e0657835183529284019291840191600101612dea565b50909695505050505050565b60208152600061181a6020830184612d36565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f43616e206e6f74206d696e74206d6f7265207468616e206d617820746f6b656e604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60006001600160801b03808316818516808303821115612d8857612d88613035565b60008219821115612f1757612f17613035565b500190565b600082612f2b57612f2b61304b565b500490565b6000816000190483118215151615612f4a57612f4a613035565b500290565b60006001600160801b0383811690831681811015612f6f57612f6f613035565b039392505050565b600082821015612f8957612f89613035565b500390565b60005b83811015612fa9578181015183820152602001612f91565b8381111561174e5750506000910152565b600081612fc957612fc9613035565b506000190190565b600181811c90821680612fe557607f821691505b6020821081141561150e57634e487b7160e01b600052602260045260246000fd5b600060001982141561301a5761301a613035565b5060010190565b6000826130305761303061304b565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146118e857600080fdfea26469706673582212201a62db148e814e709a67a76f7987d5c50c75e52ef4d0cc4542d455228f40242b64736f6c634300080700330000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000115c

Deployed Bytecode

0x6080604052600436106102725760003560e01c80636352211e1161014f57806397aba7f9116100c1578063c87b56dd1161007a578063c87b56dd14610742578063d7224ba014610762578063e985e9c514610778578063f0c0ebc6146107c1578063f2fde38b146107e1578063fb41438b1461080157600080fd5b806397aba7f91461068e5780639b969525146106ae5780639d92de56146106c3578063a22cb465146106e3578063afd75c1f14610703578063b88d4fde1461072257600080fd5b8063823903a911610113578063823903a9146105b55780638462151c146105cb5780638da5cb5b146105f85780638ec65209146106165780639231ab2a1461062c57806395d89b411461067957600080fd5b80636352211e146105205780636c19e7831461054057806370a0823114610560578063715018a61461058057806379fe3a331461059557600080fd5b80632f745c59116101e857806350c45f37116101ac57806350c45f371461048957806354870bc61461049f57806355f804b3146104b457806357eea110146104d45780635b7a0d88146104ea578063616cdb1e1461050057600080fd5b80632f745c59146103e75780633ccfd60b1461040757806342842e0e1461041c5780634e695f341461043c5780634f6ccce71461046957600080fd5b806318160ddd1161023a57806318160ddd1461033b5780631f4b962d1461035a578063201bc3771461037457806323b872dd146103875780632b46853c146103a75780632d20fb60146103c757600080fd5b806301ffc9a71461027757806306fdde03146102ac57806307883703146102ce578063081812fc146102e3578063095ea7b31461031b575b600080fd5b34801561028357600080fd5b50610297610292366004612c23565b610821565b60405190151581526020015b60405180910390f35b3480156102b857600080fd5b506102c161088e565b6040516102a39190612e12565b6102e16102dc366004612cce565b610920565b005b3480156102ef57600080fd5b506103036102fe366004612cce565b610abb565b6040516001600160a01b0390911681526020016102a3565b34801561032757600080fd5b506102e1610336366004612bb3565b610b46565b34801561034757600080fd5b506001545b6040519081526020016102a3565b34801561036657600080fd5b50600e546102979060ff1681565b6102e1610382366004612ce7565b610c59565b34801561039357600080fd5b506102e16103a2366004612ad4565b610e89565b3480156103b357600080fd5b506102e16103c2366004612cce565b610e94565b3480156103d357600080fd5b506102e16103e2366004612cce565b610ec3565b3480156103f357600080fd5b5061034c610402366004612bb3565b610f56565b34801561041357600080fd5b506102e16110ce565b34801561042857600080fd5b506102e1610437366004612ad4565b6111db565b34801561044857600080fd5b5061034c610457366004612a86565b600d6020526000908152604090205481565b34801561047557600080fd5b5061034c610484366004612cce565b6111f6565b34801561049557600080fd5b5061034c600a5481565b3480156104ab57600080fd5b506102e161125f565b3480156104c057600080fd5b506102e16104cf366004612c5d565b61129d565b3480156104e057600080fd5b5061034c60105481565b3480156104f657600080fd5b5061034c600f5481565b34801561050c57600080fd5b506102e161051b366004612cce565b6112d3565b34801561052c57600080fd5b5061030361053b366004612cce565b611302565b34801561054c57600080fd5b506102e161055b366004612a86565b611314565b34801561056c57600080fd5b5061034c61057b366004612a86565b611360565b34801561058c57600080fd5b506102e16113f1565b3480156105a157600080fd5b506102e16105b0366004612cce565b611427565b3480156105c157600080fd5b5061034c600c5481565b3480156105d757600080fd5b506105eb6105e6366004612a86565b611456565b6040516102a39190612dce565b34801561060457600080fd5b506000546001600160a01b0316610303565b34801561062257600080fd5b5061034c600b5481565b34801561063857600080fd5b5061064c610647366004612cce565b611514565b6040805182516001600160a01b031681526020928301516001600160401b031692810192909252016102a3565b34801561068557600080fd5b506102c1611531565b34801561069a57600080fd5b506103036106a9366004612bdd565b611540565b3480156106ba57600080fd5b506102e16115a2565b3480156106cf57600080fd5b506102e16106de366004612bb3565b6115e9565b3480156106ef57600080fd5b506102e16106fe366004612b77565b611656565b34801561070f57600080fd5b50600e5461029790610100900460ff1681565b34801561072e57600080fd5b506102e161073d366004612b10565b61171b565b34801561074e57600080fd5b506102c161075d366004612cce565b611754565b34801561076e57600080fd5b5061034c60085481565b34801561078457600080fd5b50610297610793366004612aa1565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156107cd57600080fd5b506102e16107dc366004612cce565b611821565b3480156107ed57600080fd5b506102e16107fc366004612a86565b611850565b34801561080d57600080fd5b506102e161081c366004612cce565b6118eb565b60006001600160e01b031982166380ac58cd60e01b148061085257506001600160e01b03198216635b5e139f60e01b145b8061086d57506001600160e01b0319821663780e9d6360e01b145b8061088857506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606002805461089d90612fd1565b80601f01602080910402602001604051908101604052809291908181526020018280546108c990612fd1565b80156109165780601f106108eb57610100808354040283529160200191610916565b820191906000526020600020905b8154815290600101906020018083116108f957829003601f168201915b5050505050905090565b336000908152600d60205260408120541561093c57600061093f565b60015b60ff16905060006109508284612f77565b60105461095d9190612f30565b600e5490915060ff166109ad5760405162461bcd60e51b815260206004820152601360248201527214d85b19481a5cc81b9bdd081cdd185c9d1959606a1b60448201526064015b60405180910390fd5b600f54836109ba60015490565b6109c49190612f04565b11156109e25760405162461bcd60e51b81526004016109a490612e5a565b6000831180156109f45750600c548311155b610a405760405162461bcd60e51b815260206004820181905260248201527f43616e206e6f74206d696e74206d6f7265207468616e2032302070657220747860448201526064016109a4565b80341015610a875760405162461bcd60e51b81526020600482015260146024820152732737ba103830b4b21032b737bab3b41022aa241760611b60448201526064016109a4565b336000908152600d602052604081208054859290610aa6908490612f04565b90915550610ab69050338461191a565b505050565b6000610ac8826001541190565b610b2a5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084016109a4565b506000908152600660205260409020546001600160a01b031690565b6000610b5182611302565b9050806001600160a01b0316836001600160a01b03161415610bc05760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b60648201526084016109a4565b336001600160a01b0382161480610bdc5750610bdc8133610793565b610c4e5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c0000000000000060648201526084016109a4565b610ab6838383611934565b336000908152600d602052604081205415610c75576000610c78565b60015b60ff1690506000610c898286612f77565b601054610c969190612f30565b600e5490915060ff1680610cb15750600e54610100900460ff165b610cf35760405162461bcd60e51b815260206004820152601360248201527214d85b19481a5cc81b9bdd081cdd185c9d1959606a1b60448201526064016109a4565b600f5485610d0060015490565b610d0a9190612f04565b1115610d285760405162461bcd60e51b81526004016109a490612e5a565b600085118015610d3a5750600c548511155b610d905760405162461bcd60e51b815260206004820152602160248201527f43616e206e6f74206d696e74206d6f7265207468616e206d61782070657220746044820152600f60fb1b60648201526084016109a4565b80341015610dd75760405162461bcd60e51b81526020600482015260146024820152732737ba103830b4b21032b737bab3b41022aa241760611b60448201526064016109a4565b600e54610100900460ff1615610e53576011546001600160a01b0316610dfd8585611540565b6001600160a01b031614610e535760405162461bcd60e51b815260206004820152601a60248201527f41646472657373206973206e6f7420616c6c6f776c697374656400000000000060448201526064016109a4565b336000908152600d602052604081208054879290610e72908490612f04565b90915550610e829050338661191a565b5050505050565b610ab6838383611990565b6000546001600160a01b03163314610ebe5760405162461bcd60e51b81526004016109a490612e25565b600a55565b6000546001600160a01b03163314610eed5760405162461bcd60e51b81526004016109a490612e25565b60026009541415610f405760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109a4565b6002600955610f4e81611d16565b506001600955565b6000610f6183611360565b8210610fba5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016109a4565b6000610fc560015490565b905060008060005b8381101561106e576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561101f57805192505b876001600160a01b0316836001600160a01b0316141561105b578684141561104d5750935061088892505050565b8361105781613006565b9450505b508061106681613006565b915050610fcd565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b60648201526084016109a4565b6000546001600160a01b031633146110f85760405162461bcd60e51b81526004016109a490612e25565b6002600954141561114b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109a4565b6002600955604051600090339047908381818185875af1925050503d8060008114611192576040519150601f19603f3d011682016040523d82523d6000602084013e611197565b606091505b5050905080610f4e5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b60448201526064016109a4565b610ab68383836040518060200160405280600081525061171b565b600061120160015490565b821061125b5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b60648201526084016109a4565b5090565b6000546001600160a01b031633146112895760405162461bcd60e51b81526004016109a490612e25565b600e805460ff19811660ff90911615179055565b6000546001600160a01b031633146112c75760405162461bcd60e51b81526004016109a490612e25565b610ab66012838361294e565b6000546001600160a01b031633146112fd5760405162461bcd60e51b81526004016109a490612e25565b600c55565b600061130d82611eff565b5192915050565b6000546001600160a01b0316331461133e5760405162461bcd60e51b81526004016109a490612e25565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b0382166113cc5760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084016109a4565b506001600160a01b03166000908152600560205260409020546001600160801b031690565b6000546001600160a01b0316331461141b5760405162461bcd60e51b81526004016109a490612e25565b61142560006120a8565b565b6000546001600160a01b031633146114515760405162461bcd60e51b81526004016109a490612e25565b600b55565b6060600061146383611360565b9050806114845760408051600080825260208201909252905b509392505050565b6000816001600160401b0381111561149e5761149e61308d565b6040519080825280602002602001820160405280156114c7578160200160208202803683370190505b50905060005b8281101561147c576114df8582610f56565b8282815181106114f1576114f1613077565b60209081029190910101528061150681613006565b9150506114cd565b50919050565b604080518082019091526000808252602082015261088882611eff565b60606003805461089d90612fd1565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018390526000908190605c0160405160208183030381529060405280519060200120905061159a81846120f8565b949350505050565b6000546001600160a01b031633146115cc5760405162461bcd60e51b81526004016109a490612e25565b600e805461ff001981166101009182900460ff1615909102179055565b6000546001600160a01b031633146116135760405162461bcd60e51b81526004016109a490612e25565b600f548161162060015490565b61162a9190612f04565b11156116485760405162461bcd60e51b81526004016109a490612e5a565b611652828261191a565b5050565b6001600160a01b0382163314156116af5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c657200000000000060448201526064016109a4565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611726848484611990565b61173284848484612114565b61174e5760405162461bcd60e51b81526004016109a490612e8f565b50505050565b6060611761826001541190565b6117c55760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109a4565b60006117cf612221565b905060008151116117ef576040518060200160405280600081525061181a565b806117f984612230565b60405160200161180a929190612d62565b6040516020818303038152906040525b9392505050565b6000546001600160a01b0316331461184b5760405162461bcd60e51b81526004016109a490612e25565b601055565b6000546001600160a01b0316331461187a5760405162461bcd60e51b81526004016109a490612e25565b6001600160a01b0381166118df5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109a4565b6118e8816120a8565b50565b6000546001600160a01b031633146119155760405162461bcd60e51b81526004016109a490612e25565b600f55565b61165282826040518060200160405280600081525061232d565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061199b82611eff565b80519091506000906001600160a01b0316336001600160a01b031614806119d25750336119c784610abb565b6001600160a01b0316145b806119e4575081516119e49033610793565b905080611a4e5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016109a4565b846001600160a01b031682600001516001600160a01b031614611ac25760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b60648201526084016109a4565b6001600160a01b038416611b265760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016109a4565b611b366000848460000151611934565b6001600160a01b0385166000908152600560205260408120805460019290611b689084906001600160801b0316612f4f565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526005602052604081208054600194509092611bb491859116612ee2565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526004909152948520935184549151909216600160a01b026001600160e01b03199091169190921617179055611c3b846001612f04565b6000818152600460205260409020549091506001600160a01b0316611ccc57611c65816001541190565b15611ccc5760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600490935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b60085481611d665760405162461bcd60e51b815260206004820152601860248201527f7175616e74697479206d757374206265206e6f6e7a65726f000000000000000060448201526064016109a4565b60006001611d748484612f04565b611d7e9190612f77565b9050611dab60017f000000000000000000000000000000000000000000000000000000000000115c612f77565b811115611de057611ddd60017f000000000000000000000000000000000000000000000000000000000000115c612f77565b90505b611deb816001541190565b611e465760405162461bcd60e51b815260206004820152602660248201527f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360448201526506c65616e75760d41b60648201526084016109a4565b815b818111611eeb576000818152600460205260409020546001600160a01b0316611ed9576000611e7682611eff565b60408051808201825282516001600160a01b0390811682526020938401516001600160401b039081168584019081526000888152600490965293909420915182549351909416600160a01b026001600160e01b0319909316931692909217179055505b80611ee381613006565b915050611e48565b50611ef7816001612f04565b600855505050565b6040805180820190915260008082526020820152611f1e826001541190565b611f7d5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b60648201526084016109a4565b60007f00000000000000000000000000000000000000000000000000000000000000148310611fde57611fd07f000000000000000000000000000000000000000000000000000000000000001484612f77565b611fdb906001612f04565b90505b825b818110612047576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561203457949350505050565b508061203f81612fba565b915050611fe0565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b60648201526084016109a4565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008060006121078585612607565b9150915061147c81612677565b60006001600160a01b0384163b1561221657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612158903390899088908890600401612d91565b602060405180830381600087803b15801561217257600080fd5b505af19250505080156121a2575060408051601f3d908101601f1916820190925261219f91810190612c40565b60015b6121fc573d8080156121d0576040519150601f19603f3d011682016040523d82523d6000602084013e6121d5565b606091505b5080516121f45760405162461bcd60e51b81526004016109a490612e8f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061159a565b506001949350505050565b60606012805461089d90612fd1565b6060816122545750506040805180820190915260018152600360fc1b602082015290565b8160005b811561227e578061226881613006565b91506122779050600a83612f1c565b9150612258565b6000816001600160401b038111156122985761229861308d565b6040519080825280601f01601f1916602001820160405280156122c2576020820181803683370190505b5090505b841561159a576122d7600183612f77565b91506122e4600a86613021565b6122ef906030612f04565b60f81b81838151811061230457612304613077565b60200101906001600160f81b031916908160001a905350612326600a86612f1c565b94506122c6565b6001546001600160a01b0384166123905760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016109a4565b61239b816001541190565b156123e85760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e74656400000060448201526064016109a4565b7f00000000000000000000000000000000000000000000000000000000000000148311156124635760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b60648201526084016109a4565b6001600160a01b0384166000908152600560209081526040918290208251808401845290546001600160801b038082168352600160801b90910416918101919091528151808301909252805190919081906124bf908790612ee2565b6001600160801b031681526020018583602001516124dd9190612ee2565b6001600160801b039081169091526001600160a01b0380881660008181526005602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526004909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b858110156125fc5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46125c06000888488612114565b6125dc5760405162461bcd60e51b81526004016109a490612e8f565b816125e681613006565b92505080806125f490613006565b915050612573565b506001819055611d0e565b60008082516041141561263e5760208301516040840151606085015160001a61263287828585612832565b94509450505050612670565b825160401415612668576020830151604084015161265d86838361291f565b935093505050612670565b506000905060025b9250929050565b600081600481111561268b5761268b613061565b14156126945750565b60018160048111156126a8576126a8613061565b14156126f65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016109a4565b600281600481111561270a5761270a613061565b14156127585760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016109a4565b600381600481111561276c5761276c613061565b14156127c55760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016109a4565b60048160048111156127d9576127d9613061565b14156118e85760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016109a4565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156128695750600090506003612916565b8460ff16601b1415801561288157508460ff16601c14155b156128925750600090506004612916565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156128e6573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661290f57600060019250925050612916565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b0161294087828885612832565b935093505050935093915050565b82805461295a90612fd1565b90600052602060002090601f01602090048101928261297c57600085556129c2565b82601f106129955782800160ff198235161785556129c2565b828001600101855582156129c2579182015b828111156129c25782358255916020019190600101906129a7565b5061125b9291505b8082111561125b57600081556001016129ca565b80356001600160a01b03811681146129f557600080fd5b919050565b600082601f830112612a0b57600080fd5b81356001600160401b0380821115612a2557612a2561308d565b604051601f8301601f19908116603f01168101908282118183101715612a4d57612a4d61308d565b81604052838152866020858801011115612a6657600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060208284031215612a9857600080fd5b61181a826129de565b60008060408385031215612ab457600080fd5b612abd836129de565b9150612acb602084016129de565b90509250929050565b600080600060608486031215612ae957600080fd5b612af2846129de565b9250612b00602085016129de565b9150604084013590509250925092565b60008060008060808587031215612b2657600080fd5b612b2f856129de565b9350612b3d602086016129de565b92506040850135915060608501356001600160401b03811115612b5f57600080fd5b612b6b878288016129fa565b91505092959194509250565b60008060408385031215612b8a57600080fd5b612b93836129de565b915060208301358015158114612ba857600080fd5b809150509250929050565b60008060408385031215612bc657600080fd5b612bcf836129de565b946020939093013593505050565b60008060408385031215612bf057600080fd5b8235915060208301356001600160401b03811115612c0d57600080fd5b612c19858286016129fa565b9150509250929050565b600060208284031215612c3557600080fd5b813561181a816130a3565b600060208284031215612c5257600080fd5b815161181a816130a3565b60008060208385031215612c7057600080fd5b82356001600160401b0380821115612c8757600080fd5b818501915085601f830112612c9b57600080fd5b813581811115612caa57600080fd5b866020828501011115612cbc57600080fd5b60209290920196919550909350505050565b600060208284031215612ce057600080fd5b5035919050565b600080600060608486031215612cfc57600080fd5b833592506020840135915060408401356001600160401b03811115612d2057600080fd5b612d2c868287016129fa565b9150509250925092565b60008151808452612d4e816020860160208601612f8e565b601f01601f19169290920160200192915050565b60008351612d74818460208801612f8e565b835190830190612d88818360208801612f8e565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612dc490830184612d36565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612e0657835183529284019291840191600101612dea565b50909695505050505050565b60208152600061181a6020830184612d36565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f43616e206e6f74206d696e74206d6f7265207468616e206d617820746f6b656e604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60006001600160801b03808316818516808303821115612d8857612d88613035565b60008219821115612f1757612f17613035565b500190565b600082612f2b57612f2b61304b565b500490565b6000816000190483118215151615612f4a57612f4a613035565b500290565b60006001600160801b0383811690831681811015612f6f57612f6f613035565b039392505050565b600082821015612f8957612f89613035565b500390565b60005b83811015612fa9578181015183820152602001612f91565b8381111561174e5750506000910152565b600081612fc957612fc9613035565b506000190190565b600181811c90821680612fe557607f821691505b6020821081141561150e57634e487b7160e01b600052602260045260246000fd5b600060001982141561301a5761301a613035565b5060010190565b6000826130305761303061304b565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146118e857600080fdfea26469706673582212201a62db148e814e709a67a76f7987d5c50c75e52ef4d0cc4542d455228f40242b64736f6c63430008070033

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

0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000115c

-----Decoded View---------------
Arg [0] : maxBatchSize_ (uint256): 20
Arg [1] : TotalToken_ (uint256): 4444

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [1] : 000000000000000000000000000000000000000000000000000000000000115c


Deployed Bytecode Sourcemap

48647:4717:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21930:370;;;;;;;;;;-1:-1:-1;21930:370:0;;;;;:::i;:::-;;:::i;:::-;;;7832:14:1;;7825:22;7807:41;;7795:2;7780:18;21930:370:0;;;;;;;;23656:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;50715:574::-;;;;;;:::i;:::-;;:::i;:::-;;24953:204;;;;;;;;;;-1:-1:-1;24953:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6493:32:1;;;6475:51;;6463:2;6448:18;24953:204:0;6329:203:1;24516:379:0;;;;;;;;;;-1:-1:-1;24516:379:0;;;;;:::i;:::-;;:::i;20495:94::-;;;;;;;;;;-1:-1:-1;20571:12:0;;20495:94;;;22215:25:1;;;22203:2;22188:18;20495:94:0;22069:177:1;48894:26:0;;;;;;;;;;-1:-1:-1;48894:26:0;;;;;;;;49940:766;;;;;;:::i;:::-;;:::i;25803:150::-;;;;;;;;;;-1:-1:-1;25803:150:0;;;;;:::i;:::-;;:::i;51895:113::-;;;;;;;;;;-1:-1:-1;51895:113:0;;;;;:::i;:::-;;:::i;52191:118::-;;;;;;;;;;-1:-1:-1;52191:118:0;;;;;:::i;:::-;;:::i;21122:744::-;;;;;;;;;;-1:-1:-1;21122:744:0;;;;;:::i;:::-;;:::i;53182:176::-;;;;;;;;;;;;;:::i;26016:157::-;;;;;;;;;;-1:-1:-1;26016:157:0;;;;;:::i;:::-;;:::i;48839:48::-;;;;;;;;;;-1:-1:-1;48839:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;20658:177;;;;;;;;;;-1:-1:-1;20658:177:0;;;;;:::i;:::-;;:::i;48716:30::-;;;;;;;;;;;;;;;;52015:79;;;;;;;;;;;;;:::i;52350:98::-;;;;;;;;;;-1:-1:-1;52350:98:0;;;;;:::i;:::-;;:::i;49004:25::-;;;;;;;;;;;;;;;;48962:35;;;;;;;;;;;;;;;;51389:105;;;;;;;;;;-1:-1:-1;51389:105:0;;;;;:::i;:::-;;:::i;23479:118::-;;;;;;;;;;-1:-1:-1;23479:118:0;;;;;:::i;:::-;;:::i;51296:87::-;;;;;;;;;;-1:-1:-1;51296:87:0;;;;;:::i;:::-;;:::i;22356:211::-;;;;;;;;;;-1:-1:-1;22356:211:0;;;;;:::i;:::-;;:::i;38235:94::-;;;;;;;;;;;;;:::i;51731:149::-;;;;;;;;;;-1:-1:-1;51731:149:0;;;;;:::i;:::-;;:::i;48803:28::-;;;;;;;;;;;;;;;;52719:456;;;;;;;;;;-1:-1:-1;52719:456:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;37584:87::-;;;;;;;;;;-1:-1:-1;37630:7:0;37657:6;-1:-1:-1;;;;;37657:6:0;37584:87;;48754:39;;;;;;;;;;;;;;;;52566:147;;;;;;;;;;-1:-1:-1;52566:147:0;;;;;:::i;:::-;;:::i;:::-;;;;21934:13:1;;-1:-1:-1;;;;;21930:39:1;21912:58;;22030:4;22018:17;;;22012:24;-1:-1:-1;;;;;22008:49:1;21986:20;;;21979:79;;;;21885:18;52566:147:0;21704:360:1;23811:98:0;;;;;;;;;;;;;:::i;49674:260::-;;;;;;;;;;-1:-1:-1;49674:260:0;;;;;:::i;:::-;;:::i;52100:85::-;;;;;;;;;;;;;:::i;49446:220::-;;;;;;;;;;-1:-1:-1;49446:220:0;;;;;:::i;:::-;;:::i;25221:274::-;;;;;;;;;;-1:-1:-1;25221:274:0;;;;;:::i;:::-;;:::i;48927:28::-;;;;;;;;;;-1:-1:-1;48927:28:0;;;;;;;;;;;26236:319;;;;;;;;;;-1:-1:-1;26236:319:0;;;;;:::i;:::-;;:::i;23972:394::-;;;;;;;;;;-1:-1:-1;23972:394:0;;;;;:::i;:::-;;:::i;30659:43::-;;;;;;;;;;;;;;;;25558:186;;;;;;;;;;-1:-1:-1;25558:186:0;;;;;:::i;:::-;-1:-1:-1;;;;;25703:25:0;;;25680:4;25703:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25558:186;51624:93;;;;;;;;;;-1:-1:-1;51624:93:0;;;;;:::i;:::-;;:::i;38484:192::-;;;;;;;;;;-1:-1:-1;38484:192:0;;;;;:::i;:::-;;:::i;51503:115::-;;;;;;;;;;-1:-1:-1;51503:115:0;;;;;:::i;:::-;;:::i;21930:370::-;22057:4;-1:-1:-1;;;;;;22087:40:0;;-1:-1:-1;;;22087:40:0;;:99;;-1:-1:-1;;;;;;;22138:48:0;;-1:-1:-1;;;22138:48:0;22087:99;:160;;;-1:-1:-1;;;;;;;22197:50:0;;-1:-1:-1;;;22197:50:0;22087:160;:207;;;-1:-1:-1;;;;;;;;;;415:40:0;;;22258:36;22073:221;21930:370;-1:-1:-1;;21930:370:0:o;23656:94::-;23710:13;23739:5;23732:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23656:94;:::o;50715:574::-;50799:10;50773:9;50785:25;;;:13;:25;;;;;;:30;:38;;50822:1;50785:38;;;50818:1;50785:38;50773:50;;;-1:-1:-1;50830:12:0;50856:15;50773:50;50856:10;:15;:::i;:::-;50845:9;;:27;;;;:::i;:::-;50903:10;;50830:42;;-1:-1:-1;50903:10:0;;50895:42;;;;-1:-1:-1;;;50895:42:0;;11835:2:1;50895:42:0;;;11817:21:1;11874:2;11854:18;;;11847:30;-1:-1:-1;;;11893:18:1;;;11886:49;11952:18;;50895:42:0;;;;;;;;;50982:19;;50968:10;50952:13;20571:12;;;20495:94;50952:13;:26;;;;:::i;:::-;:49;;50944:94;;;;-1:-1:-1;;;50944:94:0;;;;;;;:::i;:::-;51070:1;51057:10;:14;:44;;;;;51089:12;;51075:10;:26;;51057:44;51049:89;;;;-1:-1:-1;;;51049:89:0;;14539:2:1;51049:89:0;;;14521:21:1;;;14558:18;;;14551:30;14617:34;14597:18;;;14590:62;14669:18;;51049:89:0;14337:356:1;51049:89:0;51166:4;51153:9;:17;;51145:50;;;;-1:-1:-1;;;51145:50:0;;16812:2:1;51145:50:0;;;16794:21:1;16851:2;16831:18;;;16824:30;-1:-1:-1;;;16870:18:1;;;16863:50;16930:18;;51145:50:0;16610:344:1;51145:50:0;51218:10;51204:25;;;;:13;:25;;;;;:39;;51233:10;;51204:25;:39;;51233:10;;51204:39;:::i;:::-;;;;-1:-1:-1;51250:33:0;;-1:-1:-1;51260:10:0;51272;51250:9;:33::i;:::-;50766:523;;50715:574;:::o;24953:204::-;25021:7;25045:16;25053:7;26881:12;;-1:-1:-1;26871:22:0;26794:105;25045:16;25037:74;;;;-1:-1:-1;;;25037:74:0;;21089:2:1;25037:74:0;;;21071:21:1;21128:2;21108:18;;;21101:30;21167:34;21147:18;;;21140:62;-1:-1:-1;;;21218:18:1;;;21211:43;21271:19;;25037:74:0;20887:409:1;25037:74:0;-1:-1:-1;25127:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25127:24:0;;24953:204::o;24516:379::-;24585:13;24601:24;24617:7;24601:15;:24::i;:::-;24585:40;;24646:5;-1:-1:-1;;;;;24640:11:0;:2;-1:-1:-1;;;;;24640:11:0;;;24632:58;;;;-1:-1:-1;;;24632:58:0;;17161:2:1;24632:58:0;;;17143:21:1;17200:2;17180:18;;;17173:30;17239:34;17219:18;;;17212:62;-1:-1:-1;;;17290:18:1;;;17283:32;17332:19;;24632:58:0;16959:398:1;24632:58:0;14561:10;-1:-1:-1;;;;;24715:21:0;;;;:62;;-1:-1:-1;24740:37:0;24757:5;14561:10;25558:186;:::i;24740:37::-;24699:153;;;;-1:-1:-1;;;24699:153:0;;12538:2:1;24699:153:0;;;12520:21:1;12577:2;12557:18;;;12550:30;12616:34;12596:18;;;12589:62;12687:27;12667:18;;;12660:55;12732:19;;24699:153:0;12336:421:1;24699:153:0;24861:28;24870:2;24874:7;24883:5;24861:8;:28::i;49940:766::-;50063:10;50037:9;50049:25;;;:13;:25;;;;;;:30;:38;;50086:1;50049:38;;;50082:1;50049:38;50037:50;;;-1:-1:-1;50094:12:0;50120:15;50037:50;50120:10;:15;:::i;:::-;50109:9;;:27;;;;:::i;:::-;50167:10;;50094:42;;-1:-1:-1;50167:10:0;;;:26;;-1:-1:-1;50181:12:0;;;;;;;50167:26;50159:58;;;;-1:-1:-1;;;50159:58:0;;11835:2:1;50159:58:0;;;11817:21:1;11874:2;11854:18;;;11847:30;-1:-1:-1;;;11893:18:1;;;11886:49;11952:18;;50159:58:0;11633:343:1;50159:58:0;50262:19;;50248:10;50232:13;20571:12;;;20495:94;50232:13;:26;;;;:::i;:::-;:49;;50224:94;;;;-1:-1:-1;;;50224:94:0;;;;;;;:::i;:::-;50350:1;50337:10;:14;:44;;;;;50369:12;;50355:10;:26;;50337:44;50329:90;;;;-1:-1:-1;;;50329:90:0;;19089:2:1;50329:90:0;;;19071:21:1;19128:2;19108:18;;;19101:30;19167:34;19147:18;;;19140:62;-1:-1:-1;;;19218:18:1;;;19211:31;19259:19;;50329:90:0;18887:397:1;50329:90:0;50447:4;50434:9;:17;;50426:50;;;;-1:-1:-1;;;50426:50:0;;16812:2:1;50426:50:0;;;16794:21:1;16851:2;16831:18;;;16824:30;-1:-1:-1;;;16870:18:1;;;16863:50;16930:18;;50426:50:0;16610:344:1;50426:50:0;50487:12;;;;;;;50483:130;;;50553:7;;-1:-1:-1;;;;;50553:7:0;50519:30;50533:4;50539:9;50519:13;:30::i;:::-;-1:-1:-1;;;;;50519:41:0;;50511:94;;;;-1:-1:-1;;;50511:94:0;;12183:2:1;50511:94:0;;;12165:21:1;12222:2;12202:18;;;12195:30;12261:28;12241:18;;;12234:56;12307:18;;50511:94:0;11981:350:1;50511:94:0;50635:10;50621:25;;;;:13;:25;;;;;:39;;50650:10;;50621:25;:39;;50650:10;;50621:39;:::i;:::-;;;;-1:-1:-1;50667:33:0;;-1:-1:-1;50677:10:0;50689;50667:9;:33::i;:::-;50030:676;;49940:766;;;:::o;25803:150::-;25919:28;25929:4;25935:2;25939:7;25919:9;:28::i;51895:113::-;37630:7;37657:6;-1:-1:-1;;;;;37657:6:0;14561:10;37804:23;37796:68;;;;-1:-1:-1;;;37796:68:0;;;;;;;:::i;:::-;51970:14:::1;:32:::0;51895:113::o;52191:118::-;37630:7;37657:6;-1:-1:-1;;;;;37657:6:0;14561:10;37804:23;37796:68;;;;-1:-1:-1;;;37796:68:0;;;;;;;:::i;:::-;35696:1:::1;36292:7;;:19;;36284:63;;;::::0;-1:-1:-1;;;36284:63:0;;20313:2:1;36284:63:0::1;::::0;::::1;20295:21:1::0;20352:2;20332:18;;;20325:30;20391:33;20371:18;;;20364:61;20442:18;;36284:63:0::1;20111:355:1::0;36284:63:0::1;35696:1;36425:7;:18:::0;52275:28:::2;52294:8:::0;52275:18:::2;:28::i;:::-;-1:-1:-1::0;35652:1:0::1;36604:7;:22:::0;52191:118::o;21122:744::-;21231:7;21266:16;21276:5;21266:9;:16::i;:::-;21258:5;:24;21250:71;;;;-1:-1:-1;;;21250:71:0;;9041:2:1;21250:71:0;;;9023:21:1;9080:2;9060:18;;;9053:30;9119:34;9099:18;;;9092:62;-1:-1:-1;;;9170:18:1;;;9163:32;9212:19;;21250:71:0;8839:398:1;21250:71:0;21328:22;21353:13;20571:12;;;20495:94;21353:13;21328:38;;21373:19;21403:25;21453:9;21448:350;21472:14;21468:1;:18;21448:350;;;21502:31;21536:14;;;:11;:14;;;;;;;;;21502:48;;;;;;;;;-1:-1:-1;;;;;21502:48:0;;;;;-1:-1:-1;;;21502:48:0;;;-1:-1:-1;;;;;21502:48:0;;;;;;;;21563:28;21559:89;;21624:14;;;-1:-1:-1;21559:89:0;21681:5;-1:-1:-1;;;;;21660:26:0;:17;-1:-1:-1;;;;;21660:26:0;;21656:135;;;21718:5;21703:11;:20;21699:59;;;-1:-1:-1;21745:1:0;-1:-1:-1;21738:8:0;;-1:-1:-1;;;21738:8:0;21699:59;21768:13;;;;:::i;:::-;;;;21656:135;-1:-1:-1;21488:3:0;;;;:::i;:::-;;;;21448:350;;;-1:-1:-1;21804:56:0;;-1:-1:-1;;;21804:56:0;;19491:2:1;21804:56:0;;;19473:21:1;19530:2;19510:18;;;19503:30;19569:34;19549:18;;;19542:62;-1:-1:-1;;;19620:18:1;;;19613:44;19674:19;;21804:56:0;19289:410:1;53182:176:0;37630:7;37657:6;-1:-1:-1;;;;;37657:6:0;14561:10;37804:23;37796:68;;;;-1:-1:-1;;;37796:68:0;;;;;;;:::i;:::-;35696:1:::1;36292:7;;:19;;36284:63;;;::::0;-1:-1:-1;;;36284:63:0;;20313:2:1;36284:63:0::1;::::0;::::1;20295:21:1::0;20352:2;20332:18;;;20325:30;20391:33;20371:18;;;20364:61;20442:18;;36284:63:0::1;20111:355:1::0;36284:63:0::1;35696:1;36425:7;:18:::0;53260:49:::2;::::0;53242:12:::2;::::0;53260:10:::2;::::0;53283:21:::2;::::0;53242:12;53260:49;53242:12;53260:49;53283:21;53260:10;:49:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53241:68;;;53324:7;53316:36;;;::::0;-1:-1:-1;;;53316:36:0;;17564:2:1;53316:36:0::2;::::0;::::2;17546:21:1::0;17603:2;17583:18;;;17576:30;-1:-1:-1;;;17622:18:1;;;17615:46;17678:18;;53316:36:0::2;17362:340:1::0;26016:157:0;26128:39;26145:4;26151:2;26155:7;26128:39;;;;;;;;;;;;:16;:39::i;20658:177::-;20725:7;20757:13;20571:12;;;20495:94;20757:13;20749:5;:21;20741:69;;;;-1:-1:-1;;;20741:69:0;;10622:2:1;20741:69:0;;;10604:21:1;10661:2;10641:18;;;10634:30;10700:34;10680:18;;;10673:62;-1:-1:-1;;;10751:18:1;;;10744:33;10794:19;;20741:69:0;10420:399:1;20741:69:0;-1:-1:-1;20824:5:0;20658:177::o;52015:79::-;37630:7;37657:6;-1:-1:-1;;;;;37657:6:0;14561:10;37804:23;37796:68;;;;-1:-1:-1;;;37796:68:0;;;;;;;:::i;:::-;52078:10:::1;::::0;;-1:-1:-1;;52064:24:0;::::1;52078:10;::::0;;::::1;52077:11;52064:24;::::0;;52015:79::o;52350:98::-;37630:7;37657:6;-1:-1:-1;;;;;37657:6:0;14561:10;37804:23;37796:68;;;;-1:-1:-1;;;37796:68:0;;;;;;;:::i;:::-;52421:21:::1;:11;52435:7:::0;;52421:21:::1;:::i;51389:105::-:0;37630:7;37657:6;-1:-1:-1;;;;;37657:6:0;14561:10;37804:23;37796:68;;;;-1:-1:-1;;;37796:68:0;;;;;;;:::i;:::-;51460:12:::1;:28:::0;51389:105::o;23479:118::-;23543:7;23566:20;23578:7;23566:11;:20::i;:::-;:25;;23479:118;-1:-1:-1;;23479:118:0:o;51296:87::-;37630:7;37657:6;-1:-1:-1;;;;;37657:6:0;14561:10;37804:23;37796:68;;;;-1:-1:-1;;;37796:68:0;;;;;;;:::i;:::-;51358:7:::1;:19:::0;;-1:-1:-1;;;;;;51358:19:0::1;-1:-1:-1::0;;;;;51358:19:0;;;::::1;::::0;;;::::1;::::0;;51296:87::o;22356:211::-;22420:7;-1:-1:-1;;;;;22444:19:0;;22436:75;;;;-1:-1:-1;;;22436:75:0;;13317:2:1;22436:75:0;;;13299:21:1;13356:2;13336:18;;;13329:30;13395:34;13375:18;;;13368:62;-1:-1:-1;;;13446:18:1;;;13439:41;13497:19;;22436:75:0;13115:407:1;22436:75:0;-1:-1:-1;;;;;;22533:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;22533:27:0;;22356:211::o;38235:94::-;37630:7;37657:6;-1:-1:-1;;;;;37657:6:0;14561:10;37804:23;37796:68;;;;-1:-1:-1;;;37796:68:0;;;;;;;:::i;:::-;38300:21:::1;38318:1;38300:9;:21::i;:::-;38235:94::o:0;51731:149::-;37630:7;37657:6;-1:-1:-1;;;;;37657:6:0;14561:10;37804:23;37796:68;;;;-1:-1:-1;;;37796:68:0;;;;;;;:::i;:::-;51824:23:::1;:50:::0;51731:149::o;52719:456::-;52780:16;52806:18;52827:17;52837:6;52827:9;:17::i;:::-;52806:38;-1:-1:-1;52855:15:0;52851:319;;52890:16;;;52904:1;52890:16;;;;;;;;;;;-1:-1:-1;52883:23:0;52719:456;-1:-1:-1;;;52719:456:0:o;52851:319::-;52931:23;52971:10;-1:-1:-1;;;;;52957:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52957:25:0;;52931:51;;52993:13;53017:122;53041:10;53033:5;:18;53017:122;;;53093:34;53113:6;53121:5;53093:19;:34::i;:::-;53077:6;53084:5;53077:13;;;;;;;;:::i;:::-;;;;;;;;;;:50;53053:7;;;;:::i;:::-;;;;53017:122;;52851:319;52799:376;52719:456;;;:::o;52566:147::-;-1:-1:-1;;;;;;;;;;;;;;;;;52687:20:0;52699:7;52687:11;:20::i;23811:98::-;23867:13;23896:7;23889:14;;;;;:::i;49674:260::-;49810:58;;5976:66:1;49810:58:0;;;5964:79:1;6059:12;;;6052:28;;;49756:7:0;;;;6096:12:1;;49810:58:0;;;;;;;;;;;;49800:69;;;;;;49776:93;;49887:39;49901:13;49916:9;49887:13;:39::i;:::-;49880:46;49674:260;-1:-1:-1;;;;49674:260:0:o;52100:85::-;37630:7;37657:6;-1:-1:-1;;;;;37657:6:0;14561:10;37804:23;37796:68;;;;-1:-1:-1;;;37796:68:0;;;;;;;:::i;:::-;52167:12:::1;::::0;;-1:-1:-1;;52151:28:0;::::1;52167:12;::::0;;;::::1;;;52166:13;52151:28:::0;;::::1;;::::0;;52100:85::o;49446:220::-;37630:7;37657:6;-1:-1:-1;;;;;37657:6:0;14561:10;37804:23;37796:68;;;;-1:-1:-1;;;37796:68:0;;;;;;;:::i;:::-;49569:19:::1;;49555:10;49539:13;20571:12:::0;;;20495:94;49539:13:::1;:26;;;;:::i;:::-;:49;;49531:94;;;;-1:-1:-1::0;;;49531:94:0::1;;;;;;;:::i;:::-;49634:26;49644:3;49649:10;49634:9;:26::i;:::-;49446:220:::0;;:::o;25221:274::-;-1:-1:-1;;;;;25312:24:0;;14561:10;25312:24;;25304:63;;;;-1:-1:-1;;;25304:63:0;;16038:2:1;25304:63:0;;;16020:21:1;16077:2;16057:18;;;16050:30;16116:28;16096:18;;;16089:56;16162:18;;25304:63:0;15836:350:1;25304:63:0;14561:10;25376:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;25376:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;25376:53:0;;;;;;;;;;25441:48;;7807:41:1;;;25376:42:0;;14561:10;25441:48;;7780:18:1;25441:48:0;;;;;;;25221:274;;:::o;26236:319::-;26381:28;26391:4;26397:2;26401:7;26381:9;:28::i;:::-;26432:48;26455:4;26461:2;26465:7;26474:5;26432:22;:48::i;:::-;26416:133;;;;-1:-1:-1;;;26416:133:0;;;;;;;:::i;:::-;26236:319;;;;:::o;23972:394::-;24070:13;24111:16;24119:7;26881:12;;-1:-1:-1;26871:22:0;26794:105;24111:16;24095:97;;;;-1:-1:-1;;;24095:97:0;;15622:2:1;24095:97:0;;;15604:21:1;15661:2;15641:18;;;15634:30;15700:34;15680:18;;;15673:62;-1:-1:-1;;;15751:18:1;;;15744:45;15806:19;;24095:97:0;15420:411:1;24095:97:0;24201:21;24225:10;:8;:10::i;:::-;24201:34;;24280:1;24262:7;24256:21;:25;:104;;;;;;;;;;;;;;;;;24317:7;24326:18;:7;:16;:18::i;:::-;24300:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24256:104;24242:118;23972:394;-1:-1:-1;;;23972:394:0:o;51624:93::-;37630:7;37657:6;-1:-1:-1;;;;;37657:6:0;14561:10;37804:23;37796:68;;;;-1:-1:-1;;;37796:68:0;;;;;;;:::i;:::-;51689:9:::1;:22:::0;51624:93::o;38484:192::-;37630:7;37657:6;-1:-1:-1;;;;;37657:6:0;14561:10;37804:23;37796:68;;;;-1:-1:-1;;;37796:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38573:22:0;::::1;38565:73;;;::::0;-1:-1:-1;;;38565:73:0;;9804:2:1;38565:73:0::1;::::0;::::1;9786:21:1::0;9843:2;9823:18;;;9816:30;9882:34;9862:18;;;9855:62;-1:-1:-1;;;9933:18:1;;;9926:36;9979:19;;38565:73:0::1;9602:402:1::0;38565:73:0::1;38649:19;38659:8;38649:9;:19::i;:::-;38484:192:::0;:::o;51503:115::-;37630:7;37657:6;-1:-1:-1;;;;;37657:6:0;14561:10;37804:23;37796:68;;;;-1:-1:-1;;;37796:68:0;;;;;;;:::i;:::-;51579:19:::1;:33:::0;51503:115::o;26905:98::-;26970:27;26980:2;26984:8;26970:27;;;;;;;;;;;;:9;:27::i;30481:172::-;30578:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;30578:29:0;-1:-1:-1;;;;;30578:29:0;;;;;;;;;30619:28;;30578:24;;30619:28;;;;;;;30481:172;;;:::o;28846:1529::-;28943:35;28981:20;28993:7;28981:11;:20::i;:::-;29052:18;;28943:58;;-1:-1:-1;29010:22:0;;-1:-1:-1;;;;;29036:34:0;14561:10;-1:-1:-1;;;;;29036:34:0;;:81;;;-1:-1:-1;14561:10:0;29081:20;29093:7;29081:11;:20::i;:::-;-1:-1:-1;;;;;29081:36:0;;29036:81;:142;;;-1:-1:-1;29145:18:0;;29128:50;;14561:10;25558:186;:::i;29128:50::-;29010:169;;29204:17;29188:101;;;;-1:-1:-1;;;29188:101:0;;16393:2:1;29188:101:0;;;16375:21:1;16432:2;16412:18;;;16405:30;16471:34;16451:18;;;16444:62;-1:-1:-1;;;16522:18:1;;;16515:48;16580:19;;29188:101:0;16191:414:1;29188:101:0;29336:4;-1:-1:-1;;;;;29314:26:0;:13;:18;;;-1:-1:-1;;;;;29314:26:0;;29298:98;;;;-1:-1:-1;;;29298:98:0;;14132:2:1;29298:98:0;;;14114:21:1;14171:2;14151:18;;;14144:30;14210:34;14190:18;;;14183:62;-1:-1:-1;;;14261:18:1;;;14254:36;14307:19;;29298:98:0;13930:402:1;29298:98:0;-1:-1:-1;;;;;29411:16:0;;29403:66;;;;-1:-1:-1;;;29403:66:0;;11026:2:1;29403:66:0;;;11008:21:1;11065:2;11045:18;;;11038:30;11104:34;11084:18;;;11077:62;-1:-1:-1;;;11155:18:1;;;11148:35;11200:19;;29403:66:0;10824:401:1;29403:66:0;29578:49;29595:1;29599:7;29608:13;:18;;;29578:8;:49::i;:::-;-1:-1:-1;;;;;29636:18:0;;;;;;:12;:18;;;;;:31;;29666:1;;29636:18;:31;;29666:1;;-1:-1:-1;;;;;29636:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;29636:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;29674:16:0;;-1:-1:-1;29674:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;29674:16:0;;:29;;-1:-1:-1;;29674:29:0;;:::i;:::-;;;-1:-1:-1;;;;;29674:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29733:43:0;;;;;;;;-1:-1:-1;;;;;29733:43:0;;;;;-1:-1:-1;;;;;29759:15:0;29733:43;;;;;;;;;-1:-1:-1;29710:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;29710:66:0;-1:-1:-1;;;;;;29710:66:0;;;;;;;;;;;30026:11;29722:7;-1:-1:-1;30026:11:0;:::i;:::-;30089:1;30048:24;;;:11;:24;;;;;:29;30004:33;;-1:-1:-1;;;;;;30048:29:0;30044:236;;30106:20;30114:11;26881:12;;-1:-1:-1;26871:22:0;26794:105;30106:20;30102:171;;;30166:97;;;;;;;;30193:18;;-1:-1:-1;;;;;30166:97:0;;;;;;30224:28;;;;-1:-1:-1;;;;;30166:97:0;;;;;;;;;-1:-1:-1;30139:24:0;;;:11;:24;;;;;;;:124;;;;;;;;;-1:-1:-1;;;30139:124:0;-1:-1:-1;;;;;;30139:124:0;;;;;;;;;;;;30102:171;30312:7;30308:2;-1:-1:-1;;;;;30293:27:0;30302:4;-1:-1:-1;;;;;30293:27:0;;;;;;;;;;;30327:42;28936:1439;;;28846:1529;;;:::o;30807:838::-;30897:24;;30936:12;30928:49;;;;-1:-1:-1;;;30928:49:0;;12964:2:1;30928:49:0;;;12946:21:1;13003:2;12983:18;;;12976:30;13042:26;13022:18;;;13015:54;13086:18;;30928:49:0;12762:348:1;30928:49:0;30984:16;31034:1;31003:28;31023:8;31003:17;:28;:::i;:::-;:32;;;;:::i;:::-;30984:51;-1:-1:-1;31057:14:0;31070:1;31057:10;:14;:::i;:::-;31046:8;:25;31042:73;;;31093:14;31106:1;31093:10;:14;:::i;:::-;31082:25;;31042:73;31230:17;31238:8;26881:12;;-1:-1:-1;26871:22:0;26794:105;31230:17;31222:68;;;;-1:-1:-1;;;31222:68:0;;19906:2:1;31222:68:0;;;19888:21:1;19945:2;19925:18;;;19918:30;19984:34;19964:18;;;19957:62;-1:-1:-1;;;20035:18:1;;;20028:36;20081:19;;31222:68:0;19704:402:1;31222:68:0;31314:17;31297:297;31338:8;31333:1;:13;31297:297;;31397:1;31366:14;;;:11;:14;;;;;:19;-1:-1:-1;;;;;31366:19:0;31362:225;;31412:31;31446:14;31458:1;31446:11;:14::i;:::-;31488:89;;;;;;;;31515:14;;-1:-1:-1;;;;;31488:89:0;;;;;;31542:24;;;;-1:-1:-1;;;;;31488:89:0;;;;;;;;;-1:-1:-1;31471:14:0;;;:11;:14;;;;;;;:106;;;;;;;;;-1:-1:-1;;;31471:106:0;-1:-1:-1;;;;;;31471:106:0;;;;;;;;;;;;-1:-1:-1;31362:225:0;31348:3;;;;:::i;:::-;;;;31297:297;;;-1:-1:-1;31627:12:0;:8;31638:1;31627:12;:::i;:::-;31600:24;:39;-1:-1:-1;;;30807:838:0:o;22819:606::-;-1:-1:-1;;;;;;;;;;;;;;;;;22936:16:0;22944:7;26881:12;;-1:-1:-1;26871:22:0;26794:105;22936:16;22928:71;;;;-1:-1:-1;;;22928:71:0;;10211:2:1;22928:71:0;;;10193:21:1;10250:2;10230:18;;;10223:30;10289:34;10269:18;;;10262:62;-1:-1:-1;;;10340:18:1;;;10333:40;10390:19;;22928:71:0;10009:406:1;22928:71:0;23008:26;23056:12;23045:7;:23;23041:93;;23100:22;23110:12;23100:7;:22;:::i;:::-;:26;;23125:1;23100:26;:::i;:::-;23079:47;;23041:93;23162:7;23142:212;23179:18;23171:4;:26;23142:212;;23216:31;23250:17;;;:11;:17;;;;;;;;;23216:51;;;;;;;;;-1:-1:-1;;;;;23216:51:0;;;;;-1:-1:-1;;;23216:51:0;;;-1:-1:-1;;;;;23216:51:0;;;;;;;;23280:28;23276:71;;23328:9;22819:606;-1:-1:-1;;;;22819:606:0:o;23276:71::-;-1:-1:-1;23199:6:0;;;;:::i;:::-;;;;23142:212;;;-1:-1:-1;23362:57:0;;-1:-1:-1;;;23362:57:0;;20673:2:1;23362:57:0;;;20655:21:1;20712:2;20692:18;;;20685:30;20751:34;20731:18;;;20724:62;-1:-1:-1;;;20802:18:1;;;20795:45;20857:19;;23362:57:0;20471:411:1;38684:173:0;38740:16;38759:6;;-1:-1:-1;;;;;38776:17:0;;;-1:-1:-1;;;;;;38776:17:0;;;;;;38809:40;;38759:6;;;;;;;38809:40;;38740:16;38809:40;38729:128;38684:173;:::o;43454:231::-;43532:7;43553:17;43572:18;43594:27;43605:4;43611:9;43594:10;:27::i;:::-;43552:69;;;;43632:18;43644:5;43632:11;:18::i;32188:690::-;32325:4;-1:-1:-1;;;;;32342:13:0;;1501:20;1549:8;32338:535;;32381:72;;-1:-1:-1;;;32381:72:0;;-1:-1:-1;;;;;32381:36:0;;;;;:72;;14561:10;;32432:4;;32438:7;;32447:5;;32381:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32381:72:0;;;;;;;;-1:-1:-1;;32381:72:0;;;;;;;;;;;;:::i;:::-;;;32368:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32612:13:0;;32608:215;;32645:61;;-1:-1:-1;;;32645:61:0;;;;;;;:::i;32608:215::-;32791:6;32785:13;32776:6;32772:2;32768:15;32761:38;32368:464;-1:-1:-1;;;;;;32503:55:0;-1:-1:-1;;;32503:55:0;;-1:-1:-1;32496:62:0;;32338:535;-1:-1:-1;32861:4:0;32188:690;;;;;;:::o;52454:106::-;52514:13;52543:11;52536:18;;;;;:::i;14948:723::-;15004:13;15225:10;15221:53;;-1:-1:-1;;15252:10:0;;;;;;;;;;;;-1:-1:-1;;;15252:10:0;;;;;14948:723::o;15221:53::-;15299:5;15284:12;15340:78;15347:9;;15340:78;;15373:8;;;;:::i;:::-;;-1:-1:-1;15396:10:0;;-1:-1:-1;15404:2:0;15396:10;;:::i;:::-;;;15340:78;;;15428:19;15460:6;-1:-1:-1;;;;;15450:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15450:17:0;;15428:39;;15478:154;15485:10;;15478:154;;15512:11;15522:1;15512:11;;:::i;:::-;;-1:-1:-1;15581:10:0;15589:2;15581:5;:10;:::i;:::-;15568:24;;:2;:24;:::i;:::-;15555:39;;15538:6;15545;15538:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;15538:56:0;;;;;;;;-1:-1:-1;15609:11:0;15618:2;15609:11;;:::i;:::-;;;15478:154;;27342:1272;27470:12;;-1:-1:-1;;;;;27497:16:0;;27489:62;;;;-1:-1:-1;;;27489:62:0;;18687:2:1;27489:62:0;;;18669:21:1;18726:2;18706:18;;;18699:30;18765:34;18745:18;;;18738:62;-1:-1:-1;;;18816:18:1;;;18809:31;18857:19;;27489:62:0;18485:397:1;27489:62:0;27688:21;27696:12;26881;;-1:-1:-1;26871:22:0;26794:105;27688:21;27687:22;27679:64;;;;-1:-1:-1;;;27679:64:0;;18329:2:1;27679:64:0;;;18311:21:1;18368:2;18348:18;;;18341:30;18407:31;18387:18;;;18380:59;18456:18;;27679:64:0;18127:353:1;27679:64:0;27770:12;27758:8;:24;;27750:71;;;;-1:-1:-1;;;27750:71:0;;21503:2:1;27750:71:0;;;21485:21:1;21542:2;21522:18;;;21515:30;21581:34;21561:18;;;21554:62;-1:-1:-1;;;21632:18:1;;;21625:32;21674:19;;27750:71:0;21301:398:1;27750:71:0;-1:-1:-1;;;;;27933:16:0;;27900:30;27933:16;;;:12;:16;;;;;;;;;27900:49;;;;;;;;;-1:-1:-1;;;;;27900:49:0;;;;;-1:-1:-1;;;27900:49:0;;;;;;;;;;;27975:119;;;;;;;;27995:19;;27900:49;;27975:119;;;27995:39;;28025:8;;27995:39;:::i;:::-;-1:-1:-1;;;;;27975:119:0;;;;;28078:8;28043:11;:24;;;:44;;;;:::i;:::-;-1:-1:-1;;;;;27975:119:0;;;;;;-1:-1:-1;;;;;27956:16:0;;;;;;;:12;:16;;;;;;;;:138;;;;;;;;-1:-1:-1;;;27956:138:0;;;;;;;;;;;;28129:43;;;;;;;;;;-1:-1:-1;;;;;28155:15:0;28129:43;;;;;;;;28101:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;28101:71:0;-1:-1:-1;;;;;;28101:71:0;;;;;;;;;;;;;;;;;;28113:12;;28225:281;28249:8;28245:1;:12;28225:281;;;28278:38;;28303:12;;-1:-1:-1;;;;;28278:38:0;;;28295:1;;28278:38;;28295:1;;28278:38;28343:59;28374:1;28378:2;28382:12;28396:5;28343:22;:59::i;:::-;28325:150;;;;-1:-1:-1;;;28325:150:0;;;;;;;:::i;:::-;28484:14;;;;:::i;:::-;;;;28259:3;;;;;:::i;:::-;;;;28225:281;;;-1:-1:-1;28514:12:0;:27;;;28548:60;26236:319;41344:1308;41425:7;41434:12;41659:9;:16;41679:2;41659:22;41655:990;;;41955:4;41940:20;;41934:27;42005:4;41990:20;;41984:27;42063:4;42048:20;;42042:27;41698:9;42034:36;42106:25;42117:4;42034:36;41934:27;41984;42106:10;:25::i;:::-;42099:32;;;;;;;;;41655:990;42153:9;:16;42173:2;42153:22;42149:496;;;42428:4;42413:20;;42407:27;42479:4;42464:20;;42458:27;42521:23;42532:4;42407:27;42458;42521:10;:23::i;:::-;42514:30;;;;;;;;42149:496;-1:-1:-1;42593:1:0;;-1:-1:-1;42597:35:0;42149:496;41344:1308;;;;;:::o;39615:643::-;39693:20;39684:5;:29;;;;;;;;:::i;:::-;;39680:571;;;39615:643;:::o;39680:571::-;39791:29;39782:5;:38;;;;;;;;:::i;:::-;;39778:473;;;39837:34;;-1:-1:-1;;;39837:34:0;;8688:2:1;39837:34:0;;;8670:21:1;8727:2;8707:18;;;8700:30;8766:26;8746:18;;;8739:54;8810:18;;39837:34:0;8486:348:1;39778:473:0;39902:35;39893:5;:44;;;;;;;;:::i;:::-;;39889:362;;;39954:41;;-1:-1:-1;;;39954:41:0;;9444:2:1;39954:41:0;;;9426:21:1;9483:2;9463:18;;;9456:30;9522:33;9502:18;;;9495:61;9573:18;;39954:41:0;9242:355:1;39889:362:0;40026:30;40017:5;:39;;;;;;;;:::i;:::-;;40013:238;;;40073:44;;-1:-1:-1;;;40073:44:0;;11432:2:1;40073:44:0;;;11414:21:1;11471:2;11451:18;;;11444:30;11510:34;11490:18;;;11483:62;-1:-1:-1;;;11561:18:1;;;11554:32;11603:19;;40073:44:0;11230:398:1;40013:238:0;40148:30;40139:5;:39;;;;;;;;:::i;:::-;;40135:116;;;40195:44;;-1:-1:-1;;;40195:44:0;;13729:2:1;40195:44:0;;;13711:21:1;13768:2;13748:18;;;13741:30;13807:34;13787:18;;;13780:62;-1:-1:-1;;;13858:18:1;;;13851:32;13900:19;;40195:44:0;13527:398:1;44953:1632:0;45084:7;;46018:66;46005:79;;46001:163;;;-1:-1:-1;46117:1:0;;-1:-1:-1;46121:30:0;46101:51;;46001:163;46178:1;:7;;46183:2;46178:7;;:18;;;;;46189:1;:7;;46194:2;46189:7;;46178:18;46174:102;;;-1:-1:-1;46229:1:0;;-1:-1:-1;46233:30:0;46213:51;;46174:102;46390:24;;;46373:14;46390:24;;;;;;;;;8086:25:1;;;8159:4;8147:17;;8127:18;;;8120:45;;;;8181:18;;;8174:34;;;8224:18;;;8217:34;;;46390:24:0;;8058:19:1;;46390:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46390:24:0;;-1:-1:-1;;46390:24:0;;;-1:-1:-1;;;;;;;46429:20:0;;46425:103;;46482:1;46486:29;46466:50;;;;;;;46425:103;46548:6;-1:-1:-1;46556:20:0;;-1:-1:-1;44953:1632:0;;;;;;;;:::o;43948:391::-;44062:7;;-1:-1:-1;;;;;44163:75:0;;44265:3;44261:12;;;44275:2;44257:21;44306:25;44317:4;44257:21;44326:1;44163:75;44306:10;:25::i;:::-;44299:32;;;;;;43948:391;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:718::-;234:5;287:3;280:4;272:6;268:17;264:27;254:55;;305:1;302;295:12;254:55;341:6;328:20;-1:-1:-1;;;;;404:2:1;400;397:10;394:36;;;410:18;;:::i;:::-;485:2;479:9;453:2;539:13;;-1:-1:-1;;535:22:1;;;559:2;531:31;527:40;515:53;;;583:18;;;603:22;;;580:46;577:72;;;629:18;;:::i;:::-;669:10;665:2;658:22;704:2;696:6;689:18;750:3;743:4;738:2;730:6;726:15;722:26;719:35;716:55;;;767:1;764;757:12;716:55;831:2;824:4;816:6;812:17;805:4;797:6;793:17;780:54;878:1;871:4;866:2;858:6;854:15;850:26;843:37;898:6;889:15;;;;;;192:718;;;;:::o;915:186::-;974:6;1027:2;1015:9;1006:7;1002:23;998:32;995:52;;;1043:1;1040;1033:12;995:52;1066:29;1085:9;1066:29;:::i;1106:260::-;1174:6;1182;1235:2;1223:9;1214:7;1210:23;1206:32;1203:52;;;1251:1;1248;1241:12;1203:52;1274:29;1293:9;1274:29;:::i;:::-;1264:39;;1322:38;1356:2;1345:9;1341:18;1322:38;:::i;:::-;1312:48;;1106:260;;;;;:::o;1371:328::-;1448:6;1456;1464;1517:2;1505:9;1496:7;1492:23;1488:32;1485:52;;;1533:1;1530;1523:12;1485:52;1556:29;1575:9;1556:29;:::i;:::-;1546:39;;1604:38;1638:2;1627:9;1623:18;1604:38;:::i;:::-;1594:48;;1689:2;1678:9;1674:18;1661:32;1651:42;;1371:328;;;;;:::o;1704:537::-;1799:6;1807;1815;1823;1876:3;1864:9;1855:7;1851:23;1847:33;1844:53;;;1893:1;1890;1883:12;1844:53;1916:29;1935:9;1916:29;:::i;:::-;1906:39;;1964:38;1998:2;1987:9;1983:18;1964:38;:::i;:::-;1954:48;;2049:2;2038:9;2034:18;2021:32;2011:42;;2104:2;2093:9;2089:18;2076:32;-1:-1:-1;;;;;2123:6:1;2120:30;2117:50;;;2163:1;2160;2153:12;2117:50;2186:49;2227:7;2218:6;2207:9;2203:22;2186:49;:::i;:::-;2176:59;;;1704:537;;;;;;;:::o;2246:347::-;2311:6;2319;2372:2;2360:9;2351:7;2347:23;2343:32;2340:52;;;2388:1;2385;2378:12;2340:52;2411:29;2430:9;2411:29;:::i;:::-;2401:39;;2490:2;2479:9;2475:18;2462:32;2537:5;2530:13;2523:21;2516:5;2513:32;2503:60;;2559:1;2556;2549:12;2503:60;2582:5;2572:15;;;2246:347;;;;;:::o;2598:254::-;2666:6;2674;2727:2;2715:9;2706:7;2702:23;2698:32;2695:52;;;2743:1;2740;2733:12;2695:52;2766:29;2785:9;2766:29;:::i;:::-;2756:39;2842:2;2827:18;;;;2814:32;;-1:-1:-1;;;2598:254:1:o;2857:388::-;2934:6;2942;2995:2;2983:9;2974:7;2970:23;2966:32;2963:52;;;3011:1;3008;3001:12;2963:52;3047:9;3034:23;3024:33;;3108:2;3097:9;3093:18;3080:32;-1:-1:-1;;;;;3127:6:1;3124:30;3121:50;;;3167:1;3164;3157:12;3121:50;3190:49;3231:7;3222:6;3211:9;3207:22;3190:49;:::i;:::-;3180:59;;;2857:388;;;;;:::o;3250:245::-;3308:6;3361:2;3349:9;3340:7;3336:23;3332:32;3329:52;;;3377:1;3374;3367:12;3329:52;3416:9;3403:23;3435:30;3459:5;3435:30;:::i;3500:249::-;3569:6;3622:2;3610:9;3601:7;3597:23;3593:32;3590:52;;;3638:1;3635;3628:12;3590:52;3670:9;3664:16;3689:30;3713:5;3689:30;:::i;3754:592::-;3825:6;3833;3886:2;3874:9;3865:7;3861:23;3857:32;3854:52;;;3902:1;3899;3892:12;3854:52;3942:9;3929:23;-1:-1:-1;;;;;4012:2:1;4004:6;4001:14;3998:34;;;4028:1;4025;4018:12;3998:34;4066:6;4055:9;4051:22;4041:32;;4111:7;4104:4;4100:2;4096:13;4092:27;4082:55;;4133:1;4130;4123:12;4082:55;4173:2;4160:16;4199:2;4191:6;4188:14;4185:34;;;4215:1;4212;4205:12;4185:34;4260:7;4255:2;4246:6;4242:2;4238:15;4234:24;4231:37;4228:57;;;4281:1;4278;4271:12;4228:57;4312:2;4304:11;;;;;4334:6;;-1:-1:-1;3754:592:1;;-1:-1:-1;;;;3754:592:1:o;4351:180::-;4410:6;4463:2;4451:9;4442:7;4438:23;4434:32;4431:52;;;4479:1;4476;4469:12;4431:52;-1:-1:-1;4502:23:1;;4351:180;-1:-1:-1;4351:180:1:o;4536:456::-;4622:6;4630;4638;4691:2;4679:9;4670:7;4666:23;4662:32;4659:52;;;4707:1;4704;4697:12;4659:52;4743:9;4730:23;4720:33;;4800:2;4789:9;4785:18;4772:32;4762:42;;4855:2;4844:9;4840:18;4827:32;-1:-1:-1;;;;;4874:6:1;4871:30;4868:50;;;4914:1;4911;4904:12;4868:50;4937:49;4978:7;4969:6;4958:9;4954:22;4937:49;:::i;:::-;4927:59;;;4536:456;;;;;:::o;4997:257::-;5038:3;5076:5;5070:12;5103:6;5098:3;5091:19;5119:63;5175:6;5168:4;5163:3;5159:14;5152:4;5145:5;5141:16;5119:63;:::i;:::-;5236:2;5215:15;-1:-1:-1;;5211:29:1;5202:39;;;;5243:4;5198:50;;4997:257;-1:-1:-1;;4997:257:1:o;5259:470::-;5438:3;5476:6;5470:13;5492:53;5538:6;5533:3;5526:4;5518:6;5514:17;5492:53;:::i;:::-;5608:13;;5567:16;;;;5630:57;5608:13;5567:16;5664:4;5652:17;;5630:57;:::i;:::-;5703:20;;5259:470;-1:-1:-1;;;;5259:470:1:o;6537:488::-;-1:-1:-1;;;;;6806:15:1;;;6788:34;;6858:15;;6853:2;6838:18;;6831:43;6905:2;6890:18;;6883:34;;;6953:3;6948:2;6933:18;;6926:31;;;6731:4;;6974:45;;6999:19;;6991:6;6974:45;:::i;:::-;6966:53;6537:488;-1:-1:-1;;;;;;6537:488:1:o;7030:632::-;7201:2;7253:21;;;7323:13;;7226:18;;;7345:22;;;7172:4;;7201:2;7424:15;;;;7398:2;7383:18;;;7172:4;7467:169;7481:6;7478:1;7475:13;7467:169;;;7542:13;;7530:26;;7611:15;;;;7576:12;;;;7503:1;7496:9;7467:169;;;-1:-1:-1;7653:3:1;;7030:632;-1:-1:-1;;;;;;7030:632:1:o;8262:219::-;8411:2;8400:9;8393:21;8374:4;8431:44;8471:2;8460:9;8456:18;8448:6;8431:44;:::i;14698:356::-;14900:2;14882:21;;;14919:18;;;14912:30;14978:34;14973:2;14958:18;;14951:62;15045:2;15030:18;;14698:356::o;15059:::-;15261:2;15243:21;;;15280:18;;;15273:30;15339:34;15334:2;15319:18;;15312:62;15406:2;15391:18;;15059:356::o;17707:415::-;17909:2;17891:21;;;17948:2;17928:18;;;17921:30;17987:34;17982:2;17967:18;;17960:62;-1:-1:-1;;;18053:2:1;18038:18;;18031:49;18112:3;18097:19;;17707:415::o;22251:253::-;22291:3;-1:-1:-1;;;;;22380:2:1;22377:1;22373:10;22410:2;22407:1;22403:10;22441:3;22437:2;22433:12;22428:3;22425:21;22422:47;;;22449:18;;:::i;22509:128::-;22549:3;22580:1;22576:6;22573:1;22570:13;22567:39;;;22586:18;;:::i;:::-;-1:-1:-1;22622:9:1;;22509:128::o;22642:120::-;22682:1;22708;22698:35;;22713:18;;:::i;:::-;-1:-1:-1;22747:9:1;;22642:120::o;22767:168::-;22807:7;22873:1;22869;22865:6;22861:14;22858:1;22855:21;22850:1;22843:9;22836:17;22832:45;22829:71;;;22880:18;;:::i;:::-;-1:-1:-1;22920:9:1;;22767:168::o;22940:246::-;22980:4;-1:-1:-1;;;;;23093:10:1;;;;23063;;23115:12;;;23112:38;;;23130:18;;:::i;:::-;23167:13;;22940:246;-1:-1:-1;;;22940:246:1:o;23191:125::-;23231:4;23259:1;23256;23253:8;23250:34;;;23264:18;;:::i;:::-;-1:-1:-1;23301:9:1;;23191:125::o;23321:258::-;23393:1;23403:113;23417:6;23414:1;23411:13;23403:113;;;23493:11;;;23487:18;23474:11;;;23467:39;23439:2;23432:10;23403:113;;;23534:6;23531:1;23528:13;23525:48;;;-1:-1:-1;;23569:1:1;23551:16;;23544:27;23321:258::o;23584:136::-;23623:3;23651:5;23641:39;;23660:18;;:::i;:::-;-1:-1:-1;;;23696:18:1;;23584:136::o;23725:380::-;23804:1;23800:12;;;;23847;;;23868:61;;23922:4;23914:6;23910:17;23900:27;;23868:61;23975:2;23967:6;23964:14;23944:18;23941:38;23938:161;;;24021:10;24016:3;24012:20;24009:1;24002:31;24056:4;24053:1;24046:15;24084:4;24081:1;24074:15;24110:135;24149:3;-1:-1:-1;;24170:17:1;;24167:43;;;24190:18;;:::i;:::-;-1:-1:-1;24237:1:1;24226:13;;24110:135::o;24250:112::-;24282:1;24308;24298:35;;24313:18;;:::i;:::-;-1:-1:-1;24347:9:1;;24250:112::o;24367:127::-;24428:10;24423:3;24419:20;24416:1;24409:31;24459:4;24456:1;24449:15;24483:4;24480:1;24473:15;24499:127;24560:10;24555:3;24551:20;24548:1;24541:31;24591:4;24588:1;24581:15;24615:4;24612:1;24605:15;24631:127;24692:10;24687:3;24683:20;24680:1;24673:31;24723:4;24720:1;24713:15;24747:4;24744:1;24737:15;24763:127;24824:10;24819:3;24815:20;24812:1;24805:31;24855:4;24852:1;24845:15;24879:4;24876:1;24869:15;24895:127;24956:10;24951:3;24947:20;24944:1;24937:31;24987:4;24984:1;24977:15;25011:4;25008:1;25001:15;25027:131;-1:-1:-1;;;;;;25101:32:1;;25091:43;;25081:71;;25148:1;25145;25138:12

Swarm Source

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