ETH Price: $3,292.56 (+1.32%)
Gas: 2 Gwei

Token

BirdsFlowers (BirdsFlowers)
 

Overview

Max Total Supply

800 BirdsFlowers

Holders

285

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
knightnah.eth
Balance
1 BirdsFlowers
0x47bA2d564d75677485638acfFe54A5CAB90807Fa
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:
BirdsFlowers

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-07-10
*/

// SPDX-License-Identifier: MIT

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

// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

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


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @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: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.7.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
                /// @solidity memory-safe-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 (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.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 (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

    /**
     * @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 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

// 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: 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 0;
    }

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

    /**
     * @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: contracts/nft.sol


contract BirdsFlowers is ERC721A, Ownable {
    
    uint256 public immutable mintPrice = 0.003 ether;
    uint32 public immutable maxSupply = 800;
    uint32 public immutable maxPerTx = 10;

    string  public uriPrefix = "ipfs://bafybeifmwi4qkeus4mmgwb223pkhuari27d7oh7xjawpmlw5visbv6tq3q/";
    mapping(address => bool) public freeMinted;

    modifier callerIsUser() {
        require(tx.origin == msg.sender, "The caller is another contract");
        _;
    }

    constructor()
    ERC721A ("BirdsFlowers", "BirdsFlowers") {
    }

    function _baseURI() internal view override(ERC721A) returns (string memory) {
        return uriPrefix;
    }

    function setUriPrefix(string memory uri) public onlyOwner {
        uriPrefix = uri;
    }

    function _startTokenId() internal view virtual override(ERC721A) returns (uint256) {
        return 0;
    }
    
    function publicMint(uint32 amount) public payable callerIsUser{
        require(totalSupply() + amount <= maxSupply,"sold out");
        require(amount <= maxPerTx,"exceed max amount");
        if(freeMinted[msg.sender])
        {
            require(msg.value >= amount * mintPrice,"insufficient");
        }
        else 
        {
            freeMinted[msg.sender] = true;
            require(msg.value >= (amount-1) * mintPrice,"insufficient");
        }
        _safeMint(msg.sender, amount);
    }

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

    function withdraw() public onlyOwner {
        uint256 sendAmount = address(this).balance;

        address h = payable(msg.sender);

        bool success;

        (success, ) = h.call{value: sendAmount}("");
        require(success, "Transaction Unsuccessful");
    }
}

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":"MintZeroQuantity","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":[{"internalType":"address","name":"","type":"address"}],"name":"freeMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintedFree","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"amount","type":"uint32"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setUriPrefix","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":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60e0604052660aa87bee53800060809081525061032063ffffffff1660a09063ffffffff16815250600a63ffffffff1660c09063ffffffff1681525060405180608001604052806043815260200162003c2260439139600990816200006591906200048f565b503480156200007357600080fd5b506040518060400160405280600c81526020017f4269726473466c6f7765727300000000000000000000000000000000000000008152506040518060400160405280600c81526020017f4269726473466c6f7765727300000000000000000000000000000000000000008152508160029081620000f191906200048f565b5080600390816200010391906200048f565b50620001146200014260201b60201c565b60008190555050506200013c620001306200014760201b60201c565b6200014f60201b60201c565b62000576565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200029757607f821691505b602082108103620002ad57620002ac6200024f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002d8565b620003238683620002d8565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003706200036a62000364846200033b565b62000345565b6200033b565b9050919050565b6000819050919050565b6200038c836200034f565b620003a46200039b8262000377565b848454620002e5565b825550505050565b600090565b620003bb620003ac565b620003c881848462000381565b505050565b5b81811015620003f057620003e4600082620003b1565b600181019050620003ce565b5050565b601f8211156200043f576200040981620002b3565b6200041484620002c8565b8101602085101562000424578190505b6200043c6200043385620002c8565b830182620003cd565b50505b505050565b600082821c905092915050565b6000620004646000198460080262000444565b1980831691505092915050565b60006200047f838362000451565b9150826002028217905092915050565b6200049a8262000215565b67ffffffffffffffff811115620004b657620004b562000220565b5b620004c282546200027e565b620004cf828285620003f4565b600060209050601f831160018114620005075760008415620004f2578287015190505b620004fe858262000471565b8655506200056e565b601f1984166200051786620002b3565b60005b8281101562000541578489015182556001820191506020850194506020810190506200051a565b868310156200056157848901516200055d601f89168262000451565b8355505b6001600288020188555050505b505050505050565b60805160a05160c051613660620005c26000396000818161110d01526113b6015260008181610f66015261108c015260008181610ab7015281816111ce015261129f01526136606000f3fe6080604052600436106101665760003560e01c80636e5cdc47116100d1578063b88d4fde1161008a578063e985e9c511610064578063e985e9c51461053e578063f151d7911461057b578063f2fde38b14610597578063f968adbe146105c057610166565b8063b88d4fde146104ad578063c87b56dd146104d6578063d5abeb011461051357610166565b80636e5cdc471461039d57806370a08231146103c85780637ec4a659146104055780638da5cb5b1461042e57806395d89b4114610459578063a22cb4651461048457610166565b8063389fcf0611610123578063389fcf061461028d5780633ccfd60b146102ca57806342842e0e146102e157806362b99ad41461030a5780636352211e146103355780636817c76c1461037257610166565b806301ffc9a71461016b57806306fdde03146101a8578063081812fc146101d3578063095ea7b31461021057806318160ddd1461023957806323b872dd14610264575b600080fd5b34801561017757600080fd5b50610192600480360381019061018d91906125c5565b6105eb565b60405161019f919061260d565b60405180910390f35b3480156101b457600080fd5b506101bd6106cd565b6040516101ca91906126b8565b60405180910390f35b3480156101df57600080fd5b506101fa60048036038101906101f59190612710565b61075f565b604051610207919061277e565b60405180910390f35b34801561021c57600080fd5b50610237600480360381019061023291906127c5565b6107db565b005b34801561024557600080fd5b5061024e6108e5565b60405161025b9190612814565b60405180910390f35b34801561027057600080fd5b5061028b6004803603810190610286919061282f565b6108fc565b005b34801561029957600080fd5b506102b460048036038101906102af9190612882565b61090c565b6040516102c1919061260d565b60405180910390f35b3480156102d657600080fd5b506102df61092c565b005b3480156102ed57600080fd5b506103086004803603810190610303919061282f565b6109f1565b005b34801561031657600080fd5b5061031f610a11565b60405161032c91906126b8565b60405180910390f35b34801561034157600080fd5b5061035c60048036038101906103579190612710565b610a9f565b604051610369919061277e565b60405180910390f35b34801561037e57600080fd5b50610387610ab5565b6040516103949190612814565b60405180910390f35b3480156103a957600080fd5b506103b2610ad9565b6040516103bf919061260d565b60405180910390f35b3480156103d457600080fd5b506103ef60048036038101906103ea9190612882565b610b2d565b6040516103fc9190612814565b60405180910390f35b34801561041157600080fd5b5061042c600480360381019061042791906129e4565b610bfc565b005b34801561043a57600080fd5b50610443610c17565b604051610450919061277e565b60405180910390f35b34801561046557600080fd5b5061046e610c41565b60405161047b91906126b8565b60405180910390f35b34801561049057600080fd5b506104ab60048036038101906104a69190612a59565b610cd3565b005b3480156104b957600080fd5b506104d460048036038101906104cf9190612b3a565b610e4a565b005b3480156104e257600080fd5b506104fd60048036038101906104f89190612710565b610ec6565b60405161050a91906126b8565b60405180910390f35b34801561051f57600080fd5b50610528610f64565b6040516105359190612bdc565b60405180910390f35b34801561054a57600080fd5b5061056560048036038101906105609190612bf7565b610f88565b604051610572919061260d565b60405180910390f35b61059560048036038101906105909190612c63565b61101c565b005b3480156105a357600080fd5b506105be60048036038101906105b99190612882565b611331565b005b3480156105cc57600080fd5b506105d56113b4565b6040516105e29190612bdc565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106b657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106c657506106c5826113d8565b5b9050919050565b6060600280546106dc90612cbf565b80601f016020809104026020016040519081016040528092919081815260200182805461070890612cbf565b80156107555780601f1061072a57610100808354040283529160200191610755565b820191906000526020600020905b81548152906001019060200180831161073857829003601f168201915b5050505050905090565b600061076a82611442565b6107a0576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107e682610a9f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361084d576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661086c611490565b73ffffffffffffffffffffffffffffffffffffffff161415801561089e575061089c81610897611490565b610f88565b155b156108d5576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108e0838383611498565b505050565b60006108ef61154a565b6001546000540303905090565b61090783838361154f565b505050565b600a6020528060005260406000206000915054906101000a900460ff1681565b610934611a3e565b6000479050600033905060008173ffffffffffffffffffffffffffffffffffffffff168360405161096490612d21565b60006040518083038185875af1925050503d80600081146109a1576040519150601f19603f3d011682016040523d82523d6000602084013e6109a6565b606091505b505080915050806109ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e390612d82565b60405180910390fd5b505050565b610a0c83838360405180602001604052806000815250610e4a565b505050565b60098054610a1e90612cbf565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4a90612cbf565b8015610a975780601f10610a6c57610100808354040283529160200191610a97565b820191906000526020600020905b815481529060010190602001808311610a7a57829003601f168201915b505050505081565b6000610aaa82611abc565b600001519050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b94576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610c04611a3e565b8060099081610c139190612f4e565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610c5090612cbf565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7c90612cbf565b8015610cc95780601f10610c9e57610100808354040283529160200191610cc9565b820191906000526020600020905b815481529060010190602001808311610cac57829003601f168201915b5050505050905090565b610cdb611490565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d3f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610d4c611490565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610df9611490565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610e3e919061260d565b60405180910390a35050565b610e5584848461154f565b610e748373ffffffffffffffffffffffffffffffffffffffff16611d4b565b8015610e895750610e8784848484611d6e565b155b15610ec0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060610ed182611442565b610f07576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610f11611ebe565b90506000815103610f315760405180602001604052806000815250610f5c565b80610f3b84611f50565b604051602001610f4c92919061305c565b6040516020818303038152906040525b915050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461108a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611081906130cc565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff168163ffffffff166110c06108e5565b6110ca919061311b565b111561110b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111029061319b565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff168163ffffffff16111561117a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117190613207565b60405180910390fd5b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611245577f00000000000000000000000000000000000000000000000000000000000000008163ffffffff166111fe9190613227565b341015611240576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611237906132b5565b60405180910390fd5b61131e565b6001600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f00000000000000000000000000000000000000000000000000000000000000006001826112cb91906132d5565b63ffffffff166112db9190613227565b34101561131d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611314906132b5565b60405180910390fd5b5b61132e338263ffffffff166120b0565b50565b611339611a3e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036113a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139f9061337f565b60405180910390fd5b6113b1816120ce565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161144d61154a565b1115801561145c575060005482105b8015611489575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061155a82611abc565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611581611490565b73ffffffffffffffffffffffffffffffffffffffff1614806115b457506115b382600001516115ae611490565b610f88565b5b806115f957506115c2611490565b73ffffffffffffffffffffffffffffffffffffffff166115e18461075f565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611632576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461169b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611701576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61170e8585856001612194565b61171e6000848460000151611498565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036119ce576000548110156119cd5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611a37858585600161219a565b5050505050565b611a46611490565b73ffffffffffffffffffffffffffffffffffffffff16611a64610c17565b73ffffffffffffffffffffffffffffffffffffffff1614611aba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab1906133eb565b60405180910390fd5b565b611ac4612516565b600082905080611ad261154a565b11158015611ae1575060005481105b15611d14576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611d1257600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611bf6578092505050611d46565b5b600115611d1157818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611d0c578092505050611d46565b611bf7565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611d94611490565b8786866040518563ffffffff1660e01b8152600401611db69493929190613460565b6020604051808303816000875af1925050508015611df257506040513d601f19601f82011682018060405250810190611def91906134c1565b60015b611e6b573d8060008114611e22576040519150601f19603f3d011682016040523d82523d6000602084013e611e27565b606091505b506000815103611e63576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054611ecd90612cbf565b80601f0160208091040260200160405190810160405280929190818152602001828054611ef990612cbf565b8015611f465780601f10611f1b57610100808354040283529160200191611f46565b820191906000526020600020905b815481529060010190602001808311611f2957829003601f168201915b5050505050905090565b606060008203611f97576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506120ab565b600082905060005b60008214611fc9578080611fb2906134ee565b915050600a82611fc29190613565565b9150611f9f565b60008167ffffffffffffffff811115611fe557611fe46128b9565b5b6040519080825280601f01601f1916602001820160405280156120175781602001600182028036833780820191505090505b5090505b600085146120a4576001826120309190613596565b9150600a8561203f91906135ca565b603061204b919061311b565b60f81b818381518110612061576120606135fb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561209d9190613565565b945061201b565b8093505050505b919050565b6120ca8282604051806020016040528060008152506121a0565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b50505050565b50505050565b6121ad83838360016121b2565b505050565b600080549050600084036121f2576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121ff6000868387612194565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156123c957506123c88773ffffffffffffffffffffffffffffffffffffffff16611d4b565b5b1561248e575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461243e6000888480600101955088611d6e565b612474576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082036123cf57826000541461248957600080fd5b6124f9565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480820361248f575b81600081905550505061250f600086838761219a565b5050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6125a28161256d565b81146125ad57600080fd5b50565b6000813590506125bf81612599565b92915050565b6000602082840312156125db576125da612563565b5b60006125e9848285016125b0565b91505092915050565b60008115159050919050565b612607816125f2565b82525050565b600060208201905061262260008301846125fe565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612662578082015181840152602081019050612647565b60008484015250505050565b6000601f19601f8301169050919050565b600061268a82612628565b6126948185612633565b93506126a4818560208601612644565b6126ad8161266e565b840191505092915050565b600060208201905081810360008301526126d2818461267f565b905092915050565b6000819050919050565b6126ed816126da565b81146126f857600080fd5b50565b60008135905061270a816126e4565b92915050565b60006020828403121561272657612725612563565b5b6000612734848285016126fb565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127688261273d565b9050919050565b6127788161275d565b82525050565b6000602082019050612793600083018461276f565b92915050565b6127a28161275d565b81146127ad57600080fd5b50565b6000813590506127bf81612799565b92915050565b600080604083850312156127dc576127db612563565b5b60006127ea858286016127b0565b92505060206127fb858286016126fb565b9150509250929050565b61280e816126da565b82525050565b60006020820190506128296000830184612805565b92915050565b60008060006060848603121561284857612847612563565b5b6000612856868287016127b0565b9350506020612867868287016127b0565b9250506040612878868287016126fb565b9150509250925092565b60006020828403121561289857612897612563565b5b60006128a6848285016127b0565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6128f18261266e565b810181811067ffffffffffffffff821117156129105761290f6128b9565b5b80604052505050565b6000612923612559565b905061292f82826128e8565b919050565b600067ffffffffffffffff82111561294f5761294e6128b9565b5b6129588261266e565b9050602081019050919050565b82818337600083830152505050565b600061298761298284612934565b612919565b9050828152602081018484840111156129a3576129a26128b4565b5b6129ae848285612965565b509392505050565b600082601f8301126129cb576129ca6128af565b5b81356129db848260208601612974565b91505092915050565b6000602082840312156129fa576129f9612563565b5b600082013567ffffffffffffffff811115612a1857612a17612568565b5b612a24848285016129b6565b91505092915050565b612a36816125f2565b8114612a4157600080fd5b50565b600081359050612a5381612a2d565b92915050565b60008060408385031215612a7057612a6f612563565b5b6000612a7e858286016127b0565b9250506020612a8f85828601612a44565b9150509250929050565b600067ffffffffffffffff821115612ab457612ab36128b9565b5b612abd8261266e565b9050602081019050919050565b6000612add612ad884612a99565b612919565b905082815260208101848484011115612af957612af86128b4565b5b612b04848285612965565b509392505050565b600082601f830112612b2157612b206128af565b5b8135612b31848260208601612aca565b91505092915050565b60008060008060808587031215612b5457612b53612563565b5b6000612b62878288016127b0565b9450506020612b73878288016127b0565b9350506040612b84878288016126fb565b925050606085013567ffffffffffffffff811115612ba557612ba4612568565b5b612bb187828801612b0c565b91505092959194509250565b600063ffffffff82169050919050565b612bd681612bbd565b82525050565b6000602082019050612bf16000830184612bcd565b92915050565b60008060408385031215612c0e57612c0d612563565b5b6000612c1c858286016127b0565b9250506020612c2d858286016127b0565b9150509250929050565b612c4081612bbd565b8114612c4b57600080fd5b50565b600081359050612c5d81612c37565b92915050565b600060208284031215612c7957612c78612563565b5b6000612c8784828501612c4e565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612cd757607f821691505b602082108103612cea57612ce9612c90565b5b50919050565b600081905092915050565b50565b6000612d0b600083612cf0565b9150612d1682612cfb565b600082019050919050565b6000612d2c82612cfe565b9150819050919050565b7f5472616e73616374696f6e20556e7375636365737366756c0000000000000000600082015250565b6000612d6c601883612633565b9150612d7782612d36565b602082019050919050565b60006020820190508181036000830152612d9b81612d5f565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612e047fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612dc7565b612e0e8683612dc7565b95508019841693508086168417925050509392505050565b6000819050919050565b6000612e4b612e46612e41846126da565b612e26565b6126da565b9050919050565b6000819050919050565b612e6583612e30565b612e79612e7182612e52565b848454612dd4565b825550505050565b600090565b612e8e612e81565b612e99818484612e5c565b505050565b5b81811015612ebd57612eb2600082612e86565b600181019050612e9f565b5050565b601f821115612f0257612ed381612da2565b612edc84612db7565b81016020851015612eeb578190505b612eff612ef785612db7565b830182612e9e565b50505b505050565b600082821c905092915050565b6000612f2560001984600802612f07565b1980831691505092915050565b6000612f3e8383612f14565b9150826002028217905092915050565b612f5782612628565b67ffffffffffffffff811115612f7057612f6f6128b9565b5b612f7a8254612cbf565b612f85828285612ec1565b600060209050601f831160018114612fb85760008415612fa6578287015190505b612fb08582612f32565b865550613018565b601f198416612fc686612da2565b60005b82811015612fee57848901518255600182019150602085019450602081019050612fc9565b8683101561300b5784890151613007601f891682612f14565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b600061303682612628565b6130408185613020565b9350613050818560208601612644565b80840191505092915050565b6000613068828561302b565b9150613074828461302b565b91508190509392505050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b60006130b6601e83612633565b91506130c182613080565b602082019050919050565b600060208201905081810360008301526130e5816130a9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613126826126da565b9150613131836126da565b9250828201905080821115613149576131486130ec565b5b92915050565b7f736f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b6000613185600883612633565b91506131908261314f565b602082019050919050565b600060208201905081810360008301526131b481613178565b9050919050565b7f657863656564206d617820616d6f756e74000000000000000000000000000000600082015250565b60006131f1601183612633565b91506131fc826131bb565b602082019050919050565b60006020820190508181036000830152613220816131e4565b9050919050565b6000613232826126da565b915061323d836126da565b925082820261324b816126da565b91508282048414831517613262576132616130ec565b5b5092915050565b7f696e73756666696369656e740000000000000000000000000000000000000000600082015250565b600061329f600c83612633565b91506132aa82613269565b602082019050919050565b600060208201905081810360008301526132ce81613292565b9050919050565b60006132e082612bbd565b91506132eb83612bbd565b9250828203905063ffffffff811115613307576133066130ec565b5b92915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613369602683612633565b91506133748261330d565b604082019050919050565b600060208201905081810360008301526133988161335c565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006133d5602083612633565b91506133e08261339f565b602082019050919050565b60006020820190508181036000830152613404816133c8565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006134328261340b565b61343c8185613416565b935061344c818560208601612644565b6134558161266e565b840191505092915050565b6000608082019050613475600083018761276f565b613482602083018661276f565b61348f6040830185612805565b81810360608301526134a18184613427565b905095945050505050565b6000815190506134bb81612599565b92915050565b6000602082840312156134d7576134d6612563565b5b60006134e5848285016134ac565b91505092915050565b60006134f9826126da565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361352b5761352a6130ec565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613570826126da565b915061357b836126da565b92508261358b5761358a613536565b5b828204905092915050565b60006135a1826126da565b91506135ac836126da565b92508282039050818111156135c4576135c36130ec565b5b92915050565b60006135d5826126da565b91506135e0836126da565b9250826135f0576135ef613536565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea26469706673582212204242225f149228bf383e733f9ffe06991c04bc1bd140f9d15085b498803547e564736f6c63430008120033697066733a2f2f62616679626569666d776934716b657573346d6d677762323233706b6875617269323764376f6837786a6177706d6c7735766973627636747133712f

Deployed Bytecode

0x6080604052600436106101665760003560e01c80636e5cdc47116100d1578063b88d4fde1161008a578063e985e9c511610064578063e985e9c51461053e578063f151d7911461057b578063f2fde38b14610597578063f968adbe146105c057610166565b8063b88d4fde146104ad578063c87b56dd146104d6578063d5abeb011461051357610166565b80636e5cdc471461039d57806370a08231146103c85780637ec4a659146104055780638da5cb5b1461042e57806395d89b4114610459578063a22cb4651461048457610166565b8063389fcf0611610123578063389fcf061461028d5780633ccfd60b146102ca57806342842e0e146102e157806362b99ad41461030a5780636352211e146103355780636817c76c1461037257610166565b806301ffc9a71461016b57806306fdde03146101a8578063081812fc146101d3578063095ea7b31461021057806318160ddd1461023957806323b872dd14610264575b600080fd5b34801561017757600080fd5b50610192600480360381019061018d91906125c5565b6105eb565b60405161019f919061260d565b60405180910390f35b3480156101b457600080fd5b506101bd6106cd565b6040516101ca91906126b8565b60405180910390f35b3480156101df57600080fd5b506101fa60048036038101906101f59190612710565b61075f565b604051610207919061277e565b60405180910390f35b34801561021c57600080fd5b50610237600480360381019061023291906127c5565b6107db565b005b34801561024557600080fd5b5061024e6108e5565b60405161025b9190612814565b60405180910390f35b34801561027057600080fd5b5061028b6004803603810190610286919061282f565b6108fc565b005b34801561029957600080fd5b506102b460048036038101906102af9190612882565b61090c565b6040516102c1919061260d565b60405180910390f35b3480156102d657600080fd5b506102df61092c565b005b3480156102ed57600080fd5b506103086004803603810190610303919061282f565b6109f1565b005b34801561031657600080fd5b5061031f610a11565b60405161032c91906126b8565b60405180910390f35b34801561034157600080fd5b5061035c60048036038101906103579190612710565b610a9f565b604051610369919061277e565b60405180910390f35b34801561037e57600080fd5b50610387610ab5565b6040516103949190612814565b60405180910390f35b3480156103a957600080fd5b506103b2610ad9565b6040516103bf919061260d565b60405180910390f35b3480156103d457600080fd5b506103ef60048036038101906103ea9190612882565b610b2d565b6040516103fc9190612814565b60405180910390f35b34801561041157600080fd5b5061042c600480360381019061042791906129e4565b610bfc565b005b34801561043a57600080fd5b50610443610c17565b604051610450919061277e565b60405180910390f35b34801561046557600080fd5b5061046e610c41565b60405161047b91906126b8565b60405180910390f35b34801561049057600080fd5b506104ab60048036038101906104a69190612a59565b610cd3565b005b3480156104b957600080fd5b506104d460048036038101906104cf9190612b3a565b610e4a565b005b3480156104e257600080fd5b506104fd60048036038101906104f89190612710565b610ec6565b60405161050a91906126b8565b60405180910390f35b34801561051f57600080fd5b50610528610f64565b6040516105359190612bdc565b60405180910390f35b34801561054a57600080fd5b5061056560048036038101906105609190612bf7565b610f88565b604051610572919061260d565b60405180910390f35b61059560048036038101906105909190612c63565b61101c565b005b3480156105a357600080fd5b506105be60048036038101906105b99190612882565b611331565b005b3480156105cc57600080fd5b506105d56113b4565b6040516105e29190612bdc565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106b657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106c657506106c5826113d8565b5b9050919050565b6060600280546106dc90612cbf565b80601f016020809104026020016040519081016040528092919081815260200182805461070890612cbf565b80156107555780601f1061072a57610100808354040283529160200191610755565b820191906000526020600020905b81548152906001019060200180831161073857829003601f168201915b5050505050905090565b600061076a82611442565b6107a0576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107e682610a9f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361084d576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661086c611490565b73ffffffffffffffffffffffffffffffffffffffff161415801561089e575061089c81610897611490565b610f88565b155b156108d5576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108e0838383611498565b505050565b60006108ef61154a565b6001546000540303905090565b61090783838361154f565b505050565b600a6020528060005260406000206000915054906101000a900460ff1681565b610934611a3e565b6000479050600033905060008173ffffffffffffffffffffffffffffffffffffffff168360405161096490612d21565b60006040518083038185875af1925050503d80600081146109a1576040519150601f19603f3d011682016040523d82523d6000602084013e6109a6565b606091505b505080915050806109ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e390612d82565b60405180910390fd5b505050565b610a0c83838360405180602001604052806000815250610e4a565b505050565b60098054610a1e90612cbf565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4a90612cbf565b8015610a975780601f10610a6c57610100808354040283529160200191610a97565b820191906000526020600020905b815481529060010190602001808311610a7a57829003601f168201915b505050505081565b6000610aaa82611abc565b600001519050919050565b7f000000000000000000000000000000000000000000000000000aa87bee53800081565b6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b94576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610c04611a3e565b8060099081610c139190612f4e565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610c5090612cbf565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7c90612cbf565b8015610cc95780601f10610c9e57610100808354040283529160200191610cc9565b820191906000526020600020905b815481529060010190602001808311610cac57829003601f168201915b5050505050905090565b610cdb611490565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d3f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610d4c611490565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610df9611490565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610e3e919061260d565b60405180910390a35050565b610e5584848461154f565b610e748373ffffffffffffffffffffffffffffffffffffffff16611d4b565b8015610e895750610e8784848484611d6e565b155b15610ec0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060610ed182611442565b610f07576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610f11611ebe565b90506000815103610f315760405180602001604052806000815250610f5c565b80610f3b84611f50565b604051602001610f4c92919061305c565b6040516020818303038152906040525b915050919050565b7f000000000000000000000000000000000000000000000000000000000000032081565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461108a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611081906130cc565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000032063ffffffff168163ffffffff166110c06108e5565b6110ca919061311b565b111561110b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111029061319b565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000a63ffffffff168163ffffffff16111561117a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117190613207565b60405180910390fd5b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611245577f000000000000000000000000000000000000000000000000000aa87bee5380008163ffffffff166111fe9190613227565b341015611240576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611237906132b5565b60405180910390fd5b61131e565b6001600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f000000000000000000000000000000000000000000000000000aa87bee5380006001826112cb91906132d5565b63ffffffff166112db9190613227565b34101561131d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611314906132b5565b60405180910390fd5b5b61132e338263ffffffff166120b0565b50565b611339611a3e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036113a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139f9061337f565b60405180910390fd5b6113b1816120ce565b50565b7f000000000000000000000000000000000000000000000000000000000000000a81565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161144d61154a565b1115801561145c575060005482105b8015611489575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061155a82611abc565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611581611490565b73ffffffffffffffffffffffffffffffffffffffff1614806115b457506115b382600001516115ae611490565b610f88565b5b806115f957506115c2611490565b73ffffffffffffffffffffffffffffffffffffffff166115e18461075f565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611632576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461169b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611701576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61170e8585856001612194565b61171e6000848460000151611498565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036119ce576000548110156119cd5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611a37858585600161219a565b5050505050565b611a46611490565b73ffffffffffffffffffffffffffffffffffffffff16611a64610c17565b73ffffffffffffffffffffffffffffffffffffffff1614611aba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab1906133eb565b60405180910390fd5b565b611ac4612516565b600082905080611ad261154a565b11158015611ae1575060005481105b15611d14576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611d1257600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611bf6578092505050611d46565b5b600115611d1157818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611d0c578092505050611d46565b611bf7565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611d94611490565b8786866040518563ffffffff1660e01b8152600401611db69493929190613460565b6020604051808303816000875af1925050508015611df257506040513d601f19601f82011682018060405250810190611def91906134c1565b60015b611e6b573d8060008114611e22576040519150601f19603f3d011682016040523d82523d6000602084013e611e27565b606091505b506000815103611e63576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054611ecd90612cbf565b80601f0160208091040260200160405190810160405280929190818152602001828054611ef990612cbf565b8015611f465780601f10611f1b57610100808354040283529160200191611f46565b820191906000526020600020905b815481529060010190602001808311611f2957829003601f168201915b5050505050905090565b606060008203611f97576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506120ab565b600082905060005b60008214611fc9578080611fb2906134ee565b915050600a82611fc29190613565565b9150611f9f565b60008167ffffffffffffffff811115611fe557611fe46128b9565b5b6040519080825280601f01601f1916602001820160405280156120175781602001600182028036833780820191505090505b5090505b600085146120a4576001826120309190613596565b9150600a8561203f91906135ca565b603061204b919061311b565b60f81b818381518110612061576120606135fb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561209d9190613565565b945061201b565b8093505050505b919050565b6120ca8282604051806020016040528060008152506121a0565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b50505050565b50505050565b6121ad83838360016121b2565b505050565b600080549050600084036121f2576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121ff6000868387612194565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156123c957506123c88773ffffffffffffffffffffffffffffffffffffffff16611d4b565b5b1561248e575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461243e6000888480600101955088611d6e565b612474576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082036123cf57826000541461248957600080fd5b6124f9565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480820361248f575b81600081905550505061250f600086838761219a565b5050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6125a28161256d565b81146125ad57600080fd5b50565b6000813590506125bf81612599565b92915050565b6000602082840312156125db576125da612563565b5b60006125e9848285016125b0565b91505092915050565b60008115159050919050565b612607816125f2565b82525050565b600060208201905061262260008301846125fe565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612662578082015181840152602081019050612647565b60008484015250505050565b6000601f19601f8301169050919050565b600061268a82612628565b6126948185612633565b93506126a4818560208601612644565b6126ad8161266e565b840191505092915050565b600060208201905081810360008301526126d2818461267f565b905092915050565b6000819050919050565b6126ed816126da565b81146126f857600080fd5b50565b60008135905061270a816126e4565b92915050565b60006020828403121561272657612725612563565b5b6000612734848285016126fb565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127688261273d565b9050919050565b6127788161275d565b82525050565b6000602082019050612793600083018461276f565b92915050565b6127a28161275d565b81146127ad57600080fd5b50565b6000813590506127bf81612799565b92915050565b600080604083850312156127dc576127db612563565b5b60006127ea858286016127b0565b92505060206127fb858286016126fb565b9150509250929050565b61280e816126da565b82525050565b60006020820190506128296000830184612805565b92915050565b60008060006060848603121561284857612847612563565b5b6000612856868287016127b0565b9350506020612867868287016127b0565b9250506040612878868287016126fb565b9150509250925092565b60006020828403121561289857612897612563565b5b60006128a6848285016127b0565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6128f18261266e565b810181811067ffffffffffffffff821117156129105761290f6128b9565b5b80604052505050565b6000612923612559565b905061292f82826128e8565b919050565b600067ffffffffffffffff82111561294f5761294e6128b9565b5b6129588261266e565b9050602081019050919050565b82818337600083830152505050565b600061298761298284612934565b612919565b9050828152602081018484840111156129a3576129a26128b4565b5b6129ae848285612965565b509392505050565b600082601f8301126129cb576129ca6128af565b5b81356129db848260208601612974565b91505092915050565b6000602082840312156129fa576129f9612563565b5b600082013567ffffffffffffffff811115612a1857612a17612568565b5b612a24848285016129b6565b91505092915050565b612a36816125f2565b8114612a4157600080fd5b50565b600081359050612a5381612a2d565b92915050565b60008060408385031215612a7057612a6f612563565b5b6000612a7e858286016127b0565b9250506020612a8f85828601612a44565b9150509250929050565b600067ffffffffffffffff821115612ab457612ab36128b9565b5b612abd8261266e565b9050602081019050919050565b6000612add612ad884612a99565b612919565b905082815260208101848484011115612af957612af86128b4565b5b612b04848285612965565b509392505050565b600082601f830112612b2157612b206128af565b5b8135612b31848260208601612aca565b91505092915050565b60008060008060808587031215612b5457612b53612563565b5b6000612b62878288016127b0565b9450506020612b73878288016127b0565b9350506040612b84878288016126fb565b925050606085013567ffffffffffffffff811115612ba557612ba4612568565b5b612bb187828801612b0c565b91505092959194509250565b600063ffffffff82169050919050565b612bd681612bbd565b82525050565b6000602082019050612bf16000830184612bcd565b92915050565b60008060408385031215612c0e57612c0d612563565b5b6000612c1c858286016127b0565b9250506020612c2d858286016127b0565b9150509250929050565b612c4081612bbd565b8114612c4b57600080fd5b50565b600081359050612c5d81612c37565b92915050565b600060208284031215612c7957612c78612563565b5b6000612c8784828501612c4e565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612cd757607f821691505b602082108103612cea57612ce9612c90565b5b50919050565b600081905092915050565b50565b6000612d0b600083612cf0565b9150612d1682612cfb565b600082019050919050565b6000612d2c82612cfe565b9150819050919050565b7f5472616e73616374696f6e20556e7375636365737366756c0000000000000000600082015250565b6000612d6c601883612633565b9150612d7782612d36565b602082019050919050565b60006020820190508181036000830152612d9b81612d5f565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612e047fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612dc7565b612e0e8683612dc7565b95508019841693508086168417925050509392505050565b6000819050919050565b6000612e4b612e46612e41846126da565b612e26565b6126da565b9050919050565b6000819050919050565b612e6583612e30565b612e79612e7182612e52565b848454612dd4565b825550505050565b600090565b612e8e612e81565b612e99818484612e5c565b505050565b5b81811015612ebd57612eb2600082612e86565b600181019050612e9f565b5050565b601f821115612f0257612ed381612da2565b612edc84612db7565b81016020851015612eeb578190505b612eff612ef785612db7565b830182612e9e565b50505b505050565b600082821c905092915050565b6000612f2560001984600802612f07565b1980831691505092915050565b6000612f3e8383612f14565b9150826002028217905092915050565b612f5782612628565b67ffffffffffffffff811115612f7057612f6f6128b9565b5b612f7a8254612cbf565b612f85828285612ec1565b600060209050601f831160018114612fb85760008415612fa6578287015190505b612fb08582612f32565b865550613018565b601f198416612fc686612da2565b60005b82811015612fee57848901518255600182019150602085019450602081019050612fc9565b8683101561300b5784890151613007601f891682612f14565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b600061303682612628565b6130408185613020565b9350613050818560208601612644565b80840191505092915050565b6000613068828561302b565b9150613074828461302b565b91508190509392505050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b60006130b6601e83612633565b91506130c182613080565b602082019050919050565b600060208201905081810360008301526130e5816130a9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613126826126da565b9150613131836126da565b9250828201905080821115613149576131486130ec565b5b92915050565b7f736f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b6000613185600883612633565b91506131908261314f565b602082019050919050565b600060208201905081810360008301526131b481613178565b9050919050565b7f657863656564206d617820616d6f756e74000000000000000000000000000000600082015250565b60006131f1601183612633565b91506131fc826131bb565b602082019050919050565b60006020820190508181036000830152613220816131e4565b9050919050565b6000613232826126da565b915061323d836126da565b925082820261324b816126da565b91508282048414831517613262576132616130ec565b5b5092915050565b7f696e73756666696369656e740000000000000000000000000000000000000000600082015250565b600061329f600c83612633565b91506132aa82613269565b602082019050919050565b600060208201905081810360008301526132ce81613292565b9050919050565b60006132e082612bbd565b91506132eb83612bbd565b9250828203905063ffffffff811115613307576133066130ec565b5b92915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613369602683612633565b91506133748261330d565b604082019050919050565b600060208201905081810360008301526133988161335c565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006133d5602083612633565b91506133e08261339f565b602082019050919050565b60006020820190508181036000830152613404816133c8565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006134328261340b565b61343c8185613416565b935061344c818560208601612644565b6134558161266e565b840191505092915050565b6000608082019050613475600083018761276f565b613482602083018661276f565b61348f6040830185612805565b81810360608301526134a18184613427565b905095945050505050565b6000815190506134bb81612599565b92915050565b6000602082840312156134d7576134d6612563565b5b60006134e5848285016134ac565b91505092915050565b60006134f9826126da565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361352b5761352a6130ec565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613570826126da565b915061357b836126da565b92508261358b5761358a613536565b5b828204905092915050565b60006135a1826126da565b91506135ac836126da565b92508282039050818111156135c4576135c36130ec565b5b92915050565b60006135d5826126da565b91506135e0836126da565b9250826135f0576135ef613536565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea26469706673582212204242225f149228bf383e733f9ffe06991c04bc1bd140f9d15085b498803547e564736f6c63430008120033

Deployed Bytecode Sourcemap

45967:1815:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28471:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31856:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33359:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32922:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27720:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34216:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46272:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47501:278;;;;;;;;;;;;;:::i;:::-;;34457:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46169:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31665:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46022:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47394:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28840:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46647:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4658:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32025:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33635:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34713:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32200:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46077:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33985:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46869:517;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5110:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46123:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28471:305;28573:4;28625:25;28610:40;;;:11;:40;;;;:105;;;;28682:33;28667:48;;;:11;:48;;;;28610:105;:158;;;;28732:36;28756:11;28732:23;:36::i;:::-;28610:158;28590:178;;28471:305;;;:::o;31856:100::-;31910:13;31943:5;31936:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31856:100;:::o;33359:204::-;33427:7;33452:16;33460:7;33452;:16::i;:::-;33447:64;;33477:34;;;;;;;;;;;;;;33447:64;33531:15;:24;33547:7;33531:24;;;;;;;;;;;;;;;;;;;;;33524:31;;33359:204;;;:::o;32922:371::-;32995:13;33011:24;33027:7;33011:15;:24::i;:::-;32995:40;;33056:5;33050:11;;:2;:11;;;33046:48;;33070:24;;;;;;;;;;;;;;33046:48;33127:5;33111:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;33137:37;33154:5;33161:12;:10;:12::i;:::-;33137:16;:37::i;:::-;33136:38;33111:63;33107:138;;;33198:35;;;;;;;;;;;;;;33107:138;33257:28;33266:2;33270:7;33279:5;33257:8;:28::i;:::-;32984:309;32922:371;;:::o;27720:303::-;27764:7;27989:15;:13;:15::i;:::-;27974:12;;27958:13;;:28;:46;27951:53;;27720:303;:::o;34216:170::-;34350:28;34360:4;34366:2;34370:7;34350:9;:28::i;:::-;34216:170;;;:::o;46272:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;47501:278::-;4544:13;:11;:13::i;:::-;47549:18:::1;47570:21;47549:42;;47604:9;47624:10;47604:31;;47648:12;47687:1;:6;;47701:10;47687:29;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47673:43;;;;;47735:7;47727:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;47538:241;;;47501:278::o:0;34457:185::-;34595:39;34612:4;34618:2;34622:7;34595:39;;;;;;;;;;;;:16;:39::i;:::-;34457:185;;;:::o;46169:96::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31665:124::-;31729:7;31756:20;31768:7;31756:11;:20::i;:::-;:25;;;31749:32;;31665:124;;;:::o;46022:48::-;;;:::o;47394:99::-;47440:4;47463:10;:22;47474:10;47463:22;;;;;;;;;;;;;;;;;;;;;;;;;47456:29;;47394:99;:::o;28840:206::-;28904:7;28945:1;28928:19;;:5;:19;;;28924:60;;28956:28;;;;;;;;;;;;;;28924:60;29010:12;:19;29023:5;29010:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;29002:36;;28995:43;;28840:206;;;:::o;46647:92::-;4544:13;:11;:13::i;:::-;46728:3:::1;46716:9;:15;;;;;;:::i;:::-;;46647:92:::0;:::o;4658:87::-;4704:7;4731:6;;;;;;;;;;;4724:13;;4658:87;:::o;32025:104::-;32081:13;32114:7;32107:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32025:104;:::o;33635:279::-;33738:12;:10;:12::i;:::-;33726:24;;:8;:24;;;33722:54;;33759:17;;;;;;;;;;;;;;33722:54;33834:8;33789:18;:32;33808:12;:10;:12::i;:::-;33789:32;;;;;;;;;;;;;;;:42;33822:8;33789:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;33887:8;33858:48;;33873:12;:10;:12::i;:::-;33858:48;;;33897:8;33858:48;;;;;;:::i;:::-;;;;;;;;33635:279;;:::o;34713:369::-;34880:28;34890:4;34896:2;34900:7;34880:9;:28::i;:::-;34923:15;:2;:13;;;:15::i;:::-;:76;;;;;34943:56;34974:4;34980:2;34984:7;34993:5;34943:30;:56::i;:::-;34942:57;34923:76;34919:156;;;35023:40;;;;;;;;;;;;;;34919:156;34713:369;;;;:::o;32200:318::-;32273:13;32304:16;32312:7;32304;:16::i;:::-;32299:59;;32329:29;;;;;;;;;;;;;;32299:59;32371:21;32395:10;:8;:10::i;:::-;32371:34;;32448:1;32429:7;32423:21;:26;:87;;;;;;;;;;;;;;;;;32476:7;32485:18;:7;:16;:18::i;:::-;32459:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32423:87;32416:94;;;32200:318;;;:::o;46077:39::-;;;:::o;33985:164::-;34082:4;34106:18;:25;34125:5;34106:25;;;;;;;;;;;;;;;:35;34132:8;34106:35;;;;;;;;;;;;;;;;;;;;;;;;;34099:42;;33985:164;;;;:::o;46869:517::-;46379:10;46366:23;;:9;:23;;;46358:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;46976:9:::1;46950:35;;46966:6;46950:22;;:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;46942:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;47026:8;47016:18;;:6;:18;;;;47008:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;47069:10;:22;47080:10;47069:22;;;;;;;;;;;;;;;;;;;;;;;;;47066:273;;;47147:9;47138:6;:18;;;;;;:::i;:::-;47125:9;:31;;47117:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;47066:273;;;47249:4;47224:10;:22;47235:10;47224:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;47302:9;47297:1;47290:6;:8;;;;:::i;:::-;47289:22;;;;;;:::i;:::-;47276:9;:35;;47268:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;47066:273;47349:29;47359:10;47371:6;47349:29;;:9;:29::i;:::-;46869:517:::0;:::o;5110:201::-;4544:13;:11;:13::i;:::-;5219:1:::1;5199:22;;:8;:22;;::::0;5191:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;5275:28;5294:8;5275:18;:28::i;:::-;5110:201:::0;:::o;46123:37::-;;;:::o;17058:157::-;17143:4;17182:25;17167:40;;;:11;:40;;;;17160:47;;17058:157;;;:::o;35337:187::-;35394:4;35437:7;35418:15;:13;:15::i;:::-;:26;;:53;;;;;35458:13;;35448:7;:23;35418:53;:98;;;;;35489:11;:20;35501:7;35489:20;;;;;;;;;;;:27;;;;;;;;;;;;35488:28;35418:98;35411:105;;35337:187;;;:::o;3209:98::-;3262:7;3289:10;3282:17;;3209:98;:::o;42951:196::-;43093:2;43066:15;:24;43082:7;43066:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;43131:7;43127:2;43111:28;;43120:5;43111:28;;;;;;;;;;;;42951:196;;;:::o;46747:110::-;46821:7;46747:110;:::o;38453:2112::-;38568:35;38606:20;38618:7;38606:11;:20::i;:::-;38568:58;;38639:22;38681:13;:18;;;38665:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;38716:50;38733:13;:18;;;38753:12;:10;:12::i;:::-;38716:16;:50::i;:::-;38665:101;:154;;;;38807:12;:10;:12::i;:::-;38783:36;;:20;38795:7;38783:11;:20::i;:::-;:36;;;38665:154;38639:181;;38838:17;38833:66;;38864:35;;;;;;;;;;;;;;38833:66;38936:4;38914:26;;:13;:18;;;:26;;;38910:67;;38949:28;;;;;;;;;;;;;;38910:67;39006:1;38992:16;;:2;:16;;;38988:52;;39017:23;;;;;;;;;;;;;;38988:52;39053:43;39075:4;39081:2;39085:7;39094:1;39053:21;:43::i;:::-;39161:49;39178:1;39182:7;39191:13;:18;;;39161:8;:49::i;:::-;39536:1;39506:12;:18;39519:4;39506:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39580:1;39552:12;:16;39565:2;39552:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39626:2;39598:11;:20;39610:7;39598:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;39688:15;39643:11;:20;39655:7;39643:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;39956:19;39988:1;39978:7;:11;39956:33;;40049:1;40008:43;;:11;:24;40020:11;40008:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;40004:445;;40233:13;;40219:11;:27;40215:219;;;40303:13;:18;;;40271:11;:24;40283:11;40271:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;40386:13;:28;;;40344:11;:24;40356:11;40344:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;40215:219;40004:445;39481:979;40496:7;40492:2;40477:27;;40486:4;40477:27;;;;;;;;;;;;40515:42;40536:4;40542:2;40546:7;40555:1;40515:20;:42::i;:::-;38557:2008;;38453:2112;;;:::o;4823:132::-;4898:12;:10;:12::i;:::-;4887:23;;:7;:5;:7::i;:::-;:23;;;4879:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4823:132::o;30495:1108::-;30556:21;;:::i;:::-;30590:12;30605:7;30590:22;;30673:4;30654:15;:13;:15::i;:::-;:23;;:47;;;;;30688:13;;30681:4;:20;30654:47;30650:886;;;30722:31;30756:11;:17;30768:4;30756:17;;;;;;;;;;;30722:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30797:9;:16;;;30792:729;;30868:1;30842:28;;:9;:14;;;:28;;;30838:101;;30906:9;30899:16;;;;;;30838:101;31241:261;31248:4;31241:261;;;31281:6;;;;;;;;31326:11;:17;31338:4;31326:17;;;;;;;;;;;31314:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31400:1;31374:28;;:9;:14;;;:28;;;31370:109;;31442:9;31435:16;;;;;;31370:109;31241:261;;;30792:729;30703:833;30650:886;31564:31;;;;;;;;;;;;;;30495:1108;;;;:::o;6902:326::-;6962:4;7219:1;7197:7;:19;;;:23;7190:30;;6902:326;;;:::o;43639:667::-;43802:4;43839:2;43823:36;;;43860:12;:10;:12::i;:::-;43874:4;43880:7;43889:5;43823:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;43819:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44074:1;44057:6;:13;:18;44053:235;;44103:40;;;;;;;;;;;;;;44053:235;44246:6;44240:13;44231:6;44227:2;44223:15;44216:38;43819:480;43952:45;;;43942:55;;;:6;:55;;;;43935:62;;;43639:667;;;;;;:::o;46528:111::-;46589:13;46622:9;46615:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46528:111;:::o;463:723::-;519:13;749:1;740:5;:10;736:53;;767:10;;;;;;;;;;;;;;;;;;;;;736:53;799:12;814:5;799:20;;830:14;855:78;870:1;862:4;:9;855:78;;888:8;;;;;:::i;:::-;;;;919:2;911:10;;;;;:::i;:::-;;;855:78;;;943:19;975:6;965:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;943:39;;993:154;1009:1;1000:5;:10;993:154;;1037:1;1027:11;;;;;:::i;:::-;;;1104:2;1096:5;:10;;;;:::i;:::-;1083:2;:24;;;;:::i;:::-;1070:39;;1053:6;1060;1053:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1133:2;1124:11;;;;;:::i;:::-;;;993:154;;;1171:6;1157:21;;;;;463:723;;;;:::o;35532:104::-;35601:27;35611:2;35615:8;35601:27;;;;;;;;;;;;:9;:27::i;:::-;35532:104;;:::o;5471:191::-;5545:16;5564:6;;;;;;;;;;;5545:25;;5590:8;5581:6;;:17;;;;;;;;;;;;;;;;;;5645:8;5614:40;;5635:8;5614:40;;;;;;;;;;;;5534:128;5471:191;:::o;44954:159::-;;;;;:::o;45772:158::-;;;;;:::o;35999:163::-;36122:32;36128:2;36132:8;36142:5;36149:4;36122:5;:32::i;:::-;35999:163;;;:::o;36421:1778::-;36560:20;36583:13;;36560:36;;36685:1;36673:8;:13;36669:44;;36695:18;;;;;;;;;;;;;;36669:44;36726:61;36756:1;36760:2;36764:12;36778:8;36726:21;:61::i;:::-;37099:8;37064:12;:16;37077:2;37064:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37163:8;37123:12;:16;37136:2;37123:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37222:2;37189:11;:25;37201:12;37189:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;37289:15;37239:11;:25;37251:12;37239:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;37322:20;37345:12;37322:35;;37372:11;37401:8;37386:12;:23;37372:37;;37430:4;:23;;;;;37438:15;:2;:13;;;:15::i;:::-;37430:23;37426:641;;;37474:314;37530:12;37526:2;37505:38;;37522:1;37505:38;;;;;;;;;;;;37571:69;37610:1;37614:2;37618:14;;;;;;37634:5;37571:30;:69::i;:::-;37566:174;;37676:40;;;;;;;;;;;;;;37566:174;37783:3;37767:12;:19;37474:314;;37869:12;37852:13;;:29;37848:43;;37883:8;;;37848:43;37426:641;;;37932:120;37988:14;;;;;;37984:2;37963:40;;37980:1;37963:40;;;;;;;;;;;;38047:3;38031:12;:19;37932:120;;37426:641;38097:12;38081:13;:28;;;;37039:1082;;38131:60;38160:1;38164:2;38168:12;38182:8;38131:20;:60::i;:::-;36549:1650;36421:1778;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:329::-;5926:6;5975:2;5963:9;5954:7;5950:23;5946:32;5943:119;;;5981:79;;:::i;:::-;5943:119;6101:1;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6072:117;5867:329;;;;:::o;6202:117::-;6311:1;6308;6301:12;6325:117;6434:1;6431;6424:12;6448:180;6496:77;6493:1;6486:88;6593:4;6590:1;6583:15;6617:4;6614:1;6607:15;6634:281;6717:27;6739:4;6717:27;:::i;:::-;6709:6;6705:40;6847:6;6835:10;6832:22;6811:18;6799:10;6796:34;6793:62;6790:88;;;6858:18;;:::i;:::-;6790:88;6898:10;6894:2;6887:22;6677:238;6634:281;;:::o;6921:129::-;6955:6;6982:20;;:::i;:::-;6972:30;;7011:33;7039:4;7031:6;7011:33;:::i;:::-;6921:129;;;:::o;7056:308::-;7118:4;7208:18;7200:6;7197:30;7194:56;;;7230:18;;:::i;:::-;7194:56;7268:29;7290:6;7268:29;:::i;:::-;7260:37;;7352:4;7346;7342:15;7334:23;;7056:308;;;:::o;7370:146::-;7467:6;7462:3;7457;7444:30;7508:1;7499:6;7494:3;7490:16;7483:27;7370:146;;;:::o;7522:425::-;7600:5;7625:66;7641:49;7683:6;7641:49;:::i;:::-;7625:66;:::i;:::-;7616:75;;7714:6;7707:5;7700:21;7752:4;7745:5;7741:16;7790:3;7781:6;7776:3;7772:16;7769:25;7766:112;;;7797:79;;:::i;:::-;7766:112;7887:54;7934:6;7929:3;7924;7887:54;:::i;:::-;7606:341;7522:425;;;;;:::o;7967:340::-;8023:5;8072:3;8065:4;8057:6;8053:17;8049:27;8039:122;;8080:79;;:::i;:::-;8039:122;8197:6;8184:20;8222:79;8297:3;8289:6;8282:4;8274:6;8270:17;8222:79;:::i;:::-;8213:88;;8029:278;7967:340;;;;:::o;8313:509::-;8382:6;8431:2;8419:9;8410:7;8406:23;8402:32;8399:119;;;8437:79;;:::i;:::-;8399:119;8585:1;8574:9;8570:17;8557:31;8615:18;8607:6;8604:30;8601:117;;;8637:79;;:::i;:::-;8601:117;8742:63;8797:7;8788:6;8777:9;8773:22;8742:63;:::i;:::-;8732:73;;8528:287;8313:509;;;;:::o;8828:116::-;8898:21;8913:5;8898:21;:::i;:::-;8891:5;8888:32;8878:60;;8934:1;8931;8924:12;8878:60;8828:116;:::o;8950:133::-;8993:5;9031:6;9018:20;9009:29;;9047:30;9071:5;9047:30;:::i;:::-;8950:133;;;;:::o;9089:468::-;9154:6;9162;9211:2;9199:9;9190:7;9186:23;9182:32;9179:119;;;9217:79;;:::i;:::-;9179:119;9337:1;9362:53;9407:7;9398:6;9387:9;9383:22;9362:53;:::i;:::-;9352:63;;9308:117;9464:2;9490:50;9532:7;9523:6;9512:9;9508:22;9490:50;:::i;:::-;9480:60;;9435:115;9089:468;;;;;:::o;9563:307::-;9624:4;9714:18;9706:6;9703:30;9700:56;;;9736:18;;:::i;:::-;9700:56;9774:29;9796:6;9774:29;:::i;:::-;9766:37;;9858:4;9852;9848:15;9840:23;;9563:307;;;:::o;9876:423::-;9953:5;9978:65;9994:48;10035:6;9994:48;:::i;:::-;9978:65;:::i;:::-;9969:74;;10066:6;10059:5;10052:21;10104:4;10097:5;10093:16;10142:3;10133:6;10128:3;10124:16;10121:25;10118:112;;;10149:79;;:::i;:::-;10118:112;10239:54;10286:6;10281:3;10276;10239:54;:::i;:::-;9959:340;9876:423;;;;;:::o;10318:338::-;10373:5;10422:3;10415:4;10407:6;10403:17;10399:27;10389:122;;10430:79;;:::i;:::-;10389:122;10547:6;10534:20;10572:78;10646:3;10638:6;10631:4;10623:6;10619:17;10572:78;:::i;:::-;10563:87;;10379:277;10318:338;;;;:::o;10662:943::-;10757:6;10765;10773;10781;10830:3;10818:9;10809:7;10805:23;10801:33;10798:120;;;10837:79;;:::i;:::-;10798:120;10957:1;10982:53;11027:7;11018:6;11007:9;11003:22;10982:53;:::i;:::-;10972:63;;10928:117;11084:2;11110:53;11155:7;11146:6;11135:9;11131:22;11110:53;:::i;:::-;11100:63;;11055:118;11212:2;11238:53;11283:7;11274:6;11263:9;11259:22;11238:53;:::i;:::-;11228:63;;11183:118;11368:2;11357:9;11353:18;11340:32;11399:18;11391:6;11388:30;11385:117;;;11421:79;;:::i;:::-;11385:117;11526:62;11580:7;11571:6;11560:9;11556:22;11526:62;:::i;:::-;11516:72;;11311:287;10662:943;;;;;;;:::o;11611:93::-;11647:7;11687:10;11680:5;11676:22;11665:33;;11611:93;;;:::o;11710:115::-;11795:23;11812:5;11795:23;:::i;:::-;11790:3;11783:36;11710:115;;:::o;11831:218::-;11922:4;11960:2;11949:9;11945:18;11937:26;;11973:69;12039:1;12028:9;12024:17;12015:6;11973:69;:::i;:::-;11831:218;;;;:::o;12055:474::-;12123:6;12131;12180:2;12168:9;12159:7;12155:23;12151:32;12148:119;;;12186:79;;:::i;:::-;12148:119;12306:1;12331:53;12376:7;12367:6;12356:9;12352:22;12331:53;:::i;:::-;12321:63;;12277:117;12433:2;12459:53;12504:7;12495:6;12484:9;12480:22;12459:53;:::i;:::-;12449:63;;12404:118;12055:474;;;;;:::o;12535:120::-;12607:23;12624:5;12607:23;:::i;:::-;12600:5;12597:34;12587:62;;12645:1;12642;12635:12;12587:62;12535:120;:::o;12661:137::-;12706:5;12744:6;12731:20;12722:29;;12760:32;12786:5;12760:32;:::i;:::-;12661:137;;;;:::o;12804:327::-;12862:6;12911:2;12899:9;12890:7;12886:23;12882:32;12879:119;;;12917:79;;:::i;:::-;12879:119;13037:1;13062:52;13106:7;13097:6;13086:9;13082:22;13062:52;:::i;:::-;13052:62;;13008:116;12804:327;;;;:::o;13137:180::-;13185:77;13182:1;13175:88;13282:4;13279:1;13272:15;13306:4;13303:1;13296:15;13323:320;13367:6;13404:1;13398:4;13394:12;13384:22;;13451:1;13445:4;13441:12;13472:18;13462:81;;13528:4;13520:6;13516:17;13506:27;;13462:81;13590:2;13582:6;13579:14;13559:18;13556:38;13553:84;;13609:18;;:::i;:::-;13553:84;13374:269;13323:320;;;:::o;13649:147::-;13750:11;13787:3;13772:18;;13649:147;;;;:::o;13802:114::-;;:::o;13922:398::-;14081:3;14102:83;14183:1;14178:3;14102:83;:::i;:::-;14095:90;;14194:93;14283:3;14194:93;:::i;:::-;14312:1;14307:3;14303:11;14296:18;;13922:398;;;:::o;14326:379::-;14510:3;14532:147;14675:3;14532:147;:::i;:::-;14525:154;;14696:3;14689:10;;14326:379;;;:::o;14711:174::-;14851:26;14847:1;14839:6;14835:14;14828:50;14711:174;:::o;14891:366::-;15033:3;15054:67;15118:2;15113:3;15054:67;:::i;:::-;15047:74;;15130:93;15219:3;15130:93;:::i;:::-;15248:2;15243:3;15239:12;15232:19;;14891:366;;;:::o;15263:419::-;15429:4;15467:2;15456:9;15452:18;15444:26;;15516:9;15510:4;15506:20;15502:1;15491:9;15487:17;15480:47;15544:131;15670:4;15544:131;:::i;:::-;15536:139;;15263:419;;;:::o;15688:141::-;15737:4;15760:3;15752:11;;15783:3;15780:1;15773:14;15817:4;15814:1;15804:18;15796:26;;15688:141;;;:::o;15835:93::-;15872:6;15919:2;15914;15907:5;15903:14;15899:23;15889:33;;15835:93;;;:::o;15934:107::-;15978:8;16028:5;16022:4;16018:16;15997:37;;15934:107;;;;:::o;16047:393::-;16116:6;16166:1;16154:10;16150:18;16189:97;16219:66;16208:9;16189:97;:::i;:::-;16307:39;16337:8;16326:9;16307:39;:::i;:::-;16295:51;;16379:4;16375:9;16368:5;16364:21;16355:30;;16428:4;16418:8;16414:19;16407:5;16404:30;16394:40;;16123:317;;16047:393;;;;;:::o;16446:60::-;16474:3;16495:5;16488:12;;16446:60;;;:::o;16512:142::-;16562:9;16595:53;16613:34;16622:24;16640:5;16622:24;:::i;:::-;16613:34;:::i;:::-;16595:53;:::i;:::-;16582:66;;16512:142;;;:::o;16660:75::-;16703:3;16724:5;16717:12;;16660:75;;;:::o;16741:269::-;16851:39;16882:7;16851:39;:::i;:::-;16912:91;16961:41;16985:16;16961:41;:::i;:::-;16953:6;16946:4;16940:11;16912:91;:::i;:::-;16906:4;16899:105;16817:193;16741:269;;;:::o;17016:73::-;17061:3;17016:73;:::o;17095:189::-;17172:32;;:::i;:::-;17213:65;17271:6;17263;17257:4;17213:65;:::i;:::-;17148:136;17095:189;;:::o;17290:186::-;17350:120;17367:3;17360:5;17357:14;17350:120;;;17421:39;17458:1;17451:5;17421:39;:::i;:::-;17394:1;17387:5;17383:13;17374:22;;17350:120;;;17290:186;;:::o;17482:543::-;17583:2;17578:3;17575:11;17572:446;;;17617:38;17649:5;17617:38;:::i;:::-;17701:29;17719:10;17701:29;:::i;:::-;17691:8;17687:44;17884:2;17872:10;17869:18;17866:49;;;17905:8;17890:23;;17866:49;17928:80;17984:22;18002:3;17984:22;:::i;:::-;17974:8;17970:37;17957:11;17928:80;:::i;:::-;17587:431;;17572:446;17482:543;;;:::o;18031:117::-;18085:8;18135:5;18129:4;18125:16;18104:37;;18031:117;;;;:::o;18154:169::-;18198:6;18231:51;18279:1;18275:6;18267:5;18264:1;18260:13;18231:51;:::i;:::-;18227:56;18312:4;18306;18302:15;18292:25;;18205:118;18154:169;;;;:::o;18328:295::-;18404:4;18550:29;18575:3;18569:4;18550:29;:::i;:::-;18542:37;;18612:3;18609:1;18605:11;18599:4;18596:21;18588:29;;18328:295;;;;:::o;18628:1395::-;18745:37;18778:3;18745:37;:::i;:::-;18847:18;18839:6;18836:30;18833:56;;;18869:18;;:::i;:::-;18833:56;18913:38;18945:4;18939:11;18913:38;:::i;:::-;18998:67;19058:6;19050;19044:4;18998:67;:::i;:::-;19092:1;19116:4;19103:17;;19148:2;19140:6;19137:14;19165:1;19160:618;;;;19822:1;19839:6;19836:77;;;19888:9;19883:3;19879:19;19873:26;19864:35;;19836:77;19939:67;19999:6;19992:5;19939:67;:::i;:::-;19933:4;19926:81;19795:222;19130:887;;19160:618;19212:4;19208:9;19200:6;19196:22;19246:37;19278:4;19246:37;:::i;:::-;19305:1;19319:208;19333:7;19330:1;19327:14;19319:208;;;19412:9;19407:3;19403:19;19397:26;19389:6;19382:42;19463:1;19455:6;19451:14;19441:24;;19510:2;19499:9;19495:18;19482:31;;19356:4;19353:1;19349:12;19344:17;;19319:208;;;19555:6;19546:7;19543:19;19540:179;;;19613:9;19608:3;19604:19;19598:26;19656:48;19698:4;19690:6;19686:17;19675:9;19656:48;:::i;:::-;19648:6;19641:64;19563:156;19540:179;19765:1;19761;19753:6;19749:14;19745:22;19739:4;19732:36;19167:611;;;19130:887;;18720:1303;;;18628:1395;;:::o;20029:148::-;20131:11;20168:3;20153:18;;20029:148;;;;:::o;20183:390::-;20289:3;20317:39;20350:5;20317:39;:::i;:::-;20372:89;20454:6;20449:3;20372:89;:::i;:::-;20365:96;;20470:65;20528:6;20523:3;20516:4;20509:5;20505:16;20470:65;:::i;:::-;20560:6;20555:3;20551:16;20544:23;;20293:280;20183:390;;;;:::o;20579:435::-;20759:3;20781:95;20872:3;20863:6;20781:95;:::i;:::-;20774:102;;20893:95;20984:3;20975:6;20893:95;:::i;:::-;20886:102;;21005:3;20998:10;;20579:435;;;;;:::o;21020:180::-;21160:32;21156:1;21148:6;21144:14;21137:56;21020:180;:::o;21206:366::-;21348:3;21369:67;21433:2;21428:3;21369:67;:::i;:::-;21362:74;;21445:93;21534:3;21445:93;:::i;:::-;21563:2;21558:3;21554:12;21547:19;;21206:366;;;:::o;21578:419::-;21744:4;21782:2;21771:9;21767:18;21759:26;;21831:9;21825:4;21821:20;21817:1;21806:9;21802:17;21795:47;21859:131;21985:4;21859:131;:::i;:::-;21851:139;;21578:419;;;:::o;22003:180::-;22051:77;22048:1;22041:88;22148:4;22145:1;22138:15;22172:4;22169:1;22162:15;22189:191;22229:3;22248:20;22266:1;22248:20;:::i;:::-;22243:25;;22282:20;22300:1;22282:20;:::i;:::-;22277:25;;22325:1;22322;22318:9;22311:16;;22346:3;22343:1;22340:10;22337:36;;;22353:18;;:::i;:::-;22337:36;22189:191;;;;:::o;22386:158::-;22526:10;22522:1;22514:6;22510:14;22503:34;22386:158;:::o;22550:365::-;22692:3;22713:66;22777:1;22772:3;22713:66;:::i;:::-;22706:73;;22788:93;22877:3;22788:93;:::i;:::-;22906:2;22901:3;22897:12;22890:19;;22550:365;;;:::o;22921:419::-;23087:4;23125:2;23114:9;23110:18;23102:26;;23174:9;23168:4;23164:20;23160:1;23149:9;23145:17;23138:47;23202:131;23328:4;23202:131;:::i;:::-;23194:139;;22921:419;;;:::o;23346:167::-;23486:19;23482:1;23474:6;23470:14;23463:43;23346:167;:::o;23519:366::-;23661:3;23682:67;23746:2;23741:3;23682:67;:::i;:::-;23675:74;;23758:93;23847:3;23758:93;:::i;:::-;23876:2;23871:3;23867:12;23860:19;;23519:366;;;:::o;23891:419::-;24057:4;24095:2;24084:9;24080:18;24072:26;;24144:9;24138:4;24134:20;24130:1;24119:9;24115:17;24108:47;24172:131;24298:4;24172:131;:::i;:::-;24164:139;;23891:419;;;:::o;24316:410::-;24356:7;24379:20;24397:1;24379:20;:::i;:::-;24374:25;;24413:20;24431:1;24413:20;:::i;:::-;24408:25;;24468:1;24465;24461:9;24490:30;24508:11;24490:30;:::i;:::-;24479:41;;24669:1;24660:7;24656:15;24653:1;24650:22;24630:1;24623:9;24603:83;24580:139;;24699:18;;:::i;:::-;24580:139;24364:362;24316:410;;;;:::o;24732:162::-;24872:14;24868:1;24860:6;24856:14;24849:38;24732:162;:::o;24900:366::-;25042:3;25063:67;25127:2;25122:3;25063:67;:::i;:::-;25056:74;;25139:93;25228:3;25139:93;:::i;:::-;25257:2;25252:3;25248:12;25241:19;;24900:366;;;:::o;25272:419::-;25438:4;25476:2;25465:9;25461:18;25453:26;;25525:9;25519:4;25515:20;25511:1;25500:9;25496:17;25489:47;25553:131;25679:4;25553:131;:::i;:::-;25545:139;;25272:419;;;:::o;25697:200::-;25736:4;25756:19;25773:1;25756:19;:::i;:::-;25751:24;;25789:19;25806:1;25789:19;:::i;:::-;25784:24;;25832:1;25829;25825:9;25817:17;;25856:10;25850:4;25847:20;25844:46;;;25870:18;;:::i;:::-;25844:46;25697:200;;;;:::o;25903:225::-;26043:34;26039:1;26031:6;26027:14;26020:58;26112:8;26107:2;26099:6;26095:15;26088:33;25903:225;:::o;26134:366::-;26276:3;26297:67;26361:2;26356:3;26297:67;:::i;:::-;26290:74;;26373:93;26462:3;26373:93;:::i;:::-;26491:2;26486:3;26482:12;26475:19;;26134:366;;;:::o;26506:419::-;26672:4;26710:2;26699:9;26695:18;26687:26;;26759:9;26753:4;26749:20;26745:1;26734:9;26730:17;26723:47;26787:131;26913:4;26787:131;:::i;:::-;26779:139;;26506:419;;;:::o;26931:182::-;27071:34;27067:1;27059:6;27055:14;27048:58;26931:182;:::o;27119:366::-;27261:3;27282:67;27346:2;27341:3;27282:67;:::i;:::-;27275:74;;27358:93;27447:3;27358:93;:::i;:::-;27476:2;27471:3;27467:12;27460:19;;27119:366;;;:::o;27491:419::-;27657:4;27695:2;27684:9;27680:18;27672:26;;27744:9;27738:4;27734:20;27730:1;27719:9;27715:17;27708:47;27772:131;27898:4;27772:131;:::i;:::-;27764:139;;27491:419;;;:::o;27916:98::-;27967:6;28001:5;27995:12;27985:22;;27916:98;;;:::o;28020:168::-;28103:11;28137:6;28132:3;28125:19;28177:4;28172:3;28168:14;28153:29;;28020:168;;;;:::o;28194:373::-;28280:3;28308:38;28340:5;28308:38;:::i;:::-;28362:70;28425:6;28420:3;28362:70;:::i;:::-;28355:77;;28441:65;28499:6;28494:3;28487:4;28480:5;28476:16;28441:65;:::i;:::-;28531:29;28553:6;28531:29;:::i;:::-;28526:3;28522:39;28515:46;;28284:283;28194:373;;;;:::o;28573:640::-;28768:4;28806:3;28795:9;28791:19;28783:27;;28820:71;28888:1;28877:9;28873:17;28864:6;28820:71;:::i;:::-;28901:72;28969:2;28958:9;28954:18;28945:6;28901:72;:::i;:::-;28983;29051:2;29040:9;29036:18;29027:6;28983:72;:::i;:::-;29102:9;29096:4;29092:20;29087:2;29076:9;29072:18;29065:48;29130:76;29201:4;29192:6;29130:76;:::i;:::-;29122:84;;28573:640;;;;;;;:::o;29219:141::-;29275:5;29306:6;29300:13;29291:22;;29322:32;29348:5;29322:32;:::i;:::-;29219:141;;;;:::o;29366:349::-;29435:6;29484:2;29472:9;29463:7;29459:23;29455:32;29452:119;;;29490:79;;:::i;:::-;29452:119;29610:1;29635:63;29690:7;29681:6;29670:9;29666:22;29635:63;:::i;:::-;29625:73;;29581:127;29366:349;;;;:::o;29721:233::-;29760:3;29783:24;29801:5;29783:24;:::i;:::-;29774:33;;29829:66;29822:5;29819:77;29816:103;;29899:18;;:::i;:::-;29816:103;29946:1;29939:5;29935:13;29928:20;;29721:233;;;:::o;29960:180::-;30008:77;30005:1;29998:88;30105:4;30102:1;30095:15;30129:4;30126:1;30119:15;30146:185;30186:1;30203:20;30221:1;30203:20;:::i;:::-;30198:25;;30237:20;30255:1;30237:20;:::i;:::-;30232:25;;30276:1;30266:35;;30281:18;;:::i;:::-;30266:35;30323:1;30320;30316:9;30311:14;;30146:185;;;;:::o;30337:194::-;30377:4;30397:20;30415:1;30397:20;:::i;:::-;30392:25;;30431:20;30449:1;30431:20;:::i;:::-;30426:25;;30475:1;30472;30468:9;30460:17;;30499:1;30493:4;30490:11;30487:37;;;30504:18;;:::i;:::-;30487:37;30337:194;;;;:::o;30537:176::-;30569:1;30586:20;30604:1;30586:20;:::i;:::-;30581:25;;30620:20;30638:1;30620:20;:::i;:::-;30615:25;;30659:1;30649:35;;30664:18;;:::i;:::-;30649:35;30705:1;30702;30698:9;30693:14;;30537:176;;;;:::o;30719:180::-;30767:77;30764:1;30757:88;30864:4;30861:1;30854:15;30888:4;30885:1;30878:15

Swarm Source

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