ETH Price: $3,180.40 (+3.05%)

Token

2545 (2545)
 

Overview

Max Total Supply

9,997 2545

Holders

2,927

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 2545
0x4151dfd4ceb31fb6b6b0dd925c88b378eeaa4623
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Made from 120 hand-drawn features, 2545 is a generative art NFT collection of 9,999 unique characters set in the year 2545 AD.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
TwentyFiveFF

Compiler Version
v0.8.5+commit.a4f2e591

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
// File: contracts/utils/introspection/IERC165.sol


pragma solidity ^0.8.0;

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

// File: ../token/IERC721.sol



pragma solidity ^0.8.0;


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

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

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

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

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

  /**
   * @dev Safely transfers `tokenId` token from `from` to `to`, 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;
}

// File: ../token/IERC721Receiver.sol



pragma solidity ^0.8.0;

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

// File: ../token/extensions/IERC721Metadata.sol



pragma solidity ^0.8.0;


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

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

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

// File: contracts/utils/Address.sol



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);
      }
    }
  }
}

// File: contracts/utils/Context.sol



pragma solidity ^0.8.0;

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

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

// File: contracts/utils/Strings.sol



pragma solidity ^0.8.0;

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

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

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

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

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

// File: contracts/utils/introspection/ERC165.sol



pragma solidity ^0.8.0;


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

// File: ../token/ERC721.sol



pragma solidity ^0.8.0;








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

  // Token name
  string private _name;

  // Token symbol
  string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    _approve(to, tokenId);
  }

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

    return _tokenApprovals[tokenId];
  }

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

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

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

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

    _transfer(from, to, tokenId);
  }

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

  /**
   * @dev See {IERC721-safeTransferFrom}.
   */
  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) public virtual override {
    require(
      _isApprovedOrOwner(_msgSender(), tokenId),
      'ERC721: transfer caller is not owner nor approved'
    );
    _safeTransfer(from, to, tokenId, _data);
  }

  /**
   * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
   * are aware of the ERC721 protocol to prevent tokens from being forever locked.
   *
   * `_data` is additional data, it has no specified format and it is sent in call to `to`.
   *
   * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
   * implement alternative mechanisms to perform token transfer, such as signature-based.
   *
   * Requirements:
   *
   * - `from` cannot be the zero address.
   * - `to` cannot be the zero address.
   * - `tokenId` token must exist and be owned by `from`.
   * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
   *
   * Emits a {Transfer} event.
   */
  function _safeTransfer(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) internal virtual {
    _transfer(from, to, tokenId);
    require(
      _checkOnERC721Received(from, to, tokenId, _data),
      'ERC721: transfer to non ERC721Receiver implementer'
    );
  }

  /**
   * @dev Returns whether `tokenId` exists.
   *
   * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
   *
   * Tokens start existing when they are minted (`_mint`),
   * and stop existing when they are burned (`_burn`).
   */
  function _exists(uint256 tokenId) internal view virtual returns (bool) {
    return _owners[tokenId] != address(0);
  }

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

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

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

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

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

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

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

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

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

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

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

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

  /**
   * @dev Transfers `tokenId` from `from` to `to`.
   *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
   *
   * Requirements:
   *
   * - `to` cannot be the zero address.
   * - `tokenId` token must be owned by `from`.
   *
   * Emits a {Transfer} event.
   */
  function _transfer(
    address from,
    address to,
    uint256 tokenId
  ) internal virtual {
    require(
      ERC721.ownerOf(tokenId) == from,
      'ERC721: transfer of token that is not own'
    );
    require(to != address(0), 'ERC721: transfer to the zero address');

    _beforeTokenTransfer(from, to, tokenId);

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

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

    emit Transfer(from, to, tokenId);
  }

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

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

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

// File: ../token/extensions/IERC721Enumerable.sol



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);
}

// File: ../token/extensions/ERC721Enumerable.sol



pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

  /**
   * @dev Hook that is called before any token transfer. This includes minting
   * and burning.
   *
   * Calling conditions:
   *
   * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
   * transferred to `to`.
   * - When `from` is zero, `tokenId` will be minted for `to`.
   * - When `to` is zero, ``from``'s `tokenId` will be burned.
   * - `from` cannot be the zero address.
   * - `to` cannot be the zero address.
   *
   * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
   */
  function _beforeTokenTransfer(
    address from,
    address to,
    uint256 tokenId
  ) internal virtual override {
    super._beforeTokenTransfer(from, to, tokenId);

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: ../Ownable.sol



pragma solidity ^0.8.0;


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

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

  /**
   * @dev Initializes the contract setting the deployer as the initial owner.
   */
  constructor() {
    _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);
  }
}

// File: contracts/interfaces/ITwentyFiveFF.sol


pragma solidity ^0.8.0;

interface ITwentyFiveFF {
  function addToAllowList(address[] calldata addresses) external;

  function onAllowList(address addr) external returns (bool);

  function removeFromAllowList(address[] calldata addresses) external;

  function allowListClaimedBy(address owner) external returns (uint256);

  function purchase(uint256 numberOfTokens) external payable;

  function purchaseWhitelist(uint256 numberOfTokens) external payable;

  function gift(address[] calldata to) external;

  function setIsActive(bool isActive) external;

  function setIsAllowListActive(bool isAllowListActive) external;

  function setAllowListMaxMint(uint256 maxMint) external;

  function setProof(string memory proofString) external;

  function withdraw() external;
}

// File: contracts/interfaces/ITwentyFiveFFMetadata.sol


pragma solidity ^0.8.0;

interface ITwentyFiveFFMetadata {
  function setContractURI(string calldata URI) external;

  function setBaseURI(string calldata URI) external;

  function setRevealedBaseURI(string calldata revealedBaseURI) external;

  function contractURI() external view returns (string memory);
}

// File: ../TwentyFiveFF.sol


pragma solidity ^0.8.0;






contract TwentyFiveFF is ERC721Enumerable, Ownable, ITwentyFiveFF, ITwentyFiveFFMetadata {
  using Strings for uint256;

  uint256 public constant PURCHASE_LIMIT = 12;
  uint256 public constant PRICE = 0.075 ether;
  uint256 public constant TwentyFiveFF_GIFT = 99;
  uint256 public constant TwentyFiveFF_PUBLIC = 9900;
  uint256 public constant TwentyFiveFF_MAX = TwentyFiveFF_GIFT + TwentyFiveFF_PUBLIC;

  bool public isActive = false;
  bool public isAllowListActive = false;
  string public proof;

  uint256 public allowListMaxMint = 3;

  /// @dev We will use these to be able to calculate remaining correctly.
  uint256 public totalGiftSupply;
  uint256 public totalPublicSupply;

  mapping(address => bool) private _allowList;
  mapping(address => uint256) private _allowListClaimed;

  string private _contractURI = '';
  string private _tokenBaseURI = '';
  string private _tokenRevealedBaseURI = '';

  constructor(string memory name, string memory symbol) ERC721(name, symbol) {}

  function addToAllowList(address[] calldata addresses)
    external
    override
    onlyOwner
  {
    for (uint256 i = 0; i < addresses.length; i++) {
      require(addresses[i] != address(0), "Can't add zero address");

      _allowList[addresses[i]] = true;
      /**
       * @dev We don't want to reset _allowListClaimed count
       * if we try to add someone more than once.
       */
      _allowListClaimed[addresses[i]] > 0 ? _allowListClaimed[addresses[i]] : 0;
    }
  }

  function onAllowList(address addr) external view override returns (bool) {
    return _allowList[addr];
  }

  function removeFromAllowList(address[] calldata addresses)
    external
    override
    onlyOwner
  {
    for (uint256 i = 0; i < addresses.length; i++) {
      require(addresses[i] != address(0), "Can't add zero address");

      /// @dev We don't want to reset possible _allowListClaimed numbers.
      _allowList[addresses[i]] = false;
    }
  }

  /**
   * @dev We want to be able to distinguish tokens bought during isAllowListActive
   * and tokens bought outside of isAllowListActive
   */
  function allowListClaimedBy(address owner)
    external
    view
    override
    returns (uint256)
  {
    require(owner != address(0), 'Zero address not on Allow List');

    return _allowListClaimed[owner];
  }

  function purchase(uint256 numberOfTokens) external payable override {
    require(isActive, 'Contract is not active');
    require(!isAllowListActive, 'Only allowing from Allow List');
    require(totalSupply() < TwentyFiveFF_MAX, 'All tokens have been minted');
    require(numberOfTokens <= PURCHASE_LIMIT, 'Would exceed PURCHASE_LIMIT');
    /**
     * @dev The last person to purchase might pay too much.
     * This way however they can't get sniped.
     * If this happens, we'll refund the Eth for the unavailable tokens.
     */
    require(totalPublicSupply < TwentyFiveFF_PUBLIC, 'Purchase would exceed TwentyFiveFF_PUBLIC');
    require(
      PRICE * numberOfTokens <= msg.value,
      'ETH amount insufficient'
    );

    for (uint256 i = 0; i < numberOfTokens; i++) {
      /**
       * @dev Since they can get here while exceeding the TwentyFiveFF_MAX,
       * we have to make sure to not mint any additional tokens.
       */
      if (totalPublicSupply < TwentyFiveFF_PUBLIC) {
        /**
         * @dev Public token numbering starts after TwentyFiveFF_GIFT.
         * And we don't want our tokens to start at 0 but at 1.
         */
        uint256 tokenId = TwentyFiveFF_GIFT + totalPublicSupply + 1;

        totalPublicSupply += 1;
        _safeMint(msg.sender, tokenId);
      }
    }
  }

  function purchaseWhitelist(uint256 numberOfTokens) external payable override {
    require(isActive, 'Contract is not active');
    require(isAllowListActive, 'Whitelist minting is not active');
    require(_allowList[msg.sender], 'You are not on the whitelist');
    require(totalSupply() < TwentyFiveFF_MAX, 'All tokens have been minted');
    require(
      numberOfTokens <= allowListMaxMint,
      'Cannot purchase this many tokens'
    );
    require(
      totalPublicSupply + numberOfTokens <= TwentyFiveFF_PUBLIC,
      'Purchase would exceed TwentyFiveFF_PUBLIC'
    );
    require(
      _allowListClaimed[msg.sender] + numberOfTokens <= allowListMaxMint,
      'Purchase exceeds max allowed'
    );
    require(
      PRICE * numberOfTokens <= msg.value,
      'ETH amount insufficient'
    );

    for (uint256 i = 0; i < numberOfTokens; i++) {
      /**
       * @dev Public token numbering starts after TwentyFiveFF_GIFT.
       * We don't want our tokens to start at 0 but at 1.
       */
      uint256 tokenId = TwentyFiveFF_GIFT + totalPublicSupply + 1;

      totalPublicSupply += 1;
      _allowListClaimed[msg.sender] += 1;
      _safeMint(msg.sender, tokenId);
    }
  }

  function gift(address[] calldata to) external override onlyOwner {
    require(totalSupply() < TwentyFiveFF_MAX, 'All tokens have been minted');
    require(
      totalGiftSupply + to.length <= TwentyFiveFF_GIFT,
      'Not enough tokens left to gift'
    );

    for (uint256 i = 0; i < to.length; i++) {
      /// @dev We don't want our tokens to start at 0 but at 1.
      uint256 tokenId = totalGiftSupply + 1;

      totalGiftSupply += 1;
      _safeMint(to[i], tokenId);
    }
  }

  function setIsActive(bool _isActive) external override onlyOwner {
    isActive = _isActive;
  }

  function setIsAllowListActive(bool _isAllowListActive)
    external
    override
    onlyOwner
  {
    isAllowListActive = _isAllowListActive;
  }

  function setAllowListMaxMint(uint256 maxMint) external override onlyOwner {
    allowListMaxMint = maxMint;
  }

  function setProof(string calldata proofString) external override onlyOwner {
    proof = proofString;
  }

  function withdraw() external override onlyOwner {
    uint256 balance = address(this).balance;

    payable(msg.sender).transfer(balance);
  }

  function setContractURI(string calldata URI) external override onlyOwner {
    _contractURI = URI;
  }

  function setBaseURI(string calldata URI) external override onlyOwner {
    _tokenBaseURI = URI;
  }

  function setRevealedBaseURI(string calldata revealedBaseURI)
    external
    override
    onlyOwner
  {
    _tokenRevealedBaseURI = revealedBaseURI;
  }

  function contractURI() public view override returns (string memory) {
    return _contractURI;
  }

  function tokenURI(uint256 tokenId)
    public
    view
    override(ERC721)
    returns (string memory)
  {
    require(_exists(tokenId), 'Token does not exist');

    /// @dev Convert string to bytes so we can check if it's empty or not.
    string memory revealedBaseURI = _tokenRevealedBaseURI;
    return
      bytes(revealedBaseURI).length > 0
        ? string(abi.encodePacked(revealedBaseURI, tokenId.toString()))
        : _tokenBaseURI;
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"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":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PURCHASE_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TwentyFiveFF_GIFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TwentyFiveFF_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TwentyFiveFF_PUBLIC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addToAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"allowListClaimedBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowListMaxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"to","type":"address[]"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isAllowListActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"onAllowList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proof","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"purchase","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"purchaseWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"removeFromAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxMint","type":"uint256"}],"name":"setAllowListMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isAllowListActive","type":"bool"}],"name":"setIsAllowListActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"proofString","type":"string"}],"name":"setProof","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"revealedBaseURI","type":"string"}],"name":"setRevealedBaseURI","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":[],"name":"totalGiftSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPublicSupply","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"}]

