ETH Price: $3,275.47 (-1.94%)

Token

CashGrabNFT (CGNFT)
 

Overview

Max Total Supply

5,608 CGNFT

Holders

1,006

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
passme.eth
Balance
3 CGNFT
0x2227de445dbfd90712c48bcd74d492ccca1cb242
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Cash Grab is the first project being launched by our company Cyphage - a collection of 5,608 unique NFTs that live on the Ethereum blockchain. Inspired by our friends at Neon District and Age of Rust, we took a dive into creating a new project in the NFT space akin to Apes, Cr...

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CashGrabNFT

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-07-29
*/

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

// SPDX-License-Identifier: MIT

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

// File: @openzeppelin/contracts/access/Ownable.sol

pragma solidity ^0.8.0;


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _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/Counters.sol

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

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

pragma solidity ^0.8.0;

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

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

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/utils/Strings.sol

pragma solidity ^0.8.0;

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    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/token/ERC721/IERC721.sol

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;


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

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

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

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

pragma solidity ^0.8.0;

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


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

pragma solidity ^0.8.0;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        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/ERC721URIStorage.sol

pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @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 override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

// File: CashGrab.sol


pragma solidity ^0.8.0;


contract CashGrabNFT is ERC721URIStorage, Ownable, ReentrancyGuard {
    using Counters for Counters.Counter;

    Counters.Counter private _tokenIds;
 
    string private _baseTokenURI;

    string public GRAB_PROVENANCE = "";
    
    uint256 public startingIndexBlock;

    uint256 public startingIndex;

    uint256 public REVEAL_TIMESTAMP;
    
    uint256 public cashGrabPrice = 50000000000000000; 
    
    uint public constant maxPurchaseAmt = 20;
    
    uint256 public MAX_CASH_GRAB_NFTS;

    bool public saleIsActive = false;
    
    bool public hasReserved = false;

    constructor(
        uint256 maxSupply,
        uint256 revealDate
    ) public ERC721("CashGrabNFT", "CGNFT") {
        MAX_CASH_GRAB_NFTS = maxSupply;
        REVEAL_TIMESTAMP = revealDate;
    }
    
    function withdraw() public onlyOwner {
        uint balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }
    
    function reserveNFTs() public onlyOwner {
        require(!hasReserved, "NFTs have already been reserved.");
        _mintCashGrabs(30);
        hasReserved = true;
    }

    function bulkMint(address[] memory _addressList) public onlyOwner {
        require((_tokenIds.current() + _addressList.length) <=  MAX_CASH_GRAB_NFTS, "Mint would exceed max supply of Cash Grabs");
        
        for(uint i = 0; i < _addressList.length; i++) {
            _tokenIds.increment();
            _safeMint(_addressList[i], _tokenIds.current());
        }
    }
    
    function purchase(uint _numberOfTokens) public payable {
        require(saleIsActive, "Sale is not active");
        require(_numberOfTokens <= maxPurchaseAmt, "Can only mint 20 tokens at a time");
        require((cashGrabPrice * _numberOfTokens) == msg.value, "Ether value sent is not correct");
        
        _mintCashGrabs(_numberOfTokens);
    }
    
    function _mintCashGrabs(uint _amountOfTokens) internal nonReentrant {
        require((_tokenIds.current() + _amountOfTokens) <=  MAX_CASH_GRAB_NFTS, "Mint would exceed max supply of Cash Grabs");
        
        for(uint i = 0; i < _amountOfTokens; i++) {
            _tokenIds.increment();
             _safeMint(msg.sender, _tokenIds.current());
        }

        if (startingIndexBlock == 0 && (totalSupply() == MAX_CASH_GRAB_NFTS || block.timestamp >= REVEAL_TIMESTAMP)) {
            _setStartingIndex();
        } 
    }

    // Should only be called once ever.
    function _setStartingIndex() internal {
        require(startingIndex == 0, "Starting index is already set");

        startingIndexBlock = block.number - 1;

        startingIndex = uint(blockhash(startingIndexBlock)) % MAX_CASH_GRAB_NFTS;
    }

    function setRevealTimestamp(uint256 revealTimeStamp) public onlyOwner {
        REVEAL_TIMESTAMP = revealTimeStamp;
    } 
    
    function setProvenanceHash(string memory provenanceHash) public onlyOwner {
        GRAB_PROVENANCE = provenanceHash;
    }
    
    function setBaseURI(string calldata newBaseTokenURI) public onlyOwner{
        _baseTokenURI = newBaseTokenURI;
    }
    
    function _baseURI() internal view override returns (string memory) {
        return _baseTokenURI;
    }

    function baseURI() public view returns (string memory) {
        return _baseURI();
    }

    function changeSaleState() public onlyOwner {
        saleIsActive = !saleIsActive;
    }
    
    function setCashGrabPrice(uint256 Price) public onlyOwner {
        cashGrabPrice = Price;
    } 

    function totalSupply() public view returns (uint256) { 
        return _tokenIds.current(); 
    }
      
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721) returns (bool) {
        return super.supportsInterface(interfaceId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"revealDate","type":"uint256"}],"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":"GRAB_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_CASH_GRAB_NFTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REVEAL_TIMESTAMP","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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addressList","type":"address[]"}],"name":"bulkMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cashGrabPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changeSaleState","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":"hasReserved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPurchaseAmt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numberOfTokens","type":"uint256"}],"name":"purchase","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveNFTs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseTokenURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"Price","type":"uint256"}],"name":"setCashGrabPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"revealTimeStamp","type":"uint256"}],"name":"setRevealTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startingIndexBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250600b90805190602001906200002b9291906200024c565b5066b1a2bc2ec50000600f556000601160006101000a81548160ff0219169083151502179055506000601160016101000a81548160ff0219169083151502179055503480156200007a57600080fd5b50604051620046f4380380620046f48339818101604052810190620000a0919062000313565b6040518060400160405280600b81526020017f43617368477261624e46540000000000000000000000000000000000000000008152506040518060400160405280600581526020017f43474e46540000000000000000000000000000000000000000000000000000008152508160009080519060200190620001249291906200024c565b5080600190805190602001906200013d9291906200024c565b50505062000160620001546200017e60201b60201c565b6200018660201b60201c565b60016008819055508160108190555080600e819055505050620003e8565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200025a9062000364565b90600052602060002090601f0160209004810192826200027e5760008555620002ca565b82601f106200029957805160ff1916838001178555620002ca565b82800160010185558215620002ca579182015b82811115620002c9578251825591602001919060010190620002ac565b5b509050620002d99190620002dd565b5090565b5b80821115620002f8576000816000905550600101620002de565b5090565b6000815190506200030d81620003ce565b92915050565b600080604083850312156200032d576200032c620003c9565b5b60006200033d85828601620002fc565b92505060206200035085828601620002fc565b9150509250929050565b6000819050919050565b600060028204905060018216806200037d57607f821691505b602082108114156200039457620003936200039a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b620003d9816200035a565b8114620003e557600080fd5b50565b6142fc80620003f86000396000f3fe60806040526004361061020f5760003560e01c8063715018a611610118578063cb774d47116100a0578063e985e9c51161006f578063e985e9c51461073f578063eb8d24441461077c578063efef39a1146107a7578063f2fde38b146107c3578063f5c1fea0146107ec5761020f565b8063cb774d47146106a7578063d55e1d03146106d2578063dd9c1f23146106fd578063e36d6498146107145761020f565b8063a22cb465116100e7578063a22cb465146105c4578063b88d4fde146105ed578063b92d006114610616578063be1bcc231461063f578063c87b56dd1461066a5761020f565b8063715018a61461052c5780637f444088146105435780638da5cb5b1461056e57806395d89b41146105995761020f565b806323b872dd1161019b57806355f804b31161016a57806355f804b31461043357806361eb605d1461045c5780636352211e146104875780636c0360eb146104c457806370a08231146104ef5761020f565b806323b872dd146103a15780633771aaa1146103ca5780633ccfd60b146103f357806342842e0e1461040a5761020f565b8063095ea7b3116101e2578063095ea7b3146102e2578063109695231461030b578063144100c71461033457806318160ddd1461034b57806318e20a38146103765761020f565b8063018a2c371461021457806301ffc9a71461023d57806306fdde031461027a578063081812fc146102a5575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190612f78565b610817565b005b34801561024957600080fd5b50610264600480360381019061025f9190612e88565b61089d565b6040516102719190613448565b60405180910390f35b34801561028657600080fd5b5061028f6108af565b60405161029c9190613463565b60405180910390f35b3480156102b157600080fd5b506102cc60048036038101906102c79190612f78565b610941565b6040516102d991906133e1565b60405180910390f35b3480156102ee57600080fd5b5061030960048036038101906103049190612dff565b6109c6565b005b34801561031757600080fd5b50610332600480360381019061032d9190612f2f565b610ade565b005b34801561034057600080fd5b50610349610b74565b005b34801561035757600080fd5b50610360610c67565b60405161036d9190613785565b60405180910390f35b34801561038257600080fd5b5061038b610c78565b6040516103989190613785565b60405180910390f35b3480156103ad57600080fd5b506103c860048036038101906103c39190612ce9565b610c7e565b005b3480156103d657600080fd5b506103f160048036038101906103ec9190612e3f565b610cde565b005b3480156103ff57600080fd5b50610408610e0e565b005b34801561041657600080fd5b50610431600480360381019061042c9190612ce9565b610ed9565b005b34801561043f57600080fd5b5061045a60048036038101906104559190612ee2565b610ef9565b005b34801561046857600080fd5b50610471610f8b565b60405161047e9190613448565b60405180910390f35b34801561049357600080fd5b506104ae60048036038101906104a99190612f78565b610f9e565b6040516104bb91906133e1565b60405180910390f35b3480156104d057600080fd5b506104d9611050565b6040516104e69190613463565b60405180910390f35b3480156104fb57600080fd5b5061051660048036038101906105119190612c7c565b61105f565b6040516105239190613785565b60405180910390f35b34801561053857600080fd5b50610541611117565b005b34801561054f57600080fd5b5061055861119f565b6040516105659190613785565b60405180910390f35b34801561057a57600080fd5b506105836111a5565b60405161059091906133e1565b60405180910390f35b3480156105a557600080fd5b506105ae6111cf565b6040516105bb9190613463565b60405180910390f35b3480156105d057600080fd5b506105eb60048036038101906105e69190612dbf565b611261565b005b3480156105f957600080fd5b50610614600480360381019061060f9190612d3c565b6113e2565b005b34801561062257600080fd5b5061063d60048036038101906106389190612f78565b611444565b005b34801561064b57600080fd5b506106546114ca565b6040516106619190613463565b60405180910390f35b34801561067657600080fd5b50610691600480360381019061068c9190612f78565b611558565b60405161069e9190613463565b60405180910390f35b3480156106b357600080fd5b506106bc6116aa565b6040516106c99190613785565b60405180910390f35b3480156106de57600080fd5b506106e76116b0565b6040516106f49190613785565b60405180910390f35b34801561070957600080fd5b506107126116b6565b005b34801561072057600080fd5b5061072961175e565b6040516107369190613785565b60405180910390f35b34801561074b57600080fd5b5061076660048036038101906107619190612ca9565b611764565b6040516107739190613448565b60405180910390f35b34801561078857600080fd5b506107916117f8565b60405161079e9190613448565b60405180910390f35b6107c160048036038101906107bc9190612f78565b61180b565b005b3480156107cf57600080fd5b506107ea60048036038101906107e59190612c7c565b6118f9565b005b3480156107f857600080fd5b506108016119f1565b60405161080e9190613785565b60405180910390f35b61081f6119f6565b73ffffffffffffffffffffffffffffffffffffffff1661083d6111a5565b73ffffffffffffffffffffffffffffffffffffffff1614610893576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088a90613685565b60405180910390fd5b80600e8190555050565b60006108a8826119fe565b9050919050565b6060600080546108be90613a61565b80601f01602080910402602001604051908101604052809291908181526020018280546108ea90613a61565b80156109375780601f1061090c57610100808354040283529160200191610937565b820191906000526020600020905b81548152906001019060200180831161091a57829003601f168201915b5050505050905090565b600061094c82611ae0565b61098b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098290613665565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109d182610f9e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a39906136e5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a616119f6565b73ffffffffffffffffffffffffffffffffffffffff161480610a905750610a8f81610a8a6119f6565b611764565b5b610acf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac6906135c5565b60405180910390fd5b610ad98383611b4c565b505050565b610ae66119f6565b73ffffffffffffffffffffffffffffffffffffffff16610b046111a5565b73ffffffffffffffffffffffffffffffffffffffff1614610b5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5190613685565b60405180910390fd5b80600b9080519060200190610b70929190612916565b5050565b610b7c6119f6565b73ffffffffffffffffffffffffffffffffffffffff16610b9a6111a5565b73ffffffffffffffffffffffffffffffffffffffff1614610bf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be790613685565b60405180910390fd5b601160019054906101000a900460ff1615610c40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3790613765565b60405180910390fd5b610c4a601e611c05565b6001601160016101000a81548160ff021916908315150217905550565b6000610c736009611d28565b905090565b600e5481565b610c8f610c896119f6565b82611d36565b610cce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc590613725565b60405180910390fd5b610cd9838383611e14565b505050565b610ce66119f6565b73ffffffffffffffffffffffffffffffffffffffff16610d046111a5565b73ffffffffffffffffffffffffffffffffffffffff1614610d5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5190613685565b60405180910390fd5b6010548151610d696009611d28565b610d739190613896565b1115610db4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dab90613705565b60405180910390fd5b60005b8151811015610e0a57610dca6009612070565b610df7828281518110610de057610ddf613bcb565b5b6020026020010151610df26009611d28565b612086565b8080610e0290613ac4565b915050610db7565b5050565b610e166119f6565b73ffffffffffffffffffffffffffffffffffffffff16610e346111a5565b73ffffffffffffffffffffffffffffffffffffffff1614610e8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8190613685565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610ed5573d6000803e3d6000fd5b5050565b610ef4838383604051806020016040528060008152506113e2565b505050565b610f016119f6565b73ffffffffffffffffffffffffffffffffffffffff16610f1f6111a5565b73ffffffffffffffffffffffffffffffffffffffff1614610f75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6c90613685565b60405180910390fd5b8181600a9190610f8692919061299c565b505050565b601160019054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103e90613605565b60405180910390fd5b80915050919050565b606061105a6120a4565b905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c7906135e5565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61111f6119f6565b73ffffffffffffffffffffffffffffffffffffffff1661113d6111a5565b73ffffffffffffffffffffffffffffffffffffffff1614611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118a90613685565b60405180910390fd5b61119d6000612136565b565b600f5481565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546111de90613a61565b80601f016020809104026020016040519081016040528092919081815260200182805461120a90613a61565b80156112575780601f1061122c57610100808354040283529160200191611257565b820191906000526020600020905b81548152906001019060200180831161123a57829003601f168201915b5050505050905090565b6112696119f6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ce90613505565b60405180910390fd5b80600560006112e46119f6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166113916119f6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113d69190613448565b60405180910390a35050565b6113f36113ed6119f6565b83611d36565b611432576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142990613725565b60405180910390fd5b61143e848484846121fc565b50505050565b61144c6119f6565b73ffffffffffffffffffffffffffffffffffffffff1661146a6111a5565b73ffffffffffffffffffffffffffffffffffffffff16146114c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b790613685565b60405180910390fd5b80600f8190555050565b600b80546114d790613a61565b80601f016020809104026020016040519081016040528092919081815260200182805461150390613a61565b80156115505780601f1061152557610100808354040283529160200191611550565b820191906000526020600020905b81548152906001019060200180831161153357829003601f168201915b505050505081565b606061156382611ae0565b6115a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159990613645565b60405180910390fd5b60006006600084815260200190815260200160002080546115c290613a61565b80601f01602080910402602001604051908101604052809291908181526020018280546115ee90613a61565b801561163b5780601f106116105761010080835404028352916020019161163b565b820191906000526020600020905b81548152906001019060200180831161161e57829003601f168201915b50505050509050600061164c6120a4565b90506000815114156116625781925050506116a5565b60008251111561169757808260405160200161167f9291906133bd565b604051602081830303815290604052925050506116a5565b6116a084612258565b925050505b919050565b600d5481565b60105481565b6116be6119f6565b73ffffffffffffffffffffffffffffffffffffffff166116dc6111a5565b73ffffffffffffffffffffffffffffffffffffffff1614611732576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172990613685565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b600c5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601160009054906101000a900460ff1681565b601160009054906101000a900460ff1661185a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185190613525565b60405180910390fd5b601481111561189e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189590613585565b60405180910390fd5b3481600f546118ad919061391d565b146118ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e490613545565b60405180910390fd5b6118f681611c05565b50565b6119016119f6565b73ffffffffffffffffffffffffffffffffffffffff1661191f6111a5565b73ffffffffffffffffffffffffffffffffffffffff1614611975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196c90613685565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119dc906134a5565b60405180910390fd5b6119ee81612136565b50565b601481565b600033905090565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ac957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611ad95750611ad8826122ff565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611bbf83610f9e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60026008541415611c4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4290613745565b60405180910390fd5b600260088190555060105481611c616009611d28565b611c6b9190613896565b1115611cac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca390613705565b60405180910390fd5b60005b81811015611ce757611cc16009612070565b611cd433611ccf6009611d28565b612086565b8080611cdf90613ac4565b915050611caf565b506000600c54148015611d0f5750601054611d00610c67565b1480611d0e5750600e544210155b5b15611d1d57611d1c612369565b5b600160088190555050565b600081600001549050919050565b6000611d4182611ae0565b611d80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7790613565565b60405180910390fd5b6000611d8b83610f9e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611dfa57508373ffffffffffffffffffffffffffffffffffffffff16611de284610941565b73ffffffffffffffffffffffffffffffffffffffff16145b80611e0b5750611e0a8185611764565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e3482610f9e565b73ffffffffffffffffffffffffffffffffffffffff1614611e8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e81906136a5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611efa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef1906134e5565b60405180910390fd5b611f058383836123dd565b611f10600082611b4c565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f609190613977565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fb79190613896565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6001816000016000828254019250508190555050565b6120a08282604051806020016040528060008152506123e2565b5050565b6060600a80546120b390613a61565b80601f01602080910402602001604051908101604052809291908181526020018280546120df90613a61565b801561212c5780601f106121015761010080835404028352916020019161212c565b820191906000526020600020905b81548152906001019060200180831161210f57829003601f168201915b5050505050905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612207848484611e14565b6122138484848461243d565b612252576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224990613485565b60405180910390fd5b50505050565b606061226382611ae0565b6122a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612299906136c5565b60405180910390fd5b60006122ac6120a4565b905060008151116122cc57604051806020016040528060008152506122f7565b806122d6846125d4565b6040516020016122e79291906133bd565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000600d54146123ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a5906135a5565b60405180910390fd5b6001436123bb9190613977565b600c81905550601054600c544060001c6123d59190613b0d565b600d81905550565b505050565b6123ec8383612735565b6123f9600084848461243d565b612438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242f90613485565b60405180910390fd5b505050565b600061245e8473ffffffffffffffffffffffffffffffffffffffff16612903565b156125c7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026124876119f6565b8786866040518563ffffffff1660e01b81526004016124a994939291906133fc565b602060405180830381600087803b1580156124c357600080fd5b505af19250505080156124f457506040513d601f19601f820116820180604052508101906124f19190612eb5565b60015b612577573d8060008114612524576040519150601f19603f3d011682016040523d82523d6000602084013e612529565b606091505b5060008151141561256f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256690613485565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506125cc565b600190505b949350505050565b6060600082141561261c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612730565b600082905060005b6000821461264e57808061263790613ac4565b915050600a8261264791906138ec565b9150612624565b60008167ffffffffffffffff81111561266a57612669613bfa565b5b6040519080825280601f01601f19166020018201604052801561269c5781602001600182028036833780820191505090505b5090505b60008514612729576001826126b59190613977565b9150600a856126c49190613b0d565b60306126d09190613896565b60f81b8183815181106126e6576126e5613bcb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561272291906138ec565b94506126a0565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279c90613625565b60405180910390fd5b6127ae81611ae0565b156127ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e5906134c5565b60405180910390fd5b6127fa600083836123dd565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461284a9190613896565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461292290613a61565b90600052602060002090601f016020900481019282612944576000855561298b565b82601f1061295d57805160ff191683800117855561298b565b8280016001018555821561298b579182015b8281111561298a57825182559160200191906001019061296f565b5b5090506129989190612a22565b5090565b8280546129a890613a61565b90600052602060002090601f0160209004810192826129ca5760008555612a11565b82601f106129e357803560ff1916838001178555612a11565b82800160010185558215612a11579182015b82811115612a105782358255916020019190600101906129f5565b5b509050612a1e9190612a22565b5090565b5b80821115612a3b576000816000905550600101612a23565b5090565b6000612a52612a4d846137c5565b6137a0565b90508083825260208201905082856020860282011115612a7557612a74613c33565b5b60005b85811015612aa55781612a8b8882612b33565b845260208401935060208301925050600181019050612a78565b5050509392505050565b6000612ac2612abd846137f1565b6137a0565b905082815260208101848484011115612ade57612add613c38565b5b612ae9848285613a1f565b509392505050565b6000612b04612aff84613822565b6137a0565b905082815260208101848484011115612b2057612b1f613c38565b5b612b2b848285613a1f565b509392505050565b600081359050612b428161426a565b92915050565b600082601f830112612b5d57612b5c613c2e565b5b8135612b6d848260208601612a3f565b91505092915050565b600081359050612b8581614281565b92915050565b600081359050612b9a81614298565b92915050565b600081519050612baf81614298565b92915050565b600082601f830112612bca57612bc9613c2e565b5b8135612bda848260208601612aaf565b91505092915050565b60008083601f840112612bf957612bf8613c2e565b5b8235905067ffffffffffffffff811115612c1657612c15613c29565b5b602083019150836001820283011115612c3257612c31613c33565b5b9250929050565b600082601f830112612c4e57612c4d613c2e565b5b8135612c5e848260208601612af1565b91505092915050565b600081359050612c76816142af565b92915050565b600060208284031215612c9257612c91613c42565b5b6000612ca084828501612b33565b91505092915050565b60008060408385031215612cc057612cbf613c42565b5b6000612cce85828601612b33565b9250506020612cdf85828601612b33565b9150509250929050565b600080600060608486031215612d0257612d01613c42565b5b6000612d1086828701612b33565b9350506020612d2186828701612b33565b9250506040612d3286828701612c67565b9150509250925092565b60008060008060808587031215612d5657612d55613c42565b5b6000612d6487828801612b33565b9450506020612d7587828801612b33565b9350506040612d8687828801612c67565b925050606085013567ffffffffffffffff811115612da757612da6613c3d565b5b612db387828801612bb5565b91505092959194509250565b60008060408385031215612dd657612dd5613c42565b5b6000612de485828601612b33565b9250506020612df585828601612b76565b9150509250929050565b60008060408385031215612e1657612e15613c42565b5b6000612e2485828601612b33565b9250506020612e3585828601612c67565b9150509250929050565b600060208284031215612e5557612e54613c42565b5b600082013567ffffffffffffffff811115612e7357612e72613c3d565b5b612e7f84828501612b48565b91505092915050565b600060208284031215612e9e57612e9d613c42565b5b6000612eac84828501612b8b565b91505092915050565b600060208284031215612ecb57612eca613c42565b5b6000612ed984828501612ba0565b91505092915050565b60008060208385031215612ef957612ef8613c42565b5b600083013567ffffffffffffffff811115612f1757612f16613c3d565b5b612f2385828601612be3565b92509250509250929050565b600060208284031215612f4557612f44613c42565b5b600082013567ffffffffffffffff811115612f6357612f62613c3d565b5b612f6f84828501612c39565b91505092915050565b600060208284031215612f8e57612f8d613c42565b5b6000612f9c84828501612c67565b91505092915050565b612fae816139ab565b82525050565b612fbd816139bd565b82525050565b6000612fce82613853565b612fd88185613869565b9350612fe8818560208601613a2e565b612ff181613c47565b840191505092915050565b60006130078261385e565b613011818561387a565b9350613021818560208601613a2e565b61302a81613c47565b840191505092915050565b60006130408261385e565b61304a818561388b565b935061305a818560208601613a2e565b80840191505092915050565b600061307360328361387a565b915061307e82613c58565b604082019050919050565b600061309660268361387a565b91506130a182613ca7565b604082019050919050565b60006130b9601c8361387a565b91506130c482613cf6565b602082019050919050565b60006130dc60248361387a565b91506130e782613d1f565b604082019050919050565b60006130ff60198361387a565b915061310a82613d6e565b602082019050919050565b600061312260128361387a565b915061312d82613d97565b602082019050919050565b6000613145601f8361387a565b915061315082613dc0565b602082019050919050565b6000613168602c8361387a565b915061317382613de9565b604082019050919050565b600061318b60218361387a565b915061319682613e38565b604082019050919050565b60006131ae601d8361387a565b91506131b982613e87565b602082019050919050565b60006131d160388361387a565b91506131dc82613eb0565b604082019050919050565b60006131f4602a8361387a565b91506131ff82613eff565b604082019050919050565b600061321760298361387a565b915061322282613f4e565b604082019050919050565b600061323a60208361387a565b915061324582613f9d565b602082019050919050565b600061325d60318361387a565b915061326882613fc6565b604082019050919050565b6000613280602c8361387a565b915061328b82614015565b604082019050919050565b60006132a360208361387a565b91506132ae82614064565b602082019050919050565b60006132c660298361387a565b91506132d18261408d565b604082019050919050565b60006132e9602f8361387a565b91506132f4826140dc565b604082019050919050565b600061330c60218361387a565b91506133178261412b565b604082019050919050565b600061332f602a8361387a565b915061333a8261417a565b604082019050919050565b600061335260318361387a565b915061335d826141c9565b604082019050919050565b6000613375601f8361387a565b915061338082614218565b602082019050919050565b600061339860208361387a565b91506133a382614241565b602082019050919050565b6133b781613a15565b82525050565b60006133c98285613035565b91506133d58284613035565b91508190509392505050565b60006020820190506133f66000830184612fa5565b92915050565b60006080820190506134116000830187612fa5565b61341e6020830186612fa5565b61342b60408301856133ae565b818103606083015261343d8184612fc3565b905095945050505050565b600060208201905061345d6000830184612fb4565b92915050565b6000602082019050818103600083015261347d8184612ffc565b905092915050565b6000602082019050818103600083015261349e81613066565b9050919050565b600060208201905081810360008301526134be81613089565b9050919050565b600060208201905081810360008301526134de816130ac565b9050919050565b600060208201905081810360008301526134fe816130cf565b9050919050565b6000602082019050818103600083015261351e816130f2565b9050919050565b6000602082019050818103600083015261353e81613115565b9050919050565b6000602082019050818103600083015261355e81613138565b9050919050565b6000602082019050818103600083015261357e8161315b565b9050919050565b6000602082019050818103600083015261359e8161317e565b9050919050565b600060208201905081810360008301526135be816131a1565b9050919050565b600060208201905081810360008301526135de816131c4565b9050919050565b600060208201905081810360008301526135fe816131e7565b9050919050565b6000602082019050818103600083015261361e8161320a565b9050919050565b6000602082019050818103600083015261363e8161322d565b9050919050565b6000602082019050818103600083015261365e81613250565b9050919050565b6000602082019050818103600083015261367e81613273565b9050919050565b6000602082019050818103600083015261369e81613296565b9050919050565b600060208201905081810360008301526136be816132b9565b9050919050565b600060208201905081810360008301526136de816132dc565b9050919050565b600060208201905081810360008301526136fe816132ff565b9050919050565b6000602082019050818103600083015261371e81613322565b9050919050565b6000602082019050818103600083015261373e81613345565b9050919050565b6000602082019050818103600083015261375e81613368565b9050919050565b6000602082019050818103600083015261377e8161338b565b9050919050565b600060208201905061379a60008301846133ae565b92915050565b60006137aa6137bb565b90506137b68282613a93565b919050565b6000604051905090565b600067ffffffffffffffff8211156137e0576137df613bfa565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561380c5761380b613bfa565b5b61381582613c47565b9050602081019050919050565b600067ffffffffffffffff82111561383d5761383c613bfa565b5b61384682613c47565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006138a182613a15565b91506138ac83613a15565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156138e1576138e0613b3e565b5b828201905092915050565b60006138f782613a15565b915061390283613a15565b92508261391257613911613b6d565b5b828204905092915050565b600061392882613a15565b915061393383613a15565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561396c5761396b613b3e565b5b828202905092915050565b600061398282613a15565b915061398d83613a15565b9250828210156139a05761399f613b3e565b5b828203905092915050565b60006139b6826139f5565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613a4c578082015181840152602081019050613a31565b83811115613a5b576000848401525b50505050565b60006002820490506001821680613a7957607f821691505b60208210811415613a8d57613a8c613b9c565b5b50919050565b613a9c82613c47565b810181811067ffffffffffffffff82111715613abb57613aba613bfa565b5b80604052505050565b6000613acf82613a15565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b0257613b01613b3e565b5b600182019050919050565b6000613b1882613a15565b9150613b2383613a15565b925082613b3357613b32613b6d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f53616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b7f5374617274696e6720696e64657820697320616c726561647920736574000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e7420776f756c6420657863656564206d617820737570706c79206f662060008201527f4361736820477261627300000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4e465473206861766520616c7265616479206265656e2072657365727665642e600082015250565b614273816139ab565b811461427e57600080fd5b50565b61428a816139bd565b811461429557600080fd5b50565b6142a1816139c9565b81146142ac57600080fd5b50565b6142b881613a15565b81146142c357600080fd5b5056fea26469706673582212200b3e43400da990c1d9d8f54e61ddfd8574eaca2e4666f279b7fb14d4c17ee8d264736f6c634300080600330000000000000000000000000000000000000000000000000000000000001e6100000000000000000000000000000000000000000000000000000000611d3c90

