ETH Price: $2,623.03 (+1.09%)

Token

Grim Reaper NFT (GR)
 

Overview

Max Total Supply

1,022 GR

Holders

72

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 GR
0xf39ad39c4147f4b862bc0b4976563acb1e85263e
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
GrimReaper

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-02
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;



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

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

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

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

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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


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

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

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

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

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

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

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

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

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

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

error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

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

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

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

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

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

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

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

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

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

contract GrimReaper is ERC721A, Ownable {
    uint256 public MaxMintPerTx = 15;
    uint256 public MaxFreePerWallet = 5;
    uint256 public maxSupply = 5500;
    uint256 public price = 0.0088 * 10**18;
    string public baseURI =
        "ipfs://QmY5ij3LVQYAzkEWNC4VBeiKwp2K1Fi9ji57dawyGdkuaX/";
    uint256 public totalFree = 1000;
    uint256 public startTime = 1662292800;
    bool public firstPerWalletFree = false;

    constructor() ERC721A("Grim Reaper NFT", "GR") {}

    function withdraw() external onlyOwner {
        (bool success, ) = msg.sender.call{value: address(this).balance}("");
        require(success, "Failed to send Ether");
    }

    function devMint(uint256 amount) external payable onlyOwner {
        _safeMint(msg.sender, amount);
    }

    function devMint(address[] memory addressList, uint256 amount) external payable onlyOwner {
        for (uint i = 0; i < addressList.length; i++) {
            _safeMint(addressList[i], amount);
        }
    }

    function mint(uint256 amount) external payable {
        require(block.timestamp >= startTime, "Sale is not active.");
        require(amount <= MaxMintPerTx, "Amount should not exceed max mint number");

        uint256 cost = price;
        if (
            totalSupply() + amount <= totalFree &&
            numberMinted(msg.sender) + amount <= MaxFreePerWallet
        ) {
            cost = 0;
        }

        uint256 count = amount;
        if (firstPerWalletFree && numberMinted(msg.sender) == 0) {
            count = amount - 1;
        }
        require(msg.value >= count * cost, "Please send the exact amount.");

        _safeMint(msg.sender, amount);
    }

    function updatePrice(uint256 __price) public onlyOwner {
        price = __price;
    }

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

    function setTime(uint256 time) external onlyOwner {
        startTime = time;
    }

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

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

    function setFreeAmount(uint256 amount) external onlyOwner {
        totalFree = amount;
    }

    function setfirstPerWalletFree() external onlyOwner {
        firstPerWalletFree = !firstPerWalletFree;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MaxFreePerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxMintPerTx","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":"uint256","name":"amount","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addressList","type":"address[]"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"firstPerWalletFree","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setFreeAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"setTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setfirstPerWalletFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","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":"totalFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"__price","type":"uint256"}],"name":"updatePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600f6009556005600a5561157c600b55661f438daa060000600c5560405180606001604052806036815260200162003d7c60369139600d90805190602001906200005092919062000237565b506103e8600e556363149340600f556000601060006101000a81548160ff0219169083151502179055503480156200008757600080fd5b506040518060400160405280600f81526020017f4772696d20526561706572204e465400000000000000000000000000000000008152506040518060400160405280600281526020017f475200000000000000000000000000000000000000000000000000000000000081525081600290805190602001906200010c92919062000237565b5080600390805190602001906200012592919062000237565b50620001366200016460201b60201c565b60008190555050506200015e620001526200016960201b60201c565b6200017160201b60201c565b6200034c565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200024590620002e7565b90600052602060002090601f016020900481019282620002695760008555620002b5565b82601f106200028457805160ff1916838001178555620002b5565b82800160010185558215620002b5579182015b82811115620002b457825182559160200191906001019062000297565b5b509050620002c49190620002c8565b5090565b5b80821115620002e3576000816000905550600101620002c9565b5090565b600060028204905060018216806200030057607f821691505b602082108114156200031757620003166200031d565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613a20806200035c6000396000f3fe6080604052600436106102045760003560e01c8063715018a611610118578063a22cb465116100a0578063d5abeb011161006f578063d5abeb0114610701578063dc33e6811461072c578063e9566bf614610769578063e985e9c514610785578063f2fde38b146107c257610204565b8063a22cb46514610647578063b6c46c5314610670578063b88d4fde1461069b578063c87b56dd146106c457610204565b80638da5cb5b116100e75780638da5cb5b1461058157806392910eec146105ac57806395d89b41146105d5578063a035b1fe14610600578063a0712d681461062b57610204565b8063715018a6146104eb57806378e9792514610502578063823903a91461052d5780638d6cc56d1461055857610204565b8063375a069a1161019b57806342842e0e1161016a57806342842e0e146103f457806355f804b31461041d5780636352211e146104465780636c0360eb1461048357806370a08231146104ae57610204565b8063375a069a1461036d5780633beb26c4146103895780633ccfd60b146103b257806341e4cc5f146103c957610204565b806311378ce5116101d757806311378ce5146102d757806318160ddd146102ee57806323b872dd14610319578063333e44e61461034257610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190612f70565b6107eb565b60405161023d91906132c3565b60405180910390f35b34801561025257600080fd5b5061025b6108cd565b60405161026891906132de565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190613007565b61095f565b6040516102a5919061325c565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d09190612ee0565b6109db565b005b3480156102e357600080fd5b506102ec610ae6565b005b3480156102fa57600080fd5b50610303610b8e565b60405161031091906133c0565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b9190612dda565b610ba5565b005b34801561034e57600080fd5b50610357610bb5565b60405161036491906133c0565b60405180910390f35b61038760048036038101906103829190613007565b610bbb565b005b34801561039557600080fd5b506103b060048036038101906103ab9190613007565b610c44565b005b3480156103be57600080fd5b506103c7610cca565b005b3480156103d557600080fd5b506103de610df5565b6040516103eb91906133c0565b60405180910390f35b34801561040057600080fd5b5061041b60048036038101906104169190612dda565b610dfb565b005b34801561042957600080fd5b50610444600480360381019061043f9190612fc2565b610e1b565b005b34801561045257600080fd5b5061046d60048036038101906104689190613007565b610ead565b60405161047a919061325c565b60405180910390f35b34801561048f57600080fd5b50610498610ec3565b6040516104a591906132de565b60405180910390f35b3480156104ba57600080fd5b506104d560048036038101906104d09190612d75565b610f51565b6040516104e291906133c0565b60405180910390f35b3480156104f757600080fd5b50610500611021565b005b34801561050e57600080fd5b506105176110a9565b60405161052491906133c0565b60405180910390f35b34801561053957600080fd5b506105426110af565b60405161054f91906133c0565b60405180910390f35b34801561056457600080fd5b5061057f600480360381019061057a9190613007565b6110b5565b005b34801561058d57600080fd5b5061059661113b565b6040516105a3919061325c565b60405180910390f35b3480156105b857600080fd5b506105d360048036038101906105ce9190613007565b611165565b005b3480156105e157600080fd5b506105ea6111eb565b6040516105f791906132de565b60405180910390f35b34801561060c57600080fd5b5061061561127d565b60405161062291906133c0565b60405180910390f35b61064560048036038101906106409190613007565b611283565b005b34801561065357600080fd5b5061066e60048036038101906106699190612ea4565b6113f2565b005b34801561067c57600080fd5b5061068561156a565b60405161069291906132c3565b60405180910390f35b3480156106a757600080fd5b506106c260048036038101906106bd9190612e29565b61157d565b005b3480156106d057600080fd5b506106eb60048036038101906106e69190613007565b6115f9565b6040516106f891906132de565b60405180910390f35b34801561070d57600080fd5b50610716611698565b60405161072391906133c0565b60405180910390f35b34801561073857600080fd5b50610753600480360381019061074e9190612d75565b61169e565b60405161076091906133c0565b60405180910390f35b610783600480360381019061077e9190612f1c565b6116b0565b005b34801561079157600080fd5b506107ac60048036038101906107a79190612d9e565b61179a565b6040516107b991906132c3565b60405180910390f35b3480156107ce57600080fd5b506107e960048036038101906107e49190612d75565b61182e565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108b657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108c657506108c582611926565b5b9050919050565b6060600280546108dc90613676565b80601f016020809104026020016040519081016040528092919081815260200182805461090890613676565b80156109555780601f1061092a57610100808354040283529160200191610955565b820191906000526020600020905b81548152906001019060200180831161093857829003601f168201915b5050505050905090565b600061096a82611990565b6109a0576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109e682610ead565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a4e576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a6d6119de565b73ffffffffffffffffffffffffffffffffffffffff1614158015610a9f5750610a9d81610a986119de565b61179a565b155b15610ad6576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ae18383836119e6565b505050565b610aee6119de565b73ffffffffffffffffffffffffffffffffffffffff16610b0c61113b565b73ffffffffffffffffffffffffffffffffffffffff1614610b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5990613360565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b6000610b98611a98565b6001546000540303905090565b610bb0838383611a9d565b505050565b600e5481565b610bc36119de565b73ffffffffffffffffffffffffffffffffffffffff16610be161113b565b73ffffffffffffffffffffffffffffffffffffffff1614610c37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2e90613360565b60405180910390fd5b610c413382611f53565b50565b610c4c6119de565b73ffffffffffffffffffffffffffffffffffffffff16610c6a61113b565b73ffffffffffffffffffffffffffffffffffffffff1614610cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb790613360565b60405180910390fd5b80600f8190555050565b610cd26119de565b73ffffffffffffffffffffffffffffffffffffffff16610cf061113b565b73ffffffffffffffffffffffffffffffffffffffff1614610d46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3d90613360565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610d6c90613247565b60006040518083038185875af1925050503d8060008114610da9576040519150601f19603f3d011682016040523d82523d6000602084013e610dae565b606091505b5050905080610df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de990613320565b60405180910390fd5b50565b600a5481565b610e168383836040518060200160405280600081525061157d565b505050565b610e236119de565b73ffffffffffffffffffffffffffffffffffffffff16610e4161113b565b73ffffffffffffffffffffffffffffffffffffffff1614610e97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8e90613360565b60405180910390fd5b8181600d9190610ea8929190612ade565b505050565b6000610eb882611f71565b600001519050919050565b600d8054610ed090613676565b80601f0160208091040260200160405190810160405280929190818152602001828054610efc90613676565b8015610f495780601f10610f1e57610100808354040283529160200191610f49565b820191906000526020600020905b815481529060010190602001808311610f2c57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fb9576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6110296119de565b73ffffffffffffffffffffffffffffffffffffffff1661104761113b565b73ffffffffffffffffffffffffffffffffffffffff161461109d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109490613360565b60405180910390fd5b6110a76000612200565b565b600f5481565b60095481565b6110bd6119de565b73ffffffffffffffffffffffffffffffffffffffff166110db61113b565b73ffffffffffffffffffffffffffffffffffffffff1614611131576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112890613360565b60405180910390fd5b80600c8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61116d6119de565b73ffffffffffffffffffffffffffffffffffffffff1661118b61113b565b73ffffffffffffffffffffffffffffffffffffffff16146111e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d890613360565b60405180910390fd5b80600e8190555050565b6060600380546111fa90613676565b80601f016020809104026020016040519081016040528092919081815260200182805461122690613676565b80156112735780601f1061124857610100808354040283529160200191611273565b820191906000526020600020905b81548152906001019060200180831161125657829003601f168201915b5050505050905090565b600c5481565b600f544210156112c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bf90613380565b60405180910390fd5b60095481111561130d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130490613340565b60405180910390fd5b6000600c549050600e5482611320610b8e565b61132a91906134ab565b1115801561134d5750600a54826113403361169e565b61134a91906134ab565b11155b1561135757600090505b6000829050601060009054906101000a900460ff1680156113805750600061137e3361169e565b145b1561139557600183611392919061358c565b90505b81816113a19190613532565b3410156113e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113da906133a0565b60405180910390fd5b6113ed3384611f53565b505050565b6113fa6119de565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561145f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061146c6119de565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115196119de565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161155e91906132c3565b60405180910390a35050565b601060009054906101000a900460ff1681565b611588848484611a9d565b6115a78373ffffffffffffffffffffffffffffffffffffffff166122c6565b80156115bc57506115ba848484846122e9565b155b156115f3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061160482611990565b61163a576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611644612449565b90506000815114156116655760405180602001604052806000815250611690565b8061166f846124db565b604051602001611680929190613218565b6040516020818303038152906040525b915050919050565b600b5481565b60006116a982612688565b9050919050565b6116b86119de565b73ffffffffffffffffffffffffffffffffffffffff166116d661113b565b73ffffffffffffffffffffffffffffffffffffffff161461172c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172390613360565b60405180910390fd5b60005b825181101561179557611782838281518110611774577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015183611f53565b808061178d906136d9565b91505061172f565b505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118366119de565b73ffffffffffffffffffffffffffffffffffffffff1661185461113b565b73ffffffffffffffffffffffffffffffffffffffff16146118aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a190613360565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561191a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191190613300565b60405180910390fd5b61192381612200565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161199b611a98565b111580156119aa575060005482105b80156119d7575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6000611aa882611f71565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611b13576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611b346119de565b73ffffffffffffffffffffffffffffffffffffffff161480611b635750611b6285611b5d6119de565b61179a565b5b80611ba85750611b716119de565b73ffffffffffffffffffffffffffffffffffffffff16611b908461095f565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611be1576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611c48576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c5585858560016126f2565b611c61600084876119e6565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611ee1576000548214611ee057878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f4c85858560016126f8565b5050505050565b611f6d8282604051806020016040528060008152506126fe565b5050565b611f79612b64565b600082905080611f87611a98565b11158015611f96575060005481105b156121c9576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516121c757600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146120ab5780925050506121fb565b5b6001156121c657818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146121c15780925050506121fb565b6120ac565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261230f6119de565b8786866040518563ffffffff1660e01b81526004016123319493929190613277565b602060405180830381600087803b15801561234b57600080fd5b505af192505050801561237c57506040513d601f19601f820116820180604052508101906123799190612f99565b60015b6123f6573d80600081146123ac576040519150601f19603f3d011682016040523d82523d6000602084013e6123b1565b606091505b506000815114156123ee576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600d805461245890613676565b80601f016020809104026020016040519081016040528092919081815260200182805461248490613676565b80156124d15780601f106124a6576101008083540402835291602001916124d1565b820191906000526020600020905b8154815290600101906020018083116124b457829003601f168201915b5050505050905090565b60606000821415612523576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612683565b600082905060005b6000821461255557808061253e906136d9565b915050600a8261254e9190613501565b915061252b565b60008167ffffffffffffffff811115612597577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156125c95781602001600182028036833780820191505090505b5090505b6000851461267c576001826125e2919061358c565b9150600a856125f19190613722565b60306125fd91906134ab565b60f81b818381518110612639577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126759190613501565b94506125cd565b8093505050505b919050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b50505050565b50505050565b61270b8383836001612710565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561277d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156127b8576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127c560008683876126f2565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561298f575061298e8773ffffffffffffffffffffffffffffffffffffffff166122c6565b5b15612a55575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a0460008884806001019550886122e9565b612a3a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415612995578260005414612a5057600080fd5b612ac1565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612a56575b816000819055505050612ad760008683876126f8565b5050505050565b828054612aea90613676565b90600052602060002090601f016020900481019282612b0c5760008555612b53565b82601f10612b2557803560ff1916838001178555612b53565b82800160010185558215612b53579182015b82811115612b52578235825591602001919060010190612b37565b5b509050612b609190612ba7565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612bc0576000816000905550600101612ba8565b5090565b6000612bd7612bd284613400565b6133db565b90508083825260208201905082856020860282011115612bf657600080fd5b60005b85811015612c265781612c0c8882612c6e565b845260208401935060208301925050600181019050612bf9565b5050509392505050565b6000612c43612c3e8461342c565b6133db565b905082815260208101848484011115612c5b57600080fd5b612c66848285613634565b509392505050565b600081359050612c7d8161398e565b92915050565b600082601f830112612c9457600080fd5b8135612ca4848260208601612bc4565b91505092915050565b600081359050612cbc816139a5565b92915050565b600081359050612cd1816139bc565b92915050565b600081519050612ce6816139bc565b92915050565b600082601f830112612cfd57600080fd5b8135612d0d848260208601612c30565b91505092915050565b60008083601f840112612d2857600080fd5b8235905067ffffffffffffffff811115612d4157600080fd5b602083019150836001820283011115612d5957600080fd5b9250929050565b600081359050612d6f816139d3565b92915050565b600060208284031215612d8757600080fd5b6000612d9584828501612c6e565b91505092915050565b60008060408385031215612db157600080fd5b6000612dbf85828601612c6e565b9250506020612dd085828601612c6e565b9150509250929050565b600080600060608486031215612def57600080fd5b6000612dfd86828701612c6e565b9350506020612e0e86828701612c6e565b9250506040612e1f86828701612d60565b9150509250925092565b60008060008060808587031215612e3f57600080fd5b6000612e4d87828801612c6e565b9450506020612e5e87828801612c6e565b9350506040612e6f87828801612d60565b925050606085013567ffffffffffffffff811115612e8c57600080fd5b612e9887828801612cec565b91505092959194509250565b60008060408385031215612eb757600080fd5b6000612ec585828601612c6e565b9250506020612ed685828601612cad565b9150509250929050565b60008060408385031215612ef357600080fd5b6000612f0185828601612c6e565b9250506020612f1285828601612d60565b9150509250929050565b60008060408385031215612f2f57600080fd5b600083013567ffffffffffffffff811115612f4957600080fd5b612f5585828601612c83565b9250506020612f6685828601612d60565b9150509250929050565b600060208284031215612f8257600080fd5b6000612f9084828501612cc2565b91505092915050565b600060208284031215612fab57600080fd5b6000612fb984828501612cd7565b91505092915050565b60008060208385031215612fd557600080fd5b600083013567ffffffffffffffff811115612fef57600080fd5b612ffb85828601612d16565b92509250509250929050565b60006020828403121561301957600080fd5b600061302784828501612d60565b91505092915050565b613039816135c0565b82525050565b613048816135d2565b82525050565b60006130598261345d565b6130638185613473565b9350613073818560208601613643565b61307c8161380f565b840191505092915050565b600061309282613468565b61309c818561348f565b93506130ac818560208601613643565b6130b58161380f565b840191505092915050565b60006130cb82613468565b6130d581856134a0565b93506130e5818560208601613643565b80840191505092915050565b60006130fe60268361348f565b915061310982613820565b604082019050919050565b600061312160148361348f565b915061312c8261386f565b602082019050919050565b600061314460288361348f565b915061314f82613898565b604082019050919050565b60006131676005836134a0565b9150613172826138e7565b600582019050919050565b600061318a60208361348f565b915061319582613910565b602082019050919050565b60006131ad60138361348f565b91506131b882613939565b602082019050919050565b60006131d0601d8361348f565b91506131db82613962565b602082019050919050565b60006131f3600083613484565b91506131fe8261398b565b600082019050919050565b6132128161362a565b82525050565b600061322482856130c0565b915061323082846130c0565b915061323b8261315a565b91508190509392505050565b6000613252826131e6565b9150819050919050565b60006020820190506132716000830184613030565b92915050565b600060808201905061328c6000830187613030565b6132996020830186613030565b6132a66040830185613209565b81810360608301526132b8818461304e565b905095945050505050565b60006020820190506132d8600083018461303f565b92915050565b600060208201905081810360008301526132f88184613087565b905092915050565b60006020820190508181036000830152613319816130f1565b9050919050565b6000602082019050818103600083015261333981613114565b9050919050565b6000602082019050818103600083015261335981613137565b9050919050565b600060208201905081810360008301526133798161317d565b9050919050565b60006020820190508181036000830152613399816131a0565b9050919050565b600060208201905081810360008301526133b9816131c3565b9050919050565b60006020820190506133d56000830184613209565b92915050565b60006133e56133f6565b90506133f182826136a8565b919050565b6000604051905090565b600067ffffffffffffffff82111561341b5761341a6137e0565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613447576134466137e0565b5b6134508261380f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006134b68261362a565b91506134c18361362a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156134f6576134f5613753565b5b828201905092915050565b600061350c8261362a565b91506135178361362a565b92508261352757613526613782565b5b828204905092915050565b600061353d8261362a565b91506135488361362a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561358157613580613753565b5b828202905092915050565b60006135978261362a565b91506135a28361362a565b9250828210156135b5576135b4613753565b5b828203905092915050565b60006135cb8261360a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613661578082015181840152602081019050613646565b83811115613670576000848401525b50505050565b6000600282049050600182168061368e57607f821691505b602082108114156136a2576136a16137b1565b5b50919050565b6136b18261380f565b810181811067ffffffffffffffff821117156136d0576136cf6137e0565b5b80604052505050565b60006136e48261362a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561371757613716613753565b5b600182019050919050565b600061372d8261362a565b91506137388361362a565b92508261374857613747613782565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b7f416d6f756e742073686f756c64206e6f7420657863656564206d6178206d696e60008201527f74206e756d626572000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f53616c65206973206e6f74206163746976652e00000000000000000000000000600082015250565b7f506c656173652073656e642074686520657861637420616d6f756e742e000000600082015250565b50565b613997816135c0565b81146139a257600080fd5b50565b6139ae816135d2565b81146139b957600080fd5b50565b6139c5816135de565b81146139d057600080fd5b50565b6139dc8161362a565b81146139e757600080fd5b5056fea26469706673582212201a0e132ee875f6592ac41a3cb7e6b45bdc31ee6aa4bd033e71a16ee823244d9464736f6c63430008040033697066733a2f2f516d5935696a334c565159417a6b45574e4334564265694b7770324b314669396a6935376461777947646b7561582f

Deployed Bytecode

0x6080604052600436106102045760003560e01c8063715018a611610118578063a22cb465116100a0578063d5abeb011161006f578063d5abeb0114610701578063dc33e6811461072c578063e9566bf614610769578063e985e9c514610785578063f2fde38b146107c257610204565b8063a22cb46514610647578063b6c46c5314610670578063b88d4fde1461069b578063c87b56dd146106c457610204565b80638da5cb5b116100e75780638da5cb5b1461058157806392910eec146105ac57806395d89b41146105d5578063a035b1fe14610600578063a0712d681461062b57610204565b8063715018a6146104eb57806378e9792514610502578063823903a91461052d5780638d6cc56d1461055857610204565b8063375a069a1161019b57806342842e0e1161016a57806342842e0e146103f457806355f804b31461041d5780636352211e146104465780636c0360eb1461048357806370a08231146104ae57610204565b8063375a069a1461036d5780633beb26c4146103895780633ccfd60b146103b257806341e4cc5f146103c957610204565b806311378ce5116101d757806311378ce5146102d757806318160ddd146102ee57806323b872dd14610319578063333e44e61461034257610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190612f70565b6107eb565b60405161023d91906132c3565b60405180910390f35b34801561025257600080fd5b5061025b6108cd565b60405161026891906132de565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190613007565b61095f565b6040516102a5919061325c565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d09190612ee0565b6109db565b005b3480156102e357600080fd5b506102ec610ae6565b005b3480156102fa57600080fd5b50610303610b8e565b60405161031091906133c0565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b9190612dda565b610ba5565b005b34801561034e57600080fd5b50610357610bb5565b60405161036491906133c0565b60405180910390f35b61038760048036038101906103829190613007565b610bbb565b005b34801561039557600080fd5b506103b060048036038101906103ab9190613007565b610c44565b005b3480156103be57600080fd5b506103c7610cca565b005b3480156103d557600080fd5b506103de610df5565b6040516103eb91906133c0565b60405180910390f35b34801561040057600080fd5b5061041b60048036038101906104169190612dda565b610dfb565b005b34801561042957600080fd5b50610444600480360381019061043f9190612fc2565b610e1b565b005b34801561045257600080fd5b5061046d60048036038101906104689190613007565b610ead565b60405161047a919061325c565b60405180910390f35b34801561048f57600080fd5b50610498610ec3565b6040516104a591906132de565b60405180910390f35b3480156104ba57600080fd5b506104d560048036038101906104d09190612d75565b610f51565b6040516104e291906133c0565b60405180910390f35b3480156104f757600080fd5b50610500611021565b005b34801561050e57600080fd5b506105176110a9565b60405161052491906133c0565b60405180910390f35b34801561053957600080fd5b506105426110af565b60405161054f91906133c0565b60405180910390f35b34801561056457600080fd5b5061057f600480360381019061057a9190613007565b6110b5565b005b34801561058d57600080fd5b5061059661113b565b6040516105a3919061325c565b60405180910390f35b3480156105b857600080fd5b506105d360048036038101906105ce9190613007565b611165565b005b3480156105e157600080fd5b506105ea6111eb565b6040516105f791906132de565b60405180910390f35b34801561060c57600080fd5b5061061561127d565b60405161062291906133c0565b60405180910390f35b61064560048036038101906106409190613007565b611283565b005b34801561065357600080fd5b5061066e60048036038101906106699190612ea4565b6113f2565b005b34801561067c57600080fd5b5061068561156a565b60405161069291906132c3565b60405180910390f35b3480156106a757600080fd5b506106c260048036038101906106bd9190612e29565b61157d565b005b3480156106d057600080fd5b506106eb60048036038101906106e69190613007565b6115f9565b6040516106f891906132de565b60405180910390f35b34801561070d57600080fd5b50610716611698565b60405161072391906133c0565b60405180910390f35b34801561073857600080fd5b50610753600480360381019061074e9190612d75565b61169e565b60405161076091906133c0565b60405180910390f35b610783600480360381019061077e9190612f1c565b6116b0565b005b34801561079157600080fd5b506107ac60048036038101906107a79190612d9e565b61179a565b6040516107b991906132c3565b60405180910390f35b3480156107ce57600080fd5b506107e960048036038101906107e49190612d75565b61182e565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108b657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108c657506108c582611926565b5b9050919050565b6060600280546108dc90613676565b80601f016020809104026020016040519081016040528092919081815260200182805461090890613676565b80156109555780601f1061092a57610100808354040283529160200191610955565b820191906000526020600020905b81548152906001019060200180831161093857829003601f168201915b5050505050905090565b600061096a82611990565b6109a0576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109e682610ead565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a4e576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a6d6119de565b73ffffffffffffffffffffffffffffffffffffffff1614158015610a9f5750610a9d81610a986119de565b61179a565b155b15610ad6576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ae18383836119e6565b505050565b610aee6119de565b73ffffffffffffffffffffffffffffffffffffffff16610b0c61113b565b73ffffffffffffffffffffffffffffffffffffffff1614610b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5990613360565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b6000610b98611a98565b6001546000540303905090565b610bb0838383611a9d565b505050565b600e5481565b610bc36119de565b73ffffffffffffffffffffffffffffffffffffffff16610be161113b565b73ffffffffffffffffffffffffffffffffffffffff1614610c37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2e90613360565b60405180910390fd5b610c413382611f53565b50565b610c4c6119de565b73ffffffffffffffffffffffffffffffffffffffff16610c6a61113b565b73ffffffffffffffffffffffffffffffffffffffff1614610cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb790613360565b60405180910390fd5b80600f8190555050565b610cd26119de565b73ffffffffffffffffffffffffffffffffffffffff16610cf061113b565b73ffffffffffffffffffffffffffffffffffffffff1614610d46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3d90613360565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610d6c90613247565b60006040518083038185875af1925050503d8060008114610da9576040519150601f19603f3d011682016040523d82523d6000602084013e610dae565b606091505b5050905080610df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de990613320565b60405180910390fd5b50565b600a5481565b610e168383836040518060200160405280600081525061157d565b505050565b610e236119de565b73ffffffffffffffffffffffffffffffffffffffff16610e4161113b565b73ffffffffffffffffffffffffffffffffffffffff1614610e97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8e90613360565b60405180910390fd5b8181600d9190610ea8929190612ade565b505050565b6000610eb882611f71565b600001519050919050565b600d8054610ed090613676565b80601f0160208091040260200160405190810160405280929190818152602001828054610efc90613676565b8015610f495780601f10610f1e57610100808354040283529160200191610f49565b820191906000526020600020905b815481529060010190602001808311610f2c57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fb9576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6110296119de565b73ffffffffffffffffffffffffffffffffffffffff1661104761113b565b73ffffffffffffffffffffffffffffffffffffffff161461109d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109490613360565b60405180910390fd5b6110a76000612200565b565b600f5481565b60095481565b6110bd6119de565b73ffffffffffffffffffffffffffffffffffffffff166110db61113b565b73ffffffffffffffffffffffffffffffffffffffff1614611131576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112890613360565b60405180910390fd5b80600c8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61116d6119de565b73ffffffffffffffffffffffffffffffffffffffff1661118b61113b565b73ffffffffffffffffffffffffffffffffffffffff16146111e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d890613360565b60405180910390fd5b80600e8190555050565b6060600380546111fa90613676565b80601f016020809104026020016040519081016040528092919081815260200182805461122690613676565b80156112735780601f1061124857610100808354040283529160200191611273565b820191906000526020600020905b81548152906001019060200180831161125657829003601f168201915b5050505050905090565b600c5481565b600f544210156112c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bf90613380565b60405180910390fd5b60095481111561130d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130490613340565b60405180910390fd5b6000600c549050600e5482611320610b8e565b61132a91906134ab565b1115801561134d5750600a54826113403361169e565b61134a91906134ab565b11155b1561135757600090505b6000829050601060009054906101000a900460ff1680156113805750600061137e3361169e565b145b1561139557600183611392919061358c565b90505b81816113a19190613532565b3410156113e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113da906133a0565b60405180910390fd5b6113ed3384611f53565b505050565b6113fa6119de565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561145f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061146c6119de565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115196119de565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161155e91906132c3565b60405180910390a35050565b601060009054906101000a900460ff1681565b611588848484611a9d565b6115a78373ffffffffffffffffffffffffffffffffffffffff166122c6565b80156115bc57506115ba848484846122e9565b155b156115f3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061160482611990565b61163a576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611644612449565b90506000815114156116655760405180602001604052806000815250611690565b8061166f846124db565b604051602001611680929190613218565b6040516020818303038152906040525b915050919050565b600b5481565b60006116a982612688565b9050919050565b6116b86119de565b73ffffffffffffffffffffffffffffffffffffffff166116d661113b565b73ffffffffffffffffffffffffffffffffffffffff161461172c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172390613360565b60405180910390fd5b60005b825181101561179557611782838281518110611774577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015183611f53565b808061178d906136d9565b91505061172f565b505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118366119de565b73ffffffffffffffffffffffffffffffffffffffff1661185461113b565b73ffffffffffffffffffffffffffffffffffffffff16146118aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a190613360565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561191a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191190613300565b60405180910390fd5b61192381612200565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161199b611a98565b111580156119aa575060005482105b80156119d7575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6000611aa882611f71565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611b13576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611b346119de565b73ffffffffffffffffffffffffffffffffffffffff161480611b635750611b6285611b5d6119de565b61179a565b5b80611ba85750611b716119de565b73ffffffffffffffffffffffffffffffffffffffff16611b908461095f565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611be1576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611c48576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c5585858560016126f2565b611c61600084876119e6565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611ee1576000548214611ee057878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f4c85858560016126f8565b5050505050565b611f6d8282604051806020016040528060008152506126fe565b5050565b611f79612b64565b600082905080611f87611a98565b11158015611f96575060005481105b156121c9576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516121c757600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146120ab5780925050506121fb565b5b6001156121c657818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146121c15780925050506121fb565b6120ac565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261230f6119de565b8786866040518563ffffffff1660e01b81526004016123319493929190613277565b602060405180830381600087803b15801561234b57600080fd5b505af192505050801561237c57506040513d601f19601f820116820180604052508101906123799190612f99565b60015b6123f6573d80600081146123ac576040519150601f19603f3d011682016040523d82523d6000602084013e6123b1565b606091505b506000815114156123ee576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600d805461245890613676565b80601f016020809104026020016040519081016040528092919081815260200182805461248490613676565b80156124d15780601f106124a6576101008083540402835291602001916124d1565b820191906000526020600020905b8154815290600101906020018083116124b457829003601f168201915b5050505050905090565b60606000821415612523576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612683565b600082905060005b6000821461255557808061253e906136d9565b915050600a8261254e9190613501565b915061252b565b60008167ffffffffffffffff811115612597577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156125c95781602001600182028036833780820191505090505b5090505b6000851461267c576001826125e2919061358c565b9150600a856125f19190613722565b60306125fd91906134ab565b60f81b818381518110612639577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126759190613501565b94506125cd565b8093505050505b919050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b50505050565b50505050565b61270b8383836001612710565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561277d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156127b8576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127c560008683876126f2565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561298f575061298e8773ffffffffffffffffffffffffffffffffffffffff166122c6565b5b15612a55575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a0460008884806001019550886122e9565b612a3a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415612995578260005414612a5057600080fd5b612ac1565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612a56575b816000819055505050612ad760008683876126f8565b5050505050565b828054612aea90613676565b90600052602060002090601f016020900481019282612b0c5760008555612b53565b82601f10612b2557803560ff1916838001178555612b53565b82800160010185558215612b53579182015b82811115612b52578235825591602001919060010190612b37565b5b509050612b609190612ba7565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612bc0576000816000905550600101612ba8565b5090565b6000612bd7612bd284613400565b6133db565b90508083825260208201905082856020860282011115612bf657600080fd5b60005b85811015612c265781612c0c8882612c6e565b845260208401935060208301925050600181019050612bf9565b5050509392505050565b6000612c43612c3e8461342c565b6133db565b905082815260208101848484011115612c5b57600080fd5b612c66848285613634565b509392505050565b600081359050612c7d8161398e565b92915050565b600082601f830112612c9457600080fd5b8135612ca4848260208601612bc4565b91505092915050565b600081359050612cbc816139a5565b92915050565b600081359050612cd1816139bc565b92915050565b600081519050612ce6816139bc565b92915050565b600082601f830112612cfd57600080fd5b8135612d0d848260208601612c30565b91505092915050565b60008083601f840112612d2857600080fd5b8235905067ffffffffffffffff811115612d4157600080fd5b602083019150836001820283011115612d5957600080fd5b9250929050565b600081359050612d6f816139d3565b92915050565b600060208284031215612d8757600080fd5b6000612d9584828501612c6e565b91505092915050565b60008060408385031215612db157600080fd5b6000612dbf85828601612c6e565b9250506020612dd085828601612c6e565b9150509250929050565b600080600060608486031215612def57600080fd5b6000612dfd86828701612c6e565b9350506020612e0e86828701612c6e565b9250506040612e1f86828701612d60565b9150509250925092565b60008060008060808587031215612e3f57600080fd5b6000612e4d87828801612c6e565b9450506020612e5e87828801612c6e565b9350506040612e6f87828801612d60565b925050606085013567ffffffffffffffff811115612e8c57600080fd5b612e9887828801612cec565b91505092959194509250565b60008060408385031215612eb757600080fd5b6000612ec585828601612c6e565b9250506020612ed685828601612cad565b9150509250929050565b60008060408385031215612ef357600080fd5b6000612f0185828601612c6e565b9250506020612f1285828601612d60565b9150509250929050565b60008060408385031215612f2f57600080fd5b600083013567ffffffffffffffff811115612f4957600080fd5b612f5585828601612c83565b9250506020612f6685828601612d60565b9150509250929050565b600060208284031215612f8257600080fd5b6000612f9084828501612cc2565b91505092915050565b600060208284031215612fab57600080fd5b6000612fb984828501612cd7565b91505092915050565b60008060208385031215612fd557600080fd5b600083013567ffffffffffffffff811115612fef57600080fd5b612ffb85828601612d16565b92509250509250929050565b60006020828403121561301957600080fd5b600061302784828501612d60565b91505092915050565b613039816135c0565b82525050565b613048816135d2565b82525050565b60006130598261345d565b6130638185613473565b9350613073818560208601613643565b61307c8161380f565b840191505092915050565b600061309282613468565b61309c818561348f565b93506130ac818560208601613643565b6130b58161380f565b840191505092915050565b60006130cb82613468565b6130d581856134a0565b93506130e5818560208601613643565b80840191505092915050565b60006130fe60268361348f565b915061310982613820565b604082019050919050565b600061312160148361348f565b915061312c8261386f565b602082019050919050565b600061314460288361348f565b915061314f82613898565b604082019050919050565b60006131676005836134a0565b9150613172826138e7565b600582019050919050565b600061318a60208361348f565b915061319582613910565b602082019050919050565b60006131ad60138361348f565b91506131b882613939565b602082019050919050565b60006131d0601d8361348f565b91506131db82613962565b602082019050919050565b60006131f3600083613484565b91506131fe8261398b565b600082019050919050565b6132128161362a565b82525050565b600061322482856130c0565b915061323082846130c0565b915061323b8261315a565b91508190509392505050565b6000613252826131e6565b9150819050919050565b60006020820190506132716000830184613030565b92915050565b600060808201905061328c6000830187613030565b6132996020830186613030565b6132a66040830185613209565b81810360608301526132b8818461304e565b905095945050505050565b60006020820190506132d8600083018461303f565b92915050565b600060208201905081810360008301526132f88184613087565b905092915050565b60006020820190508181036000830152613319816130f1565b9050919050565b6000602082019050818103600083015261333981613114565b9050919050565b6000602082019050818103600083015261335981613137565b9050919050565b600060208201905081810360008301526133798161317d565b9050919050565b60006020820190508181036000830152613399816131a0565b9050919050565b600060208201905081810360008301526133b9816131c3565b9050919050565b60006020820190506133d56000830184613209565b92915050565b60006133e56133f6565b90506133f182826136a8565b919050565b6000604051905090565b600067ffffffffffffffff82111561341b5761341a6137e0565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613447576134466137e0565b5b6134508261380f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006134b68261362a565b91506134c18361362a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156134f6576134f5613753565b5b828201905092915050565b600061350c8261362a565b91506135178361362a565b92508261352757613526613782565b5b828204905092915050565b600061353d8261362a565b91506135488361362a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561358157613580613753565b5b828202905092915050565b60006135978261362a565b91506135a28361362a565b9250828210156135b5576135b4613753565b5b828203905092915050565b60006135cb8261360a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613661578082015181840152602081019050613646565b83811115613670576000848401525b50505050565b6000600282049050600182168061368e57607f821691505b602082108114156136a2576136a16137b1565b5b50919050565b6136b18261380f565b810181811067ffffffffffffffff821117156136d0576136cf6137e0565b5b80604052505050565b60006136e48261362a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561371757613716613753565b5b600182019050919050565b600061372d8261362a565b91506137388361362a565b92508261374857613747613782565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b7f416d6f756e742073686f756c64206e6f7420657863656564206d6178206d696e60008201527f74206e756d626572000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f53616c65206973206e6f74206163746976652e00000000000000000000000000600082015250565b7f506c656173652073656e642074686520657861637420616d6f756e742e000000600082015250565b50565b613997816135c0565b81146139a257600080fd5b50565b6139ae816135d2565b81146139b957600080fd5b50565b6139c5816135de565b81146139d057600080fd5b50565b6139dc8161362a565b81146139e757600080fd5b5056fea26469706673582212201a0e132ee875f6592ac41a3cb7e6b45bdc31ee6aa4bd033e71a16ee823244d9464736f6c63430008040033

Deployed Bytecode Sourcemap

43259:2466:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25505:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28618:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30130:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29693:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45611:111;;;;;;;;;;;;;:::i;:::-;;24754:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30995:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43566:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43937:108;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45180:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43752:177;;;;;;;;;;;;;:::i;:::-;;43345:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31236:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45273:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28426:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43470:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25874:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20529:103;;;;;;;;;;;;;:::i;:::-;;43604:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43306:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44975:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19878:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45508:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28787:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43425:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44275:692;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30406:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43648:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31492:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28962:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43387:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45387:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44053:214;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30764:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20787:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25505:305;25607:4;25659:25;25644:40;;;:11;:40;;;;:105;;;;25716:33;25701:48;;;:11;:48;;;;25644:105;:158;;;;25766:36;25790:11;25766:23;:36::i;:::-;25644:158;25624:178;;25505:305;;;:::o;28618:100::-;28672:13;28705:5;28698:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28618:100;:::o;30130:204::-;30198:7;30223:16;30231:7;30223;:16::i;:::-;30218:64;;30248:34;;;;;;;;;;;;;;30218:64;30302:15;:24;30318:7;30302:24;;;;;;;;;;;;;;;;;;;;;30295:31;;30130:204;;;:::o;29693:371::-;29766:13;29782:24;29798:7;29782:15;:24::i;:::-;29766:40;;29827:5;29821:11;;:2;:11;;;29817:48;;;29841:24;;;;;;;;;;;;;;29817:48;29898:5;29882:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;29908:37;29925:5;29932:12;:10;:12::i;:::-;29908:16;:37::i;:::-;29907:38;29882:63;29878:138;;;29969:35;;;;;;;;;;;;;;29878:138;30028:28;30037:2;30041:7;30050:5;30028:8;:28::i;:::-;29693:371;;;:::o;45611:111::-;20109:12;:10;:12::i;:::-;20098:23;;:7;:5;:7::i;:::-;:23;;;20090:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45696:18:::1;;;;;;;;;;;45695:19;45674:18;;:40;;;;;;;;;;;;;;;;;;45611:111::o:0;24754:303::-;24798:7;25023:15;:13;:15::i;:::-;25008:12;;24992:13;;:28;:46;24985:53;;24754:303;:::o;30995:170::-;31129:28;31139:4;31145:2;31149:7;31129:9;:28::i;:::-;30995:170;;;:::o;43566:31::-;;;;:::o;43937:108::-;20109:12;:10;:12::i;:::-;20098:23;;:7;:5;:7::i;:::-;:23;;;20090:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44008:29:::1;44018:10;44030:6;44008:9;:29::i;:::-;43937:108:::0;:::o;45180:85::-;20109:12;:10;:12::i;:::-;20098:23;;:7;:5;:7::i;:::-;:23;;;20090:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45253:4:::1;45241:9;:16;;;;45180:85:::0;:::o;43752:177::-;20109:12;:10;:12::i;:::-;20098:23;;:7;:5;:7::i;:::-;:23;;;20090:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43803:12:::1;43821:10;:15;;43844:21;43821:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43802:68;;;43889:7;43881:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;20169:1;43752:177::o:0;43345:35::-;;;;:::o;31236:185::-;31374:39;31391:4;31397:2;31401:7;31374:39;;;;;;;;;;;;:16;:39::i;:::-;31236:185;;;:::o;45273:106::-;20109:12;:10;:12::i;:::-;20098:23;;:7;:5;:7::i;:::-;:23;;;20090:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45361:10:::1;;45351:7;:20;;;;;;;:::i;:::-;;45273:106:::0;;:::o;28426:125::-;28490:7;28517:21;28530:7;28517:12;:21::i;:::-;:26;;;28510:33;;28426:125;;;:::o;43470:89::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25874:206::-;25938:7;25979:1;25962:19;;:5;:19;;;25958:60;;;25990:28;;;;;;;;;;;;;;25958:60;26044:12;:19;26057:5;26044:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;26036:36;;26029:43;;25874:206;;;:::o;20529:103::-;20109:12;:10;:12::i;:::-;20098:23;;:7;:5;:7::i;:::-;:23;;;20090:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20594:30:::1;20621:1;20594:18;:30::i;:::-;20529:103::o:0;43604:37::-;;;;:::o;43306:32::-;;;;:::o;44975:89::-;20109:12;:10;:12::i;:::-;20098:23;;:7;:5;:7::i;:::-;:23;;;20090:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45049:7:::1;45041:5;:15;;;;44975:89:::0;:::o;19878:87::-;19924:7;19951:6;;;;;;;;;;;19944:13;;19878:87;:::o;45508:95::-;20109:12;:10;:12::i;:::-;20098:23;;:7;:5;:7::i;:::-;:23;;;20090:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45589:6:::1;45577:9;:18;;;;45508:95:::0;:::o;28787:104::-;28843:13;28876:7;28869:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28787:104;:::o;43425:38::-;;;;:::o;44275:692::-;44360:9;;44341:15;:28;;44333:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;44422:12;;44412:6;:22;;44404:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;44492:12;44507:5;;44492:20;;44567:9;;44557:6;44541:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;:105;;;;;44630:16;;44620:6;44593:24;44606:10;44593:12;:24::i;:::-;:33;;;;:::i;:::-;:53;;44541:105;44523:170;;;44680:1;44673:8;;44523:170;44705:13;44721:6;44705:22;;44742:18;;;;;;;;;;;:51;;;;;44792:1;44764:24;44777:10;44764:12;:24::i;:::-;:29;44742:51;44738:102;;;44827:1;44818:6;:10;;;;:::i;:::-;44810:18;;44738:102;44879:4;44871:5;:12;;;;:::i;:::-;44858:9;:25;;44850:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;44930:29;44940:10;44952:6;44930:9;:29::i;:::-;44275:692;;;:::o;30406:287::-;30517:12;:10;:12::i;:::-;30505:24;;:8;:24;;;30501:54;;;30538:17;;;;;;;;;;;;;;30501:54;30613:8;30568:18;:32;30587:12;:10;:12::i;:::-;30568:32;;;;;;;;;;;;;;;:42;30601:8;30568:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;30666:8;30637:48;;30652:12;:10;:12::i;:::-;30637:48;;;30676:8;30637:48;;;;;;:::i;:::-;;;;;;;;30406:287;;:::o;43648:38::-;;;;;;;;;;;;;:::o;31492:369::-;31659:28;31669:4;31675:2;31679:7;31659:9;:28::i;:::-;31702:15;:2;:13;;;:15::i;:::-;:76;;;;;31722:56;31753:4;31759:2;31763:7;31772:5;31722:30;:56::i;:::-;31721:57;31702:76;31698:156;;;31802:40;;;;;;;;;;;;;;31698:156;31492:369;;;;:::o;28962:327::-;29035:13;29066:16;29074:7;29066;:16::i;:::-;29061:59;;29091:29;;;;;;;;;;;;;;29061:59;29133:21;29157:10;:8;:10::i;:::-;29133:34;;29210:1;29191:7;29185:21;:26;;:96;;;;;;;;;;;;;;;;;29238:7;29247:18;:7;:16;:18::i;:::-;29221:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;29185:96;29178:103;;;28962:327;;;:::o;43387:31::-;;;;:::o;45387:113::-;45445:7;45472:20;45486:5;45472:13;:20::i;:::-;45465:27;;45387:113;;;:::o;44053:214::-;20109:12;:10;:12::i;:::-;20098:23;;:7;:5;:7::i;:::-;:23;;;20090:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44159:6:::1;44154:106;44175:11;:18;44171:1;:22;44154:106;;;44215:33;44225:11;44237:1;44225:14;;;;;;;;;;;;;;;;;;;;;;44241:6;44215:9;:33::i;:::-;44195:3;;;;;:::i;:::-;;;;44154:106;;;;44053:214:::0;;:::o;30764:164::-;30861:4;30885:18;:25;30904:5;30885:25;;;;;;;;;;;;;;;:35;30911:8;30885:35;;;;;;;;;;;;;;;;;;;;;;;;;30878:42;;30764:164;;;;:::o;20787:201::-;20109:12;:10;:12::i;:::-;20098:23;;:7;:5;:7::i;:::-;:23;;;20090:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20896:1:::1;20876:22;;:8;:22;;;;20868:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20952:28;20971:8;20952:18;:28::i;:::-;20787:201:::0;:::o;1512:157::-;1597:4;1636:25;1621:40;;;:11;:40;;;;1614:47;;1512:157;;;:::o;32116:174::-;32173:4;32216:7;32197:15;:13;:15::i;:::-;:26;;:53;;;;;32237:13;;32227:7;:23;32197:53;:85;;;;;32255:11;:20;32267:7;32255:20;;;;;;;;;;;:27;;;;;;;;;;;;32254:28;32197:85;32190:92;;32116:174;;;:::o;4201:98::-;4254:7;4281:10;4274:17;;4201:98;:::o;40273:196::-;40415:2;40388:15;:24;40404:7;40388:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;40453:7;40449:2;40433:28;;40442:5;40433:28;;;;;;;;;;;;40273:196;;;:::o;24528:92::-;24584:7;24528:92;:::o;35216:2130::-;35331:35;35369:21;35382:7;35369:12;:21::i;:::-;35331:59;;35429:4;35407:26;;:13;:18;;;:26;;;35403:67;;35442:28;;;;;;;;;;;;;;35403:67;35483:22;35525:4;35509:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;35546:36;35563:4;35569:12;:10;:12::i;:::-;35546:16;:36::i;:::-;35509:73;:126;;;;35623:12;:10;:12::i;:::-;35599:36;;:20;35611:7;35599:11;:20::i;:::-;:36;;;35509:126;35483:153;;35654:17;35649:66;;35680:35;;;;;;;;;;;;;;35649:66;35744:1;35730:16;;:2;:16;;;35726:52;;;35755:23;;;;;;;;;;;;;;35726:52;35791:43;35813:4;35819:2;35823:7;35832:1;35791:21;:43::i;:::-;35899:35;35916:1;35920:7;35929:4;35899:8;:35::i;:::-;36260:1;36230:12;:18;36243:4;36230:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36304:1;36276:12;:16;36289:2;36276:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36322:31;36356:11;:20;36368:7;36356:20;;;;;;;;;;;36322:54;;36407:2;36391:8;:13;;;:18;;;;;;;;;;;;;;;;;;36457:15;36424:8;:23;;;:49;;;;;;;;;;;;;;;;;;36725:19;36757:1;36747:7;:11;36725:33;;36773:31;36807:11;:24;36819:11;36807:24;;;;;;;;;;;36773:58;;36875:1;36850:27;;:8;:13;;;;;;;;;;;;:27;;;36846:384;;;37060:13;;37045:11;:28;37041:174;;37114:4;37098:8;:13;;;:20;;;;;;;;;;;;;;;;;;37167:13;:28;;;37141:8;:23;;;:54;;;;;;;;;;;;;;;;;;37041:174;36846:384;35216:2130;;;37277:7;37273:2;37258:27;;37267:4;37258:27;;;;;;;;;;;;37296:42;37317:4;37323:2;37327:7;37336:1;37296:20;:42::i;:::-;35216:2130;;;;;:::o;32298:104::-;32367:27;32377:2;32381:8;32367:27;;;;;;;;;;;;:9;:27::i;:::-;32298:104;;:::o;27255:1109::-;27317:21;;:::i;:::-;27351:12;27366:7;27351:22;;27434:4;27415:15;:13;:15::i;:::-;:23;;:47;;;;;27449:13;;27442:4;:20;27415:47;27411:886;;;27483:31;27517:11;:17;27529:4;27517:17;;;;;;;;;;;27483:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27558:9;:16;;;27553:729;;27629:1;27603:28;;:9;:14;;;:28;;;27599:101;;27667:9;27660:16;;;;;;27599:101;28002:261;28009:4;28002:261;;;28042:6;;;;;;;;28087:11;:17;28099:4;28087:17;;;;;;;;;;;28075:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28161:1;28135:28;;:9;:14;;;:28;;;28131:109;;28203:9;28196:16;;;;;;28131:109;28002:261;;;27553:729;27411:886;;28325:31;;;;;;;;;;;;;;27255:1109;;;;:::o;21148:191::-;21222:16;21241:6;;;;;;;;;;;21222:25;;21267:8;21258:6;;:17;;;;;;;;;;;;;;;;;;21322:8;21291:40;;21312:8;21291:40;;;;;;;;;;;;21148:191;;:::o;5494:326::-;5554:4;5811:1;5789:7;:19;;;:23;5782:30;;5494:326;;;:::o;40961:667::-;41124:4;41161:2;41145:36;;;41182:12;:10;:12::i;:::-;41196:4;41202:7;41211:5;41145:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41141:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41396:1;41379:6;:13;:18;41375:235;;;41425:40;;;;;;;;;;;;;;41375:235;41568:6;41562:13;41553:6;41549:2;41545:15;41538:38;41141:480;41274:45;;;41264:55;;;:6;:55;;;;41257:62;;;40961:667;;;;;;:::o;45072:100::-;45124:13;45157:7;45150:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45072:100;:::o;1902:723::-;1958:13;2188:1;2179:5;:10;2175:53;;;2206:10;;;;;;;;;;;;;;;;;;;;;2175:53;2238:12;2253:5;2238:20;;2269:14;2294:78;2309:1;2301:4;:9;2294:78;;2327:8;;;;;:::i;:::-;;;;2358:2;2350:10;;;;;:::i;:::-;;;2294:78;;;2382:19;2414:6;2404:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2382:39;;2432:154;2448:1;2439:5;:10;2432:154;;2476:1;2466:11;;;;;:::i;:::-;;;2543:2;2535:5;:10;;;;:::i;:::-;2522:2;:24;;;;:::i;:::-;2509:39;;2492:6;2499;2492:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;2572:2;2563:11;;;;;:::i;:::-;;;2432:154;;;2610:6;2596:21;;;;;1902:723;;;;:::o;26162:137::-;26223:7;26258:12;:19;26271:5;26258:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;26250:41;;26243:48;;26162:137;;;:::o;42276:159::-;;;;;:::o;43094:158::-;;;;;:::o;32765:163::-;32888:32;32894:2;32898:8;32908:5;32915:4;32888:5;:32::i;:::-;32765:163;;;:::o;33187:1775::-;33326:20;33349:13;;33326:36;;33391:1;33377:16;;:2;:16;;;33373:48;;;33402:19;;;;;;;;;;;;;;33373:48;33448:1;33436:8;:13;33432:44;;;33458:18;;;;;;;;;;;;;;33432:44;33489:61;33519:1;33523:2;33527:12;33541:8;33489:21;:61::i;:::-;33862:8;33827:12;:16;33840:2;33827:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33926:8;33886:12;:16;33899:2;33886:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33985:2;33952:11;:25;33964:12;33952:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;34052:15;34002:11;:25;34014:12;34002:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;34085:20;34108:12;34085:35;;34135:11;34164:8;34149:12;:23;34135:37;;34193:4;:23;;;;;34201:15;:2;:13;;;:15::i;:::-;34193:23;34189:641;;;34237:314;34293:12;34289:2;34268:38;;34285:1;34268:38;;;;;;;;;;;;34334:69;34373:1;34377:2;34381:14;;;;;;34397:5;34334:30;:69::i;:::-;34329:174;;34439:40;;;;;;;;;;;;;;34329:174;34546:3;34530:12;:19;;34237:314;;34632:12;34615:13;;:29;34611:43;;34646:8;;;34611:43;34189:641;;;34695:120;34751:14;;;;;;34747:2;34726:40;;34743:1;34726:40;;;;;;;;;;;;34810:3;34794:12;:19;;34695:120;;34189:641;34860:12;34844:13;:28;;;;33187:1775;;34894:60;34923:1;34927:2;34931:12;34945:8;34894:20;:60::i;:::-;33187:1775;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:655: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;;;414:1;411;404:12;350:2;450:1;435:238;460:6;457:1;454:13;435:238;;;528:3;557:37;590:3;578:10;557:37;:::i;:::-;552:3;545:50;624:4;619:3;615:14;608:21;;658:4;653:3;649:14;642:21;;495:178;482:1;479;475:9;470:14;;435:238;;;439:14;126:553;;;;;;;:::o;685:343::-;762:5;787:65;803:48;844:6;803:48;:::i;:::-;787:65;:::i;:::-;778:74;;875:6;868:5;861:21;913:4;906:5;902:16;951:3;942:6;937:3;933:16;930:25;927:2;;;968:1;965;958:12;927:2;981:41;1015:6;1010:3;1005;981:41;:::i;:::-;768:260;;;;;;:::o;1034:139::-;1080:5;1118:6;1105:20;1096:29;;1134:33;1161:5;1134:33;:::i;:::-;1086:87;;;;:::o;1196:303::-;1267:5;1316:3;1309:4;1301:6;1297:17;1293:27;1283:2;;1334:1;1331;1324:12;1283:2;1374:6;1361:20;1399:94;1489:3;1481:6;1474:4;1466:6;1462:17;1399:94;:::i;:::-;1390:103;;1273:226;;;;;:::o;1505:133::-;1548:5;1586:6;1573:20;1564:29;;1602:30;1626:5;1602:30;:::i;:::-;1554:84;;;;:::o;1644:137::-;1689:5;1727:6;1714:20;1705:29;;1743:32;1769:5;1743:32;:::i;:::-;1695:86;;;;:::o;1787:141::-;1843:5;1874:6;1868:13;1859:22;;1890:32;1916:5;1890:32;:::i;:::-;1849:79;;;;:::o;1947:271::-;2002:5;2051:3;2044:4;2036:6;2032:17;2028:27;2018:2;;2069:1;2066;2059:12;2018:2;2109:6;2096:20;2134:78;2208:3;2200:6;2193:4;2185:6;2181:17;2134:78;:::i;:::-;2125:87;;2008:210;;;;;:::o;2238:352::-;2296:8;2306:6;2356:3;2349:4;2341:6;2337:17;2333:27;2323:2;;2374:1;2371;2364:12;2323:2;2410:6;2397:20;2387:30;;2440:18;2432:6;2429:30;2426:2;;;2472:1;2469;2462:12;2426:2;2509:4;2501:6;2497:17;2485:29;;2563:3;2555:4;2547:6;2543:17;2533:8;2529:32;2526:41;2523:2;;;2580:1;2577;2570:12;2523:2;2313:277;;;;;:::o;2596:139::-;2642:5;2680:6;2667:20;2658:29;;2696:33;2723:5;2696:33;:::i;:::-;2648:87;;;;:::o;2741:262::-;2800:6;2849:2;2837:9;2828:7;2824:23;2820:32;2817:2;;;2865:1;2862;2855:12;2817:2;2908:1;2933:53;2978:7;2969:6;2958:9;2954:22;2933:53;:::i;:::-;2923:63;;2879:117;2807:196;;;;:::o;3009:407::-;3077:6;3085;3134:2;3122:9;3113:7;3109:23;3105:32;3102:2;;;3150:1;3147;3140:12;3102:2;3193:1;3218:53;3263:7;3254:6;3243:9;3239:22;3218:53;:::i;:::-;3208:63;;3164:117;3320:2;3346:53;3391:7;3382:6;3371:9;3367:22;3346:53;:::i;:::-;3336:63;;3291:118;3092:324;;;;;:::o;3422:552::-;3499:6;3507;3515;3564:2;3552:9;3543:7;3539:23;3535:32;3532:2;;;3580:1;3577;3570:12;3532:2;3623:1;3648:53;3693:7;3684:6;3673:9;3669:22;3648:53;:::i;:::-;3638:63;;3594:117;3750:2;3776:53;3821:7;3812:6;3801:9;3797:22;3776:53;:::i;:::-;3766:63;;3721:118;3878:2;3904:53;3949:7;3940:6;3929:9;3925:22;3904:53;:::i;:::-;3894:63;;3849:118;3522:452;;;;;:::o;3980:809::-;4075:6;4083;4091;4099;4148:3;4136:9;4127:7;4123:23;4119:33;4116:2;;;4165:1;4162;4155:12;4116:2;4208:1;4233:53;4278:7;4269:6;4258:9;4254:22;4233:53;:::i;:::-;4223:63;;4179:117;4335:2;4361:53;4406:7;4397:6;4386:9;4382:22;4361:53;:::i;:::-;4351:63;;4306:118;4463:2;4489:53;4534:7;4525:6;4514:9;4510:22;4489:53;:::i;:::-;4479:63;;4434:118;4619:2;4608:9;4604:18;4591:32;4650:18;4642:6;4639:30;4636:2;;;4682:1;4679;4672:12;4636:2;4710:62;4764:7;4755:6;4744:9;4740:22;4710:62;:::i;:::-;4700:72;;4562:220;4106:683;;;;;;;:::o;4795:401::-;4860:6;4868;4917:2;4905:9;4896:7;4892:23;4888:32;4885:2;;;4933:1;4930;4923:12;4885:2;4976:1;5001:53;5046:7;5037:6;5026:9;5022:22;5001:53;:::i;:::-;4991:63;;4947:117;5103:2;5129:50;5171:7;5162:6;5151:9;5147:22;5129:50;:::i;:::-;5119:60;;5074:115;4875:321;;;;;:::o;5202:407::-;5270:6;5278;5327:2;5315:9;5306:7;5302:23;5298:32;5295:2;;;5343:1;5340;5333:12;5295:2;5386:1;5411:53;5456:7;5447:6;5436:9;5432:22;5411:53;:::i;:::-;5401:63;;5357:117;5513:2;5539:53;5584:7;5575:6;5564:9;5560:22;5539:53;:::i;:::-;5529:63;;5484:118;5285:324;;;;;:::o;5615:550::-;5708:6;5716;5765:2;5753:9;5744:7;5740:23;5736:32;5733:2;;;5781:1;5778;5771:12;5733:2;5852:1;5841:9;5837:17;5824:31;5882:18;5874:6;5871:30;5868:2;;;5914:1;5911;5904:12;5868:2;5942:78;6012:7;6003:6;5992:9;5988:22;5942:78;:::i;:::-;5932:88;;5795:235;6069:2;6095:53;6140:7;6131:6;6120:9;6116:22;6095:53;:::i;:::-;6085:63;;6040:118;5723:442;;;;;:::o;6171:260::-;6229:6;6278:2;6266:9;6257:7;6253:23;6249:32;6246:2;;;6294:1;6291;6284:12;6246:2;6337:1;6362:52;6406:7;6397:6;6386:9;6382:22;6362:52;:::i;:::-;6352:62;;6308:116;6236:195;;;;:::o;6437:282::-;6506:6;6555:2;6543:9;6534:7;6530:23;6526:32;6523:2;;;6571:1;6568;6561:12;6523:2;6614:1;6639:63;6694:7;6685:6;6674:9;6670:22;6639:63;:::i;:::-;6629:73;;6585:127;6513:206;;;;:::o;6725:395::-;6796:6;6804;6853:2;6841:9;6832:7;6828:23;6824:32;6821:2;;;6869:1;6866;6859:12;6821:2;6940:1;6929:9;6925:17;6912:31;6970:18;6962:6;6959:30;6956:2;;;7002:1;6999;6992:12;6956:2;7038:65;7095:7;7086:6;7075:9;7071:22;7038:65;:::i;:::-;7020:83;;;;6883:230;6811:309;;;;;:::o;7126:262::-;7185:6;7234:2;7222:9;7213:7;7209:23;7205:32;7202:2;;;7250:1;7247;7240:12;7202:2;7293:1;7318:53;7363:7;7354:6;7343:9;7339:22;7318:53;:::i;:::-;7308:63;;7264:117;7192:196;;;;:::o;7394:118::-;7481:24;7499:5;7481:24;:::i;:::-;7476:3;7469:37;7459:53;;:::o;7518:109::-;7599:21;7614:5;7599:21;:::i;:::-;7594:3;7587:34;7577:50;;:::o;7633:360::-;7719:3;7747:38;7779:5;7747:38;:::i;:::-;7801:70;7864:6;7859:3;7801:70;:::i;:::-;7794:77;;7880:52;7925:6;7920:3;7913:4;7906:5;7902:16;7880:52;:::i;:::-;7957:29;7979:6;7957:29;:::i;:::-;7952:3;7948:39;7941:46;;7723:270;;;;;:::o;7999:364::-;8087:3;8115:39;8148:5;8115:39;:::i;:::-;8170:71;8234:6;8229:3;8170:71;:::i;:::-;8163:78;;8250:52;8295:6;8290:3;8283:4;8276:5;8272:16;8250:52;:::i;:::-;8327:29;8349:6;8327:29;:::i;:::-;8322:3;8318:39;8311:46;;8091:272;;;;;:::o;8369:377::-;8475:3;8503:39;8536:5;8503:39;:::i;:::-;8558:89;8640:6;8635:3;8558:89;:::i;:::-;8551:96;;8656:52;8701:6;8696:3;8689:4;8682:5;8678:16;8656:52;:::i;:::-;8733:6;8728:3;8724:16;8717:23;;8479:267;;;;;:::o;8752:366::-;8894:3;8915:67;8979:2;8974:3;8915:67;:::i;:::-;8908:74;;8991:93;9080:3;8991:93;:::i;:::-;9109:2;9104:3;9100:12;9093:19;;8898:220;;;:::o;9124:366::-;9266:3;9287:67;9351:2;9346:3;9287:67;:::i;:::-;9280:74;;9363:93;9452:3;9363:93;:::i;:::-;9481:2;9476:3;9472:12;9465:19;;9270:220;;;:::o;9496:366::-;9638:3;9659:67;9723:2;9718:3;9659:67;:::i;:::-;9652:74;;9735:93;9824:3;9735:93;:::i;:::-;9853:2;9848:3;9844:12;9837:19;;9642:220;;;:::o;9868:400::-;10028:3;10049:84;10131:1;10126:3;10049:84;:::i;:::-;10042:91;;10142:93;10231:3;10142:93;:::i;:::-;10260:1;10255:3;10251:11;10244:18;;10032:236;;;:::o;10274:366::-;10416:3;10437:67;10501:2;10496:3;10437:67;:::i;:::-;10430:74;;10513:93;10602:3;10513:93;:::i;:::-;10631:2;10626:3;10622:12;10615:19;;10420:220;;;:::o;10646:366::-;10788:3;10809:67;10873:2;10868:3;10809:67;:::i;:::-;10802:74;;10885:93;10974:3;10885:93;:::i;:::-;11003:2;10998:3;10994:12;10987:19;;10792:220;;;:::o;11018:366::-;11160:3;11181:67;11245:2;11240:3;11181:67;:::i;:::-;11174:74;;11257:93;11346:3;11257:93;:::i;:::-;11375:2;11370:3;11366:12;11359:19;;11164:220;;;:::o;11390:398::-;11549:3;11570:83;11651:1;11646:3;11570:83;:::i;:::-;11563:90;;11662:93;11751:3;11662:93;:::i;:::-;11780:1;11775:3;11771:11;11764:18;;11553:235;;;:::o;11794:118::-;11881:24;11899:5;11881:24;:::i;:::-;11876:3;11869:37;11859:53;;:::o;11918:701::-;12199:3;12221:95;12312:3;12303:6;12221:95;:::i;:::-;12214:102;;12333:95;12424:3;12415:6;12333:95;:::i;:::-;12326:102;;12445:148;12589:3;12445:148;:::i;:::-;12438:155;;12610:3;12603:10;;12203:416;;;;;:::o;12625:379::-;12809:3;12831:147;12974:3;12831:147;:::i;:::-;12824:154;;12995:3;12988:10;;12813:191;;;:::o;13010:222::-;13103:4;13141:2;13130:9;13126:18;13118:26;;13154:71;13222:1;13211:9;13207:17;13198:6;13154:71;:::i;:::-;13108:124;;;;:::o;13238:640::-;13433:4;13471:3;13460:9;13456:19;13448:27;;13485:71;13553:1;13542:9;13538:17;13529:6;13485:71;:::i;:::-;13566:72;13634:2;13623:9;13619:18;13610:6;13566:72;:::i;:::-;13648;13716:2;13705:9;13701:18;13692:6;13648:72;:::i;:::-;13767:9;13761:4;13757:20;13752:2;13741:9;13737:18;13730:48;13795:76;13866:4;13857:6;13795:76;:::i;:::-;13787:84;;13438:440;;;;;;;:::o;13884:210::-;13971:4;14009:2;13998:9;13994:18;13986:26;;14022:65;14084:1;14073:9;14069:17;14060:6;14022:65;:::i;:::-;13976:118;;;;:::o;14100:313::-;14213:4;14251:2;14240:9;14236:18;14228:26;;14300:9;14294:4;14290:20;14286:1;14275:9;14271:17;14264:47;14328:78;14401:4;14392:6;14328:78;:::i;:::-;14320:86;;14218:195;;;;:::o;14419:419::-;14585:4;14623:2;14612:9;14608:18;14600:26;;14672:9;14666:4;14662:20;14658:1;14647:9;14643:17;14636:47;14700:131;14826:4;14700:131;:::i;:::-;14692:139;;14590:248;;;:::o;14844:419::-;15010:4;15048:2;15037:9;15033:18;15025:26;;15097:9;15091:4;15087:20;15083:1;15072:9;15068:17;15061:47;15125:131;15251:4;15125:131;:::i;:::-;15117:139;;15015:248;;;:::o;15269:419::-;15435:4;15473:2;15462:9;15458:18;15450:26;;15522:9;15516:4;15512:20;15508:1;15497:9;15493:17;15486:47;15550:131;15676:4;15550:131;:::i;:::-;15542:139;;15440:248;;;:::o;15694:419::-;15860:4;15898:2;15887:9;15883:18;15875:26;;15947:9;15941:4;15937:20;15933:1;15922:9;15918:17;15911:47;15975:131;16101:4;15975:131;:::i;:::-;15967:139;;15865:248;;;:::o;16119:419::-;16285:4;16323:2;16312:9;16308:18;16300:26;;16372:9;16366:4;16362:20;16358:1;16347:9;16343:17;16336:47;16400:131;16526:4;16400:131;:::i;:::-;16392:139;;16290:248;;;:::o;16544:419::-;16710:4;16748:2;16737:9;16733:18;16725:26;;16797:9;16791:4;16787:20;16783:1;16772:9;16768:17;16761:47;16825:131;16951:4;16825:131;:::i;:::-;16817:139;;16715:248;;;:::o;16969:222::-;17062:4;17100:2;17089:9;17085:18;17077:26;;17113:71;17181:1;17170:9;17166:17;17157:6;17113:71;:::i;:::-;17067:124;;;;:::o;17197:129::-;17231:6;17258:20;;:::i;:::-;17248:30;;17287:33;17315:4;17307:6;17287:33;:::i;:::-;17238:88;;;:::o;17332:75::-;17365:6;17398:2;17392:9;17382:19;;17372:35;:::o;17413:311::-;17490:4;17580:18;17572:6;17569:30;17566:2;;;17602:18;;:::i;:::-;17566:2;17652:4;17644:6;17640:17;17632:25;;17712:4;17706;17702:15;17694:23;;17495:229;;;:::o;17730:307::-;17791:4;17881:18;17873:6;17870:30;17867:2;;;17903:18;;:::i;:::-;17867:2;17941:29;17963:6;17941:29;:::i;:::-;17933:37;;18025:4;18019;18015:15;18007:23;;17796:241;;;:::o;18043:98::-;18094:6;18128:5;18122:12;18112:22;;18101:40;;;:::o;18147:99::-;18199:6;18233:5;18227:12;18217:22;;18206:40;;;:::o;18252:168::-;18335:11;18369:6;18364:3;18357:19;18409:4;18404:3;18400:14;18385:29;;18347:73;;;;:::o;18426:147::-;18527:11;18564:3;18549:18;;18539:34;;;;:::o;18579:169::-;18663:11;18697:6;18692:3;18685:19;18737:4;18732:3;18728:14;18713:29;;18675:73;;;;:::o;18754:148::-;18856:11;18893:3;18878:18;;18868:34;;;;:::o;18908:305::-;18948:3;18967:20;18985:1;18967:20;:::i;:::-;18962:25;;19001:20;19019:1;19001:20;:::i;:::-;18996:25;;19155:1;19087:66;19083:74;19080:1;19077:81;19074:2;;;19161:18;;:::i;:::-;19074:2;19205:1;19202;19198:9;19191:16;;18952:261;;;;:::o;19219:185::-;19259:1;19276:20;19294:1;19276:20;:::i;:::-;19271:25;;19310:20;19328:1;19310:20;:::i;:::-;19305:25;;19349:1;19339:2;;19354:18;;:::i;:::-;19339:2;19396:1;19393;19389:9;19384:14;;19261:143;;;;:::o;19410:348::-;19450:7;19473:20;19491:1;19473:20;:::i;:::-;19468:25;;19507:20;19525:1;19507:20;:::i;:::-;19502:25;;19695:1;19627:66;19623:74;19620:1;19617:81;19612:1;19605:9;19598:17;19594:105;19591:2;;;19702:18;;:::i;:::-;19591:2;19750:1;19747;19743:9;19732:20;;19458:300;;;;:::o;19764:191::-;19804:4;19824:20;19842:1;19824:20;:::i;:::-;19819:25;;19858:20;19876:1;19858:20;:::i;:::-;19853:25;;19897:1;19894;19891:8;19888:2;;;19902:18;;:::i;:::-;19888:2;19947:1;19944;19940:9;19932:17;;19809:146;;;;:::o;19961:96::-;19998:7;20027:24;20045:5;20027:24;:::i;:::-;20016:35;;20006:51;;;:::o;20063:90::-;20097:7;20140:5;20133:13;20126:21;20115:32;;20105:48;;;:::o;20159:149::-;20195:7;20235:66;20228:5;20224:78;20213:89;;20203:105;;;:::o;20314:126::-;20351:7;20391:42;20384:5;20380:54;20369:65;;20359:81;;;:::o;20446:77::-;20483:7;20512:5;20501:16;;20491:32;;;:::o;20529:154::-;20613:6;20608:3;20603;20590:30;20675:1;20666:6;20661:3;20657:16;20650:27;20580:103;;;:::o;20689:307::-;20757:1;20767:113;20781:6;20778:1;20775:13;20767:113;;;20866:1;20861:3;20857:11;20851:18;20847:1;20842:3;20838:11;20831:39;20803:2;20800:1;20796:10;20791:15;;20767:113;;;20898:6;20895:1;20892:13;20889:2;;;20978:1;20969:6;20964:3;20960:16;20953:27;20889:2;20738:258;;;;:::o;21002:320::-;21046:6;21083:1;21077:4;21073:12;21063:22;;21130:1;21124:4;21120:12;21151:18;21141:2;;21207:4;21199:6;21195:17;21185:27;;21141:2;21269;21261:6;21258:14;21238:18;21235:38;21232:2;;;21288:18;;:::i;:::-;21232:2;21053:269;;;;:::o;21328:281::-;21411:27;21433:4;21411:27;:::i;:::-;21403:6;21399:40;21541:6;21529:10;21526:22;21505:18;21493:10;21490:34;21487:62;21484:2;;;21552:18;;:::i;:::-;21484:2;21592:10;21588:2;21581:22;21371:238;;;:::o;21615:233::-;21654:3;21677:24;21695:5;21677:24;:::i;:::-;21668:33;;21723:66;21716:5;21713:77;21710:2;;;21793:18;;:::i;:::-;21710:2;21840:1;21833:5;21829:13;21822:20;;21658:190;;;:::o;21854:176::-;21886:1;21903:20;21921:1;21903:20;:::i;:::-;21898:25;;21937:20;21955:1;21937:20;:::i;:::-;21932:25;;21976:1;21966:2;;21981:18;;:::i;:::-;21966:2;22022:1;22019;22015:9;22010:14;;21888:142;;;;:::o;22036:180::-;22084:77;22081:1;22074:88;22181:4;22178:1;22171:15;22205:4;22202:1;22195:15;22222:180;22270:77;22267:1;22260:88;22367:4;22364:1;22357:15;22391:4;22388:1;22381:15;22408:180;22456:77;22453:1;22446:88;22553:4;22550:1;22543:15;22577:4;22574:1;22567:15;22594:180;22642:77;22639:1;22632:88;22739:4;22736:1;22729:15;22763:4;22760:1;22753:15;22780:102;22821:6;22872:2;22868:7;22863:2;22856:5;22852:14;22848:28;22838:38;;22828:54;;;:::o;22888:225::-;23028:34;23024:1;23016:6;23012:14;23005:58;23097:8;23092:2;23084:6;23080:15;23073:33;22994:119;:::o;23119:170::-;23259:22;23255:1;23247:6;23243:14;23236:46;23225:64;:::o;23295:227::-;23435:34;23431:1;23423:6;23419:14;23412:58;23504:10;23499:2;23491:6;23487:15;23480:35;23401:121;:::o;23528:155::-;23668:7;23664:1;23656:6;23652:14;23645:31;23634:49;:::o;23689:182::-;23829:34;23825:1;23817:6;23813:14;23806:58;23795:76;:::o;23877:169::-;24017:21;24013:1;24005:6;24001:14;23994:45;23983:63;:::o;24052:179::-;24192:31;24188:1;24180:6;24176:14;24169:55;24158:73;:::o;24237:114::-;24343:8;:::o;24357:122::-;24430:24;24448:5;24430:24;:::i;:::-;24423:5;24420:35;24410:2;;24469:1;24466;24459:12;24410:2;24400:79;:::o;24485:116::-;24555:21;24570:5;24555:21;:::i;:::-;24548:5;24545:32;24535:2;;24591:1;24588;24581:12;24535:2;24525:76;:::o;24607:120::-;24679:23;24696:5;24679:23;:::i;:::-;24672:5;24669:34;24659:2;;24717:1;24714;24707:12;24659:2;24649:78;:::o;24733:122::-;24806:24;24824:5;24806:24;:::i;:::-;24799:5;24796:35;24786:2;;24845:1;24842;24835:12;24786:2;24776:79;:::o

Swarm Source

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