600a805461ffff60a01b191690556003600c5560a06040819052600060808190526200002e916011916200014b565b506040805160208101918290526000908190526200004f916012916200014b565b5060408051602081019182905260009081905262000070916013916200014b565b503480156200007e57600080fd5b506040516200317b3803806200317b833981016040819052620000a191620002a8565b815182908290620000ba9060009060208501906200014b565b508051620000d09060019060208401906200014b565b505050620000ed620000e7620000f560201b60201c565b620000f9565b505062000365565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001599062000312565b90600052602060002090601f0160209004810192826200017d5760008555620001c8565b82601f106200019857805160ff1916838001178555620001c8565b82800160010185558215620001c8579182015b82811115620001c8578251825591602001919060010190620001ab565b50620001d6929150620001da565b5090565b5b80821115620001d65760008155600101620001db565b600082601f8301126200020357600080fd5b81516001600160401b03808211156200022057620002206200034f565b604051601f8301601f19908116603f011681019082821181831017156200024b576200024b6200034f565b816040528381526020925086838588010111156200026857600080fd5b600091505b838210156200028c57858201830151818301840152908201906200026d565b838211156200029e5760008385830101525b9695505050505050565b60008060408385031215620002bc57600080fd5b82516001600160401b0380821115620002d457600080fd5b620002e286838701620001f1565b93506020850151915080821115620002f957600080fd5b506200030885828601620001f1565b9150509250929050565b600181811c908216806200032757607f821691505b602082108114156200034957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b612e0680620003756000396000f3fe60806040526004361061027c5760003560e01c8063715018a61161014f578063b88d4fde116100c1578063e6a5931e1161007a578063e6a5931e1461075d578063e8a3d48514610773578063e985e9c514610788578063efef39a1146107d1578063f2fde38b146107e4578063faf924cf1461080457600080fd5b8063b88d4fde146106ca578063be43cab0146106ea578063c1cb14d0146106ff578063c87b56dd14610712578063d6f407c714610732578063d75e61101461074857600080fd5b80638d859f3e116101135780638d859f3e1461061b5780638da5cb5b14610637578063938e3d7b1461065557806395d89b4114610675578063a22cb4651461068a578063a51312c8146106aa57600080fd5b8063715018a614610590578063718bc4af146105a55780637263cfe2146105c55780637a6685f1146105e55780637f44ab2f1461060557600080fd5b80632750fc78116101f35780634f6ccce7116101ac5780634f6ccce7146104db57806355f804b3146104fb5780636352211e1461051b5780636aee89041461053b5780636e83843a1461055057806370a082311461057057600080fd5b80632750fc781461040c57806329fc6bae1461042c5780632f745c591461044d5780633a0658921461046d5780633ccfd60b146104a657806342842e0e146104bb57600080fd5b80630d8a2cbe116102455780630d8a2cbe1461036057806315336f8014610376578063163e1e611461039657806318160ddd146103b657806322f3e2d4146103cb57806323b872dd146103ec57600080fd5b806208ffdd1461028157806301ffc9a7146102b457806306fdde03146102e4578063081812fc14610306578063095ea7b31461033e575b600080fd5b34801561028d57600080fd5b506102a161029c366004612754565b610819565b6040519081526020015b60405180910390f35b3480156102c057600080fd5b506102d46102cf36600461299e565b610892565b60405190151581526020016102ab565b3480156102f057600080fd5b506102f96108bd565b6040516102ab9190612ae9565b34801561031257600080fd5b50610326610321366004612a38565b61094f565b6040516001600160a01b0390911681526020016102ab565b34801561034a57600080fd5b5061035e6103593660046128e4565b6109e4565b005b34801561036c57600080fd5b506102a16126ac81565b34801561038257600080fd5b5061035e6103913660046129d8565b610afa565b3480156103a257600080fd5b5061035e6103b136600461290e565b610b30565b3480156103c257600080fd5b506008546102a1565b3480156103d757600080fd5b50600a546102d490600160a01b900460ff1681565b3480156103f857600080fd5b5061035e6104073660046127a2565b610c60565b34801561041857600080fd5b5061035e610427366004612983565b610c91565b34801561043857600080fd5b50600a546102d490600160a81b900460ff1681565b34801561045957600080fd5b506102a16104683660046128e4565b610cd9565b34801561047957600080fd5b506102d4610488366004612754565b6001600160a01b03166000908152600f602052604090205460ff1690565b3480156104b257600080fd5b5061035e610d6f565b3480156104c757600080fd5b5061035e6104d63660046127a2565b610dcc565b3480156104e757600080fd5b506102a16104f6366004612a38565b610de7565b34801561050757600080fd5b5061035e6105163660046129d8565b610e7a565b34801561052757600080fd5b50610326610536366004612a38565b610eb0565b34801561054757600080fd5b506102a1606381565b34801561055c57600080fd5b5061035e61056b3660046129d8565b610f27565b34801561057c57600080fd5b506102a161058b366004612754565b610f5d565b34801561059c57600080fd5b5061035e610fe4565b3480156105b157600080fd5b5061035e6105c0366004612983565b61101a565b3480156105d157600080fd5b5061035e6105e036600461290e565b611062565b3480156105f157600080fd5b5061035e610600366004612a38565b61121f565b34801561061157600080fd5b506102a1600c5481565b34801561062757600080fd5b506102a167010a741a4627800081565b34801561064357600080fd5b50600a546001600160a01b0316610326565b34801561066157600080fd5b5061035e6106703660046129d8565b61124e565b34801561068157600080fd5b506102f9611284565b34801561069657600080fd5b5061035e6106a53660046128ba565b611293565b3480156106b657600080fd5b5061035e6106c536600461290e565b611358565b3480156106d657600080fd5b5061035e6106e53660046127de565b61146d565b3480156106f657600080fd5b506102a16114a5565b61035e61070d366004612a38565b6114b5565b34801561071e57600080fd5b506102f961072d366004612a38565b6117b8565b34801561073e57600080fd5b506102a1600d5481565b34801561075457600080fd5b506102a1600c81565b34801561076957600080fd5b506102a1600e5481565b34801561077f57600080fd5b506102f9611970565b34801561079457600080fd5b506102d46107a336600461276f565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61035e6107df366004612a38565b61197f565b3480156107f057600080fd5b5061035e6107ff366004612754565b611b93565b34801561081057600080fd5b506102f9611c2e565b60006001600160a01b0382166108765760405162461bcd60e51b815260206004820152601e60248201527f5a65726f2061646472657373206e6f74206f6e20416c6c6f77204c697374000060448201526064015b60405180910390fd5b506001600160a01b031660009081526010602052604090205490565b60006001600160e01b0319821663780e9d6360e01b14806108b757506108b782611cbc565b92915050565b6060600080546108cc90612ce2565b80601f01602080910402602001604051908101604052809291908181526020018280546108f890612ce2565b80156109455780601f1061091a57610100808354040283529160200191610945565b820191906000526020600020905b81548152906001019060200180831161092857829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109c85760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161086d565b506000908152600460205260409020546001600160a01b031690565b60006109ef82610eb0565b9050806001600160a01b0316836001600160a01b03161415610a5d5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161086d565b336001600160a01b0382161480610a795750610a7981336107a3565b610aeb5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161086d565b610af58383611d0c565b505050565b600a546001600160a01b03163314610b245760405162461bcd60e51b815260040161086d90612b4e565b610af5600b838361268f565b600a546001600160a01b03163314610b5a5760405162461bcd60e51b815260040161086d90612b4e565b610b676126ac6063612c54565b60085410610b875760405162461bcd60e51b815260040161086d90612c1d565b600d54606390610b98908390612c54565b1115610be65760405162461bcd60e51b815260206004820152601e60248201527f4e6f7420656e6f75676820746f6b656e73206c65667420746f20676966740000604482015260640161086d565b60005b81811015610af5576000600d546001610c029190612c54565b90506001600d6000828254610c179190612c54565b90915550610c4d9050848484818110610c3257610c32612d8e565b9050602002016020810190610c479190612754565b82611d7a565b5080610c5881612d1d565b915050610be9565b610c6a3382611d94565b610c865760405162461bcd60e51b815260040161086d90612b83565b610af5838383611e8b565b600a546001600160a01b03163314610cbb5760405162461bcd60e51b815260040161086d90612b4e565b600a8054911515600160a01b0260ff60a01b19909216919091179055565b6000610ce483610f5d565b8210610d465760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161086d565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610d995760405162461bcd60e51b815260040161086d90612b4e565b6040514790339082156108fc029083906000818181858888f19350505050158015610dc8573d6000803e3d6000fd5b5050565b610af58383836040518060200160405280600081525061146d565b6000610df260085490565b8210610e555760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161086d565b60088281548110610e6857610e68612d8e565b90600052602060002001549050919050565b600a546001600160a01b03163314610ea45760405162461bcd60e51b815260040161086d90612b4e565b610af56012838361268f565b6000818152600260205260408120546001600160a01b0316806108b75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161086d565b600a546001600160a01b03163314610f515760405162461bcd60e51b815260040161086d90612b4e565b610af56013838361268f565b60006001600160a01b038216610fc85760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161086d565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b0316331461100e5760405162461bcd60e51b815260040161086d90612b4e565b6110186000612036565b565b600a546001600160a01b031633146110445760405162461bcd60e51b815260040161086d90612b4e565b600a8054911515600160a81b0260ff60a81b19909216919091179055565b600a546001600160a01b0316331461108c5760405162461bcd60e51b815260040161086d90612b4e565b60005b81811015610af55760008383838181106110ab576110ab612d8e565b90506020020160208101906110c09190612754565b6001600160a01b031614156111105760405162461bcd60e51b815260206004820152601660248201527543616e277420616464207a65726f206164647265737360501b604482015260640161086d565b6001600f600085858581811061112857611128612d8e565b905060200201602081019061113d9190612754565b6001600160a01b0316815260208101919091526040016000908120805460ff19169215159290921790915560108185858581811061117d5761117d612d8e565b90506020020160208101906111929190612754565b6001600160a01b03166001600160a01b0316815260200190815260200160002054116111bf57600061120c565b601060008484848181106111d5576111d5612d8e565b90506020020160208101906111ea9190612754565b6001600160a01b03166001600160a01b03168152602001908152602001600020545b508061121781612d1d565b91505061108f565b600a546001600160a01b031633146112495760405162461bcd60e51b815260040161086d90612b4e565b600c55565b600a546001600160a01b031633146112785760405162461bcd60e51b815260040161086d90612b4e565b610af56011838361268f565b6060600180546108cc90612ce2565b6001600160a01b0382163314156112ec5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161086d565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b031633146113825760405162461bcd60e51b815260040161086d90612b4e565b60005b81811015610af55760008383838181106113a1576113a1612d8e565b90506020020160208101906113b69190612754565b6001600160a01b031614156114065760405162461bcd60e51b815260206004820152601660248201527543616e277420616464207a65726f206164647265737360501b604482015260640161086d565b6000600f600085858581811061141e5761141e612d8e565b90506020020160208101906114339190612754565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061146581612d1d565b915050611385565b6114773383611d94565b6114935760405162461bcd60e51b815260040161086d90612b83565b61149f84848484612088565b50505050565b6114b26126ac6063612c54565b81565b600a54600160a01b900460ff166115075760405162461bcd60e51b8152602060048201526016602482015275436f6e7472616374206973206e6f742061637469766560501b604482015260640161086d565b600a54600160a81b900460ff166115605760405162461bcd60e51b815260206004820152601f60248201527f57686974656c697374206d696e74696e67206973206e6f742061637469766500604482015260640161086d565b336000908152600f602052604090205460ff166115bf5760405162461bcd60e51b815260206004820152601c60248201527f596f7520617265206e6f74206f6e207468652077686974656c69737400000000604482015260640161086d565b6115cc6126ac6063612c54565b600854106115ec5760405162461bcd60e51b815260040161086d90612c1d565b600c5481111561163e5760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e73604482015260640161086d565b6126ac81600e5461164f9190612c54565b111561166d5760405162461bcd60e51b815260040161086d90612bd4565b600c543360009081526010602052604090205461168b908390612c54565b11156116d95760405162461bcd60e51b815260206004820152601c60248201527f50757263686173652065786365656473206d617820616c6c6f77656400000000604482015260640161086d565b346116ec8267010a741a46278000612c80565b11156117345760405162461bcd60e51b815260206004820152601760248201527611551208185b5bdd5b9d081a5b9cdd59999a58da595b9d604a1b604482015260640161086d565b60005b81811015610dc8576000600e5460636117509190612c54565b61175b906001612c54565b90506001600e60008282546117709190612c54565b9091555050336000908152601060205260408120805460019290611795908490612c54565b909155506117a590503382611d7a565b50806117b081612d1d565b915050611737565b6000818152600260205260409020546060906001600160a01b03166118165760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b604482015260640161086d565b60006013805461182590612ce2565b80601f016020809104026020016040519081016040528092919081815260200182805461185190612ce2565b801561189e5780601f106118735761010080835404028352916020019161189e565b820191906000526020600020905b81548152906001019060200180831161188157829003601f168201915b50505050509050600081511161193e57601280546118bb90612ce2565b80601f01602080910402602001604051908101604052809291908181526020018280546118e790612ce2565b80156119345780601f1061190957610100808354040283529160200191611934565b820191906000526020600020905b81548152906001019060200180831161191757829003601f168201915b5050505050611969565b80611948846120bb565b604051602001611959929190612a7d565b6040516020818303038152906040525b9392505050565b6060601180546108cc90612ce2565b600a54600160a01b900460ff166119d15760405162461bcd60e51b8152602060048201526016602482015275436f6e7472616374206973206e6f742061637469766560501b604482015260640161086d565b600a54600160a81b900460ff1615611a2b5760405162461bcd60e51b815260206004820152601d60248201527f4f6e6c7920616c6c6f77696e672066726f6d20416c6c6f77204c697374000000604482015260640161086d565b611a386126ac6063612c54565b60085410611a585760405162461bcd60e51b815260040161086d90612c1d565b600c811115611aa95760405162461bcd60e51b815260206004820152601b60248201527f576f756c64206578636565642050555243484153455f4c494d49540000000000604482015260640161086d565b6126ac600e5410611acc5760405162461bcd60e51b815260040161086d90612bd4565b34611adf8267010a741a46278000612c80565b1115611b275760405162461bcd60e51b815260206004820152601760248201527611551208185b5bdd5b9d081a5b9cdd59999a58da595b9d604a1b604482015260640161086d565b60005b81811015610dc8576126ac600e541015611b81576000600e546063611b4f9190612c54565b611b5a906001612c54565b90506001600e6000828254611b6f9190612c54565b90915550611b7f90503382611d7a565b505b80611b8b81612d1d565b915050611b2a565b600a546001600160a01b03163314611bbd5760405162461bcd60e51b815260040161086d90612b4e565b6001600160a01b038116611c225760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161086d565b611c2b81612036565b50565b600b8054611c3b90612ce2565b80601f0160208091040260200160405190810160405280929190818152602001828054611c6790612ce2565b8015611cb45780601f10611c8957610100808354040283529160200191611cb4565b820191906000526020600020905b815481529060010190602001808311611c9757829003601f168201915b505050505081565b60006001600160e01b031982166380ac58cd60e01b1480611ced57506001600160e01b03198216635b5e139f60e01b145b806108b757506301ffc9a760e01b6001600160e01b03198316146108b7565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611d4182610eb0565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610dc88282604051806020016040528060008152506121b9565b6000818152600260205260408120546001600160a01b0316611e0d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161086d565b6000611e1883610eb0565b9050806001600160a01b0316846001600160a01b03161480611e535750836001600160a01b0316611e488461094f565b6001600160a01b0316145b80611e8357506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611e9e82610eb0565b6001600160a01b031614611f065760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161086d565b6001600160a01b038216611f685760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161086d565b611f738383836121ec565b611f7e600082611d0c565b6001600160a01b0383166000908152600360205260408120805460019290611fa7908490612c9f565b90915550506001600160a01b0382166000908152600360205260408120805460019290611fd5908490612c54565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b612093848484611e8b565b61209f848484846122a4565b61149f5760405162461bcd60e51b815260040161086d90612afc565b6060816120df5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561210957806120f381612d1d565b91506121029050600a83612c6c565b91506120e3565b60008167ffffffffffffffff81111561212457612124612da4565b6040519080825280601f01601f19166020018201604052801561214e576020820181803683370190505b5090505b8415611e8357612163600183612c9f565b9150612170600a86612d38565b61217b906030612c54565b60f81b81838151811061219057612190612d8e565b60200101906001600160f81b031916908160001a9053506121b2600a86612c6c565b9450612152565b6121c383836123b1565b6121d060008484846122a4565b610af55760405162461bcd60e51b815260040161086d90612afc565b6001600160a01b0383166122475761224281600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61226a565b816001600160a01b0316836001600160a01b03161461226a5761226a83826124ff565b6001600160a01b03821661228157610af58161259c565b826001600160a01b0316826001600160a01b031614610af557610af5828261264b565b60006001600160a01b0384163b156123a657604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906122e8903390899088908890600401612aac565b602060405180830381600087803b15801561230257600080fd5b505af1925050508015612332575060408051601f3d908101601f1916820190925261232f918101906129bb565b60015b61238c573d808015612360576040519150601f19603f3d011682016040523d82523d6000602084013e612365565b606091505b5080516123845760405162461bcd60e51b815260040161086d90612afc565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611e83565b506001949350505050565b6001600160a01b0382166124075760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161086d565b6000818152600260205260409020546001600160a01b03161561246c5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161086d565b612478600083836121ec565b6001600160a01b03821660009081526003602052604081208054600192906124a1908490612c54565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000600161250c84610f5d565b6125169190612c9f565b600083815260076020526040902054909150808214612569576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906125ae90600190612c9f565b600083815260096020526040812054600880549394509092849081106125d6576125d6612d8e565b9060005260206000200154905080600883815481106125f7576125f7612d8e565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061262f5761262f612d78565b6001900381819060005260206000200160009055905550505050565b600061265683610f5d565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461269b90612ce2565b90600052602060002090601f0160209004810192826126bd5760008555612703565b82601f106126d65782800160ff19823516178555612703565b82800160010185558215612703579182015b828111156127035782358255916020019190600101906126e8565b5061270f929150612713565b5090565b5b8082111561270f5760008155600101612714565b80356001600160a01b038116811461273f57600080fd5b919050565b8035801515811461273f57600080fd5b60006020828403121561276657600080fd5b61196982612728565b6000806040838503121561278257600080fd5b61278b83612728565b915061279960208401612728565b90509250929050565b6000806000606084860312156127b757600080fd5b6127c084612728565b92506127ce60208501612728565b9150604084013590509250925092565b600080600080608085870312156127f457600080fd5b6127fd85612728565b935061280b60208601612728565b925060408501359150606085013567ffffffffffffffff8082111561282f57600080fd5b818701915087601f83011261284357600080fd5b81358181111561285557612855612da4565b604051601f8201601f19908116603f0116810190838211818310171561287d5761287d612da4565b816040528281528a602084870101111561289657600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080604083850312156128cd57600080fd5b6128d683612728565b915061279960208401612744565b600080604083850312156128f757600080fd5b61290083612728565b946020939093013593505050565b6000806020838503121561292157600080fd5b823567ffffffffffffffff8082111561293957600080fd5b818501915085601f83011261294d57600080fd5b81358181111561295c57600080fd5b8660208260051b850101111561297157600080fd5b60209290920196919550909350505050565b60006020828403121561299557600080fd5b61196982612744565b6000602082840312156129b057600080fd5b813561196981612dba565b6000602082840312156129cd57600080fd5b815161196981612dba565b600080602083850312156129eb57600080fd5b823567ffffffffffffffff80821115612a0357600080fd5b818501915085601f830112612a1757600080fd5b813581811115612a2657600080fd5b86602082850101111561297157600080fd5b600060208284031215612a4a57600080fd5b5035919050565b60008151808452612a69816020860160208601612cb6565b601f01601f19169290920160200192915050565b60008351612a8f818460208801612cb6565b835190830190612aa3818360208801612cb6565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612adf90830184612a51565b9695505050505050565b6020815260006119696020830184612a51565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526029908201527f507572636861736520776f756c6420657863656564205477656e74794669766560408201526846465f5055424c494360b81b606082015260800190565b6020808252601b908201527f416c6c20746f6b656e732068617665206265656e206d696e7465640000000000604082015260600190565b60008219821115612c6757612c67612d4c565b500190565b600082612c7b57612c7b612d62565b500490565b6000816000190483118215151615612c9a57612c9a612d4c565b500290565b600082821015612cb157612cb1612d4c565b500390565b60005b83811015612cd1578181015183820152602001612cb9565b8381111561149f5750506000910152565b600181811c90821680612cf657607f821691505b60208210811415612d1757634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612d3157612d31612d4c565b5060010190565b600082612d4757612d47612d62565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611c2b57600080fdfea264697066735822122004ba214d5e483720b36992288351231a9ce60d69555c3a31ff9a2c8d1e9f8b6b64736f6c63430008050033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000004323534350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043235343500000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061027c5760003560e01c8063715018a61161014f578063b88d4fde116100c1578063e6a5931e1161007a578063e6a5931e1461075d578063e8a3d48514610773578063e985e9c514610788578063efef39a1146107d1578063f2fde38b146107e4578063faf924cf1461080457600080fd5b8063b88d4fde146106ca578063be43cab0146106ea578063c1cb14d0146106ff578063c87b56dd14610712578063d6f407c714610732578063d75e61101461074857600080fd5b80638d859f3e116101135780638d859f3e1461061b5780638da5cb5b14610637578063938e3d7b1461065557806395d89b4114610675578063a22cb4651461068a578063a51312c8146106aa57600080fd5b8063715018a614610590578063718bc4af146105a55780637263cfe2146105c55780637a6685f1146105e55780637f44ab2f1461060557600080fd5b80632750fc78116101f35780634f6ccce7116101ac5780634f6ccce7146104db57806355f804b3146104fb5780636352211e1461051b5780636aee89041461053b5780636e83843a1461055057806370a082311461057057600080fd5b80632750fc781461040c57806329fc6bae1461042c5780632f745c591461044d5780633a0658921461046d5780633ccfd60b146104a657806342842e0e146104bb57600080fd5b80630d8a2cbe116102455780630d8a2cbe1461036057806315336f8014610376578063163e1e611461039657806318160ddd146103b657806322f3e2d4146103cb57806323b872dd146103ec57600080fd5b806208ffdd1461028157806301ffc9a7146102b457806306fdde03146102e4578063081812fc14610306578063095ea7b31461033e575b600080fd5b34801561028d57600080fd5b506102a161029c366004612754565b610819565b6040519081526020015b60405180910390f35b3480156102c057600080fd5b506102d46102cf36600461299e565b610892565b60405190151581526020016102ab565b3480156102f057600080fd5b506102f96108bd565b6040516102ab9190612ae9565b34801561031257600080fd5b50610326610321366004612a38565b61094f565b6040516001600160a01b0390911681526020016102ab565b34801561034a57600080fd5b5061035e6103593660046128e4565b6109e4565b005b34801561036c57600080fd5b506102a16126ac81565b34801561038257600080fd5b5061035e6103913660046129d8565b610afa565b3480156103a257600080fd5b5061035e6103b136600461290e565b610b30565b3480156103c257600080fd5b506008546102a1565b3480156103d757600080fd5b50600a546102d490600160a01b900460ff1681565b3480156103f857600080fd5b5061035e6104073660046127a2565b610c60565b34801561041857600080fd5b5061035e610427366004612983565b610c91565b34801561043857600080fd5b50600a546102d490600160a81b900460ff1681565b34801561045957600080fd5b506102a16104683660046128e4565b610cd9565b34801561047957600080fd5b506102d4610488366004612754565b6001600160a01b03166000908152600f602052604090205460ff1690565b3480156104b257600080fd5b5061035e610d6f565b3480156104c757600080fd5b5061035e6104d63660046127a2565b610dcc565b3480156104e757600080fd5b506102a16104f6366004612a38565b610de7565b34801561050757600080fd5b5061035e6105163660046129d8565b610e7a565b34801561052757600080fd5b50610326610536366004612a38565b610eb0565b34801561054757600080fd5b506102a1606381565b34801561055c57600080fd5b5061035e61056b3660046129d8565b610f27565b34801561057c57600080fd5b506102a161058b366004612754565b610f5d565b34801561059c57600080fd5b5061035e610fe4565b3480156105b157600080fd5b5061035e6105c0366004612983565b61101a565b3480156105d157600080fd5b5061035e6105e036600461290e565b611062565b3480156105f157600080fd5b5061035e610600366004612a38565b61121f565b34801561061157600080fd5b506102a1600c5481565b34801561062757600080fd5b506102a167010a741a4627800081565b34801561064357600080fd5b50600a546001600160a01b0316610326565b34801561066157600080fd5b5061035e6106703660046129d8565b61124e565b34801561068157600080fd5b506102f9611284565b34801561069657600080fd5b5061035e6106a53660046128ba565b611293565b3480156106b657600080fd5b5061035e6106c536600461290e565b611358565b3480156106d657600080fd5b5061035e6106e53660046127de565b61146d565b3480156106f657600080fd5b506102a16114a5565b61035e61070d366004612a38565b6114b5565b34801561071e57600080fd5b506102f961072d366004612a38565b6117b8565b34801561073e57600080fd5b506102a1600d5481565b34801561075457600080fd5b506102a1600c81565b34801561076957600080fd5b506102a1600e5481565b34801561077f57600080fd5b506102f9611970565b34801561079457600080fd5b506102d46107a336600461276f565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61035e6107df366004612a38565b61197f565b3480156107f057600080fd5b5061035e6107ff366004612754565b611b93565b34801561081057600080fd5b506102f9611c2e565b60006001600160a01b0382166108765760405162461bcd60e51b815260206004820152601e60248201527f5a65726f2061646472657373206e6f74206f6e20416c6c6f77204c697374000060448201526064015b60405180910390fd5b506001600160a01b031660009081526010602052604090205490565b60006001600160e01b0319821663780e9d6360e01b14806108b757506108b782611cbc565b92915050565b6060600080546108cc90612ce2565b80601f01602080910402602001604051908101604052809291908181526020018280546108f890612ce2565b80156109455780601f1061091a57610100808354040283529160200191610945565b820191906000526020600020905b81548152906001019060200180831161092857829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109c85760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161086d565b506000908152600460205260409020546001600160a01b031690565b60006109ef82610eb0565b9050806001600160a01b0316836001600160a01b03161415610a5d5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161086d565b336001600160a01b0382161480610a795750610a7981336107a3565b610aeb5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161086d565b610af58383611d0c565b505050565b600a546001600160a01b03163314610b245760405162461bcd60e51b815260040161086d90612b4e565b610af5600b838361268f565b600a546001600160a01b03163314610b5a5760405162461bcd60e51b815260040161086d90612b4e565b610b676126ac6063612c54565b60085410610b875760405162461bcd60e51b815260040161086d90612c1d565b600d54606390610b98908390612c54565b1115610be65760405162461bcd60e51b815260206004820152601e60248201527f4e6f7420656e6f75676820746f6b656e73206c65667420746f20676966740000604482015260640161086d565b60005b81811015610af5576000600d546001610c029190612c54565b90506001600d6000828254610c179190612c54565b90915550610c4d9050848484818110610c3257610c32612d8e565b9050602002016020810190610c479190612754565b82611d7a565b5080610c5881612d1d565b915050610be9565b610c6a3382611d94565b610c865760405162461bcd60e51b815260040161086d90612b83565b610af5838383611e8b565b600a546001600160a01b03163314610cbb5760405162461bcd60e51b815260040161086d90612b4e565b600a8054911515600160a01b0260ff60a01b19909216919091179055565b6000610ce483610f5d565b8210610d465760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161086d565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610d995760405162461bcd60e51b815260040161086d90612b4e565b6040514790339082156108fc029083906000818181858888f19350505050158015610dc8573d6000803e3d6000fd5b5050565b610af58383836040518060200160405280600081525061146d565b6000610df260085490565b8210610e555760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161086d565b60088281548110610e6857610e68612d8e565b90600052602060002001549050919050565b600a546001600160a01b03163314610ea45760405162461bcd60e51b815260040161086d90612b4e565b610af56012838361268f565b6000818152600260205260408120546001600160a01b0316806108b75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161086d565b600a546001600160a01b03163314610f515760405162461bcd60e51b815260040161086d90612b4e565b610af56013838361268f565b60006001600160a01b038216610fc85760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161086d565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b0316331461100e5760405162461bcd60e51b815260040161086d90612b4e565b6110186000612036565b565b600a546001600160a01b031633146110445760405162461bcd60e51b815260040161086d90612b4e565b600a8054911515600160a81b0260ff60a81b19909216919091179055565b600a546001600160a01b0316331461108c5760405162461bcd60e51b815260040161086d90612b4e565b60005b81811015610af55760008383838181106110ab576110ab612d8e565b90506020020160208101906110c09190612754565b6001600160a01b031614156111105760405162461bcd60e51b815260206004820152601660248201527543616e277420616464207a65726f206164647265737360501b604482015260640161086d565b6001600f600085858581811061112857611128612d8e565b905060200201602081019061113d9190612754565b6001600160a01b0316815260208101919091526040016000908120805460ff19169215159290921790915560108185858581811061117d5761117d612d8e565b90506020020160208101906111929190612754565b6001600160a01b03166001600160a01b0316815260200190815260200160002054116111bf57600061120c565b601060008484848181106111d5576111d5612d8e565b90506020020160208101906111ea9190612754565b6001600160a01b03166001600160a01b03168152602001908152602001600020545b508061121781612d1d565b91505061108f565b600a546001600160a01b031633146112495760405162461bcd60e51b815260040161086d90612b4e565b600c55565b600a546001600160a01b031633146112785760405162461bcd60e51b815260040161086d90612b4e565b610af56011838361268f565b6060600180546108cc90612ce2565b6001600160a01b0382163314156112ec5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161086d565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b031633146113825760405162461bcd60e51b815260040161086d90612b4e565b60005b81811015610af55760008383838181106113a1576113a1612d8e565b90506020020160208101906113b69190612754565b6001600160a01b031614156114065760405162461bcd60e51b815260206004820152601660248201527543616e277420616464207a65726f206164647265737360501b604482015260640161086d565b6000600f600085858581811061141e5761141e612d8e565b90506020020160208101906114339190612754565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061146581612d1d565b915050611385565b6114773383611d94565b6114935760405162461bcd60e51b815260040161086d90612b83565b61149f84848484612088565b50505050565b6114b26126ac6063612c54565b81565b600a54600160a01b900460ff166115075760405162461bcd60e51b8152602060048201526016602482015275436f6e7472616374206973206e6f742061637469766560501b604482015260640161086d565b600a54600160a81b900460ff166115605760405162461bcd60e51b815260206004820152601f60248201527f57686974656c697374206d696e74696e67206973206e6f742061637469766500604482015260640161086d565b336000908152600f602052604090205460ff166115bf5760405162461bcd60e51b815260206004820152601c60248201527f596f7520617265206e6f74206f6e207468652077686974656c69737400000000604482015260640161086d565b6115cc6126ac6063612c54565b600854106115ec5760405162461bcd60e51b815260040161086d90612c1d565b600c5481111561163e5760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e73604482015260640161086d565b6126ac81600e5461164f9190612c54565b111561166d5760405162461bcd60e51b815260040161086d90612bd4565b600c543360009081526010602052604090205461168b908390612c54565b11156116d95760405162461bcd60e51b815260206004820152601c60248201527f50757263686173652065786365656473206d617820616c6c6f77656400000000604482015260640161086d565b346116ec8267010a741a46278000612c80565b11156117345760405162461bcd60e51b815260206004820152601760248201527611551208185b5bdd5b9d081a5b9cdd59999a58da595b9d604a1b604482015260640161086d565b60005b81811015610dc8576000600e5460636117509190612c54565b61175b906001612c54565b90506001600e60008282546117709190612c54565b9091555050336000908152601060205260408120805460019290611795908490612c54565b909155506117a590503382611d7a565b50806117b081612d1d565b915050611737565b6000818152600260205260409020546060906001600160a01b03166118165760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b604482015260640161086d565b60006013805461182590612ce2565b80601f016020809104026020016040519081016040528092919081815260200182805461185190612ce2565b801561189e5780601f106118735761010080835404028352916020019161189e565b820191906000526020600020905b81548152906001019060200180831161188157829003601f168201915b50505050509050600081511161193e57601280546118bb90612ce2565b80601f01602080910402602001604051908101604052809291908181526020018280546118e790612ce2565b80156119345780601f1061190957610100808354040283529160200191611934565b820191906000526020600020905b81548152906001019060200180831161191757829003601f168201915b5050505050611969565b80611948846120bb565b604051602001611959929190612a7d565b6040516020818303038152906040525b9392505050565b6060601180546108cc90612ce2565b600a54600160a01b900460ff166119d15760405162461bcd60e51b8152602060048201526016602482015275436f6e7472616374206973206e6f742061637469766560501b604482015260640161086d565b600a54600160a81b900460ff1615611a2b5760405162461bcd60e51b815260206004820152601d60248201527f4f6e6c7920616c6c6f77696e672066726f6d20416c6c6f77204c697374000000604482015260640161086d565b611a386126ac6063612c54565b60085410611a585760405162461bcd60e51b815260040161086d90612c1d565b600c811115611aa95760405162461bcd60e51b815260206004820152601b60248201527f576f756c64206578636565642050555243484153455f4c494d49540000000000604482015260640161086d565b6126ac600e5410611acc5760405162461bcd60e51b815260040161086d90612bd4565b34611adf8267010a741a46278000612c80565b1115611b275760405162461bcd60e51b815260206004820152601760248201527611551208185b5bdd5b9d081a5b9cdd59999a58da595b9d604a1b604482015260640161086d565b60005b81811015610dc8576126ac600e541015611b81576000600e546063611b4f9190612c54565b611b5a906001612c54565b90506001600e6000828254611b6f9190612c54565b90915550611b7f90503382611d7a565b505b80611b8b81612d1d565b915050611b2a565b600a546001600160a01b03163314611bbd5760405162461bcd60e51b815260040161086d90612b4e565b6001600160a01b038116611c225760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161086d565b611c2b81612036565b50565b600b8054611c3b90612ce2565b80601f0160208091040260200160405190810160405280929190818152602001828054611c6790612ce2565b8015611cb45780601f10611c8957610100808354040283529160200191611cb4565b820191906000526020600020905b815481529060010190602001808311611c9757829003601f168201915b505050505081565b60006001600160e01b031982166380ac58cd60e01b1480611ced57506001600160e01b03198216635b5e139f60e01b145b806108b757506301ffc9a760e01b6001600160e01b03198316146108b7565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611d4182610eb0565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610dc88282604051806020016040528060008152506121b9565b6000818152600260205260408120546001600160a01b0316611e0d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161086d565b6000611e1883610eb0565b9050806001600160a01b0316846001600160a01b03161480611e535750836001600160a01b0316611e488461094f565b6001600160a01b0316145b80611e8357506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611e9e82610eb0565b6001600160a01b031614611f065760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161086d565b6001600160a01b038216611f685760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161086d565b611f738383836121ec565b611f7e600082611d0c565b6001600160a01b0383166000908152600360205260408120805460019290611fa7908490612c9f565b90915550506001600160a01b0382166000908152600360205260408120805460019290611fd5908490612c54565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b612093848484611e8b565b61209f848484846122a4565b61149f5760405162461bcd60e51b815260040161086d90612afc565b6060816120df5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561210957806120f381612d1d565b91506121029050600a83612c6c565b91506120e3565b60008167ffffffffffffffff81111561212457612124612da4565b6040519080825280601f01601f19166020018201604052801561214e576020820181803683370190505b5090505b8415611e8357612163600183612c9f565b9150612170600a86612d38565b61217b906030612c54565b60f81b81838151811061219057612190612d8e565b60200101906001600160f81b031916908160001a9053506121b2600a86612c6c565b9450612152565b6121c383836123b1565b6121d060008484846122a4565b610af55760405162461bcd60e51b815260040161086d90612afc565b6001600160a01b0383166122475761224281600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61226a565b816001600160a01b0316836001600160a01b03161461226a5761226a83826124ff565b6001600160a01b03821661228157610af58161259c565b826001600160a01b0316826001600160a01b031614610af557610af5828261264b565b60006001600160a01b0384163b156123a657604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906122e8903390899088908890600401612aac565b602060405180830381600087803b15801561230257600080fd5b505af1925050508015612332575060408051601f3d908101601f1916820190925261232f918101906129bb565b60015b61238c573d808015612360576040519150601f19603f3d011682016040523d82523d6000602084013e612365565b606091505b5080516123845760405162461bcd60e51b815260040161086d90612afc565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611e83565b506001949350505050565b6001600160a01b0382166124075760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161086d565b6000818152600260205260409020546001600160a01b03161561246c5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161086d565b612478600083836121ec565b6001600160a01b03821660009081526003602052604081208054600192906124a1908490612c54565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000600161250c84610f5d565b6125169190612c9f565b600083815260076020526040902054909150808214612569576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906125ae90600190612c9f565b600083815260096020526040812054600880549394509092849081106125d6576125d6612d8e565b9060005260206000200154905080600883815481106125f7576125f7612d8e565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061262f5761262f612d78565b6001900381819060005260206000200160009055905550505050565b600061265683610f5d565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461269b90612ce2565b90600052602060002090601f0160209004810192826126bd5760008555612703565b82601f106126d65782800160ff19823516178555612703565b82800160010185558215612703579182015b828111156127035782358255916020019190600101906126e8565b5061270f929150612713565b5090565b5b8082111561270f5760008155600101612714565b80356001600160a01b038116811461273f57600080fd5b919050565b8035801515811461273f57600080fd5b60006020828403121561276657600080fd5b61196982612728565b6000806040838503121561278257600080fd5b61278b83612728565b915061279960208401612728565b90509250929050565b6000806000606084860312156127b757600080fd5b6127c084612728565b92506127ce60208501612728565b9150604084013590509250925092565b600080600080608085870312156127f457600080fd5b6127fd85612728565b935061280b60208601612728565b925060408501359150606085013567ffffffffffffffff8082111561282f57600080fd5b818701915087601f83011261284357600080fd5b81358181111561285557612855612da4565b604051601f8201601f19908116603f0116810190838211818310171561287d5761287d612da4565b816040528281528a602084870101111561289657600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080604083850312156128cd57600080fd5b6128d683612728565b915061279960208401612744565b600080604083850312156128f757600080fd5b61290083612728565b946020939093013593505050565b6000806020838503121561292157600080fd5b823567ffffffffffffffff8082111561293957600080fd5b818501915085601f83011261294d57600080fd5b81358181111561295c57600080fd5b8660208260051b850101111561297157600080fd5b60209290920196919550909350505050565b60006020828403121561299557600080fd5b61196982612744565b6000602082840312156129b057600080fd5b813561196981612dba565b6000602082840312156129cd57600080fd5b815161196981612dba565b600080602083850312156129eb57600080fd5b823567ffffffffffffffff80821115612a0357600080fd5b818501915085601f830112612a1757600080fd5b813581811115612a2657600080fd5b86602082850101111561297157600080fd5b600060208284031215612a4a57600080fd5b5035919050565b60008151808452612a69816020860160208601612cb6565b601f01601f19169290920160200192915050565b60008351612a8f818460208801612cb6565b835190830190612aa3818360208801612cb6565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612adf90830184612a51565b9695505050505050565b6020815260006119696020830184612a51565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526029908201527f507572636861736520776f756c6420657863656564205477656e74794669766560408201526846465f5055424c494360b81b606082015260800190565b6020808252601b908201527f416c6c20746f6b656e732068617665206265656e206d696e7465640000000000604082015260600190565b60008219821115612c6757612c67612d4c565b500190565b600082612c7b57612c7b612d62565b500490565b6000816000190483118215151615612c9a57612c9a612d4c565b500290565b600082821015612cb157612cb1612d4c565b500390565b60005b83811015612cd1578181015183820152602001612cb9565b8381111561149f5750506000910152565b600181811c90821680612cf657607f821691505b60208210811415612d1757634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612d3157612d31612d4c565b5060010190565b600082612d4757612d47612d62565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611c2b57600080fdfea264697066735822122004ba214d5e483720b36992288351231a9ce60d69555c3a31ff9a2c8d1e9f8b6b64736f6c63430008050033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000004323534350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043235343500000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): 2545
Arg [1] : symbol (string): 2545

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [3] : 3235343500000000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [5] : 3235343500000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

