ETH Price: $2,944.96 (-6.72%)
Gas: 7 Gwei

Token

LifeForms by Guggenhiem (LIFE)
 

Overview

Max Total Supply

1,000 LIFE

Holders

239

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 LIFE
0x160b7ad0bb4b52725550723eb4f4262ceeacac13
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:
LifeForms

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-12-08
*/

/*
  _ _  __       __                          
 | (_)/ _| ___ / _| ___  _ __ _ __ ___  ___ 
 | | | |_ / _ \ |_ / _ \| '__| '_ ` _ \/ __|
 | | |  _|  __/  _| (_) | |  | | | | | \__ \
 |_|_|_|  \___|_|  \___/|_|  |_| |_| |_|___/
                                            
Contract by @beeble_xyz
0.01 Public mint.
Max 5 per wallet.
1000 Supply.
*/

pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

// File: OperatorFilterer.sol


pragma solidity ^0.8.13;


abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry constant operatorFilterRegistry =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(operatorFilterRegistry).code.length > 0) {
            if (subscribe) {
                operatorFilterRegistry.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    operatorFilterRegistry.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    operatorFilterRegistry.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(operatorFilterRegistry).code.length > 0) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            if (
                !(
                    operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender)
                        && operatorFilterRegistry.isOperatorAllowed(address(this), from)
                )
            ) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }
}

// File: DefaultOperatorFilterer.sol


pragma solidity ^0.8.13;


abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

// File: Lifeforms.sol



// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/MerkleProof.sol


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

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;

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

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

// File: contracts/erc721a.sol



// Creator: Chiru Labs



pragma solidity ^0.8.4;










error ApprovalCallerNotOwnerNorApproved();

error ApprovalQueryForNonexistentToken();

error ApproveToCaller();

error ApprovalToCurrentOwner();

error BalanceQueryForZeroAddress();

