ETH Price: $3,529.37 (+7.04%)

Token

3DBears (3DB)
 

Overview

Max Total Supply

10,000 3DB

Holders

3,508

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
kementari.eth
Balance
46 3DB
0x5115c67f5621440fd8413cdad36fdf89b8ac4c01
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

3D Bears is a collection of 10,000 adorable polar bear NFTs in 4K available on the Ethereum blockchain. Each bear is completely , and based on an original Winter Bear, created using 150 individual features.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
TDBears

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-26
*/

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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


// OpenZeppelin Contracts v4.4.0 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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


// OpenZeppelin Contracts v4.4.0 (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;
    }
}


// OpenZeppelin Contracts v4.4.0 (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;
}


// OpenZeppelin Contracts v4.4.0 (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);
}


// OpenZeppelin Contracts v4.4.0 (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);
}


// OpenZeppelin Contracts v4.4.0 (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);
}


// OpenZeppelin Contracts v4.4.0 (utils/Address.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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


// OpenZeppelin Contracts v4.4.0 (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}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_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 Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

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


// OpenZeppelin Contracts v4.4.0 (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();
    }
}


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


// 3D Bears

//MMMMMMMMMMMMMMMMMMNNNNNNNmmmmNNNNNNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
//MMMMMMMMMMMMMNNNmdhhyyssssssssssyyhhdmmNNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
//MMMMMMMMMMNNdhysssssssssssssssssssssssyyhdmNNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
//MMMMMMMMNmyssssssssssssssssssssssssssssssyyyhdmNNMMMMMMMMMMMMMMMMMMMMMMMMMM
//MMMMMMNmyosssssssssssssssssssssssssssssssssyyyyhdmNNMMMMMMMMMMMMMMMMMMMMMMM
//MMMMMNd+ossssssssssssssssssssssssssssssssssssyyyyyhdNNMMMMMMMMMMMMMMMMMMMMM
//MMMMNh/osssssssssssssssssssssssssssssssssssssssyyyyyhdNNMMMMMMMMMMMMMMMMMMM
//MMMNd:osssssssssssssssssssssssssssssssssssssssssyyyyyyhdNNMMMMMMMMMMMMMMMMM
//MMNN+/sssssssssssssssssssssssssssssssssssssssssssyyyyyyyhmNMMMMMMMMMMMMMMMM
//MMNh:ossssssyyyhhddddddddddddddhhyyyyssssssssssssyyyyyyyyydNMMMMMMMMMMMMMMM
//MMNo:ssyyhddhhso/::----------:/+osyhddddhyysssssssdhyyyyyyydNNMMMMMMMMMMMMM
//MNN++hddy+:.`                       `-:+shddddhyssymhyyyyyyydNNMMMMMMMMMMMM
//MNNdds:`                                 `.:+oydddhhmdyyyyyyydNMMMMMMMMMMMM
//MNm+`                                        `.-/oydmNdyyyyyyymNMMMMMMMMMMM
//NN-                    `````                    .---/odmhyyyyyhNNMMMMMMMMMM
//Nd         `.:/+ossyyyhhhhhhhyyysso+/:.`         -----:mmyyyyyymNMMMMMMMMMM
//Nh    -/shddhso+/:--..```````..--:/+oshddhs+:.   `-----sNdhyyyyhNNNMMMMMMMM
//Nm`/ymho/.                               .:+shmyo::----/NNNdyyyyNm+sdNNMMMM
//NNmN/`                                        `-+ymho/-:NNmNmdmmy/   -smNMM
//MMNh     :shyo.                   .-:-            :+ymhsNd.-::.`      .:dNM
//MMNs    y+:hNNm/               -ohs/-`            .--:mNN-            .-:mN
//MMNo   .NyomNNNh             .smms+:-`            .---yNm             ---dN
//MMNs    hNNNNNN+             -s+////+o.           `---sNN-          `.--:mN
//MMNy    `ohddy/                                   `---oNNh:.```````.---:yNM
//MNN:      ```     `.....                          `---sNNNd+:--------:+dNMM
//MNh              +ddyyydh-                        `---oNMMMNdyo+//+oydNNMMM
//MNs              /mNNNNNd.                        .---sNMMMMMMNNNNNNMMMMMMM
//MNy            -: .+dNy/`  :s                     ----hNMMMMMMMMMMMMMMMMMMM
//MNm.           .do:+mNh+/+yN+                    .---oNNMMMMMMMMMMMMMMMMMMM
//MMNd.           ./dNmmdhhmNd                   `---:oNNMMMMMMMMMMMMMMMMMMMM
//MMMNm/`           :mmsoosdd-                 `.--:+hNMMMMMMMMMMMMMMMMMMMMMM
//MMMMMNd+.`         .ohddy+`               `.--:/sdNNMMMMMMMMMMMMMMMMMMMMMMM
//MMMMMMMNNho:.`                       ``.--:/oydNNMMMMMMMMMMMMMMMMMMMMMMMMMM
//MMMMMMMMMMNNNdhs+/:-..`````.....--:/+osyhdNNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
//MMMMMMMMMMMMMMMMNNNNNNmmmmmmmmNNNNNNNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM

// 3D Bears is a collection of 10,000 adorable polar bear NFTs in 4K available on the Ethereum blockchain.
// Each bear is completely unique, and based on an original Winter Bear, created using 150 individual features.

pragma solidity ^0.8.10;