42274:7076:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44431:222;;;;;;;;;;-1:-1:-1;44431:222:0;;;;;:::i;:::-;;:::i;:::-;;;18725:25:1;;;18713:2;18698:18;44431:222:0;;;;;;;;32850:260;;;;;;;;;;-1:-1:-1;32850:260:0;;;;;:::i;:::-;;:::i;:::-;;;6501:14:1;;6494:22;6476:41;;6464:2;6449:18;32850:260:0;6431:92:1;20407:94:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;21930:239::-;;;;;;;;;;-1:-1:-1;21930:239:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;5799:32:1;;;5781:51;;5769:2;5754:18;21930:239:0;5736:102:1;21495:377:0;;;;;;;;;;-1:-1:-1;21495:377:0;;;;;:::i;:::-;;:::i;:::-;;42547:50;;;;;;;;;;;;42593:4;42547:50;;48131:107;;;;;;;;;;-1:-1:-1;48131:107:0;;;;;:::i;:::-;;:::i;47243:501::-;;;;;;;;;;-1:-1:-1;47243:501:0;;;;;:::i;:::-;;:::i;33549:107::-;;;;;;;;;;-1:-1:-1;33633:10:0;:17;33549:107;;42691:28;;;;;;;;;;-1:-1:-1;42691:28:0;;;;-1:-1:-1;;;42691:28:0;;;;;;22840:332;;;;;;;;;;-1:-1:-1;22840:332:0;;;;;:::i;:::-;;:::i;47750:98::-;;;;;;;;;;-1:-1:-1;47750:98:0;;;;;:::i;:::-;;:::i;42724:37::-;;;;;;;;;;-1:-1:-1;42724:37:0;;;;-1:-1:-1;;;42724:37:0;;;;;;33186:295;;;;;;;;;;-1:-1:-1;33186:295:0;;;;;:::i;:::-;;:::i;43799:109::-;;;;;;;;;;-1:-1:-1;43799:109:0;;;;;:::i;:::-;-1:-1:-1;;;;;43886:16:0;43866:4;43886:16;;;:10;:16;;;;;;;;;43799:109;48244:146;;;;;;;;;;;;;:::i;23235:165::-;;;;;;;;;;-1:-1:-1;23235:165:0;;;;;:::i;:::-;;:::i;33725:272::-;;;;;;;;;;-1:-1:-1;33725:272:0;;;;;:::i;:::-;;:::i;48506:101::-;;;;;;;;;;-1:-1:-1;48506:101:0;;;;;:::i;:::-;;:::i;20095:253::-;;;;;;;;;;-1:-1:-1;20095:253:0;;;;;:::i;:::-;;:::i;42496:46::-;;;;;;;;;;;;42540:2;42496:46;;48613:159;;;;;;;;;;-1:-1:-1;48613:159:0;;;;;:::i;:::-;;:::i;19815:226::-;;;;;;;;;;-1:-1:-1;19815:226:0;;;;;:::i;:::-;;:::i;40370:88::-;;;;;;;;;;;;;:::i;47854:152::-;;;;;;;;;;-1:-1:-1;47854:152:0;;;;;:::i;:::-;;:::i;43297:496::-;;;;;;;;;;-1:-1:-1;43297:496:0;;;;;:::i;:::-;;:::i;48012:113::-;;;;;;;;;;-1:-1:-1;48012:113:0;;;;;:::i;:::-;;:::i;42792:35::-;;;;;;;;;;;;;;;;42448:43;;;;;;;;;;;;42480:11;42448:43;;39759:81;;;;;;;;;;-1:-1:-1;39828:6:0;;-1:-1:-1;;;;;39828:6:0;39759:81;;48396:104;;;;;;;;;;-1:-1:-1;48396:104:0;;;;;:::i;:::-;;:::i;20562:98::-;;;;;;;;;;;;;:::i;22233:299::-;;;;;;;;;;-1:-1:-1;22233:299:0;;;;;:::i;:::-;;:::i;43914:360::-;;;;;;;;;;-1:-1:-1;43914:360:0;;;;;:::i;:::-;;:::i;23463:321::-;;;;;;;;;;-1:-1:-1;23463:321:0;;;;;:::i;:::-;;:::i;42602:82::-;;;;;;;;;;;;;:::i;46012:1225::-;;;;;;:::i;:::-;;:::i;48884:463::-;;;;;;;;;;-1:-1:-1;48884:463:0;;;;;:::i;:::-;;:::i;42909:30::-;;;;;;;;;;;;;;;;42400:43;;;;;;;;;;;;42441:2;42400:43;;42944:32;;;;;;;;;;;;;;;;48778:100;;;;;;;;;;;;;:::i;22595:186::-;;;;;;;;;;-1:-1:-1;22595:186:0;;;;;:::i;:::-;-1:-1:-1;;;;;22740:25:0;;;22717:4;22740:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;22595:186;44659:1347;;;;;;:::i;:::-;;:::i;40603:182::-;;;;;;;;;;-1:-1:-1;40603:182:0;;;;;:::i;:::-;;:::i;42766:19::-;;;;;;;;;;;;;:::i;44431:222::-;44526:7;-1:-1:-1;;;;;44553:19:0;;44545:62;;;;-1:-1:-1;;;44545:62:0;;14585:2:1;44545:62:0;;;14567:21:1;14624:2;14604:18;;;14597:30;14663:32;14643:18;;;14636:60;14713:18;;44545:62:0;;;;;;;;;-1:-1:-1;;;;;;44623:24:0;;;;;:17;:24;;;;;;;44431:222::o;32850:260::-;32977:4;-1:-1:-1;;;;;;33007:50:0;;-1:-1:-1;;;33007:50:0;;:97;;;33068:36;33092:11;33068:23;:36::i;:::-;32993:111;32850:260;-1:-1:-1;;32850:260:0:o;20407:94::-;20461:13;20490:5;20483:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20407:94;:::o;21930:239::-;22031:7;25316:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25316:16:0;22050:73;;;;-1:-1:-1;;;22050:73:0;;13811:2:1;22050:73:0;;;13793:21:1;13850:2;13830:18;;;13823:30;13889:34;13869:18;;;13862:62;-1:-1:-1;;;13940:18:1;;;13933:42;13992:19;;22050:73:0;13783:234:1;22050:73:0;-1:-1:-1;22139:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;22139:24:0;;21930:239::o;21495:377::-;21572:13;21588:23;21603:7;21588:14;:23::i;:::-;21572:39;;21632:5;-1:-1:-1;;;;;21626:11:0;:2;-1:-1:-1;;;;;21626:11:0;;;21618:57;;;;-1:-1:-1;;;21618:57:0;;15713:2:1;21618:57:0;;;15695:21:1;15752:2;15732:18;;;15725:30;15791:34;15771:18;;;15764:62;-1:-1:-1;;;15842:18:1;;;15835:31;15883:19;;21618:57:0;15685:223:1;21618:57:0;15242:10;-1:-1:-1;;;;;21700:21:0;;;;:62;;-1:-1:-1;21725:37:0;21742:5;15242:10;22595:186;:::i;21725:37::-;21684:152;;;;-1:-1:-1;;;21684:152:0;;11853:2:1;21684:152:0;;;11835:21:1;11892:2;11872:18;;;11865:30;11931:34;11911:18;;;11904:62;12002:26;11982:18;;;11975:54;12046:19;;21684:152:0;11825:246:1;21684:152:0;21845:21;21854:2;21858:7;21845:8;:21::i;:::-;21565:307;21495:377;;:::o;48131:107::-;39828:6;;-1:-1:-1;;;;;39828:6:0;15242:10;39961:23;39953:68;;;;-1:-1:-1;;;39953:68:0;;;;;;;:::i;:::-;48213:19:::1;:5;48221:11:::0;;48213:19:::1;:::i;47243:501::-:0;39828:6;;-1:-1:-1;;;;;39828:6:0;15242:10;39961:23;39953:68;;;;-1:-1:-1;;;39953:68:0;;;;;;;:::i;:::-;42645:39:::1;42593:4;42540:2;42645:39;:::i;:::-;33633:10:::0;:17;47323:32:::1;47315:72;;;;-1:-1:-1::0;;;47315:72:0::1;;;;;;;:::i;:::-;47410:15;::::0;42540:2:::1;::::0;47410:27:::1;::::0;47428:2;;47410:27:::1;:::i;:::-;:48;;47394:112;;;::::0;-1:-1:-1;;;47394:112:0;;15354:2:1;47394:112:0::1;::::0;::::1;15336:21:1::0;15393:2;15373:18;;;15366:30;15432:32;15412:18;;;15405:60;15482:18;;47394:112:0::1;15326:180:1::0;47394:112:0::1;47520:9;47515:224;47535:13:::0;;::::1;47515:224;;;47629:15;47647;;47665:1;47647:19;;;;:::i;:::-;47629:37;;47696:1;47677:15;;:20;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;47706:25:0::1;::::0;-1:-1:-1;47716:2:0;;47719:1;47716:5;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;47723:7;47706:9;:25::i;:::-;-1:-1:-1::0;47550:3:0;::::1;::::0;::::1;:::i;:::-;;;;47515:224;;22840:332:::0;23021:41;15242:10;23054:7;23021:18;:41::i;:::-;23005:124;;;;-1:-1:-1;;;23005:124:0;;;;;;;:::i;:::-;23138:28;23148:4;23154:2;23158:7;23138:9;:28::i;47750:98::-;39828:6;;-1:-1:-1;;;;;39828:6:0;15242:10;39961:23;39953:68;;;;-1:-1:-1;;;39953:68:0;;;;;;;:::i;:::-;47822:8:::1;:20:::0;;;::::1;;-1:-1:-1::0;;;47822:20:0::1;-1:-1:-1::0;;;;47822:20:0;;::::1;::::0;;;::::1;::::0;;47750:98::o;33186:295::-;33308:7;33351:23;33368:5;33351:16;:23::i;:::-;33343:5;:31;33327:108;;;;-1:-1:-1;;;33327:108:0;;7663:2:1;33327:108:0;;;7645:21:1;7702:2;7682:18;;;7675:30;7741:34;7721:18;;;7714:62;-1:-1:-1;;;7792:18:1;;;7785:41;7843:19;;33327:108:0;7635:233:1;33327:108:0;-1:-1:-1;;;;;;33449:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;33186:295::o;48244:146::-;39828:6;;-1:-1:-1;;;;;39828:6:0;15242:10;39961:23;39953:68;;;;-1:-1:-1;;;39953:68:0;;;;;;;:::i;:::-;48347:37:::1;::::0;48317:21:::1;::::0;48355:10:::1;::::0;48347:37;::::1;;;::::0;48317:21;;48299:15:::1;48347:37:::0;48299:15;48347:37;48317:21;48355:10;48347:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;48292:98;48244:146::o:0;23235:165::-;23355:39;23372:4;23378:2;23382:7;23355:39;;;;;;;;;;;;:16;:39::i;33725:272::-;33825:7;33868:30;33633:10;:17;;33549:107;33868:30;33860:5;:38;33844:116;;;;-1:-1:-1;;;33844:116:0;;16884:2:1;33844:116:0;;;16866:21:1;16923:2;16903:18;;;16896:30;16962:34;16942:18;;;16935:62;-1:-1:-1;;;17013:18:1;;;17006:42;17065:19;;33844:116:0;16856:234:1;33844:116:0;33974:10;33985:5;33974:17;;;;;;;;:::i;:::-;;;;;;;;;33967:24;;33725:272;;;:::o;48506:101::-;39828:6;;-1:-1:-1;;;;;39828:6:0;15242:10;39961:23;39953:68;;;;-1:-1:-1;;;39953:68:0;;;;;;;:::i;:::-;48582:19:::1;:13;48598:3:::0;;48582:19:::1;:::i;20095:253::-:0;20192:7;20227:16;;;:7;:16;;;;;;-1:-1:-1;;;;;20227:16:0;20258:19;20250:73;;;;-1:-1:-1;;;20250:73:0;;12689:2:1;20250:73:0;;;12671:21:1;12728:2;12708:18;;;12701:30;12767:34;12747:18;;;12740:62;-1:-1:-1;;;12818:18:1;;;12811:39;12867:19;;20250:73:0;12661:231:1;48613:159:0;39828:6;;-1:-1:-1;;;;;39828:6:0;15242:10;39961:23;39953:68;;;;-1:-1:-1;;;39953:68:0;;;;;;;:::i;:::-;48727:39:::1;:21;48751:15:::0;;48727:39:::1;:::i;19815:226::-:0;19912:7;-1:-1:-1;;;;;19939:19:0;;19931:74;;;;-1:-1:-1;;;19931:74:0;;12278:2:1;19931:74:0;;;12260:21:1;12317:2;12297:18;;;12290:30;12356:34;12336:18;;;12329:62;-1:-1:-1;;;12407:18:1;;;12400:40;12457:19;;19931:74:0;12250:232:1;19931:74:0;-1:-1:-1;;;;;;20019:16:0;;;;;:9;:16;;;;;;;19815:226::o;40370:88::-;39828:6;;-1:-1:-1;;;;;39828:6:0;15242:10;39961:23;39953:68;;;;-1:-1:-1;;;39953:68:0;;;;;;;:::i;:::-;40431:21:::1;40449:1;40431:9;:21::i;:::-;40370:88::o:0;47854:152::-;39828:6;;-1:-1:-1;;;;;39828:6:0;15242:10;39961:23;39953:68;;;;-1:-1:-1;;;39953:68:0;;;;;;;:::i;:::-;47962:17:::1;:38:::0;;;::::1;;-1:-1:-1::0;;;47962:38:0::1;-1:-1:-1::0;;;;47962:38:0;;::::1;::::0;;;::::1;::::0;;47854:152::o;43297:496::-;39828:6;;-1:-1:-1;;;;;39828:6:0;15242:10;39961:23;39953:68;;;;-1:-1:-1;;;39953:68:0;;;;;;;:::i;:::-;43409:9:::1;43404:384;43424:20:::0;;::::1;43404:384;;;43492:1;43468:9:::0;;43478:1;43468:12;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;43468:26:0::1;;;43460:61;;;::::0;-1:-1:-1;;;43460:61:0;;16533:2:1;43460:61:0::1;::::0;::::1;16515:21:1::0;16572:2;16552:18;;;16545:30;-1:-1:-1;;;16591:18:1;;;16584:52;16653:18;;43460:61:0::1;16505:172:1::0;43460:61:0::1;43559:4;43532:10;:24;43543:9;;43553:1;43543:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;43532:24:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;43532:24:0;;;:31;;-1:-1:-1;;43532:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;43707:17:::1;-1:-1:-1::0;43725:9:0;;43735:1;43725:12;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;43707:31:0::1;-1:-1:-1::0;;;;;43707:31:0::1;;;;;;;;;;;;;:35;:73;;43779:1;43707:73;;;43745:17;:31;43763:9;;43773:1;43763:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;43745:31:0::1;-1:-1:-1::0;;;;;43745:31:0::1;;;;;;;;;;;;;43707:73;-1:-1:-1::0;43446:3:0;::::1;::::0;::::1;:::i;:::-;;;;43404:384;;48012:113:::0;39828:6;;-1:-1:-1;;;;;39828:6:0;15242:10;39961:23;39953:68;;;;-1:-1:-1;;;39953:68:0;;;;;;;:::i;:::-;48093:16:::1;:26:::0;48012:113::o;48396:104::-;39828:6;;-1:-1:-1;;;;;39828:6:0;15242:10;39961:23;39953:68;;;;-1:-1:-1;;;39953:68:0;;;;;;;:::i;:::-;48476:18:::1;:12;48491:3:::0;;48476:18:::1;:::i;20562:98::-:0;20618:13;20647:7;20640:14;;;;;:::i;22233:299::-;-1:-1:-1;;;;;22350:24:0;;15242:10;22350:24;;22342:62;;;;-1:-1:-1;;;22342:62:0;;10737:2:1;22342:62:0;;;10719:21:1;10776:2;10756:18;;;10749:30;10815:27;10795:18;;;10788:55;10860:18;;22342:62:0;10709:175:1;22342:62:0;15242:10;22413:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;22413:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;22413:53:0;;;;;;;;;;22478:48;;6476:41:1;;;22413:42:0;;15242:10;22478:48;;6449:18:1;22478:48:0;;;;;;;22233:299;;:::o;43914:360::-;39828:6;;-1:-1:-1;;;;;39828:6:0;15242:10;39961:23;39953:68;;;;-1:-1:-1;;;39953:68:0;;;;;;;:::i;:::-;44031:9:::1;44026:243;44046:20:::0;;::::1;44026:243;;;44114:1;44090:9:::0;;44100:1;44090:12;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;44090:26:0::1;;;44082:61;;;::::0;-1:-1:-1;;;44082:61:0;;16533:2:1;44082:61:0::1;::::0;::::1;16515:21:1::0;16572:2;16552:18;;;16545:30;-1:-1:-1;;;16591:18:1;;;16584:52;16653:18;;44082:61:0::1;16505:172:1::0;44082:61:0::1;44256:5;44229:10;:24;44240:9;;44250:1;44240:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;44229:24:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;44229:24:0;:32;;-1:-1:-1;;44229:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;44068:3;::::1;::::0;::::1;:::i;:::-;;;;44026:243;;23463:321:::0;23624:41;15242:10;23657:7;23624:18;:41::i;:::-;23608:124;;;;-1:-1:-1;;;23608:124:0;;;;;;;:::i;:::-;23739:39;23753:4;23759:2;23763:7;23772:5;23739:13;:39::i;:::-;23463:321;;;;:::o;42602:82::-;42645:39;42593:4;42540:2;42645:39;:::i;:::-;42602:82;:::o;46012:1225::-;46104:8;;-1:-1:-1;;;46104:8:0;;;;46096:43;;;;-1:-1:-1;;;46096:43:0;;13460:2:1;46096:43:0;;;13442:21:1;13499:2;13479:18;;;13472:30;-1:-1:-1;;;13518:18:1;;;13511:52;13580:18;;46096:43:0;13432:172:1;46096:43:0;46154:17;;-1:-1:-1;;;46154:17:0;;;;46146:61;;;;-1:-1:-1;;;46146:61:0;;9972:2:1;46146:61:0;;;9954:21:1;10011:2;9991:18;;;9984:30;10050:33;10030:18;;;10023:61;10101:18;;46146:61:0;9944:181:1;46146:61:0;46233:10;46222:22;;;;:10;:22;;;;;;;;46214:63;;;;-1:-1:-1;;;46214:63:0;;6954:2:1;46214:63:0;;;6936:21:1;6993:2;6973:18;;;6966:30;7032;7012:18;;;7005:58;7080:18;;46214:63:0;6926:178:1;46214:63:0;42645:39;42593:4;42540:2;42645:39;:::i;:::-;33633:10;:17;46292:32;46284:72;;;;-1:-1:-1;;;46284:72:0;;;;;;;:::i;:::-;46397:16;;46379:14;:34;;46363:100;;;;-1:-1:-1;;;46363:100:0;;18420:2:1;46363:100:0;;;18402:21:1;;;18439:18;;;18432:30;18498:34;18478:18;;;18471:62;18550:18;;46363:100:0;18392:182:1;46363:100:0;42593:4;46506:14;46486:17;;:34;;;;:::i;:::-;:57;;46470:132;;;;-1:-1:-1;;;46470:132:0;;;;;;;:::i;:::-;46675:16;;46643:10;46625:29;;;;:17;:29;;;;;;:46;;46657:14;;46625:46;:::i;:::-;:66;;46609:128;;;;-1:-1:-1;;;46609:128:0;;17297:2:1;46609:128:0;;;17279:21:1;17336:2;17316:18;;;17309:30;17375;17355:18;;;17348:58;17423:18;;46609:128:0;17269:178:1;46609:128:0;46786:9;46760:22;46768:14;42480:11;46760:22;:::i;:::-;:35;;46744:92;;;;-1:-1:-1;;;46744:92:0;;7311:2:1;46744:92:0;;;7293:21:1;7350:2;7330:18;;;7323:30;-1:-1:-1;;;7369:18:1;;;7362:53;7432:18;;46744:92:0;7283:173:1;46744:92:0;46850:9;46845:387;46869:14;46865:1;:18;46845:387;;;47050:15;47088:17;;42540:2;47068:37;;;;:::i;:::-;:41;;47108:1;47068:41;:::i;:::-;47050:59;;47141:1;47120:17;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;47169:10:0;47151:29;;;;:17;:29;;;;;:34;;47184:1;;47151:29;:34;;47184:1;;47151:34;:::i;:::-;;;;-1:-1:-1;47194:30:0;;-1:-1:-1;47204:10:0;47216:7;47194:9;:30::i;:::-;-1:-1:-1;46885:3:0;;;;:::i;:::-;;;;46845:387;;48884:463;25296:4;25316:16;;;:7;:16;;;;;;48977:13;;-1:-1:-1;;;;;25316:16:0;49002:49;;;;-1:-1:-1;;;49002:49:0;;11091:2:1;49002:49:0;;;11073:21:1;11130:2;11110:18;;;11103:30;-1:-1:-1;;;11149:18:1;;;11142:50;11209:18;;49002:49:0;11063:170:1;49002:49:0;49136:29;49168:21;49136:53;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49242:1;49216:15;49210:29;:33;:131;;49328:13;49210:131;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49279:15;49296:18;:7;:16;:18::i;:::-;49262:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49210:131;49196:145;48884:463;-1:-1:-1;;;48884:463:0:o;48778:100::-;48831:13;48860:12;48853:19;;;;;:::i;44659:1347::-;44742:8;;-1:-1:-1;;;44742:8:0;;;;44734:43;;;;-1:-1:-1;;;44734:43:0;;13460:2:1;44734:43:0;;;13442:21:1;13499:2;13479:18;;;13472:30;-1:-1:-1;;;13518:18:1;;;13511:52;13580:18;;44734:43:0;13432:172:1;44734:43:0;44793:17;;-1:-1:-1;;;44793:17:0;;;;44792:18;44784:60;;;;-1:-1:-1;;;44784:60:0;;8075:2:1;44784:60:0;;;8057:21:1;8114:2;8094:18;;;8087:30;8153:31;8133:18;;;8126:59;8202:18;;44784:60:0;8047:179:1;44784:60:0;42645:39;42593:4;42540:2;42645:39;:::i;:::-;33633:10;:17;44859:32;44851:72;;;;-1:-1:-1;;;44851:72:0;;;;;;;:::i;:::-;42441:2;44938:14;:32;;44930:72;;;;-1:-1:-1;;;44930:72:0;;9616:2:1;44930:72:0;;;9598:21:1;9655:2;9635:18;;;9628:30;9694:29;9674:18;;;9667:57;9741:18;;44930:72:0;9588:177:1;44930:72:0;42593:4;45218:17;;:39;45210:93;;;;-1:-1:-1;;;45210:93:0;;;;;;;:::i;:::-;45352:9;45326:22;45334:14;42480:11;45326:22;:::i;:::-;:35;;45310:92;;;;-1:-1:-1;;;45310:92:0;;7311:2:1;45310:92:0;;;7293:21:1;7350:2;7330:18;;;7323:30;-1:-1:-1;;;7369:18:1;;;7362:53;7432:18;;45310:92:0;7283:173:1;45310:92:0;45416:9;45411:590;45435:14;45431:1;:18;45411:590;;;42593:4;45634:17;;:39;45630:364;;;45849:15;45887:17;;42540:2;45867:37;;;;:::i;:::-;:41;;45907:1;45867:41;:::i;:::-;45849:59;;45942:1;45921:17;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;45954:30:0;;-1:-1:-1;45964:10:0;45976:7;45954:9;:30::i;:::-;45675:319;45630:364;45451:3;;;;:::i;:::-;;;;45411:590;;40603:182;39828:6;;-1:-1:-1;;;;;39828:6:0;15242:10;39961:23;39953:68;;;;-1:-1:-1;;;39953:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;40688:22:0;::::1;40680:73;;;::::0;-1:-1:-1;;;40680:73:0;;8852:2:1;40680:73:0::1;::::0;::::1;8834:21:1::0;8891:2;8871:18;;;8864:30;8930:34;8910:18;;;8903:62;-1:-1:-1;;;8981:18:1;;;8974:36;9027:19;;40680:73:0::1;8824:228:1::0;40680:73:0::1;40760:19;40770:8;40760:9;:19::i;:::-;40603:182:::0;:::o;42766:19::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;19450:309::-;19577:4;-1:-1:-1;;;;;;19607:40:0;;-1:-1:-1;;;19607:40:0;;:99;;-1:-1:-1;;;;;;;19658:48:0;;-1:-1:-1;;;19658:48:0;19607:99;:146;;;-1:-1:-1;;;;;;;;;;18147:40:0;;;19717:36;18014:179;28965:164;29036:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;29036:29:0;-1:-1:-1;;;;;29036:29:0;;;;;;;;:24;;29086:23;29036:24;29086:14;:23::i;:::-;-1:-1:-1;;;;;29077:46:0;;;;;;;;;;;28965:164;;:::o;26194:104::-;26266:26;26276:2;26280:7;26266:26;;;;;;;;;;;;:9;:26::i;25503:371::-;25616:4;25316:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25316:16:0;25632:73;;;;-1:-1:-1;;;25632:73:0;;11440:2:1;25632:73:0;;;11422:21:1;11479:2;11459:18;;;11452:30;11518:34;11498:18;;;11491:62;-1:-1:-1;;;11569:18:1;;;11562:42;11621:19;;25632:73:0;11412:234:1;25632:73:0;25712:13;25728:23;25743:7;25728:14;:23::i;:::-;25712:39;;25777:5;-1:-1:-1;;;;;25766:16:0;:7;-1:-1:-1;;;;;25766:16:0;;:58;;;;25817:7;-1:-1:-1;;;;;25793:31:0;:20;25805:7;25793:11;:20::i;:::-;-1:-1:-1;;;;;25793:31:0;;25766:58;:101;;;-1:-1:-1;;;;;;22740:25:0;;;22717:4;22740:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;25835:32;25758:110;25503:371;-1:-1:-1;;;;25503:371:0:o;28312:547::-;28461:4;-1:-1:-1;;;;;28434:31:0;:23;28449:7;28434:14;:23::i;:::-;-1:-1:-1;;;;;28434:31:0;;28418:106;;;;-1:-1:-1;;;28418:106:0;;14944:2:1;28418:106:0;;;14926:21:1;14983:2;14963:18;;;14956:30;15022:34;15002:18;;;14995:62;-1:-1:-1;;;15073:18:1;;;15066:39;15122:19;;28418:106:0;14916:231:1;28418:106:0;-1:-1:-1;;;;;28539:16:0;;28531:65;;;;-1:-1:-1;;;28531:65:0;;10332:2:1;28531:65:0;;;10314:21:1;10371:2;10351:18;;;10344:30;10410:34;10390:18;;;10383:62;-1:-1:-1;;;10461:18:1;;;10454:34;10505:19;;28531:65:0;10304:226:1;28531:65:0;28605:39;28626:4;28632:2;28636:7;28605:20;:39::i;:::-;28701:29;28718:1;28722:7;28701:8;:29::i;:::-;-1:-1:-1;;;;;28739:15:0;;;;;;:9;:15;;;;;:20;;28758:1;;28739:15;:20;;28758:1;;28739:20;:::i;:::-;;;;-1:-1:-1;;;;;;;28766:13:0;;;;;;:9;:13;;;;;:18;;28783:1;;28766:13;:18;;28783:1;;28766:18;:::i;:::-;;;;-1:-1:-1;;28791:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28791:21:0;-1:-1:-1;;;;;28791:21:0;;;;;;;;;28826:27;;28791:16;;28826:27;;;;;;;28312:547;;;:::o;40791:159::-;40862:6;;;-1:-1:-1;;;;;40875:17:0;;;-1:-1:-1;;;;;;40875:17:0;;;;;;;40904:40;;40862:6;;;40875:17;40862:6;;40904:40;;40843:16;;40904:40;40836:114;40791:159;:::o;24628:308::-;24763:28;24773:4;24779:2;24783:7;24763:9;:28::i;:::-;24814:48;24837:4;24843:2;24847:7;24856:5;24814:22;:48::i;:::-;24798:132;;;;-1:-1:-1;;;24798:132:0;;;;;;;:::i;15653:637::-;15709:13;15918:10;15914:43;;-1:-1:-1;;15939:10:0;;;;;;;;;;;;-1:-1:-1;;;15939:10:0;;;;;15653:637::o;15914:43::-;15978:5;15963:12;16011:62;16018:9;;16011:62;;16038:8;;;;:::i;:::-;;-1:-1:-1;16055:10:0;;-1:-1:-1;16063:2:0;16055:10;;:::i;:::-;;;16011:62;;;16079:19;16111:6;16101:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16101:17:0;;16079:39;;16125:132;16132:10;;16125:132;;16153:11;16163:1;16153:11;;:::i;:::-;;-1:-1:-1;16216:10:0;16224:2;16216:5;:10;:::i;:::-;16203:24;;:2;:24;:::i;:::-;16190:39;;16173:6;16180;16173:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;16173:56:0;;;;;;;;-1:-1:-1;16238:11:0;16247:2;16238:11;;:::i;:::-;;;16125:132;;26515:281;26627:18;26633:2;26637:7;26627:5;:18::i;:::-;26668:54;26699:1;26703:2;26707:7;26716:5;26668:22;:54::i;:::-;26652:138;;;;-1:-1:-1;;;26652:138:0;;;;;;;:::i;34578:521::-;-1:-1:-1;;;;;34762:18:0;;34758:167;;34791:40;34823:7;35886:10;:17;;35859:24;;;;:15;:24;;;;;:44;;;35910:24;;;;;;;;;;;;35786:154;34791:40;34758:167;;;34857:2;-1:-1:-1;;;;;34849:10:0;:4;-1:-1:-1;;;;;34849:10:0;;34845:80;;34870:47;34903:4;34909:7;34870:32;:47::i;:::-;-1:-1:-1;;;;;34935:16:0;;34931:163;;34962:45;34999:7;34962:36;:45::i;34931:163::-;35031:4;-1:-1:-1;;;;;35025:10:0;:2;-1:-1:-1;;;;;35025:10:0;;35021:73;;35046:40;35074:2;35078:7;35046:27;:40::i;29672:689::-;29809:4;-1:-1:-1;;;;;29826:13:0;;8041:20;8081:8;29822:534;;29865:72;;-1:-1:-1;;;29865:72:0;;-1:-1:-1;;;;;29865:36:0;;;;;:72;;15242:10;;29916:4;;29922:7;;29931:5;;29865:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29865:72:0;;;;;;;;-1:-1:-1;;29865:72:0;;;;;;;;;;;;:::i;:::-;;;29852:463;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30096:13:0;;30092:214;;30129:60;;-1:-1:-1;;;30129:60:0;;;;;;;:::i;30092:214::-;30274:6;30268:13;30259:6;30255:2;30251:15;30244:38;29852:463;-1:-1:-1;;;;;;29987:55:0;-1:-1:-1;;;29987:55:0;;-1:-1:-1;29980:62:0;;29822:534;-1:-1:-1;30344:4:0;29672:689;;;;;;:::o;27106:356::-;-1:-1:-1;;;;;27182:16:0;;27174:61;;;;-1:-1:-1;;;27174:61:0;;13099:2:1;27174:61:0;;;13081:21:1;;;13118:18;;;13111:30;13177:34;13157:18;;;13150:62;13229:18;;27174:61:0;13071:182:1;27174:61:0;25296:4;25316:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25316:16:0;:30;27242:58;;;;-1:-1:-1;;;27242:58:0;;9259:2:1;27242:58:0;;;9241:21:1;9298:2;9278:18;;;9271:30;9337;9317:18;;;9310:58;9385:18;;27242:58:0;9231:178:1;27242:58:0;27309:45;27338:1;27342:2;27346:7;27309:20;:45::i;:::-;-1:-1:-1;;;;;27363:13:0;;;;;;:9;:13;;;;;:18;;27380:1;;27363:13;:18;;27380:1;;27363:18;:::i;:::-;;;;-1:-1:-1;;27388:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;27388:21:0;-1:-1:-1;;;;;27388:21:0;;;;;;;;27423:33;;27388:16;;;27423:33;;27388:16;;27423:33;27106:356;;:::o;36549:936::-;36811:22;36861:1;36836:22;36853:4;36836:16;:22::i;:::-;:26;;;;:::i;:::-;36869:18;36890:26;;;:17;:26;;;;;;36811:51;;-1:-1:-1;37015:28:0;;;37011:306;;-1:-1:-1;;;;;37076:18:0;;37054:19;37076:18;;;:12;:18;;;;;;;;:34;;;;;;;;;37121:30;;;;;;:44;;;37232:30;;:17;:30;;;;;:43;;;37011:306;-1:-1:-1;37405:26:0;;;;:17;:26;;;;;;;;37398:33;;;-1:-1:-1;;;;;37445:18:0;;;;;:12;:18;;;;;:34;;;;;;;37438:41;36549:936::o;37768:1025::-;38034:10;:17;38009:22;;38034:21;;38054:1;;38034:21;:::i;:::-;38062:18;38083:24;;;:15;:24;;;;;;38440:10;:26;;38009:46;;-1:-1:-1;38083:24:0;;38009:46;;38440:26;;;;;;:::i;:::-;;;;;;;;;38418:48;;38500:11;38475:10;38486;38475:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;38576:28;;;:15;:28;;;;;;;:41;;;38740:24;;;;;38733:31;38771:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;37839:954;;;37768:1025;:::o;35388:207::-;35469:14;35486:20;35503:2;35486:16;:20::i;:::-;-1:-1:-1;;;;;35513:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;35554:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;35388:207:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:160::-;257:20;;313:13;;306:21;296:32;;286:2;;342:1;339;332:12;357:186;416:6;469:2;457:9;448:7;444:23;440:32;437:2;;;485:1;482;475:12;437:2;508:29;527:9;508:29;:::i;548:260::-;616:6;624;677:2;665:9;656:7;652:23;648:32;645:2;;;693:1;690;683:12;645:2;716:29;735:9;716:29;:::i;:::-;706:39;;764:38;798:2;787:9;783:18;764:38;:::i;:::-;754:48;;635:173;;;;;:::o;813:328::-;890:6;898;906;959:2;947:9;938:7;934:23;930:32;927:2;;;975:1;972;965:12;927:2;998:29;1017:9;998:29;:::i;:::-;988:39;;1046:38;1080:2;1069:9;1065:18;1046:38;:::i;:::-;1036:48;;1131:2;1120:9;1116:18;1103:32;1093:42;;917:224;;;;;:::o;1146:1138::-;1241:6;1249;1257;1265;1318:3;1306:9;1297:7;1293:23;1289:33;1286:2;;;1335:1;1332;1325:12;1286:2;1358:29;1377:9;1358:29;:::i;:::-;1348:39;;1406:38;1440:2;1429:9;1425:18;1406:38;:::i;:::-;1396:48;;1491:2;1480:9;1476:18;1463:32;1453:42;;1546:2;1535:9;1531:18;1518:32;1569:18;1610:2;1602:6;1599:14;1596:2;;;1626:1;1623;1616:12;1596:2;1664:6;1653:9;1649:22;1639:32;;1709:7;1702:4;1698:2;1694:13;1690:27;1680:2;;1731:1;1728;1721:12;1680:2;1767;1754:16;1789:2;1785;1782:10;1779:2;;;1795:18;;:::i;:::-;1870:2;1864:9;1838:2;1924:13;;-1:-1:-1;;1920:22:1;;;1944:2;1916:31;1912:40;1900:53;;;1968:18;;;1988:22;;;1965:46;1962:2;;;2014:18;;:::i;:::-;2054:10;2050:2;2043:22;2089:2;2081:6;2074:18;2129:7;2124:2;2119;2115;2111:11;2107:20;2104:33;2101:2;;;2150:1;2147;2140:12;2101:2;2206;2201;2197;2193:11;2188:2;2180:6;2176:15;2163:46;2251:1;2246:2;2241;2233:6;2229:15;2225:24;2218:35;2272:6;2262:16;;;;;;;1276:1008;;;;;;;:::o;2289:254::-;2354:6;2362;2415:2;2403:9;2394:7;2390:23;2386:32;2383:2;;;2431:1;2428;2421:12;2383:2;2454:29;2473:9;2454:29;:::i;:::-;2444:39;;2502:35;2533:2;2522:9;2518:18;2502:35;:::i;2548:254::-;2616:6;2624;2677:2;2665:9;2656:7;2652:23;2648:32;2645:2;;;2693:1;2690;2683:12;2645:2;2716:29;2735:9;2716:29;:::i;:::-;2706:39;2792:2;2777:18;;;;2764:32;;-1:-1:-1;;;2635:167:1:o;2807:615::-;2893:6;2901;2954:2;2942:9;2933:7;2929:23;2925:32;2922:2;;;2970:1;2967;2960:12;2922:2;3010:9;2997:23;3039:18;3080:2;3072:6;3069:14;3066:2;;;3096:1;3093;3086:12;3066:2;3134:6;3123:9;3119:22;3109:32;;3179:7;3172:4;3168:2;3164:13;3160:27;3150:2;;3201:1;3198;3191:12;3150:2;3241;3228:16;3267:2;3259:6;3256:14;3253:2;;;3283:1;3280;3273:12;3253:2;3336:7;3331:2;3321:6;3318:1;3314:14;3310:2;3306:23;3302:32;3299:45;3296:2;;;3357:1;3354;3347:12;3296:2;3388;3380:11;;;;;3410:6;;-1:-1:-1;2912:510:1;;-1:-1:-1;;;;2912:510:1:o;3427:180::-;3483:6;3536:2;3524:9;3515:7;3511:23;3507:32;3504:2;;;3552:1;3549;3542:12;3504:2;3575:26;3591:9;3575:26;:::i;3612:245::-;3670:6;3723:2;3711:9;3702:7;3698:23;3694:32;3691:2;;;3739:1;3736;3729:12;3691:2;3778:9;3765:23;3797:30;3821:5;3797:30;:::i;3862:249::-;3931:6;3984:2;3972:9;3963:7;3959:23;3955:32;3952:2;;;4000:1;3997;3990:12;3952:2;4032:9;4026:16;4051:30;4075:5;4051:30;:::i;4116:592::-;4187:6;4195;4248:2;4236:9;4227:7;4223:23;4219:32;4216:2;;;4264:1;4261;4254:12;4216:2;4304:9;4291:23;4333:18;4374:2;4366:6;4363:14;4360:2;;;4390:1;4387;4380:12;4360:2;4428:6;4417:9;4413:22;4403:32;;4473:7;4466:4;4462:2;4458:13;4454:27;4444:2;;4495:1;4492;4485:12;4444:2;4535;4522:16;4561:2;4553:6;4550:14;4547:2;;;4577:1;4574;4567:12;4547:2;4622:7;4617:2;4608:6;4604:2;4600:15;4596:24;4593:37;4590:2;;;4643:1;4640;4633:12;4713:180;4772:6;4825:2;4813:9;4804:7;4800:23;4796:32;4793:2;;;4841:1;4838;4831:12;4793:2;-1:-1:-1;4864:23:1;;4783:110;-1:-1:-1;4783:110:1:o;4898:257::-;4939:3;4977:5;4971:12;5004:6;4999:3;4992:19;5020:63;5076:6;5069:4;5064:3;5060:14;5053:4;5046:5;5042:16;5020:63;:::i;:::-;5137:2;5116:15;-1:-1:-1;;5112:29:1;5103:39;;;;5144:4;5099:50;;4947:208;-1:-1:-1;;4947:208:1:o;5160:470::-;5339:3;5377:6;5371:13;5393:53;5439:6;5434:3;5427:4;5419:6;5415:17;5393:53;:::i;:::-;5509:13;;5468:16;;;;5531:57;5509:13;5468:16;5565:4;5553:17;;5531:57;:::i;:::-;5604:20;;5347:283;-1:-1:-1;;;;5347:283:1:o;5843:488::-;-1:-1:-1;;;;;6112:15:1;;;6094:34;;6164:15;;6159:2;6144:18;;6137:43;6211:2;6196:18;;6189:34;;;6259:3;6254:2;6239:18;;6232:31;;;6037:4;;6280:45;;6305:19;;6297:6;6280:45;:::i;:::-;6272:53;6046:285;-1:-1:-1;;;;;;6046:285:1:o;6528:219::-;6677:2;6666:9;6659:21;6640:4;6697:44;6737:2;6726:9;6722:18;6714:6;6697:44;:::i;8231:414::-;8433:2;8415:21;;;8472:2;8452:18;;;8445:30;8511:34;8506:2;8491:18;;8484:62;-1:-1:-1;;;8577:2:1;8562:18;;8555:48;8635:3;8620:19;;8405:240::o;14022:356::-;14224:2;14206:21;;;14243:18;;;14236:30;14302:34;14297:2;14282:18;;14275:62;14369:2;14354:18;;14196:182::o;15913:413::-;16115:2;16097:21;;;16154:2;16134:18;;;16127:30;16193:34;16188:2;16173:18;;16166:62;-1:-1:-1;;;16259:2:1;16244:18;;16237:47;16316:3;16301:19;;16087:239::o;17452:405::-;17654:2;17636:21;;;17693:2;17673:18;;;17666:30;17732:34;17727:2;17712:18;;17705:62;-1:-1:-1;;;17798:2:1;17783:18;;17776:39;17847:3;17832:19;;17626:231::o;17862:351::-;18064:2;18046:21;;;18103:2;18083:18;;;18076:30;18142:29;18137:2;18122:18;;18115:57;18204:2;18189:18;;18036:177::o;18761:128::-;18801:3;18832:1;18828:6;18825:1;18822:13;18819:2;;;18838:18;;:::i;:::-;-1:-1:-1;18874:9:1;;18809:80::o;18894:120::-;18934:1;18960;18950:2;;18965:18;;:::i;:::-;-1:-1:-1;18999:9:1;;18940:74::o;19019:168::-;19059:7;19125:1;19121;19117:6;19113:14;19110:1;19107:21;19102:1;19095:9;19088:17;19084:45;19081:2;;;19132:18;;:::i;:::-;-1:-1:-1;19172:9:1;;19071:116::o;19192:125::-;19232:4;19260:1;19257;19254:8;19251:2;;;19265:18;;:::i;:::-;-1:-1:-1;19302:9:1;;19241:76::o;19322:258::-;19394:1;19404:113;19418:6;19415:1;19412:13;19404:113;;;19494:11;;;19488:18;19475:11;;;19468:39;19440:2;19433:10;19404:113;;;19535:6;19532:1;19529:13;19526:2;;;-1:-1:-1;;19570:1:1;19552:16;;19545:27;19375:205::o;19585:380::-;19664:1;19660:12;;;;19707;;;19728:2;;19782:4;19774:6;19770:17;19760:27;;19728:2;19835;19827:6;19824:14;19804:18;19801:38;19798:2;;;19881:10;19876:3;19872:20;19869:1;19862:31;19916:4;19913:1;19906:15;19944:4;19941:1;19934:15;19798:2;;19640:325;;;:::o;19970:135::-;20009:3;-1:-1:-1;;20030:17:1;;20027:2;;;20050:18;;:::i;:::-;-1:-1:-1;20097:1:1;20086:13;;20017:88::o;20110:112::-;20142:1;20168;20158:2;;20173:18;;:::i;:::-;-1:-1:-1;20207:9:1;;20148:74::o;20227:127::-;20288:10;20283:3;20279:20;20276:1;20269:31;20319:4;20316:1;20309:15;20343:4;20340:1;20333:15;20359:127;20420:10;20415:3;20411:20;20408:1;20401:31;20451:4;20448:1;20441:15;20475:4;20472:1;20465:15;20491:127;20552:10;20547:3;20543:20;20540:1;20533:31;20583:4;20580:1;20573:15;20607:4;20604:1;20597:15;20623:127;20684:10;20679:3;20675:20;20672:1;20665:31;20715:4;20712:1;20705:15;20739:4;20736:1;20729:15;20755:127;20816:10;20811:3;20807:20;20804:1;20797:31;20847:4;20844:1;20837:15;20871:4;20868:1;20861:15;20887:131;-1:-1:-1;;;;;;20961:32:1;;20951:43;;20941:2;;21008:1;21005;20998:12

Swarm Source

ipfs://04ba214d5e483720b36992288351231a9ce60d69555c3a31ff9a2c8d1e9f8b6b
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.