Deployed Bytecode

0x60806040526004361061020f5760003560e01c8063715018a611610118578063cb774d47116100a0578063e985e9c51161006f578063e985e9c51461073f578063eb8d24441461077c578063efef39a1146107a7578063f2fde38b146107c3578063f5c1fea0146107ec5761020f565b8063cb774d47146106a7578063d55e1d03146106d2578063dd9c1f23146106fd578063e36d6498146107145761020f565b8063a22cb465116100e7578063a22cb465146105c4578063b88d4fde146105ed578063b92d006114610616578063be1bcc231461063f578063c87b56dd1461066a5761020f565b8063715018a61461052c5780637f444088146105435780638da5cb5b1461056e57806395d89b41146105995761020f565b806323b872dd1161019b57806355f804b31161016a57806355f804b31461043357806361eb605d1461045c5780636352211e146104875780636c0360eb146104c457806370a08231146104ef5761020f565b806323b872dd146103a15780633771aaa1146103ca5780633ccfd60b146103f357806342842e0e1461040a5761020f565b8063095ea7b3116101e2578063095ea7b3146102e2578063109695231461030b578063144100c71461033457806318160ddd1461034b57806318e20a38146103765761020f565b8063018a2c371461021457806301ffc9a71461023d57806306fdde031461027a578063081812fc146102a5575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190612f78565b610817565b005b34801561024957600080fd5b50610264600480360381019061025f9190612e88565b61089d565b6040516102719190613448565b60405180910390f35b34801561028657600080fd5b5061028f6108af565b60405161029c9190613463565b60405180910390f35b3480156102b157600080fd5b506102cc60048036038101906102c79190612f78565b610941565b6040516102d991906133e1565b60405180910390f35b3480156102ee57600080fd5b5061030960048036038101906103049190612dff565b6109c6565b005b34801561031757600080fd5b50610332600480360381019061032d9190612f2f565b610ade565b005b34801561034057600080fd5b50610349610b74565b005b34801561035757600080fd5b50610360610c67565b60405161036d9190613785565b60405180910390f35b34801561038257600080fd5b5061038b610c78565b6040516103989190613785565b60405180910390f35b3480156103ad57600080fd5b506103c860048036038101906103c39190612ce9565b610c7e565b005b3480156103d657600080fd5b506103f160048036038101906103ec9190612e3f565b610cde565b005b3480156103ff57600080fd5b50610408610e0e565b005b34801561041657600080fd5b50610431600480360381019061042c9190612ce9565b610ed9565b005b34801561043f57600080fd5b5061045a60048036038101906104559190612ee2565b610ef9565b005b34801561046857600080fd5b50610471610f8b565b60405161047e9190613448565b60405180910390f35b34801561049357600080fd5b506104ae60048036038101906104a99190612f78565b610f9e565b6040516104bb91906133e1565b60405180910390f35b3480156104d057600080fd5b506104d9611050565b6040516104e69190613463565b60405180910390f35b3480156104fb57600080fd5b5061051660048036038101906105119190612c7c565b61105f565b6040516105239190613785565b60405180910390f35b34801561053857600080fd5b50610541611117565b005b34801561054f57600080fd5b5061055861119f565b6040516105659190613785565b60405180910390f35b34801561057a57600080fd5b506105836111a5565b60405161059091906133e1565b60405180910390f35b3480156105a557600080fd5b506105ae6111cf565b6040516105bb9190613463565b60405180910390f35b3480156105d057600080fd5b506105eb60048036038101906105e69190612dbf565b611261565b005b3480156105f957600080fd5b50610614600480360381019061060f9190612d3c565b6113e2565b005b34801561062257600080fd5b5061063d60048036038101906106389190612f78565b611444565b005b34801561064b57600080fd5b506106546114ca565b6040516106619190613463565b60405180910390f35b34801561067657600080fd5b50610691600480360381019061068c9190612f78565b611558565b60405161069e9190613463565b60405180910390f35b3480156106b357600080fd5b506106bc6116aa565b6040516106c99190613785565b60405180910390f35b3480156106de57600080fd5b506106e76116b0565b6040516106f49190613785565b60405180910390f35b34801561070957600080fd5b506107126116b6565b005b34801561072057600080fd5b5061072961175e565b6040516107369190613785565b60405180910390f35b34801561074b57600080fd5b5061076660048036038101906107619190612ca9565b611764565b6040516107739190613448565b60405180910390f35b34801561078857600080fd5b506107916117f8565b60405161079e9190613448565b60405180910390f35b6107c160048036038101906107bc9190612f78565b61180b565b005b3480156107cf57600080fd5b506107ea60048036038101906107e59190612c7c565b6118f9565b005b3480156107f857600080fd5b506108016119f1565b60405161080e9190613785565b60405180910390f35b61081f6119f6565b73ffffffffffffffffffffffffffffffffffffffff1661083d6111a5565b73ffffffffffffffffffffffffffffffffffffffff1614610893576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088a90613685565b60405180910390fd5b80600e8190555050565b60006108a8826119fe565b9050919050565b6060600080546108be90613a61565b80601f01602080910402602001604051908101604052809291908181526020018280546108ea90613a61565b80156109375780601f1061090c57610100808354040283529160200191610937565b820191906000526020600020905b81548152906001019060200180831161091a57829003601f168201915b5050505050905090565b600061094c82611ae0565b61098b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098290613665565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109d182610f9e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a39906136e5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a616119f6565b73ffffffffffffffffffffffffffffffffffffffff161480610a905750610a8f81610a8a6119f6565b611764565b5b610acf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac6906135c5565b60405180910390fd5b610ad98383611b4c565b505050565b610ae66119f6565b73ffffffffffffffffffffffffffffffffffffffff16610b046111a5565b73ffffffffffffffffffffffffffffffffffffffff1614610b5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5190613685565b60405180910390fd5b80600b9080519060200190610b70929190612916565b5050565b610b7c6119f6565b73ffffffffffffffffffffffffffffffffffffffff16610b9a6111a5565b73ffffffffffffffffffffffffffffffffffffffff1614610bf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be790613685565b60405180910390fd5b601160019054906101000a900460ff1615610c40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3790613765565b60405180910390fd5b610c4a601e611c05565b6001601160016101000a81548160ff021916908315150217905550565b6000610c736009611d28565b905090565b600e5481565b610c8f610c896119f6565b82611d36565b610cce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc590613725565b60405180910390fd5b610cd9838383611e14565b505050565b610ce66119f6565b73ffffffffffffffffffffffffffffffffffffffff16610d046111a5565b73ffffffffffffffffffffffffffffffffffffffff1614610d5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5190613685565b60405180910390fd5b6010548151610d696009611d28565b610d739190613896565b1115610db4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dab90613705565b60405180910390fd5b60005b8151811015610e0a57610dca6009612070565b610df7828281518110610de057610ddf613bcb565b5b6020026020010151610df26009611d28565b612086565b8080610e0290613ac4565b915050610db7565b5050565b610e166119f6565b73ffffffffffffffffffffffffffffffffffffffff16610e346111a5565b73ffffffffffffffffffffffffffffffffffffffff1614610e8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8190613685565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610ed5573d6000803e3d6000fd5b5050565b610ef4838383604051806020016040528060008152506113e2565b505050565b610f016119f6565b73ffffffffffffffffffffffffffffffffffffffff16610f1f6111a5565b73ffffffffffffffffffffffffffffffffffffffff1614610f75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6c90613685565b60405180910390fd5b8181600a9190610f8692919061299c565b505050565b601160019054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103e90613605565b60405180910390fd5b80915050919050565b606061105a6120a4565b905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c7906135e5565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61111f6119f6565b73ffffffffffffffffffffffffffffffffffffffff1661113d6111a5565b73ffffffffffffffffffffffffffffffffffffffff1614611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118a90613685565b60405180910390fd5b61119d6000612136565b565b600f5481565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546111de90613a61565b80601f016020809104026020016040519081016040528092919081815260200182805461120a90613a61565b80156112575780601f1061122c57610100808354040283529160200191611257565b820191906000526020600020905b81548152906001019060200180831161123a57829003601f168201915b5050505050905090565b6112696119f6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ce90613505565b60405180910390fd5b80600560006112e46119f6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166113916119f6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113d69190613448565b60405180910390a35050565b6113f36113ed6119f6565b83611d36565b611432576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142990613725565b60405180910390fd5b61143e848484846121fc565b50505050565b61144c6119f6565b73ffffffffffffffffffffffffffffffffffffffff1661146a6111a5565b73ffffffffffffffffffffffffffffffffffffffff16146114c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b790613685565b60405180910390fd5b80600f8190555050565b600b80546114d790613a61565b80601f016020809104026020016040519081016040528092919081815260200182805461150390613a61565b80156115505780601f1061152557610100808354040283529160200191611550565b820191906000526020600020905b81548152906001019060200180831161153357829003601f168201915b505050505081565b606061156382611ae0565b6115a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159990613645565b60405180910390fd5b60006006600084815260200190815260200160002080546115c290613a61565b80601f01602080910402602001604051908101604052809291908181526020018280546115ee90613a61565b801561163b5780601f106116105761010080835404028352916020019161163b565b820191906000526020600020905b81548152906001019060200180831161161e57829003601f168201915b50505050509050600061164c6120a4565b90506000815114156116625781925050506116a5565b60008251111561169757808260405160200161167f9291906133bd565b604051602081830303815290604052925050506116a5565b6116a084612258565b925050505b919050565b600d5481565b60105481565b6116be6119f6565b73ffffffffffffffffffffffffffffffffffffffff166116dc6111a5565b73ffffffffffffffffffffffffffffffffffffffff1614611732576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172990613685565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b600c5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601160009054906101000a900460ff1681565b601160009054906101000a900460ff1661185a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185190613525565b60405180910390fd5b601481111561189e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189590613585565b60405180910390fd5b3481600f546118ad919061391d565b146118ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e490613545565b60405180910390fd5b6118f681611c05565b50565b6119016119f6565b73ffffffffffffffffffffffffffffffffffffffff1661191f6111a5565b73ffffffffffffffffffffffffffffffffffffffff1614611975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196c90613685565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119dc906134a5565b60405180910390fd5b6119ee81612136565b50565b601481565b600033905090565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ac957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611ad95750611ad8826122ff565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611bbf83610f9e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60026008541415611c4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4290613745565b60405180910390fd5b600260088190555060105481611c616009611d28565b611c6b9190613896565b1115611cac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca390613705565b60405180910390fd5b60005b81811015611ce757611cc16009612070565b611cd433611ccf6009611d28565b612086565b8080611cdf90613ac4565b915050611caf565b506000600c54148015611d0f5750601054611d00610c67565b1480611d0e5750600e544210155b5b15611d1d57611d1c612369565b5b600160088190555050565b600081600001549050919050565b6000611d4182611ae0565b611d80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7790613565565b60405180910390fd5b6000611d8b83610f9e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611dfa57508373ffffffffffffffffffffffffffffffffffffffff16611de284610941565b73ffffffffffffffffffffffffffffffffffffffff16145b80611e0b5750611e0a8185611764565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e3482610f9e565b73ffffffffffffffffffffffffffffffffffffffff1614611e8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e81906136a5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611efa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef1906134e5565b60405180910390fd5b611f058383836123dd565b611f10600082611b4c565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f609190613977565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fb79190613896565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6001816000016000828254019250508190555050565b6120a08282604051806020016040528060008152506123e2565b5050565b6060600a80546120b390613a61565b80601f01602080910402602001604051908101604052809291908181526020018280546120df90613a61565b801561212c5780601f106121015761010080835404028352916020019161212c565b820191906000526020600020905b81548152906001019060200180831161210f57829003601f168201915b5050505050905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612207848484611e14565b6122138484848461243d565b612252576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224990613485565b60405180910390fd5b50505050565b606061226382611ae0565b6122a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612299906136c5565b60405180910390fd5b60006122ac6120a4565b905060008151116122cc57604051806020016040528060008152506122f7565b806122d6846125d4565b6040516020016122e79291906133bd565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000600d54146123ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a5906135a5565b60405180910390fd5b6001436123bb9190613977565b600c81905550601054600c544060001c6123d59190613b0d565b600d81905550565b505050565b6123ec8383612735565b6123f9600084848461243d565b612438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242f90613485565b60405180910390fd5b505050565b600061245e8473ffffffffffffffffffffffffffffffffffffffff16612903565b156125c7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026124876119f6565b8786866040518563ffffffff1660e01b81526004016124a994939291906133fc565b602060405180830381600087803b1580156124c357600080fd5b505af19250505080156124f457506040513d601f19601f820116820180604052508101906124f19190612eb5565b60015b612577573d8060008114612524576040519150601f19603f3d011682016040523d82523d6000602084013e612529565b606091505b5060008151141561256f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256690613485565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506125cc565b600190505b949350505050565b6060600082141561261c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612730565b600082905060005b6000821461264e57808061263790613ac4565b915050600a8261264791906138ec565b9150612624565b60008167ffffffffffffffff81111561266a57612669613bfa565b5b6040519080825280601f01601f19166020018201604052801561269c5781602001600182028036833780820191505090505b5090505b60008514612729576001826126b59190613977565b9150600a856126c49190613b0d565b60306126d09190613896565b60f81b8183815181106126e6576126e5613bcb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561272291906138ec565b94506126a0565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279c90613625565b60405180910390fd5b6127ae81611ae0565b156127ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e5906134c5565b60405180910390fd5b6127fa600083836123dd565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461284a9190613896565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461292290613a61565b90600052602060002090601f016020900481019282612944576000855561298b565b82601f1061295d57805160ff191683800117855561298b565b8280016001018555821561298b579182015b8281111561298a57825182559160200191906001019061296f565b5b5090506129989190612a22565b5090565b8280546129a890613a61565b90600052602060002090601f0160209004810192826129ca5760008555612a11565b82601f106129e357803560ff1916838001178555612a11565b82800160010185558215612a11579182015b82811115612a105782358255916020019190600101906129f5565b5b509050612a1e9190612a22565b5090565b5b80821115612a3b576000816000905550600101612a23565b5090565b6000612a52612a4d846137c5565b6137a0565b90508083825260208201905082856020860282011115612a7557612a74613c33565b5b60005b85811015612aa55781612a8b8882612b33565b845260208401935060208301925050600181019050612a78565b5050509392505050565b6000612ac2612abd846137f1565b6137a0565b905082815260208101848484011115612ade57612add613c38565b5b612ae9848285613a1f565b509392505050565b6000612b04612aff84613822565b6137a0565b905082815260208101848484011115612b2057612b1f613c38565b5b612b2b848285613a1f565b509392505050565b600081359050612b428161426a565b92915050565b600082601f830112612b5d57612b5c613c2e565b5b8135612b6d848260208601612a3f565b91505092915050565b600081359050612b8581614281565b92915050565b600081359050612b9a81614298565b92915050565b600081519050612baf81614298565b92915050565b600082601f830112612bca57612bc9613c2e565b5b8135612bda848260208601612aaf565b91505092915050565b60008083601f840112612bf957612bf8613c2e565b5b8235905067ffffffffffffffff811115612c1657612c15613c29565b5b602083019150836001820283011115612c3257612c31613c33565b5b9250929050565b600082601f830112612c4e57612c4d613c2e565b5b8135612c5e848260208601612af1565b91505092915050565b600081359050612c76816142af565b92915050565b600060208284031215612c9257612c91613c42565b5b6000612ca084828501612b33565b91505092915050565b60008060408385031215612cc057612cbf613c42565b5b6000612cce85828601612b33565b9250506020612cdf85828601612b33565b9150509250929050565b600080600060608486031215612d0257612d01613c42565b5b6000612d1086828701612b33565b9350506020612d2186828701612b33565b9250506040612d3286828701612c67565b9150509250925092565b60008060008060808587031215612d5657612d55613c42565b5b6000612d6487828801612b33565b9450506020612d7587828801612b33565b9350506040612d8687828801612c67565b925050606085013567ffffffffffffffff811115612da757612da6613c3d565b5b612db387828801612bb5565b91505092959194509250565b60008060408385031215612dd657612dd5613c42565b5b6000612de485828601612b33565b9250506020612df585828601612b76565b9150509250929050565b60008060408385031215612e1657612e15613c42565b5b6000612e2485828601612b33565b9250506020612e3585828601612c67565b9150509250929050565b600060208284031215612e5557612e54613c42565b5b600082013567ffffffffffffffff811115612e7357612e72613c3d565b5b612e7f84828501612b48565b91505092915050565b600060208284031215612e9e57612e9d613c42565b5b6000612eac84828501612b8b565b91505092915050565b600060208284031215612ecb57612eca613c42565b5b6000612ed984828501612ba0565b91505092915050565b60008060208385031215612ef957612ef8613c42565b5b600083013567ffffffffffffffff811115612f1757612f16613c3d565b5b612f2385828601612be3565b92509250509250929050565b600060208284031215612f4557612f44613c42565b5b600082013567ffffffffffffffff811115612f6357612f62613c3d565b5b612f6f84828501612c39565b91505092915050565b600060208284031215612f8e57612f8d613c42565b5b6000612f9c84828501612c67565b91505092915050565b612fae816139ab565b82525050565b612fbd816139bd565b82525050565b6000612fce82613853565b612fd88185613869565b9350612fe8818560208601613a2e565b612ff181613c47565b840191505092915050565b60006130078261385e565b613011818561387a565b9350613021818560208601613a2e565b61302a81613c47565b840191505092915050565b60006130408261385e565b61304a818561388b565b935061305a818560208601613a2e565b80840191505092915050565b600061307360328361387a565b915061307e82613c58565b604082019050919050565b600061309660268361387a565b91506130a182613ca7565b604082019050919050565b60006130b9601c8361387a565b91506130c482613cf6565b602082019050919050565b60006130dc60248361387a565b91506130e782613d1f565b604082019050919050565b60006130ff60198361387a565b915061310a82613d6e565b602082019050919050565b600061312260128361387a565b915061312d82613d97565b602082019050919050565b6000613145601f8361387a565b915061315082613dc0565b602082019050919050565b6000613168602c8361387a565b915061317382613de9565b604082019050919050565b600061318b60218361387a565b915061319682613e38565b604082019050919050565b60006131ae601d8361387a565b91506131b982613e87565b602082019050919050565b60006131d160388361387a565b91506131dc82613eb0565b604082019050919050565b60006131f4602a8361387a565b91506131ff82613eff565b604082019050919050565b600061321760298361387a565b915061322282613f4e565b604082019050919050565b600061323a60208361387a565b915061324582613f9d565b602082019050919050565b600061325d60318361387a565b915061326882613fc6565b604082019050919050565b6000613280602c8361387a565b915061328b82614015565b604082019050919050565b60006132a360208361387a565b91506132ae82614064565b602082019050919050565b60006132c660298361387a565b91506132d18261408d565b604082019050919050565b60006132e9602f8361387a565b91506132f4826140dc565b604082019050919050565b600061330c60218361387a565b91506133178261412b565b604082019050919050565b600061332f602a8361387a565b915061333a8261417a565b604082019050919050565b600061335260318361387a565b915061335d826141c9565b604082019050919050565b6000613375601f8361387a565b915061338082614218565b602082019050919050565b600061339860208361387a565b91506133a382614241565b602082019050919050565b6133b781613a15565b82525050565b60006133c98285613035565b91506133d58284613035565b91508190509392505050565b60006020820190506133f66000830184612fa5565b92915050565b60006080820190506134116000830187612fa5565b61341e6020830186612fa5565b61342b60408301856133ae565b818103606083015261343d8184612fc3565b905095945050505050565b600060208201905061345d6000830184612fb4565b92915050565b6000602082019050818103600083015261347d8184612ffc565b905092915050565b6000602082019050818103600083015261349e81613066565b9050919050565b600060208201905081810360008301526134be81613089565b9050919050565b600060208201905081810360008301526134de816130ac565b9050919050565b600060208201905081810360008301526134fe816130cf565b9050919050565b6000602082019050818103600083015261351e816130f2565b9050919050565b6000602082019050818103600083015261353e81613115565b9050919050565b6000602082019050818103600083015261355e81613138565b9050919050565b6000602082019050818103600083015261357e8161315b565b9050919050565b6000602082019050818103600083015261359e8161317e565b9050919050565b600060208201905081810360008301526135be816131a1565b9050919050565b600060208201905081810360008301526135de816131c4565b9050919050565b600060208201905081810360008301526135fe816131e7565b9050919050565b6000602082019050818103600083015261361e8161320a565b9050919050565b6000602082019050818103600083015261363e8161322d565b9050919050565b6000602082019050818103600083015261365e81613250565b9050919050565b6000602082019050818103600083015261367e81613273565b9050919050565b6000602082019050818103600083015261369e81613296565b9050919050565b600060208201905081810360008301526136be816132b9565b9050919050565b600060208201905081810360008301526136de816132dc565b9050919050565b600060208201905081810360008301526136fe816132ff565b9050919050565b6000602082019050818103600083015261371e81613322565b9050919050565b6000602082019050818103600083015261373e81613345565b9050919050565b6000602082019050818103600083015261375e81613368565b9050919050565b6000602082019050818103600083015261377e8161338b565b9050919050565b600060208201905061379a60008301846133ae565b92915050565b60006137aa6137bb565b90506137b68282613a93565b919050565b6000604051905090565b600067ffffffffffffffff8211156137e0576137df613bfa565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561380c5761380b613bfa565b5b61381582613c47565b9050602081019050919050565b600067ffffffffffffffff82111561383d5761383c613bfa565b5b61384682613c47565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006138a182613a15565b91506138ac83613a15565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156138e1576138e0613b3e565b5b828201905092915050565b60006138f782613a15565b915061390283613a15565b92508261391257613911613b6d565b5b828204905092915050565b600061392882613a15565b915061393383613a15565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561396c5761396b613b3e565b5b828202905092915050565b600061398282613a15565b915061398d83613a15565b9250828210156139a05761399f613b3e565b5b828203905092915050565b60006139b6826139f5565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613a4c578082015181840152602081019050613a31565b83811115613a5b576000848401525b50505050565b60006002820490506001821680613a7957607f821691505b60208210811415613a8d57613a8c613b9c565b5b50919050565b613a9c82613c47565b810181811067ffffffffffffffff82111715613abb57613aba613bfa565b5b80604052505050565b6000613acf82613a15565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b0257613b01613b3e565b5b600182019050919050565b6000613b1882613a15565b9150613b2383613a15565b925082613b3357613b32613b6d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f53616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b7f5374617274696e6720696e64657820697320616c726561647920736574000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e7420776f756c6420657863656564206d617820737570706c79206f662060008201527f4361736820477261627300000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4e465473206861766520616c7265616479206265656e2072657365727665642e600082015250565b614273816139ab565b811461427e57600080fd5b50565b61428a816139bd565b811461429557600080fd5b50565b6142a1816139c9565b81146142ac57600080fd5b50565b6142b881613a15565b81146142c357600080fd5b5056fea26469706673582212200b3e43400da990c1d9d8f54e61ddfd8574eaca2e4666f279b7fb14d4c17ee8d264736f6c63430008060033

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