error 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 1;

    }



    /**

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

    }



    /**

     * @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 {}

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


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

// File: contracts/contract.sol


pragma solidity ^0.8.4;



contract LifeForms is Ownable, ERC721A, DefaultOperatorFilterer  {

    using Strings for uint256;

    string private baseTokenURI;

    uint256 public publicSaleCost = 0.01 ether;

    uint64 public maxSupply = 1000;

    uint64 public publicMaxSupply = 1000;
    uint64 public publicTotalSupply = 0;

    uint64 public maxMintAmountPerPublicAccount = 5;

    bool public presaleActive = false;
    bool public publicSaleActive = false;

    constructor() ERC721A("LifeForms by Guggenhiem", "LIFE"){}

    modifier mintCompliance(uint256 _mintAmount) {
        require(_mintAmount > 0 , "Invalid mint amount!");
        require(totalMinted() + _mintAmount <= maxSupply, "Max supply exceeded!");
        _;
    }

    ///Allows any address to mint when the public sale is open
    function publicMint(uint64 _mintAmount) public payable mintCompliance(_mintAmount) {
        require(publicSaleActive, "Public is not Active");
        require(tx.origin == msg.sender);

        require(numberMinted(msg.sender) + _mintAmount <= maxMintAmountPerPublicAccount, "Mint limit exceeded." );
        require(publicTotalSupply + _mintAmount <= publicMaxSupply, "Mint limit exceeded." );
        require(msg.value >= publicSaleCost * _mintAmount, "Insufficient funds!");


        publicTotalSupply+=_mintAmount;
        _safeMint(msg.sender, _mintAmount);
    }

    ///Allows owner of the collection to airdrop a token to any address
    function ownerMint(uint256 _mintAmount, address _receiver) public mintCompliance(_mintAmount) onlyOwner {
        _safeMint(_receiver, _mintAmount);
    }

    //@return token ids owned by an address in the collection
    function walletOfOwner(address _owner)
        external
        view
        returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
        uint256 currentTokenId = 1;
        uint256 ownedTokenIndex = 0;

        while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
            if(exists(currentTokenId) == true) {
                address currentTokenOwner = ownerOf(currentTokenId);

                if (currentTokenOwner == _owner) {
                    ownedTokenIds[ownedTokenIndex] = currentTokenId;
                    ownedTokenIndex++;
                }
            }
            currentTokenId++;
        }

        return ownedTokenIds;
    }

    function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
        public
        override
        onlyAllowedOperator(from)
    {
        super.safeTransferFrom(from, to, tokenId, data);
    }

    //@return full url for passed in token id 
    function tokenURI(uint256 _tokenId)

        public
        view
        virtual
        override
        returns (string memory)

    {

        require(
        _exists(_tokenId),
        "ERC721Metadata: URI query for nonexistent token"
        );

        string memory currentBaseURI = _baseURI();

        return bytes(currentBaseURI).length > 0

            ? string(abi.encodePacked(currentBaseURI, _tokenId.toString()))

            : "";
    }



    //@return amount an address has minted during the presale
    function getPresaleAmountMintedPerAccount(address _owner) public view returns (uint64) {
        return _getAux(_owner);
    }

    function setPresaleAmountMintedPerAccount(address _owner, uint64 _aux) internal {
        _setAux(_owner, _aux);
    }


    //@return amount an address has minted during all sales
    function numberMinted(address _owner) public view returns (uint256) {
        return _numberMinted(_owner);
    }

    //@return all NFT's minted including burned tokens
    function totalMinted() public view returns (uint256) {
        return _totalMinted();
    }

    function exists(uint256 _tokenId) public view returns (bool) {
        return _exists(_tokenId);
    }

    //@return url for the nft metadata
    function _baseURI() internal view virtual override returns (string memory) {
        return baseTokenURI;
    }

    function setBaseURI(string calldata _URI) external onlyOwner {
        baseTokenURI = _URI;
    }

    function setPublicActive(bool _state) public onlyOwner {
        publicSaleActive = _state;
    }

    function withdraw() public onlyOwner {
        (bool os, ) = payable(owner()).call{value: address(this).balance}("");
        require(os);
    }

    /// Fallbacks 
    receive() external payable { }
    fallback() external payable { }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","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"},{"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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"exists","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"}],"name":"getPresaleAmountMintedPerAccount","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"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":"maxMintAmountPerPublicAccount","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMaxSupply","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"_mintAmount","type":"uint64"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicTotalSupply","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPublicActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","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":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052662386f26fc10000600a556103e8600b60006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506103e8600b60086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600b60106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506005600b60186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600c60006101000a81548160ff0219169083151502179055506000600c60016101000a81548160ff021916908315150217905550348015620000fc57600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280601781526020017f4c696665466f726d732062792047756767656e6869656d0000000000000000008152506040518060400160405280600481526020017f4c49464500000000000000000000000000000000000000000000000000000000815250620001a062000194620003d960201b60201c565b620003e160201b60201c565b8160039081620001b1919062000728565b508060049081620001c3919062000728565b50620001d4620004a560201b60201c565b600181905550505060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620003d157801562000297576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200025d92919062000854565b600060405180830381600087803b1580156200027857600080fd5b505af11580156200028d573d6000803e3d6000fd5b50505050620003d0565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000351576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200031792919062000854565b600060405180830381600087803b1580156200033257600080fd5b505af115801562000347573d6000803e3d6000fd5b50505050620003cf565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b81526004016200039a919062000881565b600060405180830381600087803b158015620003b557600080fd5b505af1158015620003ca573d6000803e3d6000fd5b505050505b5b5b50506200089e565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006001905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200053057607f821691505b602082108103620005465762000545620004e8565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005b07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000571565b620005bc868362000571565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200060962000603620005fd84620005d4565b620005de565b620005d4565b9050919050565b6000819050919050565b6200062583620005e8565b6200063d620006348262000610565b8484546200057e565b825550505050565b600090565b6200065462000645565b620006618184846200061a565b505050565b5b8181101562000689576200067d6000826200064a565b60018101905062000667565b5050565b601f821115620006d857620006a2816200054c565b620006ad8462000561565b81016020851015620006bd578190505b620006d5620006cc8562000561565b83018262000666565b50505b505050565b600082821c905092915050565b6000620006fd60001984600802620006dd565b1980831691505092915050565b6000620007188383620006ea565b9150826002028217905092915050565b6200073382620004ae565b67ffffffffffffffff8111156200074f576200074e620004b9565b5b6200075b825462000517565b620007688282856200068d565b600060209050601f831160018114620007a057600084156200078b578287015190505b6200079785826200070a565b86555062000807565b601f198416620007b0866200054c565b60005b82811015620007da57848901518255600182019150602085019450602081019050620007b3565b86831015620007fa5784890151620007f6601f891682620006ea565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200083c826200080f565b9050919050565b6200084e816200082f565b82525050565b60006040820190506200086b600083018562000843565b6200087a602083018462000843565b9392505050565b600060208201905062000898600083018462000843565b92915050565b61447d80620008ae6000396000f3fe6080604052600436106101f25760003560e01c806370a082311161010d578063b88d4fde116100a0578063d52c57e01161006f578063d52c57e01461070e578063d5abeb0114610737578063dc33e68114610762578063e985e9c51461079f578063f2fde38b146107dc576101f9565b8063b88d4fde14610652578063b985add81461067b578063bc8893b4146106a6578063c87b56dd146106d1576101f9565b806395d89b41116100dc57806395d89b4114610596578063a13bd4fd146105c1578063a22cb465146105fe578063a2309ff814610627576101f9565b806370a08231146104da57806378cbcf23146105175780638aca408c146105425780638da5cb5b1461056b576101f9565b806342842e0e1161018557806353135ca01161015457806353135ca01461042d57806355f804b3146104585780636352211e146104815780636afcb7b0146104be576101f9565b806342842e0e1461035f578063438b630014610388578063453afb0f146103c55780634f558e79146103f0576101f9565b80630b85d4ef116101c15780630b85d4ef146102c957806318160ddd146102f457806323b872dd1461031f5780633ccfd60b14610348576101f9565b806301ffc9a7146101fb57806306fdde0314610238578063081812fc14610263578063095ea7b3146102a0576101f9565b366101f957005b005b34801561020757600080fd5b50610222600480360381019061021d91906131c4565b610805565b60405161022f919061320c565b60405180910390f35b34801561024457600080fd5b5061024d6108e7565b60405161025a91906132b7565b60405180910390f35b34801561026f57600080fd5b5061028a6004803603810190610285919061330f565b610979565b604051610297919061337d565b60405180910390f35b3480156102ac57600080fd5b506102c760048036038101906102c291906133c4565b6109f5565b005b3480156102d557600080fd5b506102de610aff565b6040516102eb9190613427565b60405180910390f35b34801561030057600080fd5b50610309610b19565b6040516103169190613451565b60405180910390f35b34801561032b57600080fd5b506103466004803603810190610341919061346c565b610b30565b005b34801561035457600080fd5b5061035d610d12565b005b34801561036b57600080fd5b506103866004803603810190610381919061346c565b610e0e565b005b34801561039457600080fd5b506103af60048036038101906103aa91906134bf565b610ff0565b6040516103bc91906135aa565b60405180910390f35b3480156103d157600080fd5b506103da61112d565b6040516103e79190613451565b60405180910390f35b3480156103fc57600080fd5b506104176004803603810190610412919061330f565b611133565b604051610424919061320c565b60405180910390f35b34801561043957600080fd5b50610442611145565b60405161044f919061320c565b60405180910390f35b34801561046457600080fd5b5061047f600480360381019061047a9190613631565b611158565b005b34801561048d57600080fd5b506104a860048036038101906104a3919061330f565b6111ea565b6040516104b5919061337d565b60405180910390f35b6104d860048036038101906104d391906136aa565b611200565b005b3480156104e657600080fd5b5061050160048036038101906104fc91906134bf565b611515565b60405161050e9190613451565b60405180910390f35b34801561052357600080fd5b5061052c6115e4565b6040516105399190613427565b60405180910390f35b34801561054e57600080fd5b5061056960048036038101906105649190613703565b6115fe565b005b34801561057757600080fd5b50610580611697565b60405161058d919061337d565b60405180910390f35b3480156105a257600080fd5b506105ab6116c0565b6040516105b891906132b7565b60405180910390f35b3480156105cd57600080fd5b506105e860048036038101906105e391906134bf565b611752565b6040516105f59190613427565b60405180910390f35b34801561060a57600080fd5b5061062560048036038101906106209190613730565b611764565b005b34801561063357600080fd5b5061063c6118db565b6040516106499190613451565b60405180910390f35b34801561065e57600080fd5b50610679600480360381019061067491906138a0565b6118ea565b005b34801561068757600080fd5b50610690611acf565b60405161069d9190613427565b60405180910390f35b3480156106b257600080fd5b506106bb611ae9565b6040516106c8919061320c565b60405180910390f35b3480156106dd57600080fd5b506106f860048036038101906106f3919061330f565b611afc565b60405161070591906132b7565b60405180910390f35b34801561071a57600080fd5b5061073560048036038101906107309190613923565b611ba3565b005b34801561074357600080fd5b5061074c611ce7565b6040516107599190613427565b60405180910390f35b34801561076e57600080fd5b50610789600480360381019061078491906134bf565b611d01565b6040516107969190613451565b60405180910390f35b3480156107ab57600080fd5b506107c660048036038101906107c19190613963565b611d13565b6040516107d3919061320c565b60405180910390f35b3480156107e857600080fd5b5061080360048036038101906107fe91906134bf565b611da7565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108d057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108e057506108df82611e9e565b5b9050919050565b6060600380546108f6906139d2565b80601f0160208091040260200160405190810160405280929190818152602001828054610922906139d2565b801561096f5780601f106109445761010080835404028352916020019161096f565b820191906000526020600020905b81548152906001019060200180831161095257829003601f168201915b5050505050905090565b600061098482611f08565b6109ba576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a00826111ea565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a67576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a86611f56565b73ffffffffffffffffffffffffffffffffffffffff1614158015610ab85750610ab681610ab1611f56565b611d13565b155b15610aef576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610afa838383611f5e565b505050565b600b60189054906101000a900467ffffffffffffffff1681565b6000610b23612010565b6002546001540303905090565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610d00573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ba257610b9d848484612019565b610d0c565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610beb929190613a03565b602060405180830381865afa158015610c08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2c9190613a41565b8015610cbe57506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610c7c929190613a03565b602060405180830381865afa158015610c99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbd9190613a41565b5b610cff57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610cf6919061337d565b60405180910390fd5b5b610d0b848484612019565b5b50505050565b610d1a611f56565b73ffffffffffffffffffffffffffffffffffffffff16610d38611697565b73ffffffffffffffffffffffffffffffffffffffff1614610d8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8590613aba565b60405180910390fd5b6000610d98611697565b73ffffffffffffffffffffffffffffffffffffffff1647604051610dbb90613b0b565b60006040518083038185875af1925050503d8060008114610df8576040519150601f19603f3d011682016040523d82523d6000602084013e610dfd565b606091505b5050905080610e0b57600080fd5b50565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610fde573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e8057610e7b848484612029565b610fea565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610ec9929190613a03565b602060405180830381865afa158015610ee6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0a9190613a41565b8015610f9c57506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610f5a929190613a03565b602060405180830381865afa158015610f77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9b9190613a41565b5b610fdd57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610fd4919061337d565b60405180910390fd5b5b610fe9848484612029565b5b50505050565b60606000610ffd83611515565b905060008167ffffffffffffffff81111561101b5761101a613775565b5b6040519080825280602002602001820160405280156110495781602001602082028036833780820191505090505b50905060006001905060005b83811080156110845750600b60009054906101000a900467ffffffffffffffff1667ffffffffffffffff168211155b15611121576001151561109683611133565b15150361110e5760006110a8836111ea565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361110c57828483815181106110f1576110f0613b20565b5b602002602001018181525050818061110890613b7e565b9250505b505b818061111990613b7e565b925050611055565b82945050505050919050565b600a5481565b600061113e82611f08565b9050919050565b600c60009054906101000a900460ff1681565b611160611f56565b73ffffffffffffffffffffffffffffffffffffffff1661117e611697565b73ffffffffffffffffffffffffffffffffffffffff16146111d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cb90613aba565b60405180910390fd5b8181600991826111e5929190613d7d565b505050565b60006111f582612049565b600001519050919050565b8067ffffffffffffffff166000811161124e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124590613e99565b60405180910390fd5b600b60009054906101000a900467ffffffffffffffff1667ffffffffffffffff16816112786118db565b6112829190613eb9565b11156112c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ba90613f39565b60405180910390fd5b600c60019054906101000a900460ff16611312576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130990613fa5565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461134a57600080fd5b600b60189054906101000a900467ffffffffffffffff1667ffffffffffffffff168267ffffffffffffffff1661137f33611d01565b6113899190613eb9565b11156113ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c190614011565b60405180910390fd5b600b60089054906101000a900467ffffffffffffffff1667ffffffffffffffff1682600b60109054906101000a900467ffffffffffffffff1661140d9190614031565b67ffffffffffffffff161115611458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144f90614011565b60405180910390fd5b8167ffffffffffffffff16600a54611470919061406d565b3410156114b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a9906140fb565b60405180910390fd5b81600b60108282829054906101000a900467ffffffffffffffff166114d79190614031565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550611511338367ffffffffffffffff166122d8565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361157c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b600b60089054906101000a900467ffffffffffffffff1681565b611606611f56565b73ffffffffffffffffffffffffffffffffffffffff16611624611697565b73ffffffffffffffffffffffffffffffffffffffff161461167a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167190613aba565b60405180910390fd5b80600c60016101000a81548160ff02191690831515021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546116cf906139d2565b80601f01602080910402602001604051908101604052809291908181526020018280546116fb906139d2565b80156117485780601f1061171d57610100808354040283529160200191611748565b820191906000526020600020905b81548152906001019060200180831161172b57829003601f168201915b5050505050905090565b600061175d826122f6565b9050919050565b61176c611f56565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117d0576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600860006117dd611f56565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661188a611f56565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118cf919061320c565b60405180910390a35050565b60006118e5612356565b905090565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611abb573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361195d5761195885858585612369565b611ac8565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016119a6929190613a03565b602060405180830381865afa1580156119c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e79190613a41565b8015611a7957506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611a37929190613a03565b602060405180830381865afa158015611a54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a789190613a41565b5b611aba57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611ab1919061337d565b60405180910390fd5b5b611ac785858585612369565b5b5050505050565b600b60109054906101000a900467ffffffffffffffff1681565b600c60019054906101000a900460ff1681565b6060611b0782611f08565b611b46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3d9061418d565b60405180910390fd5b6000611b506123e5565b90506000815111611b705760405180602001604052806000815250611b9b565b80611b7a84612477565b604051602001611b8b9291906141e9565b6040516020818303038152906040525b915050919050565b8160008111611be7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bde90613e99565b60405180910390fd5b600b60009054906101000a900467ffffffffffffffff1667ffffffffffffffff1681611c116118db565b611c1b9190613eb9565b1115611c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5390613f39565b60405180910390fd5b611c64611f56565b73ffffffffffffffffffffffffffffffffffffffff16611c82611697565b73ffffffffffffffffffffffffffffffffffffffff1614611cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccf90613aba565b60405180910390fd5b611ce282846122d8565b505050565b600b60009054906101000a900467ffffffffffffffff1681565b6000611d0c826125d7565b9050919050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611daf611f56565b73ffffffffffffffffffffffffffffffffffffffff16611dcd611697565b73ffffffffffffffffffffffffffffffffffffffff1614611e23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1a90613aba565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e899061427f565b60405180910390fd5b611e9b81612641565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611f13612010565b11158015611f22575060015482105b8015611f4f575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b612024838383612705565b505050565b612044838383604051806020016040528060008152506118ea565b505050565b612051613115565b60008290508061205f612010565b1115801561206e575060015481105b156122a1576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161229f57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146121835780925050506122d3565b5b60011561229e57818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146122995780925050506122d3565b612184565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6122f2828260405180602001604052806000815250612bb9565b5050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff169050919050565b6000612360612010565b60015403905090565b612374848484612705565b6123938373ffffffffffffffffffffffffffffffffffffffff16612bcb565b80156123a857506123a684848484612bee565b155b156123df576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060600980546123f4906139d2565b80601f0160208091040260200160405190810160405280929190818152602001828054612420906139d2565b801561246d5780601f106124425761010080835404028352916020019161246d565b820191906000526020600020905b81548152906001019060200180831161245057829003601f168201915b5050505050905090565b6060600082036124be576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125d2565b600082905060005b600082146124f05780806124d990613b7e565b915050600a826124e991906142ce565b91506124c6565b60008167ffffffffffffffff81111561250c5761250b613775565b5b6040519080825280601f01601f19166020018201604052801561253e5781602001600182028036833780820191505090505b5090505b600085146125cb5760018261255791906142ff565b9150600a856125669190614333565b60306125729190613eb9565b60f81b81838151811061258857612587613b20565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125c491906142ce565b9450612542565b8093505050505b919050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061271082612049565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461277b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661279c611f56565b73ffffffffffffffffffffffffffffffffffffffff1614806127cb57506127ca856127c5611f56565b611d13565b5b8061281057506127d9611f56565b73ffffffffffffffffffffffffffffffffffffffff166127f884610979565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612849576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036128af576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128bc8585856001612d3e565b6128c860008487611f5e565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612b47576001548214612b4657878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bb28585856001612d44565b5050505050565b612bc68383836001612d4a565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612c14611f56565b8786866040518563ffffffff1660e01b8152600401612c3694939291906143b9565b6020604051808303816000875af1925050508015612c7257506040513d601f19601f82011682018060405250810190612c6f919061441a565b60015b612ceb573d8060008114612ca2576040519150601f19603f3d011682016040523d82523d6000602084013e612ca7565b606091505b506000815103612ce3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612db7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403612df1576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612dfe6000868387612d3e565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612fc85750612fc78773ffffffffffffffffffffffffffffffffffffffff16612bcb565b5b1561308d575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461303d6000888480600101955088612bee565b613073576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808203612fce57826001541461308857600080fd5b6130f8565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480820361308e575b81600181905550505061310e6000868387612d44565b5050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6131a18161316c565b81146131ac57600080fd5b50565b6000813590506131be81613198565b92915050565b6000602082840312156131da576131d9613162565b5b60006131e8848285016131af565b91505092915050565b60008115159050919050565b613206816131f1565b82525050565b600060208201905061322160008301846131fd565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613261578082015181840152602081019050613246565b60008484015250505050565b6000601f19601f8301169050919050565b600061328982613227565b6132938185613232565b93506132a3818560208601613243565b6132ac8161326d565b840191505092915050565b600060208201905081810360008301526132d1818461327e565b905092915050565b6000819050919050565b6132ec816132d9565b81146132f757600080fd5b50565b600081359050613309816132e3565b92915050565b60006020828403121561332557613324613162565b5b6000613333848285016132fa565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006133678261333c565b9050919050565b6133778161335c565b82525050565b6000602082019050613392600083018461336e565b92915050565b6133a18161335c565b81146133ac57600080fd5b50565b6000813590506133be81613398565b92915050565b600080604083850312156133db576133da613162565b5b60006133e9858286016133af565b92505060206133fa858286016132fa565b9150509250929050565b600067ffffffffffffffff82169050919050565b61342181613404565b82525050565b600060208201905061343c6000830184613418565b92915050565b61344b816132d9565b82525050565b60006020820190506134666000830184613442565b92915050565b60008060006060848603121561348557613484613162565b5b6000613493868287016133af565b93505060206134a4868287016133af565b92505060406134b5868287016132fa565b9150509250925092565b6000602082840312156134d5576134d4613162565b5b60006134e3848285016133af565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613521816132d9565b82525050565b60006135338383613518565b60208301905092915050565b6000602082019050919050565b6000613557826134ec565b61356181856134f7565b935061356c83613508565b8060005b8381101561359d5781516135848882613527565b975061358f8361353f565b925050600181019050613570565b5085935050505092915050565b600060208201905081810360008301526135c4818461354c565b905092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126135f1576135f06135cc565b5b8235905067ffffffffffffffff81111561360e5761360d6135d1565b5b60208301915083600182028301111561362a576136296135d6565b5b9250929050565b6000806020838503121561364857613647613162565b5b600083013567ffffffffffffffff81111561366657613665613167565b5b613672858286016135db565b92509250509250929050565b61368781613404565b811461369257600080fd5b50565b6000813590506136a48161367e565b92915050565b6000602082840312156136c0576136bf613162565b5b60006136ce84828501613695565b91505092915050565b6136e0816131f1565b81146136eb57600080fd5b50565b6000813590506136fd816136d7565b92915050565b60006020828403121561371957613718613162565b5b6000613727848285016136ee565b91505092915050565b6000806040838503121561374757613746613162565b5b6000613755858286016133af565b9250506020613766858286016136ee565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6137ad8261326d565b810181811067ffffffffffffffff821117156137cc576137cb613775565b5b80604052505050565b60006137df613158565b90506137eb82826137a4565b919050565b600067ffffffffffffffff82111561380b5761380a613775565b5b6138148261326d565b9050602081019050919050565b82818337600083830152505050565b600061384361383e846137f0565b6137d5565b90508281526020810184848401111561385f5761385e613770565b5b61386a848285613821565b509392505050565b600082601f830112613887576138866135cc565b5b8135613897848260208601613830565b91505092915050565b600080600080608085870312156138ba576138b9613162565b5b60006138c8878288016133af565b94505060206138d9878288016133af565b93505060406138ea878288016132fa565b925050606085013567ffffffffffffffff81111561390b5761390a613167565b5b61391787828801613872565b91505092959194509250565b6000806040838503121561393a57613939613162565b5b6000613948858286016132fa565b9250506020613959858286016133af565b9150509250929050565b6000806040838503121561397a57613979613162565b5b6000613988858286016133af565b9250506020613999858286016133af565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806139ea57607f821691505b6020821081036139fd576139fc6139a3565b5b50919050565b6000604082019050613a18600083018561336e565b613a25602083018461336e565b9392505050565b600081519050613a3b816136d7565b92915050565b600060208284031215613a5757613a56613162565b5b6000613a6584828501613a2c565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613aa4602083613232565b9150613aaf82613a6e565b602082019050919050565b60006020820190508181036000830152613ad381613a97565b9050919050565b600081905092915050565b50565b6000613af5600083613ada565b9150613b0082613ae5565b600082019050919050565b6000613b1682613ae8565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b89826132d9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613bbb57613bba613b4f565b5b600182019050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613c337fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613bf6565b613c3d8683613bf6565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613c7a613c75613c70846132d9565b613c55565b6132d9565b9050919050565b6000819050919050565b613c9483613c5f565b613ca8613ca082613c81565b848454613c03565b825550505050565b600090565b613cbd613cb0565b613cc8818484613c8b565b505050565b5b81811015613cec57613ce1600082613cb5565b600181019050613cce565b5050565b601f821115613d3157613d0281613bd1565b613d0b84613be6565b81016020851015613d1a578190505b613d2e613d2685613be6565b830182613ccd565b50505b505050565b600082821c905092915050565b6000613d5460001984600802613d36565b1980831691505092915050565b6000613d6d8383613d43565b9150826002028217905092915050565b613d878383613bc6565b67ffffffffffffffff811115613da057613d9f613775565b5b613daa82546139d2565b613db5828285613cf0565b6000601f831160018114613de45760008415613dd2578287013590505b613ddc8582613d61565b865550613e44565b601f198416613df286613bd1565b60005b82811015613e1a57848901358255600182019150602085019450602081019050613df5565b86831015613e375784890135613e33601f891682613d43565b8355505b6001600288020188555050505b50505050505050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b6000613e83601483613232565b9150613e8e82613e4d565b602082019050919050565b60006020820190508181036000830152613eb281613e76565b9050919050565b6000613ec4826132d9565b9150613ecf836132d9565b9250828201905080821115613ee757613ee6613b4f565b5b92915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b6000613f23601483613232565b9150613f2e82613eed565b602082019050919050565b60006020820190508181036000830152613f5281613f16565b9050919050565b7f5075626c6963206973206e6f7420416374697665000000000000000000000000600082015250565b6000613f8f601483613232565b9150613f9a82613f59565b602082019050919050565b60006020820190508181036000830152613fbe81613f82565b9050919050565b7f4d696e74206c696d69742065786365656465642e000000000000000000000000600082015250565b6000613ffb601483613232565b915061400682613fc5565b602082019050919050565b6000602082019050818103600083015261402a81613fee565b9050919050565b600061403c82613404565b915061404783613404565b9250828201905067ffffffffffffffff81111561406757614066613b4f565b5b92915050565b6000614078826132d9565b9150614083836132d9565b9250828202614091816132d9565b915082820484148315176140a8576140a7613b4f565b5b5092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b60006140e5601383613232565b91506140f0826140af565b602082019050919050565b60006020820190508181036000830152614114816140d8565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614177602f83613232565b91506141828261411b565b604082019050919050565b600060208201905081810360008301526141a68161416a565b9050919050565b600081905092915050565b60006141c382613227565b6141cd81856141ad565b93506141dd818560208601613243565b80840191505092915050565b60006141f582856141b8565b915061420182846141b8565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614269602683613232565b91506142748261420d565b604082019050919050565b600060208201905081810360008301526142988161425c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006142d9826132d9565b91506142e4836132d9565b9250826142f4576142f361429f565b5b828204905092915050565b600061430a826132d9565b9150614315836132d9565b925082820390508181111561432d5761432c613b4f565b5b92915050565b600061433e826132d9565b9150614349836132d9565b9250826143595761435861429f565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b600061438b82614364565b614395818561436f565b93506143a5818560208601613243565b6143ae8161326d565b840191505092915050565b60006080820190506143ce600083018761336e565b6143db602083018661336e565b6143e86040830185613442565b81810360608301526143fa8184614380565b905095945050505050565b60008151905061441481613198565b92915050565b6000602082840312156144305761442f613162565b5b600061443e84828501614405565b9150509291505056fea264697066735822122075af7fc444ddcf7c52682640aa987043c969eda7247d4d6d85e9d40e0a5ec14f64736f6c63430008110033

Deployed Bytecode

0x6080604052600436106101f25760003560e01c806370a082311161010d578063b88d4fde116100a0578063d52c57e01161006f578063d52c57e01461070e578063d5abeb0114610737578063dc33e68114610762578063e985e9c51461079f578063f2fde38b146107dc576101f9565b8063b88d4fde14610652578063b985add81461067b578063bc8893b4146106a6578063c87b56dd146106d1576101f9565b806395d89b41116100dc57806395d89b4114610596578063a13bd4fd146105c1578063a22cb465146105fe578063a2309ff814610627576101f9565b806370a08231146104da57806378cbcf23146105175780638aca408c146105425780638da5cb5b1461056b576101f9565b806342842e0e1161018557806353135ca01161015457806353135ca01461042d57806355f804b3146104585780636352211e146104815780636afcb7b0146104be576101f9565b806342842e0e1461035f578063438b630014610388578063453afb0f146103c55780634f558e79146103f0576101f9565b80630b85d4ef116101c15780630b85d4ef146102c957806318160ddd146102f457806323b872dd1461031f5780633ccfd60b14610348576101f9565b806301ffc9a7146101fb57806306fdde0314610238578063081812fc14610263578063095ea7b3146102a0576101f9565b366101f957005b005b34801561020757600080fd5b50610222600480360381019061021d91906131c4565b610805565b60405161022f919061320c565b60405180910390f35b34801561024457600080fd5b5061024d6108e7565b60405161025a91906132b7565b60405180910390f35b34801561026f57600080fd5b5061028a6004803603810190610285919061330f565b610979565b604051610297919061337d565b60405180910390f35b3480156102ac57600080fd5b506102c760048036038101906102c291906133c4565b6109f5565b005b3480156102d557600080fd5b506102de610aff565b6040516102eb9190613427565b60405180910390f35b34801561030057600080fd5b50610309610b19565b6040516103169190613451565b60405180910390f35b34801561032b57600080fd5b506103466004803603810190610341919061346c565b610b30565b005b34801561035457600080fd5b5061035d610d12565b005b34801561036b57600080fd5b506103866004803603810190610381919061346c565b610e0e565b005b34801561039457600080fd5b506103af60048036038101906103aa91906134bf565b610ff0565b6040516103bc91906135aa565b60405180910390f35b3480156103d157600080fd5b506103da61112d565b6040516103e79190613451565b60405180910390f35b3480156103fc57600080fd5b506104176004803603810190610412919061330f565b611133565b604051610424919061320c565b60405180910390f35b34801561043957600080fd5b50610442611145565b60405161044f919061320c565b60405180910390f35b34801561046457600080fd5b5061047f600480360381019061047a9190613631565b611158565b005b34801561048d57600080fd5b506104a860048036038101906104a3919061330f565b6111ea565b6040516104b5919061337d565b60405180910390f35b6104d860048036038101906104d391906136aa565b611200565b005b3480156104e657600080fd5b5061050160048036038101906104fc91906134bf565b611515565b60405161050e9190613451565b60405180910390f35b34801561052357600080fd5b5061052c6115e4565b6040516105399190613427565b60405180910390f35b34801561054e57600080fd5b5061056960048036038101906105649190613703565b6115fe565b005b34801561057757600080fd5b50610580611697565b60405161058d919061337d565b60405180910390f35b3480156105a257600080fd5b506105ab6116c0565b6040516105b891906132b7565b60405180910390f35b3480156105cd57600080fd5b506105e860048036038101906105e391906134bf565b611752565b6040516105f59190613427565b60405180910390f35b34801561060a57600080fd5b5061062560048036038101906106209190613730565b611764565b005b34801561063357600080fd5b5061063c6118db565b6040516106499190613451565b60405180910390f35b34801561065e57600080fd5b50610679600480360381019061067491906138a0565b6118ea565b005b34801561068757600080fd5b50610690611acf565b60405161069d9190613427565b60405180910390f35b3480156106b257600080fd5b506106bb611ae9565b6040516106c8919061320c565b60405180910390f35b3480156106dd57600080fd5b506106f860048036038101906106f3919061330f565b611afc565b60405161070591906132b7565b60405180910390f35b34801561071a57600080fd5b5061073560048036038101906107309190613923565b611ba3565b005b34801561074357600080fd5b5061074c611ce7565b6040516107599190613427565b60405180910390f35b34801561076e57600080fd5b50610789600480360381019061078491906134bf565b611d01565b6040516107969190613451565b60405180910390f35b3480156107ab57600080fd5b506107c660048036038101906107c19190613963565b611d13565b6040516107d3919061320c565b60405180910390f35b3480156107e857600080fd5b5061080360048036038101906107fe91906134bf565b611da7565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108d057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108e057506108df82611e9e565b5b9050919050565b6060600380546108f6906139d2565b80601f0160208091040260200160405190810160405280929190818152602001828054610922906139d2565b801561096f5780601f106109445761010080835404028352916020019161096f565b820191906000526020600020905b81548152906001019060200180831161095257829003601f168201915b5050505050905090565b600061098482611f08565b6109ba576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a00826111ea565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a67576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a86611f56565b73ffffffffffffffffffffffffffffffffffffffff1614158015610ab85750610ab681610ab1611f56565b611d13565b155b15610aef576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610afa838383611f5e565b505050565b600b60189054906101000a900467ffffffffffffffff1681565b6000610b23612010565b6002546001540303905090565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610d00573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ba257610b9d848484612019565b610d0c565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610beb929190613a03565b602060405180830381865afa158015610c08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2c9190613a41565b8015610cbe57506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610c7c929190613a03565b602060405180830381865afa158015610c99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbd9190613a41565b5b610cff57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610cf6919061337d565b60405180910390fd5b5b610d0b848484612019565b5b50505050565b610d1a611f56565b73ffffffffffffffffffffffffffffffffffffffff16610d38611697565b73ffffffffffffffffffffffffffffffffffffffff1614610d8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8590613aba565b60405180910390fd5b6000610d98611697565b73ffffffffffffffffffffffffffffffffffffffff1647604051610dbb90613b0b565b60006040518083038185875af1925050503d8060008114610df8576040519150601f19603f3d011682016040523d82523d6000602084013e610dfd565b606091505b5050905080610e0b57600080fd5b50565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610fde573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e8057610e7b848484612029565b610fea565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610ec9929190613a03565b602060405180830381865afa158015610ee6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0a9190613a41565b8015610f9c57506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610f5a929190613a03565b602060405180830381865afa158015610f77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9b9190613a41565b5b610fdd57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610fd4919061337d565b60405180910390fd5b5b610fe9848484612029565b5b50505050565b60606000610ffd83611515565b905060008167ffffffffffffffff81111561101b5761101a613775565b5b6040519080825280602002602001820160405280156110495781602001602082028036833780820191505090505b50905060006001905060005b83811080156110845750600b60009054906101000a900467ffffffffffffffff1667ffffffffffffffff168211155b15611121576001151561109683611133565b15150361110e5760006110a8836111ea565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361110c57828483815181106110f1576110f0613b20565b5b602002602001018181525050818061110890613b7e565b9250505b505b818061111990613b7e565b925050611055565b82945050505050919050565b600a5481565b600061113e82611f08565b9050919050565b600c60009054906101000a900460ff1681565b611160611f56565b73ffffffffffffffffffffffffffffffffffffffff1661117e611697565b73ffffffffffffffffffffffffffffffffffffffff16146111d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cb90613aba565b60405180910390fd5b8181600991826111e5929190613d7d565b505050565b60006111f582612049565b600001519050919050565b8067ffffffffffffffff166000811161124e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124590613e99565b60405180910390fd5b600b60009054906101000a900467ffffffffffffffff1667ffffffffffffffff16816112786118db565b6112829190613eb9565b11156112c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ba90613f39565b60405180910390fd5b600c60019054906101000a900460ff16611312576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130990613fa5565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461134a57600080fd5b600b60189054906101000a900467ffffffffffffffff1667ffffffffffffffff168267ffffffffffffffff1661137f33611d01565b6113899190613eb9565b11156113ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c190614011565b60405180910390fd5b600b60089054906101000a900467ffffffffffffffff1667ffffffffffffffff1682600b60109054906101000a900467ffffffffffffffff1661140d9190614031565b67ffffffffffffffff161115611458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144f90614011565b60405180910390fd5b8167ffffffffffffffff16600a54611470919061406d565b3410156114b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a9906140fb565b60405180910390fd5b81600b60108282829054906101000a900467ffffffffffffffff166114d79190614031565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550611511338367ffffffffffffffff166122d8565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361157c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b600b60089054906101000a900467ffffffffffffffff1681565b611606611f56565b73ffffffffffffffffffffffffffffffffffffffff16611624611697565b73ffffffffffffffffffffffffffffffffffffffff161461167a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167190613aba565b60405180910390fd5b80600c60016101000a81548160ff02191690831515021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546116cf906139d2565b80601f01602080910402602001604051908101604052809291908181526020018280546116fb906139d2565b80156117485780601f1061171d57610100808354040283529160200191611748565b820191906000526020600020905b81548152906001019060200180831161172b57829003601f168201915b5050505050905090565b600061175d826122f6565b9050919050565b61176c611f56565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117d0576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600860006117dd611f56565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661188a611f56565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118cf919061320c565b60405180910390a35050565b60006118e5612356565b905090565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611abb573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361195d5761195885858585612369565b611ac8565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016119a6929190613a03565b602060405180830381865afa1580156119c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e79190613a41565b8015611a7957506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611a37929190613a03565b602060405180830381865afa158015611a54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a789190613a41565b5b611aba57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611ab1919061337d565b60405180910390fd5b5b611ac785858585612369565b5b5050505050565b600b60109054906101000a900467ffffffffffffffff1681565b600c60019054906101000a900460ff1681565b6060611b0782611f08565b611b46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3d9061418d565b60405180910390fd5b6000611b506123e5565b90506000815111611b705760405180602001604052806000815250611b9b565b80611b7a84612477565b604051602001611b8b9291906141e9565b6040516020818303038152906040525b915050919050565b8160008111611be7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bde90613e99565b60405180910390fd5b600b60009054906101000a900467ffffffffffffffff1667ffffffffffffffff1681611c116118db565b611c1b9190613eb9565b1115611c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5390613f39565b60405180910390fd5b611c64611f56565b73ffffffffffffffffffffffffffffffffffffffff16611c82611697565b73ffffffffffffffffffffffffffffffffffffffff1614611cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccf90613aba565b60405180910390fd5b611ce282846122d8565b505050565b600b60009054906101000a900467ffffffffffffffff1681565b6000611d0c826125d7565b9050919050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611daf611f56565b73ffffffffffffffffffffffffffffffffffffffff16611dcd611697565b73ffffffffffffffffffffffffffffffffffffffff1614611e23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1a90613aba565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e899061427f565b60405180910390fd5b611e9b81612641565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611f13612010565b11158015611f22575060015482105b8015611f4f575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b612024838383612705565b505050565b612044838383604051806020016040528060008152506118ea565b505050565b612051613115565b60008290508061205f612010565b1115801561206e575060015481105b156122a1576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161229f57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146121835780925050506122d3565b5b60011561229e57818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146122995780925050506122d3565b612184565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6122f2828260405180602001604052806000815250612bb9565b5050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160189054906101000a900467ffffffffffffffff169050919050565b6000612360612010565b60015403905090565b612374848484612705565b6123938373ffffffffffffffffffffffffffffffffffffffff16612bcb565b80156123a857506123a684848484612bee565b155b156123df576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060600980546123f4906139d2565b80601f0160208091040260200160405190810160405280929190818152602001828054612420906139d2565b801561246d5780601f106124425761010080835404028352916020019161246d565b820191906000526020600020905b81548152906001019060200180831161245057829003601f168201915b5050505050905090565b6060600082036124be576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125d2565b600082905060005b600082146124f05780806124d990613b7e565b915050600a826124e991906142ce565b91506124c6565b60008167ffffffffffffffff81111561250c5761250b613775565b5b6040519080825280601f01601f19166020018201604052801561253e5781602001600182028036833780820191505090505b5090505b600085146125cb5760018261255791906142ff565b9150600a856125669190614333565b60306125729190613eb9565b60f81b81838151811061258857612587613b20565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125c491906142ce565b9450612542565b8093505050505b919050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061271082612049565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461277b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661279c611f56565b73ffffffffffffffffffffffffffffffffffffffff1614806127cb57506127ca856127c5611f56565b611d13565b5b8061281057506127d9611f56565b73ffffffffffffffffffffffffffffffffffffffff166127f884610979565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612849576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036128af576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128bc8585856001612d3e565b6128c860008487611f5e565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612b47576001548214612b4657878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bb28585856001612d44565b5050505050565b612bc68383836001612d4a565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612c14611f56565b8786866040518563ffffffff1660e01b8152600401612c3694939291906143b9565b6020604051808303816000875af1925050508015612c7257506040513d601f19601f82011682018060405250810190612c6f919061441a565b60015b612ceb573d8060008114612ca2576040519150601f19603f3d011682016040523d82523d6000602084013e612ca7565b606091505b506000815103612ce3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612db7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403612df1576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612dfe6000868387612d3e565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612fc85750612fc78773ffffffffffffffffffffffffffffffffffffffff16612bcb565b5b1561308d575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461303d6000888480600101955088612bee565b613073576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808203612fce57826001541461308857600080fd5b6130f8565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480820361308e575b81600181905550505061310e6000868387612d44565b5050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6131a18161316c565b81146131ac57600080fd5b50565b6000813590506131be81613198565b92915050565b6000602082840312156131da576131d9613162565b5b60006131e8848285016131af565b91505092915050565b60008115159050919050565b613206816131f1565b82525050565b600060208201905061322160008301846131fd565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613261578082015181840152602081019050613246565b60008484015250505050565b6000601f19601f8301169050919050565b600061328982613227565b6132938185613232565b93506132a3818560208601613243565b6132ac8161326d565b840191505092915050565b600060208201905081810360008301526132d1818461327e565b905092915050565b6000819050919050565b6132ec816132d9565b81146132f757600080fd5b50565b600081359050613309816132e3565b92915050565b60006020828403121561332557613324613162565b5b6000613333848285016132fa565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006133678261333c565b9050919050565b6133778161335c565b82525050565b6000602082019050613392600083018461336e565b92915050565b6133a18161335c565b81146133ac57600080fd5b50565b6000813590506133be81613398565b92915050565b600080604083850312156133db576133da613162565b5b60006133e9858286016133af565b92505060206133fa858286016132fa565b9150509250929050565b600067ffffffffffffffff82169050919050565b61342181613404565b82525050565b600060208201905061343c6000830184613418565b92915050565b61344b816132d9565b82525050565b60006020820190506134666000830184613442565b92915050565b60008060006060848603121561348557613484613162565b5b6000613493868287016133af565b93505060206134a4868287016133af565b92505060406134b5868287016132fa565b9150509250925092565b6000602082840312156134d5576134d4613162565b5b60006134e3848285016133af565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613521816132d9565b82525050565b60006135338383613518565b60208301905092915050565b6000602082019050919050565b6000613557826134ec565b61356181856134f7565b935061356c83613508565b8060005b8381101561359d5781516135848882613527565b975061358f8361353f565b925050600181019050613570565b5085935050505092915050565b600060208201905081810360008301526135c4818461354c565b905092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126135f1576135f06135cc565b5b8235905067ffffffffffffffff81111561360e5761360d6135d1565b5b60208301915083600182028301111561362a576136296135d6565b5b9250929050565b6000806020838503121561364857613647613162565b5b600083013567ffffffffffffffff81111561366657613665613167565b5b613672858286016135db565b92509250509250929050565b61368781613404565b811461369257600080fd5b50565b6000813590506136a48161367e565b92915050565b6000602082840312156136c0576136bf613162565b5b60006136ce84828501613695565b91505092915050565b6136e0816131f1565b81146136eb57600080fd5b50565b6000813590506136fd816136d7565b92915050565b60006020828403121561371957613718613162565b5b6000613727848285016136ee565b91505092915050565b6000806040838503121561374757613746613162565b5b6000613755858286016133af565b9250506020613766858286016136ee565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6137ad8261326d565b810181811067ffffffffffffffff821117156137cc576137cb613775565b5b80604052505050565b60006137df613158565b90506137eb82826137a4565b919050565b600067ffffffffffffffff82111561380b5761380a613775565b5b6138148261326d565b9050602081019050919050565b82818337600083830152505050565b600061384361383e846137f0565b6137d5565b90508281526020810184848401111561385f5761385e613770565b5b61386a848285613821565b509392505050565b600082601f830112613887576138866135cc565b5b8135613897848260208601613830565b91505092915050565b600080600080608085870312156138ba576138b9613162565b5b60006138c8878288016133af565b94505060206138d9878288016133af565b93505060406138ea878288016132fa565b925050606085013567ffffffffffffffff81111561390b5761390a613167565b5b61391787828801613872565b91505092959194509250565b6000806040838503121561393a57613939613162565b5b6000613948858286016132fa565b9250506020613959858286016133af565b9150509250929050565b6000806040838503121561397a57613979613162565b5b6000613988858286016133af565b9250506020613999858286016133af565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806139ea57607f821691505b6020821081036139fd576139fc6139a3565b5b50919050565b6000604082019050613a18600083018561336e565b613a25602083018461336e565b9392505050565b600081519050613a3b816136d7565b92915050565b600060208284031215613a5757613a56613162565b5b6000613a6584828501613a2c565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613aa4602083613232565b9150613aaf82613a6e565b602082019050919050565b60006020820190508181036000830152613ad381613a97565b9050919050565b600081905092915050565b50565b6000613af5600083613ada565b9150613b0082613ae5565b600082019050919050565b6000613b1682613ae8565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b89826132d9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613bbb57613bba613b4f565b5b600182019050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613c337fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613bf6565b613c3d8683613bf6565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613c7a613c75613c70846132d9565b613c55565b6132d9565b9050919050565b6000819050919050565b613c9483613c5f565b613ca8613ca082613c81565b848454613c03565b825550505050565b600090565b613cbd613cb0565b613cc8818484613c8b565b505050565b5b81811015613cec57613ce1600082613cb5565b600181019050613cce565b5050565b601f821115613d3157613d0281613bd1565b613d0b84613be6565b81016020851015613d1a578190505b613d2e613d2685613be6565b830182613ccd565b50505b505050565b600082821c905092915050565b6000613d5460001984600802613d36565b1980831691505092915050565b6000613d6d8383613d43565b9150826002028217905092915050565b613d878383613bc6565b67ffffffffffffffff811115613da057613d9f613775565b5b613daa82546139d2565b613db5828285613cf0565b6000601f831160018114613de45760008415613dd2578287013590505b613ddc8582613d61565b865550613e44565b601f198416613df286613bd1565b60005b82811015613e1a57848901358255600182019150602085019450602081019050613df5565b86831015613e375784890135613e33601f891682613d43565b8355505b6001600288020188555050505b50505050505050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b6000613e83601483613232565b9150613e8e82613e4d565b602082019050919050565b60006020820190508181036000830152613eb281613e76565b9050919050565b6000613ec4826132d9565b9150613ecf836132d9565b9250828201905080821115613ee757613ee6613b4f565b5b92915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b6000613f23601483613232565b9150613f2e82613eed565b602082019050919050565b60006020820190508181036000830152613f5281613f16565b9050919050565b7f5075626c6963206973206e6f7420416374697665000000000000000000000000600082015250565b6000613f8f601483613232565b9150613f9a82613f59565b602082019050919050565b60006020820190508181036000830152613fbe81613f82565b9050919050565b7f4d696e74206c696d69742065786365656465642e000000000000000000000000600082015250565b6000613ffb601483613232565b915061400682613fc5565b602082019050919050565b6000602082019050818103600083015261402a81613fee565b9050919050565b600061403c82613404565b915061404783613404565b9250828201905067ffffffffffffffff81111561406757614066613b4f565b5b92915050565b6000614078826132d9565b9150614083836132d9565b9250828202614091816132d9565b915082820484148315176140a8576140a7613b4f565b5b5092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b60006140e5601383613232565b91506140f0826140af565b602082019050919050565b60006020820190508181036000830152614114816140d8565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614177602f83613232565b91506141828261411b565b604082019050919050565b600060208201905081810360008301526141a68161416a565b9050919050565b600081905092915050565b60006141c382613227565b6141cd81856141ad565b93506141dd818560208601613243565b80840191505092915050565b60006141f582856141b8565b915061420182846141b8565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614269602683613232565b91506142748261420d565b604082019050919050565b600060208201905081810360008301526142988161425c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006142d9826132d9565b91506142e4836132d9565b9250826142f4576142f361429f565b5b828204905092915050565b600061430a826132d9565b9150614315836132d9565b925082820390508181111561432d5761432c613b4f565b5b92915050565b600061433e826132d9565b9150614349836132d9565b9250826143595761435861429f565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b600061438b82614364565b614395818561436f565b93506143a5818560208601613243565b6143ae8161326d565b840191505092915050565b60006080820190506143ce600083018761336e565b6143db602083018661336e565b6143e86040830185613442565b81810360608301526143fa8184614380565b905095945050505050565b60008151905061441481613198565b92915050565b6000602082840312156144305761442f613162565b5b600061443e84828501614405565b9150509291505056fea264697066735822122075af7fc444ddcf7c52682640aa987043c969eda7247d4d6d85e9d40e0a5ec14f64736f6c63430008110033

Deployed Bytecode Sourcemap

53215:5031:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32319:315;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35602:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37199:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36734:389;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53536:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31524:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55723:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58001:147;;;;;;;;;;;;;:::i;:::-;;55894:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54913:802;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53359:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57514:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53592:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57787:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35396:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54024:581;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32708:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53449:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57894:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52133:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35785:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56907:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37493:297;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57413:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56073:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53492:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53632:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56357:475;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54686:156;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53410:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57234:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37871:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52588:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32319:315;32421:4;32477:25;32462:40;;;:11;:40;;;;:107;;;;32536:33;32521:48;;;:11;:48;;;;32462:107;:162;;;;32588:36;32612:11;32588:23;:36::i;:::-;32462:162;32440:184;;32319:315;;;:::o;35602:104::-;35656:13;35691:5;35684:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35602:104;:::o;37199:212::-;37267:7;37294:16;37302:7;37294;:16::i;:::-;37289:64;;37319:34;;;;;;;;;;;;;;37289:64;37377:15;:24;37393:7;37377:24;;;;;;;;;;;;;;;;;;;;;37370:31;;37199:212;;;:::o;36734:389::-;36809:13;36825:24;36841:7;36825:15;:24::i;:::-;36809:40;;36872:5;36866:11;;:2;:11;;;36862:48;;36886:24;;;;;;;;;;;;;;36862:48;36947:5;36931:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;36957:37;36974:5;36981:12;:10;:12::i;:::-;36957:16;:37::i;:::-;36956:38;36931:63;36927:142;;;37020:35;;;;;;;;;;;;;;36927:142;37085:28;37094:2;37098:7;37107:5;37085:8;:28::i;:::-;36796:327;36734:389;;:::o;53536:47::-;;;;;;;;;;;;;:::o;31524:315::-;31568:7;31801:15;:13;:15::i;:::-;31786:12;;31770:13;;:28;:46;31763:53;;31524:315;:::o;55723:163::-;55824:4;3893:1;2707:42;3847:43;;;:47;3843:699;;;4134:10;4126:18;;:4;:18;;;4122:85;;55841:37:::1;55860:4;55866:2;55870:7;55841:18;:37::i;:::-;4185:7:::0;;4122:85;2707:42;4267:40;;;4316:4;4323:10;4267:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;2707:42;4363:40;;;4412:4;4419;4363:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4267:157;4221:310;;4504:10;4485:30;;;;;;;;;;;:::i;:::-;;;;;;;;4221:310;3843:699;55841:37:::1;55860:4;55866:2;55870:7;55841:18;:37::i;:::-;55723:163:::0;;;;;:::o;58001:147::-;52364:12;:10;:12::i;:::-;52353:23;;:7;:5;:7::i;:::-;:23;;;52345:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58050:7:::1;58071;:5;:7::i;:::-;58063:21;;58092;58063:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58049:69;;;58137:2;58129:11;;;::::0;::::1;;58038:110;58001:147::o:0;55894:171::-;55999:4;3893:1;2707:42;3847:43;;;:47;3843:699;;;4134:10;4126:18;;:4;:18;;;4122:85;;56016:41:::1;56039:4;56045:2;56049:7;56016:22;:41::i;:::-;4185:7:::0;;4122:85;2707:42;4267:40;;;4316:4;4323:10;4267:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;2707:42;4363:40;;;4412:4;4419;4363:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4267:157;4221:310;;4504:10;4485:30;;;;;;;;;;;:::i;:::-;;;;;;;;4221:310;3843:699;56016:41:::1;56039:4;56045:2;56049:7;56016:22;:41::i;:::-;55894:171:::0;;;;;:::o;54913:802::-;55002:16;55036:23;55062:17;55072:6;55062:9;:17::i;:::-;55036:43;;55090:30;55137:15;55123:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55090:63;;55164:22;55189:1;55164:26;;55201:23;55241:434;55266:15;55248;:33;:64;;;;;55303:9;;;;;;;;;;;55285:27;;:14;:27;;55248:64;55241:434;;;55358:4;55332:30;;:22;55339:14;55332:6;:22::i;:::-;:30;;;55329:304;;55383:25;55411:23;55419:14;55411:7;:23::i;:::-;55383:51;;55480:6;55459:27;;:17;:27;;;55455:163;;55544:14;55511:13;55525:15;55511:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;55581:17;;;;;:::i;:::-;;;;55455:163;55364:269;55329:304;55647:16;;;;;:::i;:::-;;;;55241:434;;;55694:13;55687:20;;;;;;54913:802;;;:::o;53359:42::-;;;;:::o;57514:104::-;57569:4;57593:17;57601:8;57593:7;:17::i;:::-;57586:24;;57514:104;;;:::o;53592:33::-;;;;;;;;;;;;;:::o;57787:99::-;52364:12;:10;:12::i;:::-;52353:23;;:7;:5;:7::i;:::-;:23;;;52345:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57874:4:::1;;57859:12;:19;;;;;;;:::i;:::-;;57787:99:::0;;:::o;35396:129::-;35460:7;35489:21;35502:7;35489:12;:21::i;:::-;:26;;;35482:33;;35396:129;;;:::o;54024:581::-;54094:11;53743:209;;53821:1;53807:11;:15;53799:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;53898:9;;;;;;;;;;;53867:40;;53883:11;53867:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;53859:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;54126:16:::1;;;;;;;;;;;54118:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;54199:10;54186:23;;:9;:23;;;54178:32;;;::::0;::::1;;54273:29;;;;;;;;;;;54231:71;;54258:11;54231:38;;:24;54244:10;54231:12;:24::i;:::-;:38;;;;:::i;:::-;:71;;54223:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;54382:15;;;;;;;;;;;54347:50;;54367:11;54347:17;;;;;;;;;;;:31;;;;:::i;:::-;:50;;;;54339:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;54472:11;54455:28;;:14;;:28;;;;:::i;:::-;54442:9;:41;;54434:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;54541:11;54522:17;;:30;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;54563:34;54573:10;54585:11;54563:34;;:9;:34::i;:::-;54024:581:::0;;:::o;32708:212::-;32772:7;32815:1;32798:19;;:5;:19;;;32794:60;;32826:28;;;;;;;;;;;;;;32794:60;32882:12;:19;32895:5;32882:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;32874:36;;32867:43;;32708:212;;;:::o;53449:36::-;;;;;;;;;;;;;:::o;57894:99::-;52364:12;:10;:12::i;:::-;52353:23;;:7;:5;:7::i;:::-;:23;;;52345:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57979:6:::1;57960:16;;:25;;;;;;;;;;;;;;;;;;57894:99:::0;:::o;52133:87::-;52179:7;52206:6;;;;;;;;;;;52199:13;;52133:87;:::o;35785:108::-;35841:13;35876:7;35869:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35785:108;:::o;56907:128::-;56986:6;57012:15;57020:6;57012:7;:15::i;:::-;57005:22;;56907:128;;;:::o;37493:297::-;37606:12;:10;:12::i;:::-;37594:24;;:8;:24;;;37590:54;;37627:17;;;;;;;;;;;;;;37590:54;37706:8;37661:18;:32;37680:12;:10;:12::i;:::-;37661:32;;;;;;;;;;;;;;;:42;37694:8;37661:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;37761:8;37732:48;;37747:12;:10;:12::i;:::-;37732:48;;;37771:8;37732:48;;;;;;:::i;:::-;;;;;;;;37493:297;;:::o;57413:93::-;57457:7;57484:14;:12;:14::i;:::-;57477:21;;57413:93;:::o;56073:228::-;56224:4;3893:1;2707:42;3847:43;;;:47;3843:699;;;4134:10;4126:18;;:4;:18;;;4122:85;;56246:47:::1;56269:4;56275:2;56279:7;56288:4;56246:22;:47::i;:::-;4185:7:::0;;4122:85;2707:42;4267:40;;;4316:4;4323:10;4267:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;2707:42;4363:40;;;4412:4;4419;4363:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4267:157;4221:310;;4504:10;4485:30;;;;;;;;;;;:::i;:::-;;;;;;;;4221:310;3843:699;56246:47:::1;56269:4;56275:2;56279:7;56288:4;56246:22;:47::i;:::-;56073:228:::0;;;;;;:::o;53492:35::-;;;;;;;;;;;;;:::o;53632:36::-;;;;;;;;;;;;;:::o;56357:475::-;56478:13;56531:17;56539:8;56531:7;:17::i;:::-;56513:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;56632:28;56663:10;:8;:10::i;:::-;56632:41;;56724:1;56699:14;56693:28;:32;:131;;;;;;;;;;;;;;;;;56767:14;56783:19;:8;:17;:19::i;:::-;56750:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56693:131;56686:138;;;56357:475;;;:::o;54686:156::-;54767:11;53821:1;53807:11;:15;53799:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;53898:9;;;;;;;;;;;53867:40;;53883:11;53867:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;53859:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;52364:12:::1;:10;:12::i;:::-;52353:23;;:7;:5;:7::i;:::-;:23;;;52345:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54801:33:::2;54811:9;54822:11;54801:9;:33::i;:::-;54686:156:::0;;;:::o;53410:30::-;;;;;;;;;;;;;:::o;57234:115::-;57293:7;57320:21;57334:6;57320:13;:21::i;:::-;57313:28;;57234:115;;;:::o;37871:168::-;37968:4;37994:18;:25;38013:5;37994:25;;;;;;;;;;;;;;;:35;38020:8;37994:35;;;;;;;;;;;;;;;;;;;;;;;;;37987:42;;37871:168;;;;:::o;52588:201::-;52364:12;:10;:12::i;:::-;52353:23;;:7;:5;:7::i;:::-;:23;;;52345:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52697:1:::1;52677:22;;:8;:22;;::::0;52669:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;52753:28;52772:8;52753:18;:28::i;:::-;52588:201:::0;:::o;21085:157::-;21170:4;21209:25;21194:40;;;:11;:40;;;;21187:47;;21085:157;;;:::o;39319:193::-;39376:4;39421:7;39402:15;:13;:15::i;:::-;:26;;:53;;;;;39442:13;;39432:7;:23;39402:53;:100;;;;;39475:11;:20;39487:7;39475:20;;;;;;;;;;;:27;;;;;;;;;;;;39474:28;39402:100;39395:107;;39319:193;;;:::o;27603:98::-;27656:7;27683:10;27676:17;;27603:98;:::o;47925:210::-;48077:2;48050:15;:24;48066:7;48050:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;48117:7;48113:2;48097:28;;48106:5;48097:28;;;;;;;;;;;;47925:210;;;:::o;31284:96::-;31340:7;31369:1;31362:8;;31284:96;:::o;38116:182::-;38260:28;38270:4;38276:2;38280:7;38260:9;:28::i;:::-;38116:182;;;:::o;38379:197::-;38527:39;38544:4;38550:2;38554:7;38527:39;;;;;;;;;;;;:16;:39::i;:::-;38379:197;;;:::o;34165:1159::-;34227:21;;:::i;:::-;34263:12;34278:7;34263:22;;34352:4;34333:15;:13;:15::i;:::-;:23;;:47;;;;;34367:13;;34360:4;:20;34333:47;34329:922;;;34403:31;34437:11;:17;34449:4;34437:17;;;;;;;;;;;34403:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34480:9;:16;;;34475:759;;34553:1;34527:28;;:9;:14;;;:28;;;34523:105;;34593:9;34586:16;;;;;;34523:105;34940:273;34947:4;34940:273;;;34982:6;;;;;;;;35029:11;:17;35041:4;35029:17;;;;;;;;;;;35017:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35105:1;35079:28;;:9;:14;;;:28;;;35075:113;;35149:9;35142:16;;;;;;35075:113;34940:273;;;34475:759;34382:869;34329:922;35283:31;;;;;;;;;;;;;;34165:1159;;;;:::o;39524:108::-;39595:27;39605:2;39609:8;39595:27;;;;;;;;;;;;:9;:27::i;:::-;39524:108;;:::o;33530:116::-;33585:6;33613:12;:19;33626:5;33613:19;;;;;;;;;;;;;;;:23;;;;;;;;;;;;33606:30;;33530:116;;;:::o;31942:295::-;31989:7;32199:15;:13;:15::i;:::-;32183:13;;:31;32176:38;;31942:295;:::o;38657:389::-;38836:28;38846:4;38852:2;38856:7;38836:9;:28::i;:::-;38881:15;:2;:13;;;:15::i;:::-;:76;;;;;38901:56;38932:4;38938:2;38942:7;38951:5;38901:30;:56::i;:::-;38900:57;38881:76;38877:160;;;38983:40;;;;;;;;;;;;;;38877:160;38657:389;;;;:::o;57666:113::-;57726:13;57759:12;57752:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57666:113;:::o;8010:723::-;8066:13;8296:1;8287:5;:10;8283:53;;8314:10;;;;;;;;;;;;;;;;;;;;;8283:53;8346:12;8361:5;8346:20;;8377:14;8402:78;8417:1;8409:4;:9;8402:78;;8435:8;;;;;:::i;:::-;;;;8466:2;8458:10;;;;;:::i;:::-;;;8402:78;;;8490:19;8522:6;8512:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8490:39;;8540:154;8556:1;8547:5;:10;8540:154;;8584:1;8574:11;;;;;:::i;:::-;;;8651:2;8643:5;:10;;;;:::i;:::-;8630:2;:24;;;;:::i;:::-;8617:39;;8600:6;8607;8600:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;8680:2;8671:11;;;;;:::i;:::-;;;8540:154;;;8718:6;8704:21;;;;;8010:723;;;;:::o;33012:141::-;33073:7;33110:12;:19;33123:5;33110:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;33102:41;;33095:48;;33012:141;;;:::o;52949:191::-;53023:16;53042:6;;;;;;;;;;;53023:25;;53068:8;53059:6;;:17;;;;;;;;;;;;;;;;;;53123:8;53092:40;;53113:8;53092:40;;;;;;;;;;;;53012:128;52949:191;:::o;42614:2226::-;42739:35;42777:21;42790:7;42777:12;:21::i;:::-;42739:59;;42841:4;42819:26;;:13;:18;;;:26;;;42815:67;;42854:28;;;;;;;;;;;;;;42815:67;42899:22;42941:4;42925:20;;:12;:10;:12::i;:::-;:20;;;:75;;;;42964:36;42981:4;42987:12;:10;:12::i;:::-;42964:16;:36::i;:::-;42925:75;:130;;;;43043:12;:10;:12::i;:::-;43019:36;;:20;43031:7;43019:11;:20::i;:::-;:36;;;42925:130;42899:157;;43078:17;43073:66;;43104:35;;;;;;;;;;;;;;43073:66;43170:1;43156:16;;:2;:16;;;43152:52;;43181:23;;;;;;;;;;;;;;43152:52;43221:43;43243:4;43249:2;43253:7;43262:1;43221:21;:43::i;:::-;43335:35;43352:1;43356:7;43365:4;43335:8;:35::i;:::-;43708:1;43678:12;:18;43691:4;43678:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43754:1;43726:12;:16;43739:2;43726:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43776:31;43810:11;:20;43822:7;43810:20;;;;;;;;;;;43776:54;;43863:2;43847:8;:13;;;:18;;;;;;;;;;;;;;;;;;43915:15;43882:8;:23;;;:49;;;;;;;;;;;;;;;;;;44191:19;44223:1;44213:7;:11;44191:33;;44241:31;44275:11;:24;44287:11;44275:24;;;;;;;;;;;44241:58;;44345:1;44320:27;;:8;:13;;;;;;;;;;;;:27;;;44316:398;;44536:13;;44521:11;:28;44517:180;;44592:4;44576:8;:13;;;:20;;;;;;;;;;;;;;;;;;44647:13;:28;;;44621:8;:23;;;:54;;;;;;;;;;;;;;;;;;44517:180;44316:398;43651:1076;;;44767:7;44763:2;44748:27;;44757:4;44748:27;;;;;;;;;;;;44788:42;44809:4;44815:2;44819:7;44828:1;44788:20;:42::i;:::-;42726:2114;;42614:2226;;;:::o;40019:175::-;40152:32;40158:2;40162:8;40172:5;40179:4;40152:5;:32::i;:::-;40019:175;;;:::o;11002:326::-;11062:4;11319:1;11297:7;:19;;;:23;11290:30;;11002:326;;;:::o;48649:701::-;48822:4;48861:2;48845:36;;;48882:12;:10;:12::i;:::-;48896:4;48902:7;48911:5;48845:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;48841:500;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49102:1;49085:6;:13;:18;49081:247;;49133:40;;;;;;;;;;;;;;49081:247;49282:6;49276:13;49267:6;49263:2;49259:15;49252:38;48841:500;48976:45;;;48966:55;;;:6;:55;;;;48959:62;;;48649:701;;;;;;:::o;50032:169::-;;;;;:::o;50896:168::-;;;;;:::o;40477:1859::-;40628:20;40651:13;;40628:36;;40695:1;40681:16;;:2;:16;;;40677:48;;40706:19;;;;;;;;;;;;;;40677:48;40754:1;40742:8;:13;40738:44;;40764:18;;;;;;;;;;;;;;40738:44;40799:61;40829:1;40833:2;40837:12;40851:8;40799:21;:61::i;:::-;41184:8;41149:12;:16;41162:2;41149:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41250:8;41210:12;:16;41223:2;41210:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41313:2;41280:11;:25;41292:12;41280:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;41382:15;41332:11;:25;41344:12;41332:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;41419:20;41442:12;41419:35;;41471:11;41500:8;41485:12;:23;41471:37;;41533:4;:23;;;;;41541:15;:2;:13;;;:15::i;:::-;41533:23;41529:667;;;41579:324;41637:12;41633:2;41612:38;;41629:1;41612:38;;;;;;;;;;;;41680:69;41719:1;41723:2;41727:14;;;;;;41743:5;41680:30;:69::i;:::-;41675:178;;41787:40;;;;;;;;;;;;;;41675:178;41898:3;41882:12;:19;41579:324;;41988:12;41971:13;;:29;41967:43;;42002:8;;;41967:43;41529:667;;;42055:124;42113:14;;;;;;42109:2;42088:40;;42105:1;42088:40;;;;;;;;;;;;42174:3;42158:12;:19;42055:124;;41529:667;42228:12;42212:13;:28;;;;41122:1132;;42266:60;42295:1;42299:2;42303:12;42317:8;42266:20;:60::i;:::-;40615:1721;40477:1859;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:101::-;4926:7;4966:18;4959:5;4955:30;4944:41;;4890:101;;;:::o;4997:115::-;5082:23;5099:5;5082:23;:::i;:::-;5077:3;5070:36;4997:115;;:::o;5118:218::-;5209:4;5247:2;5236:9;5232:18;5224:26;;5260:69;5326:1;5315:9;5311:17;5302:6;5260:69;:::i;:::-;5118:218;;;;:::o;5342:118::-;5429:24;5447:5;5429:24;:::i;:::-;5424:3;5417:37;5342:118;;:::o;5466:222::-;5559:4;5597:2;5586:9;5582:18;5574:26;;5610:71;5678:1;5667:9;5663:17;5654:6;5610:71;:::i;:::-;5466:222;;;;:::o;5694:619::-;5771:6;5779;5787;5836:2;5824:9;5815:7;5811:23;5807:32;5804:119;;;5842:79;;:::i;:::-;5804:119;5962:1;5987:53;6032:7;6023:6;6012:9;6008:22;5987:53;:::i;:::-;5977:63;;5933:117;6089:2;6115:53;6160:7;6151:6;6140:9;6136:22;6115:53;:::i;:::-;6105:63;;6060:118;6217:2;6243:53;6288:7;6279:6;6268:9;6264:22;6243:53;:::i;:::-;6233:63;;6188:118;5694:619;;;;;:::o;6319:329::-;6378:6;6427:2;6415:9;6406:7;6402:23;6398:32;6395:119;;;6433:79;;:::i;:::-;6395:119;6553:1;6578:53;6623:7;6614:6;6603:9;6599:22;6578:53;:::i;:::-;6568:63;;6524:117;6319:329;;;;:::o;6654:114::-;6721:6;6755:5;6749:12;6739:22;;6654:114;;;:::o;6774:184::-;6873:11;6907:6;6902:3;6895:19;6947:4;6942:3;6938:14;6923:29;;6774:184;;;;:::o;6964:132::-;7031:4;7054:3;7046:11;;7084:4;7079:3;7075:14;7067:22;;6964:132;;;:::o;7102:108::-;7179:24;7197:5;7179:24;:::i;:::-;7174:3;7167:37;7102:108;;:::o;7216:179::-;7285:10;7306:46;7348:3;7340:6;7306:46;:::i;:::-;7384:4;7379:3;7375:14;7361:28;;7216:179;;;;:::o;7401:113::-;7471:4;7503;7498:3;7494:14;7486:22;;7401:113;;;:::o;7550:732::-;7669:3;7698:54;7746:5;7698:54;:::i;:::-;7768:86;7847:6;7842:3;7768:86;:::i;:::-;7761:93;;7878:56;7928:5;7878:56;:::i;:::-;7957:7;7988:1;7973:284;7998:6;7995:1;7992:13;7973:284;;;8074:6;8068:13;8101:63;8160:3;8145:13;8101:63;:::i;:::-;8094:70;;8187:60;8240:6;8187:60;:::i;:::-;8177:70;;8033:224;8020:1;8017;8013:9;8008:14;;7973:284;;;7977:14;8273:3;8266:10;;7674:608;;;7550:732;;;;:::o;8288:373::-;8431:4;8469:2;8458:9;8454:18;8446:26;;8518:9;8512:4;8508:20;8504:1;8493:9;8489:17;8482:47;8546:108;8649:4;8640:6;8546:108;:::i;:::-;8538:116;;8288:373;;;;:::o;8667:117::-;8776:1;8773;8766:12;8790:117;8899:1;8896;8889:12;8913:117;9022:1;9019;9012:12;9050:553;9108:8;9118:6;9168:3;9161:4;9153:6;9149:17;9145:27;9135:122;;9176:79;;:::i;:::-;9135:122;9289:6;9276:20;9266:30;;9319:18;9311:6;9308:30;9305:117;;;9341:79;;:::i;:::-;9305:117;9455:4;9447:6;9443:17;9431:29;;9509:3;9501:4;9493:6;9489:17;9479:8;9475:32;9472:41;9469:128;;;9516:79;;:::i;:::-;9469:128;9050:553;;;;;:::o;9609:529::-;9680:6;9688;9737:2;9725:9;9716:7;9712:23;9708:32;9705:119;;;9743:79;;:::i;:::-;9705:119;9891:1;9880:9;9876:17;9863:31;9921:18;9913:6;9910:30;9907:117;;;9943:79;;:::i;:::-;9907:117;10056:65;10113:7;10104:6;10093:9;10089:22;10056:65;:::i;:::-;10038:83;;;;9834:297;9609:529;;;;;:::o;10144:120::-;10216:23;10233:5;10216:23;:::i;:::-;10209:5;10206:34;10196:62;;10254:1;10251;10244:12;10196:62;10144:120;:::o;10270:137::-;10315:5;10353:6;10340:20;10331:29;;10369:32;10395:5;10369:32;:::i;:::-;10270:137;;;;:::o;10413:327::-;10471:6;10520:2;10508:9;10499:7;10495:23;10491:32;10488:119;;;10526:79;;:::i;:::-;10488:119;10646:1;10671:52;10715:7;10706:6;10695:9;10691:22;10671:52;:::i;:::-;10661:62;;10617:116;10413:327;;;;:::o;10746:116::-;10816:21;10831:5;10816:21;:::i;:::-;10809:5;10806:32;10796:60;;10852:1;10849;10842:12;10796:60;10746:116;:::o;10868:133::-;10911:5;10949:6;10936:20;10927:29;;10965:30;10989:5;10965:30;:::i;:::-;10868:133;;;;:::o;11007:323::-;11063:6;11112:2;11100:9;11091:7;11087:23;11083:32;11080:119;;;11118:79;;:::i;:::-;11080:119;11238:1;11263:50;11305:7;11296:6;11285:9;11281:22;11263:50;:::i;:::-;11253:60;;11209:114;11007:323;;;;:::o;11336:468::-;11401:6;11409;11458:2;11446:9;11437:7;11433:23;11429:32;11426:119;;;11464:79;;:::i;:::-;11426:119;11584:1;11609:53;11654:7;11645:6;11634:9;11630:22;11609:53;:::i;:::-;11599:63;;11555:117;11711:2;11737:50;11779:7;11770:6;11759:9;11755:22;11737:50;:::i;:::-;11727:60;;11682:115;11336:468;;;;;:::o;11810:117::-;11919:1;11916;11909:12;11933:180;11981:77;11978:1;11971:88;12078:4;12075:1;12068:15;12102:4;12099:1;12092:15;12119:281;12202:27;12224:4;12202:27;:::i;:::-;12194:6;12190:40;12332:6;12320:10;12317:22;12296:18;12284:10;12281:34;12278:62;12275:88;;;12343:18;;:::i;:::-;12275:88;12383:10;12379:2;12372:22;12162:238;12119:281;;:::o;12406:129::-;12440:6;12467:20;;:::i;:::-;12457:30;;12496:33;12524:4;12516:6;12496:33;:::i;:::-;12406:129;;;:::o;12541:307::-;12602:4;12692:18;12684:6;12681:30;12678:56;;;12714:18;;:::i;:::-;12678:56;12752:29;12774:6;12752:29;:::i;:::-;12744:37;;12836:4;12830;12826:15;12818:23;;12541:307;;;:::o;12854:146::-;12951:6;12946:3;12941;12928:30;12992:1;12983:6;12978:3;12974:16;12967:27;12854:146;;;:::o;13006:423::-;13083:5;13108:65;13124:48;13165:6;13124:48;:::i;:::-;13108:65;:::i;:::-;13099:74;;13196:6;13189:5;13182:21;13234:4;13227:5;13223:16;13272:3;13263:6;13258:3;13254:16;13251:25;13248:112;;;13279:79;;:::i;:::-;13248:112;13369:54;13416:6;13411:3;13406;13369:54;:::i;:::-;13089:340;13006:423;;;;;:::o;13448:338::-;13503:5;13552:3;13545:4;13537:6;13533:17;13529:27;13519:122;;13560:79;;:::i;:::-;13519:122;13677:6;13664:20;13702:78;13776:3;13768:6;13761:4;13753:6;13749:17;13702:78;:::i;:::-;13693:87;;13509:277;13448:338;;;;:::o;13792:943::-;13887:6;13895;13903;13911;13960:3;13948:9;13939:7;13935:23;13931:33;13928:120;;;13967:79;;:::i;:::-;13928:120;14087:1;14112:53;14157:7;14148:6;14137:9;14133:22;14112:53;:::i;:::-;14102:63;;14058:117;14214:2;14240:53;14285:7;14276:6;14265:9;14261:22;14240:53;:::i;:::-;14230:63;;14185:118;14342:2;14368:53;14413:7;14404:6;14393:9;14389:22;14368:53;:::i;:::-;14358:63;;14313:118;14498:2;14487:9;14483:18;14470:32;14529:18;14521:6;14518:30;14515:117;;;14551:79;;:::i;:::-;14515:117;14656:62;14710:7;14701:6;14690:9;14686:22;14656:62;:::i;:::-;14646:72;;14441:287;13792:943;;;;;;;:::o;14741:474::-;14809:6;14817;14866:2;14854:9;14845:7;14841:23;14837:32;14834:119;;;14872:79;;:::i;:::-;14834:119;14992:1;15017:53;15062:7;15053:6;15042:9;15038:22;15017:53;:::i;:::-;15007:63;;14963:117;15119:2;15145:53;15190:7;15181:6;15170:9;15166:22;15145:53;:::i;:::-;15135:63;;15090:118;14741:474;;;;;:::o;15221:::-;15289:6;15297;15346:2;15334:9;15325:7;15321:23;15317:32;15314:119;;;15352:79;;:::i;:::-;15314:119;15472:1;15497:53;15542:7;15533:6;15522:9;15518:22;15497:53;:::i;:::-;15487:63;;15443:117;15599:2;15625:53;15670:7;15661:6;15650:9;15646:22;15625:53;:::i;:::-;15615:63;;15570:118;15221:474;;;;;:::o;15701:180::-;15749:77;15746:1;15739:88;15846:4;15843:1;15836:15;15870:4;15867:1;15860:15;15887:320;15931:6;15968:1;15962:4;15958:12;15948:22;;16015:1;16009:4;16005:12;16036:18;16026:81;;16092:4;16084:6;16080:17;16070:27;;16026:81;16154:2;16146:6;16143:14;16123:18;16120:38;16117:84;;16173:18;;:::i;:::-;16117:84;15938:269;15887:320;;;:::o;16213:332::-;16334:4;16372:2;16361:9;16357:18;16349:26;;16385:71;16453:1;16442:9;16438:17;16429:6;16385:71;:::i;:::-;16466:72;16534:2;16523:9;16519:18;16510:6;16466:72;:::i;:::-;16213:332;;;;;:::o;16551:137::-;16605:5;16636:6;16630:13;16621:22;;16652:30;16676:5;16652:30;:::i;:::-;16551:137;;;;:::o;16694:345::-;16761:6;16810:2;16798:9;16789:7;16785:23;16781:32;16778:119;;;16816:79;;:::i;:::-;16778:119;16936:1;16961:61;17014:7;17005:6;16994:9;16990:22;16961:61;:::i;:::-;16951:71;;16907:125;16694:345;;;;:::o;17045:182::-;17185:34;17181:1;17173:6;17169:14;17162:58;17045:182;:::o;17233:366::-;17375:3;17396:67;17460:2;17455:3;17396:67;:::i;:::-;17389:74;;17472:93;17561:3;17472:93;:::i;:::-;17590:2;17585:3;17581:12;17574:19;;17233:366;;;:::o;17605:419::-;17771:4;17809:2;17798:9;17794:18;17786:26;;17858:9;17852:4;17848:20;17844:1;17833:9;17829:17;17822:47;17886:131;18012:4;17886:131;:::i;:::-;17878:139;;17605:419;;;:::o;18030:147::-;18131:11;18168:3;18153:18;;18030:147;;;;:::o;18183:114::-;;:::o;18303:398::-;18462:3;18483:83;18564:1;18559:3;18483:83;:::i;:::-;18476:90;;18575:93;18664:3;18575:93;:::i;:::-;18693:1;18688:3;18684:11;18677:18;;18303:398;;;:::o;18707:379::-;18891:3;18913:147;19056:3;18913:147;:::i;:::-;18906:154;;19077:3;19070:10;;18707:379;;;:::o;19092:180::-;19140:77;19137:1;19130:88;19237:4;19234:1;19227:15;19261:4;19258:1;19251:15;19278:180;19326:77;19323:1;19316:88;19423:4;19420:1;19413:15;19447:4;19444:1;19437:15;19464:233;19503:3;19526:24;19544:5;19526:24;:::i;:::-;19517:33;;19572:66;19565:5;19562:77;19559:103;;19642:18;;:::i;:::-;19559:103;19689:1;19682:5;19678:13;19671:20;;19464:233;;;:::o;19703:97::-;19762:6;19790:3;19780:13;;19703:97;;;;:::o;19806:141::-;19855:4;19878:3;19870:11;;19901:3;19898:1;19891:14;19935:4;19932:1;19922:18;19914:26;;19806:141;;;:::o;19953:93::-;19990:6;20037:2;20032;20025:5;20021:14;20017:23;20007:33;;19953:93;;;:::o;20052:107::-;20096:8;20146:5;20140:4;20136:16;20115:37;;20052:107;;;;:::o;20165:393::-;20234:6;20284:1;20272:10;20268:18;20307:97;20337:66;20326:9;20307:97;:::i;:::-;20425:39;20455:8;20444:9;20425:39;:::i;:::-;20413:51;;20497:4;20493:9;20486:5;20482:21;20473:30;;20546:4;20536:8;20532:19;20525:5;20522:30;20512:40;;20241:317;;20165:393;;;;;:::o;20564:60::-;20592:3;20613:5;20606:12;;20564:60;;;:::o;20630:142::-;20680:9;20713:53;20731:34;20740:24;20758:5;20740:24;:::i;:::-;20731:34;:::i;:::-;20713:53;:::i;:::-;20700:66;;20630:142;;;:::o;20778:75::-;20821:3;20842:5;20835:12;;20778:75;;;:::o;20859:269::-;20969:39;21000:7;20969:39;:::i;:::-;21030:91;21079:41;21103:16;21079:41;:::i;:::-;21071:6;21064:4;21058:11;21030:91;:::i;:::-;21024:4;21017:105;20935:193;20859:269;;;:::o;21134:73::-;21179:3;21134:73;:::o;21213:189::-;21290:32;;:::i;:::-;21331:65;21389:6;21381;21375:4;21331:65;:::i;:::-;21266:136;21213:189;;:::o;21408:186::-;21468:120;21485:3;21478:5;21475:14;21468:120;;;21539:39;21576:1;21569:5;21539:39;:::i;:::-;21512:1;21505:5;21501:13;21492:22;;21468:120;;;21408:186;;:::o;21600:543::-;21701:2;21696:3;21693:11;21690:446;;;21735:38;21767:5;21735:38;:::i;:::-;21819:29;21837:10;21819:29;:::i;:::-;21809:8;21805:44;22002:2;21990:10;21987:18;21984:49;;;22023:8;22008:23;;21984:49;22046:80;22102:22;22120:3;22102:22;:::i;:::-;22092:8;22088:37;22075:11;22046:80;:::i;:::-;21705:431;;21690:446;21600:543;;;:::o;22149:117::-;22203:8;22253:5;22247:4;22243:16;22222:37;;22149:117;;;;:::o;22272:169::-;22316:6;22349:51;22397:1;22393:6;22385:5;22382:1;22378:13;22349:51;:::i;:::-;22345:56;22430:4;22424;22420:15;22410:25;;22323:118;22272:169;;;;:::o;22446:295::-;22522:4;22668:29;22693:3;22687:4;22668:29;:::i;:::-;22660:37;;22730:3;22727:1;22723:11;22717:4;22714:21;22706:29;;22446:295;;;;:::o;22746:1403::-;22870:44;22910:3;22905;22870:44;:::i;:::-;22979:18;22971:6;22968:30;22965:56;;;23001:18;;:::i;:::-;22965:56;23045:38;23077:4;23071:11;23045:38;:::i;:::-;23130:67;23190:6;23182;23176:4;23130:67;:::i;:::-;23224:1;23253:2;23245:6;23242:14;23270:1;23265:632;;;;23941:1;23958:6;23955:84;;;24014:9;24009:3;24005:19;23992:33;23983:42;;23955:84;24065:67;24125:6;24118:5;24065:67;:::i;:::-;24059:4;24052:81;23914:229;23235:908;;23265:632;23317:4;23313:9;23305:6;23301:22;23351:37;23383:4;23351:37;:::i;:::-;23410:1;23424:215;23438:7;23435:1;23432:14;23424:215;;;23524:9;23519:3;23515:19;23502:33;23494:6;23487:49;23575:1;23567:6;23563:14;23553:24;;23622:2;23611:9;23607:18;23594:31;;23461:4;23458:1;23454:12;23449:17;;23424:215;;;23667:6;23658:7;23655:19;23652:186;;;23732:9;23727:3;23723:19;23710:33;23775:48;23817:4;23809:6;23805:17;23794:9;23775:48;:::i;:::-;23767:6;23760:64;23675:163;23652:186;23884:1;23880;23872:6;23868:14;23864:22;23858:4;23851:36;23272:625;;;23235:908;;22845:1304;;;22746:1403;;;:::o;24155:170::-;24295:22;24291:1;24283:6;24279:14;24272:46;24155:170;:::o;24331:366::-;24473:3;24494:67;24558:2;24553:3;24494:67;:::i;:::-;24487:74;;24570:93;24659:3;24570:93;:::i;:::-;24688:2;24683:3;24679:12;24672:19;;24331:366;;;:::o;24703:419::-;24869:4;24907:2;24896:9;24892:18;24884:26;;24956:9;24950:4;24946:20;24942:1;24931:9;24927:17;24920:47;24984:131;25110:4;24984:131;:::i;:::-;24976:139;;24703:419;;;:::o;25128:191::-;25168:3;25187:20;25205:1;25187:20;:::i;:::-;25182:25;;25221:20;25239:1;25221:20;:::i;:::-;25216:25;;25264:1;25261;25257:9;25250:16;;25285:3;25282:1;25279:10;25276:36;;;25292:18;;:::i;:::-;25276:36;25128:191;;;;:::o;25325:170::-;25465:22;25461:1;25453:6;25449:14;25442:46;25325:170;:::o;25501:366::-;25643:3;25664:67;25728:2;25723:3;25664:67;:::i;:::-;25657:74;;25740:93;25829:3;25740:93;:::i;:::-;25858:2;25853:3;25849:12;25842:19;;25501:366;;;:::o;25873:419::-;26039:4;26077:2;26066:9;26062:18;26054:26;;26126:9;26120:4;26116:20;26112:1;26101:9;26097:17;26090:47;26154:131;26280:4;26154:131;:::i;:::-;26146:139;;25873:419;;;:::o;26298:170::-;26438:22;26434:1;26426:6;26422:14;26415:46;26298:170;:::o;26474:366::-;26616:3;26637:67;26701:2;26696:3;26637:67;:::i;:::-;26630:74;;26713:93;26802:3;26713:93;:::i;:::-;26831:2;26826:3;26822:12;26815:19;;26474:366;;;:::o;26846:419::-;27012:4;27050:2;27039:9;27035:18;27027:26;;27099:9;27093:4;27089:20;27085:1;27074:9;27070:17;27063:47;27127:131;27253:4;27127:131;:::i;:::-;27119:139;;26846:419;;;:::o;27271:170::-;27411:22;27407:1;27399:6;27395:14;27388:46;27271:170;:::o;27447:366::-;27589:3;27610:67;27674:2;27669:3;27610:67;:::i;:::-;27603:74;;27686:93;27775:3;27686:93;:::i;:::-;27804:2;27799:3;27795:12;27788:19;;27447:366;;;:::o;27819:419::-;27985:4;28023:2;28012:9;28008:18;28000:26;;28072:9;28066:4;28062:20;28058:1;28047:9;28043:17;28036:47;28100:131;28226:4;28100:131;:::i;:::-;28092:139;;27819:419;;;:::o;28244:205::-;28283:3;28302:19;28319:1;28302:19;:::i;:::-;28297:24;;28335:19;28352:1;28335:19;:::i;:::-;28330:24;;28377:1;28374;28370:9;28363:16;;28400:18;28395:3;28392:27;28389:53;;;28422:18;;:::i;:::-;28389:53;28244:205;;;;:::o;28455:410::-;28495:7;28518:20;28536:1;28518:20;:::i;:::-;28513:25;;28552:20;28570:1;28552:20;:::i;:::-;28547:25;;28607:1;28604;28600:9;28629:30;28647:11;28629:30;:::i;:::-;28618:41;;28808:1;28799:7;28795:15;28792:1;28789:22;28769:1;28762:9;28742:83;28719:139;;28838:18;;:::i;:::-;28719:139;28503:362;28455:410;;;;:::o;28871:169::-;29011:21;29007:1;28999:6;28995:14;28988:45;28871:169;:::o;29046:366::-;29188:3;29209:67;29273:2;29268:3;29209:67;:::i;:::-;29202:74;;29285:93;29374:3;29285:93;:::i;:::-;29403:2;29398:3;29394:12;29387:19;;29046:366;;;:::o;29418:419::-;29584:4;29622:2;29611:9;29607:18;29599:26;;29671:9;29665:4;29661:20;29657:1;29646:9;29642:17;29635:47;29699:131;29825:4;29699:131;:::i;:::-;29691:139;;29418:419;;;:::o;29843:234::-;29983:34;29979:1;29971:6;29967:14;29960:58;30052:17;30047:2;30039:6;30035:15;30028:42;29843:234;:::o;30083:366::-;30225:3;30246:67;30310:2;30305:3;30246:67;:::i;:::-;30239:74;;30322:93;30411:3;30322:93;:::i;:::-;30440:2;30435:3;30431:12;30424:19;;30083:366;;;:::o;30455:419::-;30621:4;30659:2;30648:9;30644:18;30636:26;;30708:9;30702:4;30698:20;30694:1;30683:9;30679:17;30672:47;30736:131;30862:4;30736:131;:::i;:::-;30728:139;;30455:419;;;:::o;30880:148::-;30982:11;31019:3;31004:18;;30880:148;;;;:::o;31034:390::-;31140:3;31168:39;31201:5;31168:39;:::i;:::-;31223:89;31305:6;31300:3;31223:89;:::i;:::-;31216:96;;31321:65;31379:6;31374:3;31367:4;31360:5;31356:16;31321:65;:::i;:::-;31411:6;31406:3;31402:16;31395:23;;31144:280;31034:390;;;;:::o;31430:435::-;31610:3;31632:95;31723:3;31714:6;31632:95;:::i;:::-;31625:102;;31744:95;31835:3;31826:6;31744:95;:::i;:::-;31737:102;;31856:3;31849:10;;31430:435;;;;;:::o;31871:225::-;32011:34;32007:1;31999:6;31995:14;31988:58;32080:8;32075:2;32067:6;32063:15;32056:33;31871:225;:::o;32102:366::-;32244:3;32265:67;32329:2;32324:3;32265:67;:::i;:::-;32258:74;;32341:93;32430:3;32341:93;:::i;:::-;32459:2;32454:3;32450:12;32443:19;;32102:366;;;:::o;32474:419::-;32640:4;32678:2;32667:9;32663:18;32655:26;;32727:9;32721:4;32717:20;32713:1;32702:9;32698:17;32691:47;32755:131;32881:4;32755:131;:::i;:::-;32747:139;;32474:419;;;:::o;32899:180::-;32947:77;32944:1;32937:88;33044:4;33041:1;33034:15;33068:4;33065:1;33058:15;33085:185;33125:1;33142:20;33160:1;33142:20;:::i;:::-;33137:25;;33176:20;33194:1;33176:20;:::i;:::-;33171:25;;33215:1;33205:35;;33220:18;;:::i;:::-;33205:35;33262:1;33259;33255:9;33250:14;;33085:185;;;;:::o;33276:194::-;33316:4;33336:20;33354:1;33336:20;:::i;:::-;33331:25;;33370:20;33388:1;33370:20;:::i;:::-;33365:25;;33414:1;33411;33407:9;33399:17;;33438:1;33432:4;33429:11;33426:37;;;33443:18;;:::i;:::-;33426:37;33276:194;;;;:::o;33476:176::-;33508:1;33525:20;33543:1;33525:20;:::i;:::-;33520:25;;33559:20;33577:1;33559:20;:::i;:::-;33554:25;;33598:1;33588:35;;33603:18;;:::i;:::-;33588:35;33644:1;33641;33637:9;33632:14;;33476:176;;;;:::o;33658:98::-;33709:6;33743:5;33737:12;33727:22;;33658:98;;;:::o;33762:168::-;33845:11;33879:6;33874:3;33867:19;33919:4;33914:3;33910:14;33895:29;;33762:168;;;;:::o;33936:373::-;34022:3;34050:38;34082:5;34050:38;:::i;:::-;34104:70;34167:6;34162:3;34104:70;:::i;:::-;34097:77;;34183:65;34241:6;34236:3;34229:4;34222:5;34218:16;34183:65;:::i;:::-;34273:29;34295:6;34273:29;:::i;:::-;34268:3;34264:39;34257:46;;34026:283;33936:373;;;;:::o;34315:640::-;34510:4;34548:3;34537:9;34533:19;34525:27;;34562:71;34630:1;34619:9;34615:17;34606:6;34562:71;:::i;:::-;34643:72;34711:2;34700:9;34696:18;34687:6;34643:72;:::i;:::-;34725;34793:2;34782:9;34778:18;34769:6;34725:72;:::i;:::-;34844:9;34838:4;34834:20;34829:2;34818:9;34814:18;34807:48;34872:76;34943:4;34934:6;34872:76;:::i;:::-;34864:84;;34315:640;;;;;;;:::o;34961:141::-;35017:5;35048:6;35042:13;35033:22;;35064:32;35090:5;35064:32;:::i;:::-;34961:141;;;;:::o;35108:349::-;35177:6;35226:2;35214:9;35205:7;35201:23;35197:32;35194:119;;;35232:79;;:::i;:::-;35194:119;35352:1;35377:63;35432:7;35423:6;35412:9;35408:22;35377:63;:::i;:::-;35367:73;;35323:127;35108:349;;;;:::o

Swarm Source

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