ETH Price: $3,398.44 (+6.48%)
Gas: 21 Gwei

Token

W3 See Ukraine (W3SeeUA)
 

Overview

Max Total Supply

10 W3SeeUA

Holders

9

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
kocham.eth
Balance
1 W3SeeUA
0x18772056026d50300ad9a23e153d20409abfd827
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
W3SeeUkraine

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
Yes with 5000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
// Author: nonera.lt || https://github.com/zekronium
// ERC721A Creators: https://www.erc721a.org/

// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

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


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.5.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);

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/utils/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;









    error ApprovalCallerNotOwnerNorApproved();
    error ApprovalQueryForNonexistentToken();
    error ApproveToCaller();
    error ApprovalToCurrentOwner();
    error BalanceQueryForZeroAddress();
    error MintedQueryForZeroAddress();
    error BurnedQueryForZeroAddress();
    error AuxQueryForZeroAddress();
    error MintToZeroAddress();
    error MintZeroQuantity();
    error OwnerIndexOutOfBounds();
    error OwnerQueryForNonexistentToken();
    error TokenIndexOutOfBounds();
    error TransferCallerNotOwnerNorApproved();
    error TransferFromIncorrectOwner();
    error TransferToNonERC721ReceiverImplementer();
    error TransferToZeroAddress();
    error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 1;
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
    unchecked {
        return _currentIndex - _burnCounter - _startTokenId();
    }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
    unchecked {
        return _currentIndex - _startTokenId();
    }
    }

    /**
     * @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 override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert BurnedQueryForZeroAddress();
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        if (owner == address(0)) revert AuxQueryForZeroAddress();
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        if (owner == address(0)) revert AuxQueryForZeroAddress();
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

    unchecked {
        if (_startTokenId() <= curr && curr < _currentIndex) {
            TokenOwnership memory ownership = _ownerships[curr];
            if (!ownership.burned) {
                if (ownership.addr != address(0)) {
                    return ownership;
                }
                // Invariant:
                // There will always be an ownership that has an address and is not burned
                // before an ownership that does not have an address and is not burned.
                // Hence, curr will not underflow.
                while (true) {
                    curr--;
                    ownership = _ownerships[curr];
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                }
            }
        }
    }
        revert OwnerQueryForNonexistentToken();
    }

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        if (operator == _msgSender()) revert ApproveToCaller();

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

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

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

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
    unchecked {
        _addressData[to].balance += uint64(quantity);
        _addressData[to].numberMinted += uint64(quantity);

        _ownerships[startTokenId].addr = to;
        _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

        uint256 updatedIndex = startTokenId;
        uint256 end = updatedIndex + quantity;

        if (safe && to.isContract()) {
            do {
                emit Transfer(address(0), to, updatedIndex);
                if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                    revert TransferToNonERC721ReceiverImplementer();
                }
            } while (updatedIndex != end);
            // Reentrancy protection
            if (_currentIndex != startTokenId) revert();
        } else {
            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex != end);
        }
        _currentIndex = updatedIndex;
    }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

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

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

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
    unchecked {
        _addressData[from].balance -= 1;
        _addressData[to].balance += 1;

        _ownerships[tokenId].addr = to;
        _ownerships[tokenId].startTimestamp = uint64(block.timestamp);

        // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
        // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
        uint256 nextTokenId = tokenId + 1;
        if (_ownerships[nextTokenId].addr == address(0)) {
            // This will suffice for checking _exists(nextTokenId),
            // as a burned slot cannot contain the zero address.
            if (nextTokenId < _currentIndex) {
                _ownerships[nextTokenId].addr = prevOwnership.addr;
                _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
            }
        }
    }

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

    /**
     * @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 {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
    unchecked {
        _addressData[prevOwnership.addr].balance -= 1;
        _addressData[prevOwnership.addr].numberBurned += 1;

        // Keep track of who burned the token, and the timestamp of burning.
        _ownerships[tokenId].addr = prevOwnership.addr;
        _ownerships[tokenId].startTimestamp = uint64(block.timestamp);
        _ownerships[tokenId].burned = true;

        // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
        // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
        uint256 nextTokenId = tokenId + 1;
        if (_ownerships[nextTokenId].addr == address(0)) {
            // This will suffice for checking _exists(nextTokenId),
            // as a burned slot cannot contain the zero address.
            if (nextTokenId < _currentIndex) {
                _ownerships[nextTokenId].addr = prevOwnership.addr;
                _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
            }
        }
    }

        emit Transfer(prevOwnership.addr, address(0), tokenId);
        _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
    unchecked {
        _burnCounter++;
    }
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}
// File: @openzeppelin/contracts/access/Ownable.sol


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

// File: contracts/W3SeeUkraine.sol


// Author: nonera.lt || https://github.com/zekronium
// ERC721A Creators: https://www.erc721a.org/

pragma solidity ^0.8.12;

contract W3SeeUkraine is Ownable, ERC721A, ReentrancyGuard {

    uint256 public collectionSize = 500;
    uint256 public price = 0.05 ether;

    bool public saleIsActive;

    constructor() ERC721A("W3 See Ukraine", "W3SeeUA") {
        saleIsActive = false;
        _baseTokenURI = "ipfs://QmW2qVnuZwqg7Y7Q6skxLSbFwgaHrcCsrSgRJzQpKvgKuZ/";
    }

    modifier isSaleActive() {
        require(saleIsActive, "Sale not started");
        _;
    }

    function setCollectionSize(uint256 newCollectionSize) external onlyOwner {
        require(newCollectionSize > collectionSize, "Can't reduce the collection");
        collectionSize = newCollectionSize;
    }

    function setNFTPrice(uint256 newNFTPrice) external onlyOwner {
        price = newNFTPrice;
    }

    function donate(uint256 quantity) external payable isSaleActive {
        require(totalSupply() + quantity <= collectionSize, "Sold Out");
        require(msg.value >= price * quantity, "Invalid amount of ETH");
        _safeMint(msg.sender, quantity);
    }

    //metadata URI
    string private _baseTokenURI;

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

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

    function flipSaleState() external onlyOwner {
        saleIsActive = !saleIsActive;
    }

    address public constant donationReceiver1 = 0xa1b1bbB8070Df2450810b8eB2425D543cfCeF79b;
    address public constant donationReceiver2 = 0x97849c43DB2AD63905aCcAD01Cbd6794833A95b5;
    address public constant donationReceiver3 = 0x5353c7cCDDD1C8EB4341f0EE60927E73f89F4C9c;

    //All funds go to donationReceiver without the option to change the recipient
    function transferDonations() external onlyOwner nonReentrant {
        uint256 balance = address(this).balance;
        (bool t1, ) = address(donationReceiver1).call{value: balance / 3}("");
        (bool t2, ) = address(donationReceiver2).call{value: balance / 3}("");
        (bool t3, ) = address(donationReceiver3).call{value: balance / 3}("");
        require(t1 && t2 && t3, "Transfer failed.");
    }

    function numberMinted(address owner) public view returns (uint256) {
        return _numberMinted(owner);
    }

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

    //Use fallback function to be able to receive funds from marketplace royalties to NGO's
    receive() external payable {

    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"MintedQueryForZeroAddress","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"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":[{"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":"collectionSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"donate","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"donationReceiver1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"donationReceiver2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"donationReceiver3","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCollectionSize","type":"uint256"}],"name":"setCollectionSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNFTPrice","type":"uint256"}],"name":"setNFTPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transferDonations","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":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526101f4600a5566b1a2bc2ec50000600b553480156200002257600080fd5b506040518060400160405280600e81526020016d57332053656520556b7261696e6560901b815250604051806040016040528060078152602001665733536565554160c81b815250620000846200007e620000fa60201b60201c565b620000fe565b8151620000999060039060208501906200014e565b508051620000af9060049060208401906200014e565b5060018081556009555050600c805460ff1916905560408051606081019091526036808252620025a160208301398051620000f391600d916020909101906200014e565b5062000231565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200015c90620001f4565b90600052602060002090601f016020900481019282620001805760008555620001cb565b82601f106200019b57805160ff1916838001178555620001cb565b82800160010185558215620001cb579182015b82811115620001cb578251825591602001919060010190620001ae565b50620001d9929150620001dd565b5090565b5b80821115620001d95760008155600101620001de565b600181811c908216806200020957607f821691505b602082108114156200022b57634e487b7160e01b600052602260045260246000fd5b50919050565b61236080620002416000396000f3fe6080604052600436106101dc5760003560e01c8063715018a611610102578063b88d4fde11610095578063e985e9c511610064578063e985e9c51461058d578063eb8d2444146105d6578063f14faf6f146105f0578063f2fde38b1461060357600080fd5b8063b88d4fde14610505578063bf6f6a5614610525578063c87b56dd1461054d578063dc33e6811461056d57600080fd5b806395d89b41116100d157806395d89b411461049a578063a035b1fe146104af578063a22cb465146104c5578063aca8ffe7146104e557600080fd5b8063715018a6146103f057806381530b68146104055780638da5cb5b146104255780639231ab2a1461044357600080fd5b806339703d781161017a57806355f804b31161014957806355f804b3146103685780636352211e146103885780636c1c9314146103a857806370a08231146103d057600080fd5b806339703d78146102f557806342842e0e1461031d57806345c0f5331461033d5780634c458fc01461035357600080fd5b8063095ea7b3116101b6578063095ea7b31461027757806318160ddd1461029957806323b872dd146102c057806334918dfd146102e057600080fd5b806301ffc9a7146101e857806306fdde031461021d578063081812fc1461023f57600080fd5b366101e357005b600080fd5b3480156101f457600080fd5b50610208610203366004611dde565b610623565b60405190151581526020015b60405180910390f35b34801561022957600080fd5b50610232610708565b6040516102149190611e53565b34801561024b57600080fd5b5061025f61025a366004611e66565b61079a565b6040516001600160a01b039091168152602001610214565b34801561028357600080fd5b50610297610292366004611e9b565b6107f7565b005b3480156102a557600080fd5b5060025460015403600019015b604051908152602001610214565b3480156102cc57600080fd5b506102976102db366004611ec5565b6108b7565b3480156102ec57600080fd5b506102976108c2565b34801561030157600080fd5b5061025f735353c7ccddd1c8eb4341f0ee60927e73f89f4c9c81565b34801561032957600080fd5b50610297610338366004611ec5565b610935565b34801561034957600080fd5b506102b2600a5481565b34801561035f57600080fd5b50610297610950565b34801561037457600080fd5b50610297610383366004611f01565b610ba6565b34801561039457600080fd5b5061025f6103a3366004611e66565b610c0c565b3480156103b457600080fd5b5061025f7397849c43db2ad63905accad01cbd6794833a95b581565b3480156103dc57600080fd5b506102b26103eb366004611f73565b610c1e565b3480156103fc57600080fd5b50610297610c86565b34801561041157600080fd5b50610297610420366004611e66565b610cec565b34801561043157600080fd5b506000546001600160a01b031661025f565b34801561044f57600080fd5b5061046361045e366004611e66565b610d4b565b6040805182516001600160a01b0316815260208084015167ffffffffffffffff169082015291810151151590820152606001610214565b3480156104a657600080fd5b50610232610d71565b3480156104bb57600080fd5b506102b2600b5481565b3480156104d157600080fd5b506102976104e0366004611f8e565b610d80565b3480156104f157600080fd5b50610297610500366004611e66565b610e2f565b34801561051157600080fd5b50610297610520366004611ff9565b610edf565b34801561053157600080fd5b5061025f73a1b1bbb8070df2450810b8eb2425d543cfcef79b81565b34801561055957600080fd5b50610232610568366004611e66565b610f49565b34801561057957600080fd5b506102b2610588366004611f73565b610fe7565b34801561059957600080fd5b506102086105a83660046120d5565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b3480156105e257600080fd5b50600c546102089060ff1681565b6102976105fe366004611e66565b610ff2565b34801561060f57600080fd5b5061029761061e366004611f73565b611117565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806106b657507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061070257507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60606003805461071790612108565b80601f016020809104026020016040519081016040528092919081815260200182805461074390612108565b80156107905780601f1061076557610100808354040283529160200191610790565b820191906000526020600020905b81548152906001019060200180831161077357829003601f168201915b5050505050905090565b60006107a5826111f6565b6107db576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b600061080282610c0c565b9050806001600160a01b0316836001600160a01b03161415610850576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336001600160a01b03821614801590610870575061086e81336105a8565b155b156108a7576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108b2838383611248565b505050565b6108b28383836112bc565b6000546001600160a01b031633146109215760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600c805460ff19811660ff90911615179055565b6108b283838360405180602001604052806000815250610edf565b6000546001600160a01b031633146109aa5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610918565b600260095414156109fd5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610918565b600260095547600073a1b1bbb8070df2450810b8eb2425d543cfcef79b610a256003846121ba565b604051600081818185875af1925050503d8060008114610a61576040519150601f19603f3d011682016040523d82523d6000602084013e610a66565b606091505b50909150600090507397849c43db2ad63905accad01cbd6794833a95b5610a8e6003856121ba565b604051600081818185875af1925050503d8060008114610aca576040519150601f19603f3d011682016040523d82523d6000602084013e610acf565b606091505b5090915060009050735353c7ccddd1c8eb4341f0ee60927e73f89f4c9c610af76003866121ba565b604051600081818185875af1925050503d8060008114610b33576040519150601f19603f3d011682016040523d82523d6000602084013e610b38565b606091505b50509050828015610b465750815b8015610b4f5750805b610b9b5760405162461bcd60e51b815260206004820152601060248201527f5472616e73666572206661696c65642e000000000000000000000000000000006044820152606401610918565b505060016009555050565b6000546001600160a01b03163314610c005760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610918565b6108b2600d8383611d17565b6000610c1782611587565b5192915050565b60006001600160a01b038216610c60576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b031660009081526006602052604090205467ffffffffffffffff1690565b6000546001600160a01b03163314610ce05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610918565b610cea600061171d565b565b6000546001600160a01b03163314610d465760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610918565b600b55565b604080516060810182526000808252602082018190529181019190915261070282611587565b60606004805461071790612108565b6001600160a01b038216331415610dc3576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b03163314610e895760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610918565b600a548111610eda5760405162461bcd60e51b815260206004820152601b60248201527f43616e2774207265647563652074686520636f6c6c656374696f6e00000000006044820152606401610918565b600a55565b610eea8484846112bc565b6001600160a01b0383163b15158015610f0c5750610f0a84848484611785565b155b15610f43576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060610f54826111f6565b610f8a576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610f946118d1565b9050805160001415610fb55760405180602001604052806000815250610fe0565b80610fbf846118e0565b604051602001610fd09291906121ce565b6040516020818303038152906040525b9392505050565b600061070282611a12565b600c5460ff166110445760405162461bcd60e51b815260206004820152601060248201527f53616c65206e6f742073746172746564000000000000000000000000000000006044820152606401610918565b600a54600254600154839190036000190161105f9190612225565b11156110ad5760405162461bcd60e51b815260206004820152600860248201527f536f6c64204f75740000000000000000000000000000000000000000000000006044820152606401610918565b80600b546110bb919061223d565b34101561110a5760405162461bcd60e51b815260206004820152601560248201527f496e76616c696420616d6f756e74206f662045544800000000000000000000006044820152606401610918565b6111143382611a86565b50565b6000546001600160a01b031633146111715760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610918565b6001600160a01b0381166111ed5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610918565b6111148161171d565b60008160011115801561120a575060015482105b80156107025750506000908152600560205260409020547c0100000000000000000000000000000000000000000000000000000000900460ff161590565b60008281526007602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006112c782611587565b80519091506000906001600160a01b0316336001600160a01b031614806112f5575081516112f590336105a8565b806113105750336113058461079a565b6001600160a01b0316145b905080611349576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b031614611398576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0384166113d8576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113e86000848460000151611248565b6001600160a01b03858116600090815260066020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000080821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080547fffffffff00000000000000000000000000000000000000000000000000000000169094177401000000000000000000000000000000000000000042909216919091021790925590860180835291205490911661153d5760015481101561153d578251600082815260056020908152604090912080549186015167ffffffffffffffff1674010000000000000000000000000000000000000000027fffffffff000000000000000000000000000000000000000000000000000000009092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b604080516060810182526000808252602082018190529181019190915281806001111580156115b7575060015481105b156116eb57600081815260056020908152604091829020825160608101845290546001600160a01b038116825274010000000000000000000000000000000000000000810467ffffffffffffffff16928201929092527c010000000000000000000000000000000000000000000000000000000090910460ff161515918101829052906116e95780516001600160a01b031615611655579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b03811680835274010000000000000000000000000000000000000000820467ffffffffffffffff16938301939093527c0100000000000000000000000000000000000000000000000000000000900460ff16151592810192909252156116e4579392505050565b611655565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040517f150b7a020000000000000000000000000000000000000000000000000000000081526000906001600160a01b0385169063150b7a02906117d390339089908890889060040161225c565b6020604051808303816000875af192505050801561180e575060408051601f3d908101601f1916820190925261180b91810190612298565b60015b611882573d80801561183c576040519150601f19603f3d011682016040523d82523d6000602084013e611841565b606091505b50805161187a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001490505b949350505050565b6060600d805461071790612108565b60608161192057505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561194a5780611934816122b5565b91506119439050600a836121ba565b9150611924565b60008167ffffffffffffffff81111561196557611965611fca565b6040519080825280601f01601f19166020018201604052801561198f576020820181803683370190505b5090505b84156118c9576119a46001836122d0565b91506119b1600a866122e7565b6119bc906030612225565b60f81b8183815181106119d1576119d16122fb565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611a0b600a866121ba565b9450611993565b60006001600160a01b038216611a54576040517f35ebb31900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b031660009081526006602052604090205468010000000000000000900467ffffffffffffffff1690565b611aa0828260405180602001604052806000815250611aa4565b5050565b6108b2838383600180546001600160a01b038516611aee576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83611b25576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038516600081815260066020908152604080832080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000811667ffffffffffffffff8083168c018116918217680100000000000000007fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090941690921783900481168c01811690920217909155858452600590925290912080547fffffffff000000000000000000000000000000000000000000000000000000001690921774010000000000000000000000000000000000000000429092169190910217905580808501838015611c2657506001600160a01b0387163b15155b15611cc8575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611c776000888480600101955088611785565b611cad576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415611c2c578260015414611cc357600080fd5b611d0e565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821415611cc9575b50600155611580565b828054611d2390612108565b90600052602060002090601f016020900481019282611d455760008555611d8b565b82601f10611d5e5782800160ff19823516178555611d8b565b82800160010185558215611d8b579182015b82811115611d8b578235825591602001919060010190611d70565b50611d97929150611d9b565b5090565b5b80821115611d975760008155600101611d9c565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461111457600080fd5b600060208284031215611df057600080fd5b8135610fe081611db0565b60005b83811015611e16578181015183820152602001611dfe565b83811115610f435750506000910152565b60008151808452611e3f816020860160208601611dfb565b601f01601f19169290920160200192915050565b602081526000610fe06020830184611e27565b600060208284031215611e7857600080fd5b5035919050565b80356001600160a01b0381168114611e9657600080fd5b919050565b60008060408385031215611eae57600080fd5b611eb783611e7f565b946020939093013593505050565b600080600060608486031215611eda57600080fd5b611ee384611e7f565b9250611ef160208501611e7f565b9150604084013590509250925092565b60008060208385031215611f1457600080fd5b823567ffffffffffffffff80821115611f2c57600080fd5b818501915085601f830112611f4057600080fd5b813581811115611f4f57600080fd5b866020828501011115611f6157600080fd5b60209290920196919550909350505050565b600060208284031215611f8557600080fd5b610fe082611e7f565b60008060408385031215611fa157600080fd5b611faa83611e7f565b915060208301358015158114611fbf57600080fd5b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000806080858703121561200f57600080fd5b61201885611e7f565b935061202660208601611e7f565b925060408501359150606085013567ffffffffffffffff8082111561204a57600080fd5b818701915087601f83011261205e57600080fd5b81358181111561207057612070611fca565b604051601f8201601f19908116603f0116810190838211818310171561209857612098611fca565b816040528281528a60208487010111156120b157600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080604083850312156120e857600080fd5b6120f183611e7f565b91506120ff60208401611e7f565b90509250929050565b600181811c9082168061211c57607f821691505b60208210811415612156577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000826121c9576121c961215c565b500490565b600083516121e0818460208801611dfb565b8351908301906121f4818360208801611dfb565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000009101908152600501949350505050565b600082198211156122385761223861218b565b500190565b60008160001904831182151516156122575761225761218b565b500290565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261228e6080830184611e27565b9695505050505050565b6000602082840312156122aa57600080fd5b8151610fe081611db0565b60006000198214156122c9576122c961218b565b5060010190565b6000828210156122e2576122e261218b565b500390565b6000826122f6576122f661215c565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220da39d47087a4f25d81005b330df341ccac1f8c6d9cf13c9d991fda78aad90bfc64736f6c634300080c0033697066733a2f2f516d573271566e755a7771673759375136736b784c5362467767614872634373725367524a7a51704b76674b755a2f

Deployed Bytecode

0x6080604052600436106101dc5760003560e01c8063715018a611610102578063b88d4fde11610095578063e985e9c511610064578063e985e9c51461058d578063eb8d2444146105d6578063f14faf6f146105f0578063f2fde38b1461060357600080fd5b8063b88d4fde14610505578063bf6f6a5614610525578063c87b56dd1461054d578063dc33e6811461056d57600080fd5b806395d89b41116100d157806395d89b411461049a578063a035b1fe146104af578063a22cb465146104c5578063aca8ffe7146104e557600080fd5b8063715018a6146103f057806381530b68146104055780638da5cb5b146104255780639231ab2a1461044357600080fd5b806339703d781161017a57806355f804b31161014957806355f804b3146103685780636352211e146103885780636c1c9314146103a857806370a08231146103d057600080fd5b806339703d78146102f557806342842e0e1461031d57806345c0f5331461033d5780634c458fc01461035357600080fd5b8063095ea7b3116101b6578063095ea7b31461027757806318160ddd1461029957806323b872dd146102c057806334918dfd146102e057600080fd5b806301ffc9a7146101e857806306fdde031461021d578063081812fc1461023f57600080fd5b366101e357005b600080fd5b3480156101f457600080fd5b50610208610203366004611dde565b610623565b60405190151581526020015b60405180910390f35b34801561022957600080fd5b50610232610708565b6040516102149190611e53565b34801561024b57600080fd5b5061025f61025a366004611e66565b61079a565b6040516001600160a01b039091168152602001610214565b34801561028357600080fd5b50610297610292366004611e9b565b6107f7565b005b3480156102a557600080fd5b5060025460015403600019015b604051908152602001610214565b3480156102cc57600080fd5b506102976102db366004611ec5565b6108b7565b3480156102ec57600080fd5b506102976108c2565b34801561030157600080fd5b5061025f735353c7ccddd1c8eb4341f0ee60927e73f89f4c9c81565b34801561032957600080fd5b50610297610338366004611ec5565b610935565b34801561034957600080fd5b506102b2600a5481565b34801561035f57600080fd5b50610297610950565b34801561037457600080fd5b50610297610383366004611f01565b610ba6565b34801561039457600080fd5b5061025f6103a3366004611e66565b610c0c565b3480156103b457600080fd5b5061025f7397849c43db2ad63905accad01cbd6794833a95b581565b3480156103dc57600080fd5b506102b26103eb366004611f73565b610c1e565b3480156103fc57600080fd5b50610297610c86565b34801561041157600080fd5b50610297610420366004611e66565b610cec565b34801561043157600080fd5b506000546001600160a01b031661025f565b34801561044f57600080fd5b5061046361045e366004611e66565b610d4b565b6040805182516001600160a01b0316815260208084015167ffffffffffffffff169082015291810151151590820152606001610214565b3480156104a657600080fd5b50610232610d71565b3480156104bb57600080fd5b506102b2600b5481565b3480156104d157600080fd5b506102976104e0366004611f8e565b610d80565b3480156104f157600080fd5b50610297610500366004611e66565b610e2f565b34801561051157600080fd5b50610297610520366004611ff9565b610edf565b34801561053157600080fd5b5061025f73a1b1bbb8070df2450810b8eb2425d543cfcef79b81565b34801561055957600080fd5b50610232610568366004611e66565b610f49565b34801561057957600080fd5b506102b2610588366004611f73565b610fe7565b34801561059957600080fd5b506102086105a83660046120d5565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b3480156105e257600080fd5b50600c546102089060ff1681565b6102976105fe366004611e66565b610ff2565b34801561060f57600080fd5b5061029761061e366004611f73565b611117565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806106b657507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061070257507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60606003805461071790612108565b80601f016020809104026020016040519081016040528092919081815260200182805461074390612108565b80156107905780601f1061076557610100808354040283529160200191610790565b820191906000526020600020905b81548152906001019060200180831161077357829003601f168201915b5050505050905090565b60006107a5826111f6565b6107db576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b600061080282610c0c565b9050806001600160a01b0316836001600160a01b03161415610850576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336001600160a01b03821614801590610870575061086e81336105a8565b155b156108a7576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108b2838383611248565b505050565b6108b28383836112bc565b6000546001600160a01b031633146109215760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600c805460ff19811660ff90911615179055565b6108b283838360405180602001604052806000815250610edf565b6000546001600160a01b031633146109aa5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610918565b600260095414156109fd5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610918565b600260095547600073a1b1bbb8070df2450810b8eb2425d543cfcef79b610a256003846121ba565b604051600081818185875af1925050503d8060008114610a61576040519150601f19603f3d011682016040523d82523d6000602084013e610a66565b606091505b50909150600090507397849c43db2ad63905accad01cbd6794833a95b5610a8e6003856121ba565b604051600081818185875af1925050503d8060008114610aca576040519150601f19603f3d011682016040523d82523d6000602084013e610acf565b606091505b5090915060009050735353c7ccddd1c8eb4341f0ee60927e73f89f4c9c610af76003866121ba565b604051600081818185875af1925050503d8060008114610b33576040519150601f19603f3d011682016040523d82523d6000602084013e610b38565b606091505b50509050828015610b465750815b8015610b4f5750805b610b9b5760405162461bcd60e51b815260206004820152601060248201527f5472616e73666572206661696c65642e000000000000000000000000000000006044820152606401610918565b505060016009555050565b6000546001600160a01b03163314610c005760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610918565b6108b2600d8383611d17565b6000610c1782611587565b5192915050565b60006001600160a01b038216610c60576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b031660009081526006602052604090205467ffffffffffffffff1690565b6000546001600160a01b03163314610ce05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610918565b610cea600061171d565b565b6000546001600160a01b03163314610d465760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610918565b600b55565b604080516060810182526000808252602082018190529181019190915261070282611587565b60606004805461071790612108565b6001600160a01b038216331415610dc3576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b03163314610e895760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610918565b600a548111610eda5760405162461bcd60e51b815260206004820152601b60248201527f43616e2774207265647563652074686520636f6c6c656374696f6e00000000006044820152606401610918565b600a55565b610eea8484846112bc565b6001600160a01b0383163b15158015610f0c5750610f0a84848484611785565b155b15610f43576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060610f54826111f6565b610f8a576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610f946118d1565b9050805160001415610fb55760405180602001604052806000815250610fe0565b80610fbf846118e0565b604051602001610fd09291906121ce565b6040516020818303038152906040525b9392505050565b600061070282611a12565b600c5460ff166110445760405162461bcd60e51b815260206004820152601060248201527f53616c65206e6f742073746172746564000000000000000000000000000000006044820152606401610918565b600a54600254600154839190036000190161105f9190612225565b11156110ad5760405162461bcd60e51b815260206004820152600860248201527f536f6c64204f75740000000000000000000000000000000000000000000000006044820152606401610918565b80600b546110bb919061223d565b34101561110a5760405162461bcd60e51b815260206004820152601560248201527f496e76616c696420616d6f756e74206f662045544800000000000000000000006044820152606401610918565b6111143382611a86565b50565b6000546001600160a01b031633146111715760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610918565b6001600160a01b0381166111ed5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610918565b6111148161171d565b60008160011115801561120a575060015482105b80156107025750506000908152600560205260409020547c0100000000000000000000000000000000000000000000000000000000900460ff161590565b60008281526007602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006112c782611587565b80519091506000906001600160a01b0316336001600160a01b031614806112f5575081516112f590336105a8565b806113105750336113058461079a565b6001600160a01b0316145b905080611349576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b031614611398576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0384166113d8576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113e86000848460000151611248565b6001600160a01b03858116600090815260066020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000080821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080547fffffffff00000000000000000000000000000000000000000000000000000000169094177401000000000000000000000000000000000000000042909216919091021790925590860180835291205490911661153d5760015481101561153d578251600082815260056020908152604090912080549186015167ffffffffffffffff1674010000000000000000000000000000000000000000027fffffffff000000000000000000000000000000000000000000000000000000009092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b604080516060810182526000808252602082018190529181019190915281806001111580156115b7575060015481105b156116eb57600081815260056020908152604091829020825160608101845290546001600160a01b038116825274010000000000000000000000000000000000000000810467ffffffffffffffff16928201929092527c010000000000000000000000000000000000000000000000000000000090910460ff161515918101829052906116e95780516001600160a01b031615611655579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b03811680835274010000000000000000000000000000000000000000820467ffffffffffffffff16938301939093527c0100000000000000000000000000000000000000000000000000000000900460ff16151592810192909252156116e4579392505050565b611655565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040517f150b7a020000000000000000000000000000000000000000000000000000000081526000906001600160a01b0385169063150b7a02906117d390339089908890889060040161225c565b6020604051808303816000875af192505050801561180e575060408051601f3d908101601f1916820190925261180b91810190612298565b60015b611882573d80801561183c576040519150601f19603f3d011682016040523d82523d6000602084013e611841565b606091505b50805161187a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001490505b949350505050565b6060600d805461071790612108565b60608161192057505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561194a5780611934816122b5565b91506119439050600a836121ba565b9150611924565b60008167ffffffffffffffff81111561196557611965611fca565b6040519080825280601f01601f19166020018201604052801561198f576020820181803683370190505b5090505b84156118c9576119a46001836122d0565b91506119b1600a866122e7565b6119bc906030612225565b60f81b8183815181106119d1576119d16122fb565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611a0b600a866121ba565b9450611993565b60006001600160a01b038216611a54576040517f35ebb31900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b031660009081526006602052604090205468010000000000000000900467ffffffffffffffff1690565b611aa0828260405180602001604052806000815250611aa4565b5050565b6108b2838383600180546001600160a01b038516611aee576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83611b25576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038516600081815260066020908152604080832080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000811667ffffffffffffffff8083168c018116918217680100000000000000007fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090941690921783900481168c01811690920217909155858452600590925290912080547fffffffff000000000000000000000000000000000000000000000000000000001690921774010000000000000000000000000000000000000000429092169190910217905580808501838015611c2657506001600160a01b0387163b15155b15611cc8575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611c776000888480600101955088611785565b611cad576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415611c2c578260015414611cc357600080fd5b611d0e565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821415611cc9575b50600155611580565b828054611d2390612108565b90600052602060002090601f016020900481019282611d455760008555611d8b565b82601f10611d5e5782800160ff19823516178555611d8b565b82800160010185558215611d8b579182015b82811115611d8b578235825591602001919060010190611d70565b50611d97929150611d9b565b5090565b5b80821115611d975760008155600101611d9c565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461111457600080fd5b600060208284031215611df057600080fd5b8135610fe081611db0565b60005b83811015611e16578181015183820152602001611dfe565b83811115610f435750506000910152565b60008151808452611e3f816020860160208601611dfb565b601f01601f19169290920160200192915050565b602081526000610fe06020830184611e27565b600060208284031215611e7857600080fd5b5035919050565b80356001600160a01b0381168114611e9657600080fd5b919050565b60008060408385031215611eae57600080fd5b611eb783611e7f565b946020939093013593505050565b600080600060608486031215611eda57600080fd5b611ee384611e7f565b9250611ef160208501611e7f565b9150604084013590509250925092565b60008060208385031215611f1457600080fd5b823567ffffffffffffffff80821115611f2c57600080fd5b818501915085601f830112611f4057600080fd5b813581811115611f4f57600080fd5b866020828501011115611f6157600080fd5b60209290920196919550909350505050565b600060208284031215611f8557600080fd5b610fe082611e7f565b60008060408385031215611fa157600080fd5b611faa83611e7f565b915060208301358015158114611fbf57600080fd5b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000806080858703121561200f57600080fd5b61201885611e7f565b935061202660208601611e7f565b925060408501359150606085013567ffffffffffffffff8082111561204a57600080fd5b818701915087601f83011261205e57600080fd5b81358181111561207057612070611fca565b604051601f8201601f19908116603f0116810190838211818310171561209857612098611fca565b816040528281528a60208487010111156120b157600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080604083850312156120e857600080fd5b6120f183611e7f565b91506120ff60208401611e7f565b90509250929050565b600181811c9082168061211c57607f821691505b60208210811415612156577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000826121c9576121c961215c565b500490565b600083516121e0818460208801611dfb565b8351908301906121f4818360208801611dfb565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000009101908152600501949350505050565b600082198211156122385761223861218b565b500190565b60008160001904831182151516156122575761225761218b565b500290565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261228e6080830184611e27565b9695505050505050565b6000602082840312156122aa57600080fd5b8151610fe081611db0565b60006000198214156122c9576122c961218b565b5060010190565b6000828210156122e2576122e261218b565b500390565b6000826122f6576122f661215c565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220da39d47087a4f25d81005b330df341ccac1f8c6d9cf13c9d991fda78aad90bfc64736f6c634300080c0033

Deployed Bytecode Sourcemap

48493:2662:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28677:293;;;;;;;;;;-1:-1:-1;28677:293:0;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;28677:293:0;;;;;;;;31966:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;33478:204::-;;;;;;;;;;-1:-1:-1;33478:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1797:55:1;;;1779:74;;1767:2;1752:18;33478:204:0;1633:226:1;33041:371:0;;;;;;;;;;-1:-1:-1;33041:371:0;;;;;:::i;:::-;;:::i;:::-;;27950:291;;;;;;;;;;-1:-1:-1;28196:12:0;;27757:1;28180:13;:28;-1:-1:-1;;28180:46:0;27950:291;;;2470:25:1;;;2458:2;2443:18;27950:291:0;2324:177:1;34335:170:0;;;;;;;;;;-1:-1:-1;34335:170:0;;;;;:::i;:::-;;:::i;49852:91::-;;;;;;;;;;;;;:::i;50137:86::-;;;;;;;;;;;;50181:42;50137:86;;34576:185;;;;;;;;;;-1:-1:-1;34576:185:0;;;;;:::i;:::-;;:::i;48561:35::-;;;;;;;;;;;;;;;;50315:413;;;;;;;;;;;;;:::i;49738:106::-;;;;;;;;;;-1:-1:-1;49738:106:0;;;;;:::i;:::-;;:::i;31775:124::-;;;;;;;;;;-1:-1:-1;31775:124:0;;;;;:::i;:::-;;:::i;50044:86::-;;;;;;;;;;;;50088:42;50044:86;;29034:206;;;;;;;;;;-1:-1:-1;29034:206:0;;;;;:::i;:::-;;:::i;47504:103::-;;;;;;;;;;;;;:::i;49182:99::-;;;;;;;;;;-1:-1:-1;49182:99:0;;;;;:::i;:::-;;:::i;46853:87::-;;;;;;;;;;-1:-1:-1;46899:7:0;46926:6;-1:-1:-1;;;;;46926:6:0;46853:87;;50857:155;;;;;;;;;;-1:-1:-1;50857:155:0;;;;;:::i;:::-;;:::i;:::-;;;;3857:13:1;;-1:-1:-1;;;;;3853:62:1;3835:81;;3976:4;3964:17;;;3958:24;3984:18;3954:49;3932:20;;;3925:79;4062:17;;;4056:24;4049:32;4042:40;4020:20;;;4013:70;3823:2;3808:18;50857:155:0;3627:462:1;32135:104:0;;;;;;;;;;;;;:::i;48603:33::-;;;;;;;;;;;;;;;;33754:279;;;;;;;;;;-1:-1:-1;33754:279:0;;;;;:::i;:::-;;:::i;48963:211::-;;;;;;;;;;-1:-1:-1;48963:211:0;;;;;:::i;:::-;;:::i;34832:369::-;;;;;;;;;;-1:-1:-1;34832:369:0;;;;;:::i;:::-;;:::i;49951:86::-;;;;;;;;;;;;49995:42;49951:86;;32310:327;;;;;;;;;;-1:-1:-1;32310:327:0;;;;;:::i;:::-;;:::i;50736:113::-;;;;;;;;;;-1:-1:-1;50736:113:0;;;;;:::i;:::-;;:::i;34104:164::-;;;;;;;;;;-1:-1:-1;34104:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;34225:25:0;;;34201:4;34225:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;34104:164;48645:24;;;;;;;;;;-1:-1:-1;48645:24:0;;;;;;;;49289:262;;;;;;:::i;:::-;;:::i;47762:201::-;;;;;;;;;;-1:-1:-1;47762:201:0;;;;;:::i;:::-;;:::i;28677:293::-;28779:4;28812:40;;;28827:25;28812:40;;:101;;-1:-1:-1;28865:48:0;;;28880:33;28865:48;28812:101;:150;;;-1:-1:-1;11576:25:0;11561:40;;;;28926:36;28796:166;28677:293;-1:-1:-1;;28677:293:0:o;31966:100::-;32020:13;32053:5;32046:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31966:100;:::o;33478:204::-;33546:7;33571:16;33579:7;33571;:16::i;:::-;33566:64;;33596:34;;;;;;;;;;;;;;33566:64;-1:-1:-1;33650:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;33650:24:0;;33478:204::o;33041:371::-;33114:13;33130:24;33146:7;33130:15;:24::i;:::-;33114:40;;33175:5;-1:-1:-1;;;;;33169:11:0;:2;-1:-1:-1;;;;;33169:11:0;;33165:48;;;33189:24;;;;;;;;;;;;;;33165:48;24013:10;-1:-1:-1;;;;;33230:21:0;;;;;;:63;;-1:-1:-1;33256:37:0;33273:5;24013:10;34104:164;:::i;33256:37::-;33255:38;33230:63;33226:138;;;33317:35;;;;;;;;;;;;;;33226:138;33376:28;33385:2;33389:7;33398:5;33376:8;:28::i;:::-;33103:309;33041:371;;:::o;34335:170::-;34469:28;34479:4;34485:2;34489:7;34469:9;:28::i;49852:91::-;46899:7;46926:6;-1:-1:-1;;;;;46926:6:0;24013:10;47073:23;47065:68;;;;-1:-1:-1;;;47065:68:0;;6746:2:1;47065:68:0;;;6728:21:1;;;6765:18;;;6758:30;6824:34;6804:18;;;6797:62;6876:18;;47065:68:0;;;;;;;;;49923:12:::1;::::0;;-1:-1:-1;;49907:28:0;::::1;49923:12;::::0;;::::1;49922:13;49907:28;::::0;;49852:91::o;34576:185::-;34714:39;34731:4;34737:2;34741:7;34714:39;;;;;;;;;;;;:16;:39::i;50315:413::-;46899:7;46926:6;-1:-1:-1;;;;;46926:6:0;24013:10;47073:23;47065:68;;;;-1:-1:-1;;;47065:68:0;;6746:2:1;47065:68:0;;;6728:21:1;;;6765:18;;;6758:30;6824:34;6804:18;;;6797:62;6876:18;;47065:68:0;6544:356:1;47065:68:0;22307:1:::1;22905:7;;:19;;22897:63;;;::::0;-1:-1:-1;;;22897:63:0;;7107:2:1;22897:63:0::1;::::0;::::1;7089:21:1::0;7146:2;7126:18;;;7119:30;7185:33;7165:18;;;7158:61;7236:18;;22897:63:0::1;6905:355:1::0;22897:63:0::1;22307:1;23038:7;:18:::0;50405:21:::2;50387:15;49995:42;50490:11;50500:1;50405:21:::0;50490:11:::2;:::i;:::-;50451:55;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;50437:69:0;;-1:-1:-1;50518:7:0::2;::::0;-1:-1:-1;50088:42:0::2;50570:11;50580:1;50570:7:::0;:11:::2;:::i;:::-;50531:55;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;50517:69:0;;-1:-1:-1;50598:7:0::2;::::0;-1:-1:-1;50181:42:0::2;50650:11;50660:1;50650:7:::0;:11:::2;:::i;:::-;50611:55;::::0;::::2;::::0;;;;;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50597:69;;;50685:2;:8;;;;;50691:2;50685:8;:14;;;;;50697:2;50685:14;50677:43;;;::::0;-1:-1:-1;;;50677:43:0;;8180:2:1;50677:43:0::2;::::0;::::2;8162:21:1::0;8219:2;8199:18;;;8192:30;8258:18;8238;;;8231:46;8294:18;;50677:43:0::2;7978:340:1::0;50677:43:0::2;-1:-1:-1::0;;22263:1:0::1;23217:7;:22:::0;-1:-1:-1;;50315:413:0:o;49738:106::-;46899:7;46926:6;-1:-1:-1;;;;;46926:6:0;24013:10;47073:23;47065:68;;;;-1:-1:-1;;;47065:68:0;;6746:2:1;47065:68:0;;;6728:21:1;;;6765:18;;;6758:30;6824:34;6804:18;;;6797:62;6876:18;;47065:68:0;6544:356:1;47065:68:0;49813:23:::1;:13;49829:7:::0;;49813:23:::1;:::i;31775:124::-:0;31839:7;31866:20;31878:7;31866:11;:20::i;:::-;:25;;31775:124;-1:-1:-1;;31775:124:0:o;29034:206::-;29098:7;-1:-1:-1;;;;;29122:19:0;;29118:60;;29150:28;;;;;;;;;;;;;;29118:60;-1:-1:-1;;;;;;29204:19:0;;;;;:12;:19;;;;;:27;;;;29034:206::o;47504:103::-;46899:7;46926:6;-1:-1:-1;;;;;46926:6:0;24013:10;47073:23;47065:68;;;;-1:-1:-1;;;47065:68:0;;6746:2:1;47065:68:0;;;6728:21:1;;;6765:18;;;6758:30;6824:34;6804:18;;;6797:62;6876:18;;47065:68:0;6544:356:1;47065:68:0;47569:30:::1;47596:1;47569:18;:30::i;:::-;47504:103::o:0;49182:99::-;46899:7;46926:6;-1:-1:-1;;;;;46926:6:0;24013:10;47073:23;47065:68;;;;-1:-1:-1;;;47065:68:0;;6746:2:1;47065:68:0;;;6728:21:1;;;6765:18;;;6758:30;6824:34;6804:18;;;6797:62;6876:18;;47065:68:0;6544:356:1;47065:68:0;49254:5:::1;:19:::0;49182:99::o;50857:155::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;50984:20:0;50996:7;50984:11;:20::i;32135:104::-;32191:13;32224:7;32217:14;;;;;:::i;33754:279::-;-1:-1:-1;;;;;33845:24:0;;24013:10;33845:24;33841:54;;;33878:17;;;;;;;;;;;;;;33841:54;24013:10;33908:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;33908:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;33908:53:0;;;;;;;;;;33977:48;;586:41:1;;;33908:42:0;;24013:10;33977:48;;559:18:1;33977:48:0;;;;;;;33754:279;;:::o;48963:211::-;46899:7;46926:6;-1:-1:-1;;;;;46926:6:0;24013:10;47073:23;47065:68;;;;-1:-1:-1;;;47065:68:0;;6746:2:1;47065:68:0;;;6728:21:1;;;6765:18;;;6758:30;6824:34;6804:18;;;6797:62;6876:18;;47065:68:0;6544:356:1;47065:68:0;49075:14:::1;;49055:17;:34;49047:74;;;::::0;-1:-1:-1;;;49047:74:0;;8525:2:1;49047:74:0::1;::::0;::::1;8507:21:1::0;8564:2;8544:18;;;8537:30;8603:29;8583:18;;;8576:57;8650:18;;49047:74:0::1;8323:351:1::0;49047:74:0::1;49132:14;:34:::0;48963:211::o;34832:369::-;34999:28;35009:4;35015:2;35019:7;34999:9;:28::i;:::-;-1:-1:-1;;;;;35042:13:0;;1664:19;:23;;35042:76;;;;;35062:56;35093:4;35099:2;35103:7;35112:5;35062:30;:56::i;:::-;35061:57;35042:76;35038:156;;;35142:40;;;;;;;;;;;;;;35038:156;34832:369;;;;:::o;32310:327::-;32383:13;32414:16;32422:7;32414;:16::i;:::-;32409:59;;32439:29;;;;;;;;;;;;;;32409:59;32481:21;32505:10;:8;:10::i;:::-;32481:34;;32539:7;32533:21;32558:1;32533:26;;:96;;;;;;;;;;;;;;;;;32586:7;32595:18;:7;:16;:18::i;:::-;32569:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32533:96;32526:103;32310:327;-1:-1:-1;;;32310:327:0:o;50736:113::-;50794:7;50821:20;50835:5;50821:13;:20::i;49289:262::-;48902:12;;;;48894:41;;;;-1:-1:-1;;;48894:41:0;;9523:2:1;48894:41:0;;;9505:21:1;9562:2;9542:18;;;9535:30;9601:18;9581;;;9574:46;9637:18;;48894:41:0;9321:340:1;48894:41:0;49400:14:::1;::::0;28196:12;;27757:1;28180:13;49388:8;;28180:28;;-1:-1:-1;;28180:46:0;49372:24:::1;;;;:::i;:::-;:42;;49364:63;;;::::0;-1:-1:-1;;;49364:63:0;;10001:2:1;49364:63:0::1;::::0;::::1;9983:21:1::0;10040:1;10020:18;;;10013:29;10078:10;10058:18;;;10051:38;10106:18;;49364:63:0::1;9799:331:1::0;49364:63:0::1;49467:8;49459:5;;:16;;;;:::i;:::-;49446:9;:29;;49438:63;;;::::0;-1:-1:-1;;;49438:63:0;;10570:2:1;49438:63:0::1;::::0;::::1;10552:21:1::0;10609:2;10589:18;;;10582:30;10648:23;10628:18;;;10621:51;10689:18;;49438:63:0::1;10368:345:1::0;49438:63:0::1;49512:31;49522:10;49534:8;49512:9;:31::i;:::-;49289:262:::0;:::o;47762:201::-;46899:7;46926:6;-1:-1:-1;;;;;46926:6:0;24013:10;47073:23;47065:68;;;;-1:-1:-1;;;47065:68:0;;6746:2:1;47065:68:0;;;6728:21:1;;;6765:18;;;6758:30;6824:34;6804:18;;;6797:62;6876:18;;47065:68:0;6544:356:1;47065:68:0;-1:-1:-1;;;;;47851:22:0;::::1;47843:73;;;::::0;-1:-1:-1;;;47843:73:0;;10920:2:1;47843:73:0::1;::::0;::::1;10902:21:1::0;10959:2;10939:18;;;10932:30;10998:34;10978:18;;;10971:62;11069:8;11049:18;;;11042:36;11095:19;;47843:73:0::1;10718:402:1::0;47843:73:0::1;47927:28;47946:8;47927:18;:28::i;35456:183::-:0;35513:4;35556:7;27757:1;35537:26;;:53;;;;;35577:13;;35567:7;:23;35537:53;:94;;;;-1:-1:-1;;35604:20:0;;;;:11;:20;;;;;:27;;;;;;35603:28;;35456:183::o;42807:196::-;42922:24;;;;:15;:24;;;;;;:29;;;;-1:-1:-1;;;;;42922:29:0;;;;;;;;;42967:28;;42922:24;;42967:28;;;;;;;42807:196;;;:::o;38473:2036::-;38588:35;38626:20;38638:7;38626:11;:20::i;:::-;38701:18;;38588:58;;-1:-1:-1;38659:22:0;;-1:-1:-1;;;;;38685:34:0;24013:10;-1:-1:-1;;;;;38685:34:0;;:97;;;-1:-1:-1;38749:18:0;;38732:50;;24013:10;34104:164;:::i;38732:50::-;38685:146;;;-1:-1:-1;24013:10:0;38795:20;38807:7;38795:11;:20::i;:::-;-1:-1:-1;;;;;38795:36:0;;38685:146;38659:173;;38850:17;38845:66;;38876:35;;;;;;;;;;;;;;38845:66;38948:4;-1:-1:-1;;;;;38926:26:0;:13;:18;;;-1:-1:-1;;;;;38926:26:0;;38922:67;;38961:28;;;;;;;;;;;;;;38922:67;-1:-1:-1;;;;;39004:16:0;;39000:52;;39029:23;;;;;;;;;;;;;;39000:52;39173:49;39190:1;39194:7;39203:13;:18;;;39173:8;:49::i;:::-;-1:-1:-1;;;;;39510:18:0;;;;;;;:12;:18;;;;;;;;:31;;;;;;;;;;-1:-1:-1;;39510:31:0;;;;;;;39552:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;39552:29:0;;;;;;;;;;;39594:20;;;:11;:20;;;;;;:30;;39635:61;;;;;;39680:15;39635:61;;;;;;;;;;;39958:11;;;39984:24;;;;;:29;39958:11;;39984:29;39980:417;;40197:13;;40183:11;:27;40179:207;;;40263:18;;;40231:24;;;:11;:24;;;;;;;;:50;;40342:28;;;;40300:70;;;;;;;;-1:-1:-1;;;;;40231:50:0;;;40300:70;;;;;;;40179:207;39489:915;40440:7;40436:2;-1:-1:-1;;;;;40421:27:0;40430:4;-1:-1:-1;;;;;40421:27:0;;;;;;;;;;;40459:42;38577:1932;;38473:2036;;;:::o;30689:1024::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;30799:7:0;;27757:1;30840:23;;:47;;;;;30874:13;;30867:4;:20;30840:47;30836:814;;;30904:31;30938:17;;;:11;:17;;;;;;;;;30904:51;;;;;;;;;-1:-1:-1;;;;;30904:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30970:669;;31016:14;;-1:-1:-1;;;;;31016:28:0;;31012:93;;31076:9;30689:1024;-1:-1:-1;;;30689:1024:0:o;31012:93::-;-1:-1:-1;;;31423:6:0;31464:17;;;;:11;:17;;;;;;;;;31452:29;;;;;;;;;-1:-1:-1;;;;;31452:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31508:28;31504:101;;31572:9;30689:1024;-1:-1:-1;;;30689:1024:0:o;31504:101::-;31387:237;;;30889:761;30836:814;31674:31;;;;;;;;;;;;;;48123:191;48197:16;48216:6;;-1:-1:-1;;;;;48233:17:0;;;;;;;;;;48266:40;;48216:6;;;;;;;48266:40;;48197:16;48266:40;48186:128;48123:191;:::o;43495:667::-;43679:72;;;;;43658:4;;-1:-1:-1;;;;;43679:36:0;;;;;:72;;24013:10;;43730:4;;43736:7;;43745:5;;43679:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43679:72:0;;;;;;;;-1:-1:-1;;43679:72:0;;;;;;;;;;;;:::i;:::-;;;43675:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43913:13:0;;43909:235;;43959:40;;;;;;;;;;;;;;43909:235;44102:6;44096:13;44087:6;44083:2;44079:15;44072:38;43675:480;43798:55;;43808:45;43798:55;;-1:-1:-1;43675:480:0;43495:667;;;;;;:::o;49616:114::-;49676:13;49709;49702:20;;;;;:::i;18736:723::-;18792:13;19013:10;19009:53;;-1:-1:-1;;19040:10:0;;;;;;;;;;;;;;;;;;18736:723::o;19009:53::-;19087:5;19072:12;19128:78;19135:9;;19128:78;;19161:8;;;;:::i;:::-;;-1:-1:-1;19184:10:0;;-1:-1:-1;19192:2:0;19184:10;;:::i;:::-;;;19128:78;;;19216:19;19248:6;19238:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19238:17:0;;19216:39;;19266:154;19273:10;;19266:154;;19300:11;19310:1;19300:11;;:::i;:::-;;-1:-1:-1;19369:10:0;19377:2;19369:5;:10;:::i;:::-;19356:24;;:2;:24;:::i;:::-;19343:39;;19326:6;19333;19326:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;19397:11:0;19406:2;19397:11;;:::i;:::-;;;19266:154;;29322:207;29383:7;-1:-1:-1;;;;;29407:19:0;;29403:59;;29435:27;;;;;;;;;;;;;;29403:59;-1:-1:-1;;;;;;29488:19:0;;;;;:12;:19;;;;;:32;;;;;;;29322:207::o;35647:104::-;35716:27;35726:2;35730:8;35716:27;;;;;;;;;;;;:9;:27::i;:::-;35647:104;;:::o;36114:163::-;36237:32;36243:2;36247:8;36257:5;36264:4;36698:13;;-1:-1:-1;;;;;36726:16:0;;36722:48;;36751:19;;;;;;;;;;;;;;36722:48;36785:13;36781:44;;36807:18;;;;;;;;;;;;;;36781:44;-1:-1:-1;;;;;37168:16:0;;;;;;:12;:16;;;;;;;;:44;;37223:49;;;37168:44;;;;;;;;37223:49;;;;37168:44;;;;;;;37223:49;;;;;;;;;;;;;;;;37285:25;;;:11;:25;;;;;;:35;;37331:66;;;;;;37381:15;37331:66;;;;;;;;;;37285:25;37470:23;;;37510:4;:23;;;;-1:-1:-1;;;;;;37518:13:0;;1664:19;:23;;37518:15;37506:589;;;37550:294;37577:38;;37602:12;;-1:-1:-1;;;;;37577:38:0;;;37594:1;;37577:38;;37594:1;;37577:38;37639:69;37678:1;37682:2;37686:14;;;;;;37702:5;37639:30;:69::i;:::-;37634:166;;37740:40;;;;;;;;;;;;;;37634:166;37839:3;37823:12;:19;;37550:294;;37917:12;37900:13;;:29;37896:43;;37931:8;;;37896:43;37506:589;;;37972:112;37999:40;;38024:14;;;;;-1:-1:-1;;;;;37999:40:0;;;38016:1;;37999:40;;38016:1;;37999:40;38079:3;38063:12;:19;;37972:112;;37506:589;-1:-1:-1;38105:13:0;:28;38151:60;34832:369;-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;-1:-1:-1;;1116:88:1;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:196::-;1932:20;;-1:-1:-1;;;;;1981:54:1;;1971:65;;1961:93;;2050:1;2047;2040:12;1961:93;1864:196;;;:::o;2065:254::-;2133:6;2141;2194:2;2182:9;2173:7;2169:23;2165:32;2162:52;;;2210:1;2207;2200:12;2162:52;2233:29;2252:9;2233:29;:::i;:::-;2223:39;2309:2;2294:18;;;;2281:32;;-1:-1:-1;;;2065:254:1:o;2506:328::-;2583:6;2591;2599;2652:2;2640:9;2631:7;2627:23;2623:32;2620:52;;;2668:1;2665;2658:12;2620:52;2691:29;2710:9;2691:29;:::i;:::-;2681:39;;2739:38;2773:2;2762:9;2758:18;2739:38;:::i;:::-;2729:48;;2824:2;2813:9;2809:18;2796:32;2786:42;;2506:328;;;;;:::o;2839:592::-;2910:6;2918;2971:2;2959:9;2950:7;2946:23;2942:32;2939:52;;;2987:1;2984;2977:12;2939:52;3027:9;3014:23;3056:18;3097:2;3089:6;3086:14;3083:34;;;3113:1;3110;3103:12;3083:34;3151:6;3140:9;3136:22;3126:32;;3196:7;3189:4;3185:2;3181:13;3177:27;3167:55;;3218:1;3215;3208:12;3167:55;3258:2;3245:16;3284:2;3276:6;3273:14;3270:34;;;3300:1;3297;3290:12;3270:34;3345:7;3340:2;3331:6;3327:2;3323:15;3319:24;3316:37;3313:57;;;3366:1;3363;3356:12;3313:57;3397:2;3389:11;;;;;3419:6;;-1:-1:-1;2839:592:1;;-1:-1:-1;;;;2839:592:1:o;3436:186::-;3495:6;3548:2;3536:9;3527:7;3523:23;3519:32;3516:52;;;3564:1;3561;3554:12;3516:52;3587:29;3606:9;3587:29;:::i;4094:347::-;4159:6;4167;4220:2;4208:9;4199:7;4195:23;4191:32;4188:52;;;4236:1;4233;4226:12;4188:52;4259:29;4278:9;4259:29;:::i;:::-;4249:39;;4338:2;4327:9;4323:18;4310:32;4385:5;4378:13;4371:21;4364:5;4361:32;4351:60;;4407:1;4404;4397:12;4351:60;4430:5;4420:15;;;4094:347;;;;;:::o;4446:184::-;4498:77;4495:1;4488:88;4595:4;4592:1;4585:15;4619:4;4616:1;4609:15;4635:1197;4730:6;4738;4746;4754;4807:3;4795:9;4786:7;4782:23;4778:33;4775:53;;;4824:1;4821;4814:12;4775:53;4847:29;4866:9;4847:29;:::i;:::-;4837:39;;4895:38;4929:2;4918:9;4914:18;4895:38;:::i;:::-;4885:48;;4980:2;4969:9;4965:18;4952:32;4942:42;;5035:2;5024:9;5020:18;5007:32;5058:18;5099:2;5091:6;5088:14;5085:34;;;5115:1;5112;5105:12;5085:34;5153:6;5142:9;5138:22;5128:32;;5198:7;5191:4;5187:2;5183:13;5179:27;5169:55;;5220:1;5217;5210:12;5169:55;5256:2;5243:16;5278:2;5274;5271:10;5268:36;;;5284:18;;:::i;:::-;5418:2;5412:9;5480:4;5472:13;;-1:-1:-1;;5468:22:1;;;5492:2;5464:31;5460:40;5448:53;;;5516:18;;;5536:22;;;5513:46;5510:72;;;5562:18;;:::i;:::-;5602:10;5598:2;5591:22;5637:2;5629:6;5622:18;5677:7;5672:2;5667;5663;5659:11;5655:20;5652:33;5649:53;;;5698:1;5695;5688:12;5649:53;5754:2;5749;5745;5741:11;5736:2;5728:6;5724:15;5711:46;5799:1;5794:2;5789;5781:6;5777:15;5773:24;5766:35;5820:6;5810:16;;;;;;;4635:1197;;;;;;;:::o;5837:260::-;5905:6;5913;5966:2;5954:9;5945:7;5941:23;5937:32;5934:52;;;5982:1;5979;5972:12;5934:52;6005:29;6024:9;6005:29;:::i;:::-;5995:39;;6053:38;6087:2;6076:9;6072:18;6053:38;:::i;:::-;6043:48;;5837:260;;;;;:::o;6102:437::-;6181:1;6177:12;;;;6224;;;6245:61;;6299:4;6291:6;6287:17;6277:27;;6245:61;6352:2;6344:6;6341:14;6321:18;6318:38;6315:218;;;6389:77;6386:1;6379:88;6490:4;6487:1;6480:15;6518:4;6515:1;6508:15;6315:218;;6102:437;;;:::o;7265:184::-;7317:77;7314:1;7307:88;7414:4;7411:1;7404:15;7438:4;7435:1;7428:15;7454:184;7506:77;7503:1;7496:88;7603:4;7600:1;7593:15;7627:4;7624:1;7617:15;7643:120;7683:1;7709;7699:35;;7714:18;;:::i;:::-;-1:-1:-1;7748:9:1;;7643:120::o;8679:637::-;8959:3;8997:6;8991:13;9013:53;9059:6;9054:3;9047:4;9039:6;9035:17;9013:53;:::i;:::-;9129:13;;9088:16;;;;9151:57;9129:13;9088:16;9185:4;9173:17;;9151:57;:::i;:::-;9273:7;9230:20;;9259:22;;;9308:1;9297:13;;8679:637;-1:-1:-1;;;;8679:637:1:o;9666:128::-;9706:3;9737:1;9733:6;9730:1;9727:13;9724:39;;;9743:18;;:::i;:::-;-1:-1:-1;9779:9:1;;9666:128::o;10135:228::-;10175:7;10301:1;-1:-1:-1;;10229:74:1;10226:1;10223:81;10218:1;10211:9;10204:17;10200:105;10197:131;;;10308:18;;:::i;:::-;-1:-1:-1;10348:9:1;;10135:228::o;11125:512::-;11319:4;-1:-1:-1;;;;;11429:2:1;11421:6;11417:15;11406:9;11399:34;11481:2;11473:6;11469:15;11464:2;11453:9;11449:18;11442:43;;11521:6;11516:2;11505:9;11501:18;11494:34;11564:3;11559:2;11548:9;11544:18;11537:31;11585:46;11626:3;11615:9;11611:19;11603:6;11585:46;:::i;:::-;11577:54;11125:512;-1:-1:-1;;;;;;11125:512:1:o;11642:249::-;11711:6;11764:2;11752:9;11743:7;11739:23;11735:32;11732:52;;;11780:1;11777;11770:12;11732:52;11812:9;11806:16;11831:30;11855:5;11831:30;:::i;11896:195::-;11935:3;-1:-1:-1;;11959:5:1;11956:77;11953:103;;;12036:18;;:::i;:::-;-1:-1:-1;12083:1:1;12072:13;;11896:195::o;12096:125::-;12136:4;12164:1;12161;12158:8;12155:34;;;12169:18;;:::i;:::-;-1:-1:-1;12206:9:1;;12096:125::o;12226:112::-;12258:1;12284;12274:35;;12289:18;;:::i;:::-;-1:-1:-1;12323:9:1;;12226:112::o;12343:184::-;12395:77;12392:1;12385:88;12492:4;12489:1;12482:15;12516:4;12513:1;12506:15

Swarm Source

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