ETH Price: $3,166.27 (-1.45%)
 

Overview

Max Total Supply

17 DUNKS

Holders

5

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
jordanpaul.eth
Balance
10 DUNKS
0x60c26e0810569e539056e198cD03E7063Ac890b0
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Dunks

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-11-25
*/

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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC721/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: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol
pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol
pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {

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

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

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

// File: @openzeppelin/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;
        // solhint-disable-next-line no-inline-assembly
        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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol
pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

}

// File: @openzeppelin/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: @openzeppelin/contracts/token/ERC721/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}. 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 {
                    // solhint-disable-next-line no-inline-assembly
                    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` 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 { }
}

// File: @openzeppelin/contracts/token/ERC721/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: @openzeppelin/contracts/token/ERC721/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: @openzeppelin/contracts/access/Ownable.sol



pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File: Dunks.sol
pragma solidity ^0.8.0;

contract Dunks is ERC721Enumerable, Ownable {
    using SafeMath for uint256;
    using Strings for uint256;

    uint256 public constant NFT_SUPPLY = 10000;
    uint256 public constant MINT_PRICE = 30000000000000000;
    bool public saleStarted = false;
    string private _baseURIextended;
    uint256 public startingIndexBlock;
    uint256 public offset;

    constructor() ERC721("Dunks", "DUNKS") {
    }

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

    function setBaseURI(string memory baseURI_) external onlyOwner() {
        _baseURIextended = baseURI_;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        string memory baseURI = _baseURI();

        if (offset == 0) {
            return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, "")) : "";
        } else {
            uint256 dunkId = tokenId.add(offset) % NFT_SUPPLY;
            return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, dunkId.toString(), ".json")) : "";
        }
    }

   function mint(uint256 amountToMint) public payable {
        require(saleStarted == true, "Sale is not active.");
        require(totalSupply() < NFT_SUPPLY, "Dunks are sold out.");
        require(amountToMint > 0, "Must mint 1 Dunk.");
        require(amountToMint <= 20, "Cannot purchase this many Dunks.");
        require(totalSupply() + amountToMint <= NFT_SUPPLY, "Cannot mint.");
        require(MINT_PRICE.mul(amountToMint) == msg.value, "Incorrect ETH value.");

        for (uint256 i = 0; i < amountToMint; i++) {
            uint256 mintIndex = totalSupply();
            _safeMint(msg.sender, mintIndex);
        }

        if (startingIndexBlock == 0 && (totalSupply() == NFT_SUPPLY)) {
            startingIndexBlock = block.number;
        }
   }

   function reveal() public {
        require(offset == 0, "Offset is already set.");
        require(startingIndexBlock != 0, "Starting index block is required.");
        
        offset = uint(blockhash(startingIndexBlock)) % NFT_SUPPLY;
        
        if (block.number.sub(startingIndexBlock) > 255) {
            offset = uint(blockhash(block.number - 1)) % NFT_SUPPLY;
        }
        
        if (offset == 0) {
            offset = offset.add(1);
        }
   }

    function startSale() public onlyOwner {
        saleStarted = true;
    }

    function pauseSale() public onlyOwner {
        saleStarted = false;
    }

    function withdraw() public payable onlyOwner {
        require(payable(msg.sender).send(address(this).balance));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFT_SUPPLY","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountToMint","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"offset","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingIndexBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526000600a60146101000a81548160ff0219169083151502179055503480156200002c57600080fd5b506040518060400160405280600581526020017f44756e6b730000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f44554e4b530000000000000000000000000000000000000000000000000000008152508160009080519060200190620000b19291906200018c565b508060019080519060200190620000ca9291906200018c565b5050506000620000df6200018460201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620002a1565b600033905090565b8280546200019a906200023c565b90600052602060002090601f016020900481019282620001be57600085556200020a565b82601f10620001d957805160ff19168380011785556200020a565b828001600101855582156200020a579182015b8281111562000209578251825591602001919060010190620001ec565b5b5090506200021991906200021d565b5090565b5b80821115620002385760008160009055506001016200021e565b5090565b600060028204905060018216806200025557607f821691505b602082108114156200026c576200026b62000272565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61415780620002b16000396000f3fe6080604052600436106101cd5760003560e01c8063715018a6116100f7578063b66a0e5d11610095578063d555654411610064578063d555654414610622578063e36d64981461064d578063e985e9c514610678578063f2fde38b146106b5576101cd565b8063b66a0e5d1461057a578063b88d4fde14610591578063c002d23d146105ba578063c87b56dd146105e5576101cd565b80639aa4a125116100d15780639aa4a125146104f3578063a0712d681461051e578063a22cb4651461053a578063a475b5dd14610563576101cd565b8063715018a6146104865780638da5cb5b1461049d57806395d89b41146104c8576101cd565b80633ccfd60b1161016f57806355f804b31161013e57806355f804b3146103b85780635c474f9e146103e15780636352211e1461040c57806370a0823114610449576101cd565b80633ccfd60b1461033157806342842e0e1461033b5780634f6ccce71461036457806355367ba9146103a1576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806318160ddd146102a057806323b872dd146102cb5780632f745c59146102f4576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612e43565b6106de565b6040516102069190613935565b60405180910390f35b34801561021b57600080fd5b50610224610758565b6040516102319190613950565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190612ed6565b6107ea565b60405161026e91906138ce565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190612e07565b61086f565b005b3480156102ac57600080fd5b506102b5610987565b6040516102c29190613c92565b60405180910390f35b3480156102d757600080fd5b506102f260048036038101906102ed9190612d01565b610994565b005b34801561030057600080fd5b5061031b60048036038101906103169190612e07565b6109f4565b6040516103289190613c92565b60405180910390f35b610339610a99565b005b34801561034757600080fd5b50610362600480360381019061035d9190612d01565b610b55565b005b34801561037057600080fd5b5061038b60048036038101906103869190612ed6565b610b75565b6040516103989190613c92565b60405180910390f35b3480156103ad57600080fd5b506103b6610c0c565b005b3480156103c457600080fd5b506103df60048036038101906103da9190612e95565b610ca5565b005b3480156103ed57600080fd5b506103f6610d3b565b6040516104039190613935565b60405180910390f35b34801561041857600080fd5b50610433600480360381019061042e9190612ed6565b610d4e565b60405161044091906138ce565b60405180910390f35b34801561045557600080fd5b50610470600480360381019061046b9190612c9c565b610e00565b60405161047d9190613c92565b60405180910390f35b34801561049257600080fd5b5061049b610eb8565b005b3480156104a957600080fd5b506104b2610ff5565b6040516104bf91906138ce565b60405180910390f35b3480156104d457600080fd5b506104dd61101f565b6040516104ea9190613950565b60405180910390f35b3480156104ff57600080fd5b506105086110b1565b6040516105159190613c92565b60405180910390f35b61053860048036038101906105339190612ed6565b6110b7565b005b34801561054657600080fd5b50610561600480360381019061055c9190612dcb565b6112f1565b005b34801561056f57600080fd5b50610578611472565b005b34801561058657600080fd5b5061058f611583565b005b34801561059d57600080fd5b506105b860048036038101906105b39190612d50565b61161c565b005b3480156105c657600080fd5b506105cf61167e565b6040516105dc9190613c92565b60405180910390f35b3480156105f157600080fd5b5061060c60048036038101906106079190612ed6565b611689565b6040516106199190613950565b60405180910390f35b34801561062e57600080fd5b50610637611762565b6040516106449190613c92565b60405180910390f35b34801561065957600080fd5b50610662611768565b60405161066f9190613c92565b60405180910390f35b34801561068457600080fd5b5061069f600480360381019061069a9190612cc5565b61176e565b6040516106ac9190613935565b60405180910390f35b3480156106c157600080fd5b506106dc60048036038101906106d79190612c9c565b611802565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107515750610750826119ae565b5b9050919050565b60606000805461076790613f4c565b80601f016020809104026020016040519081016040528092919081815260200182805461079390613f4c565b80156107e05780601f106107b5576101008083540402835291602001916107e0565b820191906000526020600020905b8154815290600101906020018083116107c357829003601f168201915b5050505050905090565b60006107f582611a90565b610834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082b90613b52565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061087a82610d4e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e290613bf2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661090a611afc565b73ffffffffffffffffffffffffffffffffffffffff161480610939575061093881610933611afc565b61176e565b5b610978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096f90613a92565b60405180910390fd5b6109828383611b04565b505050565b6000600880549050905090565b6109a561099f611afc565b82611bbd565b6109e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109db90613c12565b60405180910390fd5b6109ef838383611c9b565b505050565b60006109ff83610e00565b8210610a40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3790613992565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610aa1611afc565b73ffffffffffffffffffffffffffffffffffffffff16610abf610ff5565b73ffffffffffffffffffffffffffffffffffffffff1614610b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0c90613b72565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610b5357600080fd5b565b610b708383836040518060200160405280600081525061161c565b505050565b6000610b7f610987565b8210610bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb790613c32565b60405180910390fd5b60088281548110610bfa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610c14611afc565b73ffffffffffffffffffffffffffffffffffffffff16610c32610ff5565b73ffffffffffffffffffffffffffffffffffffffff1614610c88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7f90613b72565b60405180910390fd5b6000600a60146101000a81548160ff021916908315150217905550565b610cad611afc565b73ffffffffffffffffffffffffffffffffffffffff16610ccb610ff5565b73ffffffffffffffffffffffffffffffffffffffff1614610d21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1890613b72565b60405180910390fd5b80600b9080519060200190610d37929190612ac0565b5050565b600a60149054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610df7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dee90613ad2565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6890613ab2565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ec0611afc565b73ffffffffffffffffffffffffffffffffffffffff16610ede610ff5565b73ffffffffffffffffffffffffffffffffffffffff1614610f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2b90613b72565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461102e90613f4c565b80601f016020809104026020016040519081016040528092919081815260200182805461105a90613f4c565b80156110a75780601f1061107c576101008083540402835291602001916110a7565b820191906000526020600020905b81548152906001019060200180831161108a57829003601f168201915b5050505050905090565b61271081565b60011515600a60149054906101000a900460ff1615151461110d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110490613bb2565b60405180910390fd5b612710611118610987565b10611158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114f90613972565b60405180910390fd5b6000811161119b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119290613c52565b60405180910390fd5b60148111156111df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d690613a72565b60405180910390fd5b612710816111eb610987565b6111f59190613d81565b1115611236576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122d90613af2565b60405180910390fd5b3461125182666a94d74f430000611ef790919063ffffffff16565b14611291576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128890613c72565b60405180910390fd5b60005b818110156112c65760006112a6610987565b90506112b23382611f0d565b5080806112be90613f7e565b915050611294565b506000600c541480156112e157506127106112df610987565b145b156112ee5743600c819055505b50565b6112f9611afc565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611367576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135e90613a32565b60405180910390fd5b8060056000611374611afc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611421611afc565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114669190613935565b60405180910390a35050565b6000600d54146114b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ae90613bd2565b60405180910390fd5b6000600c5414156114fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f490613b32565b60405180910390fd5b612710600c544060001c6115119190613fc7565b600d8190555060ff61152e600c5443611f2b90919063ffffffff16565b1115611559576127106001436115449190613e62565b4060001c6115529190613fc7565b600d819055505b6000600d5414156115815761157a6001600d54611f4190919063ffffffff16565b600d819055505b565b61158b611afc565b73ffffffffffffffffffffffffffffffffffffffff166115a9610ff5565b73ffffffffffffffffffffffffffffffffffffffff16146115ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f690613b72565b60405180910390fd5b6001600a60146101000a81548160ff021916908315150217905550565b61162d611627611afc565b83611bbd565b61166c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166390613c12565b60405180910390fd5b61167884848484611f57565b50505050565b666a94d74f43000081565b60606000611695611fb3565b90506000600d5414156116e95760008151116116c057604051806020016040528060008152506116e1565b806040516020016116d191906138ac565b6040516020818303038152906040525b91505061175d565b6000612710611703600d5486611f4190919063ffffffff16565b61170d9190613fc7565b9050600082511161172d5760405180602001604052806000815250611758565b8161173782612045565b60405160200161174892919061387d565b6040516020818303038152906040525b925050505b919050565b600d5481565b600c5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61180a611afc565b73ffffffffffffffffffffffffffffffffffffffff16611828610ff5565b73ffffffffffffffffffffffffffffffffffffffff161461187e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187590613b72565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e5906139d2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a7957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611a895750611a88826121f2565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611b7783610d4e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611bc882611a90565b611c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfe90613a52565b60405180910390fd5b6000611c1283610d4e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c8157508373ffffffffffffffffffffffffffffffffffffffff16611c69846107ea565b73ffffffffffffffffffffffffffffffffffffffff16145b80611c925750611c91818561176e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611cbb82610d4e565b73ffffffffffffffffffffffffffffffffffffffff1614611d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0890613b92565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7890613a12565b60405180910390fd5b611d8c83838361225c565b611d97600082611b04565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611de79190613e62565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e3e9190613d81565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183611f059190613e08565b905092915050565b611f27828260405180602001604052806000815250612370565b5050565b60008183611f399190613e62565b905092915050565b60008183611f4f9190613d81565b905092915050565b611f62848484611c9b565b611f6e848484846123cb565b611fad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa4906139b2565b60405180910390fd5b50505050565b6060600b8054611fc290613f4c565b80601f0160208091040260200160405190810160405280929190818152602001828054611fee90613f4c565b801561203b5780601f106120105761010080835404028352916020019161203b565b820191906000526020600020905b81548152906001019060200180831161201e57829003601f168201915b5050505050905090565b6060600082141561208d576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506121ed565b600082905060005b600082146120bf5780806120a890613f7e565b915050600a826120b89190613dd7565b9150612095565b60008167ffffffffffffffff811115612101577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156121335781602001600182028036833780820191505090505b5090505b600085146121e65760018261214c9190613e62565b9150600a8561215b9190613fc7565b60306121679190613d81565b60f81b8183815181106121a3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856121df9190613dd7565b9450612137565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612267838383612562565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156122aa576122a581612567565b6122e9565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146122e8576122e783826125b0565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561232c576123278161271d565b61236b565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461236a576123698282612860565b5b5b505050565b61237a83836128df565b61238760008484846123cb565b6123c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bd906139b2565b60405180910390fd5b505050565b60006123ec8473ffffffffffffffffffffffffffffffffffffffff16612aad565b15612555578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612415611afc565b8786866040518563ffffffff1660e01b815260040161243794939291906138e9565b602060405180830381600087803b15801561245157600080fd5b505af192505050801561248257506040513d601f19601f8201168201806040525081019061247f9190612e6c565b60015b612505573d80600081146124b2576040519150601f19603f3d011682016040523d82523d6000602084013e6124b7565b606091505b506000815114156124fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f4906139b2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061255a565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016125bd84610e00565b6125c79190613e62565b90506000600760008481526020019081526020016000205490508181146126ac576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506127319190613e62565b9050600060096000848152602001908152602001600020549050600060088381548110612787577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106127cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612844577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061286b83610e00565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561294f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294690613b12565b60405180910390fd5b61295881611a90565b15612998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298f906139f2565b60405180910390fd5b6129a46000838361225c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129f49190613d81565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612acc90613f4c565b90600052602060002090601f016020900481019282612aee5760008555612b35565b82601f10612b0757805160ff1916838001178555612b35565b82800160010185558215612b35579182015b82811115612b34578251825591602001919060010190612b19565b5b509050612b429190612b46565b5090565b5b80821115612b5f576000816000905550600101612b47565b5090565b6000612b76612b7184613cde565b613cad565b905082815260208101848484011115612b8e57600080fd5b612b99848285613f0a565b509392505050565b6000612bb4612baf84613d0e565b613cad565b905082815260208101848484011115612bcc57600080fd5b612bd7848285613f0a565b509392505050565b600081359050612bee816140c5565b92915050565b600081359050612c03816140dc565b92915050565b600081359050612c18816140f3565b92915050565b600081519050612c2d816140f3565b92915050565b600082601f830112612c4457600080fd5b8135612c54848260208601612b63565b91505092915050565b600082601f830112612c6e57600080fd5b8135612c7e848260208601612ba1565b91505092915050565b600081359050612c968161410a565b92915050565b600060208284031215612cae57600080fd5b6000612cbc84828501612bdf565b91505092915050565b60008060408385031215612cd857600080fd5b6000612ce685828601612bdf565b9250506020612cf785828601612bdf565b9150509250929050565b600080600060608486031215612d1657600080fd5b6000612d2486828701612bdf565b9350506020612d3586828701612bdf565b9250506040612d4686828701612c87565b9150509250925092565b60008060008060808587031215612d6657600080fd5b6000612d7487828801612bdf565b9450506020612d8587828801612bdf565b9350506040612d9687828801612c87565b925050606085013567ffffffffffffffff811115612db357600080fd5b612dbf87828801612c33565b91505092959194509250565b60008060408385031215612dde57600080fd5b6000612dec85828601612bdf565b9250506020612dfd85828601612bf4565b9150509250929050565b60008060408385031215612e1a57600080fd5b6000612e2885828601612bdf565b9250506020612e3985828601612c87565b9150509250929050565b600060208284031215612e5557600080fd5b6000612e6384828501612c09565b91505092915050565b600060208284031215612e7e57600080fd5b6000612e8c84828501612c1e565b91505092915050565b600060208284031215612ea757600080fd5b600082013567ffffffffffffffff811115612ec157600080fd5b612ecd84828501612c5d565b91505092915050565b600060208284031215612ee857600080fd5b6000612ef684828501612c87565b91505092915050565b612f0881613e96565b82525050565b612f1781613ea8565b82525050565b6000612f2882613d3e565b612f328185613d54565b9350612f42818560208601613f19565b612f4b816140b4565b840191505092915050565b6000612f6182613d49565b612f6b8185613d65565b9350612f7b818560208601613f19565b612f84816140b4565b840191505092915050565b6000612f9a82613d49565b612fa48185613d76565b9350612fb4818560208601613f19565b80840191505092915050565b6000612fcd601383613d65565b91507f44756e6b732061726520736f6c64206f75742e000000000000000000000000006000830152602082019050919050565b600061300d602b83613d65565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613073603283613d65565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006130d9602683613d65565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061313f601c83613d65565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b600061317f602483613d65565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006131e5601983613d65565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613225602c83613d65565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061328b602083613d65565b91507f43616e6e6f742070757263686173652074686973206d616e792044756e6b732e6000830152602082019050919050565b60006132cb603883613d65565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613331602a83613d65565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613397602983613d65565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006133fd600c83613d65565b91507f43616e6e6f74206d696e742e00000000000000000000000000000000000000006000830152602082019050919050565b600061343d602083613d65565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061347d602183613d65565b91507f5374617274696e6720696e64657820626c6f636b20697320726571756972656460008301527f2e000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006134e3602c83613d65565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613549600583613d76565b91507f2e6a736f6e0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b6000613589602083613d65565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006135c9602983613d65565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061362f601383613d65565b91507f53616c65206973206e6f74206163746976652e000000000000000000000000006000830152602082019050919050565b600061366f601683613d65565b91507f4f666673657420697320616c7265616479207365742e000000000000000000006000830152602082019050919050565b60006136af602183613d65565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613715600083613d76565b9150600082019050919050565b600061372f603183613d65565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613795602c83613d65565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b60006137fb601183613d65565b91507f4d757374206d696e7420312044756e6b2e0000000000000000000000000000006000830152602082019050919050565b600061383b601483613d65565b91507f496e636f7272656374204554482076616c75652e0000000000000000000000006000830152602082019050919050565b61387781613f00565b82525050565b60006138898285612f8f565b91506138958284612f8f565b91506138a08261353c565b91508190509392505050565b60006138b88284612f8f565b91506138c382613708565b915081905092915050565b60006020820190506138e36000830184612eff565b92915050565b60006080820190506138fe6000830187612eff565b61390b6020830186612eff565b613918604083018561386e565b818103606083015261392a8184612f1d565b905095945050505050565b600060208201905061394a6000830184612f0e565b92915050565b6000602082019050818103600083015261396a8184612f56565b905092915050565b6000602082019050818103600083015261398b81612fc0565b9050919050565b600060208201905081810360008301526139ab81613000565b9050919050565b600060208201905081810360008301526139cb81613066565b9050919050565b600060208201905081810360008301526139eb816130cc565b9050919050565b60006020820190508181036000830152613a0b81613132565b9050919050565b60006020820190508181036000830152613a2b81613172565b9050919050565b60006020820190508181036000830152613a4b816131d8565b9050919050565b60006020820190508181036000830152613a6b81613218565b9050919050565b60006020820190508181036000830152613a8b8161327e565b9050919050565b60006020820190508181036000830152613aab816132be565b9050919050565b60006020820190508181036000830152613acb81613324565b9050919050565b60006020820190508181036000830152613aeb8161338a565b9050919050565b60006020820190508181036000830152613b0b816133f0565b9050919050565b60006020820190508181036000830152613b2b81613430565b9050919050565b60006020820190508181036000830152613b4b81613470565b9050919050565b60006020820190508181036000830152613b6b816134d6565b9050919050565b60006020820190508181036000830152613b8b8161357c565b9050919050565b60006020820190508181036000830152613bab816135bc565b9050919050565b60006020820190508181036000830152613bcb81613622565b9050919050565b60006020820190508181036000830152613beb81613662565b9050919050565b60006020820190508181036000830152613c0b816136a2565b9050919050565b60006020820190508181036000830152613c2b81613722565b9050919050565b60006020820190508181036000830152613c4b81613788565b9050919050565b60006020820190508181036000830152613c6b816137ee565b9050919050565b60006020820190508181036000830152613c8b8161382e565b9050919050565b6000602082019050613ca7600083018461386e565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613cd457613cd3614085565b5b8060405250919050565b600067ffffffffffffffff821115613cf957613cf8614085565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613d2957613d28614085565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613d8c82613f00565b9150613d9783613f00565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613dcc57613dcb613ff8565b5b828201905092915050565b6000613de282613f00565b9150613ded83613f00565b925082613dfd57613dfc614027565b5b828204905092915050565b6000613e1382613f00565b9150613e1e83613f00565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e5757613e56613ff8565b5b828202905092915050565b6000613e6d82613f00565b9150613e7883613f00565b925082821015613e8b57613e8a613ff8565b5b828203905092915050565b6000613ea182613ee0565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613f37578082015181840152602081019050613f1c565b83811115613f46576000848401525b50505050565b60006002820490506001821680613f6457607f821691505b60208210811415613f7857613f77614056565b5b50919050565b6000613f8982613f00565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613fbc57613fbb613ff8565b5b600182019050919050565b6000613fd282613f00565b9150613fdd83613f00565b925082613fed57613fec614027565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6140ce81613e96565b81146140d957600080fd5b50565b6140e581613ea8565b81146140f057600080fd5b50565b6140fc81613eb4565b811461410757600080fd5b50565b61411381613f00565b811461411e57600080fd5b5056fea264697066735822122097a8c3d374ec99d367d9e08ba491e36a4021bc6867ad8b4584fbb46fbbe9b71464736f6c63430008000033

Deployed Bytecode

0x6080604052600436106101cd5760003560e01c8063715018a6116100f7578063b66a0e5d11610095578063d555654411610064578063d555654414610622578063e36d64981461064d578063e985e9c514610678578063f2fde38b146106b5576101cd565b8063b66a0e5d1461057a578063b88d4fde14610591578063c002d23d146105ba578063c87b56dd146105e5576101cd565b80639aa4a125116100d15780639aa4a125146104f3578063a0712d681461051e578063a22cb4651461053a578063a475b5dd14610563576101cd565b8063715018a6146104865780638da5cb5b1461049d57806395d89b41146104c8576101cd565b80633ccfd60b1161016f57806355f804b31161013e57806355f804b3146103b85780635c474f9e146103e15780636352211e1461040c57806370a0823114610449576101cd565b80633ccfd60b1461033157806342842e0e1461033b5780634f6ccce71461036457806355367ba9146103a1576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806318160ddd146102a057806323b872dd146102cb5780632f745c59146102f4576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612e43565b6106de565b6040516102069190613935565b60405180910390f35b34801561021b57600080fd5b50610224610758565b6040516102319190613950565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190612ed6565b6107ea565b60405161026e91906138ce565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190612e07565b61086f565b005b3480156102ac57600080fd5b506102b5610987565b6040516102c29190613c92565b60405180910390f35b3480156102d757600080fd5b506102f260048036038101906102ed9190612d01565b610994565b005b34801561030057600080fd5b5061031b60048036038101906103169190612e07565b6109f4565b6040516103289190613c92565b60405180910390f35b610339610a99565b005b34801561034757600080fd5b50610362600480360381019061035d9190612d01565b610b55565b005b34801561037057600080fd5b5061038b60048036038101906103869190612ed6565b610b75565b6040516103989190613c92565b60405180910390f35b3480156103ad57600080fd5b506103b6610c0c565b005b3480156103c457600080fd5b506103df60048036038101906103da9190612e95565b610ca5565b005b3480156103ed57600080fd5b506103f6610d3b565b6040516104039190613935565b60405180910390f35b34801561041857600080fd5b50610433600480360381019061042e9190612ed6565b610d4e565b60405161044091906138ce565b60405180910390f35b34801561045557600080fd5b50610470600480360381019061046b9190612c9c565b610e00565b60405161047d9190613c92565b60405180910390f35b34801561049257600080fd5b5061049b610eb8565b005b3480156104a957600080fd5b506104b2610ff5565b6040516104bf91906138ce565b60405180910390f35b3480156104d457600080fd5b506104dd61101f565b6040516104ea9190613950565b60405180910390f35b3480156104ff57600080fd5b506105086110b1565b6040516105159190613c92565b60405180910390f35b61053860048036038101906105339190612ed6565b6110b7565b005b34801561054657600080fd5b50610561600480360381019061055c9190612dcb565b6112f1565b005b34801561056f57600080fd5b50610578611472565b005b34801561058657600080fd5b5061058f611583565b005b34801561059d57600080fd5b506105b860048036038101906105b39190612d50565b61161c565b005b3480156105c657600080fd5b506105cf61167e565b6040516105dc9190613c92565b60405180910390f35b3480156105f157600080fd5b5061060c60048036038101906106079190612ed6565b611689565b6040516106199190613950565b60405180910390f35b34801561062e57600080fd5b50610637611762565b6040516106449190613c92565b60405180910390f35b34801561065957600080fd5b50610662611768565b60405161066f9190613c92565b60405180910390f35b34801561068457600080fd5b5061069f600480360381019061069a9190612cc5565b61176e565b6040516106ac9190613935565b60405180910390f35b3480156106c157600080fd5b506106dc60048036038101906106d79190612c9c565b611802565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107515750610750826119ae565b5b9050919050565b60606000805461076790613f4c565b80601f016020809104026020016040519081016040528092919081815260200182805461079390613f4c565b80156107e05780601f106107b5576101008083540402835291602001916107e0565b820191906000526020600020905b8154815290600101906020018083116107c357829003601f168201915b5050505050905090565b60006107f582611a90565b610834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082b90613b52565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061087a82610d4e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e290613bf2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661090a611afc565b73ffffffffffffffffffffffffffffffffffffffff161480610939575061093881610933611afc565b61176e565b5b610978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096f90613a92565b60405180910390fd5b6109828383611b04565b505050565b6000600880549050905090565b6109a561099f611afc565b82611bbd565b6109e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109db90613c12565b60405180910390fd5b6109ef838383611c9b565b505050565b60006109ff83610e00565b8210610a40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3790613992565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610aa1611afc565b73ffffffffffffffffffffffffffffffffffffffff16610abf610ff5565b73ffffffffffffffffffffffffffffffffffffffff1614610b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0c90613b72565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610b5357600080fd5b565b610b708383836040518060200160405280600081525061161c565b505050565b6000610b7f610987565b8210610bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb790613c32565b60405180910390fd5b60088281548110610bfa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610c14611afc565b73ffffffffffffffffffffffffffffffffffffffff16610c32610ff5565b73ffffffffffffffffffffffffffffffffffffffff1614610c88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7f90613b72565b60405180910390fd5b6000600a60146101000a81548160ff021916908315150217905550565b610cad611afc565b73ffffffffffffffffffffffffffffffffffffffff16610ccb610ff5565b73ffffffffffffffffffffffffffffffffffffffff1614610d21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1890613b72565b60405180910390fd5b80600b9080519060200190610d37929190612ac0565b5050565b600a60149054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610df7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dee90613ad2565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6890613ab2565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ec0611afc565b73ffffffffffffffffffffffffffffffffffffffff16610ede610ff5565b73ffffffffffffffffffffffffffffffffffffffff1614610f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2b90613b72565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461102e90613f4c565b80601f016020809104026020016040519081016040528092919081815260200182805461105a90613f4c565b80156110a75780601f1061107c576101008083540402835291602001916110a7565b820191906000526020600020905b81548152906001019060200180831161108a57829003601f168201915b5050505050905090565b61271081565b60011515600a60149054906101000a900460ff1615151461110d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110490613bb2565b60405180910390fd5b612710611118610987565b10611158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114f90613972565b60405180910390fd5b6000811161119b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119290613c52565b60405180910390fd5b60148111156111df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d690613a72565b60405180910390fd5b612710816111eb610987565b6111f59190613d81565b1115611236576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122d90613af2565b60405180910390fd5b3461125182666a94d74f430000611ef790919063ffffffff16565b14611291576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128890613c72565b60405180910390fd5b60005b818110156112c65760006112a6610987565b90506112b23382611f0d565b5080806112be90613f7e565b915050611294565b506000600c541480156112e157506127106112df610987565b145b156112ee5743600c819055505b50565b6112f9611afc565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611367576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135e90613a32565b60405180910390fd5b8060056000611374611afc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611421611afc565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114669190613935565b60405180910390a35050565b6000600d54146114b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ae90613bd2565b60405180910390fd5b6000600c5414156114fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f490613b32565b60405180910390fd5b612710600c544060001c6115119190613fc7565b600d8190555060ff61152e600c5443611f2b90919063ffffffff16565b1115611559576127106001436115449190613e62565b4060001c6115529190613fc7565b600d819055505b6000600d5414156115815761157a6001600d54611f4190919063ffffffff16565b600d819055505b565b61158b611afc565b73ffffffffffffffffffffffffffffffffffffffff166115a9610ff5565b73ffffffffffffffffffffffffffffffffffffffff16146115ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f690613b72565b60405180910390fd5b6001600a60146101000a81548160ff021916908315150217905550565b61162d611627611afc565b83611bbd565b61166c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166390613c12565b60405180910390fd5b61167884848484611f57565b50505050565b666a94d74f43000081565b60606000611695611fb3565b90506000600d5414156116e95760008151116116c057604051806020016040528060008152506116e1565b806040516020016116d191906138ac565b6040516020818303038152906040525b91505061175d565b6000612710611703600d5486611f4190919063ffffffff16565b61170d9190613fc7565b9050600082511161172d5760405180602001604052806000815250611758565b8161173782612045565b60405160200161174892919061387d565b6040516020818303038152906040525b925050505b919050565b600d5481565b600c5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61180a611afc565b73ffffffffffffffffffffffffffffffffffffffff16611828610ff5565b73ffffffffffffffffffffffffffffffffffffffff161461187e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187590613b72565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e5906139d2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a7957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611a895750611a88826121f2565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611b7783610d4e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611bc882611a90565b611c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfe90613a52565b60405180910390fd5b6000611c1283610d4e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c8157508373ffffffffffffffffffffffffffffffffffffffff16611c69846107ea565b73ffffffffffffffffffffffffffffffffffffffff16145b80611c925750611c91818561176e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611cbb82610d4e565b73ffffffffffffffffffffffffffffffffffffffff1614611d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0890613b92565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7890613a12565b60405180910390fd5b611d8c83838361225c565b611d97600082611b04565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611de79190613e62565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e3e9190613d81565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183611f059190613e08565b905092915050565b611f27828260405180602001604052806000815250612370565b5050565b60008183611f399190613e62565b905092915050565b60008183611f4f9190613d81565b905092915050565b611f62848484611c9b565b611f6e848484846123cb565b611fad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa4906139b2565b60405180910390fd5b50505050565b6060600b8054611fc290613f4c565b80601f0160208091040260200160405190810160405280929190818152602001828054611fee90613f4c565b801561203b5780601f106120105761010080835404028352916020019161203b565b820191906000526020600020905b81548152906001019060200180831161201e57829003601f168201915b5050505050905090565b6060600082141561208d576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506121ed565b600082905060005b600082146120bf5780806120a890613f7e565b915050600a826120b89190613dd7565b9150612095565b60008167ffffffffffffffff811115612101577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156121335781602001600182028036833780820191505090505b5090505b600085146121e65760018261214c9190613e62565b9150600a8561215b9190613fc7565b60306121679190613d81565b60f81b8183815181106121a3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856121df9190613dd7565b9450612137565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612267838383612562565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156122aa576122a581612567565b6122e9565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146122e8576122e783826125b0565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561232c576123278161271d565b61236b565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461236a576123698282612860565b5b5b505050565b61237a83836128df565b61238760008484846123cb565b6123c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bd906139b2565b60405180910390fd5b505050565b60006123ec8473ffffffffffffffffffffffffffffffffffffffff16612aad565b15612555578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612415611afc565b8786866040518563ffffffff1660e01b815260040161243794939291906138e9565b602060405180830381600087803b15801561245157600080fd5b505af192505050801561248257506040513d601f19601f8201168201806040525081019061247f9190612e6c565b60015b612505573d80600081146124b2576040519150601f19603f3d011682016040523d82523d6000602084013e6124b7565b606091505b506000815114156124fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f4906139b2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061255a565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016125bd84610e00565b6125c79190613e62565b90506000600760008481526020019081526020016000205490508181146126ac576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506127319190613e62565b9050600060096000848152602001908152602001600020549050600060088381548110612787577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106127cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612844577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061286b83610e00565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561294f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294690613b12565b60405180910390fd5b61295881611a90565b15612998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298f906139f2565b60405180910390fd5b6129a46000838361225c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129f49190613d81565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612acc90613f4c565b90600052602060002090601f016020900481019282612aee5760008555612b35565b82601f10612b0757805160ff1916838001178555612b35565b82800160010185558215612b35579182015b82811115612b34578251825591602001919060010190612b19565b5b509050612b429190612b46565b5090565b5b80821115612b5f576000816000905550600101612b47565b5090565b6000612b76612b7184613cde565b613cad565b905082815260208101848484011115612b8e57600080fd5b612b99848285613f0a565b509392505050565b6000612bb4612baf84613d0e565b613cad565b905082815260208101848484011115612bcc57600080fd5b612bd7848285613f0a565b509392505050565b600081359050612bee816140c5565b92915050565b600081359050612c03816140dc565b92915050565b600081359050612c18816140f3565b92915050565b600081519050612c2d816140f3565b92915050565b600082601f830112612c4457600080fd5b8135612c54848260208601612b63565b91505092915050565b600082601f830112612c6e57600080fd5b8135612c7e848260208601612ba1565b91505092915050565b600081359050612c968161410a565b92915050565b600060208284031215612cae57600080fd5b6000612cbc84828501612bdf565b91505092915050565b60008060408385031215612cd857600080fd5b6000612ce685828601612bdf565b9250506020612cf785828601612bdf565b9150509250929050565b600080600060608486031215612d1657600080fd5b6000612d2486828701612bdf565b9350506020612d3586828701612bdf565b9250506040612d4686828701612c87565b9150509250925092565b60008060008060808587031215612d6657600080fd5b6000612d7487828801612bdf565b9450506020612d8587828801612bdf565b9350506040612d9687828801612c87565b925050606085013567ffffffffffffffff811115612db357600080fd5b612dbf87828801612c33565b91505092959194509250565b60008060408385031215612dde57600080fd5b6000612dec85828601612bdf565b9250506020612dfd85828601612bf4565b9150509250929050565b60008060408385031215612e1a57600080fd5b6000612e2885828601612bdf565b9250506020612e3985828601612c87565b9150509250929050565b600060208284031215612e5557600080fd5b6000612e6384828501612c09565b91505092915050565b600060208284031215612e7e57600080fd5b6000612e8c84828501612c1e565b91505092915050565b600060208284031215612ea757600080fd5b600082013567ffffffffffffffff811115612ec157600080fd5b612ecd84828501612c5d565b91505092915050565b600060208284031215612ee857600080fd5b6000612ef684828501612c87565b91505092915050565b612f0881613e96565b82525050565b612f1781613ea8565b82525050565b6000612f2882613d3e565b612f328185613d54565b9350612f42818560208601613f19565b612f4b816140b4565b840191505092915050565b6000612f6182613d49565b612f6b8185613d65565b9350612f7b818560208601613f19565b612f84816140b4565b840191505092915050565b6000612f9a82613d49565b612fa48185613d76565b9350612fb4818560208601613f19565b80840191505092915050565b6000612fcd601383613d65565b91507f44756e6b732061726520736f6c64206f75742e000000000000000000000000006000830152602082019050919050565b600061300d602b83613d65565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613073603283613d65565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006130d9602683613d65565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061313f601c83613d65565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b600061317f602483613d65565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006131e5601983613d65565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613225602c83613d65565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061328b602083613d65565b91507f43616e6e6f742070757263686173652074686973206d616e792044756e6b732e6000830152602082019050919050565b60006132cb603883613d65565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613331602a83613d65565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613397602983613d65565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006133fd600c83613d65565b91507f43616e6e6f74206d696e742e00000000000000000000000000000000000000006000830152602082019050919050565b600061343d602083613d65565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061347d602183613d65565b91507f5374617274696e6720696e64657820626c6f636b20697320726571756972656460008301527f2e000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006134e3602c83613d65565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613549600583613d76565b91507f2e6a736f6e0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b6000613589602083613d65565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006135c9602983613d65565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061362f601383613d65565b91507f53616c65206973206e6f74206163746976652e000000000000000000000000006000830152602082019050919050565b600061366f601683613d65565b91507f4f666673657420697320616c7265616479207365742e000000000000000000006000830152602082019050919050565b60006136af602183613d65565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613715600083613d76565b9150600082019050919050565b600061372f603183613d65565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613795602c83613d65565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b60006137fb601183613d65565b91507f4d757374206d696e7420312044756e6b2e0000000000000000000000000000006000830152602082019050919050565b600061383b601483613d65565b91507f496e636f7272656374204554482076616c75652e0000000000000000000000006000830152602082019050919050565b61387781613f00565b82525050565b60006138898285612f8f565b91506138958284612f8f565b91506138a08261353c565b91508190509392505050565b60006138b88284612f8f565b91506138c382613708565b915081905092915050565b60006020820190506138e36000830184612eff565b92915050565b60006080820190506138fe6000830187612eff565b61390b6020830186612eff565b613918604083018561386e565b818103606083015261392a8184612f1d565b905095945050505050565b600060208201905061394a6000830184612f0e565b92915050565b6000602082019050818103600083015261396a8184612f56565b905092915050565b6000602082019050818103600083015261398b81612fc0565b9050919050565b600060208201905081810360008301526139ab81613000565b9050919050565b600060208201905081810360008301526139cb81613066565b9050919050565b600060208201905081810360008301526139eb816130cc565b9050919050565b60006020820190508181036000830152613a0b81613132565b9050919050565b60006020820190508181036000830152613a2b81613172565b9050919050565b60006020820190508181036000830152613a4b816131d8565b9050919050565b60006020820190508181036000830152613a6b81613218565b9050919050565b60006020820190508181036000830152613a8b8161327e565b9050919050565b60006020820190508181036000830152613aab816132be565b9050919050565b60006020820190508181036000830152613acb81613324565b9050919050565b60006020820190508181036000830152613aeb8161338a565b9050919050565b60006020820190508181036000830152613b0b816133f0565b9050919050565b60006020820190508181036000830152613b2b81613430565b9050919050565b60006020820190508181036000830152613b4b81613470565b9050919050565b60006020820190508181036000830152613b6b816134d6565b9050919050565b60006020820190508181036000830152613b8b8161357c565b9050919050565b60006020820190508181036000830152613bab816135bc565b9050919050565b60006020820190508181036000830152613bcb81613622565b9050919050565b60006020820190508181036000830152613beb81613662565b9050919050565b60006020820190508181036000830152613c0b816136a2565b9050919050565b60006020820190508181036000830152613c2b81613722565b9050919050565b60006020820190508181036000830152613c4b81613788565b9050919050565b60006020820190508181036000830152613c6b816137ee565b9050919050565b60006020820190508181036000830152613c8b8161382e565b9050919050565b6000602082019050613ca7600083018461386e565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613cd457613cd3614085565b5b8060405250919050565b600067ffffffffffffffff821115613cf957613cf8614085565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613d2957613d28614085565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613d8c82613f00565b9150613d9783613f00565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613dcc57613dcb613ff8565b5b828201905092915050565b6000613de282613f00565b9150613ded83613f00565b925082613dfd57613dfc614027565b5b828204905092915050565b6000613e1382613f00565b9150613e1e83613f00565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e5757613e56613ff8565b5b828202905092915050565b6000613e6d82613f00565b9150613e7883613f00565b925082821015613e8b57613e8a613ff8565b5b828203905092915050565b6000613ea182613ee0565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613f37578082015181840152602081019050613f1c565b83811115613f46576000848401525b50505050565b60006002820490506001821680613f6457607f821691505b60208210811415613f7857613f77614056565b5b50919050565b6000613f8982613f00565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613fbc57613fbb613ff8565b5b600182019050919050565b6000613fd282613f00565b9150613fdd83613f00565b925082613fed57613fec614027565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6140ce81613e96565b81146140d957600080fd5b50565b6140e581613ea8565b81146140f057600080fd5b50565b6140fc81613eb4565b811461410757600080fd5b50565b61411381613f00565b811461411e57600080fd5b5056fea264697066735822122097a8c3d374ec99d367d9e08ba491e36a4021bc6867ad8b4584fbb46fbbe9b71464736f6c63430008000033

Deployed Bytecode Sourcemap

49751:2719:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34256:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21461:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22921:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22458:397;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34909:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23811:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34577:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52347:120;;;:::i;:::-;;24187:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35099:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52263:76;;;;;;;;;;;;;:::i;:::-;;50305:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49979:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21155:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20885:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42128:148;;;;;;;;;;;;;:::i;:::-;;41477:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21630:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49869:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50903:779;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23214:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51689:483;;;;;;;;;;;;;:::i;:::-;;52180:75;;;;;;;;;;;;;:::i;:::-;;24409:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49918:54;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50424:472;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50095:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50055:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23580:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42431:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34256:237;34358:4;34397:35;34382:50;;;:11;:50;;;;:103;;;;34449:36;34473:11;34449:23;:36::i;:::-;34382:103;34375:110;;34256:237;;;:::o;21461:100::-;21515:13;21548:5;21541:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21461:100;:::o;22921:221::-;22997:7;23025:16;23033:7;23025;:16::i;:::-;23017:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23110:15;:24;23126:7;23110:24;;;;;;;;;;;;;;;;;;;;;23103:31;;22921:221;;;:::o;22458:397::-;22539:13;22555:23;22570:7;22555:14;:23::i;:::-;22539:39;;22603:5;22597:11;;:2;:11;;;;22589:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22683:5;22667:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22692:37;22709:5;22716:12;:10;:12::i;:::-;22692:16;:37::i;:::-;22667:62;22659:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;22826:21;22835:2;22839:7;22826:8;:21::i;:::-;22458:397;;;:::o;34909:113::-;34970:7;34997:10;:17;;;;34990:24;;34909:113;:::o;23811:305::-;23972:41;23991:12;:10;:12::i;:::-;24005:7;23972:18;:41::i;:::-;23964:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24080:28;24090:4;24096:2;24100:7;24080:9;:28::i;:::-;23811:305;;;:::o;34577:256::-;34674:7;34710:23;34727:5;34710:16;:23::i;:::-;34702:5;:31;34694:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;34799:12;:19;34812:5;34799:19;;;;;;;;;;;;;;;:26;34819:5;34799:26;;;;;;;;;;;;34792:33;;34577:256;;;;:::o;52347:120::-;41708:12;:10;:12::i;:::-;41697:23;;:7;:5;:7::i;:::-;:23;;;41689:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52419:10:::1;52411:24;;:47;52436:21;52411:47;;;;;;;;;;;;;;;;;;;;;;;52403:56;;;::::0;::::1;;52347:120::o:0;24187:151::-;24291:39;24308:4;24314:2;24318:7;24291:39;;;;;;;;;;;;:16;:39::i;:::-;24187:151;;;:::o;35099:233::-;35174:7;35210:30;:28;:30::i;:::-;35202:5;:38;35194:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35307:10;35318:5;35307:17;;;;;;;;;;;;;;;;;;;;;;;;35300:24;;35099:233;;;:::o;52263:76::-;41708:12;:10;:12::i;:::-;41697:23;;:7;:5;:7::i;:::-;:23;;;41689:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52326:5:::1;52312:11;;:19;;;;;;;;;;;;;;;;;;52263:76::o:0;50305:111::-;41708:12;:10;:12::i;:::-;41697:23;;:7;:5;:7::i;:::-;:23;;;41689:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50400:8:::1;50381:16;:27;;;;;;;;;;;;:::i;:::-;;50305:111:::0;:::o;49979:31::-;;;;;;;;;;;;;:::o;21155:239::-;21227:7;21247:13;21263:7;:16;21271:7;21263:16;;;;;;;;;;;;;;;;;;;;;21247:32;;21315:1;21298:19;;:5;:19;;;;21290:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21381:5;21374:12;;;21155:239;;;:::o;20885:208::-;20957:7;21002:1;20985:19;;:5;:19;;;;20977:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21069:9;:16;21079:5;21069:16;;;;;;;;;;;;;;;;21062:23;;20885:208;;;:::o;42128:148::-;41708:12;:10;:12::i;:::-;41697:23;;:7;:5;:7::i;:::-;:23;;;41689:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42235:1:::1;42198:40;;42219:6;;;;;;;;;;;42198:40;;;;;;;;;;;;42266:1;42249:6;;:19;;;;;;;;;;;;;;;;;;42128:148::o:0;41477:87::-;41523:7;41550:6;;;;;;;;;;;41543:13;;41477:87;:::o;21630:104::-;21686:13;21719:7;21712:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21630:104;:::o;49869:42::-;49906:5;49869:42;:::o;50903:779::-;50988:4;50973:19;;:11;;;;;;;;;;;:19;;;50965:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;49906:5;51035:13;:11;:13::i;:::-;:26;51027:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;51119:1;51104:12;:16;51096:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;51177:2;51161:12;:18;;51153:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;49906:5;51251:12;51235:13;:11;:13::i;:::-;:28;;;;:::i;:::-;:42;;51227:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;51345:9;51313:28;51328:12;49955:17;51313:14;;:28;;;;:::i;:::-;:41;51305:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;51397:9;51392:150;51416:12;51412:1;:16;51392:150;;;51450:17;51470:13;:11;:13::i;:::-;51450:33;;51498:32;51508:10;51520:9;51498;:32::i;:::-;51392:150;51430:3;;;;;:::i;:::-;;;;51392:150;;;;51580:1;51558:18;;:23;:56;;;;;49906:5;51586:13;:11;:13::i;:::-;:27;51558:56;51554:122;;;51652:12;51631:18;:33;;;;51554:122;50903:779;:::o;23214:295::-;23329:12;:10;:12::i;:::-;23317:24;;:8;:24;;;;23309:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23429:8;23384:18;:32;23403:12;:10;:12::i;:::-;23384:32;;;;;;;;;;;;;;;:42;23417:8;23384:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23482:8;23453:48;;23468:12;:10;:12::i;:::-;23453:48;;;23492:8;23453:48;;;;;;:::i;:::-;;;;;;;;23214:295;;:::o;51689:483::-;51743:1;51733:6;;:11;51725:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;51812:1;51790:18;;:23;;51782:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;49906:5;51896:18;;51886:29;51881:35;;:48;;;;:::i;:::-;51872:6;:57;;;;51993:3;51954:36;51971:18;;51954:12;:16;;:36;;;;:::i;:::-;:42;51950:130;;;49906:5;52052:1;52037:12;:16;;;;:::i;:::-;52027:27;52022:33;;:46;;;;:::i;:::-;52013:6;:55;;;;51950:130;52114:1;52104:6;;:11;52100:66;;;52141:13;52152:1;52141:6;;:10;;:13;;;;:::i;:::-;52132:6;:22;;;;52100:66;51689:483::o;52180:75::-;41708:12;:10;:12::i;:::-;41697:23;;:7;:5;:7::i;:::-;:23;;;41689:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52243:4:::1;52229:11;;:18;;;;;;;;;;;;;;;;;;52180:75::o:0;24409:285::-;24541:41;24560:12;:10;:12::i;:::-;24574:7;24541:18;:41::i;:::-;24533:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24647:39;24661:4;24667:2;24671:7;24680:5;24647:13;:39::i;:::-;24409:285;;;;:::o;49918:54::-;49955:17;49918:54;:::o;50424:472::-;50497:13;50523:21;50547:10;:8;:10::i;:::-;50523:34;;50584:1;50574:6;;:11;50570:319;;;50633:1;50615:7;50609:21;:25;:70;;;;;;;;;;;;;;;;;50661:7;50644:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;50609:70;50602:77;;;;;50570:319;50712:14;49906:5;50729:19;50741:6;;50729:7;:11;;:19;;;;:::i;:::-;:32;;;;:::i;:::-;50712:49;;50807:1;50789:7;50783:21;:25;:94;;;;;;;;;;;;;;;;;50835:7;50844:17;:6;:15;:17::i;:::-;50818:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50783:94;50776:101;;;;50424:472;;;;:::o;50095:21::-;;;;:::o;50055:33::-;;;;:::o;23580:164::-;23677:4;23701:18;:25;23720:5;23701:25;;;;;;;;;;;;;;;:35;23727:8;23701:35;;;;;;;;;;;;;;;;;;;;;;;;;23694:42;;23580:164;;;;:::o;42431:244::-;41708:12;:10;:12::i;:::-;41697:23;;:7;:5;:7::i;:::-;:23;;;41689:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42540:1:::1;42520:22;;:8;:22;;;;42512:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42630:8;42601:38;;42622:6;;;;;;;;;;;42601:38;;;;;;;;;;;;42659:8;42650:6;;:17;;;;;;;;;;;;;;;;;;42431:244:::0;:::o;20529:292::-;20631:4;20670:25;20655:40;;;:11;:40;;;;:105;;;;20727:33;20712:48;;;:11;:48;;;;20655:105;:158;;;;20777:36;20801:11;20777:23;:36::i;:::-;20655:158;20648:165;;20529:292;;;:::o;26161:127::-;26226:4;26278:1;26250:30;;:7;:16;26258:7;26250:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26243:37;;26161:127;;;:::o;15849:98::-;15902:7;15929:10;15922:17;;15849:98;:::o;30038:174::-;30140:2;30113:15;:24;30129:7;30113:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30196:7;30192:2;30158:46;;30167:23;30182:7;30167:14;:23::i;:::-;30158:46;;;;;;;;;;;;30038:174;;:::o;26455:348::-;26548:4;26573:16;26581:7;26573;:16::i;:::-;26565:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26649:13;26665:23;26680:7;26665:14;:23::i;:::-;26649:39;;26718:5;26707:16;;:7;:16;;;:51;;;;26751:7;26727:31;;:20;26739:7;26727:11;:20::i;:::-;:31;;;26707:51;:87;;;;26762:32;26779:5;26786:7;26762:16;:32::i;:::-;26707:87;26699:96;;;26455:348;;;;:::o;29376:544::-;29501:4;29474:31;;:23;29489:7;29474:14;:23::i;:::-;:31;;;29466:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29584:1;29570:16;;:2;:16;;;;29562:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29640:39;29661:4;29667:2;29671:7;29640:20;:39::i;:::-;29744:29;29761:1;29765:7;29744:8;:29::i;:::-;29805:1;29786:9;:15;29796:4;29786:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29834:1;29817:9;:13;29827:2;29817:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29865:2;29846:7;:16;29854:7;29846:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29904:7;29900:2;29885:27;;29894:4;29885:27;;;;;;;;;;;;29376:544;;;:::o;46150:98::-;46208:7;46239:1;46235;:5;;;;:::i;:::-;46228:12;;46150:98;;;;:::o;27145:110::-;27221:26;27231:2;27235:7;27221:26;;;;;;;;;;;;:9;:26::i;:::-;27145:110;;:::o;45793:98::-;45851:7;45882:1;45878;:5;;;;:::i;:::-;45871:12;;45793:98;;;;:::o;45412:::-;45470:7;45501:1;45497;:5;;;;:::i;:::-;45490:12;;45412:98;;;;:::o;25576:272::-;25690:28;25700:4;25706:2;25710:7;25690:9;:28::i;:::-;25737:48;25760:4;25766:2;25770:7;25779:5;25737:22;:48::i;:::-;25729:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25576:272;;;;:::o;50180:117::-;50240:13;50273:16;50266:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50180:117;:::o;16498:723::-;16554:13;16784:1;16775:5;:10;16771:53;;;16802:10;;;;;;;;;;;;;;;;;;;;;16771:53;16834:12;16849:5;16834:20;;16865:14;16890:78;16905:1;16897:4;:9;16890:78;;16923:8;;;;;:::i;:::-;;;;16954:2;16946:10;;;;;:::i;:::-;;;16890:78;;;16978:19;17010:6;17000:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16978:39;;17028:154;17044:1;17035:5;:10;17028:154;;17072:1;17062:11;;;;;:::i;:::-;;;17139:2;17131:5;:10;;;;:::i;:::-;17118:2;:24;;;;:::i;:::-;17105:39;;17088:6;17095;17088:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17168:2;17159:11;;;;;:::i;:::-;;;17028:154;;;17206:6;17192:21;;;;;16498:723;;;;:::o;19047:157::-;19132:4;19171:25;19156:40;;;:11;:40;;;;19149:47;;19047:157;;;:::o;35945:555::-;36055:45;36082:4;36088:2;36092:7;36055:26;:45::i;:::-;36133:1;36117:18;;:4;:18;;;36113:187;;;36152:40;36184:7;36152:31;:40::i;:::-;36113:187;;;36222:2;36214:10;;:4;:10;;;36210:90;;36241:47;36274:4;36280:7;36241:32;:47::i;:::-;36210:90;36113:187;36328:1;36314:16;;:2;:16;;;36310:183;;;36347:45;36384:7;36347:36;:45::i;:::-;36310:183;;;36420:4;36414:10;;:2;:10;;;36410:83;;36441:40;36469:2;36473:7;36441:27;:40::i;:::-;36410:83;36310:183;35945:555;;;:::o;27482:250::-;27578:18;27584:2;27588:7;27578:5;:18::i;:::-;27615:54;27646:1;27650:2;27654:7;27663:5;27615:22;:54::i;:::-;27607:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;27482:250;;;:::o;30777:843::-;30898:4;30924:15;:2;:13;;;:15::i;:::-;30920:693;;;30976:2;30960:36;;;30997:12;:10;:12::i;:::-;31011:4;31017:7;31026:5;30960:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30956:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31223:1;31206:6;:13;:18;31202:341;;;31249:60;;;;;;;;;;:::i;:::-;;;;;;;;31202:341;31493:6;31487:13;31478:6;31474:2;31470:15;31463:38;30956:602;31093:45;;;31083:55;;;:6;:55;;;;31076:62;;;;;30920:693;31597:4;31590:11;;30777:843;;;;;;;:::o;32233:93::-;;;;:::o;37223:164::-;37327:10;:17;;;;37300:15;:24;37316:7;37300:24;;;;;;;;;;;:44;;;;37355:10;37371:7;37355:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37223:164;:::o;38014:988::-;38280:22;38330:1;38305:22;38322:4;38305:16;:22::i;:::-;:26;;;;:::i;:::-;38280:51;;38342:18;38363:17;:26;38381:7;38363:26;;;;;;;;;;;;38342:47;;38510:14;38496:10;:28;38492:328;;38541:19;38563:12;:18;38576:4;38563:18;;;;;;;;;;;;;;;:34;38582:14;38563:34;;;;;;;;;;;;38541:56;;38647:11;38614:12;:18;38627:4;38614:18;;;;;;;;;;;;;;;:30;38633:10;38614:30;;;;;;;;;;;:44;;;;38764:10;38731:17;:30;38749:11;38731:30;;;;;;;;;;;:43;;;;38492:328;;38916:17;:26;38934:7;38916:26;;;;;;;;;;;38909:33;;;38960:12;:18;38973:4;38960:18;;;;;;;;;;;;;;;:34;38979:14;38960:34;;;;;;;;;;;38953:41;;;38014:988;;;;:::o;39297:1079::-;39550:22;39595:1;39575:10;:17;;;;:21;;;;:::i;:::-;39550:46;;39607:18;39628:15;:24;39644:7;39628:24;;;;;;;;;;;;39607:45;;39979:19;40001:10;40012:14;40001:26;;;;;;;;;;;;;;;;;;;;;;;;39979:48;;40065:11;40040:10;40051;40040:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;40176:10;40145:15;:28;40161:11;40145:28;;;;;;;;;;;:41;;;;40317:15;:24;40333:7;40317:24;;;;;;;;;;;40310:31;;;40352:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39297:1079;;;;:::o;36801:221::-;36886:14;36903:20;36920:2;36903:16;:20::i;:::-;36886:37;;36961:7;36934:12;:16;36947:2;36934:16;;;;;;;;;;;;;;;:24;36951:6;36934:24;;;;;;;;;;;:34;;;;37008:6;36979:17;:26;36997:7;36979:26;;;;;;;;;;;:35;;;;36801:221;;;:::o;28068:382::-;28162:1;28148:16;;:2;:16;;;;28140:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28221:16;28229:7;28221;:16::i;:::-;28220:17;28212:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28283:45;28312:1;28316:2;28320:7;28283:20;:45::i;:::-;28358:1;28341:9;:13;28351:2;28341:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28389:2;28370:7;:16;28378:7;28370:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28434:7;28430:2;28409:33;;28426:1;28409:33;;;;;;;;;;;;28068:382;;:::o;7972:422::-;8032:4;8240:12;8351:7;8339:20;8331:28;;8385:1;8378:4;:8;8371:15;;;7972:422;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:262::-;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2073:196;;;;:::o;2275:407::-;;;2400:2;2388:9;2379:7;2375:23;2371:32;2368:2;;;2416:1;2413;2406:12;2368:2;2459:1;2484:53;2529:7;2520:6;2509:9;2505:22;2484:53;:::i;:::-;2474:63;;2430:117;2586:2;2612:53;2657:7;2648:6;2637:9;2633:22;2612:53;:::i;:::-;2602:63;;2557:118;2358:324;;;;;:::o;2688:552::-;;;;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;:::i;:::-;3032:63;;2987:118;3144:2;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3115:118;2788:452;;;;;:::o;3246:809::-;;;;;3414:3;3402:9;3393:7;3389:23;3385:33;3382:2;;;3431:1;3428;3421:12;3382:2;3474:1;3499:53;3544:7;3535:6;3524:9;3520:22;3499:53;:::i;:::-;3489:63;;3445:117;3601:2;3627:53;3672:7;3663:6;3652:9;3648:22;3627:53;:::i;:::-;3617:63;;3572:118;3729:2;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3700:118;3885:2;3874:9;3870:18;3857:32;3916:18;3908:6;3905:30;3902:2;;;3948:1;3945;3938:12;3902:2;3976:62;4030:7;4021:6;4010:9;4006:22;3976:62;:::i;:::-;3966:72;;3828:220;3372:683;;;;;;;:::o;4061:401::-;;;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4199:1;4196;4189:12;4151:2;4242:1;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4213:117;4369:2;4395:50;4437:7;4428:6;4417:9;4413:22;4395:50;:::i;:::-;4385:60;;4340:115;4141:321;;;;;:::o;4468:407::-;;;4593:2;4581:9;4572:7;4568:23;4564:32;4561:2;;;4609:1;4606;4599:12;4561:2;4652:1;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4623:117;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4551:324;;;;;:::o;4881:260::-;;4988:2;4976:9;4967:7;4963:23;4959:32;4956:2;;;5004:1;5001;4994:12;4956:2;5047:1;5072:52;5116:7;5107:6;5096:9;5092:22;5072:52;:::i;:::-;5062:62;;5018:116;4946:195;;;;:::o;5147:282::-;;5265:2;5253:9;5244:7;5240:23;5236:32;5233:2;;;5281:1;5278;5271:12;5233:2;5324:1;5349:63;5404:7;5395:6;5384:9;5380:22;5349:63;:::i;:::-;5339:73;;5295:127;5223:206;;;;:::o;5435:375::-;;5553:2;5541:9;5532:7;5528:23;5524:32;5521:2;;;5569:1;5566;5559:12;5521:2;5640:1;5629:9;5625:17;5612:31;5670:18;5662:6;5659:30;5656:2;;;5702:1;5699;5692:12;5656:2;5730:63;5785:7;5776:6;5765:9;5761:22;5730:63;:::i;:::-;5720:73;;5583:220;5511:299;;;;:::o;5816:262::-;;5924:2;5912:9;5903:7;5899:23;5895:32;5892:2;;;5940:1;5937;5930:12;5892:2;5983:1;6008:53;6053:7;6044:6;6033:9;6029:22;6008:53;:::i;:::-;5998:63;;5954:117;5882:196;;;;:::o;6084:118::-;6171:24;6189:5;6171:24;:::i;:::-;6166:3;6159:37;6149:53;;:::o;6208:109::-;6289:21;6304:5;6289:21;:::i;:::-;6284:3;6277:34;6267:50;;:::o;6323:360::-;;6437:38;6469:5;6437:38;:::i;:::-;6491:70;6554:6;6549:3;6491:70;:::i;:::-;6484:77;;6570:52;6615:6;6610:3;6603:4;6596:5;6592:16;6570:52;:::i;:::-;6647:29;6669:6;6647:29;:::i;:::-;6642:3;6638:39;6631:46;;6413:270;;;;;:::o;6689:364::-;;6805:39;6838:5;6805:39;:::i;:::-;6860:71;6924:6;6919:3;6860:71;:::i;:::-;6853:78;;6940:52;6985:6;6980:3;6973:4;6966:5;6962:16;6940:52;:::i;:::-;7017:29;7039:6;7017:29;:::i;:::-;7012:3;7008:39;7001:46;;6781:272;;;;;:::o;7059:377::-;;7193:39;7226:5;7193:39;:::i;:::-;7248:89;7330:6;7325:3;7248:89;:::i;:::-;7241:96;;7346:52;7391:6;7386:3;7379:4;7372:5;7368:16;7346:52;:::i;:::-;7423:6;7418:3;7414:16;7407:23;;7169:267;;;;;:::o;7442:317::-;;7605:67;7669:2;7664:3;7605:67;:::i;:::-;7598:74;;7702:21;7698:1;7693:3;7689:11;7682:42;7750:2;7745:3;7741:12;7734:19;;7588:171;;;:::o;7765:375::-;;7928:67;7992:2;7987:3;7928:67;:::i;:::-;7921:74;;8025:34;8021:1;8016:3;8012:11;8005:55;8091:13;8086:2;8081:3;8077:12;8070:35;8131:2;8126:3;8122:12;8115:19;;7911:229;;;:::o;8146:382::-;;8309:67;8373:2;8368:3;8309:67;:::i;:::-;8302:74;;8406:34;8402:1;8397:3;8393:11;8386:55;8472:20;8467:2;8462:3;8458:12;8451:42;8519:2;8514:3;8510:12;8503:19;;8292:236;;;:::o;8534:370::-;;8697:67;8761:2;8756:3;8697:67;:::i;:::-;8690:74;;8794:34;8790:1;8785:3;8781:11;8774:55;8860:8;8855:2;8850:3;8846:12;8839:30;8895:2;8890:3;8886:12;8879:19;;8680:224;;;:::o;8910:326::-;;9073:67;9137:2;9132:3;9073:67;:::i;:::-;9066:74;;9170:30;9166:1;9161:3;9157:11;9150:51;9227:2;9222:3;9218:12;9211:19;;9056:180;;;:::o;9242:368::-;;9405:67;9469:2;9464:3;9405:67;:::i;:::-;9398:74;;9502:34;9498:1;9493:3;9489:11;9482:55;9568:6;9563:2;9558:3;9554:12;9547:28;9601:2;9596:3;9592:12;9585:19;;9388:222;;;:::o;9616:323::-;;9779:67;9843:2;9838:3;9779:67;:::i;:::-;9772:74;;9876:27;9872:1;9867:3;9863:11;9856:48;9930:2;9925:3;9921:12;9914:19;;9762:177;;;:::o;9945:376::-;;10108:67;10172:2;10167:3;10108:67;:::i;:::-;10101:74;;10205:34;10201:1;10196:3;10192:11;10185:55;10271:14;10266:2;10261:3;10257:12;10250:36;10312:2;10307:3;10303:12;10296:19;;10091:230;;;:::o;10327:330::-;;10490:67;10554:2;10549:3;10490:67;:::i;:::-;10483:74;;10587:34;10583:1;10578:3;10574:11;10567:55;10648:2;10643:3;10639:12;10632:19;;10473:184;;;:::o;10663:388::-;;10826:67;10890:2;10885:3;10826:67;:::i;:::-;10819:74;;10923:34;10919:1;10914:3;10910:11;10903:55;10989:26;10984:2;10979:3;10975:12;10968:48;11042:2;11037:3;11033:12;11026:19;;10809:242;;;:::o;11057:374::-;;11220:67;11284:2;11279:3;11220:67;:::i;:::-;11213:74;;11317:34;11313:1;11308:3;11304:11;11297:55;11383:12;11378:2;11373:3;11369:12;11362:34;11422:2;11417:3;11413:12;11406:19;;11203:228;;;:::o;11437:373::-;;11600:67;11664:2;11659:3;11600:67;:::i;:::-;11593:74;;11697:34;11693:1;11688:3;11684:11;11677:55;11763:11;11758:2;11753:3;11749:12;11742:33;11801:2;11796:3;11792:12;11785:19;;11583:227;;;:::o;11816:310::-;;11979:67;12043:2;12038:3;11979:67;:::i;:::-;11972:74;;12076:14;12072:1;12067:3;12063:11;12056:35;12117:2;12112:3;12108:12;12101:19;;11962:164;;;:::o;12132:330::-;;12295:67;12359:2;12354:3;12295:67;:::i;:::-;12288:74;;12392:34;12388:1;12383:3;12379:11;12372:55;12453:2;12448:3;12444:12;12437:19;;12278:184;;;:::o;12468:365::-;;12631:67;12695:2;12690:3;12631:67;:::i;:::-;12624:74;;12728:34;12724:1;12719:3;12715:11;12708:55;12794:3;12789:2;12784:3;12780:12;12773:25;12824:2;12819:3;12815:12;12808:19;;12614:219;;;:::o;12839:376::-;;13002:67;13066:2;13061:3;13002:67;:::i;:::-;12995:74;;13099:34;13095:1;13090:3;13086:11;13079:55;13165:14;13160:2;13155:3;13151:12;13144:36;13206:2;13201:3;13197:12;13190:19;;12985:230;;;:::o;13221:337::-;;13402:84;13484:1;13479:3;13402:84;:::i;:::-;13395:91;;13516:7;13512:1;13507:3;13503:11;13496:28;13550:1;13545:3;13541:11;13534:18;;13385:173;;;:::o;13564:330::-;;13727:67;13791:2;13786:3;13727:67;:::i;:::-;13720:74;;13824:34;13820:1;13815:3;13811:11;13804:55;13885:2;13880:3;13876:12;13869:19;;13710:184;;;:::o;13900:373::-;;14063:67;14127:2;14122:3;14063:67;:::i;:::-;14056:74;;14160:34;14156:1;14151:3;14147:11;14140:55;14226:11;14221:2;14216:3;14212:12;14205:33;14264:2;14259:3;14255:12;14248:19;;14046:227;;;:::o;14279:317::-;;14442:67;14506:2;14501:3;14442:67;:::i;:::-;14435:74;;14539:21;14535:1;14530:3;14526:11;14519:42;14587:2;14582:3;14578:12;14571:19;;14425:171;;;:::o;14602:320::-;;14765:67;14829:2;14824:3;14765:67;:::i;:::-;14758:74;;14862:24;14858:1;14853:3;14849:11;14842:45;14913:2;14908:3;14904:12;14897:19;;14748:174;;;:::o;14928:365::-;;15091:67;15155:2;15150:3;15091:67;:::i;:::-;15084:74;;15188:34;15184:1;15179:3;15175:11;15168:55;15254:3;15249:2;15244:3;15240:12;15233:25;15284:2;15279:3;15275:12;15268:19;;15074:219;;;:::o;15299:299::-;;15480:84;15562:1;15557:3;15480:84;:::i;:::-;15473:91;;15590:1;15585:3;15581:11;15574:18;;15463:135;;;:::o;15604:381::-;;15767:67;15831:2;15826:3;15767:67;:::i;:::-;15760:74;;15864:34;15860:1;15855:3;15851:11;15844:55;15930:19;15925:2;15920:3;15916:12;15909:41;15976:2;15971:3;15967:12;15960:19;;15750:235;;;:::o;15991:376::-;;16154:67;16218:2;16213:3;16154:67;:::i;:::-;16147:74;;16251:34;16247:1;16242:3;16238:11;16231:55;16317:14;16312:2;16307:3;16303:12;16296:36;16358:2;16353:3;16349:12;16342:19;;16137:230;;;:::o;16373:315::-;;16536:67;16600:2;16595:3;16536:67;:::i;:::-;16529:74;;16633:19;16629:1;16624:3;16620:11;16613:40;16679:2;16674:3;16670:12;16663:19;;16519:169;;;:::o;16694:318::-;;16857:67;16921:2;16916:3;16857:67;:::i;:::-;16850:74;;16954:22;16950:1;16945:3;16941:11;16934:43;17003:2;16998:3;16994:12;16987:19;;16840:172;;;:::o;17018:118::-;17105:24;17123:5;17105:24;:::i;:::-;17100:3;17093:37;17083:53;;:::o;17142:701::-;;17445:95;17536:3;17527:6;17445:95;:::i;:::-;17438:102;;17557:95;17648:3;17639:6;17557:95;:::i;:::-;17550:102;;17669:148;17813:3;17669:148;:::i;:::-;17662:155;;17834:3;17827:10;;17427:416;;;;;:::o;17849:541::-;;18104:95;18195:3;18186:6;18104:95;:::i;:::-;18097:102;;18216:148;18360:3;18216:148;:::i;:::-;18209:155;;18381:3;18374:10;;18086:304;;;;:::o;18396:222::-;;18527:2;18516:9;18512:18;18504:26;;18540:71;18608:1;18597:9;18593:17;18584:6;18540:71;:::i;:::-;18494:124;;;;:::o;18624:640::-;;18857:3;18846:9;18842:19;18834:27;;18871:71;18939:1;18928:9;18924:17;18915:6;18871:71;:::i;:::-;18952:72;19020:2;19009:9;19005:18;18996:6;18952:72;:::i;:::-;19034;19102:2;19091:9;19087:18;19078:6;19034:72;:::i;:::-;19153:9;19147:4;19143:20;19138:2;19127:9;19123:18;19116:48;19181:76;19252:4;19243:6;19181:76;:::i;:::-;19173:84;;18824:440;;;;;;;:::o;19270:210::-;;19395:2;19384:9;19380:18;19372:26;;19408:65;19470:1;19459:9;19455:17;19446:6;19408:65;:::i;:::-;19362:118;;;;:::o;19486:313::-;;19637:2;19626:9;19622:18;19614:26;;19686:9;19680:4;19676:20;19672:1;19661:9;19657:17;19650:47;19714:78;19787:4;19778:6;19714:78;:::i;:::-;19706:86;;19604:195;;;;:::o;19805:419::-;;20009:2;19998:9;19994:18;19986:26;;20058:9;20052:4;20048:20;20044:1;20033:9;20029:17;20022:47;20086:131;20212:4;20086:131;:::i;:::-;20078:139;;19976:248;;;:::o;20230:419::-;;20434:2;20423:9;20419:18;20411:26;;20483:9;20477:4;20473:20;20469:1;20458:9;20454:17;20447:47;20511:131;20637:4;20511:131;:::i;:::-;20503:139;;20401:248;;;:::o;20655:419::-;;20859:2;20848:9;20844:18;20836:26;;20908:9;20902:4;20898:20;20894:1;20883:9;20879:17;20872:47;20936:131;21062:4;20936:131;:::i;:::-;20928:139;;20826:248;;;:::o;21080:419::-;;21284:2;21273:9;21269:18;21261:26;;21333:9;21327:4;21323:20;21319:1;21308:9;21304:17;21297:47;21361:131;21487:4;21361:131;:::i;:::-;21353:139;;21251:248;;;:::o;21505:419::-;;21709:2;21698:9;21694:18;21686:26;;21758:9;21752:4;21748:20;21744:1;21733:9;21729:17;21722:47;21786:131;21912:4;21786:131;:::i;:::-;21778:139;;21676:248;;;:::o;21930:419::-;;22134:2;22123:9;22119:18;22111:26;;22183:9;22177:4;22173:20;22169:1;22158:9;22154:17;22147:47;22211:131;22337:4;22211:131;:::i;:::-;22203:139;;22101:248;;;:::o;22355:419::-;;22559:2;22548:9;22544:18;22536:26;;22608:9;22602:4;22598:20;22594:1;22583:9;22579:17;22572:47;22636:131;22762:4;22636:131;:::i;:::-;22628:139;;22526:248;;;:::o;22780:419::-;;22984:2;22973:9;22969:18;22961:26;;23033:9;23027:4;23023:20;23019:1;23008:9;23004:17;22997:47;23061:131;23187:4;23061:131;:::i;:::-;23053:139;;22951:248;;;:::o;23205:419::-;;23409:2;23398:9;23394:18;23386:26;;23458:9;23452:4;23448:20;23444:1;23433:9;23429:17;23422:47;23486:131;23612:4;23486:131;:::i;:::-;23478:139;;23376:248;;;:::o;23630:419::-;;23834:2;23823:9;23819:18;23811:26;;23883:9;23877:4;23873:20;23869:1;23858:9;23854:17;23847:47;23911:131;24037:4;23911:131;:::i;:::-;23903:139;;23801:248;;;:::o;24055:419::-;;24259:2;24248:9;24244:18;24236:26;;24308:9;24302:4;24298:20;24294:1;24283:9;24279:17;24272:47;24336:131;24462:4;24336:131;:::i;:::-;24328:139;;24226:248;;;:::o;24480:419::-;;24684:2;24673:9;24669:18;24661:26;;24733:9;24727:4;24723:20;24719:1;24708:9;24704:17;24697:47;24761:131;24887:4;24761:131;:::i;:::-;24753:139;;24651:248;;;:::o;24905:419::-;;25109:2;25098:9;25094:18;25086:26;;25158:9;25152:4;25148:20;25144:1;25133:9;25129:17;25122:47;25186:131;25312:4;25186:131;:::i;:::-;25178:139;;25076:248;;;:::o;25330:419::-;;25534:2;25523:9;25519:18;25511:26;;25583:9;25577:4;25573:20;25569:1;25558:9;25554:17;25547:47;25611:131;25737:4;25611:131;:::i;:::-;25603:139;;25501:248;;;:::o;25755:419::-;;25959:2;25948:9;25944:18;25936:26;;26008:9;26002:4;25998:20;25994:1;25983:9;25979:17;25972:47;26036:131;26162:4;26036:131;:::i;:::-;26028:139;;25926:248;;;:::o;26180:419::-;;26384:2;26373:9;26369:18;26361:26;;26433:9;26427:4;26423:20;26419:1;26408:9;26404:17;26397:47;26461:131;26587:4;26461:131;:::i;:::-;26453:139;;26351:248;;;:::o;26605:419::-;;26809:2;26798:9;26794:18;26786:26;;26858:9;26852:4;26848:20;26844:1;26833:9;26829:17;26822:47;26886:131;27012:4;26886:131;:::i;:::-;26878:139;;26776:248;;;:::o;27030:419::-;;27234:2;27223:9;27219:18;27211:26;;27283:9;27277:4;27273:20;27269:1;27258:9;27254:17;27247:47;27311:131;27437:4;27311:131;:::i;:::-;27303:139;;27201:248;;;:::o;27455:419::-;;27659:2;27648:9;27644:18;27636:26;;27708:9;27702:4;27698:20;27694:1;27683:9;27679:17;27672:47;27736:131;27862:4;27736:131;:::i;:::-;27728:139;;27626:248;;;:::o;27880:419::-;;28084:2;28073:9;28069:18;28061:26;;28133:9;28127:4;28123:20;28119:1;28108:9;28104:17;28097:47;28161:131;28287:4;28161:131;:::i;:::-;28153:139;;28051:248;;;:::o;28305:419::-;;28509:2;28498:9;28494:18;28486:26;;28558:9;28552:4;28548:20;28544:1;28533:9;28529:17;28522:47;28586:131;28712:4;28586:131;:::i;:::-;28578:139;;28476:248;;;:::o;28730:419::-;;28934:2;28923:9;28919:18;28911:26;;28983:9;28977:4;28973:20;28969:1;28958:9;28954:17;28947:47;29011:131;29137:4;29011:131;:::i;:::-;29003:139;;28901:248;;;:::o;29155:419::-;;29359:2;29348:9;29344:18;29336:26;;29408:9;29402:4;29398:20;29394:1;29383:9;29379:17;29372:47;29436:131;29562:4;29436:131;:::i;:::-;29428:139;;29326:248;;;:::o;29580:419::-;;29784:2;29773:9;29769:18;29761:26;;29833:9;29827:4;29823:20;29819:1;29808:9;29804:17;29797:47;29861:131;29987:4;29861:131;:::i;:::-;29853:139;;29751:248;;;:::o;30005:419::-;;30209:2;30198:9;30194:18;30186:26;;30258:9;30252:4;30248:20;30244:1;30233:9;30229:17;30222:47;30286:131;30412:4;30286:131;:::i;:::-;30278:139;;30176:248;;;:::o;30430:222::-;;30561:2;30550:9;30546:18;30538:26;;30574:71;30642:1;30631:9;30627:17;30618:6;30574:71;:::i;:::-;30528:124;;;;:::o;30658:283::-;;30724:2;30718:9;30708:19;;30766:4;30758:6;30754:17;30873:6;30861:10;30858:22;30837:18;30825:10;30822:34;30819:62;30816:2;;;30884:18;;:::i;:::-;30816:2;30924:10;30920:2;30913:22;30698:243;;;;:::o;30947:331::-;;31098:18;31090:6;31087:30;31084:2;;;31120:18;;:::i;:::-;31084:2;31205:4;31201:9;31194:4;31186:6;31182:17;31178:33;31170:41;;31266:4;31260;31256:15;31248:23;;31013:265;;;:::o;31284:332::-;;31436:18;31428:6;31425:30;31422:2;;;31458:18;;:::i;:::-;31422:2;31543:4;31539:9;31532:4;31524:6;31520:17;31516:33;31508:41;;31604:4;31598;31594:15;31586:23;;31351:265;;;:::o;31622:98::-;;31707:5;31701:12;31691:22;;31680:40;;;:::o;31726:99::-;;31812:5;31806:12;31796:22;;31785:40;;;:::o;31831:168::-;;31948:6;31943:3;31936:19;31988:4;31983:3;31979:14;31964:29;;31926:73;;;;:::o;32005:169::-;;32123:6;32118:3;32111:19;32163:4;32158:3;32154:14;32139:29;;32101:73;;;;:::o;32180:148::-;;32319:3;32304:18;;32294:34;;;;:::o;32334:305::-;;32393:20;32411:1;32393:20;:::i;:::-;32388:25;;32427:20;32445:1;32427:20;:::i;:::-;32422:25;;32581:1;32513:66;32509:74;32506:1;32503:81;32500:2;;;32587:18;;:::i;:::-;32500:2;32631:1;32628;32624:9;32617:16;;32378:261;;;;:::o;32645:185::-;;32702:20;32720:1;32702:20;:::i;:::-;32697:25;;32736:20;32754:1;32736:20;:::i;:::-;32731:25;;32775:1;32765:2;;32780:18;;:::i;:::-;32765:2;32822:1;32819;32815:9;32810:14;;32687:143;;;;:::o;32836:348::-;;32899:20;32917:1;32899:20;:::i;:::-;32894:25;;32933:20;32951:1;32933:20;:::i;:::-;32928:25;;33121:1;33053:66;33049:74;33046:1;33043:81;33038:1;33031:9;33024:17;33020:105;33017:2;;;33128:18;;:::i;:::-;33017:2;33176:1;33173;33169:9;33158:20;;32884:300;;;;:::o;33190:191::-;;33250:20;33268:1;33250:20;:::i;:::-;33245:25;;33284:20;33302:1;33284:20;:::i;:::-;33279:25;;33323:1;33320;33317:8;33314:2;;;33328:18;;:::i;:::-;33314:2;33373:1;33370;33366:9;33358:17;;33235:146;;;;:::o;33387:96::-;;33453:24;33471:5;33453:24;:::i;:::-;33442:35;;33432:51;;;:::o;33489:90::-;;33566:5;33559:13;33552:21;33541:32;;33531:48;;;:::o;33585:149::-;;33661:66;33654:5;33650:78;33639:89;;33629:105;;;:::o;33740:126::-;;33817:42;33810:5;33806:54;33795:65;;33785:81;;;:::o;33872:77::-;;33938:5;33927:16;;33917:32;;;:::o;33955:154::-;34039:6;34034:3;34029;34016:30;34101:1;34092:6;34087:3;34083:16;34076:27;34006:103;;;:::o;34115:307::-;34183:1;34193:113;34207:6;34204:1;34201:13;34193:113;;;34292:1;34287:3;34283:11;34277:18;34273:1;34268:3;34264:11;34257:39;34229:2;34226:1;34222:10;34217:15;;34193:113;;;34324:6;34321:1;34318:13;34315:2;;;34404:1;34395:6;34390:3;34386:16;34379:27;34315:2;34164:258;;;;:::o;34428:320::-;;34509:1;34503:4;34499:12;34489:22;;34556:1;34550:4;34546:12;34577:18;34567:2;;34633:4;34625:6;34621:17;34611:27;;34567:2;34695;34687:6;34684:14;34664:18;34661:38;34658:2;;;34714:18;;:::i;:::-;34658:2;34479:269;;;;:::o;34754:233::-;;34816:24;34834:5;34816:24;:::i;:::-;34807:33;;34862:66;34855:5;34852:77;34849:2;;;34932:18;;:::i;:::-;34849:2;34979:1;34972:5;34968:13;34961:20;;34797:190;;;:::o;34993:176::-;;35042:20;35060:1;35042:20;:::i;:::-;35037:25;;35076:20;35094:1;35076:20;:::i;:::-;35071:25;;35115:1;35105:2;;35120:18;;:::i;:::-;35105:2;35161:1;35158;35154:9;35149:14;;35027:142;;;;:::o;35175:180::-;35223:77;35220:1;35213:88;35320:4;35317:1;35310:15;35344:4;35341:1;35334:15;35361:180;35409:77;35406:1;35399:88;35506:4;35503:1;35496:15;35530:4;35527:1;35520:15;35547:180;35595:77;35592:1;35585:88;35692:4;35689:1;35682:15;35716:4;35713:1;35706:15;35733:180;35781:77;35778:1;35771:88;35878:4;35875:1;35868:15;35902:4;35899:1;35892:15;35919:102;;36011:2;36007:7;36002:2;35995:5;35991:14;35987:28;35977:38;;35967:54;;;:::o;36027:122::-;36100:24;36118:5;36100:24;:::i;:::-;36093:5;36090:35;36080:2;;36139:1;36136;36129:12;36080:2;36070:79;:::o;36155:116::-;36225:21;36240:5;36225:21;:::i;:::-;36218:5;36215:32;36205:2;;36261:1;36258;36251:12;36205:2;36195:76;:::o;36277:120::-;36349:23;36366:5;36349:23;:::i;:::-;36342:5;36339:34;36329:2;;36387:1;36384;36377:12;36329:2;36319:78;:::o;36403:122::-;36476:24;36494:5;36476:24;:::i;:::-;36469:5;36466:35;36456:2;;36515:1;36512;36505:12;36456:2;36446:79;:::o

Swarm Source

ipfs://97a8c3d374ec99d367d9e08ba491e36a4021bc6867ad8b4584fbb46fbbe9b714
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.