contract TDBears is ERC721Enumerable, Ownable {
    address public constant winterAddress = 0xC8BcbE0E8ae36D8f9238cd320ef6dE88784B1734;
    address public constant summerAddress = 0xE5Ba25f22A20a22fb47DADF137f33fE2E9AB22AC;
    uint256 public discountPrice = 0.02 ether;
    uint256 public fullPrice = 0.05 ether;
    uint256 public constant MAX_BEARS = 10000;
    uint256 public constant MAX_BEARS_PER_MINT = 20;
    string private baseURI;
    bool public isDiscountSaleActive = false;
    bool public isPresaleActive = false;
    bool public isSaleActive = false;

    mapping(uint256 => bool) public claimed;
    mapping(address => bool) private presaleList;

    constructor() ERC721("3DBears", "3DB") {}

    function withdraw() public onlyOwner {
        uint balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

    function discountSaleMint(uint256[] memory tokenIds) public payable {
        uint256 totalSupply = totalSupply();

        require(isDiscountSaleActive, "Discount sale is not active" );
        require(msg.value >= tokenIds.length * discountPrice, "Ether value sent is not correct");
        require(tokenIds.length <= MAX_BEARS_PER_MINT, "Exceeds maximum bears you can purchase in a single transaction");
        require(totalSupply + tokenIds.length <= MAX_BEARS, "Exceeds maximum bears available for purchase");
        
        for(uint256 i = 0; i < tokenIds.length; i++) {
            require(!claimed[tokenIds[i]]);
            require(
                ERC721(winterAddress).ownerOf(tokenIds[i]) == msg.sender,
                "Not owner of Winter Bear"
            );
            require(
                ERC721(summerAddress).ownerOf(tokenIds[i]) == msg.sender,
                "Not owner of Summer Bear"
            );

            claimed[tokenIds[i]] = true;
            _safeMint(msg.sender, totalSupply + i);
        }
    }

    function presaleMint(uint256 _count) public payable {
        uint256 totalSupply = totalSupply();

        require(isPresaleActive, "Pre sale is not active" );
        require(msg.value >= _count * fullPrice, "Ether value sent is not correct");
        require(_count <= MAX_BEARS_PER_MINT, "Exceeds maximum bears you can purchase in a single transaction");
        require(totalSupply + _count <= MAX_BEARS, "Exceeds maximum bears available for purchase");
        require(presaleList[msg.sender], "Address not whitelisted for presale");

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

    function mint(uint256 _count) public payable {
        uint256 totalSupply = totalSupply();

        require(isSaleActive, "Sale is not active" );
        require(msg.value >= _count * fullPrice, "Ether value sent is not correct");
        require(_count <= MAX_BEARS_PER_MINT, "Exceeds maximum bears you can purchase in a single transaction");
        require(totalSupply + _count <= MAX_BEARS, "Exceeds maximum bears available for purchase");

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

    function setBaseUri(string memory _uri) external onlyOwner {
        baseURI = _uri;
    }

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

    function flipSaleStatus() public onlyOwner {
        isSaleActive = !isSaleActive;
    }

    function flipPresaleStatus() public onlyOwner {
        isPresaleActive = !isPresaleActive;
    }

    function flipDiscountSaleStatus() public onlyOwner {
        isDiscountSaleActive = !isDiscountSaleActive;
    }

    function setFullPrice(uint256 _newPrice) public onlyOwner() {
        fullPrice = _newPrice;
    }

    function setDiscountPrice(uint256 _newPrice) public onlyOwner() {
        discountPrice = _newPrice;
    }

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

    function addToPresaleList(address[] memory _wallets) public onlyOwner {
        for(uint i; i < _wallets.length; i++)
            presaleList[_wallets[i]] = true;
    }

    function removeFromPresaleList(address[] memory _wallets) public onlyOwner {
        for(uint i; i < _wallets.length; i++)
            presaleList[_wallets[i]] = false;
    }

    function checkPresaleList() public view returns(bool) {
        return presaleList[msg.sender];
    }
}

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":"MAX_BEARS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BEARS_PER_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_wallets","type":"address[]"}],"name":"addToPresaleList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkPresaleList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"claimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"discountPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"discountSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"flipDiscountSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPresaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fullPrice","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":[],"name":"isDiscountSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPresaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_wallets","type":"address[]"}],"name":"removeFromPresaleList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setDiscountPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setFullPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"summerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"winterAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405266470de4df820000600b5566b1a2bc2ec50000600c55600e805462ffffff191690553480156200003357600080fd5b5060408051808201825260078152663344426561727360c81b60208083019182528351808501909452600384526219a22160e91b9084015281519192916200007e916000916200010d565b508051620000949060019060208401906200010d565b505050620000b1620000ab620000b760201b60201c565b620000bb565b620001f0565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200011b90620001b3565b90600052602060002090601f0160209004810192826200013f57600085556200018a565b82601f106200015a57805160ff19168380011785556200018a565b828001600101855582156200018a579182015b828111156200018a5782518255916020019190600101906200016d565b50620001989291506200019c565b5090565b5b808211156200019857600081556001016200019d565b600181811c90821680620001c857607f821691505b60208210811415620001ea57634e487b7160e01b600052602260045260246000fd5b50919050565b613dc680620002006000396000f3fe6080604052600436106102dc5760003560e01c80638462151c11610184578063b88d4fde116100d6578063dbe7e3bd1161008a578063e985e9c511610064578063e985e9c5146107cc578063edd634b814610822578063f2fde38b1461083857600080fd5b8063dbe7e3bd14610761578063df2d6e7714610791578063e03b842e146107a457600080fd5b8063c9b298f1116100bb578063c9b298f114610723578063ce03ec9314610736578063da649ed71461074b57600080fd5b8063b88d4fde146106e3578063c87b56dd1461070357600080fd5b8063a0712d6811610138578063a2e4f14011610112578063a2e4f1401461068e578063adcb1e66146106a3578063b179e060146106c357600080fd5b8063a0712d681461063b578063a0bcfc7f1461064e578063a22cb4651461066e57600080fd5b80638b78c116116101695780638b78c116146105db5780638da5cb5b146105fb57806395d89b411461062657600080fd5b80638462151c1461059857806384ad8e8f146105c557600080fd5b806342842e0e1161023d5780636352211e116101f1578063715018a6116101cb578063715018a61461053b5780637204a3c91461055057806379f842161461057057600080fd5b80636352211e146104d657806370a08231146104f657806370c18f1f1461051657600080fd5b8063564566a811610222578063564566a8146104825780635d9f5a63146104a257806360d938dc146104b757600080fd5b806342842e0e146104425780634f6ccce71461046257600080fd5b806318160ddd116102945780632f745c59116102795780632f745c59146103f35780633ccfd60b1461041357806340c45b411461042857600080fd5b806318160ddd146103b457806323b872dd146103d357600080fd5b8063081812fc116102c5578063081812fc14610338578063095ea7b31461037d5780631725051f1461039f57600080fd5b806301ffc9a7146102e157806306fdde0314610316575b600080fd5b3480156102ed57600080fd5b506103016102fc3660046135e6565b610858565b60405190151581526020015b60405180910390f35b34801561032257600080fd5b5061032b6108b4565b60405161030d9190613679565b34801561034457600080fd5b5061035861035336600461368c565b610946565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161030d565b34801561038957600080fd5b5061039d6103983660046136c7565b610a25565b005b3480156103ab57600080fd5b5061039d610bb2565b3480156103c057600080fd5b506008545b60405190815260200161030d565b3480156103df57600080fd5b5061039d6103ee3660046136f3565b610c6d565b3480156103ff57600080fd5b506103c561040e3660046136c7565b610d0e565b34801561041f57600080fd5b5061039d610ddd565b34801561043457600080fd5b50600e546103019060ff1681565b34801561044e57600080fd5b5061039d61045d3660046136f3565b610e91565b34801561046e57600080fd5b506103c561047d36600461368c565b610eac565b34801561048e57600080fd5b50600e546103019062010000900460ff1681565b3480156104ae57600080fd5b506103c5601481565b3480156104c357600080fd5b50600e5461030190610100900460ff1681565b3480156104e257600080fd5b506103586104f136600461368c565b610f6a565b34801561050257600080fd5b506103c5610511366004613734565b61101c565b34801561052257600080fd5b503360009081526010602052604090205460ff16610301565b34801561054757600080fd5b5061039d6110ea565b34801561055c57600080fd5b5061039d61056b3660046137f3565b611177565b34801561057c57600080fd5b5061035873c8bcbe0e8ae36d8f9238cd320ef6de88784b173481565b3480156105a457600080fd5b506105b86105b3366004613734565b61128b565b60405161030d9190613892565b3480156105d157600080fd5b506103c5600b5481565b3480156105e757600080fd5b5061039d6105f636600461368c565b61134a565b34801561060757600080fd5b50600a5473ffffffffffffffffffffffffffffffffffffffff16610358565b34801561063257600080fd5b5061032b6113d0565b61039d61064936600461368c565b6113df565b34801561065a57600080fd5b5061039d61066936600461394c565b611631565b34801561067a57600080fd5b5061039d610689366004613995565b6116c5565b34801561069a57600080fd5b5061039d6116d0565b3480156106af57600080fd5b5061039d6106be36600461368c565b611783565b3480156106cf57600080fd5b5061039d6106de3660046137f3565b611809565b3480156106ef57600080fd5b5061039d6106fe3660046139d3565b61191d565b34801561070f57600080fd5b5061032b61071e36600461368c565b6119c5565b61039d61073136600461368c565b611ad5565b34801561074257600080fd5b5061039d611dc0565b34801561075757600080fd5b506103c561271081565b34801561076d57600080fd5b5061030161077c36600461368c565b600f6020526000908152604090205460ff1681565b61039d61079f366004613a53565b611e7c565b3480156107b057600080fd5b5061035873e5ba25f22a20a22fb47dadf137f33fe2e9ab22ac81565b3480156107d857600080fd5b506103016107e7366004613ad9565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561082e57600080fd5b506103c5600c5481565b34801561084457600080fd5b5061039d610853366004613734565b6123c9565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d630000000000000000000000000000000000000000000000000000000014806108ae57506108ae826124f9565b92915050565b6060600080546108c390613b07565b80601f01602080910402602001604051908101604052809291908181526020018280546108ef90613b07565b801561093c5780601f106109115761010080835404028352916020019161093c565b820191906000526020600020905b81548152906001019060200180831161091f57829003601f168201915b5050505050905090565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff166109fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6000610a3082610f6a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610aee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016109f3565b3373ffffffffffffffffffffffffffffffffffffffff82161480610b175750610b1781336107e7565b610ba3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109f3565b610bad83836125dc565b505050565b600a5473ffffffffffffffffffffffffffffffffffffffff163314610c33576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f3565b600e80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff81166101009182900460ff1615909102179055565b610c77338261267c565b610d03576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016109f3565b610bad8383836127ec565b6000610d198361101c565b8210610da7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e647300000000000000000000000000000000000000000060648201526084016109f3565b5073ffffffffffffffffffffffffffffffffffffffff919091166000908152600660209081526040808320938352929052205490565b600a5473ffffffffffffffffffffffffffffffffffffffff163314610e5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f3565b6040514790339082156108fc029083906000818181858888f19350505050158015610e8d573d6000803e3d6000fd5b5050565b610bad8383836040518060200160405280600081525061191d565b6000610eb760085490565b8210610f45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e6473000000000000000000000000000000000000000060648201526084016109f3565b60088281548110610f5857610f58613b55565b90600052602060002001549050919050565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff16806108ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016109f3565b600073ffffffffffffffffffffffffffffffffffffffff82166110c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016109f3565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b600a5473ffffffffffffffffffffffffffffffffffffffff16331461116b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f3565b6111756000612a5e565b565b600a5473ffffffffffffffffffffffffffffffffffffffff1633146111f8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f3565b60005b8151811015610e8d5760016010600084848151811061121c5761121c613b55565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790558061128381613bb3565b9150506111fb565b606060006112988361101c565b9050806112b95760408051600080825260208201909252905b509392505050565b60008167ffffffffffffffff8111156112d4576112d4613751565b6040519080825280602002602001820160405280156112fd578160200160208202803683370190505b50905060005b828110156112b1576113158582610d0e565b82828151811061132757611327613b55565b60209081029190910101528061133c81613bb3565b915050611303565b50919050565b600a5473ffffffffffffffffffffffffffffffffffffffff1633146113cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f3565b600b55565b6060600180546108c390613b07565b60006113ea60085490565b600e5490915062010000900460ff1661145f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53616c65206973206e6f7420616374697665000000000000000000000000000060448201526064016109f3565b600c5461146c9083613bec565b3410156114d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f72726563740060448201526064016109f3565b6014821115611566576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f45786365656473206d6178696d756d20626561727320796f752063616e20707560448201527f72636861736520696e20612073696e676c65207472616e73616374696f6e000060648201526084016109f3565b6127106115738383613c29565b1115611601576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f45786365656473206d6178696d756d20626561727320617661696c61626c652060448201527f666f72207075726368617365000000000000000000000000000000000000000060648201526084016109f3565b60005b82811015610bad5761161f3361161a8385613c29565b612ad5565b8061162981613bb3565b915050611604565b600a5473ffffffffffffffffffffffffffffffffffffffff1633146116b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f3565b8051610e8d90600d90602084019061351f565b610e8d338383612aef565b600a5473ffffffffffffffffffffffffffffffffffffffff163314611751576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f3565b600e80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b600a5473ffffffffffffffffffffffffffffffffffffffff163314611804576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f3565b600c55565b600a5473ffffffffffffffffffffffffffffffffffffffff16331461188a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f3565b60005b8151811015610e8d576000601060008484815181106118ae576118ae613b55565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790558061191581613bb3565b91505061188d565b611927338361267c565b6119b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016109f3565b6119bf84848484612c1d565b50505050565b60008181526002602052604090205460609073ffffffffffffffffffffffffffffffffffffffff16611a79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e000000000000000000000000000000000060648201526084016109f3565b6000611a83612cc0565b90506000815111611aa35760405180602001604052806000815250611ace565b80611aad84612ccf565b604051602001611abe929190613c41565b6040516020818303038152906040525b9392505050565b6000611ae060085490565b600e54909150610100900460ff16611b54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5072652073616c65206973206e6f74206163746976650000000000000000000060448201526064016109f3565b600c54611b619083613bec565b341015611bca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f72726563740060448201526064016109f3565b6014821115611c5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f45786365656473206d6178696d756d20626561727320796f752063616e20707560448201527f72636861736520696e20612073696e676c65207472616e73616374696f6e000060648201526084016109f3565b612710611c688383613c29565b1115611cf6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f45786365656473206d6178696d756d20626561727320617661696c61626c652060448201527f666f72207075726368617365000000000000000000000000000000000000000060648201526084016109f3565b3360009081526010602052604090205460ff16611d95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f41646472657373206e6f742077686974656c697374656420666f72207072657360448201527f616c65000000000000000000000000000000000000000000000000000000000060648201526084016109f3565b60005b82811015610bad57611dae3361161a8385613c29565b80611db881613bb3565b915050611d98565b600a5473ffffffffffffffffffffffffffffffffffffffff163314611e41576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f3565b600e80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff8116620100009182900460ff1615909102179055565b6000611e8760085490565b600e5490915060ff16611ef6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f446973636f756e742073616c65206973206e6f7420616374697665000000000060448201526064016109f3565b600b548251611f059190613bec565b341015611f6e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f72726563740060448201526064016109f3565b601482511115612000576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f45786365656473206d6178696d756d20626561727320796f752063616e20707560448201527f72636861736520696e20612073696e676c65207472616e73616374696f6e000060648201526084016109f3565b6127108251826120109190613c29565b111561209e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f45786365656473206d6178696d756d20626561727320617661696c61626c652060448201527f666f72207075726368617365000000000000000000000000000000000000000060648201526084016109f3565b60005b8251811015610bad57600f60008483815181106120c0576120c0613b55565b60209081029190910181015182528101919091526040016000205460ff16156120e857600080fd5b3373ffffffffffffffffffffffffffffffffffffffff1673c8bcbe0e8ae36d8f9238cd320ef6de88784b173473ffffffffffffffffffffffffffffffffffffffff16636352211e85848151811061214157612141613b55565b60200260200101516040518263ffffffff1660e01b815260040161216791815260200190565b602060405180830381865afa158015612184573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a89190613c70565b73ffffffffffffffffffffffffffffffffffffffff1614612225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4e6f74206f776e6572206f662057696e7465722042656172000000000000000060448201526064016109f3565b3373ffffffffffffffffffffffffffffffffffffffff1673e5ba25f22a20a22fb47dadf137f33fe2e9ab22ac73ffffffffffffffffffffffffffffffffffffffff16636352211e85848151811061227e5761227e613b55565b60200260200101516040518263ffffffff1660e01b81526004016122a491815260200190565b602060405180830381865afa1580156122c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e59190613c70565b73ffffffffffffffffffffffffffffffffffffffff1614612362576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4e6f74206f776e6572206f662053756d6d65722042656172000000000000000060448201526064016109f3565b6001600f600085848151811061237a5761237a613b55565b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055506123b733828461161a9190613c29565b806123c181613bb3565b9150506120a1565b600a5473ffffffffffffffffffffffffffffffffffffffff16331461244a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f3565b73ffffffffffffffffffffffffffffffffffffffff81166124ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109f3565b6124f681612a5e565b50565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061258c57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806108ae57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146108ae565b600081815260046020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8416908117909155819061263682610f6a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff1661272d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016109f3565b600061273883610f6a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806127a757508373ffffffffffffffffffffffffffffffffffffffff1661278f84610946565b73ffffffffffffffffffffffffffffffffffffffff16145b806127e4575073ffffffffffffffffffffffffffffffffffffffff80821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff1661280c82610f6a565b73ffffffffffffffffffffffffffffffffffffffff16146128af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e000000000000000000000000000000000000000000000060648201526084016109f3565b73ffffffffffffffffffffffffffffffffffffffff8216612951576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016109f3565b61295c838383612e01565b6129676000826125dc565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080546001929061299d908490613c8d565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604081208054600192906129d8908490613c29565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610e8d828260405180602001604052806000815250612f07565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109f3565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612c288484846127ec565b612c3484848484612faa565b6119bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016109f3565b6060600d80546108c390613b07565b606081612d0f57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612d395780612d2381613bb3565b9150612d329050600a83613cd3565b9150612d13565b60008167ffffffffffffffff811115612d5457612d54613751565b6040519080825280601f01601f191660200182016040528015612d7e576020820181803683370190505b5090505b84156127e457612d93600183613c8d565b9150612da0600a86613ce7565b612dab906030613c29565b60f81b818381518110612dc057612dc0613b55565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612dfa600a86613cd3565b9450612d82565b73ffffffffffffffffffffffffffffffffffffffff8316612e6957612e6481600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612ea6565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612ea657612ea6838261319a565b73ffffffffffffffffffffffffffffffffffffffff8216612eca57610bad81613251565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610bad57610bad8282613300565b612f118383613351565b612f1e6000848484612faa565b610bad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016109f3565b600073ffffffffffffffffffffffffffffffffffffffff84163b1561318f576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290613021903390899088908890600401613cfb565b6020604051808303816000875af192505050801561307a575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261307791810190613d44565b60015b613144573d8080156130a8576040519150601f19603f3d011682016040523d82523d6000602084013e6130ad565b606091505b50805161313c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016109f3565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001490506127e4565b506001949350505050565b600060016131a78461101c565b6131b19190613c8d565b6000838152600760205260409020549091508082146132115773ffffffffffffffffffffffffffffffffffffffff841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b50600091825260076020908152604080842084905573ffffffffffffffffffffffffffffffffffffffff9094168352600681528383209183525290812055565b60085460009061326390600190613c8d565b6000838152600960205260408120546008805493945090928490811061328b5761328b613b55565b9060005260206000200154905080600883815481106132ac576132ac613b55565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806132e4576132e4613d61565b6001900381819060005260206000200160009055905550505050565b600061330b8361101c565b73ffffffffffffffffffffffffffffffffffffffff9093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b73ffffffffffffffffffffffffffffffffffffffff82166133ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109f3565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff161561345a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109f3565b61346660008383612e01565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260036020526040812080546001929061349c908490613c29565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461352b90613b07565b90600052602060002090601f01602090048101928261354d5760008555613593565b82601f1061356657805160ff1916838001178555613593565b82800160010185558215613593579182015b82811115613593578251825591602001919060010190613578565b5061359f9291506135a3565b5090565b5b8082111561359f57600081556001016135a4565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146124f657600080fd5b6000602082840312156135f857600080fd5b8135611ace816135b8565b60005b8381101561361e578181015183820152602001613606565b838111156119bf5750506000910152565b60008151808452613647816020860160208601613603565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611ace602083018461362f565b60006020828403121561369e57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146124f657600080fd5b600080604083850312156136da57600080fd5b82356136e5816136a5565b946020939093013593505050565b60008060006060848603121561370857600080fd5b8335613713816136a5565b92506020840135613723816136a5565b929592945050506040919091013590565b60006020828403121561374657600080fd5b8135611ace816136a5565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156137c7576137c7613751565b604052919050565b600067ffffffffffffffff8211156137e9576137e9613751565b5060051b60200190565b6000602080838503121561380657600080fd5b823567ffffffffffffffff81111561381d57600080fd5b8301601f8101851361382e57600080fd5b803561384161383c826137cf565b613780565b81815260059190911b8201830190838101908783111561386057600080fd5b928401925b82841015613887578335613878816136a5565b82529284019290840190613865565b979650505050505050565b6020808252825182820181905260009190848201906040850190845b818110156138ca578351835292840192918401916001016138ae565b50909695505050505050565b600067ffffffffffffffff8311156138f0576138f0613751565b61392160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601613780565b905082815283838301111561393557600080fd5b828260208301376000602084830101529392505050565b60006020828403121561395e57600080fd5b813567ffffffffffffffff81111561397557600080fd5b8201601f8101841361398657600080fd5b6127e4848235602084016138d6565b600080604083850312156139a857600080fd5b82356139b3816136a5565b9150602083013580151581146139c857600080fd5b809150509250929050565b600080600080608085870312156139e957600080fd5b84356139f4816136a5565b93506020850135613a04816136a5565b925060408501359150606085013567ffffffffffffffff811115613a2757600080fd5b8501601f81018713613a3857600080fd5b613a47878235602084016138d6565b91505092959194509250565b60006020808385031215613a6657600080fd5b823567ffffffffffffffff811115613a7d57600080fd5b8301601f81018513613a8e57600080fd5b8035613a9c61383c826137cf565b81815260059190911b82018301908381019087831115613abb57600080fd5b928401925b8284101561388757833582529284019290840190613ac0565b60008060408385031215613aec57600080fd5b8235613af7816136a5565b915060208301356139c8816136a5565b600181811c90821680613b1b57607f821691505b60208210811415611344577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613be557613be5613b84565b5060010190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c2457613c24613b84565b500290565b60008219821115613c3c57613c3c613b84565b500190565b60008351613c53818460208801613603565b835190830190613c67818360208801613603565b01949350505050565b600060208284031215613c8257600080fd5b8151611ace816136a5565b600082821015613c9f57613c9f613b84565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613ce257613ce2613ca4565b500490565b600082613cf657613cf6613ca4565b500690565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152613d3a608083018461362f565b9695505050505050565b600060208284031215613d5657600080fd5b8151611ace816135b8565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220a00199d10fffe4fd1f7c5bb2861fcd96c673c242de218f9950fbbbad02532f3064736f6c634300080a0033

Deployed Bytecode

0x6080604052600436106102dc5760003560e01c80638462151c11610184578063b88d4fde116100d6578063dbe7e3bd1161008a578063e985e9c511610064578063e985e9c5146107cc578063edd634b814610822578063f2fde38b1461083857600080fd5b8063dbe7e3bd14610761578063df2d6e7714610791578063e03b842e146107a457600080fd5b8063c9b298f1116100bb578063c9b298f114610723578063ce03ec9314610736578063da649ed71461074b57600080fd5b8063b88d4fde146106e3578063c87b56dd1461070357600080fd5b8063a0712d6811610138578063a2e4f14011610112578063a2e4f1401461068e578063adcb1e66146106a3578063b179e060146106c357600080fd5b8063a0712d681461063b578063a0bcfc7f1461064e578063a22cb4651461066e57600080fd5b80638b78c116116101695780638b78c116146105db5780638da5cb5b146105fb57806395d89b411461062657600080fd5b80638462151c1461059857806384ad8e8f146105c557600080fd5b806342842e0e1161023d5780636352211e116101f1578063715018a6116101cb578063715018a61461053b5780637204a3c91461055057806379f842161461057057600080fd5b80636352211e146104d657806370a08231146104f657806370c18f1f1461051657600080fd5b8063564566a811610222578063564566a8146104825780635d9f5a63146104a257806360d938dc146104b757600080fd5b806342842e0e146104425780634f6ccce71461046257600080fd5b806318160ddd116102945780632f745c59116102795780632f745c59146103f35780633ccfd60b1461041357806340c45b411461042857600080fd5b806318160ddd146103b457806323b872dd146103d357600080fd5b8063081812fc116102c5578063081812fc14610338578063095ea7b31461037d5780631725051f1461039f57600080fd5b806301ffc9a7146102e157806306fdde0314610316575b600080fd5b3480156102ed57600080fd5b506103016102fc3660046135e6565b610858565b60405190151581526020015b60405180910390f35b34801561032257600080fd5b5061032b6108b4565b60405161030d9190613679565b34801561034457600080fd5b5061035861035336600461368c565b610946565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161030d565b34801561038957600080fd5b5061039d6103983660046136c7565b610a25565b005b3480156103ab57600080fd5b5061039d610bb2565b3480156103c057600080fd5b506008545b60405190815260200161030d565b3480156103df57600080fd5b5061039d6103ee3660046136f3565b610c6d565b3480156103ff57600080fd5b506103c561040e3660046136c7565b610d0e565b34801561041f57600080fd5b5061039d610ddd565b34801561043457600080fd5b50600e546103019060ff1681565b34801561044e57600080fd5b5061039d61045d3660046136f3565b610e91565b34801561046e57600080fd5b506103c561047d36600461368c565b610eac565b34801561048e57600080fd5b50600e546103019062010000900460ff1681565b3480156104ae57600080fd5b506103c5601481565b3480156104c357600080fd5b50600e5461030190610100900460ff1681565b3480156104e257600080fd5b506103586104f136600461368c565b610f6a565b34801561050257600080fd5b506103c5610511366004613734565b61101c565b34801561052257600080fd5b503360009081526010602052604090205460ff16610301565b34801561054757600080fd5b5061039d6110ea565b34801561055c57600080fd5b5061039d61056b3660046137f3565b611177565b34801561057c57600080fd5b5061035873c8bcbe0e8ae36d8f9238cd320ef6de88784b173481565b3480156105a457600080fd5b506105b86105b3366004613734565b61128b565b60405161030d9190613892565b3480156105d157600080fd5b506103c5600b5481565b3480156105e757600080fd5b5061039d6105f636600461368c565b61134a565b34801561060757600080fd5b50600a5473ffffffffffffffffffffffffffffffffffffffff16610358565b34801561063257600080fd5b5061032b6113d0565b61039d61064936600461368c565b6113df565b34801561065a57600080fd5b5061039d61066936600461394c565b611631565b34801561067a57600080fd5b5061039d610689366004613995565b6116c5565b34801561069a57600080fd5b5061039d6116d0565b3480156106af57600080fd5b5061039d6106be36600461368c565b611783565b3480156106cf57600080fd5b5061039d6106de3660046137f3565b611809565b3480156106ef57600080fd5b5061039d6106fe3660046139d3565b61191d565b34801561070f57600080fd5b5061032b61071e36600461368c565b6119c5565b61039d61073136600461368c565b611ad5565b34801561074257600080fd5b5061039d611dc0565b34801561075757600080fd5b506103c561271081565b34801561076d57600080fd5b5061030161077c36600461368c565b600f6020526000908152604090205460ff1681565b61039d61079f366004613a53565b611e7c565b3480156107b057600080fd5b5061035873e5ba25f22a20a22fb47dadf137f33fe2e9ab22ac81565b3480156107d857600080fd5b506103016107e7366004613ad9565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561082e57600080fd5b506103c5600c5481565b34801561084457600080fd5b5061039d610853366004613734565b6123c9565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d630000000000000000000000000000000000000000000000000000000014806108ae57506108ae826124f9565b92915050565b6060600080546108c390613b07565b80601f01602080910402602001604051908101604052809291908181526020018280546108ef90613b07565b801561093c5780601f106109115761010080835404028352916020019161093c565b820191906000526020600020905b81548152906001019060200180831161091f57829003601f168201915b5050505050905090565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff166109fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6000610a3082610f6a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610aee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016109f3565b3373ffffffffffffffffffffffffffffffffffffffff82161480610b175750610b1781336107e7565b610ba3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109f3565b610bad83836125dc565b505050565b600a5473ffffffffffffffffffffffffffffffffffffffff163314610c33576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f3565b600e80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff81166101009182900460ff1615909102179055565b610c77338261267c565b610d03576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016109f3565b610bad8383836127ec565b6000610d198361101c565b8210610da7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e647300000000000000000000000000000000000000000060648201526084016109f3565b5073ffffffffffffffffffffffffffffffffffffffff919091166000908152600660209081526040808320938352929052205490565b600a5473ffffffffffffffffffffffffffffffffffffffff163314610e5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f3565b6040514790339082156108fc029083906000818181858888f19350505050158015610e8d573d6000803e3d6000fd5b5050565b610bad8383836040518060200160405280600081525061191d565b6000610eb760085490565b8210610f45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e6473000000000000000000000000000000000000000060648201526084016109f3565b60088281548110610f5857610f58613b55565b90600052602060002001549050919050565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff16806108ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016109f3565b600073ffffffffffffffffffffffffffffffffffffffff82166110c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016109f3565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b600a5473ffffffffffffffffffffffffffffffffffffffff16331461116b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f3565b6111756000612a5e565b565b600a5473ffffffffffffffffffffffffffffffffffffffff1633146111f8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f3565b60005b8151811015610e8d5760016010600084848151811061121c5761121c613b55565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790558061128381613bb3565b9150506111fb565b606060006112988361101c565b9050806112b95760408051600080825260208201909252905b509392505050565b60008167ffffffffffffffff8111156112d4576112d4613751565b6040519080825280602002602001820160405280156112fd578160200160208202803683370190505b50905060005b828110156112b1576113158582610d0e565b82828151811061132757611327613b55565b60209081029190910101528061133c81613bb3565b915050611303565b50919050565b600a5473ffffffffffffffffffffffffffffffffffffffff1633146113cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f3565b600b55565b6060600180546108c390613b07565b60006113ea60085490565b600e5490915062010000900460ff1661145f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53616c65206973206e6f7420616374697665000000000000000000000000000060448201526064016109f3565b600c5461146c9083613bec565b3410156114d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f72726563740060448201526064016109f3565b6014821115611566576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f45786365656473206d6178696d756d20626561727320796f752063616e20707560448201527f72636861736520696e20612073696e676c65207472616e73616374696f6e000060648201526084016109f3565b6127106115738383613c29565b1115611601576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f45786365656473206d6178696d756d20626561727320617661696c61626c652060448201527f666f72207075726368617365000000000000000000000000000000000000000060648201526084016109f3565b60005b82811015610bad5761161f3361161a8385613c29565b612ad5565b8061162981613bb3565b915050611604565b600a5473ffffffffffffffffffffffffffffffffffffffff1633146116b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f3565b8051610e8d90600d90602084019061351f565b610e8d338383612aef565b600a5473ffffffffffffffffffffffffffffffffffffffff163314611751576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f3565b600e80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b600a5473ffffffffffffffffffffffffffffffffffffffff163314611804576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f3565b600c55565b600a5473ffffffffffffffffffffffffffffffffffffffff16331461188a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f3565b60005b8151811015610e8d576000601060008484815181106118ae576118ae613b55565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790558061191581613bb3565b91505061188d565b611927338361267c565b6119b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016109f3565b6119bf84848484612c1d565b50505050565b60008181526002602052604090205460609073ffffffffffffffffffffffffffffffffffffffff16611a79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e000000000000000000000000000000000060648201526084016109f3565b6000611a83612cc0565b90506000815111611aa35760405180602001604052806000815250611ace565b80611aad84612ccf565b604051602001611abe929190613c41565b6040516020818303038152906040525b9392505050565b6000611ae060085490565b600e54909150610100900460ff16611b54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5072652073616c65206973206e6f74206163746976650000000000000000000060448201526064016109f3565b600c54611b619083613bec565b341015611bca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f72726563740060448201526064016109f3565b6014821115611c5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f45786365656473206d6178696d756d20626561727320796f752063616e20707560448201527f72636861736520696e20612073696e676c65207472616e73616374696f6e000060648201526084016109f3565b612710611c688383613c29565b1115611cf6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f45786365656473206d6178696d756d20626561727320617661696c61626c652060448201527f666f72207075726368617365000000000000000000000000000000000000000060648201526084016109f3565b3360009081526010602052604090205460ff16611d95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f41646472657373206e6f742077686974656c697374656420666f72207072657360448201527f616c65000000000000000000000000000000000000000000000000000000000060648201526084016109f3565b60005b82811015610bad57611dae3361161a8385613c29565b80611db881613bb3565b915050611d98565b600a5473ffffffffffffffffffffffffffffffffffffffff163314611e41576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f3565b600e80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff8116620100009182900460ff1615909102179055565b6000611e8760085490565b600e5490915060ff16611ef6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f446973636f756e742073616c65206973206e6f7420616374697665000000000060448201526064016109f3565b600b548251611f059190613bec565b341015611f6e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f72726563740060448201526064016109f3565b601482511115612000576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f45786365656473206d6178696d756d20626561727320796f752063616e20707560448201527f72636861736520696e20612073696e676c65207472616e73616374696f6e000060648201526084016109f3565b6127108251826120109190613c29565b111561209e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f45786365656473206d6178696d756d20626561727320617661696c61626c652060448201527f666f72207075726368617365000000000000000000000000000000000000000060648201526084016109f3565b60005b8251811015610bad57600f60008483815181106120c0576120c0613b55565b60209081029190910181015182528101919091526040016000205460ff16156120e857600080fd5b3373ffffffffffffffffffffffffffffffffffffffff1673c8bcbe0e8ae36d8f9238cd320ef6de88784b173473ffffffffffffffffffffffffffffffffffffffff16636352211e85848151811061214157612141613b55565b60200260200101516040518263ffffffff1660e01b815260040161216791815260200190565b602060405180830381865afa158015612184573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a89190613c70565b73ffffffffffffffffffffffffffffffffffffffff1614612225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4e6f74206f776e6572206f662057696e7465722042656172000000000000000060448201526064016109f3565b3373ffffffffffffffffffffffffffffffffffffffff1673e5ba25f22a20a22fb47dadf137f33fe2e9ab22ac73ffffffffffffffffffffffffffffffffffffffff16636352211e85848151811061227e5761227e613b55565b60200260200101516040518263ffffffff1660e01b81526004016122a491815260200190565b602060405180830381865afa1580156122c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e59190613c70565b73ffffffffffffffffffffffffffffffffffffffff1614612362576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4e6f74206f776e6572206f662053756d6d65722042656172000000000000000060448201526064016109f3565b6001600f600085848151811061237a5761237a613b55565b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055506123b733828461161a9190613c29565b806123c181613bb3565b9150506120a1565b600a5473ffffffffffffffffffffffffffffffffffffffff16331461244a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109f3565b73ffffffffffffffffffffffffffffffffffffffff81166124ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109f3565b6124f681612a5e565b50565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061258c57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806108ae57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146108ae565b600081815260046020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8416908117909155819061263682610f6a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff1661272d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016109f3565b600061273883610f6a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806127a757508373ffffffffffffffffffffffffffffffffffffffff1661278f84610946565b73ffffffffffffffffffffffffffffffffffffffff16145b806127e4575073ffffffffffffffffffffffffffffffffffffffff80821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff1661280c82610f6a565b73ffffffffffffffffffffffffffffffffffffffff16146128af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e000000000000000000000000000000000000000000000060648201526084016109f3565b73ffffffffffffffffffffffffffffffffffffffff8216612951576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016109f3565b61295c838383612e01565b6129676000826125dc565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080546001929061299d908490613c8d565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604081208054600192906129d8908490613c29565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610e8d828260405180602001604052806000815250612f07565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109f3565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612c288484846127ec565b612c3484848484612faa565b6119bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016109f3565b6060600d80546108c390613b07565b606081612d0f57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612d395780612d2381613bb3565b9150612d329050600a83613cd3565b9150612d13565b60008167ffffffffffffffff811115612d5457612d54613751565b6040519080825280601f01601f191660200182016040528015612d7e576020820181803683370190505b5090505b84156127e457612d93600183613c8d565b9150612da0600a86613ce7565b612dab906030613c29565b60f81b818381518110612dc057612dc0613b55565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612dfa600a86613cd3565b9450612d82565b73ffffffffffffffffffffffffffffffffffffffff8316612e6957612e6481600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612ea6565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612ea657612ea6838261319a565b73ffffffffffffffffffffffffffffffffffffffff8216612eca57610bad81613251565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610bad57610bad8282613300565b612f118383613351565b612f1e6000848484612faa565b610bad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016109f3565b600073ffffffffffffffffffffffffffffffffffffffff84163b1561318f576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290613021903390899088908890600401613cfb565b6020604051808303816000875af192505050801561307a575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261307791810190613d44565b60015b613144573d8080156130a8576040519150601f19603f3d011682016040523d82523d6000602084013e6130ad565b606091505b50805161313c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016109f3565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001490506127e4565b506001949350505050565b600060016131a78461101c565b6131b19190613c8d565b6000838152600760205260409020549091508082146132115773ffffffffffffffffffffffffffffffffffffffff841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b50600091825260076020908152604080842084905573ffffffffffffffffffffffffffffffffffffffff9094168352600681528383209183525290812055565b60085460009061326390600190613c8d565b6000838152600960205260408120546008805493945090928490811061328b5761328b613b55565b9060005260206000200154905080600883815481106132ac576132ac613b55565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806132e4576132e4613d61565b6001900381819060005260206000200160009055905550505050565b600061330b8361101c565b73ffffffffffffffffffffffffffffffffffffffff9093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b73ffffffffffffffffffffffffffffffffffffffff82166133ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109f3565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff161561345a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109f3565b61346660008383612e01565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260036020526040812080546001929061349c908490613c29565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461352b90613b07565b90600052602060002090601f01602090048101928261354d5760008555613593565b82601f1061356657805160ff1916838001178555613593565b82800160010185558215613593579182015b82811115613593578251825591602001919060010190613578565b5061359f9291506135a3565b5090565b5b8082111561359f57600081556001016135a4565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146124f657600080fd5b6000602082840312156135f857600080fd5b8135611ace816135b8565b60005b8381101561361e578181015183820152602001613606565b838111156119bf5750506000910152565b60008151808452613647816020860160208601613603565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611ace602083018461362f565b60006020828403121561369e57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146124f657600080fd5b600080604083850312156136da57600080fd5b82356136e5816136a5565b946020939093013593505050565b60008060006060848603121561370857600080fd5b8335613713816136a5565b92506020840135613723816136a5565b929592945050506040919091013590565b60006020828403121561374657600080fd5b8135611ace816136a5565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156137c7576137c7613751565b604052919050565b600067ffffffffffffffff8211156137e9576137e9613751565b5060051b60200190565b6000602080838503121561380657600080fd5b823567ffffffffffffffff81111561381d57600080fd5b8301601f8101851361382e57600080fd5b803561384161383c826137cf565b613780565b81815260059190911b8201830190838101908783111561386057600080fd5b928401925b82841015613887578335613878816136a5565b82529284019290840190613865565b979650505050505050565b6020808252825182820181905260009190848201906040850190845b818110156138ca578351835292840192918401916001016138ae565b50909695505050505050565b600067ffffffffffffffff8311156138f0576138f0613751565b61392160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601613780565b905082815283838301111561393557600080fd5b828260208301376000602084830101529392505050565b60006020828403121561395e57600080fd5b813567ffffffffffffffff81111561397557600080fd5b8201601f8101841361398657600080fd5b6127e4848235602084016138d6565b600080604083850312156139a857600080fd5b82356139b3816136a5565b9150602083013580151581146139c857600080fd5b809150509250929050565b600080600080608085870312156139e957600080fd5b84356139f4816136a5565b93506020850135613a04816136a5565b925060408501359150606085013567ffffffffffffffff811115613a2757600080fd5b8501601f81018713613a3857600080fd5b613a47878235602084016138d6565b91505092959194509250565b60006020808385031215613a6657600080fd5b823567ffffffffffffffff811115613a7d57600080fd5b8301601f81018513613a8e57600080fd5b8035613a9c61383c826137cf565b81815260059190911b82018301908381019087831115613abb57600080fd5b928401925b8284101561388757833582529284019290840190613ac0565b60008060408385031215613aec57600080fd5b8235613af7816136a5565b915060208301356139c8816136a5565b600181811c90821680613b1b57607f821691505b60208210811415611344577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613be557613be5613b84565b5060010190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c2457613c24613b84565b500290565b60008219821115613c3c57613c3c613b84565b500190565b60008351613c53818460208801613603565b835190830190613c67818360208801613603565b01949350505050565b600060208284031215613c8257600080fd5b8151611ace816136a5565b600082821015613c9f57613c9f613b84565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613ce257613ce2613ca4565b500490565b600082613cf657613cf6613ca4565b500690565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152613d3a608083018461362f565b9695505050505050565b600060208284031215613d5657600080fd5b8151611ace816135b8565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220a00199d10fffe4fd1f7c5bb2861fcd96c673c242de218f9950fbbbad02532f3064736f6c634300080a0033

Deployed Bytecode Sourcemap

46667:4988:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35011:224;;;;;;;;;;-1:-1:-1;35011:224:0;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;35011:224:0;;;;;;;;22590:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24149:221::-;;;;;;;;;;-1:-1:-1;24149:221:0;;;;;:::i;:::-;;:::i;:::-;;;1809:42:1;1797:55;;;1779:74;;1767:2;1752:18;24149:221:0;1633:226:1;23672:411:0;;;;;;;;;;-1:-1:-1;23672:411:0;;;;;:::i;:::-;;:::i;:::-;;50184:99;;;;;;;;;;;;;:::i;35651:113::-;;;;;;;;;;-1:-1:-1;35739:10:0;:17;35651:113;;;2489:25:1;;;2477:2;2462:18;35651:113:0;2343:177:1;24899:339:0;;;;;;;;;;-1:-1:-1;24899:339:0;;;;;:::i;:::-;;:::i;35319:256::-;;;;;;;;;;-1:-1:-1;35319:256:0;;;;;:::i;:::-;;:::i;47399:140::-;;;;;;;;;;;;;:::i;47121:40::-;;;;;;;;;;-1:-1:-1;47121:40:0;;;;;;;;25309:185;;;;;;;;;;-1:-1:-1;25309:185:0;;;;;:::i;:::-;;:::i;35841:233::-;;;;;;;;;;-1:-1:-1;35841:233:0;;;;;:::i;:::-;;:::i;47210:32::-;;;;;;;;;;-1:-1:-1;47210:32:0;;;;;;;;;;;47038:47;;;;;;;;;;;;47083:2;47038:47;;47168:35;;;;;;;;;;-1:-1:-1;47168:35:0;;;;;;;;;;;22284:239;;;;;;;;;;-1:-1:-1;22284:239:0;;;;;:::i;:::-;;:::i;22014:208::-;;;;;;;;;;-1:-1:-1;22014:208:0;;;;;:::i;:::-;;:::i;51549:103::-;;;;;;;;;;-1:-1:-1;51633:10:0;51597:4;51621:23;;;:11;:23;;;;;;;;51549:103;;42815;;;;;;;;;;;;;:::i;51185:171::-;;;;;;;;;;-1:-1:-1;51185:171:0;;;;;:::i;:::-;;:::i;46720:82::-;;;;;;;;;;;;46760:42;46720:82;;50637:540;;;;;;;;;;-1:-1:-1;50637:540:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;46898:41::-;;;;;;;;;;;;;;;;50521:108;;;;;;;;;;-1:-1:-1;50521:108:0;;;;;:::i;:::-;;:::i;42164:87::-;;;;;;;;;;-1:-1:-1;42237:6:0;;;;42164:87;;22759:104;;;;;;;;;;;;;:::i;49291:571::-;;;;;;:::i;:::-;;:::i;49870:92::-;;;;;;;;;;-1:-1:-1;49870:92:0;;;;;:::i;:::-;;:::i;24442:155::-;;;;;;;;;;-1:-1:-1;24442:155:0;;;;;:::i;:::-;;:::i;50291:114::-;;;;;;;;;;;;;:::i;50413:100::-;;;;;;;;;;-1:-1:-1;50413:100:0;;;;;:::i;:::-;;:::i;51364:177::-;;;;;;;;;;-1:-1:-1;51364:177:0;;;;;:::i;:::-;;:::i;25565:328::-;;;;;;;;;;-1:-1:-1;25565:328:0;;;;;:::i;:::-;;:::i;22934:334::-;;;;;;;;;;-1:-1:-1;22934:334:0;;;;;:::i;:::-;;:::i;48616:667::-;;;;;;:::i;:::-;;:::i;50086:90::-;;;;;;;;;;;;;:::i;46990:41::-;;;;;;;;;;;;47026:5;46990:41;;47251:39;;;;;;;;;;-1:-1:-1;47251:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;47547:1061;;;;;;:::i;:::-;;:::i;46809:82::-;;;;;;;;;;;;46849:42;46809:82;;24668:164;;;;;;;;;;-1:-1:-1;24668:164:0;;;;;:::i;:::-;24789:25;;;;24765:4;24789:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24668:164;46946:37;;;;;;;;;;;;;;;;43073:201;;;;;;;;;;-1:-1:-1;43073:201:0;;;;;:::i;:::-;;:::i;35011:224::-;35113:4;35137:50;;;35152:35;35137:50;;:90;;;35191:36;35215:11;35191:23;:36::i;:::-;35130:97;35011:224;-1:-1:-1;;35011:224:0:o;22590:100::-;22644:13;22677:5;22670:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22590:100;:::o;24149:221::-;24225:7;27492:16;;;:7;:16;;;;;;:30;:16;24245:73;;;;;;;9643:2:1;24245:73:0;;;9625:21:1;9682:2;9662:18;;;9655:30;9721:34;9701:18;;;9694:62;9792:14;9772:18;;;9765:42;9824:19;;24245:73:0;;;;;;;;;-1:-1:-1;24338:24:0;;;;:15;:24;;;;;;;;;24149:221::o;23672:411::-;23753:13;23769:23;23784:7;23769:14;:23::i;:::-;23753:39;;23817:5;23811:11;;:2;:11;;;;23803:57;;;;;;;10056:2:1;23803:57:0;;;10038:21:1;10095:2;10075:18;;;10068:30;10134:34;10114:18;;;10107:62;10205:3;10185:18;;;10178:31;10226:19;;23803:57:0;9854:397:1;23803:57:0;736:10;23895:21;;;;;:62;;-1:-1:-1;23920:37:0;23937:5;736:10;24668:164;:::i;23920:37::-;23873:168;;;;;;;10458:2:1;23873:168:0;;;10440:21:1;10497:2;10477:18;;;10470:30;10536:34;10516:18;;;10509:62;10607:26;10587:18;;;10580:54;10651:19;;23873:168:0;10256:420:1;23873:168:0;24054:21;24063:2;24067:7;24054:8;:21::i;:::-;23742:341;23672:411;;:::o;50184:99::-;42237:6;;42384:23;42237:6;736:10;42384:23;42376:68;;;;;;;10883:2:1;42376:68:0;;;10865:21:1;;;10902:18;;;10895:30;10961:34;10941:18;;;10934:62;11013:18;;42376:68:0;10681:356:1;42376:68:0;50260:15:::1;::::0;;50241:34;;::::1;50260:15;::::0;;;::::1;;;50259:16;50241:34:::0;;::::1;;::::0;;50184:99::o;24899:339::-;25094:41;736:10;25127:7;25094:18;:41::i;:::-;25086:103;;;;;;;11244:2:1;25086:103:0;;;11226:21:1;11283:2;11263:18;;;11256:30;11322:34;11302:18;;;11295:62;11393:19;11373:18;;;11366:47;11430:19;;25086:103:0;11042:413:1;25086:103:0;25202:28;25212:4;25218:2;25222:7;25202:9;:28::i;35319:256::-;35416:7;35452:23;35469:5;35452:16;:23::i;:::-;35444:5;:31;35436:87;;;;;;;11662:2:1;35436:87:0;;;11644:21:1;11701:2;11681:18;;;11674:30;11740:34;11720:18;;;11713:62;11811:13;11791:18;;;11784:41;11842:19;;35436:87:0;11460:407:1;35436:87:0;-1:-1:-1;35541:19:0;;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;35319:256::o;47399:140::-;42237:6;;42384:23;42237:6;736:10;42384:23;42376:68;;;;;;;10883:2:1;42376:68:0;;;10865:21:1;;;10902:18;;;10895:30;10961:34;10941:18;;;10934:62;11013:18;;42376:68:0;10681:356:1;42376:68:0;47494:37:::1;::::0;47462:21:::1;::::0;47502:10:::1;::::0;47494:37;::::1;;;::::0;47462:21;;47447:12:::1;47494:37:::0;47447:12;47494:37;47462:21;47502:10;47494:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;47436:103;47399:140::o:0;25309:185::-;25447:39;25464:4;25470:2;25474:7;25447:39;;;;;;;;;;;;:16;:39::i;35841:233::-;35916:7;35952:30;35739:10;:17;;35651:113;35952:30;35944:5;:38;35936:95;;;;;;;12074:2:1;35936:95:0;;;12056:21:1;12113:2;12093:18;;;12086:30;12152:34;12132:18;;;12125:62;12223:14;12203:18;;;12196:42;12255:19;;35936:95:0;11872:408:1;35936:95:0;36049:10;36060:5;36049:17;;;;;;;;:::i;:::-;;;;;;;;;36042:24;;35841:233;;;:::o;22284:239::-;22356:7;22392:16;;;:7;:16;;;;;;;;22427:19;22419:73;;;;;;;12676:2:1;22419:73:0;;;12658:21:1;12715:2;12695:18;;;12688:30;12754:34;12734:18;;;12727:62;12825:11;12805:18;;;12798:39;12854:19;;22419:73:0;12474:405:1;22014:208:0;22086:7;22114:19;;;22106:74;;;;;;;13086:2:1;22106:74:0;;;13068:21:1;13125:2;13105:18;;;13098:30;13164:34;13144:18;;;13137:62;13235:12;13215:18;;;13208:40;13265:19;;22106:74:0;12884:406:1;22106:74:0;-1:-1:-1;22198:16:0;;;;;;:9;:16;;;;;;;22014:208::o;42815:103::-;42237:6;;42384:23;42237:6;736:10;42384:23;42376:68;;;;;;;10883:2:1;42376:68:0;;;10865:21:1;;;10902:18;;;10895:30;10961:34;10941:18;;;10934:62;11013:18;;42376:68:0;10681:356:1;42376:68:0;42880:30:::1;42907:1;42880:18;:30::i;:::-;42815:103::o:0;51185:171::-;42237:6;;42384:23;42237:6;736:10;42384:23;42376:68;;;;;;;10883:2:1;42376:68:0;;;10865:21:1;;;10902:18;;;10895:30;10961:34;10941:18;;;10934:62;11013:18;;42376:68:0;10681:356:1;42376:68:0;51270:6:::1;51266:82;51282:8;:15;51278:1;:19;51266:82;;;51344:4;51317:11;:24;51329:8;51338:1;51329:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;51317:24:::1;;::::0;;;::::1;::::0;;;;;;-1:-1:-1;51317:24:0;:31;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;51299:3;::::1;::::0;::::1;:::i;:::-;;;;51266:82;;50637:540:::0;50698:16;50728:18;50749:17;50759:6;50749:9;:17::i;:::-;50728:38;-1:-1:-1;50781:15:0;50777:393;;50858:16;;;50872:1;50858:16;;;;;;;;;;;-1:-1:-1;50851:23:0;50637:540;-1:-1:-1;;;50637:540:0:o;50777:393::-;50907:23;50947:10;50933:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50933:25:0;;50907:51;;50973:13;51001:130;51025:10;51017:5;:18;51001:130;;;51081:34;51101:6;51109:5;51081:19;:34::i;:::-;51065:6;51072:5;51065:13;;;;;;;;:::i;:::-;;;;;;;;;;:50;51037:7;;;;:::i;:::-;;;;51001:130;;50777:393;50717:460;50637:540;;;:::o;50521:108::-;42237:6;;42384:23;42237:6;736:10;42384:23;42376:68;;;;;;;10883:2:1;42376:68:0;;;10865:21:1;;;10902:18;;;10895:30;10961:34;10941:18;;;10934:62;11013:18;;42376:68:0;10681:356:1;42376:68:0;50596:13:::1;:25:::0;50521:108::o;22759:104::-;22815:13;22848:7;22841:14;;;;;:::i;49291:571::-;49347:19;49369:13;35739:10;:17;;35651:113;49369:13;49403:12;;49347:35;;-1:-1:-1;49403:12:0;;;;;49395:44;;;;;;;13886:2:1;49395:44:0;;;13868:21:1;13925:2;13905:18;;;13898:30;13964:20;13944:18;;;13937:48;14002:18;;49395:44:0;13684:342:1;49395:44:0;49480:9;;49471:18;;:6;:18;:::i;:::-;49458:9;:31;;49450:75;;;;;;;14466:2:1;49450:75:0;;;14448:21:1;14505:2;14485:18;;;14478:30;14544:33;14524:18;;;14517:61;14595:18;;49450:75:0;14264:355:1;49450:75:0;47083:2;49544:6;:28;;49536:103;;;;;;;14826:2:1;49536:103:0;;;14808:21:1;14865:2;14845:18;;;14838:30;14904:34;14884:18;;;14877:62;14975:32;14955:18;;;14948:60;15025:19;;49536:103:0;14624:426:1;49536:103:0;47026:5;49658:20;49672:6;49658:11;:20;:::i;:::-;:33;;49650:90;;;;;;;15390:2:1;49650:90:0;;;15372:21:1;15429:2;15409:18;;;15402:30;15468:34;15448:18;;;15441:62;15539:14;15519:18;;;15512:42;15571:19;;49650:90:0;15188:408:1;49650:90:0;49758:9;49753:102;49777:6;49773:1;:10;49753:102;;;49805:38;49815:10;49827:15;49841:1;49827:11;:15;:::i;:::-;49805:9;:38::i;:::-;49785:3;;;;:::i;:::-;;;;49753:102;;49870:92;42237:6;;42384:23;42237:6;736:10;42384:23;42376:68;;;;;;;10883:2:1;42376:68:0;;;10865:21:1;;;10902:18;;;10895:30;10961:34;10941:18;;;10934:62;11013:18;;42376:68:0;10681:356:1;42376:68:0;49940:14;;::::1;::::0;:7:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;24442:155::-:0;24537:52;736:10;24570:8;24580;24537:18;:52::i;50291:114::-;42237:6;;42384:23;42237:6;736:10;42384:23;42376:68;;;;;;;10883:2:1;42376:68:0;;;10865:21:1;;;10902:18;;;10895:30;10961:34;10941:18;;;10934:62;11013:18;;42376:68:0;10681:356:1;42376:68:0;50377:20:::1;::::0;;50353:44;;::::1;50377:20;::::0;;::::1;50376:21;50353:44;::::0;;50291:114::o;50413:100::-;42237:6;;42384:23;42237:6;736:10;42384:23;42376:68;;;;;;;10883:2:1;42376:68:0;;;10865:21:1;;;10902:18;;;10895:30;10961:34;10941:18;;;10934:62;11013:18;;42376:68:0;10681:356:1;42376:68:0;50484:9:::1;:21:::0;50413:100::o;51364:177::-;42237:6;;42384:23;42237:6;736:10;42384:23;42376:68;;;;;;;10883:2:1;42376:68:0;;;10865:21:1;;;10902:18;;;10895:30;10961:34;10941:18;;;10934:62;11013:18;;42376:68:0;10681:356:1;42376:68:0;51454:6:::1;51450:83;51466:8;:15;51462:1;:19;51450:83;;;51528:5;51501:11;:24;51513:8;51522:1;51513:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;51501:24:::1;;::::0;;;::::1;::::0;;;;;;-1:-1:-1;51501:24:0;:32;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;51483:3;::::1;::::0;::::1;:::i;:::-;;;;51450:83;;25565:328:::0;25740:41;736:10;25773:7;25740:18;:41::i;:::-;25732:103;;;;;;;11244:2:1;25732:103:0;;;11226:21:1;11283:2;11263:18;;;11256:30;11322:34;11302:18;;;11295:62;11393:19;11373:18;;;11366:47;11430:19;;25732:103:0;11042:413:1;25732:103:0;25846:39;25860:4;25866:2;25870:7;25879:5;25846:13;:39::i;:::-;25565:328;;;;:::o;22934:334::-;27468:4;27492:16;;;:7;:16;;;;;;23007:13;;27492:30;:16;23033:76;;;;;;;15803:2:1;23033:76:0;;;15785:21:1;15842:2;15822:18;;;15815:30;15881:34;15861:18;;;15854:62;15952:17;15932:18;;;15925:45;15987:19;;23033:76:0;15601:411:1;23033:76:0;23122:21;23146:10;:8;:10::i;:::-;23122:34;;23198:1;23180:7;23174:21;:25;:86;;;;;;;;;;;;;;;;;23226:7;23235:18;:7;:16;:18::i;:::-;23209:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23174:86;23167:93;22934:334;-1:-1:-1;;;22934:334:0:o;48616:667::-;48679:19;48701:13;35739:10;:17;;35651:113;48701:13;48735:15;;48679:35;;-1:-1:-1;48735:15:0;;;;;48727:51;;;;;;;16694:2:1;48727:51:0;;;16676:21:1;16733:2;16713:18;;;16706:30;16772:24;16752:18;;;16745:52;16814:18;;48727:51:0;16492:346:1;48727:51:0;48819:9;;48810:18;;:6;:18;:::i;:::-;48797:9;:31;;48789:75;;;;;;;14466:2:1;48789:75:0;;;14448:21:1;14505:2;14485:18;;;14478:30;14544:33;14524:18;;;14517:61;14595:18;;48789:75:0;14264:355:1;48789:75:0;47083:2;48883:6;:28;;48875:103;;;;;;;14826:2:1;48875:103:0;;;14808:21:1;14865:2;14845:18;;;14838:30;14904:34;14884:18;;;14877:62;14975:32;14955:18;;;14948:60;15025:19;;48875:103:0;14624:426:1;48875:103:0;47026:5;48997:20;49011:6;48997:11;:20;:::i;:::-;:33;;48989:90;;;;;;;15390:2:1;48989:90:0;;;15372:21:1;15429:2;15409:18;;;15402:30;15468:34;15448:18;;;15441:62;15539:14;15519:18;;;15512:42;15571:19;;48989:90:0;15188:408:1;48989:90:0;49110:10;49098:23;;;;:11;:23;;;;;;;;49090:71;;;;;;;17045:2:1;49090:71:0;;;17027:21:1;17084:2;17064:18;;;17057:30;17123:34;17103:18;;;17096:62;17194:5;17174:18;;;17167:33;17217:19;;49090:71:0;16843:399:1;49090:71:0;49179:9;49174:102;49198:6;49194:1;:10;49174:102;;;49226:38;49236:10;49248:15;49262:1;49248:11;:15;:::i;49226:38::-;49206:3;;;;:::i;:::-;;;;49174:102;;50086:90;42237:6;;42384:23;42237:6;736:10;42384:23;42376:68;;;;;;;10883:2:1;42376:68:0;;;10865:21:1;;;10902:18;;;10895:30;10961:34;10941:18;;;10934:62;11013:18;;42376:68:0;10681:356:1;42376:68:0;50156:12:::1;::::0;;50140:28;;::::1;50156:12:::0;;;;::::1;;;50155:13;50140:28:::0;;::::1;;::::0;;50086:90::o;47547:1061::-;47626:19;47648:13;35739:10;:17;;35651:113;47648:13;47682:20;;47626:35;;-1:-1:-1;47682:20:0;;47674:61;;;;;;;17449:2:1;47674:61:0;;;17431:21:1;17488:2;17468:18;;;17461:30;17527:29;17507:18;;;17500:57;17574:18;;47674:61:0;17247:351:1;47674:61:0;47785:13;;47767:8;:15;:31;;;;:::i;:::-;47754:9;:44;;47746:88;;;;;;;14466:2:1;47746:88:0;;;14448:21:1;14505:2;14485:18;;;14478:30;14544:33;14524:18;;;14517:61;14595:18;;47746:88:0;14264:355:1;47746:88:0;47083:2;47853:8;:15;:37;;47845:112;;;;;;;14826:2:1;47845:112:0;;;14808:21:1;14865:2;14845:18;;;14838:30;14904:34;14884:18;;;14877:62;14975:32;14955:18;;;14948:60;15025:19;;47845:112:0;14624:426:1;47845:112:0;47026:5;47990:8;:15;47976:11;:29;;;;:::i;:::-;:42;;47968:99;;;;;;;15390:2:1;47968:99:0;;;15372:21:1;15429:2;15409:18;;;15402:30;15468:34;15448:18;;;15441:62;15539:14;15519:18;;;15512:42;15571:19;;47968:99:0;15188:408:1;47968:99:0;48092:9;48088:513;48111:8;:15;48107:1;:19;48088:513;;;48157:7;:20;48165:8;48174:1;48165:11;;;;;;;;:::i;:::-;;;;;;;;;;;;48157:20;;;;;;;;;;-1:-1:-1;48157:20:0;;;;48156:21;48148:30;;;;;;48265:10;48219:56;;46760:42;48219:29;;;48249:8;48258:1;48249:11;;;;;;;;:::i;:::-;;;;;;;48219:42;;;;;;;;;;;;;2489:25:1;;2477:2;2462:18;;2343:177;48219:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;;48193:142;;;;;;;18061:2:1;48193:142:0;;;18043:21:1;18100:2;18080:18;;;18073:30;18139:26;18119:18;;;18112:54;18183:18;;48193:142:0;17859:348:1;48193:142:0;48422:10;48376:56;;46849:42;48376:29;;;48406:8;48415:1;48406:11;;;;;;;;:::i;:::-;;;;;;;48376:42;;;;;;;;;;;;;2489:25:1;;2477:2;2462:18;;2343:177;48376:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;;48350:142;;;;;;;18414:2:1;48350:142:0;;;18396:21:1;18453:2;18433:18;;;18426:30;18492:26;18472:18;;;18465:54;18536:18;;48350:142:0;18212:348:1;48350:142:0;48532:4;48509:7;:20;48517:8;48526:1;48517:11;;;;;;;;:::i;:::-;;;;;;;48509:20;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;48551:38;48561:10;48587:1;48573:11;:15;;;;:::i;48551:38::-;48128:3;;;;:::i;:::-;;;;48088:513;;43073:201;42237:6;;42384:23;42237:6;736:10;42384:23;42376:68;;;;;;;10883:2:1;42376:68:0;;;10865:21:1;;;10902:18;;;10895:30;10961:34;10941:18;;;10934:62;11013:18;;42376:68:0;10681:356:1;42376:68:0;43162:22:::1;::::0;::::1;43154:73;;;::::0;::::1;::::0;;18767:2:1;43154:73:0::1;::::0;::::1;18749:21:1::0;18806:2;18786:18;;;18779:30;18845:34;18825:18;;;18818:62;18916:8;18896:18;;;18889:36;18942:19;;43154:73:0::1;18565:402:1::0;43154:73:0::1;43238:28;43257:8;43238:18;:28::i;:::-;43073:201:::0;:::o;21645:305::-;21747:4;21784:40;;;21799:25;21784:40;;:105;;-1:-1:-1;21841:48:0;;;21856:33;21841:48;21784:105;:158;;;-1:-1:-1;2639:25:0;2624:40;;;;21906:36;2515:157;31385:174;31460:24;;;;:15;:24;;;;;:29;;;;;;;;;;;;;:24;;31514:23;31460:24;31514:14;:23::i;:::-;31505:46;;;;;;;;;;;;31385:174;;:::o;27697:348::-;27790:4;27492:16;;;:7;:16;;;;;;:30;:16;27807:73;;;;;;;19174:2:1;27807:73:0;;;19156:21:1;19213:2;19193:18;;;19186:30;19252:34;19232:18;;;19225:62;19323:14;19303:18;;;19296:42;19355:19;;27807:73:0;18972:408:1;27807:73:0;27891:13;27907:23;27922:7;27907:14;:23::i;:::-;27891:39;;27960:5;27949:16;;:7;:16;;;:51;;;;27993:7;27969:31;;:20;27981:7;27969:11;:20::i;:::-;:31;;;27949:51;:87;;;-1:-1:-1;24789:25:0;;;;24765:4;24789:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;28004:32;27941:96;27697:348;-1:-1:-1;;;;27697:348:0:o;30689:578::-;30848:4;30821:31;;:23;30836:7;30821:14;:23::i;:::-;:31;;;30813:85;;;;;;;19587:2:1;30813:85:0;;;19569:21:1;19626:2;19606:18;;;19599:30;19665:34;19645:18;;;19638:62;19736:11;19716:18;;;19709:39;19765:19;;30813:85:0;19385:405:1;30813:85:0;30917:16;;;30909:65;;;;;;;19997:2:1;30909:65:0;;;19979:21:1;20036:2;20016:18;;;20009:30;20075:34;20055:18;;;20048:62;20146:6;20126:18;;;20119:34;20170:19;;30909:65:0;19795:400:1;30909:65:0;30987:39;31008:4;31014:2;31018:7;30987:20;:39::i;:::-;31091:29;31108:1;31112:7;31091:8;:29::i;:::-;31133:15;;;;;;;:9;:15;;;;;:20;;31152:1;;31133:15;:20;;31152:1;;31133:20;:::i;:::-;;;;-1:-1:-1;;31164:13:0;;;;;;;:9;:13;;;;;:18;;31181:1;;31164:13;:18;;31181:1;;31164:18;:::i;:::-;;;;-1:-1:-1;;31193:16:0;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;;31232:27;;31193:16;;31232:27;;;;;;;30689:578;;;:::o;43434:191::-;43527:6;;;;43544:17;;;;;;;;;;;43577:40;;43527:6;;;43544:17;43527:6;;43577:40;;43508:16;;43577:40;43497:128;43434:191;:::o;28387:110::-;28463:26;28473:2;28477:7;28463:26;;;;;;;;;;;;:9;:26::i;31701:315::-;31856:8;31847:17;;:5;:17;;;;31839:55;;;;;;;20532:2:1;31839:55:0;;;20514:21:1;20571:2;20551:18;;;20544:30;20610:27;20590:18;;;20583:55;20655:18;;31839:55:0;20330:349:1;31839:55:0;31905:25;;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;;;;;;;;;;;;31967:41;;586::1;;;31967::0;;559:18:1;31967:41:0;;;;;;;31701:315;;;:::o;26775:::-;26932:28;26942:4;26948:2;26952:7;26932:9;:28::i;:::-;26979:48;27002:4;27008:2;27012:7;27021:5;26979:22;:48::i;:::-;26971:111;;;;;;;20886:2:1;26971:111:0;;;20868:21:1;20925:2;20905:18;;;20898:30;20964:34;20944:18;;;20937:62;21035:20;21015:18;;;21008:48;21073:19;;26971:111:0;20684:414:1;49970:108:0;50030:13;50063:7;50056:14;;;;;:::i;18568:723::-;18624:13;18845:10;18841:53;;-1:-1:-1;;18872:10:0;;;;;;;;;;;;;;;;;;18568:723::o;18841:53::-;18919:5;18904:12;18960:78;18967:9;;18960:78;;18993:8;;;;:::i;:::-;;-1:-1:-1;19016:10:0;;-1:-1:-1;19024:2:0;19016:10;;:::i;:::-;;;18960:78;;;19048:19;19080:6;19070:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19070:17:0;;19048:39;;19098:154;19105:10;;19098:154;;19132:11;19142:1;19132:11;;:::i;:::-;;-1:-1:-1;19201:10:0;19209:2;19201:5;:10;:::i;:::-;19188:24;;:2;:24;:::i;:::-;19175:39;;19158:6;19165;19158:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;19229:11:0;19238:2;19229:11;;:::i;:::-;;;19098:154;;36687:589;36893:18;;;36889:187;;36928:40;36960:7;38103:10;:17;;38076:24;;;;:15;:24;;;;;:44;;;38131:24;;;;;;;;;;;;37999:164;36928:40;36889:187;;;36998:2;36990:10;;:4;:10;;;36986:90;;37017:47;37050:4;37056:7;37017:32;:47::i;:::-;37090:16;;;37086:183;;37123:45;37160:7;37123:36;:45::i;37086:183::-;37196:4;37190:10;;:2;:10;;;37186:83;;37217:40;37245:2;37249:7;37217:27;:40::i;28724:321::-;28854:18;28860:2;28864:7;28854:5;:18::i;:::-;28905:54;28936:1;28940:2;28944:7;28953:5;28905:22;:54::i;:::-;28883:154;;;;;;;20886:2:1;28883:154:0;;;20868:21:1;20925:2;20905:18;;;20898:30;20964:34;20944:18;;;20937:62;21035:20;21015:18;;;21008:48;21073:19;;28883:154:0;20684:414:1;32581:799:0;32736:4;32757:13;;;11249:20;11297:8;32753:620;;32793:72;;;;;:36;;;;;;:72;;736:10;;32844:4;;32850:7;;32859:5;;32793:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32793:72:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32789:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33035:13:0;;33031:272;;33078:60;;;;;20886:2:1;33078:60:0;;;20868:21:1;20925:2;20905:18;;;20898:30;20964:34;20944:18;;;20937:62;21035:20;21015:18;;;21008:48;21073:19;;33078:60:0;20684:414:1;33031:272:0;33253:6;33247:13;33238:6;33234:2;33230:15;33223:38;32789:529;32916:51;;32926:41;32916:51;;-1:-1:-1;32909:58:0;;32753:620;-1:-1:-1;33357:4:0;32581:799;;;;;;:::o;38790:988::-;39056:22;39106:1;39081:22;39098:4;39081:16;:22::i;:::-;:26;;;;:::i;:::-;39118:18;39139:26;;;:17;:26;;;;;;39056:51;;-1:-1:-1;39272:28:0;;;39268:328;;39339:18;;;39317:19;39339:18;;;:12;:18;;;;;;;;:34;;;;;;;;;39390:30;;;;;;:44;;;39507:30;;:17;:30;;;;;:43;;;39268:328;-1:-1:-1;39692:26:0;;;;:17;:26;;;;;;;;39685:33;;;39736:18;;;;;;:12;:18;;;;;:34;;;;;;;39729:41;38790:988::o;40073:1079::-;40351:10;:17;40326:22;;40351:21;;40371:1;;40351:21;:::i;:::-;40383:18;40404:24;;;:15;:24;;;;;;40777:10;:26;;40326:46;;-1:-1:-1;40404:24:0;;40326:46;;40777:26;;;;;;:::i;:::-;;;;;;;;;40755:48;;40841:11;40816:10;40827;40816:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;40921:28;;;:15;:28;;;;;;;:41;;;41093:24;;;;;41086:31;41128:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;40144:1008;;;40073:1079;:::o;37577:221::-;37662:14;37679:20;37696:2;37679:16;:20::i;:::-;37710:16;;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;37755:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;37577:221:0:o;29381:382::-;29461:16;;;29453:61;;;;;;;22696:2:1;29453:61:0;;;22678:21:1;;;22715:18;;;22708:30;22774:34;22754:18;;;22747:62;22826:18;;29453:61:0;22494:356:1;29453:61:0;27468:4;27492:16;;;:7;:16;;;;;;:30;:16;:30;29525:58;;;;;;;23057:2:1;29525:58:0;;;23039:21:1;23096:2;23076:18;;;23069:30;23135;23115:18;;;23108:58;23183:18;;29525:58:0;22855:352:1;29525:58:0;29596:45;29625:1;29629:2;29633:7;29596:20;:45::i;:::-;29654:13;;;;;;;:9;:13;;;;;:18;;29671:1;;29654:13;:18;;29671:1;;29654:18;:::i;:::-;;;;-1:-1:-1;;29683:16:0;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;29722:33;;29683:16;;;29722:33;;29683:16;;29722:33;29381:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:177:1;99:66;92:5;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;638:258::-;710:1;720:113;734:6;731:1;728:13;720:113;;;810:11;;;804:18;791:11;;;784:39;756:2;749:10;720:113;;;851:6;848:1;845:13;842:48;;;-1:-1:-1;;886:1:1;868:16;;861:27;638:258::o;901:317::-;943:3;981:5;975:12;1008:6;1003:3;996:19;1024:63;1080:6;1073:4;1068:3;1064:14;1057:4;1050:5;1046:16;1024:63;:::i;:::-;1132:2;1120:15;1137:66;1116:88;1107:98;;;;1207:4;1103:109;;901:317;-1:-1:-1;;901:317:1:o;1223:220::-;1372:2;1361:9;1354:21;1335:4;1392:45;1433:2;1422:9;1418:18;1410:6;1392:45;:::i;1448:180::-;1507:6;1560:2;1548:9;1539:7;1535:23;1531:32;1528:52;;;1576:1;1573;1566:12;1528:52;-1:-1:-1;1599:23:1;;1448:180;-1:-1:-1;1448:180:1:o;1864:154::-;1950:42;1943:5;1939:54;1932:5;1929:65;1919:93;;2008:1;2005;1998:12;2023:315;2091:6;2099;2152:2;2140:9;2131:7;2127:23;2123:32;2120:52;;;2168:1;2165;2158:12;2120:52;2207:9;2194:23;2226:31;2251:5;2226:31;:::i;:::-;2276:5;2328:2;2313:18;;;;2300:32;;-1:-1:-1;;;2023:315:1:o;2525:456::-;2602:6;2610;2618;2671:2;2659:9;2650:7;2646:23;2642:32;2639:52;;;2687:1;2684;2677:12;2639:52;2726:9;2713:23;2745:31;2770:5;2745:31;:::i;:::-;2795:5;-1:-1:-1;2852:2:1;2837:18;;2824:32;2865:33;2824:32;2865:33;:::i;:::-;2525:456;;2917:7;;-1:-1:-1;;;2971:2:1;2956:18;;;;2943:32;;2525:456::o;2986:247::-;3045:6;3098:2;3086:9;3077:7;3073:23;3069:32;3066:52;;;3114:1;3111;3104:12;3066:52;3153:9;3140:23;3172:31;3197:5;3172:31;:::i;3238:184::-;3290:77;3287:1;3280:88;3387:4;3384:1;3377:15;3411:4;3408:1;3401:15;3427:334;3498:2;3492:9;3554:2;3544:13;;3559:66;3540:86;3528:99;;3657:18;3642:34;;3678:22;;;3639:62;3636:88;;;3704:18;;:::i;:::-;3740:2;3733:22;3427:334;;-1:-1:-1;3427:334:1:o;3766:183::-;3826:4;3859:18;3851:6;3848:30;3845:56;;;3881:18;;:::i;:::-;-1:-1:-1;3926:1:1;3922:14;3938:4;3918:25;;3766:183::o;3954:966::-;4038:6;4069:2;4112;4100:9;4091:7;4087:23;4083:32;4080:52;;;4128:1;4125;4118:12;4080:52;4168:9;4155:23;4201:18;4193:6;4190:30;4187:50;;;4233:1;4230;4223:12;4187:50;4256:22;;4309:4;4301:13;;4297:27;-1:-1:-1;4287:55:1;;4338:1;4335;4328:12;4287:55;4374:2;4361:16;4397:60;4413:43;4453:2;4413:43;:::i;:::-;4397:60;:::i;:::-;4491:15;;;4573:1;4569:10;;;;4561:19;;4557:28;;;4522:12;;;;4597:19;;;4594:39;;;4629:1;4626;4619:12;4594:39;4653:11;;;;4673:217;4689:6;4684:3;4681:15;4673:217;;;4769:3;4756:17;4786:31;4811:5;4786:31;:::i;:::-;4830:18;;4706:12;;;;4868;;;;4673:217;;;4909:5;3954:966;-1:-1:-1;;;;;;;3954:966:1:o;4925:632::-;5096:2;5148:21;;;5218:13;;5121:18;;;5240:22;;;5067:4;;5096:2;5319:15;;;;5293:2;5278:18;;;5067:4;5362:169;5376:6;5373:1;5370:13;5362:169;;;5437:13;;5425:26;;5506:15;;;;5471:12;;;;5398:1;5391:9;5362:169;;;-1:-1:-1;5548:3:1;;4925:632;-1:-1:-1;;;;;;4925:632:1:o;5562:466::-;5627:5;5661:18;5653:6;5650:30;5647:56;;;5683:18;;:::i;:::-;5721:116;5831:4;5762:66;5757:2;5749:6;5745:15;5741:88;5737:99;5721:116;:::i;:::-;5712:125;;5860:6;5853:5;5846:21;5900:3;5891:6;5886:3;5882:16;5879:25;5876:45;;;5917:1;5914;5907:12;5876:45;5966:6;5961:3;5954:4;5947:5;5943:16;5930:43;6020:1;6013:4;6004:6;5997:5;5993:18;5989:29;5982:40;5562:466;;;;;:::o;6033:451::-;6102:6;6155:2;6143:9;6134:7;6130:23;6126:32;6123:52;;;6171:1;6168;6161:12;6123:52;6211:9;6198:23;6244:18;6236:6;6233:30;6230:50;;;6276:1;6273;6266:12;6230:50;6299:22;;6352:4;6344:13;;6340:27;-1:-1:-1;6330:55:1;;6381:1;6378;6371:12;6330:55;6404:74;6470:7;6465:2;6452:16;6447:2;6443;6439:11;6404:74;:::i;6489:416::-;6554:6;6562;6615:2;6603:9;6594:7;6590:23;6586:32;6583:52;;;6631:1;6628;6621:12;6583:52;6670:9;6657:23;6689:31;6714:5;6689:31;:::i;:::-;6739:5;-1:-1:-1;6796:2:1;6781:18;;6768:32;6838:15;;6831:23;6819:36;;6809:64;;6869:1;6866;6859:12;6809:64;6892:7;6882:17;;;6489:416;;;;;:::o;6910:795::-;7005:6;7013;7021;7029;7082:3;7070:9;7061:7;7057:23;7053:33;7050:53;;;7099:1;7096;7089:12;7050:53;7138:9;7125:23;7157:31;7182:5;7157:31;:::i;:::-;7207:5;-1:-1:-1;7264:2:1;7249:18;;7236:32;7277:33;7236:32;7277:33;:::i;:::-;7329:7;-1:-1:-1;7383:2:1;7368:18;;7355:32;;-1:-1:-1;7438:2:1;7423:18;;7410:32;7465:18;7454:30;;7451:50;;;7497:1;7494;7487:12;7451:50;7520:22;;7573:4;7565:13;;7561:27;-1:-1:-1;7551:55:1;;7602:1;7599;7592:12;7551:55;7625:74;7691:7;7686:2;7673:16;7668:2;7664;7660:11;7625:74;:::i;:::-;7615:84;;;6910:795;;;;;;;:::o;7710:891::-;7794:6;7825:2;7868;7856:9;7847:7;7843:23;7839:32;7836:52;;;7884:1;7881;7874:12;7836:52;7924:9;7911:23;7957:18;7949:6;7946:30;7943:50;;;7989:1;7986;7979:12;7943:50;8012:22;;8065:4;8057:13;;8053:27;-1:-1:-1;8043:55:1;;8094:1;8091;8084:12;8043:55;8130:2;8117:16;8153:60;8169:43;8209:2;8169:43;:::i;8153:60::-;8247:15;;;8329:1;8325:10;;;;8317:19;;8313:28;;;8278:12;;;;8353:19;;;8350:39;;;8385:1;8382;8375:12;8350:39;8409:11;;;;8429:142;8445:6;8440:3;8437:15;8429:142;;;8511:17;;8499:30;;8462:12;;;;8549;;;;8429:142;;8606:388;8674:6;8682;8735:2;8723:9;8714:7;8710:23;8706:32;8703:52;;;8751:1;8748;8741:12;8703:52;8790:9;8777:23;8809:31;8834:5;8809:31;:::i;:::-;8859:5;-1:-1:-1;8916:2:1;8901:18;;8888:32;8929:33;8888:32;8929:33;:::i;8999:437::-;9078:1;9074:12;;;;9121;;;9142:61;;9196:4;9188:6;9184:17;9174:27;;9142:61;9249:2;9241:6;9238:14;9218:18;9215:38;9212:218;;;9286:77;9283:1;9276:88;9387:4;9384:1;9377:15;9415:4;9412:1;9405:15;12285:184;12337:77;12334:1;12327:88;12434:4;12431:1;12424:15;12458:4;12455:1;12448:15;13295:184;13347:77;13344:1;13337:88;13444:4;13441:1;13434:15;13468:4;13465:1;13458:15;13484:195;13523:3;13554:66;13547:5;13544:77;13541:103;;;13624:18;;:::i;:::-;-1:-1:-1;13671:1:1;13660:13;;13484:195::o;14031:228::-;14071:7;14197:1;14129:66;14125:74;14122:1;14119:81;14114:1;14107:9;14100:17;14096:105;14093:131;;;14204:18;;:::i;:::-;-1:-1:-1;14244:9:1;;14031:228::o;15055:128::-;15095:3;15126:1;15122:6;15119:1;15116:13;15113:39;;;15132:18;;:::i;:::-;-1:-1:-1;15168:9:1;;15055:128::o;16017:470::-;16196:3;16234:6;16228:13;16250:53;16296:6;16291:3;16284:4;16276:6;16272:17;16250:53;:::i;:::-;16366:13;;16325:16;;;;16388:57;16366:13;16325:16;16422:4;16410:17;;16388:57;:::i;:::-;16461:20;;16017:470;-1:-1:-1;;;;16017:470:1:o;17603:251::-;17673:6;17726:2;17714:9;17705:7;17701:23;17697:32;17694:52;;;17742:1;17739;17732:12;17694:52;17774:9;17768:16;17793:31;17818:5;17793:31;:::i;20200:125::-;20240:4;20268:1;20265;20262:8;20259:34;;;20273:18;;:::i;:::-;-1:-1:-1;20310:9:1;;20200:125::o;21103:184::-;21155:77;21152:1;21145:88;21252:4;21249:1;21242:15;21276:4;21273:1;21266:15;21292:120;21332:1;21358;21348:35;;21363:18;;:::i;:::-;-1:-1:-1;21397:9:1;;21292:120::o;21417:112::-;21449:1;21475;21465:35;;21480:18;;:::i;:::-;-1:-1:-1;21514:9:1;;21417:112::o;21534:512::-;21728:4;21757:42;21838:2;21830:6;21826:15;21815:9;21808:34;21890:2;21882:6;21878:15;21873:2;21862:9;21858:18;21851:43;;21930:6;21925:2;21914:9;21910:18;21903:34;21973:3;21968:2;21957:9;21953:18;21946:31;21994:46;22035:3;22024:9;22020:19;22012:6;21994:46;:::i;:::-;21986:54;21534:512;-1:-1:-1;;;;;;21534:512:1:o;22051:249::-;22120:6;22173:2;22161:9;22152:7;22148:23;22144:32;22141:52;;;22189:1;22186;22179:12;22141:52;22221:9;22215:16;22240:30;22264:5;22240:30;:::i;22305:184::-;22357:77;22354:1;22347:88;22454:4;22451:1;22444:15;22478:4;22475:1;22468:15

Swarm Source

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