0000000000000000000000000000000000000000000000000000000000001e6100000000000000000000000000000000000000000000000000000000611d3c90

-----Decoded View---------------
Arg [0] : maxSupply (uint256): 7777
Arg [1] : revealDate (uint256): 1629306000

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000001e61
Arg [1] : 00000000000000000000000000000000000000000000000000000000611d3c90


Deployed Bytecode Sourcemap

40885:3880:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43660:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44601:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27727:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29286:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28809:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43796:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41863:174;;;;;;;;;;;;;:::i;:::-;;44487:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41210:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30176:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42045:382;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41711:140;;;;;;;;;;;;;:::i;:::-;;30586:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43933:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41456:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27421:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44178:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27151:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5202:94;;;;;;;;;;;;;:::i;:::-;;41254:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4551:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27896:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29579:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30842:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44380:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41084:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39335:679;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41173:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41369:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44277:91;;;;;;;;;;;;;:::i;:::-;;41131:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29945:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41411:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42439:360;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5451:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41316:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43660:123;4782:12;:10;:12::i;:::-;4771:23;;:7;:5;:7::i;:::-;:23;;;4763:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43760:15:::1;43741:16;:34;;;;43660:123:::0;:::o;44601:161::-;44694:4;44718:36;44742:11;44718:23;:36::i;:::-;44711:43;;44601:161;;;:::o;27727:100::-;27781:13;27814:5;27807:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27727:100;:::o;29286:221::-;29362:7;29390:16;29398:7;29390;:16::i;:::-;29382:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29475:15;:24;29491:7;29475:24;;;;;;;;;;;;;;;;;;;;;29468:31;;29286:221;;;:::o;28809:411::-;28890:13;28906:23;28921:7;28906:14;:23::i;:::-;28890:39;;28954:5;28948:11;;:2;:11;;;;28940:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;29048:5;29032:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;29057:37;29074:5;29081:12;:10;:12::i;:::-;29057:16;:37::i;:::-;29032:62;29010:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;29191:21;29200:2;29204:7;29191:8;:21::i;:::-;28879:341;28809:411;;:::o;43796:125::-;4782:12;:10;:12::i;:::-;4771:23;;:7;:5;:7::i;:::-;:23;;;4763:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43899:14:::1;43881:15;:32;;;;;;;;;;;;:::i;:::-;;43796:125:::0;:::o;41863:174::-;4782:12;:10;:12::i;:::-;4771:23;;:7;:5;:7::i;:::-;:23;;;4763:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41923:11:::1;;;;;;;;;;;41922:12;41914:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;41982:18;41997:2;41982:14;:18::i;:::-;42025:4;42011:11;;:18;;;;;;;;;;;;;;;;;;41863:174::o:0;44487:100::-;44531:7;44559:19;:9;:17;:19::i;:::-;44552:26;;44487:100;:::o;41210:31::-;;;;:::o;30176:339::-;30371:41;30390:12;:10;:12::i;:::-;30404:7;30371:18;:41::i;:::-;30363:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;30479:28;30489:4;30495:2;30499:7;30479:9;:28::i;:::-;30176:339;;;:::o;42045:382::-;4782:12;:10;:12::i;:::-;4771:23;;:7;:5;:7::i;:::-;:23;;;4763:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42178:18:::1;;42153:12;:19;42131;:9;:17;:19::i;:::-;:41;;;;:::i;:::-;42130:66;;42122:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;42268:6;42264:156;42284:12;:19;42280:1;:23;42264:156;;;42325:21;:9;:19;:21::i;:::-;42361:47;42371:12;42384:1;42371:15;;;;;;;;:::i;:::-;;;;;;;;42388:19;:9;:17;:19::i;:::-;42361:9;:47::i;:::-;42305:3;;;;;:::i;:::-;;;;42264:156;;;;42045:382:::0;:::o;41711:140::-;4782:12;:10;:12::i;:::-;4771:23;;:7;:5;:7::i;:::-;:23;;;4763:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41759:12:::1;41774:21;41759:36;;41814:10;41806:28;;:37;41835:7;41806:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;41748:103;41711:140::o:0;30586:185::-;30724:39;30741:4;30747:2;30751:7;30724:39;;;;;;;;;;;;:16;:39::i;:::-;30586:185;;;:::o;43933:119::-;4782:12;:10;:12::i;:::-;4771:23;;:7;:5;:7::i;:::-;:23;;;4763:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44029:15:::1;;44013:13;:31;;;;;;;:::i;:::-;;43933:119:::0;;:::o;41456:31::-;;;;;;;;;;;;;:::o;27421:239::-;27493:7;27513:13;27529:7;:16;27537:7;27529:16;;;;;;;;;;;;;;;;;;;;;27513:32;;27581:1;27564:19;;:5;:19;;;;27556:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27647:5;27640:12;;;27421:239;;;:::o;44178:91::-;44218:13;44251:10;:8;:10::i;:::-;44244:17;;44178:91;:::o;27151:208::-;27223:7;27268:1;27251:19;;:5;:19;;;;27243:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;27335:9;:16;27345:5;27335:16;;;;;;;;;;;;;;;;27328:23;;27151:208;;;:::o;5202:94::-;4782:12;:10;:12::i;:::-;4771:23;;:7;:5;:7::i;:::-;:23;;;4763:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5267:21:::1;5285:1;5267:9;:21::i;:::-;5202:94::o:0;41254:48::-;;;;:::o;4551:87::-;4597:7;4624:6;;;;;;;;;;;4617:13;;4551:87;:::o;27896:104::-;27952:13;27985:7;27978:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27896:104;:::o;29579:295::-;29694:12;:10;:12::i;:::-;29682:24;;:8;:24;;;;29674:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;29794:8;29749:18;:32;29768:12;:10;:12::i;:::-;29749:32;;;;;;;;;;;;;;;:42;29782:8;29749:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;29847:8;29818:48;;29833:12;:10;:12::i;:::-;29818:48;;;29857:8;29818:48;;;;;;:::i;:::-;;;;;;;;29579:295;;:::o;30842:328::-;31017:41;31036:12;:10;:12::i;:::-;31050:7;31017:18;:41::i;:::-;31009:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;31123:39;31137:4;31143:2;31147:7;31156:5;31123:13;:39::i;:::-;30842:328;;;;:::o;44380:98::-;4782:12;:10;:12::i;:::-;4771:23;;:7;:5;:7::i;:::-;:23;;;4763:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44465:5:::1;44449:13;:21;;;;44380:98:::0;:::o;41084:34::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39335:679::-;39408:13;39442:16;39450:7;39442;:16::i;:::-;39434:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;39525:23;39551:10;:19;39562:7;39551:19;;;;;;;;;;;39525:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39581:18;39602:10;:8;:10::i;:::-;39581:31;;39710:1;39694:4;39688:18;:23;39684:72;;;39735:9;39728:16;;;;;;39684:72;39886:1;39866:9;39860:23;:27;39856:108;;;39935:4;39941:9;39918:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39904:48;;;;;;39856:108;39983:23;39998:7;39983:14;:23::i;:::-;39976:30;;;;39335:679;;;;:::o;41173:28::-;;;;:::o;41369:33::-;;;;:::o;44277:91::-;4782:12;:10;:12::i;:::-;4771:23;;:7;:5;:7::i;:::-;:23;;;4763:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44348:12:::1;;;;;;;;;;;44347:13;44332:12;;:28;;;;;;;;;;;;;;;;;;44277:91::o:0;41131:33::-;;;;:::o;29945:164::-;30042:4;30066:18;:25;30085:5;30066:25;;;;;;;;;;;;;;;:35;30092:8;30066:35;;;;;;;;;;;;;;;;;;;;;;;;;30059:42;;29945:164;;;;:::o;41411:32::-;;;;;;;;;;;;;:::o;42439:360::-;42513:12;;;;;;;;;;;42505:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;41354:2;42567:15;:33;;42559:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;42694:9;42674:15;42658:13;;:31;;;;:::i;:::-;42657:46;42649:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;42760:31;42775:15;42760:14;:31::i;:::-;42439:360;:::o;5451:192::-;4782:12;:10;:12::i;:::-;4771:23;;:7;:5;:7::i;:::-;:23;;;4763:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5560:1:::1;5540:22;;:8;:22;;;;5532:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5616:19;5626:8;5616:9;:19::i;:::-;5451:192:::0;:::o;41316:40::-;41354:2;41316:40;:::o;720:98::-;773:7;800:10;793:17;;720:98;:::o;26782:305::-;26884:4;26936:25;26921:40;;;:11;:40;;;;:105;;;;26993:33;26978:48;;;:11;:48;;;;26921:105;:158;;;;27043:36;27067:11;27043:23;:36::i;:::-;26921:158;26901:178;;26782:305;;;:::o;32680:127::-;32745:4;32797:1;32769:30;;:7;:16;32777:7;32769:16;;;;;;;;;;;;;;;;;;;;;:30;;;;32762:37;;32680:127;;;:::o;36662:174::-;36764:2;36737:15;:24;36753:7;36737:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;36820:7;36816:2;36782:46;;36791:23;36806:7;36791:14;:23::i;:::-;36782:46;;;;;;;;;;;;36662:174;;:::o;42811:540::-;2612:1;3208:7;;:19;;3200:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;2612:1;3341:7;:18;;;;42942::::1;;42921:15;42899:19;:9;:17;:19::i;:::-;:37;;;;:::i;:::-;42898:62;;42890:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;43032:6;43028:148;43048:15;43044:1;:19;43028:148;;;43085:21;:9;:19;:21::i;:::-;43122:42;43132:10;43144:19;:9;:17;:19::i;:::-;43122:9;:42::i;:::-;43065:3;;;;;:::i;:::-;;;;43028:148;;;;43214:1;43192:18;;:23;:103;;;;;43237:18;;43220:13;:11;:13::i;:::-;:35;:74;;;;43278:16;;43259:15;:35;;43220:74;43192:103;43188:155;;;43312:19;:17;:19::i;:::-;43188:155;2568:1:::0;3520:7;:22;;;;42811:540;:::o;6644:114::-;6709:7;6736;:14;;;6729:21;;6644:114;;;:::o;32974:348::-;33067:4;33092:16;33100:7;33092;:16::i;:::-;33084:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33168:13;33184:23;33199:7;33184:14;:23::i;:::-;33168:39;;33237:5;33226:16;;:7;:16;;;:51;;;;33270:7;33246:31;;:20;33258:7;33246:11;:20::i;:::-;:31;;;33226:51;:87;;;;33281:32;33298:5;33305:7;33281:16;:32::i;:::-;33226:87;33218:96;;;32974:348;;;;:::o;35966:578::-;36125:4;36098:31;;:23;36113:7;36098:14;:23::i;:::-;:31;;;36090:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;36208:1;36194:16;;:2;:16;;;;36186:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;36264:39;36285:4;36291:2;36295:7;36264:20;:39::i;:::-;36368:29;36385:1;36389:7;36368:8;:29::i;:::-;36429:1;36410:9;:15;36420:4;36410:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;36458:1;36441:9;:13;36451:2;36441:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36489:2;36470:7;:16;36478:7;36470:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36528:7;36524:2;36509:27;;36518:4;36509:27;;;;;;;;;;;;35966:578;;;:::o;6766:127::-;6873:1;6855:7;:14;;;:19;;;;;;;;;;;6766:127;:::o;33664:110::-;33740:26;33750:2;33754:7;33740:26;;;;;;;;;;;;:9;:26::i;:::-;33664:110;;:::o;44064:106::-;44116:13;44149;44142:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44064:106;:::o;5651:173::-;5707:16;5726:6;;;;;;;;;;;5707:25;;5752:8;5743:6;;:17;;;;;;;;;;;;;;;;;;5807:8;5776:40;;5797:8;5776:40;;;;;;;;;;;;5696:128;5651:173;:::o;32052:315::-;32209:28;32219:4;32225:2;32229:7;32209:9;:28::i;:::-;32256:48;32279:4;32285:2;32289:7;32298:5;32256:22;:48::i;:::-;32248:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;32052:315;;;;:::o;28071:334::-;28144:13;28178:16;28186:7;28178;:16::i;:::-;28170:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;28259:21;28283:10;:8;:10::i;:::-;28259:34;;28335:1;28317:7;28311:21;:25;:86;;;;;;;;;;;;;;;;;28363:7;28372:18;:7;:16;:18::i;:::-;28346:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28311:86;28304:93;;;28071:334;;;:::o;8876:157::-;8961:4;9000:25;8985:40;;;:11;:40;;;;8978:47;;8876:157;;;:::o;43400:252::-;43474:1;43457:13;;:18;43449:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;43558:1;43543:12;:16;;;;:::i;:::-;43522:18;:37;;;;43626:18;;43603;;43593:29;43588:35;;:56;;;;:::i;:::-;43572:13;:72;;;;43400:252::o;38776:126::-;;;;:::o;34001:321::-;34131:18;34137:2;34141:7;34131:5;:18::i;:::-;34182:54;34213:1;34217:2;34221:7;34230:5;34182:22;:54::i;:::-;34160:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;34001:321;;;:::o;37401:803::-;37556:4;37577:15;:2;:13;;;:15::i;:::-;37573:624;;;37629:2;37613:36;;;37650:12;:10;:12::i;:::-;37664:4;37670:7;37679:5;37613:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37609:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37876:1;37859:6;:13;:18;37855:272;;;37902:60;;;;;;;;;;:::i;:::-;;;;;;;;37855:272;38077:6;38071:13;38062:6;38058:2;38054:15;38047:38;37609:533;37746:45;;;37736:55;;;:6;:55;;;;37729:62;;;;;37573:624;38181:4;38174:11;;37401:803;;;;;;;:::o;9347:723::-;9403:13;9633:1;9624:5;:10;9620:53;;;9651:10;;;;;;;;;;;;;;;;;;;;;9620:53;9683:12;9698:5;9683:20;;9714:14;9739:78;9754:1;9746:4;:9;9739:78;;9772:8;;;;;:::i;:::-;;;;9803:2;9795:10;;;;;:::i;:::-;;;9739:78;;;9827:19;9859:6;9849:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9827:39;;9877:154;9893:1;9884:5;:10;9877:154;;9921:1;9911:11;;;;;:::i;:::-;;;9988:2;9980:5;:10;;;;:::i;:::-;9967:2;:24;;;;:::i;:::-;9954:39;;9937:6;9944;9937:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;10017:2;10008:11;;;;;:::i;:::-;;;9877:154;;;10055:6;10041:21;;;;;9347:723;;;;:::o;34658:382::-;34752:1;34738:16;;:2;:16;;;;34730:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;34811:16;34819:7;34811;:16::i;:::-;34810:17;34802:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;34873:45;34902:1;34906:2;34910:7;34873:20;:45::i;:::-;34948:1;34931:9;:13;34941:2;34931:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34979:2;34960:7;:16;34968:7;34960:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35024:7;35020:2;34999:33;;35016:1;34999:33;;;;;;;;;;;;34658:382;;:::o;11868:387::-;11928:4;12136:12;12203:7;12191:20;12183:28;;12246:1;12239:4;:8;12232:15;;;11868:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;404:79;;:::i;:::-;350:2;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:2;;;1025:79;;:::i;:::-;994:2;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:2;;;1443:79;;:::i;:::-;1412:2;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1638:87;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:2;;1876:79;;:::i;:::-;1835:2;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;;;;;:::o;2124:133::-;2167:5;2205:6;2192:20;2183:29;;2221:30;2245:5;2221:30;:::i;:::-;2173:84;;;;:::o;2263:137::-;2308:5;2346:6;2333:20;2324:29;;2362:32;2388:5;2362:32;:::i;:::-;2314:86;;;;:::o;2406:141::-;2462:5;2493:6;2487:13;2478:22;;2509:32;2535:5;2509:32;:::i;:::-;2468:79;;;;:::o;2566:338::-;2621:5;2670:3;2663:4;2655:6;2651:17;2647:27;2637:2;;2678:79;;:::i;:::-;2637:2;2795:6;2782:20;2820:78;2894:3;2886:6;2879:4;2871:6;2867:17;2820:78;:::i;:::-;2811:87;;2627:277;;;;;:::o;2924:553::-;2982:8;2992:6;3042:3;3035:4;3027:6;3023:17;3019:27;3009:2;;3050:79;;:::i;:::-;3009:2;3163:6;3150:20;3140:30;;3193:18;3185:6;3182:30;3179:2;;;3215:79;;:::i;:::-;3179:2;3329:4;3321:6;3317:17;3305:29;;3383:3;3375:4;3367:6;3363:17;3353:8;3349:32;3346:41;3343:2;;;3390:79;;:::i;:::-;3343:2;2999:478;;;;;:::o;3497:340::-;3553:5;3602:3;3595:4;3587:6;3583:17;3579:27;3569:2;;3610:79;;:::i;:::-;3569:2;3727:6;3714:20;3752:79;3827:3;3819:6;3812:4;3804:6;3800:17;3752:79;:::i;:::-;3743:88;;3559:278;;;;;:::o;3843:139::-;3889:5;3927:6;3914:20;3905:29;;3943:33;3970:5;3943:33;:::i;:::-;3895:87;;;;:::o;3988:329::-;4047:6;4096:2;4084:9;4075:7;4071:23;4067:32;4064:2;;;4102:79;;:::i;:::-;4064:2;4222:1;4247:53;4292:7;4283:6;4272:9;4268:22;4247:53;:::i;:::-;4237:63;;4193:117;4054:263;;;;:::o;4323:474::-;4391:6;4399;4448:2;4436:9;4427:7;4423:23;4419:32;4416:2;;;4454:79;;:::i;:::-;4416:2;4574:1;4599:53;4644:7;4635:6;4624:9;4620:22;4599:53;:::i;:::-;4589:63;;4545:117;4701:2;4727:53;4772:7;4763:6;4752:9;4748:22;4727:53;:::i;:::-;4717:63;;4672:118;4406:391;;;;;:::o;4803:619::-;4880:6;4888;4896;4945:2;4933:9;4924:7;4920:23;4916:32;4913:2;;;4951:79;;:::i;:::-;4913:2;5071:1;5096:53;5141:7;5132:6;5121:9;5117:22;5096:53;:::i;:::-;5086:63;;5042:117;5198:2;5224:53;5269:7;5260:6;5249:9;5245:22;5224:53;:::i;:::-;5214:63;;5169:118;5326:2;5352:53;5397:7;5388:6;5377:9;5373:22;5352:53;:::i;:::-;5342:63;;5297:118;4903:519;;;;;:::o;5428:943::-;5523:6;5531;5539;5547;5596:3;5584:9;5575:7;5571:23;5567:33;5564:2;;;5603:79;;:::i;:::-;5564:2;5723:1;5748:53;5793:7;5784:6;5773:9;5769:22;5748:53;:::i;:::-;5738:63;;5694:117;5850:2;5876:53;5921:7;5912:6;5901:9;5897:22;5876:53;:::i;:::-;5866:63;;5821:118;5978:2;6004:53;6049:7;6040:6;6029:9;6025:22;6004:53;:::i;:::-;5994:63;;5949:118;6134:2;6123:9;6119:18;6106:32;6165:18;6157:6;6154:30;6151:2;;;6187:79;;:::i;:::-;6151:2;6292:62;6346:7;6337:6;6326:9;6322:22;6292:62;:::i;:::-;6282:72;;6077:287;5554:817;;;;;;;:::o;6377:468::-;6442:6;6450;6499:2;6487:9;6478:7;6474:23;6470:32;6467:2;;;6505:79;;:::i;:::-;6467:2;6625:1;6650:53;6695:7;6686:6;6675:9;6671:22;6650:53;:::i;:::-;6640:63;;6596:117;6752:2;6778:50;6820:7;6811:6;6800:9;6796:22;6778:50;:::i;:::-;6768:60;;6723:115;6457:388;;;;;:::o;6851:474::-;6919:6;6927;6976:2;6964:9;6955:7;6951:23;6947:32;6944:2;;;6982:79;;:::i;:::-;6944:2;7102:1;7127:53;7172:7;7163:6;7152:9;7148:22;7127:53;:::i;:::-;7117:63;;7073:117;7229:2;7255:53;7300:7;7291:6;7280:9;7276:22;7255:53;:::i;:::-;7245:63;;7200:118;6934:391;;;;;:::o;7331:539::-;7415:6;7464:2;7452:9;7443:7;7439:23;7435:32;7432:2;;;7470:79;;:::i;:::-;7432:2;7618:1;7607:9;7603:17;7590:31;7648:18;7640:6;7637:30;7634:2;;;7670:79;;:::i;:::-;7634:2;7775:78;7845:7;7836:6;7825:9;7821:22;7775:78;:::i;:::-;7765:88;;7561:302;7422:448;;;;:::o;7876:327::-;7934:6;7983:2;7971:9;7962:7;7958:23;7954:32;7951:2;;;7989:79;;:::i;:::-;7951:2;8109:1;8134:52;8178:7;8169:6;8158:9;8154:22;8134:52;:::i;:::-;8124:62;;8080:116;7941:262;;;;:::o;8209:349::-;8278:6;8327:2;8315:9;8306:7;8302:23;8298:32;8295:2;;;8333:79;;:::i;:::-;8295:2;8453:1;8478:63;8533:7;8524:6;8513:9;8509:22;8478:63;:::i;:::-;8468:73;;8424:127;8285:273;;;;:::o;8564:529::-;8635:6;8643;8692:2;8680:9;8671:7;8667:23;8663:32;8660:2;;;8698:79;;:::i;:::-;8660:2;8846:1;8835:9;8831:17;8818:31;8876:18;8868:6;8865:30;8862:2;;;8898:79;;:::i;:::-;8862:2;9011:65;9068:7;9059:6;9048:9;9044:22;9011:65;:::i;:::-;8993:83;;;;8789:297;8650:443;;;;;:::o;9099:509::-;9168:6;9217:2;9205:9;9196:7;9192:23;9188:32;9185:2;;;9223:79;;:::i;:::-;9185:2;9371:1;9360:9;9356:17;9343:31;9401:18;9393:6;9390:30;9387:2;;;9423:79;;:::i;:::-;9387:2;9528:63;9583:7;9574:6;9563:9;9559:22;9528:63;:::i;:::-;9518:73;;9314:287;9175:433;;;;:::o;9614:329::-;9673:6;9722:2;9710:9;9701:7;9697:23;9693:32;9690:2;;;9728:79;;:::i;:::-;9690:2;9848:1;9873:53;9918:7;9909:6;9898:9;9894:22;9873:53;:::i;:::-;9863:63;;9819:117;9680:263;;;;:::o;9949:118::-;10036:24;10054:5;10036:24;:::i;:::-;10031:3;10024:37;10014:53;;:::o;10073:109::-;10154:21;10169:5;10154:21;:::i;:::-;10149:3;10142:34;10132:50;;:::o;10188:360::-;10274:3;10302:38;10334:5;10302:38;:::i;:::-;10356:70;10419:6;10414:3;10356:70;:::i;:::-;10349:77;;10435:52;10480:6;10475:3;10468:4;10461:5;10457:16;10435:52;:::i;:::-;10512:29;10534:6;10512:29;:::i;:::-;10507:3;10503:39;10496:46;;10278:270;;;;;:::o;10554:364::-;10642:3;10670:39;10703:5;10670:39;:::i;:::-;10725:71;10789:6;10784:3;10725:71;:::i;:::-;10718:78;;10805:52;10850:6;10845:3;10838:4;10831:5;10827:16;10805:52;:::i;:::-;10882:29;10904:6;10882:29;:::i;:::-;10877:3;10873:39;10866:46;;10646:272;;;;;:::o;10924:377::-;11030:3;11058:39;11091:5;11058:39;:::i;:::-;11113:89;11195:6;11190:3;11113:89;:::i;:::-;11106:96;;11211:52;11256:6;11251:3;11244:4;11237:5;11233:16;11211:52;:::i;:::-;11288:6;11283:3;11279:16;11272:23;;11034:267;;;;;:::o;11307:366::-;11449:3;11470:67;11534:2;11529:3;11470:67;:::i;:::-;11463:74;;11546:93;11635:3;11546:93;:::i;:::-;11664:2;11659:3;11655:12;11648:19;;11453:220;;;:::o;11679:366::-;11821:3;11842:67;11906:2;11901:3;11842:67;:::i;:::-;11835:74;;11918:93;12007:3;11918:93;:::i;:::-;12036:2;12031:3;12027:12;12020:19;;11825:220;;;:::o;12051:366::-;12193:3;12214:67;12278:2;12273:3;12214:67;:::i;:::-;12207:74;;12290:93;12379:3;12290:93;:::i;:::-;12408:2;12403:3;12399:12;12392:19;;12197:220;;;:::o;12423:366::-;12565:3;12586:67;12650:2;12645:3;12586:67;:::i;:::-;12579:74;;12662:93;12751:3;12662:93;:::i;:::-;12780:2;12775:3;12771:12;12764:19;;12569:220;;;:::o;12795:366::-;12937:3;12958:67;13022:2;13017:3;12958:67;:::i;:::-;12951:74;;13034:93;13123:3;13034:93;:::i;:::-;13152:2;13147:3;13143:12;13136:19;;12941:220;;;:::o;13167:366::-;13309:3;13330:67;13394:2;13389:3;13330:67;:::i;:::-;13323:74;;13406:93;13495:3;13406:93;:::i;:::-;13524:2;13519:3;13515:12;13508:19;;13313:220;;;:::o;13539:366::-;13681:3;13702:67;13766:2;13761:3;13702:67;:::i;:::-;13695:74;;13778:93;13867:3;13778:93;:::i;:::-;13896:2;13891:3;13887:12;13880:19;;13685:220;;;:::o;13911:366::-;14053:3;14074:67;14138:2;14133:3;14074:67;:::i;:::-;14067:74;;14150:93;14239:3;14150:93;:::i;:::-;14268:2;14263:3;14259:12;14252:19;;14057:220;;;:::o;14283:366::-;14425:3;14446:67;14510:2;14505:3;14446:67;:::i;:::-;14439:74;;14522:93;14611:3;14522:93;:::i;:::-;14640:2;14635:3;14631:12;14624:19;;14429:220;;;:::o;14655:366::-;14797:3;14818:67;14882:2;14877:3;14818:67;:::i;:::-;14811:74;;14894:93;14983:3;14894:93;:::i;:::-;15012:2;15007:3;15003:12;14996:19;;14801:220;;;:::o;15027:366::-;15169:3;15190:67;15254:2;15249:3;15190:67;:::i;:::-;15183:74;;15266:93;15355:3;15266:93;:::i;:::-;15384:2;15379:3;15375:12;15368:19;;15173:220;;;:::o;15399:366::-;15541:3;15562:67;15626:2;15621:3;15562:67;:::i;:::-;15555:74;;15638:93;15727:3;15638:93;:::i;:::-;15756:2;15751:3;15747:12;15740:19;;15545:220;;;:::o;15771:366::-;15913:3;15934:67;15998:2;15993:3;15934:67;:::i;:::-;15927:74;;16010:93;16099:3;16010:93;:::i;:::-;16128:2;16123:3;16119:12;16112:19;;15917:220;;;:::o;16143:366::-;16285:3;16306:67;16370:2;16365:3;16306:67;:::i;:::-;16299:74;;16382:93;16471:3;16382:93;:::i;:::-;16500:2;16495:3;16491:12;16484:19;;16289:220;;;:::o;16515:366::-;16657:3;16678:67;16742:2;16737:3;16678:67;:::i;:::-;16671:74;;16754:93;16843:3;16754:93;:::i;:::-;16872:2;16867:3;16863:12;16856:19;;16661:220;;;:::o;16887:366::-;17029:3;17050:67;17114:2;17109:3;17050:67;:::i;:::-;17043:74;;17126:93;17215:3;17126:93;:::i;:::-;17244:2;17239:3;17235:12;17228:19;;17033:220;;;:::o;17259:366::-;17401:3;17422:67;17486:2;17481:3;17422:67;:::i;:::-;17415:74;;17498:93;17587:3;17498:93;:::i;:::-;17616:2;17611:3;17607:12;17600:19;;17405:220;;;:::o;17631:366::-;17773:3;17794:67;17858:2;17853:3;17794:67;:::i;:::-;17787:74;;17870:93;17959:3;17870:93;:::i;:::-;17988:2;17983:3;17979:12;17972:19;;17777:220;;;:::o;18003:366::-;18145:3;18166:67;18230:2;18225:3;18166:67;:::i;:::-;18159:74;;18242:93;18331:3;18242:93;:::i;:::-;18360:2;18355:3;18351:12;18344:19;;18149:220;;;:::o;18375:366::-;18517:3;18538:67;18602:2;18597:3;18538:67;:::i;:::-;18531:74;;18614:93;18703:3;18614:93;:::i;:::-;18732:2;18727:3;18723:12;18716:19;;18521:220;;;:::o;18747:366::-;18889:3;18910:67;18974:2;18969:3;18910:67;:::i;:::-;18903:74;;18986:93;19075:3;18986:93;:::i;:::-;19104:2;19099:3;19095:12;19088:19;;18893:220;;;:::o;19119:366::-;19261:3;19282:67;19346:2;19341:3;19282:67;:::i;:::-;19275:74;;19358:93;19447:3;19358:93;:::i;:::-;19476:2;19471:3;19467:12;19460:19;;19265:220;;;:::o;19491:366::-;19633:3;19654:67;19718:2;19713:3;19654:67;:::i;:::-;19647:74;;19730:93;19819:3;19730:93;:::i;:::-;19848:2;19843:3;19839:12;19832:19;;19637:220;;;:::o;19863:366::-;20005:3;20026:67;20090:2;20085:3;20026:67;:::i;:::-;20019:74;;20102:93;20191:3;20102:93;:::i;:::-;20220:2;20215:3;20211:12;20204:19;;20009:220;;;:::o;20235:118::-;20322:24;20340:5;20322:24;:::i;:::-;20317:3;20310:37;20300:53;;:::o;20359:435::-;20539:3;20561:95;20652:3;20643:6;20561:95;:::i;:::-;20554:102;;20673:95;20764:3;20755:6;20673:95;:::i;:::-;20666:102;;20785:3;20778:10;;20543:251;;;;;:::o;20800:222::-;20893:4;20931:2;20920:9;20916:18;20908:26;;20944:71;21012:1;21001:9;20997:17;20988:6;20944:71;:::i;:::-;20898:124;;;;:::o;21028:640::-;21223:4;21261:3;21250:9;21246:19;21238:27;;21275:71;21343:1;21332:9;21328:17;21319:6;21275:71;:::i;:::-;21356:72;21424:2;21413:9;21409:18;21400:6;21356:72;:::i;:::-;21438;21506:2;21495:9;21491:18;21482:6;21438:72;:::i;:::-;21557:9;21551:4;21547:20;21542:2;21531:9;21527:18;21520:48;21585:76;21656:4;21647:6;21585:76;:::i;:::-;21577:84;;21228:440;;;;;;;:::o;21674:210::-;21761:4;21799:2;21788:9;21784:18;21776:26;;21812:65;21874:1;21863:9;21859:17;21850:6;21812:65;:::i;:::-;21766:118;;;;:::o;21890:313::-;22003:4;22041:2;22030:9;22026:18;22018:26;;22090:9;22084:4;22080:20;22076:1;22065:9;22061:17;22054:47;22118:78;22191:4;22182:6;22118:78;:::i;:::-;22110:86;;22008:195;;;;:::o;22209:419::-;22375:4;22413:2;22402:9;22398:18;22390:26;;22462:9;22456:4;22452:20;22448:1;22437:9;22433:17;22426:47;22490:131;22616:4;22490:131;:::i;:::-;22482:139;;22380:248;;;:::o;22634:419::-;22800:4;22838:2;22827:9;22823:18;22815:26;;22887:9;22881:4;22877:20;22873:1;22862:9;22858:17;22851:47;22915:131;23041:4;22915:131;:::i;:::-;22907:139;;22805:248;;;:::o;23059:419::-;23225:4;23263:2;23252:9;23248:18;23240:26;;23312:9;23306:4;23302:20;23298:1;23287:9;23283:17;23276:47;23340:131;23466:4;23340:131;:::i;:::-;23332:139;;23230:248;;;:::o;23484:419::-;23650:4;23688:2;23677:9;23673:18;23665:26;;23737:9;23731:4;23727:20;23723:1;23712:9;23708:17;23701:47;23765:131;23891:4;23765:131;:::i;:::-;23757:139;;23655:248;;;:::o;23909:419::-;24075:4;24113:2;24102:9;24098:18;24090:26;;24162:9;24156:4;24152:20;24148:1;24137:9;24133:17;24126:47;24190:131;24316:4;24190:131;:::i;:::-;24182:139;;24080:248;;;:::o;24334:419::-;24500:4;24538:2;24527:9;24523:18;24515:26;;24587:9;24581:4;24577:20;24573:1;24562:9;24558:17;24551:47;24615:131;24741:4;24615:131;:::i;:::-;24607:139;;24505:248;;;:::o;24759:419::-;24925:4;24963:2;24952:9;24948:18;24940:26;;25012:9;25006:4;25002:20;24998:1;24987:9;24983:17;24976:47;25040:131;25166:4;25040:131;:::i;:::-;25032:139;;24930:248;;;:::o;25184:419::-;25350:4;25388:2;25377:9;25373:18;25365:26;;25437:9;25431:4;25427:20;25423:1;25412:9;25408:17;25401:47;25465:131;25591:4;25465:131;:::i;:::-;25457:139;;25355:248;;;:::o;25609:419::-;25775:4;25813:2;25802:9;25798:18;25790:26;;25862:9;25856:4;25852:20;25848:1;25837:9;25833:17;25826:47;25890:131;26016:4;25890:131;:::i;:::-;25882:139;;25780:248;;;:::o;26034:419::-;26200:4;26238:2;26227:9;26223:18;26215:26;;26287:9;26281:4;26277:20;26273:1;26262:9;26258:17;26251:47;26315:131;26441:4;26315:131;:::i;:::-;26307:139;;26205:248;;;:::o;26459:419::-;26625:4;26663:2;26652:9;26648:18;26640:26;;26712:9;26706:4;26702:20;26698:1;26687:9;26683:17;26676:47;26740:131;26866:4;26740:131;:::i;:::-;26732:139;;26630:248;;;:::o;26884:419::-;27050:4;27088:2;27077:9;27073:18;27065:26;;27137:9;27131:4;27127:20;27123:1;27112:9;27108:17;27101:47;27165:131;27291:4;27165:131;:::i;:::-;27157:139;;27055:248;;;:::o;27309:419::-;27475:4;27513:2;27502:9;27498:18;27490:26;;27562:9;27556:4;27552:20;27548:1;27537:9;27533:17;27526:47;27590:131;27716:4;27590:131;:::i;:::-;27582:139;;27480:248;;;:::o;27734:419::-;27900:4;27938:2;27927:9;27923:18;27915:26;;27987:9;27981:4;27977:20;27973:1;27962:9;27958:17;27951:47;28015:131;28141:4;28015:131;:::i;:::-;28007:139;;27905:248;;;:::o;28159:419::-;28325:4;28363:2;28352:9;28348:18;28340:26;;28412:9;28406:4;28402:20;28398:1;28387:9;28383:17;28376:47;28440:131;28566:4;28440:131;:::i;:::-;28432:139;;28330:248;;;:::o;28584:419::-;28750:4;28788:2;28777:9;28773:18;28765:26;;28837:9;28831:4;28827:20;28823:1;28812:9;28808:17;28801:47;28865:131;28991:4;28865:131;:::i;:::-;28857:139;;28755:248;;;:::o;29009:419::-;29175:4;29213:2;29202:9;29198:18;29190:26;;29262:9;29256:4;29252:20;29248:1;29237:9;29233:17;29226:47;29290:131;29416:4;29290:131;:::i;:::-;29282:139;;29180:248;;;:::o;29434:419::-;29600:4;29638:2;29627:9;29623:18;29615:26;;29687:9;29681:4;29677:20;29673:1;29662:9;29658:17;29651:47;29715:131;29841:4;29715:131;:::i;:::-;29707:139;;29605:248;;;:::o;29859:419::-;30025:4;30063:2;30052:9;30048:18;30040:26;;30112:9;30106:4;30102:20;30098:1;30087:9;30083:17;30076:47;30140:131;30266:4;30140:131;:::i;:::-;30132:139;;30030:248;;;:::o;30284:419::-;30450:4;30488:2;30477:9;30473:18;30465:26;;30537:9;30531:4;30527:20;30523:1;30512:9;30508:17;30501:47;30565:131;30691:4;30565:131;:::i;:::-;30557:139;;30455:248;;;:::o;30709:419::-;30875:4;30913:2;30902:9;30898:18;30890:26;;30962:9;30956:4;30952:20;30948:1;30937:9;30933:17;30926:47;30990:131;31116:4;30990:131;:::i;:::-;30982:139;;30880:248;;;:::o;31134:419::-;31300:4;31338:2;31327:9;31323:18;31315:26;;31387:9;31381:4;31377:20;31373:1;31362:9;31358:17;31351:47;31415:131;31541:4;31415:131;:::i;:::-;31407:139;;31305:248;;;:::o;31559:419::-;31725:4;31763:2;31752:9;31748:18;31740:26;;31812:9;31806:4;31802:20;31798:1;31787:9;31783:17;31776:47;31840:131;31966:4;31840:131;:::i;:::-;31832:139;;31730:248;;;:::o;31984:419::-;32150:4;32188:2;32177:9;32173:18;32165:26;;32237:9;32231:4;32227:20;32223:1;32212:9;32208:17;32201:47;32265:131;32391:4;32265:131;:::i;:::-;32257:139;;32155:248;;;:::o;32409:222::-;32502:4;32540:2;32529:9;32525:18;32517:26;;32553:71;32621:1;32610:9;32606:17;32597:6;32553:71;:::i;:::-;32507:124;;;;:::o;32637:129::-;32671:6;32698:20;;:::i;:::-;32688:30;;32727:33;32755:4;32747:6;32727:33;:::i;:::-;32678:88;;;:::o;32772:75::-;32805:6;32838:2;32832:9;32822:19;;32812:35;:::o;32853:311::-;32930:4;33020:18;33012:6;33009:30;33006:2;;;33042:18;;:::i;:::-;33006:2;33092:4;33084:6;33080:17;33072:25;;33152:4;33146;33142:15;33134:23;;32935:229;;;:::o;33170:307::-;33231:4;33321:18;33313:6;33310:30;33307:2;;;33343:18;;:::i;:::-;33307:2;33381:29;33403:6;33381:29;:::i;:::-;33373:37;;33465:4;33459;33455:15;33447:23;;33236:241;;;:::o;33483:308::-;33545:4;33635:18;33627:6;33624:30;33621:2;;;33657:18;;:::i;:::-;33621:2;33695:29;33717:6;33695:29;:::i;:::-;33687:37;;33779:4;33773;33769:15;33761:23;;33550:241;;;:::o;33797:98::-;33848:6;33882:5;33876:12;33866:22;;33855:40;;;:::o;33901:99::-;33953:6;33987:5;33981:12;33971:22;;33960:40;;;:::o;34006:168::-;34089:11;34123:6;34118:3;34111:19;34163:4;34158:3;34154:14;34139:29;;34101:73;;;;:::o;34180:169::-;34264:11;34298:6;34293:3;34286:19;34338:4;34333:3;34329:14;34314:29;;34276:73;;;;:::o;34355:148::-;34457:11;34494:3;34479:18;;34469:34;;;;:::o;34509:305::-;34549:3;34568:20;34586:1;34568:20;:::i;:::-;34563:25;;34602:20;34620:1;34602:20;:::i;:::-;34597:25;;34756:1;34688:66;34684:74;34681:1;34678:81;34675:2;;;34762:18;;:::i;:::-;34675:2;34806:1;34803;34799:9;34792:16;;34553:261;;;;:::o;34820:185::-;34860:1;34877:20;34895:1;34877:20;:::i;:::-;34872:25;;34911:20;34929:1;34911:20;:::i;:::-;34906:25;;34950:1;34940:2;;34955:18;;:::i;:::-;34940:2;34997:1;34994;34990:9;34985:14;;34862:143;;;;:::o;35011:348::-;35051:7;35074:20;35092:1;35074:20;:::i;:::-;35069:25;;35108:20;35126:1;35108:20;:::i;:::-;35103:25;;35296:1;35228:66;35224:74;35221:1;35218:81;35213:1;35206:9;35199:17;35195:105;35192:2;;;35303:18;;:::i;:::-;35192:2;35351:1;35348;35344:9;35333:20;;35059:300;;;;:::o;35365:191::-;35405:4;35425:20;35443:1;35425:20;:::i;:::-;35420:25;;35459:20;35477:1;35459:20;:::i;:::-;35454:25;;35498:1;35495;35492:8;35489:2;;;35503:18;;:::i;:::-;35489:2;35548:1;35545;35541:9;35533:17;;35410:146;;;;:::o;35562:96::-;35599:7;35628:24;35646:5;35628:24;:::i;:::-;35617:35;;35607:51;;;:::o;35664:90::-;35698:7;35741:5;35734:13;35727:21;35716:32;;35706:48;;;:::o;35760:149::-;35796:7;35836:66;35829:5;35825:78;35814:89;;35804:105;;;:::o;35915:126::-;35952:7;35992:42;35985:5;35981:54;35970:65;;35960:81;;;:::o;36047:77::-;36084:7;36113:5;36102:16;;36092:32;;;:::o;36130:154::-;36214:6;36209:3;36204;36191:30;36276:1;36267:6;36262:3;36258:16;36251:27;36181:103;;;:::o;36290:307::-;36358:1;36368:113;36382:6;36379:1;36376:13;36368:113;;;36467:1;36462:3;36458:11;36452:18;36448:1;36443:3;36439:11;36432:39;36404:2;36401:1;36397:10;36392:15;;36368:113;;;36499:6;36496:1;36493:13;36490:2;;;36579:1;36570:6;36565:3;36561:16;36554:27;36490:2;36339:258;;;;:::o;36603:320::-;36647:6;36684:1;36678:4;36674:12;36664:22;;36731:1;36725:4;36721:12;36752:18;36742:2;;36808:4;36800:6;36796:17;36786:27;;36742:2;36870;36862:6;36859:14;36839:18;36836:38;36833:2;;;36889:18;;:::i;:::-;36833:2;36654:269;;;;:::o;36929:281::-;37012:27;37034:4;37012:27;:::i;:::-;37004:6;37000:40;37142:6;37130:10;37127:22;37106:18;37094:10;37091:34;37088:62;37085:2;;;37153:18;;:::i;:::-;37085:2;37193:10;37189:2;37182:22;36972:238;;;:::o;37216:233::-;37255:3;37278:24;37296:5;37278:24;:::i;:::-;37269:33;;37324:66;37317:5;37314:77;37311:2;;;37394:18;;:::i;:::-;37311:2;37441:1;37434:5;37430:13;37423:20;;37259:190;;;:::o;37455:176::-;37487:1;37504:20;37522:1;37504:20;:::i;:::-;37499:25;;37538:20;37556:1;37538:20;:::i;:::-;37533:25;;37577:1;37567:2;;37582:18;;:::i;:::-;37567:2;37623:1;37620;37616:9;37611:14;;37489:142;;;;:::o;37637:180::-;37685:77;37682:1;37675:88;37782:4;37779:1;37772:15;37806:4;37803:1;37796:15;37823:180;37871:77;37868:1;37861:88;37968:4;37965:1;37958:15;37992:4;37989:1;37982:15;38009:180;38057:77;38054:1;38047:88;38154:4;38151:1;38144:15;38178:4;38175:1;38168:15;38195:180;38243:77;38240:1;38233:88;38340:4;38337:1;38330:15;38364:4;38361:1;38354:15;38381:180;38429:77;38426:1;38419:88;38526:4;38523:1;38516:15;38550:4;38547:1;38540:15;38567:117;38676:1;38673;38666:12;38690:117;38799:1;38796;38789:12;38813:117;38922:1;38919;38912:12;38936:117;39045:1;39042;39035:12;39059:117;39168:1;39165;39158:12;39182:117;39291:1;39288;39281:12;39305:102;39346:6;39397:2;39393:7;39388:2;39381:5;39377:14;39373:28;39363:38;;39353:54;;;:::o;39413:237::-;39553:34;39549:1;39541:6;39537:14;39530:58;39622:20;39617:2;39609:6;39605:15;39598:45;39519:131;:::o;39656:225::-;39796:34;39792:1;39784:6;39780:14;39773:58;39865:8;39860:2;39852:6;39848:15;39841:33;39762:119;:::o;39887:178::-;40027:30;40023:1;40015:6;40011:14;40004:54;39993:72;:::o;40071:223::-;40211:34;40207:1;40199:6;40195:14;40188:58;40280:6;40275:2;40267:6;40263:15;40256:31;40177:117;:::o;40300:175::-;40440:27;40436:1;40428:6;40424:14;40417:51;40406:69;:::o;40481:168::-;40621:20;40617:1;40609:6;40605:14;40598:44;40587:62;:::o;40655:181::-;40795:33;40791:1;40783:6;40779:14;40772:57;40761:75;:::o;40842:231::-;40982:34;40978:1;40970:6;40966:14;40959:58;41051:14;41046:2;41038:6;41034:15;41027:39;40948:125;:::o;41079:220::-;41219:34;41215:1;41207:6;41203:14;41196:58;41288:3;41283:2;41275:6;41271:15;41264:28;41185:114;:::o;41305:179::-;41445:31;41441:1;41433:6;41429:14;41422:55;41411:73;:::o;41490:243::-;41630:34;41626:1;41618:6;41614:14;41607:58;41699:26;41694:2;41686:6;41682:15;41675:51;41596:137;:::o;41739:229::-;41879:34;41875:1;41867:6;41863:14;41856:58;41948:12;41943:2;41935:6;41931:15;41924:37;41845:123;:::o;41974:228::-;42114:34;42110:1;42102:6;42098:14;42091:58;42183:11;42178:2;42170:6;42166:15;42159:36;42080:122;:::o;42208:182::-;42348:34;42344:1;42336:6;42332:14;42325:58;42314:76;:::o;42396:236::-;42536:34;42532:1;42524:6;42520:14;42513:58;42605:19;42600:2;42592:6;42588:15;42581:44;42502:130;:::o;42638:231::-;42778:34;42774:1;42766:6;42762:14;42755:58;42847:14;42842:2;42834:6;42830:15;42823:39;42744:125;:::o;42875:182::-;43015:34;43011:1;43003:6;42999:14;42992:58;42981:76;:::o;43063:228::-;43203:34;43199:1;43191:6;43187:14;43180:58;43272:11;43267:2;43259:6;43255:15;43248:36;43169:122;:::o;43297:234::-;43437:34;43433:1;43425:6;43421:14;43414:58;43506:17;43501:2;43493:6;43489:15;43482:42;43403:128;:::o;43537:220::-;43677:34;43673:1;43665:6;43661:14;43654:58;43746:3;43741:2;43733:6;43729:15;43722:28;43643:114;:::o;43763:229::-;43903:34;43899:1;43891:6;43887:14;43880:58;43972:12;43967:2;43959:6;43955:15;43948:37;43869:123;:::o;43998:236::-;44138:34;44134:1;44126:6;44122:14;44115:58;44207:19;44202:2;44194:6;44190:15;44183:44;44104:130;:::o;44240:181::-;44380:33;44376:1;44368:6;44364:14;44357:57;44346:75;:::o;44427:182::-;44567:34;44563:1;44555:6;44551:14;44544:58;44533:76;:::o;44615:122::-;44688:24;44706:5;44688:24;:::i;:::-;44681:5;44678:35;44668:2;;44727:1;44724;44717:12;44668:2;44658:79;:::o;44743:116::-;44813:21;44828:5;44813:21;:::i;:::-;44806:5;44803:32;44793:2;;44849:1;44846;44839:12;44793:2;44783:76;:::o;44865:120::-;44937:23;44954:5;44937:23;:::i;:::-;44930:5;44927:34;44917:2;;44975:1;44972;44965:12;44917:2;44907:78;:::o;44991:122::-;45064:24;45082:5;45064:24;:::i;:::-;45057:5;45054:35;45044:2;;45103:1;45100;45093:12;45044:2;45034:79;:::o

Swarm Source

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