ETH Price: $3,402.07 (+2.71%)

Token

chibilegends (Chibi)
 

Overview

Max Total Supply

5,555 Chibi

Holders

683

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
gmicap.eth
Balance
2 Chibi
0x13b3a50f3947476eda74fe191344524e2d2d28e5
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

**LEGACY COLLECTION WILL HAVE NO UTILITY IN GAME, PLEASE PURCHASE CHIBI LEGENDS FROM POLYGON COLLECTION** https://opensea.io/collection/chibi-clash All Legacy Chibi Legends can be exchanged for a Legendary Seal NFT: https://chibi.gg/app/seals Legendary Seals collection: https...

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Chibi

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-08-30
*/

// Sources flattened with hardhat v2.5.0 https://hardhat.org

// File @openzeppelin/contracts/utils/[email protected]

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]



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/[email protected]



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File @openzeppelin/contracts/utils/math/[email protected]



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/introspection/[email protected]



pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC721/[email protected]



pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]



pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/utils/[email protected]



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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


// File @openzeppelin/contracts/utils/introspection/[email protected]



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/[email protected]



pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]



pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File contracts/Chibi.sol

pragma solidity ^0.8.0;




contract Chibi is ERC721Enumerable, Ownable {
    uint256 public constant TOTAL_CHIBI_AMOUNT = 5555;
    uint256 public constant MAX_PURCHASE = 10;
    uint256 public price = 55000000000000000;

    bool public isSaleOpen = false;
    string internal _baseTokenURI;

    using Strings for uint256;

    constructor(string memory baseURI) ERC721("chibilegends", "Chibi")  {
        changeBaseURI(baseURI);
    }

    /**
     **  Modifiers
     */ 
    modifier mintingIsAvailable{
        require(totalSupply() < TOTAL_CHIBI_AMOUNT, "No Chibi left to mint.");
        _;
    }

    /**
     **  onlyOwner functions
     */     
    function getBaseURI() public onlyOwner view returns (string memory) {
        return _baseURI();
    }

    function changeBaseURI(string memory baseURI) public onlyOwner {
        _baseTokenURI = baseURI;
    }

    function changePrice(uint _price) public onlyOwner {
        price = _price;
    }

    function changeSaleOpen(bool _open) public onlyOwner {
        isSaleOpen = _open;
    }

    function withdrawAll() public payable onlyOwner {
        require(payable(_msgSender()).send(address(this).balance));
    }

    /**
     **  Public functions
     */ 
    function mintChibi(uint256 qty) public payable mintingIsAvailable {
        if(msg.sender != owner()){
            require(isSaleOpen, "Sale is not open.");
        }
        require(totalSupply() < TOTAL_CHIBI_AMOUNT, "All Chibis are minted.");
        require(qty <= MAX_PURCHASE, "Buying too many per transaction.");
        require(SafeMath.add(totalSupply(), qty) <= TOTAL_CHIBI_AMOUNT, "Going over 5555 chibi with the purchase.");
        require(msg.value >= _getPrice(qty), "Invalid price.");

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

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

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

    /**
     **  Internal functions
     */ 
    function _getPrice(uint256 qty) internal view returns (uint256) {
        return price * qty;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PURCHASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_CHIBI_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"changeBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"changePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_open","type":"bool"}],"name":"changeSaleOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"isSaleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"mintChibi","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

608060405266c3663566a58000600b556000600c60006101000a81548160ff0219169083151502179055503480156200003757600080fd5b50604051620045c1380380620045c183398181016040528101906200005d9190620003fa565b6040518060400160405280600c81526020017f63686962696c6567656e647300000000000000000000000000000000000000008152506040518060400160405280600581526020017f43686962690000000000000000000000000000000000000000000000000000008152508160009080519060200190620000e1929190620002d8565b508060019080519060200190620000fa929190620002d8565b5050506200011d620001116200013560201b60201c565b6200013d60201b60201c565b6200012e816200020360201b60201c565b50620005e5565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002136200013560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000239620002ae60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000292576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002899062000481565b60405180910390fd5b80600d9080519060200190620002aa929190620002d8565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620002e69062000551565b90600052602060002090601f0160209004810192826200030a576000855562000356565b82601f106200032557805160ff191683800117855562000356565b8280016001018555821562000356579182015b828111156200035557825182559160200191906001019062000338565b5b50905062000365919062000369565b5090565b5b80821115620003845760008160009055506001016200036a565b5090565b60006200039f6200039984620004d7565b620004a3565b905082815260208101848484011115620003b857600080fd5b620003c58482856200051b565b509392505050565b600082601f830112620003df57600080fd5b8151620003f184826020860162000388565b91505092915050565b6000602082840312156200040d57600080fd5b600082015167ffffffffffffffff8111156200042857600080fd5b6200043684828501620003cd565b91505092915050565b60006200044e6020836200050a565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600060208201905081810360008301526200049c816200043f565b9050919050565b6000604051905081810181811067ffffffffffffffff82111715620004cd57620004cc620005b6565b5b8060405250919050565b600067ffffffffffffffff821115620004f557620004f4620005b6565b5b601f19601f8301169050602081019050919050565b600082825260208201905092915050565b60005b838110156200053b5780820151818401526020810190506200051e565b838111156200054b576000848401525b50505050565b600060028204905060018216806200056a57607f821691505b6020821081141562000581576200058062000587565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613fcc80620005f56000396000f3fe6080604052600436106101c25760003560e01c80637146bd08116100f7578063a22cb46511610095578063d639cdd111610064578063d639cdd114610635578063e985e9c51461065e578063eb7d6d211461069b578063f2fde38b146106b7576101c2565b8063a22cb4651461057d578063a2b40d19146105a6578063b88d4fde146105cf578063c87b56dd146105f8576101c2565b8063853828b6116100d1578063853828b6146104f25780638da5cb5b146104fc57806395d89b4114610527578063a035b1fe14610552576101c2565b80637146bd0814610485578063714c5398146104b0578063715018a6146104db576101c2565b80632f745c59116101645780634f6ccce71161013e5780634f6ccce7146103a35780636352211e146103e05780636cf4167e1461041d57806370a0823114610448576101c2565b80632f745c591461031457806339a0c6f91461035157806342842e0e1461037a576101c2565b8063095ea7b3116101a0578063095ea7b31461026c57806318160ddd146102955780631a081330146102c057806323b872dd146102eb576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190612ce3565b6106e0565b6040516101fb91906137ca565b60405180910390f35b34801561021057600080fd5b5061021961075a565b60405161022691906137e5565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190612d76565b6107ec565b6040516102639190613763565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e9190612c7e565b610871565b005b3480156102a157600080fd5b506102aa610989565b6040516102b79190613b07565b60405180910390f35b3480156102cc57600080fd5b506102d5610996565b6040516102e291906137ca565b60405180910390f35b3480156102f757600080fd5b50610312600480360381019061030d9190612b78565b6109a9565b005b34801561032057600080fd5b5061033b60048036038101906103369190612c7e565b610a09565b6040516103489190613b07565b60405180910390f35b34801561035d57600080fd5b5061037860048036038101906103739190612d35565b610aae565b005b34801561038657600080fd5b506103a1600480360381019061039c9190612b78565b610b44565b005b3480156103af57600080fd5b506103ca60048036038101906103c59190612d76565b610b64565b6040516103d79190613b07565b60405180910390f35b3480156103ec57600080fd5b5061040760048036038101906104029190612d76565b610bfb565b6040516104149190613763565b60405180910390f35b34801561042957600080fd5b50610432610cad565b60405161043f9190613b07565b60405180910390f35b34801561045457600080fd5b5061046f600480360381019061046a9190612b13565b610cb3565b60405161047c9190613b07565b60405180910390f35b34801561049157600080fd5b5061049a610d6b565b6040516104a79190613b07565b60405180910390f35b3480156104bc57600080fd5b506104c5610d70565b6040516104d291906137e5565b60405180910390f35b3480156104e757600080fd5b506104f0610dfb565b005b6104fa610e83565b005b34801561050857600080fd5b50610511610f46565b60405161051e9190613763565b60405180910390f35b34801561053357600080fd5b5061053c610f70565b60405161054991906137e5565b60405180910390f35b34801561055e57600080fd5b50610567611002565b6040516105749190613b07565b60405180910390f35b34801561058957600080fd5b506105a4600480360381019061059f9190612c42565b611008565b005b3480156105b257600080fd5b506105cd60048036038101906105c89190612d76565b611189565b005b3480156105db57600080fd5b506105f660048036038101906105f19190612bc7565b61120f565b005b34801561060457600080fd5b5061061f600480360381019061061a9190612d76565b611271565b60405161062c91906137e5565b60405180910390f35b34801561064157600080fd5b5061065c60048036038101906106579190612cba565b611318565b005b34801561066a57600080fd5b5061068560048036038101906106809190612b3c565b6113b1565b60405161069291906137ca565b60405180910390f35b6106b560048036038101906106b09190612d76565b611445565b005b3480156106c357600080fd5b506106de60048036038101906106d99190612b13565b61167c565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610753575061075282611774565b5b9050919050565b60606000805461076990613dc1565b80601f016020809104026020016040519081016040528092919081815260200182805461079590613dc1565b80156107e25780601f106107b7576101008083540402835291602001916107e2565b820191906000526020600020905b8154815290600101906020018083116107c557829003601f168201915b5050505050905090565b60006107f782611856565b610836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082d906139c7565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061087c82610bfb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e490613a47565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661090c6118c2565b73ffffffffffffffffffffffffffffffffffffffff16148061093b575061093a816109356118c2565b6113b1565b5b61097a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097190613927565b60405180910390fd5b61098483836118ca565b505050565b6000600880549050905090565b600c60009054906101000a900460ff1681565b6109ba6109b46118c2565b82611983565b6109f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f090613a67565b60405180910390fd5b610a04838383611a61565b505050565b6000610a1483610cb3565b8210610a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4c90613807565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ab66118c2565b73ffffffffffffffffffffffffffffffffffffffff16610ad4610f46565b73ffffffffffffffffffffffffffffffffffffffff1614610b2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b21906139e7565b60405180910390fd5b80600d9080519060200190610b40929190612937565b5050565b610b5f8383836040518060200160405280600081525061120f565b505050565b6000610b6e610989565b8210610baf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba690613ac7565b60405180910390fd5b60088281548110610be9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ca4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9b90613967565b60405180910390fd5b80915050919050565b6115b381565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1b90613947565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600a81565b6060610d7a6118c2565b73ffffffffffffffffffffffffffffffffffffffff16610d98610f46565b73ffffffffffffffffffffffffffffffffffffffff1614610dee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de5906139e7565b60405180910390fd5b610df6611cbd565b905090565b610e036118c2565b73ffffffffffffffffffffffffffffffffffffffff16610e21610f46565b73ffffffffffffffffffffffffffffffffffffffff1614610e77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6e906139e7565b60405180910390fd5b610e816000611d4f565b565b610e8b6118c2565b73ffffffffffffffffffffffffffffffffffffffff16610ea9610f46565b73ffffffffffffffffffffffffffffffffffffffff1614610eff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef6906139e7565b60405180910390fd5b610f076118c2565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610f4457600080fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610f7f90613dc1565b80601f0160208091040260200160405190810160405280929190818152602001828054610fab90613dc1565b8015610ff85780601f10610fcd57610100808354040283529160200191610ff8565b820191906000526020600020905b815481529060010190602001808311610fdb57829003601f168201915b5050505050905090565b600b5481565b6110106118c2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561107e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611075906138a7565b60405180910390fd5b806005600061108b6118c2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166111386118c2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161117d91906137ca565b60405180910390a35050565b6111916118c2565b73ffffffffffffffffffffffffffffffffffffffff166111af610f46565b73ffffffffffffffffffffffffffffffffffffffff1614611205576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fc906139e7565b60405180910390fd5b80600b8190555050565b61122061121a6118c2565b83611983565b61125f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125690613a67565b60405180910390fd5b61126b84848484611e15565b50505050565b606061127c82611856565b6112bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b290613a27565b60405180910390fd5b60006112c5611cbd565b905060008151116112e55760405180602001604052806000815250611310565b806112ef84611e71565b604051602001611300929190613729565b6040516020818303038152906040525b915050919050565b6113206118c2565b73ffffffffffffffffffffffffffffffffffffffff1661133e610f46565b73ffffffffffffffffffffffffffffffffffffffff1614611394576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138b906139e7565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115b3611450610989565b10611490576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148790613aa7565b60405180910390fd5b611498610f46565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461151a57600c60009054906101000a900460ff16611519576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151090613ae7565b60405180910390fd5b5b6115b3611525610989565b10611565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155c90613907565b60405180910390fd5b600a8111156115a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a090613a87565b60405180910390fd5b6115b36115bd6115b7610989565b8361201e565b11156115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f5906138c7565b60405180910390fd5b61160781612034565b341015611649576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164090613987565b60405180910390fd5b60005b818110156116785761166533611660610989565b61204b565b808061167090613df3565b91505061164c565b5050565b6116846118c2565b73ffffffffffffffffffffffffffffffffffffffff166116a2610f46565b73ffffffffffffffffffffffffffffffffffffffff16146116f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ef906139e7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611768576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175f90613847565b60405180910390fd5b61177181611d4f565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061183f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061184f575061184e82612069565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661193d83610bfb565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061198e82611856565b6119cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c4906138e7565b60405180910390fd5b60006119d883610bfb565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611a4757508373ffffffffffffffffffffffffffffffffffffffff16611a2f846107ec565b73ffffffffffffffffffffffffffffffffffffffff16145b80611a585750611a5781856113b1565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611a8182610bfb565b73ffffffffffffffffffffffffffffffffffffffff1614611ad7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ace90613a07565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3e90613887565b60405180910390fd5b611b528383836120d3565b611b5d6000826118ca565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bad9190613cd7565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c049190613bf6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6060600d8054611ccc90613dc1565b80601f0160208091040260200160405190810160405280929190818152602001828054611cf890613dc1565b8015611d455780601f10611d1a57610100808354040283529160200191611d45565b820191906000526020600020905b815481529060010190602001808311611d2857829003601f168201915b5050505050905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611e20848484611a61565b611e2c848484846121e7565b611e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6290613827565b60405180910390fd5b50505050565b60606000821415611eb9576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612019565b600082905060005b60008214611eeb578080611ed490613df3565b915050600a82611ee49190613c4c565b9150611ec1565b60008167ffffffffffffffff811115611f2d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611f5f5781602001600182028036833780820191505090505b5090505b6000851461201257600182611f789190613cd7565b9150600a85611f879190613e3c565b6030611f939190613bf6565b60f81b818381518110611fcf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561200b9190613c4c565b9450611f63565b8093505050505b919050565b6000818361202c9190613bf6565b905092915050565b600081600b546120449190613c7d565b9050919050565b61206582826040518060200160405280600081525061237e565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6120de8383836123d9565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121215761211c816123de565b612160565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461215f5761215e8382612427565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121a35761219e81612594565b6121e2565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146121e1576121e082826126d7565b5b5b505050565b60006122088473ffffffffffffffffffffffffffffffffffffffff16612756565b15612371578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122316118c2565b8786866040518563ffffffff1660e01b8152600401612253949392919061377e565b602060405180830381600087803b15801561226d57600080fd5b505af192505050801561229e57506040513d601f19601f8201168201806040525081019061229b9190612d0c565b60015b612321573d80600081146122ce576040519150601f19603f3d011682016040523d82523d6000602084013e6122d3565b606091505b50600081511415612319576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231090613827565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612376565b600190505b949350505050565b6123888383612769565b61239560008484846121e7565b6123d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cb90613827565b60405180910390fd5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161243484610cb3565b61243e9190613cd7565b9050600060076000848152602001908152602001600020549050818114612523576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506125a89190613cd7565b90506000600960008481526020019081526020016000205490506000600883815481106125fe577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612646577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806126bb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006126e283610cb3565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d0906139a7565b60405180910390fd5b6127e281611856565b15612822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281990613867565b60405180910390fd5b61282e600083836120d3565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461287e9190613bf6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461294390613dc1565b90600052602060002090601f01602090048101928261296557600085556129ac565b82601f1061297e57805160ff19168380011785556129ac565b828001600101855582156129ac579182015b828111156129ab578251825591602001919060010190612990565b5b5090506129b991906129bd565b5090565b5b808211156129d65760008160009055506001016129be565b5090565b60006129ed6129e884613b53565b613b22565b905082815260208101848484011115612a0557600080fd5b612a10848285613d7f565b509392505050565b6000612a2b612a2684613b83565b613b22565b905082815260208101848484011115612a4357600080fd5b612a4e848285613d7f565b509392505050565b600081359050612a6581613f3a565b92915050565b600081359050612a7a81613f51565b92915050565b600081359050612a8f81613f68565b92915050565b600081519050612aa481613f68565b92915050565b600082601f830112612abb57600080fd5b8135612acb8482602086016129da565b91505092915050565b600082601f830112612ae557600080fd5b8135612af5848260208601612a18565b91505092915050565b600081359050612b0d81613f7f565b92915050565b600060208284031215612b2557600080fd5b6000612b3384828501612a56565b91505092915050565b60008060408385031215612b4f57600080fd5b6000612b5d85828601612a56565b9250506020612b6e85828601612a56565b9150509250929050565b600080600060608486031215612b8d57600080fd5b6000612b9b86828701612a56565b9350506020612bac86828701612a56565b9250506040612bbd86828701612afe565b9150509250925092565b60008060008060808587031215612bdd57600080fd5b6000612beb87828801612a56565b9450506020612bfc87828801612a56565b9350506040612c0d87828801612afe565b925050606085013567ffffffffffffffff811115612c2a57600080fd5b612c3687828801612aaa565b91505092959194509250565b60008060408385031215612c5557600080fd5b6000612c6385828601612a56565b9250506020612c7485828601612a6b565b9150509250929050565b60008060408385031215612c9157600080fd5b6000612c9f85828601612a56565b9250506020612cb085828601612afe565b9150509250929050565b600060208284031215612ccc57600080fd5b6000612cda84828501612a6b565b91505092915050565b600060208284031215612cf557600080fd5b6000612d0384828501612a80565b91505092915050565b600060208284031215612d1e57600080fd5b6000612d2c84828501612a95565b91505092915050565b600060208284031215612d4757600080fd5b600082013567ffffffffffffffff811115612d6157600080fd5b612d6d84828501612ad4565b91505092915050565b600060208284031215612d8857600080fd5b6000612d9684828501612afe565b91505092915050565b612da881613d0b565b82525050565b612db781613d1d565b82525050565b6000612dc882613bb3565b612dd28185613bc9565b9350612de2818560208601613d8e565b612deb81613f29565b840191505092915050565b6000612e0182613bbe565b612e0b8185613bda565b9350612e1b818560208601613d8e565b612e2481613f29565b840191505092915050565b6000612e3a82613bbe565b612e448185613beb565b9350612e54818560208601613d8e565b80840191505092915050565b6000612e6d602b83613bda565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000612ed3603283613bda565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612f39602683613bda565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612f9f601c83613bda565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000612fdf602483613bda565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613045601983613bda565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613085602883613bda565b91507f476f696e67206f7665722035353535206368696269207769746820746865207060008301527f757263686173652e0000000000000000000000000000000000000000000000006020830152604082019050919050565b60006130eb602c83613bda565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613151601683613bda565b91507f416c6c2043686962697320617265206d696e7465642e000000000000000000006000830152602082019050919050565b6000613191603883613bda565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006131f7602a83613bda565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061325d602983613bda565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006132c3600e83613bda565b91507f496e76616c69642070726963652e0000000000000000000000000000000000006000830152602082019050919050565b6000613303602083613bda565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613343602c83613bda565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006133a9600583613beb565b91507f2e6a736f6e0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b60006133e9602083613bda565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613429602983613bda565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061348f602f83613bda565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006134f5602183613bda565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061355b603183613bda565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006135c1602083613bda565b91507f427579696e6720746f6f206d616e7920706572207472616e73616374696f6e2e6000830152602082019050919050565b6000613601601683613bda565b91507f4e6f204368696269206c65667420746f206d696e742e000000000000000000006000830152602082019050919050565b6000613641602c83613bda565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b60006136a7601183613bda565b91507f53616c65206973206e6f74206f70656e2e0000000000000000000000000000006000830152602082019050919050565b60006136e7600183613beb565b91507f2f000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b61372381613d75565b82525050565b60006137358285612e2f565b9150613740826136da565b915061374c8284612e2f565b91506137578261339c565b91508190509392505050565b60006020820190506137786000830184612d9f565b92915050565b60006080820190506137936000830187612d9f565b6137a06020830186612d9f565b6137ad604083018561371a565b81810360608301526137bf8184612dbd565b905095945050505050565b60006020820190506137df6000830184612dae565b92915050565b600060208201905081810360008301526137ff8184612df6565b905092915050565b6000602082019050818103600083015261382081612e60565b9050919050565b6000602082019050818103600083015261384081612ec6565b9050919050565b6000602082019050818103600083015261386081612f2c565b9050919050565b6000602082019050818103600083015261388081612f92565b9050919050565b600060208201905081810360008301526138a081612fd2565b9050919050565b600060208201905081810360008301526138c081613038565b9050919050565b600060208201905081810360008301526138e081613078565b9050919050565b60006020820190508181036000830152613900816130de565b9050919050565b6000602082019050818103600083015261392081613144565b9050919050565b6000602082019050818103600083015261394081613184565b9050919050565b60006020820190508181036000830152613960816131ea565b9050919050565b6000602082019050818103600083015261398081613250565b9050919050565b600060208201905081810360008301526139a0816132b6565b9050919050565b600060208201905081810360008301526139c0816132f6565b9050919050565b600060208201905081810360008301526139e081613336565b9050919050565b60006020820190508181036000830152613a00816133dc565b9050919050565b60006020820190508181036000830152613a208161341c565b9050919050565b60006020820190508181036000830152613a4081613482565b9050919050565b60006020820190508181036000830152613a60816134e8565b9050919050565b60006020820190508181036000830152613a808161354e565b9050919050565b60006020820190508181036000830152613aa0816135b4565b9050919050565b60006020820190508181036000830152613ac0816135f4565b9050919050565b60006020820190508181036000830152613ae081613634565b9050919050565b60006020820190508181036000830152613b008161369a565b9050919050565b6000602082019050613b1c600083018461371a565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613b4957613b48613efa565b5b8060405250919050565b600067ffffffffffffffff821115613b6e57613b6d613efa565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613b9e57613b9d613efa565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613c0182613d75565b9150613c0c83613d75565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c4157613c40613e6d565b5b828201905092915050565b6000613c5782613d75565b9150613c6283613d75565b925082613c7257613c71613e9c565b5b828204905092915050565b6000613c8882613d75565b9150613c9383613d75565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613ccc57613ccb613e6d565b5b828202905092915050565b6000613ce282613d75565b9150613ced83613d75565b925082821015613d0057613cff613e6d565b5b828203905092915050565b6000613d1682613d55565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613dac578082015181840152602081019050613d91565b83811115613dbb576000848401525b50505050565b60006002820490506001821680613dd957607f821691505b60208210811415613ded57613dec613ecb565b5b50919050565b6000613dfe82613d75565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e3157613e30613e6d565b5b600182019050919050565b6000613e4782613d75565b9150613e5283613d75565b925082613e6257613e61613e9c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613f4381613d0b565b8114613f4e57600080fd5b50565b613f5a81613d1d565b8114613f6557600080fd5b50565b613f7181613d29565b8114613f7c57600080fd5b50565b613f8881613d75565b8114613f9357600080fd5b5056fea2646970667358221220aebe4e09ac18782d261d024f1d20d180ce553bb4972612f591b834e5d4800dbe64736f6c634300080000330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d584e6142364e73504163627957586f71474841647037444a476e38564e4376665365773657586663714e444500000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101c25760003560e01c80637146bd08116100f7578063a22cb46511610095578063d639cdd111610064578063d639cdd114610635578063e985e9c51461065e578063eb7d6d211461069b578063f2fde38b146106b7576101c2565b8063a22cb4651461057d578063a2b40d19146105a6578063b88d4fde146105cf578063c87b56dd146105f8576101c2565b8063853828b6116100d1578063853828b6146104f25780638da5cb5b146104fc57806395d89b4114610527578063a035b1fe14610552576101c2565b80637146bd0814610485578063714c5398146104b0578063715018a6146104db576101c2565b80632f745c59116101645780634f6ccce71161013e5780634f6ccce7146103a35780636352211e146103e05780636cf4167e1461041d57806370a0823114610448576101c2565b80632f745c591461031457806339a0c6f91461035157806342842e0e1461037a576101c2565b8063095ea7b3116101a0578063095ea7b31461026c57806318160ddd146102955780631a081330146102c057806323b872dd146102eb576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190612ce3565b6106e0565b6040516101fb91906137ca565b60405180910390f35b34801561021057600080fd5b5061021961075a565b60405161022691906137e5565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190612d76565b6107ec565b6040516102639190613763565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e9190612c7e565b610871565b005b3480156102a157600080fd5b506102aa610989565b6040516102b79190613b07565b60405180910390f35b3480156102cc57600080fd5b506102d5610996565b6040516102e291906137ca565b60405180910390f35b3480156102f757600080fd5b50610312600480360381019061030d9190612b78565b6109a9565b005b34801561032057600080fd5b5061033b60048036038101906103369190612c7e565b610a09565b6040516103489190613b07565b60405180910390f35b34801561035d57600080fd5b5061037860048036038101906103739190612d35565b610aae565b005b34801561038657600080fd5b506103a1600480360381019061039c9190612b78565b610b44565b005b3480156103af57600080fd5b506103ca60048036038101906103c59190612d76565b610b64565b6040516103d79190613b07565b60405180910390f35b3480156103ec57600080fd5b5061040760048036038101906104029190612d76565b610bfb565b6040516104149190613763565b60405180910390f35b34801561042957600080fd5b50610432610cad565b60405161043f9190613b07565b60405180910390f35b34801561045457600080fd5b5061046f600480360381019061046a9190612b13565b610cb3565b60405161047c9190613b07565b60405180910390f35b34801561049157600080fd5b5061049a610d6b565b6040516104a79190613b07565b60405180910390f35b3480156104bc57600080fd5b506104c5610d70565b6040516104d291906137e5565b60405180910390f35b3480156104e757600080fd5b506104f0610dfb565b005b6104fa610e83565b005b34801561050857600080fd5b50610511610f46565b60405161051e9190613763565b60405180910390f35b34801561053357600080fd5b5061053c610f70565b60405161054991906137e5565b60405180910390f35b34801561055e57600080fd5b50610567611002565b6040516105749190613b07565b60405180910390f35b34801561058957600080fd5b506105a4600480360381019061059f9190612c42565b611008565b005b3480156105b257600080fd5b506105cd60048036038101906105c89190612d76565b611189565b005b3480156105db57600080fd5b506105f660048036038101906105f19190612bc7565b61120f565b005b34801561060457600080fd5b5061061f600480360381019061061a9190612d76565b611271565b60405161062c91906137e5565b60405180910390f35b34801561064157600080fd5b5061065c60048036038101906106579190612cba565b611318565b005b34801561066a57600080fd5b5061068560048036038101906106809190612b3c565b6113b1565b60405161069291906137ca565b60405180910390f35b6106b560048036038101906106b09190612d76565b611445565b005b3480156106c357600080fd5b506106de60048036038101906106d99190612b13565b61167c565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610753575061075282611774565b5b9050919050565b60606000805461076990613dc1565b80601f016020809104026020016040519081016040528092919081815260200182805461079590613dc1565b80156107e25780601f106107b7576101008083540402835291602001916107e2565b820191906000526020600020905b8154815290600101906020018083116107c557829003601f168201915b5050505050905090565b60006107f782611856565b610836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082d906139c7565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061087c82610bfb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e490613a47565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661090c6118c2565b73ffffffffffffffffffffffffffffffffffffffff16148061093b575061093a816109356118c2565b6113b1565b5b61097a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097190613927565b60405180910390fd5b61098483836118ca565b505050565b6000600880549050905090565b600c60009054906101000a900460ff1681565b6109ba6109b46118c2565b82611983565b6109f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f090613a67565b60405180910390fd5b610a04838383611a61565b505050565b6000610a1483610cb3565b8210610a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4c90613807565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ab66118c2565b73ffffffffffffffffffffffffffffffffffffffff16610ad4610f46565b73ffffffffffffffffffffffffffffffffffffffff1614610b2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b21906139e7565b60405180910390fd5b80600d9080519060200190610b40929190612937565b5050565b610b5f8383836040518060200160405280600081525061120f565b505050565b6000610b6e610989565b8210610baf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba690613ac7565b60405180910390fd5b60088281548110610be9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ca4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9b90613967565b60405180910390fd5b80915050919050565b6115b381565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1b90613947565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600a81565b6060610d7a6118c2565b73ffffffffffffffffffffffffffffffffffffffff16610d98610f46565b73ffffffffffffffffffffffffffffffffffffffff1614610dee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de5906139e7565b60405180910390fd5b610df6611cbd565b905090565b610e036118c2565b73ffffffffffffffffffffffffffffffffffffffff16610e21610f46565b73ffffffffffffffffffffffffffffffffffffffff1614610e77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6e906139e7565b60405180910390fd5b610e816000611d4f565b565b610e8b6118c2565b73ffffffffffffffffffffffffffffffffffffffff16610ea9610f46565b73ffffffffffffffffffffffffffffffffffffffff1614610eff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef6906139e7565b60405180910390fd5b610f076118c2565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610f4457600080fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610f7f90613dc1565b80601f0160208091040260200160405190810160405280929190818152602001828054610fab90613dc1565b8015610ff85780601f10610fcd57610100808354040283529160200191610ff8565b820191906000526020600020905b815481529060010190602001808311610fdb57829003601f168201915b5050505050905090565b600b5481565b6110106118c2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561107e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611075906138a7565b60405180910390fd5b806005600061108b6118c2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166111386118c2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161117d91906137ca565b60405180910390a35050565b6111916118c2565b73ffffffffffffffffffffffffffffffffffffffff166111af610f46565b73ffffffffffffffffffffffffffffffffffffffff1614611205576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fc906139e7565b60405180910390fd5b80600b8190555050565b61122061121a6118c2565b83611983565b61125f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125690613a67565b60405180910390fd5b61126b84848484611e15565b50505050565b606061127c82611856565b6112bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b290613a27565b60405180910390fd5b60006112c5611cbd565b905060008151116112e55760405180602001604052806000815250611310565b806112ef84611e71565b604051602001611300929190613729565b6040516020818303038152906040525b915050919050565b6113206118c2565b73ffffffffffffffffffffffffffffffffffffffff1661133e610f46565b73ffffffffffffffffffffffffffffffffffffffff1614611394576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138b906139e7565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115b3611450610989565b10611490576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148790613aa7565b60405180910390fd5b611498610f46565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461151a57600c60009054906101000a900460ff16611519576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151090613ae7565b60405180910390fd5b5b6115b3611525610989565b10611565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155c90613907565b60405180910390fd5b600a8111156115a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a090613a87565b60405180910390fd5b6115b36115bd6115b7610989565b8361201e565b11156115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f5906138c7565b60405180910390fd5b61160781612034565b341015611649576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164090613987565b60405180910390fd5b60005b818110156116785761166533611660610989565b61204b565b808061167090613df3565b91505061164c565b5050565b6116846118c2565b73ffffffffffffffffffffffffffffffffffffffff166116a2610f46565b73ffffffffffffffffffffffffffffffffffffffff16146116f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ef906139e7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611768576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175f90613847565b60405180910390fd5b61177181611d4f565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061183f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061184f575061184e82612069565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661193d83610bfb565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061198e82611856565b6119cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c4906138e7565b60405180910390fd5b60006119d883610bfb565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611a4757508373ffffffffffffffffffffffffffffffffffffffff16611a2f846107ec565b73ffffffffffffffffffffffffffffffffffffffff16145b80611a585750611a5781856113b1565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611a8182610bfb565b73ffffffffffffffffffffffffffffffffffffffff1614611ad7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ace90613a07565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3e90613887565b60405180910390fd5b611b528383836120d3565b611b5d6000826118ca565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bad9190613cd7565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c049190613bf6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6060600d8054611ccc90613dc1565b80601f0160208091040260200160405190810160405280929190818152602001828054611cf890613dc1565b8015611d455780601f10611d1a57610100808354040283529160200191611d45565b820191906000526020600020905b815481529060010190602001808311611d2857829003601f168201915b5050505050905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611e20848484611a61565b611e2c848484846121e7565b611e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6290613827565b60405180910390fd5b50505050565b60606000821415611eb9576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612019565b600082905060005b60008214611eeb578080611ed490613df3565b915050600a82611ee49190613c4c565b9150611ec1565b60008167ffffffffffffffff811115611f2d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611f5f5781602001600182028036833780820191505090505b5090505b6000851461201257600182611f789190613cd7565b9150600a85611f879190613e3c565b6030611f939190613bf6565b60f81b818381518110611fcf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561200b9190613c4c565b9450611f63565b8093505050505b919050565b6000818361202c9190613bf6565b905092915050565b600081600b546120449190613c7d565b9050919050565b61206582826040518060200160405280600081525061237e565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6120de8383836123d9565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121215761211c816123de565b612160565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461215f5761215e8382612427565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121a35761219e81612594565b6121e2565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146121e1576121e082826126d7565b5b5b505050565b60006122088473ffffffffffffffffffffffffffffffffffffffff16612756565b15612371578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122316118c2565b8786866040518563ffffffff1660e01b8152600401612253949392919061377e565b602060405180830381600087803b15801561226d57600080fd5b505af192505050801561229e57506040513d601f19601f8201168201806040525081019061229b9190612d0c565b60015b612321573d80600081146122ce576040519150601f19603f3d011682016040523d82523d6000602084013e6122d3565b606091505b50600081511415612319576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231090613827565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612376565b600190505b949350505050565b6123888383612769565b61239560008484846121e7565b6123d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cb90613827565b60405180910390fd5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161243484610cb3565b61243e9190613cd7565b9050600060076000848152602001908152602001600020549050818114612523576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506125a89190613cd7565b90506000600960008481526020019081526020016000205490506000600883815481106125fe577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612646577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806126bb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006126e283610cb3565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d0906139a7565b60405180910390fd5b6127e281611856565b15612822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281990613867565b60405180910390fd5b61282e600083836120d3565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461287e9190613bf6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461294390613dc1565b90600052602060002090601f01602090048101928261296557600085556129ac565b82601f1061297e57805160ff19168380011785556129ac565b828001600101855582156129ac579182015b828111156129ab578251825591602001919060010190612990565b5b5090506129b991906129bd565b5090565b5b808211156129d65760008160009055506001016129be565b5090565b60006129ed6129e884613b53565b613b22565b905082815260208101848484011115612a0557600080fd5b612a10848285613d7f565b509392505050565b6000612a2b612a2684613b83565b613b22565b905082815260208101848484011115612a4357600080fd5b612a4e848285613d7f565b509392505050565b600081359050612a6581613f3a565b92915050565b600081359050612a7a81613f51565b92915050565b600081359050612a8f81613f68565b92915050565b600081519050612aa481613f68565b92915050565b600082601f830112612abb57600080fd5b8135612acb8482602086016129da565b91505092915050565b600082601f830112612ae557600080fd5b8135612af5848260208601612a18565b91505092915050565b600081359050612b0d81613f7f565b92915050565b600060208284031215612b2557600080fd5b6000612b3384828501612a56565b91505092915050565b60008060408385031215612b4f57600080fd5b6000612b5d85828601612a56565b9250506020612b6e85828601612a56565b9150509250929050565b600080600060608486031215612b8d57600080fd5b6000612b9b86828701612a56565b9350506020612bac86828701612a56565b9250506040612bbd86828701612afe565b9150509250925092565b60008060008060808587031215612bdd57600080fd5b6000612beb87828801612a56565b9450506020612bfc87828801612a56565b9350506040612c0d87828801612afe565b925050606085013567ffffffffffffffff811115612c2a57600080fd5b612c3687828801612aaa565b91505092959194509250565b60008060408385031215612c5557600080fd5b6000612c6385828601612a56565b9250506020612c7485828601612a6b565b9150509250929050565b60008060408385031215612c9157600080fd5b6000612c9f85828601612a56565b9250506020612cb085828601612afe565b9150509250929050565b600060208284031215612ccc57600080fd5b6000612cda84828501612a6b565b91505092915050565b600060208284031215612cf557600080fd5b6000612d0384828501612a80565b91505092915050565b600060208284031215612d1e57600080fd5b6000612d2c84828501612a95565b91505092915050565b600060208284031215612d4757600080fd5b600082013567ffffffffffffffff811115612d6157600080fd5b612d6d84828501612ad4565b91505092915050565b600060208284031215612d8857600080fd5b6000612d9684828501612afe565b91505092915050565b612da881613d0b565b82525050565b612db781613d1d565b82525050565b6000612dc882613bb3565b612dd28185613bc9565b9350612de2818560208601613d8e565b612deb81613f29565b840191505092915050565b6000612e0182613bbe565b612e0b8185613bda565b9350612e1b818560208601613d8e565b612e2481613f29565b840191505092915050565b6000612e3a82613bbe565b612e448185613beb565b9350612e54818560208601613d8e565b80840191505092915050565b6000612e6d602b83613bda565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000612ed3603283613bda565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612f39602683613bda565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612f9f601c83613bda565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000612fdf602483613bda565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613045601983613bda565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613085602883613bda565b91507f476f696e67206f7665722035353535206368696269207769746820746865207060008301527f757263686173652e0000000000000000000000000000000000000000000000006020830152604082019050919050565b60006130eb602c83613bda565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613151601683613bda565b91507f416c6c2043686962697320617265206d696e7465642e000000000000000000006000830152602082019050919050565b6000613191603883613bda565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006131f7602a83613bda565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061325d602983613bda565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006132c3600e83613bda565b91507f496e76616c69642070726963652e0000000000000000000000000000000000006000830152602082019050919050565b6000613303602083613bda565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613343602c83613bda565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006133a9600583613beb565b91507f2e6a736f6e0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b60006133e9602083613bda565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613429602983613bda565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061348f602f83613bda565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006134f5602183613bda565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061355b603183613bda565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006135c1602083613bda565b91507f427579696e6720746f6f206d616e7920706572207472616e73616374696f6e2e6000830152602082019050919050565b6000613601601683613bda565b91507f4e6f204368696269206c65667420746f206d696e742e000000000000000000006000830152602082019050919050565b6000613641602c83613bda565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b60006136a7601183613bda565b91507f53616c65206973206e6f74206f70656e2e0000000000000000000000000000006000830152602082019050919050565b60006136e7600183613beb565b91507f2f000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b61372381613d75565b82525050565b60006137358285612e2f565b9150613740826136da565b915061374c8284612e2f565b91506137578261339c565b91508190509392505050565b60006020820190506137786000830184612d9f565b92915050565b60006080820190506137936000830187612d9f565b6137a06020830186612d9f565b6137ad604083018561371a565b81810360608301526137bf8184612dbd565b905095945050505050565b60006020820190506137df6000830184612dae565b92915050565b600060208201905081810360008301526137ff8184612df6565b905092915050565b6000602082019050818103600083015261382081612e60565b9050919050565b6000602082019050818103600083015261384081612ec6565b9050919050565b6000602082019050818103600083015261386081612f2c565b9050919050565b6000602082019050818103600083015261388081612f92565b9050919050565b600060208201905081810360008301526138a081612fd2565b9050919050565b600060208201905081810360008301526138c081613038565b9050919050565b600060208201905081810360008301526138e081613078565b9050919050565b60006020820190508181036000830152613900816130de565b9050919050565b6000602082019050818103600083015261392081613144565b9050919050565b6000602082019050818103600083015261394081613184565b9050919050565b60006020820190508181036000830152613960816131ea565b9050919050565b6000602082019050818103600083015261398081613250565b9050919050565b600060208201905081810360008301526139a0816132b6565b9050919050565b600060208201905081810360008301526139c0816132f6565b9050919050565b600060208201905081810360008301526139e081613336565b9050919050565b60006020820190508181036000830152613a00816133dc565b9050919050565b60006020820190508181036000830152613a208161341c565b9050919050565b60006020820190508181036000830152613a4081613482565b9050919050565b60006020820190508181036000830152613a60816134e8565b9050919050565b60006020820190508181036000830152613a808161354e565b9050919050565b60006020820190508181036000830152613aa0816135b4565b9050919050565b60006020820190508181036000830152613ac0816135f4565b9050919050565b60006020820190508181036000830152613ae081613634565b9050919050565b60006020820190508181036000830152613b008161369a565b9050919050565b6000602082019050613b1c600083018461371a565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613b4957613b48613efa565b5b8060405250919050565b600067ffffffffffffffff821115613b6e57613b6d613efa565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613b9e57613b9d613efa565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613c0182613d75565b9150613c0c83613d75565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c4157613c40613e6d565b5b828201905092915050565b6000613c5782613d75565b9150613c6283613d75565b925082613c7257613c71613e9c565b5b828204905092915050565b6000613c8882613d75565b9150613c9383613d75565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613ccc57613ccb613e6d565b5b828202905092915050565b6000613ce282613d75565b9150613ced83613d75565b925082821015613d0057613cff613e6d565b5b828203905092915050565b6000613d1682613d55565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613dac578082015181840152602081019050613d91565b83811115613dbb576000848401525b50505050565b60006002820490506001821680613dd957607f821691505b60208210811415613ded57613dec613ecb565b5b50919050565b6000613dfe82613d75565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e3157613e30613e6d565b5b600182019050919050565b6000613e4782613d75565b9150613e5283613d75565b925082613e6257613e61613e9c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613f4381613d0b565b8114613f4e57600080fd5b50565b613f5a81613d1d565b8114613f6557600080fd5b50565b613f7181613d29565b8114613f7c57600080fd5b50565b613f8881613d75565b8114613f9357600080fd5b5056fea2646970667358221220aebe4e09ac18782d261d024f1d20d180ce553bb4972612f591b834e5d4800dbe64736f6c63430008000033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d584e6142364e73504163627957586f71474841647037444a476e38564e4376665365773657586663714e444500000000000000000000000000000000

-----Decoded View---------------
Arg [0] : baseURI (string): https://gateway.pinata.cloud/ipfs/QmXNaB6NsPAcbyWXoqGHAdp7DJGn8VNCvfSew6WXfcqNDE

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000050
Arg [2] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [3] : 732f516d584e6142364e73504163627957586f71474841647037444a476e3856
Arg [4] : 4e4376665365773657586663714e444500000000000000000000000000000000


Deployed Bytecode Sourcemap

50107:2511:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43893:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30778:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32337:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31860:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44533:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50311:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33227:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44201:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50876:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33637:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44723:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30472:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50158:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30202:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50214:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50764:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4672:94;;;;;;;;;;;;;:::i;:::-;;51179:125;;;:::i;:::-;;4021:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30947:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50262:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32630:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50989:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33893:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52110:348;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51081:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32996:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51358:622;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4921:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43893:224;43995:4;44034:35;44019:50;;;:11;:50;;;;:90;;;;44073:36;44097:11;44073:23;:36::i;:::-;44019:90;44012:97;;43893:224;;;:::o;30778:100::-;30832:13;30865:5;30858:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30778:100;:::o;32337:221::-;32413:7;32441:16;32449:7;32441;:16::i;:::-;32433:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32526:15;:24;32542:7;32526:24;;;;;;;;;;;;;;;;;;;;;32519:31;;32337:221;;;:::o;31860:411::-;31941:13;31957:23;31972:7;31957:14;:23::i;:::-;31941:39;;32005:5;31999:11;;:2;:11;;;;31991:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;32099:5;32083:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;32108:37;32125:5;32132:12;:10;:12::i;:::-;32108:16;:37::i;:::-;32083:62;32061:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;32242:21;32251:2;32255:7;32242:8;:21::i;:::-;31860:411;;;:::o;44533:113::-;44594:7;44621:10;:17;;;;44614:24;;44533:113;:::o;50311:30::-;;;;;;;;;;;;;:::o;33227:339::-;33422:41;33441:12;:10;:12::i;:::-;33455:7;33422:18;:41::i;:::-;33414:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33530:28;33540:4;33546:2;33550:7;33530:9;:28::i;:::-;33227:339;;;:::o;44201:256::-;44298:7;44334:23;44351:5;44334:16;:23::i;:::-;44326:5;:31;44318:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;44423:12;:19;44436:5;44423:19;;;;;;;;;;;;;;;:26;44443:5;44423:26;;;;;;;;;;;;44416:33;;44201:256;;;;:::o;50876:105::-;4252:12;:10;:12::i;:::-;4241:23;;:7;:5;:7::i;:::-;:23;;;4233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50966:7:::1;50950:13;:23;;;;;;;;;;;;:::i;:::-;;50876:105:::0;:::o;33637:185::-;33775:39;33792:4;33798:2;33802:7;33775:39;;;;;;;;;;;;:16;:39::i;:::-;33637:185;;;:::o;44723:233::-;44798:7;44834:30;:28;:30::i;:::-;44826:5;:38;44818:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;44931:10;44942:5;44931:17;;;;;;;;;;;;;;;;;;;;;;;;44924:24;;44723:233;;;:::o;30472:239::-;30544:7;30564:13;30580:7;:16;30588:7;30580:16;;;;;;;;;;;;;;;;;;;;;30564:32;;30632:1;30615:19;;:5;:19;;;;30607:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30698:5;30691:12;;;30472:239;;;:::o;50158:49::-;50203:4;50158:49;:::o;30202:208::-;30274:7;30319:1;30302:19;;:5;:19;;;;30294:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;30386:9;:16;30396:5;30386:16;;;;;;;;;;;;;;;;30379:23;;30202:208;;;:::o;50214:41::-;50253:2;50214:41;:::o;50764:104::-;50817:13;4252:12;:10;:12::i;:::-;4241:23;;:7;:5;:7::i;:::-;:23;;;4233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50850:10:::1;:8;:10::i;:::-;50843:17;;50764:104:::0;:::o;4672:94::-;4252:12;:10;:12::i;:::-;4241:23;;:7;:5;:7::i;:::-;:23;;;4233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4737:21:::1;4755:1;4737:9;:21::i;:::-;4672:94::o:0;51179:125::-;4252:12;:10;:12::i;:::-;4241:23;;:7;:5;:7::i;:::-;:23;;;4233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51254:12:::1;:10;:12::i;:::-;51246:26;;:49;51273:21;51246:49;;;;;;;;;;;;;;;;;;;;;;;51238:58;;;::::0;::::1;;51179:125::o:0;4021:87::-;4067:7;4094:6;;;;;;;;;;;4087:13;;4021:87;:::o;30947:104::-;31003:13;31036:7;31029:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30947:104;:::o;50262:40::-;;;;:::o;32630:295::-;32745:12;:10;:12::i;:::-;32733:24;;:8;:24;;;;32725:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;32845:8;32800:18;:32;32819:12;:10;:12::i;:::-;32800:32;;;;;;;;;;;;;;;:42;32833:8;32800:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;32898:8;32869:48;;32884:12;:10;:12::i;:::-;32869:48;;;32908:8;32869:48;;;;;;:::i;:::-;;;;;;;;32630:295;;:::o;50989:84::-;4252:12;:10;:12::i;:::-;4241:23;;:7;:5;:7::i;:::-;:23;;;4233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51059:6:::1;51051:5;:14;;;;50989:84:::0;:::o;33893:328::-;34068:41;34087:12;:10;:12::i;:::-;34101:7;34068:18;:41::i;:::-;34060:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;34174:39;34188:4;34194:2;34198:7;34207:5;34174:13;:39::i;:::-;33893:328;;;;:::o;52110:348::-;52183:13;52217:16;52225:7;52217;:16::i;:::-;52209:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;52298:21;52322:10;:8;:10::i;:::-;52298:34;;52374:1;52356:7;52350:21;:25;:100;;;;;;;;;;;;;;;;;52402:7;52416:18;:7;:16;:18::i;:::-;52385:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52350:100;52343:107;;;52110:348;;;:::o;51081:90::-;4252:12;:10;:12::i;:::-;4241:23;;:7;:5;:7::i;:::-;:23;;;4233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51158:5:::1;51145:10;;:18;;;;;;;;;;;;;;;;;;51081:90:::0;:::o;32996:164::-;33093:4;33117:18;:25;33136:5;33117:25;;;;;;;;;;;;;;;:35;33143:8;33117:35;;;;;;;;;;;;;;;;;;;;;;;;;33110:42;;32996:164;;;;:::o;51358:622::-;50203:4;50622:13;:11;:13::i;:::-;:34;50614:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;51452:7:::1;:5;:7::i;:::-;51438:21;;:10;:21;;;51435:92;;51483:10;;;;;;;;;;;51475:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;51435:92;50203:4;51545:13;:11;:13::i;:::-;:34;51537:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;50253:2;51625:3;:19;;51617:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;50203:4;51700:32;51713:13;:11;:13::i;:::-;51728:3;51700:12;:32::i;:::-;:54;;51692:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;51831:14;51841:3;51831:9;:14::i;:::-;51818:9;:27;;51810:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;51881:9;51877:96;51900:3;51896:1;:7;51877:96;;;51925:36;51935:10;51947:13;:11;:13::i;:::-;51925:9;:36::i;:::-;51905:3;;;;;:::i;:::-;;;;51877:96;;;;51358:622:::0;:::o;4921:192::-;4252:12;:10;:12::i;:::-;4241:23;;:7;:5;:7::i;:::-;:23;;;4233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5030:1:::1;5010:22;;:8;:22;;;;5002:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5086:19;5096:8;5086:9;:19::i;:::-;4921:192:::0;:::o;29833:305::-;29935:4;29987:25;29972:40;;;:11;:40;;;;:105;;;;30044:33;30029:48;;;:11;:48;;;;29972:105;:158;;;;30094:36;30118:11;30094:23;:36::i;:::-;29972:158;29952:178;;29833:305;;;:::o;35731:127::-;35796:4;35848:1;35820:30;;:7;:16;35828:7;35820:16;;;;;;;;;;;;;;;;;;;;;:30;;;;35813:37;;35731:127;;;:::o;2803:98::-;2856:7;2883:10;2876:17;;2803:98;:::o;39713:174::-;39815:2;39788:15;:24;39804:7;39788:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39871:7;39867:2;39833:46;;39842:23;39857:7;39842:14;:23::i;:::-;39833:46;;;;;;;;;;;;39713:174;;:::o;36025:348::-;36118:4;36143:16;36151:7;36143;:16::i;:::-;36135:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36219:13;36235:23;36250:7;36235:14;:23::i;:::-;36219:39;;36288:5;36277:16;;:7;:16;;;:51;;;;36321:7;36297:31;;:20;36309:7;36297:11;:20::i;:::-;:31;;;36277:51;:87;;;;36332:32;36349:5;36356:7;36332:16;:32::i;:::-;36277:87;36269:96;;;36025:348;;;;:::o;39017:578::-;39176:4;39149:31;;:23;39164:7;39149:14;:23::i;:::-;:31;;;39141:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;39259:1;39245:16;;:2;:16;;;;39237:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;39315:39;39336:4;39342:2;39346:7;39315:20;:39::i;:::-;39419:29;39436:1;39440:7;39419:8;:29::i;:::-;39480:1;39461:9;:15;39471:4;39461:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;39509:1;39492:9;:13;39502:2;39492:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39540:2;39521:7;:16;39529:7;39521:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39579:7;39575:2;39560:27;;39569:4;39560:27;;;;;;;;;;;;39017:578;;;:::o;51988:114::-;52048:13;52081;52074:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51988:114;:::o;5121:173::-;5177:16;5196:6;;;;;;;;;;;5177:25;;5222:8;5213:6;;:17;;;;;;;;;;;;;;;;;;5277:8;5246:40;;5267:8;5246:40;;;;;;;;;;;;5121:173;;:::o;35103:315::-;35260:28;35270:4;35276:2;35280:7;35260:9;:28::i;:::-;35307:48;35330:4;35336:2;35340:7;35349:5;35307:22;:48::i;:::-;35299:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;35103:315;;;;:::o;412:723::-;468:13;698:1;689:5;:10;685:53;;;716:10;;;;;;;;;;;;;;;;;;;;;685:53;748:12;763:5;748:20;;779:14;804:78;819:1;811:4;:9;804:78;;837:8;;;;;:::i;:::-;;;;868:2;860:10;;;;;:::i;:::-;;;804:78;;;892:19;924:6;914:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;892:39;;942:154;958:1;949:5;:10;942:154;;986:1;976:11;;;;;:::i;:::-;;;1053:2;1045:5;:10;;;;:::i;:::-;1032:2;:24;;;;:::i;:::-;1019:39;;1002:6;1009;1002:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;1082:2;1073:11;;;;;:::i;:::-;;;942:154;;;1120:6;1106:21;;;;;412:723;;;;:::o;8101:98::-;8159:7;8190:1;8186;:5;;;;:::i;:::-;8179:12;;8101:98;;;;:::o;52514:101::-;52569:7;52604:3;52596:5;;:11;;;;:::i;:::-;52589:18;;52514:101;;;:::o;36715:110::-;36791:26;36801:2;36805:7;36791:26;;;;;;;;;;;;:9;:26::i;:::-;36715:110;;:::o;28331:157::-;28416:4;28455:25;28440:40;;;:11;:40;;;;28433:47;;28331:157;;;:::o;45569:589::-;45713:45;45740:4;45746:2;45750:7;45713:26;:45::i;:::-;45791:1;45775:18;;:4;:18;;;45771:187;;;45810:40;45842:7;45810:31;:40::i;:::-;45771:187;;;45880:2;45872:10;;:4;:10;;;45868:90;;45899:47;45932:4;45938:7;45899:32;:47::i;:::-;45868:90;45771:187;45986:1;45972:16;;:2;:16;;;45968:183;;;46005:45;46042:7;46005:36;:45::i;:::-;45968:183;;;46078:4;46072:10;;:2;:10;;;46068:83;;46099:40;46127:2;46131:7;46099:27;:40::i;:::-;46068:83;45968:183;45569:589;;;:::o;40452:803::-;40607:4;40628:15;:2;:13;;;:15::i;:::-;40624:624;;;40680:2;40664:36;;;40701:12;:10;:12::i;:::-;40715:4;40721:7;40730:5;40664:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40660:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40927:1;40910:6;:13;:18;40906:272;;;40953:60;;;;;;;;;;:::i;:::-;;;;;;;;40906:272;41128:6;41122:13;41113:6;41109:2;41105:15;41098:38;40660:533;40797:45;;;40787:55;;;:6;:55;;;;40780:62;;;;;40624:624;41232:4;41225:11;;40452:803;;;;;;;:::o;37052:321::-;37182:18;37188:2;37192:7;37182:5;:18::i;:::-;37233:54;37264:1;37268:2;37272:7;37281:5;37233:22;:54::i;:::-;37211:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;37052:321;;;:::o;41827:126::-;;;;:::o;46881:164::-;46985:10;:17;;;;46958:15;:24;46974:7;46958:24;;;;;;;;;;;:44;;;;47013:10;47029:7;47013:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46881:164;:::o;47672:988::-;47938:22;47988:1;47963:22;47980:4;47963:16;:22::i;:::-;:26;;;;:::i;:::-;47938:51;;48000:18;48021:17;:26;48039:7;48021:26;;;;;;;;;;;;48000:47;;48168:14;48154:10;:28;48150:328;;48199:19;48221:12;:18;48234:4;48221:18;;;;;;;;;;;;;;;:34;48240:14;48221:34;;;;;;;;;;;;48199:56;;48305:11;48272:12;:18;48285:4;48272:18;;;;;;;;;;;;;;;:30;48291:10;48272:30;;;;;;;;;;;:44;;;;48422:10;48389:17;:30;48407:11;48389:30;;;;;;;;;;;:43;;;;48150:328;;48574:17;:26;48592:7;48574:26;;;;;;;;;;;48567:33;;;48618:12;:18;48631:4;48618:18;;;;;;;;;;;;;;;:34;48637:14;48618:34;;;;;;;;;;;48611:41;;;47672:988;;;;:::o;48955:1079::-;49208:22;49253:1;49233:10;:17;;;;:21;;;;:::i;:::-;49208:46;;49265:18;49286:15;:24;49302:7;49286:24;;;;;;;;;;;;49265:45;;49637:19;49659:10;49670:14;49659:26;;;;;;;;;;;;;;;;;;;;;;;;49637:48;;49723:11;49698:10;49709;49698:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;49834:10;49803:15;:28;49819:11;49803:28;;;;;;;;;;;:41;;;;49975:15;:24;49991:7;49975:24;;;;;;;;;;;49968:31;;;50010:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48955:1079;;;;:::o;46459:221::-;46544:14;46561:20;46578:2;46561:16;:20::i;:::-;46544:37;;46619:7;46592:12;:16;46605:2;46592:16;;;;;;;;;;;;;;;:24;46609:6;46592:24;;;;;;;;;;;:34;;;;46666:6;46637:17;:26;46655:7;46637:26;;;;;;;;;;;:35;;;;46459:221;;;:::o;20413:387::-;20473:4;20681:12;20748:7;20736:20;20728:28;;20791:1;20784:4;:8;20777:15;;;20413:387;;;:::o;37709:382::-;37803:1;37789:16;;:2;:16;;;;37781:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;37862:16;37870:7;37862;:16::i;:::-;37861:17;37853:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37924:45;37953:1;37957:2;37961:7;37924:20;:45::i;:::-;37999:1;37982:9;:13;37992:2;37982:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;38030:2;38011:7;:16;38019:7;38011:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;38075:7;38071:2;38050:33;;38067:1;38050:33;;;;;;;;;;;;37709:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:262::-;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2073:196;;;;:::o;2275:407::-;;;2400:2;2388:9;2379:7;2375:23;2371:32;2368:2;;;2416:1;2413;2406:12;2368:2;2459:1;2484:53;2529:7;2520:6;2509:9;2505:22;2484:53;:::i;:::-;2474:63;;2430:117;2586:2;2612:53;2657:7;2648:6;2637:9;2633:22;2612:53;:::i;:::-;2602:63;;2557:118;2358:324;;;;;:::o;2688:552::-;;;;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;:::i;:::-;3032:63;;2987:118;3144:2;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3115:118;2788:452;;;;;:::o;3246:809::-;;;;;3414:3;3402:9;3393:7;3389:23;3385:33;3382:2;;;3431:1;3428;3421:12;3382:2;3474:1;3499:53;3544:7;3535:6;3524:9;3520:22;3499:53;:::i;:::-;3489:63;;3445:117;3601:2;3627:53;3672:7;3663:6;3652:9;3648:22;3627:53;:::i;:::-;3617:63;;3572:118;3729:2;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3700:118;3885:2;3874:9;3870:18;3857:32;3916:18;3908:6;3905:30;3902:2;;;3948:1;3945;3938:12;3902:2;3976:62;4030:7;4021:6;4010:9;4006:22;3976:62;:::i;:::-;3966:72;;3828:220;3372:683;;;;;;;:::o;4061:401::-;;;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4199:1;4196;4189:12;4151:2;4242:1;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4213:117;4369:2;4395:50;4437:7;4428:6;4417:9;4413:22;4395:50;:::i;:::-;4385:60;;4340:115;4141:321;;;;;:::o;4468:407::-;;;4593:2;4581:9;4572:7;4568:23;4564:32;4561:2;;;4609:1;4606;4599:12;4561:2;4652:1;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4623:117;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4551:324;;;;;:::o;4881:256::-;;4986:2;4974:9;4965:7;4961:23;4957:32;4954:2;;;5002:1;4999;4992:12;4954:2;5045:1;5070:50;5112:7;5103:6;5092:9;5088:22;5070:50;:::i;:::-;5060:60;;5016:114;4944:193;;;;:::o;5143:260::-;;5250:2;5238:9;5229:7;5225:23;5221:32;5218:2;;;5266:1;5263;5256:12;5218:2;5309:1;5334:52;5378:7;5369:6;5358:9;5354:22;5334:52;:::i;:::-;5324:62;;5280:116;5208:195;;;;:::o;5409:282::-;;5527:2;5515:9;5506:7;5502:23;5498:32;5495:2;;;5543:1;5540;5533:12;5495:2;5586:1;5611:63;5666:7;5657:6;5646:9;5642:22;5611:63;:::i;:::-;5601:73;;5557:127;5485:206;;;;:::o;5697:375::-;;5815:2;5803:9;5794:7;5790:23;5786:32;5783:2;;;5831:1;5828;5821:12;5783:2;5902:1;5891:9;5887:17;5874:31;5932:18;5924:6;5921:30;5918:2;;;5964:1;5961;5954:12;5918:2;5992:63;6047:7;6038:6;6027:9;6023:22;5992:63;:::i;:::-;5982:73;;5845:220;5773:299;;;;:::o;6078:262::-;;6186:2;6174:9;6165:7;6161:23;6157:32;6154:2;;;6202:1;6199;6192:12;6154:2;6245:1;6270:53;6315:7;6306:6;6295:9;6291:22;6270:53;:::i;:::-;6260:63;;6216:117;6144:196;;;;:::o;6346:118::-;6433:24;6451:5;6433:24;:::i;:::-;6428:3;6421:37;6411:53;;:::o;6470:109::-;6551:21;6566:5;6551:21;:::i;:::-;6546:3;6539:34;6529:50;;:::o;6585:360::-;;6699:38;6731:5;6699:38;:::i;:::-;6753:70;6816:6;6811:3;6753:70;:::i;:::-;6746:77;;6832:52;6877:6;6872:3;6865:4;6858:5;6854:16;6832:52;:::i;:::-;6909:29;6931:6;6909:29;:::i;:::-;6904:3;6900:39;6893:46;;6675:270;;;;;:::o;6951:364::-;;7067:39;7100:5;7067:39;:::i;:::-;7122:71;7186:6;7181:3;7122:71;:::i;:::-;7115:78;;7202:52;7247:6;7242:3;7235:4;7228:5;7224:16;7202:52;:::i;:::-;7279:29;7301:6;7279:29;:::i;:::-;7274:3;7270:39;7263:46;;7043:272;;;;;:::o;7321:377::-;;7455:39;7488:5;7455:39;:::i;:::-;7510:89;7592:6;7587:3;7510:89;:::i;:::-;7503:96;;7608:52;7653:6;7648:3;7641:4;7634:5;7630:16;7608:52;:::i;:::-;7685:6;7680:3;7676:16;7669:23;;7431:267;;;;;:::o;7704:375::-;;7867:67;7931:2;7926:3;7867:67;:::i;:::-;7860:74;;7964:34;7960:1;7955:3;7951:11;7944:55;8030:13;8025:2;8020:3;8016:12;8009:35;8070:2;8065:3;8061:12;8054:19;;7850:229;;;:::o;8085:382::-;;8248:67;8312:2;8307:3;8248:67;:::i;:::-;8241:74;;8345:34;8341:1;8336:3;8332:11;8325:55;8411:20;8406:2;8401:3;8397:12;8390:42;8458:2;8453:3;8449:12;8442:19;;8231:236;;;:::o;8473:370::-;;8636:67;8700:2;8695:3;8636:67;:::i;:::-;8629:74;;8733:34;8729:1;8724:3;8720:11;8713:55;8799:8;8794:2;8789:3;8785:12;8778:30;8834:2;8829:3;8825:12;8818:19;;8619:224;;;:::o;8849:326::-;;9012:67;9076:2;9071:3;9012:67;:::i;:::-;9005:74;;9109:30;9105:1;9100:3;9096:11;9089:51;9166:2;9161:3;9157:12;9150:19;;8995:180;;;:::o;9181:368::-;;9344:67;9408:2;9403:3;9344:67;:::i;:::-;9337:74;;9441:34;9437:1;9432:3;9428:11;9421:55;9507:6;9502:2;9497:3;9493:12;9486:28;9540:2;9535:3;9531:12;9524:19;;9327:222;;;:::o;9555:323::-;;9718:67;9782:2;9777:3;9718:67;:::i;:::-;9711:74;;9815:27;9811:1;9806:3;9802:11;9795:48;9869:2;9864:3;9860:12;9853:19;;9701:177;;;:::o;9884:372::-;;10047:67;10111:2;10106:3;10047:67;:::i;:::-;10040:74;;10144:34;10140:1;10135:3;10131:11;10124:55;10210:10;10205:2;10200:3;10196:12;10189:32;10247:2;10242:3;10238:12;10231:19;;10030:226;;;:::o;10262:376::-;;10425:67;10489:2;10484:3;10425:67;:::i;:::-;10418:74;;10522:34;10518:1;10513:3;10509:11;10502:55;10588:14;10583:2;10578:3;10574:12;10567:36;10629:2;10624:3;10620:12;10613:19;;10408:230;;;:::o;10644:320::-;;10807:67;10871:2;10866:3;10807:67;:::i;:::-;10800:74;;10904:24;10900:1;10895:3;10891:11;10884:45;10955:2;10950:3;10946:12;10939:19;;10790:174;;;:::o;10970:388::-;;11133:67;11197:2;11192:3;11133:67;:::i;:::-;11126:74;;11230:34;11226:1;11221:3;11217:11;11210:55;11296:26;11291:2;11286:3;11282:12;11275:48;11349:2;11344:3;11340:12;11333:19;;11116:242;;;:::o;11364:374::-;;11527:67;11591:2;11586:3;11527:67;:::i;:::-;11520:74;;11624:34;11620:1;11615:3;11611:11;11604:55;11690:12;11685:2;11680:3;11676:12;11669:34;11729:2;11724:3;11720:12;11713:19;;11510:228;;;:::o;11744:373::-;;11907:67;11971:2;11966:3;11907:67;:::i;:::-;11900:74;;12004:34;12000:1;11995:3;11991:11;11984:55;12070:11;12065:2;12060:3;12056:12;12049:33;12108:2;12103:3;12099:12;12092:19;;11890:227;;;:::o;12123:312::-;;12286:67;12350:2;12345:3;12286:67;:::i;:::-;12279:74;;12383:16;12379:1;12374:3;12370:11;12363:37;12426:2;12421:3;12417:12;12410:19;;12269:166;;;:::o;12441:330::-;;12604:67;12668:2;12663:3;12604:67;:::i;:::-;12597:74;;12701:34;12697:1;12692:3;12688:11;12681:55;12762:2;12757:3;12753:12;12746:19;;12587:184;;;:::o;12777:376::-;;12940:67;13004:2;12999:3;12940:67;:::i;:::-;12933:74;;13037:34;13033:1;13028:3;13024:11;13017:55;13103:14;13098:2;13093:3;13089:12;13082:36;13144:2;13139:3;13135:12;13128:19;;12923:230;;;:::o;13159:337::-;;13340:84;13422:1;13417:3;13340:84;:::i;:::-;13333:91;;13454:7;13450:1;13445:3;13441:11;13434:28;13488:1;13483:3;13479:11;13472:18;;13323:173;;;:::o;13502:330::-;;13665:67;13729:2;13724:3;13665:67;:::i;:::-;13658:74;;13762:34;13758:1;13753:3;13749:11;13742:55;13823:2;13818:3;13814:12;13807:19;;13648:184;;;:::o;13838:373::-;;14001:67;14065:2;14060:3;14001:67;:::i;:::-;13994:74;;14098:34;14094:1;14089:3;14085:11;14078:55;14164:11;14159:2;14154:3;14150:12;14143:33;14202:2;14197:3;14193:12;14186:19;;13984:227;;;:::o;14217:379::-;;14380:67;14444:2;14439:3;14380:67;:::i;:::-;14373:74;;14477:34;14473:1;14468:3;14464:11;14457:55;14543:17;14538:2;14533:3;14529:12;14522:39;14587:2;14582:3;14578:12;14571:19;;14363:233;;;:::o;14602:365::-;;14765:67;14829:2;14824:3;14765:67;:::i;:::-;14758:74;;14862:34;14858:1;14853:3;14849:11;14842:55;14928:3;14923:2;14918:3;14914:12;14907:25;14958:2;14953:3;14949:12;14942:19;;14748:219;;;:::o;14973:381::-;;15136:67;15200:2;15195:3;15136:67;:::i;:::-;15129:74;;15233:34;15229:1;15224:3;15220:11;15213:55;15299:19;15294:2;15289:3;15285:12;15278:41;15345:2;15340:3;15336:12;15329:19;;15119:235;;;:::o;15360:330::-;;15523:67;15587:2;15582:3;15523:67;:::i;:::-;15516:74;;15620:34;15616:1;15611:3;15607:11;15600:55;15681:2;15676:3;15672:12;15665:19;;15506:184;;;:::o;15696:320::-;;15859:67;15923:2;15918:3;15859:67;:::i;:::-;15852:74;;15956:24;15952:1;15947:3;15943:11;15936:45;16007:2;16002:3;15998:12;15991:19;;15842:174;;;:::o;16022:376::-;;16185:67;16249:2;16244:3;16185:67;:::i;:::-;16178:74;;16282:34;16278:1;16273:3;16269:11;16262:55;16348:14;16343:2;16338:3;16334:12;16327:36;16389:2;16384:3;16380:12;16373:19;;16168:230;;;:::o;16404:315::-;;16567:67;16631:2;16626:3;16567:67;:::i;:::-;16560:74;;16664:19;16660:1;16655:3;16651:11;16644:40;16710:2;16705:3;16701:12;16694:19;;16550:169;;;:::o;16725:333::-;;16906:84;16988:1;16983:3;16906:84;:::i;:::-;16899:91;;17020:3;17016:1;17011:3;17007:11;17000:24;17050:1;17045:3;17041:11;17034:18;;16889:169;;;:::o;17064:118::-;17151:24;17169:5;17151:24;:::i;:::-;17146:3;17139:37;17129:53;;:::o;17188:967::-;;17592:95;17683:3;17674:6;17592:95;:::i;:::-;17585:102;;17704:148;17848:3;17704:148;:::i;:::-;17697:155;;17869:95;17960:3;17951:6;17869:95;:::i;:::-;17862:102;;17981:148;18125:3;17981:148;:::i;:::-;17974:155;;18146:3;18139:10;;17574:581;;;;;:::o;18161:222::-;;18292:2;18281:9;18277:18;18269:26;;18305:71;18373:1;18362:9;18358:17;18349:6;18305:71;:::i;:::-;18259:124;;;;:::o;18389:640::-;;18622:3;18611:9;18607:19;18599:27;;18636:71;18704:1;18693:9;18689:17;18680:6;18636:71;:::i;:::-;18717:72;18785:2;18774:9;18770:18;18761:6;18717:72;:::i;:::-;18799;18867:2;18856:9;18852:18;18843:6;18799:72;:::i;:::-;18918:9;18912:4;18908:20;18903:2;18892:9;18888:18;18881:48;18946:76;19017:4;19008:6;18946:76;:::i;:::-;18938:84;;18589:440;;;;;;;:::o;19035:210::-;;19160:2;19149:9;19145:18;19137:26;;19173:65;19235:1;19224:9;19220:17;19211:6;19173:65;:::i;:::-;19127:118;;;;:::o;19251:313::-;;19402:2;19391:9;19387:18;19379:26;;19451:9;19445:4;19441:20;19437:1;19426:9;19422:17;19415:47;19479:78;19552:4;19543:6;19479:78;:::i;:::-;19471:86;;19369:195;;;;:::o;19570:419::-;;19774:2;19763:9;19759:18;19751:26;;19823:9;19817:4;19813:20;19809:1;19798:9;19794:17;19787:47;19851:131;19977:4;19851:131;:::i;:::-;19843:139;;19741:248;;;:::o;19995:419::-;;20199:2;20188:9;20184:18;20176:26;;20248:9;20242:4;20238:20;20234:1;20223:9;20219:17;20212:47;20276:131;20402:4;20276:131;:::i;:::-;20268:139;;20166:248;;;:::o;20420:419::-;;20624:2;20613:9;20609:18;20601:26;;20673:9;20667:4;20663:20;20659:1;20648:9;20644:17;20637:47;20701:131;20827:4;20701:131;:::i;:::-;20693:139;;20591:248;;;:::o;20845:419::-;;21049:2;21038:9;21034:18;21026:26;;21098:9;21092:4;21088:20;21084:1;21073:9;21069:17;21062:47;21126:131;21252:4;21126:131;:::i;:::-;21118:139;;21016:248;;;:::o;21270:419::-;;21474:2;21463:9;21459:18;21451:26;;21523:9;21517:4;21513:20;21509:1;21498:9;21494:17;21487:47;21551:131;21677:4;21551:131;:::i;:::-;21543:139;;21441:248;;;:::o;21695:419::-;;21899:2;21888:9;21884:18;21876:26;;21948:9;21942:4;21938:20;21934:1;21923:9;21919:17;21912:47;21976:131;22102:4;21976:131;:::i;:::-;21968:139;;21866:248;;;:::o;22120:419::-;;22324:2;22313:9;22309:18;22301:26;;22373:9;22367:4;22363:20;22359:1;22348:9;22344:17;22337:47;22401:131;22527:4;22401:131;:::i;:::-;22393:139;;22291:248;;;:::o;22545:419::-;;22749:2;22738:9;22734:18;22726:26;;22798:9;22792:4;22788:20;22784:1;22773:9;22769:17;22762:47;22826:131;22952:4;22826:131;:::i;:::-;22818:139;;22716:248;;;:::o;22970:419::-;;23174:2;23163:9;23159:18;23151:26;;23223:9;23217:4;23213:20;23209:1;23198:9;23194:17;23187:47;23251:131;23377:4;23251:131;:::i;:::-;23243:139;;23141:248;;;:::o;23395:419::-;;23599:2;23588:9;23584:18;23576:26;;23648:9;23642:4;23638:20;23634:1;23623:9;23619:17;23612:47;23676:131;23802:4;23676:131;:::i;:::-;23668:139;;23566:248;;;:::o;23820:419::-;;24024:2;24013:9;24009:18;24001:26;;24073:9;24067:4;24063:20;24059:1;24048:9;24044:17;24037:47;24101:131;24227:4;24101:131;:::i;:::-;24093:139;;23991:248;;;:::o;24245:419::-;;24449:2;24438:9;24434:18;24426:26;;24498:9;24492:4;24488:20;24484:1;24473:9;24469:17;24462:47;24526:131;24652:4;24526:131;:::i;:::-;24518:139;;24416:248;;;:::o;24670:419::-;;24874:2;24863:9;24859:18;24851:26;;24923:9;24917:4;24913:20;24909:1;24898:9;24894:17;24887:47;24951:131;25077:4;24951:131;:::i;:::-;24943:139;;24841:248;;;:::o;25095:419::-;;25299:2;25288:9;25284:18;25276:26;;25348:9;25342:4;25338:20;25334:1;25323:9;25319:17;25312:47;25376:131;25502:4;25376:131;:::i;:::-;25368:139;;25266:248;;;:::o;25520:419::-;;25724:2;25713:9;25709:18;25701:26;;25773:9;25767:4;25763:20;25759:1;25748:9;25744:17;25737:47;25801:131;25927:4;25801:131;:::i;:::-;25793:139;;25691:248;;;:::o;25945:419::-;;26149:2;26138:9;26134:18;26126:26;;26198:9;26192:4;26188:20;26184:1;26173:9;26169:17;26162:47;26226:131;26352:4;26226:131;:::i;:::-;26218:139;;26116:248;;;:::o;26370:419::-;;26574:2;26563:9;26559:18;26551:26;;26623:9;26617:4;26613:20;26609:1;26598:9;26594:17;26587:47;26651:131;26777:4;26651:131;:::i;:::-;26643:139;;26541:248;;;:::o;26795:419::-;;26999:2;26988:9;26984:18;26976:26;;27048:9;27042:4;27038:20;27034:1;27023:9;27019:17;27012:47;27076:131;27202:4;27076:131;:::i;:::-;27068:139;;26966:248;;;:::o;27220:419::-;;27424:2;27413:9;27409:18;27401:26;;27473:9;27467:4;27463:20;27459:1;27448:9;27444:17;27437:47;27501:131;27627:4;27501:131;:::i;:::-;27493:139;;27391:248;;;:::o;27645:419::-;;27849:2;27838:9;27834:18;27826:26;;27898:9;27892:4;27888:20;27884:1;27873:9;27869:17;27862:47;27926:131;28052:4;27926:131;:::i;:::-;27918:139;;27816:248;;;:::o;28070:419::-;;28274:2;28263:9;28259:18;28251:26;;28323:9;28317:4;28313:20;28309:1;28298:9;28294:17;28287:47;28351:131;28477:4;28351:131;:::i;:::-;28343:139;;28241:248;;;:::o;28495:419::-;;28699:2;28688:9;28684:18;28676:26;;28748:9;28742:4;28738:20;28734:1;28723:9;28719:17;28712:47;28776:131;28902:4;28776:131;:::i;:::-;28768:139;;28666:248;;;:::o;28920:419::-;;29124:2;29113:9;29109:18;29101:26;;29173:9;29167:4;29163:20;29159:1;29148:9;29144:17;29137:47;29201:131;29327:4;29201:131;:::i;:::-;29193:139;;29091:248;;;:::o;29345:419::-;;29549:2;29538:9;29534:18;29526:26;;29598:9;29592:4;29588:20;29584:1;29573:9;29569:17;29562:47;29626:131;29752:4;29626:131;:::i;:::-;29618:139;;29516:248;;;:::o;29770:222::-;;29901:2;29890:9;29886:18;29878:26;;29914:71;29982:1;29971:9;29967:17;29958:6;29914:71;:::i;:::-;29868:124;;;;:::o;29998:283::-;;30064:2;30058:9;30048:19;;30106:4;30098:6;30094:17;30213:6;30201:10;30198:22;30177:18;30165:10;30162:34;30159:62;30156:2;;;30224:18;;:::i;:::-;30156:2;30264:10;30260:2;30253:22;30038:243;;;;:::o;30287:331::-;;30438:18;30430:6;30427:30;30424:2;;;30460:18;;:::i;:::-;30424:2;30545:4;30541:9;30534:4;30526:6;30522:17;30518:33;30510:41;;30606:4;30600;30596:15;30588:23;;30353:265;;;:::o;30624:332::-;;30776:18;30768:6;30765:30;30762:2;;;30798:18;;:::i;:::-;30762:2;30883:4;30879:9;30872:4;30864:6;30860:17;30856:33;30848:41;;30944:4;30938;30934:15;30926:23;;30691:265;;;:::o;30962:98::-;;31047:5;31041:12;31031:22;;31020:40;;;:::o;31066:99::-;;31152:5;31146:12;31136:22;;31125:40;;;:::o;31171:168::-;;31288:6;31283:3;31276:19;31328:4;31323:3;31319:14;31304:29;;31266:73;;;;:::o;31345:169::-;;31463:6;31458:3;31451:19;31503:4;31498:3;31494:14;31479:29;;31441:73;;;;:::o;31520:148::-;;31659:3;31644:18;;31634:34;;;;:::o;31674:305::-;;31733:20;31751:1;31733:20;:::i;:::-;31728:25;;31767:20;31785:1;31767:20;:::i;:::-;31762:25;;31921:1;31853:66;31849:74;31846:1;31843:81;31840:2;;;31927:18;;:::i;:::-;31840:2;31971:1;31968;31964:9;31957:16;;31718:261;;;;:::o;31985:185::-;;32042:20;32060:1;32042:20;:::i;:::-;32037:25;;32076:20;32094:1;32076:20;:::i;:::-;32071:25;;32115:1;32105:2;;32120:18;;:::i;:::-;32105:2;32162:1;32159;32155:9;32150:14;;32027:143;;;;:::o;32176:348::-;;32239:20;32257:1;32239:20;:::i;:::-;32234:25;;32273:20;32291:1;32273:20;:::i;:::-;32268:25;;32461:1;32393:66;32389:74;32386:1;32383:81;32378:1;32371:9;32364:17;32360:105;32357:2;;;32468:18;;:::i;:::-;32357:2;32516:1;32513;32509:9;32498:20;;32224:300;;;;:::o;32530:191::-;;32590:20;32608:1;32590:20;:::i;:::-;32585:25;;32624:20;32642:1;32624:20;:::i;:::-;32619:25;;32663:1;32660;32657:8;32654:2;;;32668:18;;:::i;:::-;32654:2;32713:1;32710;32706:9;32698:17;;32575:146;;;;:::o;32727:96::-;;32793:24;32811:5;32793:24;:::i;:::-;32782:35;;32772:51;;;:::o;32829:90::-;;32906:5;32899:13;32892:21;32881:32;;32871:48;;;:::o;32925:149::-;;33001:66;32994:5;32990:78;32979:89;;32969:105;;;:::o;33080:126::-;;33157:42;33150:5;33146:54;33135:65;;33125:81;;;:::o;33212:77::-;;33278:5;33267:16;;33257:32;;;:::o;33295:154::-;33379:6;33374:3;33369;33356:30;33441:1;33432:6;33427:3;33423:16;33416:27;33346:103;;;:::o;33455:307::-;33523:1;33533:113;33547:6;33544:1;33541:13;33533:113;;;33632:1;33627:3;33623:11;33617:18;33613:1;33608:3;33604:11;33597:39;33569:2;33566:1;33562:10;33557:15;;33533:113;;;33664:6;33661:1;33658:13;33655:2;;;33744:1;33735:6;33730:3;33726:16;33719:27;33655:2;33504:258;;;;:::o;33768:320::-;;33849:1;33843:4;33839:12;33829:22;;33896:1;33890:4;33886:12;33917:18;33907:2;;33973:4;33965:6;33961:17;33951:27;;33907:2;34035;34027:6;34024:14;34004:18;34001:38;33998:2;;;34054:18;;:::i;:::-;33998:2;33819:269;;;;:::o;34094:233::-;;34156:24;34174:5;34156:24;:::i;:::-;34147:33;;34202:66;34195:5;34192:77;34189:2;;;34272:18;;:::i;:::-;34189:2;34319:1;34312:5;34308:13;34301:20;;34137:190;;;:::o;34333:176::-;;34382:20;34400:1;34382:20;:::i;:::-;34377:25;;34416:20;34434:1;34416:20;:::i;:::-;34411:25;;34455:1;34445:2;;34460:18;;:::i;:::-;34445:2;34501:1;34498;34494:9;34489:14;;34367:142;;;;:::o;34515:180::-;34563:77;34560:1;34553:88;34660:4;34657:1;34650:15;34684:4;34681:1;34674:15;34701:180;34749:77;34746:1;34739:88;34846:4;34843:1;34836:15;34870:4;34867:1;34860:15;34887:180;34935:77;34932:1;34925:88;35032:4;35029:1;35022:15;35056:4;35053:1;35046:15;35073:180;35121:77;35118:1;35111:88;35218:4;35215:1;35208:15;35242:4;35239:1;35232:15;35259:102;;35351:2;35347:7;35342:2;35335:5;35331:14;35327:28;35317:38;;35307:54;;;:::o;35367:122::-;35440:24;35458:5;35440:24;:::i;:::-;35433:5;35430:35;35420:2;;35479:1;35476;35469:12;35420:2;35410:79;:::o;35495:116::-;35565:21;35580:5;35565:21;:::i;:::-;35558:5;35555:32;35545:2;;35601:1;35598;35591:12;35545:2;35535:76;:::o;35617:120::-;35689:23;35706:5;35689:23;:::i;:::-;35682:5;35679:34;35669:2;;35727:1;35724;35717:12;35669:2;35659:78;:::o;35743:122::-;35816:24;35834:5;35816:24;:::i;:::-;35809:5;35806:35;35796:2;;35855:1;35852;35845:12;35796:2;35786:79;:::o

Swarm Source

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