ETH Price: $3,256.31 (-0.57%)
Gas: 1 Gwei

Token

Fog (GREY)
 

Overview

Max Total Supply

99 GREY

Holders

71

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 GREY
0x09f548483149382506C0A271b9b8c4152A132a39
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

A genesis statement by process grey: 99 works released in 3 phases. In the way that emotions stack in unpredictable ways, the medium of generative art yields a similar result as traits randomly stumble into one another. In this series the poetry of the metadata reveals as much as the image. The fog in my life is depression- and that creates a haze through which I view all things. Things remain blurry until suddenly in sharp focus, undeniable and abrupt- simply to fade back into the fog without warning. This collection exists as one statement. It was created as the conceptualization and companion for the work [here](https://collective.proof.xyz/grails-2/03), and likely others to follow.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Fog

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;


/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}
// File: 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: Ownable.sol



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
// File: Address.sol



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
// File: 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: 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: 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: 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: IERC721Enumerable.sol



pragma solidity ^0.8.0;


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

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

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}
// File: 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: ERC721A.sol


pragma solidity ^0.8.0;









contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex;

    // 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_;
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        require(index < totalSupply(), 'ERC721A: global index out of bounds');
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        require(index < balanceOf(owner), 'ERC721A: owner index out of bounds');
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        revert('ERC721A: unable to get token of owner by index');
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

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

    function _numberMinted(address owner) internal view returns (uint256) {
        require(owner != address(0), 'ERC721A: number minted query for the zero address');
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * 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) {
        require(_exists(tokenId), 'ERC721A: owner query for nonexistent token');

        unchecked {
            for (uint256 curr = tokenId; curr >= 0; curr--) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (ownership.addr != address(0)) {
                    return ownership;
                }
            }
        }

        revert('ERC721A: unable to determine the owner of token');
    }

    /**
     * @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) {
        require(_exists(tokenId), 'ERC721Metadata: URI query for nonexistent token');

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            'ERC721A: transfer to non ERC721Receiver implementer'
        );
    }

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

    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;
        require(to != address(0), 'ERC721A: mint to the zero address');
        require(quantity != 0, 'ERC721A: quantity must be greater than 0');

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint128(quantity);
            _addressData[to].numberMinted += uint128(quantity);

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

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe) {
                    require(
                        _checkOnERC721Received(address(0), to, updatedIndex, _data),
                        'ERC721A: transfer to non ERC721Receiver implementer'
                    );
                }

                updatedIndex++;
            }

            currentIndex = updatedIndex;
        }

        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

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

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(isApprovedOrOwner, 'ERC721A: transfer caller is not owner nor approved');

        require(prevOwnership.addr == from, 'ERC721A: transfer from incorrect owner');
        require(to != address(0), 'ERC721A: transfer to the zero address');

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                if (_exists(nextTokenId)) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

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

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * 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`.
     */
    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.
     *
     * 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` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

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

pragma solidity ^0.8.2;
 
contract Fog is ERC721A, Ownable, ReentrancyGuard {

    using Strings for uint256;

    /// @author: needelman.eth
    /// Powered By NiftyDrops by NiftyLabs LLC

    /// @notice ending price of auction. Can be changed if auction is paused and started again
	uint256 public END_PRICE;
    /// @notice starting price of auction. Can be changed if auction is paused and started again
	uint256 public START_PRICE; 
    /// @notice turn on/off the auction.
	bool public status = false;
    /// @notice turn on self refunds.
	bool public refunds = false;
    /// @notice end time of the auction. Can be changed if auction is paused and started again
	uint256 public saleDuration;
    /// @notice start time of the auction. Can be changed if auction is paused and started again
    uint256 public saleStartTime;
    /// @notice immutable supply of the collection
    uint256 MAX_SUPPLY = 99;
    /// @notice metadata path for the collection
    string public _metadata;

    /// @notice emit event data when sale starts
    event saleStart( uint256 indexed _Duration, uint256 indexed _saleStartTime);
    /// @notice emit event data when sale pauses/ends
	event salePaused(uint256 indexed _currentPrice,uint256 indexed _elapsedTime);

    /// @notice stores total mint qty by address. This is used for refunds
    mapping(address => uint256) public mintAmountQty;
    /// @notice stores total mint amount in WEI by address. This is used for refunds
    mapping(address => uint256) public mintAmountPrice;

    /// @notice the price of the last sale of the collection. Set manually by dev
    uint256 public RESERVE_PRICE; 
    /// @notice total minted. The difference between this and total supply is amount airdropped
    uint256 public totalMinted;
    /// @notice stores the array of one of one winners on chain
    uint[] private OneOfOneWinners;

    constructor() ERC721A("Fog", "GREY") {}

    /// @notice start auction. Pricing is in WEI. Time is in seconds.
    /// duration: 17100 (4 hours and 45  minutes)
    /// startPrice: 5000000000000000000 (5 eth)
    /// endPrice: 250000000000000000 (0.25 eth)
	function startAuction(uint256 duration, uint256 startPrice, uint256 endPrice) external onlyOwner {
        require(!status, "Auction is live");
        require(startPrice >= endPrice);
        saleDuration = duration;
        START_PRICE = startPrice;
        END_PRICE = endPrice;
        saleStartTime = block.timestamp;
        status = true;
        emit saleStart(duration, saleStartTime);
    }

    /// @notice pause/end auction
	function pauseAuction() external onlyOwner {
        require(status, "Auction is not livie");
        uint256 currentPrice = getPrice();
	    uint256 elapsedTime = getElapsedTime();
        saleStartTime = 0;
        status = false;
        emit salePaused(currentPrice, elapsedTime);
    }
  
    /// @notice mint any amount of tokens in refundable dutch auction
	function mint(uint256 _numberofTokens) external payable nonReentrant {
        uint256 ts = totalSupply();
        uint256 costPerToken = getPrice();
        uint256 totalCost = costPerToken * _numberofTokens;

        require(status,"Auction is not live");
        require(msg.value >= totalCost, "Ether value sent is not correct");
        require(ts + _numberofTokens <= MAX_SUPPLY, "Purchase would exceed max tokens");

        _safeMint(msg.sender, _numberofTokens);

    	if (msg.value > totalCost) {
            Address.sendValue(payable(msg.sender), msg.value - totalCost);
        }

        mintAmountQty[msg.sender] += _numberofTokens;
        mintAmountPrice[msg.sender] += totalCost;
        totalMinted += _numberofTokens;
    }

    /// @notice dev airdrops tokens in batch
    function airdropBatch(address[] calldata addr) external onlyOwner {
        uint256 ts = totalSupply();
        require(ts + addr.length <= MAX_SUPPLY, "Collection is Sold Out");
        for (uint i = 0; i < addr.length; i++) {
            _safeMint(addr[i], 1);
        }
    }

    /// @notice get current price based on dutch auction
	function getPrice() public view returns (uint256) {
		if (!status) {
			return 0;
        }
        uint256 elapsed = getElapsedTime();
        if (elapsed >= saleDuration) {
            return END_PRICE;
        } else {
            int256 tPrice = int256(START_PRICE) +
                ((int256(END_PRICE) -
                    int256(START_PRICE)) /
                    int256(saleDuration)) *
                int256(elapsed);
            uint256 currentPrice = uint256(tPrice);
            return currentPrice > END_PRICE ? currentPrice : END_PRICE;
        }
    }

  /// @notice get total elapsed time based on dutch auction
	function getElapsedTime() internal view returns (uint256) {
        return saleStartTime > 0 ? block.timestamp - saleStartTime : 0;
    }

    /// @notice get remaining time of dutch auction
	function getRemainingTime() external view returns (uint256) {
        if (saleStartTime == 0) {
            return 604800; //returns one week, this is the equivalent with publicSale has not started yet
        }
        if (getElapsedTime() >= saleDuration) {
            return 0;
        }
        return (saleStartTime + saleDuration) - block.timestamp;
    }

    /// @notice dev sets final reserve price based on final sale. This also enables refunds
    function setReservePrice(uint256 _price) public onlyOwner {
        RESERVE_PRICE = _price;
    }

    /// @notice get current balance of contract
    function getContractBalance() public view returns(uint256) {
        return address(this).balance;
    }

    /// @notice get total refund amount by address
    function getRefundByAddr(address addr) external view returns(uint256) {
        require(RESERVE_PRICE > 0, "Reserve price is not set yet");
        return mintAmountPrice[addr] - mintAmountQty[addr] * RESERVE_PRICE;
    }

    /// @notice get total claim amount by address. Internal call for refunds
    function getClaimAmount(address a) internal view returns(uint256) {
        return mintAmountPrice[a] - mintAmountQty[a] * RESERVE_PRICE;
    }

    /// @notice send refund to specific address. can be called by owner or recipents with refundable balances
    function sendRefund(address payable recipient) external nonReentrant {
        require(refunds, "Refunds are not currently on");
        require(msg.sender == recipient || msg.sender == owner(), "You are not the recepient or owner");
        uint256 balance = getClaimAmount(recipient);
        require(balance > 0, "This address is not eligible for a refund");
        payable(recipient).transfer(balance);
        mintAmountPrice[recipient] = 0;
        mintAmountQty[recipient] = 0;
    }

    /// @notice batch refund to specific address. can be called by owner to recipents with refundable balances
    function batchSendRefund(address[] calldata recipient) external onlyOwner {
        require(RESERVE_PRICE > 0, "Reserve price is not set yet");
        for (uint i = 0; i < recipient.length; ++i) {
            uint256 balance = getClaimAmount(recipient[i]);
            require(balance > 0, "This address is not eligible for a refund");
            payable(recipient[i]).transfer(balance);
            mintAmountPrice[recipient[i]] = 0;
            mintAmountQty[recipient[i]] = 0;
        }
    }

    /// @notice read current metadata path
    function _baseURI() internal view virtual override returns(string memory) {
        return _metadata;
    }

    /// @notice set metadata path
    function setMetadata(string memory _newURI) public onlyOwner {
        _metadata = _newURI;
    }

    /// @notice set self refunds status
    function setRefunds(bool _status) public onlyOwner {
        refunds = _status;
    }

    /// @notice generate array of 2 numbers to pick 1 of 1s between tokens 25 and 98
    function selectOneOfOnes() public onlyOwner {
            uint winners = 2;
        for(uint i = 0; i< winners; i++){
            uint upperBound = 73;
            uint offset = 25;
            uint array = (uint(keccak256(abi.encodePacked(block.timestamp,i))) % upperBound) + offset;
            OneOfOneWinners.push(array);
        }    
    }

    /// @notice show 1 of 1 selections
    function oneOfOneWinners() public view returns (uint[] memory) {
        return OneOfOneWinners;
    }

    /// @notice read tokenURI path
    function tokenURI(uint256 id) public view virtual override returns(string memory) {
        require(_exists(id), "Token has not been minted yet");
        string memory currentBaseURI = _baseURI();
        return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, id.toString())) : "";
    }

    /// @notice dev withdraws funds that are not in the refund pool
    function withdraw() external onlyOwner {
        require(RESERVE_PRICE > 0, "Reserve Price is not set yet");
        uint256 adminWithdraw = totalMinted * RESERVE_PRICE;
        payable(owner()).transfer(adminWithdraw);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_currentPrice","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_elapsedTime","type":"uint256"}],"name":"salePaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_Duration","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_saleStartTime","type":"uint256"}],"name":"saleStart","type":"event"},{"inputs":[],"name":"END_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"START_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_metadata","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addr","type":"address[]"}],"name":"airdropBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipient","type":"address[]"}],"name":"batchSendRefund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getRefundByAddr","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRemainingTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"uint256","name":"_numberofTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintAmountPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintAmountQty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oneOfOneWinners","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"refunds","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"selectOneOfOnes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"recipient","type":"address"}],"name":"sendRefund","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":"_newURI","type":"string"}],"name":"setMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setRefunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setReservePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"startPrice","type":"uint256"},{"internalType":"uint256","name":"endPrice","type":"uint256"}],"name":"startAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"status","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600b60006101000a81548160ff0219169083151502179055506000600b60016101000a81548160ff0219169083151502179055506063600e553480156200004c57600080fd5b506040518060400160405280600381526020017f466f6700000000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f47524559000000000000000000000000000000000000000000000000000000008152508160019080519060200190620000d1929190620001e9565b508060029080519060200190620000ea929190620001e9565b5050506200010d620001016200011b60201b60201c565b6200012360201b60201c565b6001600881905550620002fe565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001f79062000299565b90600052602060002090601f0160209004810192826200021b576000855562000267565b82601f106200023657805160ff191683800117855562000267565b8280016001018555821562000267579182015b828111156200026657825182559160200191906001019062000249565b5b5090506200027691906200027a565b5090565b5b80821115620002955760008160009055506001016200027b565b5090565b60006002820490506001821680620002b257607f821691505b60208210811415620002c957620002c8620002cf565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615ccf806200030e6000396000f3fe60806040526004361061027d5760003560e01c80638afa46b11161014f578063b88d4fde116100c1578063ce9c7c0d1161007a578063ce9c7c0d14610979578063da460977146109a2578063dd21d604146109cd578063e985e9c5146109f8578063efb98bcf14610a35578063f2fde38b14610a605761027d565b8063b88d4fde1461086b578063b972110214610894578063b9ae7364146108d1578063c1f4997c146108e8578063c87b56dd14610913578063cae4d676146109505761027d565b806398d5fdca1161011357806398d5fdca1461077e578063a0712d68146107a9578063a22cb465146107c5578063a2309ff8146107ee578063a49a1e7d14610819578063b2542e28146108425761027d565b80638afa46b1146106975780638da5cb5b146106c257806391e078bb146106ed578063934f70e61461071657806395d89b41146107535761027d565b80633711d9fb116101f35780635a9c6272116101ac5780635a9c6272146105755780636352211e1461059e578063644f7670146105db5780636f9fb98a1461061857806370a0823114610643578063715018a6146106805761027d565b80633711d9fb1461048b57806339371b25146104b65780633ccfd60b146104e15780633f4764f7146104f857806342842e0e1461050f5780634f6ccce7146105385761027d565b806318160ddd1161024557806318160ddd146103795780631cbaee2d146103a4578063200d2ed2146103cf57806323b872dd146103fa5780632f745c59146104235780633609ac8f146104605761027d565b806301ffc9a71461028257806306fdde03146102bf578063081812fc146102ea578063095ea7b3146103275780631491323814610350575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190613fce565b610a89565b6040516102b691906147f1565b60405180910390f35b3480156102cb57600080fd5b506102d4610bd3565b6040516102e1919061480c565b60405180910390f35b3480156102f657600080fd5b50610311600480360381019061030c9190614071565b610c65565b60405161031e9190614768565b60405180910390f35b34801561033357600080fd5b5061034e60048036038101906103499190613f14565b610cea565b005b34801561035c57600080fd5b5061037760048036038101906103729190613f54565b610e03565b005b34801561038557600080fd5b5061038e6110a6565b60405161039b9190614c4e565b60405180910390f35b3480156103b057600080fd5b506103b96110af565b6040516103c69190614c4e565b60405180910390f35b3480156103db57600080fd5b506103e46110b5565b6040516103f191906147f1565b60405180910390f35b34801561040657600080fd5b50610421600480360381019061041c9190613dfe565b6110c8565b005b34801561042f57600080fd5b5061044a60048036038101906104459190613f14565b6110d8565b6040516104579190614c4e565b60405180910390f35b34801561046c57600080fd5b506104756112ca565b6040516104829190614c4e565b60405180910390f35b34801561049757600080fd5b506104a06112d0565b6040516104ad9190614c4e565b60405180910390f35b3480156104c257600080fd5b506104cb6112d6565b6040516104d8919061480c565b60405180910390f35b3480156104ed57600080fd5b506104f6611364565b005b34801561050457600080fd5b5061050d61148a565b005b34801561051b57600080fd5b5061053660048036038101906105319190613dfe565b6115ac565b005b34801561054457600080fd5b5061055f600480360381019061055a9190614071565b6115cc565b60405161056c9190614c4e565b60405180910390f35b34801561058157600080fd5b5061059c60048036038101906105979190613fa1565b61161f565b005b3480156105aa57600080fd5b506105c560048036038101906105c09190614071565b6116b8565b6040516105d29190614768565b60405180910390f35b3480156105e757600080fd5b5061060260048036038101906105fd9190613d64565b6116ce565b60405161060f9190614c4e565b60405180910390f35b34801561062457600080fd5b5061062d6116e6565b60405161063a9190614c4e565b60405180910390f35b34801561064f57600080fd5b5061066a60048036038101906106659190613d64565b6116ee565b6040516106779190614c4e565b60405180910390f35b34801561068c57600080fd5b506106956117d7565b005b3480156106a357600080fd5b506106ac61185f565b6040516106b991906147f1565b60405180910390f35b3480156106ce57600080fd5b506106d7611872565b6040516106e49190614768565b60405180910390f35b3480156106f957600080fd5b50610714600480360381019061070f919061409e565b61189c565b005b34801561072257600080fd5b5061073d60048036038101906107389190613d64565b6119e1565b60405161074a9190614c4e565b60405180910390f35b34801561075f57600080fd5b506107686119f9565b604051610775919061480c565b60405180910390f35b34801561078a57600080fd5b50610793611a8b565b6040516107a09190614c4e565b60405180910390f35b6107c360048036038101906107be9190614071565b611b24565b005b3480156107d157600080fd5b506107ec60048036038101906107e79190613ed4565b611d31565b005b3480156107fa57600080fd5b50610803611eb2565b6040516108109190614c4e565b60405180910390f35b34801561082557600080fd5b50610840600480360381019061083b9190614028565b611eb8565b005b34801561084e57600080fd5b5061086960048036038101906108649190613f54565b611f4e565b005b34801561087757600080fd5b50610892600480360381019061088d9190613e51565b612082565b005b3480156108a057600080fd5b506108bb60048036038101906108b69190613d64565b6120de565b6040516108c89190614c4e565b60405180910390f35b3480156108dd57600080fd5b506108e66121c2565b005b3480156108f457600080fd5b506108fd6122fa565b60405161090a91906147cf565b60405180910390f35b34801561091f57600080fd5b5061093a60048036038101906109359190614071565b612352565b604051610947919061480c565b60405180910390f35b34801561095c57600080fd5b5061097760048036038101906109729190613d91565b6123f9565b005b34801561098557600080fd5b506109a0600480360381019061099b9190614071565b612628565b005b3480156109ae57600080fd5b506109b76126ae565b6040516109c49190614c4e565b60405180910390f35b3480156109d957600080fd5b506109e26126b4565b6040516109ef9190614c4e565b60405180910390f35b348015610a0457600080fd5b50610a1f6004803603810190610a1a9190613dbe565b6126ba565b604051610a2c91906147f1565b60405180910390f35b348015610a4157600080fd5b50610a4a61274e565b604051610a579190614c4e565b60405180910390f35b348015610a6c57600080fd5b50610a876004803603810190610a829190613d64565b61279f565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b5457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610bbc57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610bcc5750610bcb82612897565b5b9050919050565b606060018054610be290615207565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0e90615207565b8015610c5b5780601f10610c3057610100808354040283529160200191610c5b565b820191906000526020600020905b815481529060010190602001808311610c3e57829003601f168201915b5050505050905090565b6000610c7082612901565b610caf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca690614c2e565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cf5826116b8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5d90614aee565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d8561290e565b73ffffffffffffffffffffffffffffffffffffffff161480610db45750610db381610dae61290e565b6126ba565b5b610df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dea906149ee565b60405180910390fd5b610dfe838383612916565b505050565b610e0b61290e565b73ffffffffffffffffffffffffffffffffffffffff16610e29611872565b73ffffffffffffffffffffffffffffffffffffffff1614610e7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7690614a4e565b60405180910390fd5b600060125411610ec4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebb9061484e565b60405180910390fd5b60005b828290508110156110a1576000610f04848484818110610eea57610ee961537b565b5b9050602002016020810190610eff9190613d64565b6129c8565b905060008111610f49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f409061486e565b60405180910390fd5b838383818110610f5c57610f5b61537b565b5b9050602002016020810190610f719190613d64565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610fb6573d6000803e3d6000fd5b50600060116000868686818110610fd057610fcf61537b565b5b9050602002016020810190610fe59190613d64565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060006010600086868681811061103c5761103b61537b565b5b90506020020160208101906110519190613d64565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550508061109a9061526a565b9050610ec7565b505050565b60008054905090565b600d5481565b600b60009054906101000a900460ff1681565b6110d3838383612a68565b505050565b60006110e3836116ee565b8210611124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111b9061482e565b60405180910390fd5b600061112e6110a6565b905060008060005b83811015611288576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461122857806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561127a57868414156112715781955050505050506112c4565b83806001019450505b508080600101915050611136565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bb90614bce565b60405180910390fd5b92915050565b600a5481565b600c5481565b600f80546112e390615207565b80601f016020809104026020016040519081016040528092919081815260200182805461130f90615207565b801561135c5780601f106113315761010080835404028352916020019161135c565b820191906000526020600020905b81548152906001019060200180831161133f57829003601f168201915b505050505081565b61136c61290e565b73ffffffffffffffffffffffffffffffffffffffff1661138a611872565b73ffffffffffffffffffffffffffffffffffffffff16146113e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d790614a4e565b60405180910390fd5b600060125411611425576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141c90614b4e565b60405180910390fd5b60006012546013546114379190615013565b9050611441611872565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611486573d6000803e3d6000fd5b5050565b61149261290e565b73ffffffffffffffffffffffffffffffffffffffff166114b0611872565b73ffffffffffffffffffffffffffffffffffffffff1614611506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fd90614a4e565b60405180910390fd5b60006002905060005b818110156115a85760006049905060006019905060008183428660405160200161153a92919061473c565b6040516020818303038152906040528051906020012060001c61155d91906152bd565b6115679190614e0b565b9050601481908060018154018082558091505060019003906000526020600020016000909190919091505550505080806115a09061526a565b91505061150f565b5050565b6115c783838360405180602001604052806000815250612082565b505050565b60006115d66110a6565b8210611617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160e9061492e565b60405180910390fd5b819050919050565b61162761290e565b73ffffffffffffffffffffffffffffffffffffffff16611645611872565b73ffffffffffffffffffffffffffffffffffffffff161461169b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169290614a4e565b60405180910390fd5b80600b60016101000a81548160ff02191690831515021790555050565b60006116c382612fa8565b600001519050919050565b60106020528060005260406000206000915090505481565b600047905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561175f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175690614a0e565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6117df61290e565b73ffffffffffffffffffffffffffffffffffffffff166117fd611872565b73ffffffffffffffffffffffffffffffffffffffff1614611853576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184a90614a4e565b60405180910390fd5b61185d6000613142565b565b600b60019054906101000a900460ff1681565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6118a461290e565b73ffffffffffffffffffffffffffffffffffffffff166118c2611872565b73ffffffffffffffffffffffffffffffffffffffff1614611918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190f90614a4e565b60405180910390fd5b600b60009054906101000a900460ff1615611968576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195f9061490e565b60405180910390fd5b8082101561197557600080fd5b82600c8190555081600a819055508060098190555042600d819055506001600b60006101000a81548160ff021916908315150217905550600d54837f2570491ac8178c3181c3c9e0f9375f6327b00b966fd6525b1f4df652079dfe5160405160405180910390a3505050565b60116020528060005260406000206000915090505481565b606060028054611a0890615207565b80601f0160208091040260200160405190810160405280929190818152602001828054611a3490615207565b8015611a815780601f10611a5657610100808354040283529160200191611a81565b820191906000526020600020905b815481529060010190602001808311611a6457829003601f168201915b5050505050905090565b6000600b60009054906101000a900460ff16611aaa5760009050611b21565b6000611ab4613208565b9050600c548110611aca57600954915050611b21565b600081600c54600a54600954611ae0919061506d565b611aea9190614e61565b611af49190614efc565b600a54611b019190614d77565b905060008190506009548111611b1957600954611b1b565b805b93505050505b90565b611b2c61322e565b6000611b366110a6565b90506000611b42611a8b565b905060008382611b529190615013565b9050600b60009054906101000a900460ff16611ba3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9a90614bae565b60405180910390fd5b80341015611be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdd9061496e565b60405180910390fd5b600e548484611bf59190614e0b565b1115611c36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2d906148ae565b60405180910390fd5b611c40338561327e565b80341115611c5e57611c5d338234611c589190615101565b61329c565b5b83601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cad9190614e0b565b9250508190555080601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d039190614e0b565b925050819055508360136000828254611d1c9190614e0b565b92505081905550505050611d2e613390565b50565b611d3961290e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9e90614a6e565b60405180910390fd5b8060066000611db461290e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e6161290e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ea691906147f1565b60405180910390a35050565b60135481565b611ec061290e565b73ffffffffffffffffffffffffffffffffffffffff16611ede611872565b73ffffffffffffffffffffffffffffffffffffffff1614611f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2b90614a4e565b60405180910390fd5b80600f9080519060200190611f4a929190613ad3565b5050565b611f5661290e565b73ffffffffffffffffffffffffffffffffffffffff16611f74611872565b73ffffffffffffffffffffffffffffffffffffffff1614611fca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc190614a4e565b60405180910390fd5b6000611fd46110a6565b9050600e548383905082611fe89190614e0b565b1115612029576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612020906148ee565b60405180910390fd5b60005b8383905081101561207c5761206984848381811061204d5761204c61537b565b5b90506020020160208101906120629190613d64565b600161327e565b80806120749061526a565b91505061202c565b50505050565b61208d848484612a68565b6120998484848461339a565b6120d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cf90614b0e565b60405180910390fd5b50505050565b60008060125411612124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211b9061484e565b60405180910390fd5b601254601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121719190615013565b601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121bb9190615101565b9050919050565b6121ca61290e565b73ffffffffffffffffffffffffffffffffffffffff166121e8611872565b73ffffffffffffffffffffffffffffffffffffffff161461223e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223590614a4e565b60405180910390fd5b600b60009054906101000a900460ff1661228d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228490614b2e565b60405180910390fd5b6000612297611a8b565b905060006122a3613208565b90506000600d819055506000600b60006101000a81548160ff02191690831515021790555080827f53e4dda2cb7ca4ddd22867c78399091df1b9203b68512773f51282a3b0d966b660405160405180910390a35050565b6060601480548060200260200160405190810160405280929190818152602001828054801561234857602002820191906000526020600020905b815481526020019060010190808311612334575b5050505050905090565b606061235d82612901565b61239c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239390614ace565b60405180910390fd5b60006123a6613531565b905060008151116123c657604051806020016040528060008152506123f1565b806123d0846135c3565b6040516020016123e1929190614703565b6040516020818303038152906040525b915050919050565b61240161322e565b600b60019054906101000a900460ff16612450576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612447906149ce565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806124bc575061248d611872565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6124fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f290614aae565b60405180910390fd5b6000612506826129c8565b90506000811161254b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125429061486e565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612591573d6000803e3d6000fd5b506000601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050612625613390565b50565b61263061290e565b73ffffffffffffffffffffffffffffffffffffffff1661264e611872565b73ffffffffffffffffffffffffffffffffffffffff16146126a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269b90614a4e565b60405180910390fd5b8060128190555050565b60095481565b60125481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600080600d5414156127655762093a80905061279c565b600c54612770613208565b1061277e576000905061279c565b42600c54600d5461278f9190614e0b565b6127999190615101565b90505b90565b6127a761290e565b73ffffffffffffffffffffffffffffffffffffffff166127c5611872565b73ffffffffffffffffffffffffffffffffffffffff161461281b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281290614a4e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561288b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128829061488e565b60405180910390fd5b61289481613142565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000601254601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a179190615013565b601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a619190615101565b9050919050565b6000612a7382612fa8565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612a9a61290e565b73ffffffffffffffffffffffffffffffffffffffff161480612af65750612abf61290e565b73ffffffffffffffffffffffffffffffffffffffff16612ade84610c65565b73ffffffffffffffffffffffffffffffffffffffff16145b80612b125750612b118260000151612b0c61290e565b6126ba565b5b905080612b54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4b90614a8e565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612bc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bbd90614a2e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612c36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2d9061494e565b60405180910390fd5b612c438585856001613724565b612c536000848460000151612916565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612f3857612e9781612901565b15612f375782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612fa1858585600161372a565b5050505050565b612fb0613b59565b612fb982612901565b612ff8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fef906148ce565b60405180910390fd5b60008290505b60008110613101576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146130f257809250505061313d565b50808060019003915050612ffe565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161313490614c0e565b60405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080600d541161321a576000613229565b600d54426132289190615101565b5b905090565b60026008541415613274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326b90614bee565b60405180910390fd5b6002600881905550565b613298828260405180602001604052806000815250613730565b5050565b804710156132df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132d6906149ae565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161330590614727565b60006040518083038185875af1925050503d8060008114613342576040519150601f19603f3d011682016040523d82523d6000602084013e613347565b606091505b505090508061338b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133829061498e565b60405180910390fd5b505050565b6001600881905550565b60006133bb8473ffffffffffffffffffffffffffffffffffffffff16613742565b15613524578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026133e461290e565b8786866040518563ffffffff1660e01b81526004016134069493929190614783565b602060405180830381600087803b15801561342057600080fd5b505af192505050801561345157506040513d601f19601f8201168201806040525081019061344e9190613ffb565b60015b6134d4573d8060008114613481576040519150601f19603f3d011682016040523d82523d6000602084013e613486565b606091505b506000815114156134cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134c390614b0e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613529565b600190505b949350505050565b6060600f805461354090615207565b80601f016020809104026020016040519081016040528092919081815260200182805461356c90615207565b80156135b95780601f1061358e576101008083540402835291602001916135b9565b820191906000526020600020905b81548152906001019060200180831161359c57829003601f168201915b5050505050905090565b6060600082141561360b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061371f565b600082905060005b6000821461363d5780806136269061526a565b915050600a826136369190614ecb565b9150613613565b60008167ffffffffffffffff811115613659576136586153aa565b5b6040519080825280601f01601f19166020018201604052801561368b5781602001600182028036833780820191505090505b5090505b60008514613718576001826136a49190615101565b9150600a856136b391906152bd565b60306136bf9190614e0b565b60f81b8183815181106136d5576136d461537b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856137119190614ecb565b945061368f565b8093505050505b919050565b50505050565b50505050565b61373d8383836001613755565b505050565b600080823b905060008111915050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156137cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137c290614b6e565b60405180910390fd5b600084141561380f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161380690614b8e565b60405180910390fd5b61381c6000868387613724565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015613ab657818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48315613aa157613a61600088848861339a565b613aa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a9790614b0e565b60405180910390fd5b5b818060010192505080806001019150506139ea565b508060008190555050613acc600086838761372a565b5050505050565b828054613adf90615207565b90600052602060002090601f016020900481019282613b015760008555613b48565b82601f10613b1a57805160ff1916838001178555613b48565b82800160010185558215613b48579182015b82811115613b47578251825591602001919060010190613b2c565b5b509050613b559190613b93565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613bac576000816000905550600101613b94565b5090565b6000613bc3613bbe84614c8e565b614c69565b905082815260208101848484011115613bdf57613bde6153e8565b5b613bea8482856151c5565b509392505050565b6000613c05613c0084614cbf565b614c69565b905082815260208101848484011115613c2157613c206153e8565b5b613c2c8482856151c5565b509392505050565b600081359050613c4381615c26565b92915050565b600081359050613c5881615c3d565b92915050565b60008083601f840112613c7457613c736153de565b5b8235905067ffffffffffffffff811115613c9157613c906153d9565b5b602083019150836020820283011115613cad57613cac6153e3565b5b9250929050565b600081359050613cc381615c54565b92915050565b600081359050613cd881615c6b565b92915050565b600081519050613ced81615c6b565b92915050565b600082601f830112613d0857613d076153de565b5b8135613d18848260208601613bb0565b91505092915050565b600082601f830112613d3657613d356153de565b5b8135613d46848260208601613bf2565b91505092915050565b600081359050613d5e81615c82565b92915050565b600060208284031215613d7a57613d796153f2565b5b6000613d8884828501613c34565b91505092915050565b600060208284031215613da757613da66153f2565b5b6000613db584828501613c49565b91505092915050565b60008060408385031215613dd557613dd46153f2565b5b6000613de385828601613c34565b9250506020613df485828601613c34565b9150509250929050565b600080600060608486031215613e1757613e166153f2565b5b6000613e2586828701613c34565b9350506020613e3686828701613c34565b9250506040613e4786828701613d4f565b9150509250925092565b60008060008060808587031215613e6b57613e6a6153f2565b5b6000613e7987828801613c34565b9450506020613e8a87828801613c34565b9350506040613e9b87828801613d4f565b925050606085013567ffffffffffffffff811115613ebc57613ebb6153ed565b5b613ec887828801613cf3565b91505092959194509250565b60008060408385031215613eeb57613eea6153f2565b5b6000613ef985828601613c34565b9250506020613f0a85828601613cb4565b9150509250929050565b60008060408385031215613f2b57613f2a6153f2565b5b6000613f3985828601613c34565b9250506020613f4a85828601613d4f565b9150509250929050565b60008060208385031215613f6b57613f6a6153f2565b5b600083013567ffffffffffffffff811115613f8957613f886153ed565b5b613f9585828601613c5e565b92509250509250929050565b600060208284031215613fb757613fb66153f2565b5b6000613fc584828501613cb4565b91505092915050565b600060208284031215613fe457613fe36153f2565b5b6000613ff284828501613cc9565b91505092915050565b600060208284031215614011576140106153f2565b5b600061401f84828501613cde565b91505092915050565b60006020828403121561403e5761403d6153f2565b5b600082013567ffffffffffffffff81111561405c5761405b6153ed565b5b61406884828501613d21565b91505092915050565b600060208284031215614087576140866153f2565b5b600061409584828501613d4f565b91505092915050565b6000806000606084860312156140b7576140b66153f2565b5b60006140c586828701613d4f565b93505060206140d686828701613d4f565b92505060406140e786828701613d4f565b9150509250925092565b60006140fd83836146ce565b60208301905092915050565b61411281615135565b82525050565b600061412382614d00565b61412d8185614d2e565b935061413883614cf0565b8060005b8381101561416957815161415088826140f1565b975061415b83614d21565b92505060018101905061413c565b5085935050505092915050565b61417f81615159565b82525050565b600061419082614d0b565b61419a8185614d3f565b93506141aa8185602086016151d4565b6141b3816153f7565b840191505092915050565b60006141c982614d16565b6141d38185614d5b565b93506141e38185602086016151d4565b6141ec816153f7565b840191505092915050565b600061420282614d16565b61420c8185614d6c565b935061421c8185602086016151d4565b80840191505092915050565b6000614235602283614d5b565b915061424082615408565b604082019050919050565b6000614258601c83614d5b565b915061426382615457565b602082019050919050565b600061427b602983614d5b565b915061428682615480565b604082019050919050565b600061429e602683614d5b565b91506142a9826154cf565b604082019050919050565b60006142c1602083614d5b565b91506142cc8261551e565b602082019050919050565b60006142e4602a83614d5b565b91506142ef82615547565b604082019050919050565b6000614307601683614d5b565b915061431282615596565b602082019050919050565b600061432a600f83614d5b565b9150614335826155bf565b602082019050919050565b600061434d602383614d5b565b9150614358826155e8565b604082019050919050565b6000614370602583614d5b565b915061437b82615637565b604082019050919050565b6000614393601f83614d5b565b915061439e82615686565b602082019050919050565b60006143b6603a83614d5b565b91506143c1826156af565b604082019050919050565b60006143d9601d83614d5b565b91506143e4826156fe565b602082019050919050565b60006143fc601c83614d5b565b915061440782615727565b602082019050919050565b600061441f603983614d5b565b915061442a82615750565b604082019050919050565b6000614442602b83614d5b565b915061444d8261579f565b604082019050919050565b6000614465602683614d5b565b9150614470826157ee565b604082019050919050565b6000614488602083614d5b565b91506144938261583d565b602082019050919050565b60006144ab601a83614d5b565b91506144b682615866565b602082019050919050565b60006144ce603283614d5b565b91506144d98261588f565b604082019050919050565b60006144f1602283614d5b565b91506144fc826158de565b604082019050919050565b6000614514601d83614d5b565b915061451f8261592d565b602082019050919050565b6000614537602283614d5b565b915061454282615956565b604082019050919050565b600061455a600083614d50565b9150614565826159a5565b600082019050919050565b600061457d603383614d5b565b9150614588826159a8565b604082019050919050565b60006145a0601483614d5b565b91506145ab826159f7565b602082019050919050565b60006145c3601c83614d5b565b91506145ce82615a20565b602082019050919050565b60006145e6602183614d5b565b91506145f182615a49565b604082019050919050565b6000614609602883614d5b565b915061461482615a98565b604082019050919050565b600061462c601383614d5b565b915061463782615ae7565b602082019050919050565b600061464f602e83614d5b565b915061465a82615b10565b604082019050919050565b6000614672601f83614d5b565b915061467d82615b5f565b602082019050919050565b6000614695602f83614d5b565b91506146a082615b88565b604082019050919050565b60006146b8602d83614d5b565b91506146c382615bd7565b604082019050919050565b6146d7816151bb565b82525050565b6146e6816151bb565b82525050565b6146fd6146f8826151bb565b6152b3565b82525050565b600061470f82856141f7565b915061471b82846141f7565b91508190509392505050565b60006147328261454d565b9150819050919050565b600061474882856146ec565b60208201915061475882846146ec565b6020820191508190509392505050565b600060208201905061477d6000830184614109565b92915050565b60006080820190506147986000830187614109565b6147a56020830186614109565b6147b260408301856146dd565b81810360608301526147c48184614185565b905095945050505050565b600060208201905081810360008301526147e98184614118565b905092915050565b60006020820190506148066000830184614176565b92915050565b6000602082019050818103600083015261482681846141be565b905092915050565b6000602082019050818103600083015261484781614228565b9050919050565b600060208201905081810360008301526148678161424b565b9050919050565b600060208201905081810360008301526148878161426e565b9050919050565b600060208201905081810360008301526148a781614291565b9050919050565b600060208201905081810360008301526148c7816142b4565b9050919050565b600060208201905081810360008301526148e7816142d7565b9050919050565b60006020820190508181036000830152614907816142fa565b9050919050565b600060208201905081810360008301526149278161431d565b9050919050565b6000602082019050818103600083015261494781614340565b9050919050565b6000602082019050818103600083015261496781614363565b9050919050565b6000602082019050818103600083015261498781614386565b9050919050565b600060208201905081810360008301526149a7816143a9565b9050919050565b600060208201905081810360008301526149c7816143cc565b9050919050565b600060208201905081810360008301526149e7816143ef565b9050919050565b60006020820190508181036000830152614a0781614412565b9050919050565b60006020820190508181036000830152614a2781614435565b9050919050565b60006020820190508181036000830152614a4781614458565b9050919050565b60006020820190508181036000830152614a678161447b565b9050919050565b60006020820190508181036000830152614a878161449e565b9050919050565b60006020820190508181036000830152614aa7816144c1565b9050919050565b60006020820190508181036000830152614ac7816144e4565b9050919050565b60006020820190508181036000830152614ae781614507565b9050919050565b60006020820190508181036000830152614b078161452a565b9050919050565b60006020820190508181036000830152614b2781614570565b9050919050565b60006020820190508181036000830152614b4781614593565b9050919050565b60006020820190508181036000830152614b67816145b6565b9050919050565b60006020820190508181036000830152614b87816145d9565b9050919050565b60006020820190508181036000830152614ba7816145fc565b9050919050565b60006020820190508181036000830152614bc78161461f565b9050919050565b60006020820190508181036000830152614be781614642565b9050919050565b60006020820190508181036000830152614c0781614665565b9050919050565b60006020820190508181036000830152614c2781614688565b9050919050565b60006020820190508181036000830152614c47816146ab565b9050919050565b6000602082019050614c6360008301846146dd565b92915050565b6000614c73614c84565b9050614c7f8282615239565b919050565b6000604051905090565b600067ffffffffffffffff821115614ca957614ca86153aa565b5b614cb2826153f7565b9050602081019050919050565b600067ffffffffffffffff821115614cda57614cd96153aa565b5b614ce3826153f7565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614d8282615191565b9150614d8d83615191565b9250817f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03831360008312151615614dc857614dc76152ee565b5b817f8000000000000000000000000000000000000000000000000000000000000000038312600083121615614e0057614dff6152ee565b5b828201905092915050565b6000614e16826151bb565b9150614e21836151bb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614e5657614e556152ee565b5b828201905092915050565b6000614e6c82615191565b9150614e7783615191565b925082614e8757614e8661531d565b5b600160000383147f800000000000000000000000000000000000000000000000000000000000000083141615614ec057614ebf6152ee565b5b828205905092915050565b6000614ed6826151bb565b9150614ee1836151bb565b925082614ef157614ef061531d565b5b828204905092915050565b6000614f0782615191565b9150614f1283615191565b9250827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482116000841360008413161615614f5157614f506152ee565b5b817f80000000000000000000000000000000000000000000000000000000000000000583126000841260008413161615614f8e57614f8d6152ee565b5b827f80000000000000000000000000000000000000000000000000000000000000000582126000841360008412161615614fcb57614fca6152ee565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0582126000841260008412161615615008576150076152ee565b5b828202905092915050565b600061501e826151bb565b9150615029836151bb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615062576150616152ee565b5b828202905092915050565b600061507882615191565b915061508383615191565b9250827f8000000000000000000000000000000000000000000000000000000000000000018212600084121516156150be576150bd6152ee565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0182136000841216156150f6576150f56152ee565b5b828203905092915050565b600061510c826151bb565b9150615117836151bb565b92508282101561512a576151296152ee565b5b828203905092915050565b60006151408261519b565b9050919050565b60006151528261519b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156151f25780820151818401526020810190506151d7565b83811115615201576000848401525b50505050565b6000600282049050600182168061521f57607f821691505b602082108114156152335761523261534c565b5b50919050565b615242826153f7565b810181811067ffffffffffffffff82111715615261576152606153aa565b5b80604052505050565b6000615275826151bb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156152a8576152a76152ee565b5b600182019050919050565b6000819050919050565b60006152c8826151bb565b91506152d3836151bb565b9250826152e3576152e261531d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f52657365727665207072696365206973206e6f74207365742079657400000000600082015250565b7f546869732061646472657373206973206e6f7420656c696769626c6520666f7260008201527f206120726566756e640000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f436f6c6c656374696f6e20697320536f6c64204f757400000000000000000000600082015250565b7f41756374696f6e206973206c6976650000000000000000000000000000000000600082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f526566756e647320617265206e6f742063757272656e746c79206f6e00000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f596f7520617265206e6f742074686520726563657069656e74206f72206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f546f6b656e20686173206e6f74206265656e206d696e74656420796574000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f41756374696f6e206973206e6f74206c69766965000000000000000000000000600082015250565b7f52657365727665205072696365206973206e6f74207365742079657400000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b7f41756374696f6e206973206e6f74206c69766500000000000000000000000000600082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b615c2f81615135565b8114615c3a57600080fd5b50565b615c4681615147565b8114615c5157600080fd5b50565b615c5d81615159565b8114615c6857600080fd5b50565b615c7481615165565b8114615c7f57600080fd5b50565b615c8b816151bb565b8114615c9657600080fd5b5056fea2646970667358221220a3760187056d585a817ff630ed0427162a0784b5690c45739fb3902ee78a43a264736f6c63430008070033

Deployed Bytecode

0x60806040526004361061027d5760003560e01c80638afa46b11161014f578063b88d4fde116100c1578063ce9c7c0d1161007a578063ce9c7c0d14610979578063da460977146109a2578063dd21d604146109cd578063e985e9c5146109f8578063efb98bcf14610a35578063f2fde38b14610a605761027d565b8063b88d4fde1461086b578063b972110214610894578063b9ae7364146108d1578063c1f4997c146108e8578063c87b56dd14610913578063cae4d676146109505761027d565b806398d5fdca1161011357806398d5fdca1461077e578063a0712d68146107a9578063a22cb465146107c5578063a2309ff8146107ee578063a49a1e7d14610819578063b2542e28146108425761027d565b80638afa46b1146106975780638da5cb5b146106c257806391e078bb146106ed578063934f70e61461071657806395d89b41146107535761027d565b80633711d9fb116101f35780635a9c6272116101ac5780635a9c6272146105755780636352211e1461059e578063644f7670146105db5780636f9fb98a1461061857806370a0823114610643578063715018a6146106805761027d565b80633711d9fb1461048b57806339371b25146104b65780633ccfd60b146104e15780633f4764f7146104f857806342842e0e1461050f5780634f6ccce7146105385761027d565b806318160ddd1161024557806318160ddd146103795780631cbaee2d146103a4578063200d2ed2146103cf57806323b872dd146103fa5780632f745c59146104235780633609ac8f146104605761027d565b806301ffc9a71461028257806306fdde03146102bf578063081812fc146102ea578063095ea7b3146103275780631491323814610350575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a49190613fce565b610a89565b6040516102b691906147f1565b60405180910390f35b3480156102cb57600080fd5b506102d4610bd3565b6040516102e1919061480c565b60405180910390f35b3480156102f657600080fd5b50610311600480360381019061030c9190614071565b610c65565b60405161031e9190614768565b60405180910390f35b34801561033357600080fd5b5061034e60048036038101906103499190613f14565b610cea565b005b34801561035c57600080fd5b5061037760048036038101906103729190613f54565b610e03565b005b34801561038557600080fd5b5061038e6110a6565b60405161039b9190614c4e565b60405180910390f35b3480156103b057600080fd5b506103b96110af565b6040516103c69190614c4e565b60405180910390f35b3480156103db57600080fd5b506103e46110b5565b6040516103f191906147f1565b60405180910390f35b34801561040657600080fd5b50610421600480360381019061041c9190613dfe565b6110c8565b005b34801561042f57600080fd5b5061044a60048036038101906104459190613f14565b6110d8565b6040516104579190614c4e565b60405180910390f35b34801561046c57600080fd5b506104756112ca565b6040516104829190614c4e565b60405180910390f35b34801561049757600080fd5b506104a06112d0565b6040516104ad9190614c4e565b60405180910390f35b3480156104c257600080fd5b506104cb6112d6565b6040516104d8919061480c565b60405180910390f35b3480156104ed57600080fd5b506104f6611364565b005b34801561050457600080fd5b5061050d61148a565b005b34801561051b57600080fd5b5061053660048036038101906105319190613dfe565b6115ac565b005b34801561054457600080fd5b5061055f600480360381019061055a9190614071565b6115cc565b60405161056c9190614c4e565b60405180910390f35b34801561058157600080fd5b5061059c60048036038101906105979190613fa1565b61161f565b005b3480156105aa57600080fd5b506105c560048036038101906105c09190614071565b6116b8565b6040516105d29190614768565b60405180910390f35b3480156105e757600080fd5b5061060260048036038101906105fd9190613d64565b6116ce565b60405161060f9190614c4e565b60405180910390f35b34801561062457600080fd5b5061062d6116e6565b60405161063a9190614c4e565b60405180910390f35b34801561064f57600080fd5b5061066a60048036038101906106659190613d64565b6116ee565b6040516106779190614c4e565b60405180910390f35b34801561068c57600080fd5b506106956117d7565b005b3480156106a357600080fd5b506106ac61185f565b6040516106b991906147f1565b60405180910390f35b3480156106ce57600080fd5b506106d7611872565b6040516106e49190614768565b60405180910390f35b3480156106f957600080fd5b50610714600480360381019061070f919061409e565b61189c565b005b34801561072257600080fd5b5061073d60048036038101906107389190613d64565b6119e1565b60405161074a9190614c4e565b60405180910390f35b34801561075f57600080fd5b506107686119f9565b604051610775919061480c565b60405180910390f35b34801561078a57600080fd5b50610793611a8b565b6040516107a09190614c4e565b60405180910390f35b6107c360048036038101906107be9190614071565b611b24565b005b3480156107d157600080fd5b506107ec60048036038101906107e79190613ed4565b611d31565b005b3480156107fa57600080fd5b50610803611eb2565b6040516108109190614c4e565b60405180910390f35b34801561082557600080fd5b50610840600480360381019061083b9190614028565b611eb8565b005b34801561084e57600080fd5b5061086960048036038101906108649190613f54565b611f4e565b005b34801561087757600080fd5b50610892600480360381019061088d9190613e51565b612082565b005b3480156108a057600080fd5b506108bb60048036038101906108b69190613d64565b6120de565b6040516108c89190614c4e565b60405180910390f35b3480156108dd57600080fd5b506108e66121c2565b005b3480156108f457600080fd5b506108fd6122fa565b60405161090a91906147cf565b60405180910390f35b34801561091f57600080fd5b5061093a60048036038101906109359190614071565b612352565b604051610947919061480c565b60405180910390f35b34801561095c57600080fd5b5061097760048036038101906109729190613d91565b6123f9565b005b34801561098557600080fd5b506109a0600480360381019061099b9190614071565b612628565b005b3480156109ae57600080fd5b506109b76126ae565b6040516109c49190614c4e565b60405180910390f35b3480156109d957600080fd5b506109e26126b4565b6040516109ef9190614c4e565b60405180910390f35b348015610a0457600080fd5b50610a1f6004803603810190610a1a9190613dbe565b6126ba565b604051610a2c91906147f1565b60405180910390f35b348015610a4157600080fd5b50610a4a61274e565b604051610a579190614c4e565b60405180910390f35b348015610a6c57600080fd5b50610a876004803603810190610a829190613d64565b61279f565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b5457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610bbc57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610bcc5750610bcb82612897565b5b9050919050565b606060018054610be290615207565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0e90615207565b8015610c5b5780601f10610c3057610100808354040283529160200191610c5b565b820191906000526020600020905b815481529060010190602001808311610c3e57829003601f168201915b5050505050905090565b6000610c7082612901565b610caf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca690614c2e565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cf5826116b8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5d90614aee565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d8561290e565b73ffffffffffffffffffffffffffffffffffffffff161480610db45750610db381610dae61290e565b6126ba565b5b610df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dea906149ee565b60405180910390fd5b610dfe838383612916565b505050565b610e0b61290e565b73ffffffffffffffffffffffffffffffffffffffff16610e29611872565b73ffffffffffffffffffffffffffffffffffffffff1614610e7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7690614a4e565b60405180910390fd5b600060125411610ec4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebb9061484e565b60405180910390fd5b60005b828290508110156110a1576000610f04848484818110610eea57610ee961537b565b5b9050602002016020810190610eff9190613d64565b6129c8565b905060008111610f49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f409061486e565b60405180910390fd5b838383818110610f5c57610f5b61537b565b5b9050602002016020810190610f719190613d64565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610fb6573d6000803e3d6000fd5b50600060116000868686818110610fd057610fcf61537b565b5b9050602002016020810190610fe59190613d64565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060006010600086868681811061103c5761103b61537b565b5b90506020020160208101906110519190613d64565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550508061109a9061526a565b9050610ec7565b505050565b60008054905090565b600d5481565b600b60009054906101000a900460ff1681565b6110d3838383612a68565b505050565b60006110e3836116ee565b8210611124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111b9061482e565b60405180910390fd5b600061112e6110a6565b905060008060005b83811015611288576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461122857806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561127a57868414156112715781955050505050506112c4565b83806001019450505b508080600101915050611136565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bb90614bce565b60405180910390fd5b92915050565b600a5481565b600c5481565b600f80546112e390615207565b80601f016020809104026020016040519081016040528092919081815260200182805461130f90615207565b801561135c5780601f106113315761010080835404028352916020019161135c565b820191906000526020600020905b81548152906001019060200180831161133f57829003601f168201915b505050505081565b61136c61290e565b73ffffffffffffffffffffffffffffffffffffffff1661138a611872565b73ffffffffffffffffffffffffffffffffffffffff16146113e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d790614a4e565b60405180910390fd5b600060125411611425576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141c90614b4e565b60405180910390fd5b60006012546013546114379190615013565b9050611441611872565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611486573d6000803e3d6000fd5b5050565b61149261290e565b73ffffffffffffffffffffffffffffffffffffffff166114b0611872565b73ffffffffffffffffffffffffffffffffffffffff1614611506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fd90614a4e565b60405180910390fd5b60006002905060005b818110156115a85760006049905060006019905060008183428660405160200161153a92919061473c565b6040516020818303038152906040528051906020012060001c61155d91906152bd565b6115679190614e0b565b9050601481908060018154018082558091505060019003906000526020600020016000909190919091505550505080806115a09061526a565b91505061150f565b5050565b6115c783838360405180602001604052806000815250612082565b505050565b60006115d66110a6565b8210611617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160e9061492e565b60405180910390fd5b819050919050565b61162761290e565b73ffffffffffffffffffffffffffffffffffffffff16611645611872565b73ffffffffffffffffffffffffffffffffffffffff161461169b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169290614a4e565b60405180910390fd5b80600b60016101000a81548160ff02191690831515021790555050565b60006116c382612fa8565b600001519050919050565b60106020528060005260406000206000915090505481565b600047905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561175f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175690614a0e565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6117df61290e565b73ffffffffffffffffffffffffffffffffffffffff166117fd611872565b73ffffffffffffffffffffffffffffffffffffffff1614611853576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184a90614a4e565b60405180910390fd5b61185d6000613142565b565b600b60019054906101000a900460ff1681565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6118a461290e565b73ffffffffffffffffffffffffffffffffffffffff166118c2611872565b73ffffffffffffffffffffffffffffffffffffffff1614611918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190f90614a4e565b60405180910390fd5b600b60009054906101000a900460ff1615611968576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195f9061490e565b60405180910390fd5b8082101561197557600080fd5b82600c8190555081600a819055508060098190555042600d819055506001600b60006101000a81548160ff021916908315150217905550600d54837f2570491ac8178c3181c3c9e0f9375f6327b00b966fd6525b1f4df652079dfe5160405160405180910390a3505050565b60116020528060005260406000206000915090505481565b606060028054611a0890615207565b80601f0160208091040260200160405190810160405280929190818152602001828054611a3490615207565b8015611a815780601f10611a5657610100808354040283529160200191611a81565b820191906000526020600020905b815481529060010190602001808311611a6457829003601f168201915b5050505050905090565b6000600b60009054906101000a900460ff16611aaa5760009050611b21565b6000611ab4613208565b9050600c548110611aca57600954915050611b21565b600081600c54600a54600954611ae0919061506d565b611aea9190614e61565b611af49190614efc565b600a54611b019190614d77565b905060008190506009548111611b1957600954611b1b565b805b93505050505b90565b611b2c61322e565b6000611b366110a6565b90506000611b42611a8b565b905060008382611b529190615013565b9050600b60009054906101000a900460ff16611ba3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9a90614bae565b60405180910390fd5b80341015611be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdd9061496e565b60405180910390fd5b600e548484611bf59190614e0b565b1115611c36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2d906148ae565b60405180910390fd5b611c40338561327e565b80341115611c5e57611c5d338234611c589190615101565b61329c565b5b83601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cad9190614e0b565b9250508190555080601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d039190614e0b565b925050819055508360136000828254611d1c9190614e0b565b92505081905550505050611d2e613390565b50565b611d3961290e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9e90614a6e565b60405180910390fd5b8060066000611db461290e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e6161290e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ea691906147f1565b60405180910390a35050565b60135481565b611ec061290e565b73ffffffffffffffffffffffffffffffffffffffff16611ede611872565b73ffffffffffffffffffffffffffffffffffffffff1614611f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2b90614a4e565b60405180910390fd5b80600f9080519060200190611f4a929190613ad3565b5050565b611f5661290e565b73ffffffffffffffffffffffffffffffffffffffff16611f74611872565b73ffffffffffffffffffffffffffffffffffffffff1614611fca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc190614a4e565b60405180910390fd5b6000611fd46110a6565b9050600e548383905082611fe89190614e0b565b1115612029576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612020906148ee565b60405180910390fd5b60005b8383905081101561207c5761206984848381811061204d5761204c61537b565b5b90506020020160208101906120629190613d64565b600161327e565b80806120749061526a565b91505061202c565b50505050565b61208d848484612a68565b6120998484848461339a565b6120d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cf90614b0e565b60405180910390fd5b50505050565b60008060125411612124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211b9061484e565b60405180910390fd5b601254601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121719190615013565b601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121bb9190615101565b9050919050565b6121ca61290e565b73ffffffffffffffffffffffffffffffffffffffff166121e8611872565b73ffffffffffffffffffffffffffffffffffffffff161461223e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223590614a4e565b60405180910390fd5b600b60009054906101000a900460ff1661228d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228490614b2e565b60405180910390fd5b6000612297611a8b565b905060006122a3613208565b90506000600d819055506000600b60006101000a81548160ff02191690831515021790555080827f53e4dda2cb7ca4ddd22867c78399091df1b9203b68512773f51282a3b0d966b660405160405180910390a35050565b6060601480548060200260200160405190810160405280929190818152602001828054801561234857602002820191906000526020600020905b815481526020019060010190808311612334575b5050505050905090565b606061235d82612901565b61239c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239390614ace565b60405180910390fd5b60006123a6613531565b905060008151116123c657604051806020016040528060008152506123f1565b806123d0846135c3565b6040516020016123e1929190614703565b6040516020818303038152906040525b915050919050565b61240161322e565b600b60019054906101000a900460ff16612450576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612447906149ce565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806124bc575061248d611872565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6124fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f290614aae565b60405180910390fd5b6000612506826129c8565b90506000811161254b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125429061486e565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612591573d6000803e3d6000fd5b506000601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050612625613390565b50565b61263061290e565b73ffffffffffffffffffffffffffffffffffffffff1661264e611872565b73ffffffffffffffffffffffffffffffffffffffff16146126a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269b90614a4e565b60405180910390fd5b8060128190555050565b60095481565b60125481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600080600d5414156127655762093a80905061279c565b600c54612770613208565b1061277e576000905061279c565b42600c54600d5461278f9190614e0b565b6127999190615101565b90505b90565b6127a761290e565b73ffffffffffffffffffffffffffffffffffffffff166127c5611872565b73ffffffffffffffffffffffffffffffffffffffff161461281b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281290614a4e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561288b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128829061488e565b60405180910390fd5b61289481613142565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000601254601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a179190615013565b601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a619190615101565b9050919050565b6000612a7382612fa8565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612a9a61290e565b73ffffffffffffffffffffffffffffffffffffffff161480612af65750612abf61290e565b73ffffffffffffffffffffffffffffffffffffffff16612ade84610c65565b73ffffffffffffffffffffffffffffffffffffffff16145b80612b125750612b118260000151612b0c61290e565b6126ba565b5b905080612b54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4b90614a8e565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612bc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bbd90614a2e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612c36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2d9061494e565b60405180910390fd5b612c438585856001613724565b612c536000848460000151612916565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612f3857612e9781612901565b15612f375782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612fa1858585600161372a565b5050505050565b612fb0613b59565b612fb982612901565b612ff8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fef906148ce565b60405180910390fd5b60008290505b60008110613101576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146130f257809250505061313d565b50808060019003915050612ffe565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161313490614c0e565b60405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080600d541161321a576000613229565b600d54426132289190615101565b5b905090565b60026008541415613274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326b90614bee565b60405180910390fd5b6002600881905550565b613298828260405180602001604052806000815250613730565b5050565b804710156132df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132d6906149ae565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161330590614727565b60006040518083038185875af1925050503d8060008114613342576040519150601f19603f3d011682016040523d82523d6000602084013e613347565b606091505b505090508061338b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133829061498e565b60405180910390fd5b505050565b6001600881905550565b60006133bb8473ffffffffffffffffffffffffffffffffffffffff16613742565b15613524578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026133e461290e565b8786866040518563ffffffff1660e01b81526004016134069493929190614783565b602060405180830381600087803b15801561342057600080fd5b505af192505050801561345157506040513d601f19601f8201168201806040525081019061344e9190613ffb565b60015b6134d4573d8060008114613481576040519150601f19603f3d011682016040523d82523d6000602084013e613486565b606091505b506000815114156134cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134c390614b0e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613529565b600190505b949350505050565b6060600f805461354090615207565b80601f016020809104026020016040519081016040528092919081815260200182805461356c90615207565b80156135b95780601f1061358e576101008083540402835291602001916135b9565b820191906000526020600020905b81548152906001019060200180831161359c57829003601f168201915b5050505050905090565b6060600082141561360b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061371f565b600082905060005b6000821461363d5780806136269061526a565b915050600a826136369190614ecb565b9150613613565b60008167ffffffffffffffff811115613659576136586153aa565b5b6040519080825280601f01601f19166020018201604052801561368b5781602001600182028036833780820191505090505b5090505b60008514613718576001826136a49190615101565b9150600a856136b391906152bd565b60306136bf9190614e0b565b60f81b8183815181106136d5576136d461537b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856137119190614ecb565b945061368f565b8093505050505b919050565b50505050565b50505050565b61373d8383836001613755565b505050565b600080823b905060008111915050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156137cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137c290614b6e565b60405180910390fd5b600084141561380f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161380690614b8e565b60405180910390fd5b61381c6000868387613724565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015613ab657818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48315613aa157613a61600088848861339a565b613aa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a9790614b0e565b60405180910390fd5b5b818060010192505080806001019150506139ea565b508060008190555050613acc600086838761372a565b5050505050565b828054613adf90615207565b90600052602060002090601f016020900481019282613b015760008555613b48565b82601f10613b1a57805160ff1916838001178555613b48565b82800160010185558215613b48579182015b82811115613b47578251825591602001919060010190613b2c565b5b509050613b559190613b93565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613bac576000816000905550600101613b94565b5090565b6000613bc3613bbe84614c8e565b614c69565b905082815260208101848484011115613bdf57613bde6153e8565b5b613bea8482856151c5565b509392505050565b6000613c05613c0084614cbf565b614c69565b905082815260208101848484011115613c2157613c206153e8565b5b613c2c8482856151c5565b509392505050565b600081359050613c4381615c26565b92915050565b600081359050613c5881615c3d565b92915050565b60008083601f840112613c7457613c736153de565b5b8235905067ffffffffffffffff811115613c9157613c906153d9565b5b602083019150836020820283011115613cad57613cac6153e3565b5b9250929050565b600081359050613cc381615c54565b92915050565b600081359050613cd881615c6b565b92915050565b600081519050613ced81615c6b565b92915050565b600082601f830112613d0857613d076153de565b5b8135613d18848260208601613bb0565b91505092915050565b600082601f830112613d3657613d356153de565b5b8135613d46848260208601613bf2565b91505092915050565b600081359050613d5e81615c82565b92915050565b600060208284031215613d7a57613d796153f2565b5b6000613d8884828501613c34565b91505092915050565b600060208284031215613da757613da66153f2565b5b6000613db584828501613c49565b91505092915050565b60008060408385031215613dd557613dd46153f2565b5b6000613de385828601613c34565b9250506020613df485828601613c34565b9150509250929050565b600080600060608486031215613e1757613e166153f2565b5b6000613e2586828701613c34565b9350506020613e3686828701613c34565b9250506040613e4786828701613d4f565b9150509250925092565b60008060008060808587031215613e6b57613e6a6153f2565b5b6000613e7987828801613c34565b9450506020613e8a87828801613c34565b9350506040613e9b87828801613d4f565b925050606085013567ffffffffffffffff811115613ebc57613ebb6153ed565b5b613ec887828801613cf3565b91505092959194509250565b60008060408385031215613eeb57613eea6153f2565b5b6000613ef985828601613c34565b9250506020613f0a85828601613cb4565b9150509250929050565b60008060408385031215613f2b57613f2a6153f2565b5b6000613f3985828601613c34565b9250506020613f4a85828601613d4f565b9150509250929050565b60008060208385031215613f6b57613f6a6153f2565b5b600083013567ffffffffffffffff811115613f8957613f886153ed565b5b613f9585828601613c5e565b92509250509250929050565b600060208284031215613fb757613fb66153f2565b5b6000613fc584828501613cb4565b91505092915050565b600060208284031215613fe457613fe36153f2565b5b6000613ff284828501613cc9565b91505092915050565b600060208284031215614011576140106153f2565b5b600061401f84828501613cde565b91505092915050565b60006020828403121561403e5761403d6153f2565b5b600082013567ffffffffffffffff81111561405c5761405b6153ed565b5b61406884828501613d21565b91505092915050565b600060208284031215614087576140866153f2565b5b600061409584828501613d4f565b91505092915050565b6000806000606084860312156140b7576140b66153f2565b5b60006140c586828701613d4f565b93505060206140d686828701613d4f565b92505060406140e786828701613d4f565b9150509250925092565b60006140fd83836146ce565b60208301905092915050565b61411281615135565b82525050565b600061412382614d00565b61412d8185614d2e565b935061413883614cf0565b8060005b8381101561416957815161415088826140f1565b975061415b83614d21565b92505060018101905061413c565b5085935050505092915050565b61417f81615159565b82525050565b600061419082614d0b565b61419a8185614d3f565b93506141aa8185602086016151d4565b6141b3816153f7565b840191505092915050565b60006141c982614d16565b6141d38185614d5b565b93506141e38185602086016151d4565b6141ec816153f7565b840191505092915050565b600061420282614d16565b61420c8185614d6c565b935061421c8185602086016151d4565b80840191505092915050565b6000614235602283614d5b565b915061424082615408565b604082019050919050565b6000614258601c83614d5b565b915061426382615457565b602082019050919050565b600061427b602983614d5b565b915061428682615480565b604082019050919050565b600061429e602683614d5b565b91506142a9826154cf565b604082019050919050565b60006142c1602083614d5b565b91506142cc8261551e565b602082019050919050565b60006142e4602a83614d5b565b91506142ef82615547565b604082019050919050565b6000614307601683614d5b565b915061431282615596565b602082019050919050565b600061432a600f83614d5b565b9150614335826155bf565b602082019050919050565b600061434d602383614d5b565b9150614358826155e8565b604082019050919050565b6000614370602583614d5b565b915061437b82615637565b604082019050919050565b6000614393601f83614d5b565b915061439e82615686565b602082019050919050565b60006143b6603a83614d5b565b91506143c1826156af565b604082019050919050565b60006143d9601d83614d5b565b91506143e4826156fe565b602082019050919050565b60006143fc601c83614d5b565b915061440782615727565b602082019050919050565b600061441f603983614d5b565b915061442a82615750565b604082019050919050565b6000614442602b83614d5b565b915061444d8261579f565b604082019050919050565b6000614465602683614d5b565b9150614470826157ee565b604082019050919050565b6000614488602083614d5b565b91506144938261583d565b602082019050919050565b60006144ab601a83614d5b565b91506144b682615866565b602082019050919050565b60006144ce603283614d5b565b91506144d98261588f565b604082019050919050565b60006144f1602283614d5b565b91506144fc826158de565b604082019050919050565b6000614514601d83614d5b565b915061451f8261592d565b602082019050919050565b6000614537602283614d5b565b915061454282615956565b604082019050919050565b600061455a600083614d50565b9150614565826159a5565b600082019050919050565b600061457d603383614d5b565b9150614588826159a8565b604082019050919050565b60006145a0601483614d5b565b91506145ab826159f7565b602082019050919050565b60006145c3601c83614d5b565b91506145ce82615a20565b602082019050919050565b60006145e6602183614d5b565b91506145f182615a49565b604082019050919050565b6000614609602883614d5b565b915061461482615a98565b604082019050919050565b600061462c601383614d5b565b915061463782615ae7565b602082019050919050565b600061464f602e83614d5b565b915061465a82615b10565b604082019050919050565b6000614672601f83614d5b565b915061467d82615b5f565b602082019050919050565b6000614695602f83614d5b565b91506146a082615b88565b604082019050919050565b60006146b8602d83614d5b565b91506146c382615bd7565b604082019050919050565b6146d7816151bb565b82525050565b6146e6816151bb565b82525050565b6146fd6146f8826151bb565b6152b3565b82525050565b600061470f82856141f7565b915061471b82846141f7565b91508190509392505050565b60006147328261454d565b9150819050919050565b600061474882856146ec565b60208201915061475882846146ec565b6020820191508190509392505050565b600060208201905061477d6000830184614109565b92915050565b60006080820190506147986000830187614109565b6147a56020830186614109565b6147b260408301856146dd565b81810360608301526147c48184614185565b905095945050505050565b600060208201905081810360008301526147e98184614118565b905092915050565b60006020820190506148066000830184614176565b92915050565b6000602082019050818103600083015261482681846141be565b905092915050565b6000602082019050818103600083015261484781614228565b9050919050565b600060208201905081810360008301526148678161424b565b9050919050565b600060208201905081810360008301526148878161426e565b9050919050565b600060208201905081810360008301526148a781614291565b9050919050565b600060208201905081810360008301526148c7816142b4565b9050919050565b600060208201905081810360008301526148e7816142d7565b9050919050565b60006020820190508181036000830152614907816142fa565b9050919050565b600060208201905081810360008301526149278161431d565b9050919050565b6000602082019050818103600083015261494781614340565b9050919050565b6000602082019050818103600083015261496781614363565b9050919050565b6000602082019050818103600083015261498781614386565b9050919050565b600060208201905081810360008301526149a7816143a9565b9050919050565b600060208201905081810360008301526149c7816143cc565b9050919050565b600060208201905081810360008301526149e7816143ef565b9050919050565b60006020820190508181036000830152614a0781614412565b9050919050565b60006020820190508181036000830152614a2781614435565b9050919050565b60006020820190508181036000830152614a4781614458565b9050919050565b60006020820190508181036000830152614a678161447b565b9050919050565b60006020820190508181036000830152614a878161449e565b9050919050565b60006020820190508181036000830152614aa7816144c1565b9050919050565b60006020820190508181036000830152614ac7816144e4565b9050919050565b60006020820190508181036000830152614ae781614507565b9050919050565b60006020820190508181036000830152614b078161452a565b9050919050565b60006020820190508181036000830152614b2781614570565b9050919050565b60006020820190508181036000830152614b4781614593565b9050919050565b60006020820190508181036000830152614b67816145b6565b9050919050565b60006020820190508181036000830152614b87816145d9565b9050919050565b60006020820190508181036000830152614ba7816145fc565b9050919050565b60006020820190508181036000830152614bc78161461f565b9050919050565b60006020820190508181036000830152614be781614642565b9050919050565b60006020820190508181036000830152614c0781614665565b9050919050565b60006020820190508181036000830152614c2781614688565b9050919050565b60006020820190508181036000830152614c47816146ab565b9050919050565b6000602082019050614c6360008301846146dd565b92915050565b6000614c73614c84565b9050614c7f8282615239565b919050565b6000604051905090565b600067ffffffffffffffff821115614ca957614ca86153aa565b5b614cb2826153f7565b9050602081019050919050565b600067ffffffffffffffff821115614cda57614cd96153aa565b5b614ce3826153f7565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614d8282615191565b9150614d8d83615191565b9250817f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03831360008312151615614dc857614dc76152ee565b5b817f8000000000000000000000000000000000000000000000000000000000000000038312600083121615614e0057614dff6152ee565b5b828201905092915050565b6000614e16826151bb565b9150614e21836151bb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614e5657614e556152ee565b5b828201905092915050565b6000614e6c82615191565b9150614e7783615191565b925082614e8757614e8661531d565b5b600160000383147f800000000000000000000000000000000000000000000000000000000000000083141615614ec057614ebf6152ee565b5b828205905092915050565b6000614ed6826151bb565b9150614ee1836151bb565b925082614ef157614ef061531d565b5b828204905092915050565b6000614f0782615191565b9150614f1283615191565b9250827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482116000841360008413161615614f5157614f506152ee565b5b817f80000000000000000000000000000000000000000000000000000000000000000583126000841260008413161615614f8e57614f8d6152ee565b5b827f80000000000000000000000000000000000000000000000000000000000000000582126000841360008412161615614fcb57614fca6152ee565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0582126000841260008412161615615008576150076152ee565b5b828202905092915050565b600061501e826151bb565b9150615029836151bb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615062576150616152ee565b5b828202905092915050565b600061507882615191565b915061508383615191565b9250827f8000000000000000000000000000000000000000000000000000000000000000018212600084121516156150be576150bd6152ee565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0182136000841216156150f6576150f56152ee565b5b828203905092915050565b600061510c826151bb565b9150615117836151bb565b92508282101561512a576151296152ee565b5b828203905092915050565b60006151408261519b565b9050919050565b60006151528261519b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156151f25780820151818401526020810190506151d7565b83811115615201576000848401525b50505050565b6000600282049050600182168061521f57607f821691505b602082108114156152335761523261534c565b5b50919050565b615242826153f7565b810181811067ffffffffffffffff82111715615261576152606153aa565b5b80604052505050565b6000615275826151bb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156152a8576152a76152ee565b5b600182019050919050565b6000819050919050565b60006152c8826151bb565b91506152d3836151bb565b9250826152e3576152e261531d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f52657365727665207072696365206973206e6f74207365742079657400000000600082015250565b7f546869732061646472657373206973206e6f7420656c696769626c6520666f7260008201527f206120726566756e640000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f436f6c6c656374696f6e20697320536f6c64204f757400000000000000000000600082015250565b7f41756374696f6e206973206c6976650000000000000000000000000000000000600082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f526566756e647320617265206e6f742063757272656e746c79206f6e00000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f596f7520617265206e6f742074686520726563657069656e74206f72206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f546f6b656e20686173206e6f74206265656e206d696e74656420796574000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f41756374696f6e206973206e6f74206c69766965000000000000000000000000600082015250565b7f52657365727665205072696365206973206e6f74207365742079657400000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b7f41756374696f6e206973206e6f74206c69766500000000000000000000000000600082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b615c2f81615135565b8114615c3a57600080fd5b50565b615c4681615147565b8114615c5157600080fd5b50565b615c5d81615159565b8114615c6857600080fd5b50565b615c7481615165565b8114615c7f57600080fd5b50565b615c8b816151bb565b8114615c9657600080fd5b5056fea2646970667358221220a3760187056d585a817ff630ed0427162a0784b5690c45739fb3902ee78a43a264736f6c63430008070033

Deployed Bytecode Sourcemap

50521:9191:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34509:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36395:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37957:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37478:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57496:506;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32766:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51316:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50988:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38833:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33430:1007;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50915:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51184:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51483:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59480:229;;;;;;;;;;;;;:::i;:::-;;58535:353;;;;;;;;;;;;;:::i;:::-;;39066:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32943:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58354:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36204:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51860:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56137:106;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34945:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13942:94;;;;;;;;;;;;;:::i;:::-;;51057:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13291:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52677:409;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52001:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36564:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54662:585;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53501:760;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38243:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52276:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58206:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54315:284;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39314:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56303:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53126:297;;;;;;;;;;;;;:::i;:::-;;58936:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59084:319;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56877:499;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55981:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50789:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52143:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38602:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55510:370;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14191:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34509:372;34611:4;34663:25;34648:40;;;:11;:40;;;;:105;;;;34720:33;34705:48;;;:11;:48;;;;34648:105;:172;;;;34785:35;34770:50;;;:11;:50;;;;34648:172;:225;;;;34837:36;34861:11;34837:23;:36::i;:::-;34648:225;34628:245;;34509:372;;;:::o;36395:100::-;36449:13;36482:5;36475:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36395:100;:::o;37957:214::-;38025:7;38053:16;38061:7;38053;:16::i;:::-;38045:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;38139:15;:24;38155:7;38139:24;;;;;;;;;;;;;;;;;;;;;38132:31;;37957:214;;;:::o;37478:413::-;37551:13;37567:24;37583:7;37567:15;:24::i;:::-;37551:40;;37616:5;37610:11;;:2;:11;;;;37602:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37711:5;37695:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;37720:37;37737:5;37744:12;:10;:12::i;:::-;37720:16;:37::i;:::-;37695:62;37673:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;37855:28;37864:2;37868:7;37877:5;37855:8;:28::i;:::-;37540:351;37478:413;;:::o;57496:506::-;13522:12;:10;:12::i;:::-;13511:23;;:7;:5;:7::i;:::-;:23;;;13503:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57605:1:::1;57589:13;;:17;57581:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;57655:6;57650:345;57671:9;;:16;;57667:1;:20;57650:345;;;57709:15;57727:28;57742:9;;57752:1;57742:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;57727:14;:28::i;:::-;57709:46;;57788:1;57778:7;:11;57770:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;57858:9;;57868:1;57858:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;57850:30;;:39;57881:7;57850:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;57936:1;57904:15;:29;57920:9;;57930:1;57920:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;57904:29;;;;;;;;;;;;;;;:33;;;;57982:1;57952:13;:27;57966:9;;57976:1;57966:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;57952:27;;;;;;;;;;;;;;;:31;;;;57694:301;57689:3;;;;:::i;:::-;;;57650:345;;;;57496:506:::0;;:::o;32766:100::-;32819:7;32846:12;;32839:19;;32766:100;:::o;51316:28::-;;;;:::o;50988:26::-;;;;;;;;;;;;;:::o;38833:162::-;38959:28;38969:4;38975:2;38979:7;38959:9;:28::i;:::-;38833:162;;;:::o;33430:1007::-;33519:7;33555:16;33565:5;33555:9;:16::i;:::-;33547:5;:24;33539:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;33621:22;33646:13;:11;:13::i;:::-;33621:38;;33670:19;33700:25;33889:9;33884:466;33904:14;33900:1;:18;33884:466;;;33944:31;33978:11;:14;33990:1;33978:14;;;;;;;;;;;33944:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34041:1;34015:28;;:9;:14;;;:28;;;34011:111;;34088:9;:14;;;34068:34;;34011:111;34165:5;34144:26;;:17;:26;;;34140:195;;;34214:5;34199:11;:20;34195:85;;;34255:1;34248:8;;;;;;;;;34195:85;34302:13;;;;;;;34140:195;33925:425;33920:3;;;;;;;33884:466;;;;34373:56;;;;;;;;;;:::i;:::-;;;;;;;;33430:1007;;;;;:::o;50915:26::-;;;;:::o;51184:27::-;;;;:::o;51483:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;59480:229::-;13522:12;:10;:12::i;:::-;13511:23;;:7;:5;:7::i;:::-;:23;;;13503:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59554:1:::1;59538:13;;:17;59530:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;59599:21;59637:13;;59623:11;;:27;;;;:::i;:::-;59599:51;;59669:7;:5;:7::i;:::-;59661:25;;:40;59687:13;59661:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;59519:190;59480:229::o:0;58535:353::-;13522:12;:10;:12::i;:::-;13511:23;;:7;:5;:7::i;:::-;:23;;;13503:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58594:12:::1;58609:1;58594:16;;58625:6;58621:256;58640:7;58637:1;:10;58621:256;;;58668:15;58686:2;58668:20;;58703:11;58717:2;58703:16;;58734:10;58817:6;58803:10;58780:15;58796:1;58763:35;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58753:46;;;;;;58748:52;;:65;;;;:::i;:::-;58747:76;;;;:::i;:::-;58734:89;;58838:15;58859:5;58838:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58653:224;;;58649:3;;;;;:::i;:::-;;;;58621:256;;;;58579:309;58535:353::o:0;39066:177::-;39196:39;39213:4;39219:2;39223:7;39196:39;;;;;;;;;;;;:16;:39::i;:::-;39066:177;;;:::o;32943:187::-;33010:7;33046:13;:11;:13::i;:::-;33038:5;:21;33030:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;33117:5;33110:12;;32943:187;;;:::o;58354:87::-;13522:12;:10;:12::i;:::-;13511:23;;:7;:5;:7::i;:::-;:23;;;13503:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58426:7:::1;58416;;:17;;;;;;;;;;;;;;;;;;58354:87:::0;:::o;36204:124::-;36268:7;36295:20;36307:7;36295:11;:20::i;:::-;:25;;;36288:32;;36204:124;;;:::o;51860:48::-;;;;;;;;;;;;;;;;;:::o;56137:106::-;56187:7;56214:21;56207:28;;56137:106;:::o;34945:221::-;35009:7;35054:1;35037:19;;:5;:19;;;;35029:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;35130:12;:19;35143:5;35130:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;35122:36;;35115:43;;34945:221;;;:::o;13942:94::-;13522:12;:10;:12::i;:::-;13511:23;;:7;:5;:7::i;:::-;:23;;;13503:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14007:21:::1;14025:1;14007:9;:21::i;:::-;13942:94::o:0;51057:27::-;;;;;;;;;;;;;:::o;13291:87::-;13337:7;13364:6;;;;;;;;;;;13357:13;;13291:87;:::o;52677:409::-;13522:12;:10;:12::i;:::-;13511:23;;:7;:5;:7::i;:::-;:23;;;13503:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52794:6:::1;;;;;;;;;;;52793:7;52785:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;52853:8;52839:10;:22;;52831:31;;;::::0;::::1;;52888:8;52873:12;:23;;;;52921:10;52907:11;:24;;;;52954:8;52942:9;:20;;;;52989:15;52973:13;:31;;;;53024:4;53015:6;;:13;;;;;;;;;;;;;;;;;;53064;;53054:8;53044:34;;;;;;;;;;52677:409:::0;;;:::o;52001:50::-;;;;;;;;;;;;;;;;;:::o;36564:104::-;36620:13;36653:7;36646:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36564:104;:::o;54662:585::-;54703:7;54722:6;;;;;;;;;;;54717:39;;54743:1;54736:8;;;;54717:39;54766:15;54784:16;:14;:16::i;:::-;54766:34;;54826:12;;54815:7;:23;54811:429;;54862:9;;54855:16;;;;;54811:429;54904:13;55094:7;55053:12;;55009:11;;54968:9;;54961:60;;;;:::i;:::-;54960:106;;;;:::i;:::-;54959:143;;;;:::i;:::-;54927:11;;54920:182;;;;:::i;:::-;54904:198;;55117:20;55148:6;55117:38;;55192:9;;55177:12;:24;:51;;55219:9;;55177:51;;;55204:12;55177:51;55170:58;;;;;54662:585;;:::o;53501:760::-;49896:21;:19;:21::i;:::-;53581:10:::1;53594:13;:11;:13::i;:::-;53581:26;;53618:20;53641:10;:8;:10::i;:::-;53618:33;;53662:17;53697:15;53682:12;:30;;;;:::i;:::-;53662:50;;53733:6;;;;;;;;;;;53725:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;53794:9;53781;:22;;53773:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;53882:10;;53863:15;53858:2;:20;;;;:::i;:::-;:34;;53850:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;53942:38;53952:10;53964:15;53942:9;:38::i;:::-;54006:9;53994;:21;53990:115;;;54032:61;54058:10;54083:9;54071;:21;;;;:::i;:::-;54032:17;:61::i;:::-;53990:115;54146:15;54117:13;:25;54131:10;54117:25;;;;;;;;;;;;;;;;:44;;;;;;;:::i;:::-;;;;;;;;54203:9;54172:15;:27;54188:10;54172:27;;;;;;;;;;;;;;;;:40;;;;;;;:::i;:::-;;;;;;;;54238:15;54223:11;;:30;;;;;;;:::i;:::-;;;;;;;;53570:691;;;49940:20:::0;:18;:20::i;:::-;53501:760;:::o;38243:288::-;38350:12;:10;:12::i;:::-;38338:24;;:8;:24;;;;38330:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;38451:8;38406:18;:32;38425:12;:10;:12::i;:::-;38406:32;;;;;;;;;;;;;;;:42;38439:8;38406:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;38504:8;38475:48;;38490:12;:10;:12::i;:::-;38475:48;;;38514:8;38475:48;;;;;;:::i;:::-;;;;;;;;38243:288;;:::o;52276:26::-;;;;:::o;58206:99::-;13522:12;:10;:12::i;:::-;13511:23;;:7;:5;:7::i;:::-;:23;;;13503:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58290:7:::1;58278:9;:19;;;;;;;;;;;;:::i;:::-;;58206:99:::0;:::o;54315:284::-;13522:12;:10;:12::i;:::-;13511:23;;:7;:5;:7::i;:::-;:23;;;13503:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54392:10:::1;54405:13;:11;:13::i;:::-;54392:26;;54457:10;;54442:4;;:11;;54437:2;:16;;;;:::i;:::-;:30;;54429:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;54510:6;54505:87;54526:4;;:11;;54522:1;:15;54505:87;;;54559:21;54569:4;;54574:1;54569:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;54578:1;54559:9;:21::i;:::-;54539:3;;;;;:::i;:::-;;;;54505:87;;;;54381:218;54315:284:::0;;:::o;39314:355::-;39473:28;39483:4;39489:2;39493:7;39473:9;:28::i;:::-;39534:48;39557:4;39563:2;39567:7;39576:5;39534:22;:48::i;:::-;39512:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;39314:355;;;;:::o;56303:224::-;56364:7;56408:1;56392:13;;:17;56384:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;56506:13;;56484;:19;56498:4;56484:19;;;;;;;;;;;;;;;;:35;;;;:::i;:::-;56460:15;:21;56476:4;56460:21;;;;;;;;;;;;;;;;:59;;;;:::i;:::-;56453:66;;56303:224;;;:::o;53126:297::-;13522:12;:10;:12::i;:::-;13511:23;;:7;:5;:7::i;:::-;:23;;;13503:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53188:6:::1;;;;;;;;;;;53180:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;53230:20;53253:10;:8;:10::i;:::-;53230:33;;53271:19;53293:16;:14;:16::i;:::-;53271:38;;53336:1;53320:13;:17;;;;53357:5;53348:6;;:14;;;;;;;;;;;;;;;;;;53403:11;53389:12;53378:37;;;;;;;;;;53169:254;;53126:297::o:0;58936:104::-;58984:13;59017:15;59010:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58936:104;:::o;59084:319::-;59151:13;59185:11;59193:2;59185:7;:11::i;:::-;59177:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;59241:28;59272:10;:8;:10::i;:::-;59241:41;;59331:1;59306:14;59300:28;:32;:95;;;;;;;;;;;;;;;;;59359:14;59375:13;:2;:11;:13::i;:::-;59342:47;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59300:95;59293:102;;;59084:319;;;:::o;56877:499::-;49896:21;:19;:21::i;:::-;56965:7:::1;;;;;;;;;;;56957:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;57038:9;57024:23;;:10;:23;;;:48;;;;57065:7;:5;:7::i;:::-;57051:21;;:10;:21;;;57024:48;57016:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;57122:15;57140:25;57155:9;57140:14;:25::i;:::-;57122:43;;57194:1;57184:7;:11;57176:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;57260:9;57252:27;;:36;57280:7;57252:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;57328:1;57299:15;:26;57315:9;57299:26;;;;;;;;;;;;;;;:30;;;;57367:1;57340:13;:24;57354:9;57340:24;;;;;;;;;;;;;;;:28;;;;56946:430;49940:20:::0;:18;:20::i;:::-;56877:499;:::o;55981:99::-;13522:12;:10;:12::i;:::-;13511:23;;:7;:5;:7::i;:::-;:23;;;13503:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56066:6:::1;56050:13;:22;;;;55981:99:::0;:::o;50789:24::-;;;;:::o;52143:28::-;;;;:::o;38602:164::-;38699:4;38723:18;:25;38742:5;38723:25;;;;;;;;;;;;;;;:35;38749:8;38723:35;;;;;;;;;;;;;;;;;;;;;;;;;38716:42;;38602:164;;;;:::o;55510:370::-;55561:7;55602:1;55585:13;;:18;55581:143;;;55627:6;55620:13;;;;55581:143;55758:12;;55738:16;:14;:16::i;:::-;:32;55734:73;;55794:1;55787:8;;;;55734:73;55857:15;55841:12;;55825:13;;:28;;;;:::i;:::-;55824:48;;;;:::i;:::-;55817:55;;55510:370;;:::o;14191:192::-;13522:12;:10;:12::i;:::-;13511:23;;:7;:5;:7::i;:::-;:23;;;13503:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14300:1:::1;14280:22;;:8;:22;;;;14272:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;14356:19;14366:8;14356:9;:19::i;:::-;14191:192:::0;:::o;24897:157::-;24982:4;25021:25;25006:40;;;:11;:40;;;;24999:47;;24897:157;;;:::o;39924:111::-;39981:4;40015:12;;40005:7;:22;39998:29;;39924:111;;;:::o;12112:98::-;12165:7;12192:10;12185:17;;12112:98;:::o;44844:196::-;44986:2;44959:15;:24;44975:7;44959:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;45024:7;45020:2;45004:28;;45013:5;45004:28;;;;;;;;;;;;44844:196;;;:::o;56613:145::-;56670:7;56737:13;;56718;:16;56732:1;56718:16;;;;;;;;;;;;;;;;:32;;;;:::i;:::-;56697:15;:18;56713:1;56697:18;;;;;;;;;;;;;;;;:53;;;;:::i;:::-;56690:60;;56613:145;;;:::o;42724:2002::-;42839:35;42877:20;42889:7;42877:11;:20::i;:::-;42839:58;;42910:22;42952:13;:18;;;42936:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;43011:12;:10;:12::i;:::-;42987:36;;:20;42999:7;42987:11;:20::i;:::-;:36;;;42936:87;:154;;;;43040:50;43057:13;:18;;;43077:12;:10;:12::i;:::-;43040:16;:50::i;:::-;42936:154;42910:181;;43112:17;43104:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;43227:4;43205:26;;:13;:18;;;:26;;;43197:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;43307:1;43293:16;;:2;:16;;;;43285:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;43364:43;43386:4;43392:2;43396:7;43405:1;43364:21;:43::i;:::-;43472:49;43489:1;43493:7;43502:13;:18;;;43472:8;:49::i;:::-;43847:1;43817:12;:18;43830:4;43817:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43891:1;43863:12;:16;43876:2;43863:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43937:2;43909:11;:20;43921:7;43909:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;43999:15;43954:11;:20;43966:7;43954:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;44267:19;44299:1;44289:7;:11;44267:33;;44360:1;44319:43;;:11;:24;44331:11;44319:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;44315:295;;;44387:20;44395:11;44387:7;:20::i;:::-;44383:212;;;44464:13;:18;;;44432:11;:24;44444:11;44432:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;44547:13;:28;;;44505:11;:24;44517:11;44505:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;44383:212;44315:295;43792:829;44657:7;44653:2;44638:27;;44647:4;44638:27;;;;;;;;;;;;44676:42;44697:4;44703:2;44707:7;44716:1;44676:20;:42::i;:::-;42828:1898;;42724:2002;;;:::o;35605:537::-;35666:21;;:::i;:::-;35708:16;35716:7;35708;:16::i;:::-;35700:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;35814:12;35829:7;35814:22;;35809:245;35846:1;35838:4;:9;35809:245;;35876:31;35910:11;:17;35922:4;35910:17;;;;;;;;;;;35876:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35976:1;35950:28;;:9;:14;;;:28;;;35946:93;;36010:9;36003:16;;;;;;35946:93;35857:197;35849:6;;;;;;;;35809:245;;;;36077:57;;;;;;;;;;:::i;:::-;;;;;;;;35605:537;;;;:::o;14391:173::-;14447:16;14466:6;;;;;;;;;;;14447:25;;14492:8;14483:6;;:17;;;;;;;;;;;;;;;;;;14547:8;14516:40;;14537:8;14516:40;;;;;;;;;;;;14436:128;14391:173;:::o;55313:139::-;55362:7;55405:1;55389:13;;:17;:55;;55443:1;55389:55;;;55427:13;;55409:15;:31;;;;:::i;:::-;55389:55;55382:62;;55313:139;:::o;49976:289::-;49378:1;50106:7;;:19;;50098:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;49378:1;50239:7;:18;;;;49976:289::o;40043:104::-;40112:27;40122:2;40126:8;40112:27;;;;;;;;;;;;:9;:27::i;:::-;40043:104;;:::o;16627:317::-;16742:6;16717:21;:31;;16709:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;16796:12;16814:9;:14;;16836:6;16814:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16795:52;;;16866:7;16858:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;16698:246;16627:317;;:::o;50273:213::-;49334:1;50456:7;:22;;;;50273:213::o;45605:804::-;45760:4;45781:15;:2;:13;;;:15::i;:::-;45777:625;;;45833:2;45817:36;;;45854:12;:10;:12::i;:::-;45868:4;45874:7;45883:5;45817:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;45813:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46080:1;46063:6;:13;:18;46059:273;;;46106:61;;;;;;;;;;:::i;:::-;;;;;;;;46059:273;46282:6;46276:13;46267:6;46263:2;46259:15;46252:38;45813:534;45950:45;;;45940:55;;;:6;:55;;;;45933:62;;;;;45777:625;46386:4;46379:11;;45605:804;;;;;;;:::o;58054:109::-;58113:13;58146:9;58139:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58054:109;:::o;286:723::-;342:13;572:1;563:5;:10;559:53;;;590:10;;;;;;;;;;;;;;;;;;;;;559:53;622:12;637:5;622:20;;653:14;678:78;693:1;685:4;:9;678:78;;711:8;;;;;:::i;:::-;;;;742:2;734:10;;;;;:::i;:::-;;;678:78;;;766:19;798:6;788:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;766:39;;816:154;832:1;823:5;:10;816:154;;860:1;850:11;;;;;:::i;:::-;;;927:2;919:5;:10;;;;:::i;:::-;906:2;:24;;;;:::i;:::-;893:39;;876:6;883;876:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;956:2;947:11;;;;;:::i;:::-;;;816:154;;;994:6;980:21;;;;;286:723;;;;:::o;46897:159::-;;;;;:::o;47468:158::-;;;;;:::o;40510:163::-;40633:32;40639:2;40643:8;40653:5;40660:4;40633:5;:32::i;:::-;40510:163;;;:::o;15305:387::-;15365:4;15573:12;15640:7;15628:20;15620:28;;15683:1;15676:4;:8;15669:15;;;15305:387;;;:::o;40932:1538::-;41071:20;41094:12;;41071:35;;41139:1;41125:16;;:2;:16;;;;41117:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;41210:1;41198:8;:13;;41190:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;41269:61;41299:1;41303:2;41307:12;41321:8;41269:21;:61::i;:::-;41644:8;41608:12;:16;41621:2;41608:16;;;;;;;;;;;;;;;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41709:8;41668:12;:16;41681:2;41668:16;;;;;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41768:2;41735:11;:25;41747:12;41735:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;41835:15;41785:11;:25;41797:12;41785:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;41868:20;41891:12;41868:35;;41925:9;41920:415;41940:8;41936:1;:12;41920:415;;;42004:12;42000:2;41979:38;;41996:1;41979:38;;;;;;;;;;;;42040:4;42036:249;;;42103:59;42134:1;42138:2;42142:12;42156:5;42103:22;:59::i;:::-;42069:196;;;;;;;;;;;;:::i;:::-;;;;;;;;;42036:249;42305:14;;;;;;;41950:3;;;;;;;41920:415;;;;42366:12;42351;:27;;;;41583:807;42402:60;42431:1;42435:2;42439:12;42453:8;42402:20;:60::i;:::-;41060:1410;40932:1538;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:155::-;1040:5;1078:6;1065:20;1056:29;;1094:41;1129:5;1094:41;:::i;:::-;986:155;;;;:::o;1164:568::-;1237:8;1247:6;1297:3;1290:4;1282:6;1278:17;1274:27;1264:122;;1305:79;;:::i;:::-;1264:122;1418:6;1405:20;1395:30;;1448:18;1440:6;1437:30;1434:117;;;1470:79;;:::i;:::-;1434:117;1584:4;1576:6;1572:17;1560:29;;1638:3;1630:4;1622:6;1618:17;1608:8;1604:32;1601:41;1598:128;;;1645:79;;:::i;:::-;1598:128;1164:568;;;;;:::o;1738:133::-;1781:5;1819:6;1806:20;1797:29;;1835:30;1859:5;1835:30;:::i;:::-;1738:133;;;;:::o;1877:137::-;1922:5;1960:6;1947:20;1938:29;;1976:32;2002:5;1976:32;:::i;:::-;1877:137;;;;:::o;2020:141::-;2076:5;2107:6;2101:13;2092:22;;2123:32;2149:5;2123:32;:::i;:::-;2020:141;;;;:::o;2180:338::-;2235:5;2284:3;2277:4;2269:6;2265:17;2261:27;2251:122;;2292:79;;:::i;:::-;2251:122;2409:6;2396:20;2434:78;2508:3;2500:6;2493:4;2485:6;2481:17;2434:78;:::i;:::-;2425:87;;2241:277;2180:338;;;;:::o;2538:340::-;2594:5;2643:3;2636:4;2628:6;2624:17;2620:27;2610:122;;2651:79;;:::i;:::-;2610:122;2768:6;2755:20;2793:79;2868:3;2860:6;2853:4;2845:6;2841:17;2793:79;:::i;:::-;2784:88;;2600:278;2538:340;;;;:::o;2884:139::-;2930:5;2968:6;2955:20;2946:29;;2984:33;3011:5;2984:33;:::i;:::-;2884:139;;;;:::o;3029:329::-;3088:6;3137:2;3125:9;3116:7;3112:23;3108:32;3105:119;;;3143:79;;:::i;:::-;3105:119;3263:1;3288:53;3333:7;3324:6;3313:9;3309:22;3288:53;:::i;:::-;3278:63;;3234:117;3029:329;;;;:::o;3364:345::-;3431:6;3480:2;3468:9;3459:7;3455:23;3451:32;3448:119;;;3486:79;;:::i;:::-;3448:119;3606:1;3631:61;3684:7;3675:6;3664:9;3660:22;3631:61;:::i;:::-;3621:71;;3577:125;3364:345;;;;:::o;3715:474::-;3783:6;3791;3840:2;3828:9;3819:7;3815:23;3811:32;3808:119;;;3846:79;;:::i;:::-;3808:119;3966:1;3991:53;4036:7;4027:6;4016:9;4012:22;3991:53;:::i;:::-;3981:63;;3937:117;4093:2;4119:53;4164:7;4155:6;4144:9;4140:22;4119:53;:::i;:::-;4109:63;;4064:118;3715:474;;;;;:::o;4195:619::-;4272:6;4280;4288;4337:2;4325:9;4316:7;4312:23;4308:32;4305:119;;;4343:79;;:::i;:::-;4305:119;4463:1;4488:53;4533:7;4524:6;4513:9;4509:22;4488:53;:::i;:::-;4478:63;;4434:117;4590:2;4616:53;4661:7;4652:6;4641:9;4637:22;4616:53;:::i;:::-;4606:63;;4561:118;4718:2;4744:53;4789:7;4780:6;4769:9;4765:22;4744:53;:::i;:::-;4734:63;;4689:118;4195:619;;;;;:::o;4820:943::-;4915:6;4923;4931;4939;4988:3;4976:9;4967:7;4963:23;4959:33;4956:120;;;4995:79;;:::i;:::-;4956:120;5115:1;5140:53;5185:7;5176:6;5165:9;5161:22;5140:53;:::i;:::-;5130:63;;5086:117;5242:2;5268:53;5313:7;5304:6;5293:9;5289:22;5268:53;:::i;:::-;5258:63;;5213:118;5370:2;5396:53;5441:7;5432:6;5421:9;5417:22;5396:53;:::i;:::-;5386:63;;5341:118;5526:2;5515:9;5511:18;5498:32;5557:18;5549:6;5546:30;5543:117;;;5579:79;;:::i;:::-;5543:117;5684:62;5738:7;5729:6;5718:9;5714:22;5684:62;:::i;:::-;5674:72;;5469:287;4820:943;;;;;;;:::o;5769:468::-;5834:6;5842;5891:2;5879:9;5870:7;5866:23;5862:32;5859:119;;;5897:79;;:::i;:::-;5859:119;6017:1;6042:53;6087:7;6078:6;6067:9;6063:22;6042:53;:::i;:::-;6032:63;;5988:117;6144:2;6170:50;6212:7;6203:6;6192:9;6188:22;6170:50;:::i;:::-;6160:60;;6115:115;5769:468;;;;;:::o;6243:474::-;6311:6;6319;6368:2;6356:9;6347:7;6343:23;6339:32;6336:119;;;6374:79;;:::i;:::-;6336:119;6494:1;6519:53;6564:7;6555:6;6544:9;6540:22;6519:53;:::i;:::-;6509:63;;6465:117;6621:2;6647:53;6692:7;6683:6;6672:9;6668:22;6647:53;:::i;:::-;6637:63;;6592:118;6243:474;;;;;:::o;6723:559::-;6809:6;6817;6866:2;6854:9;6845:7;6841:23;6837:32;6834:119;;;6872:79;;:::i;:::-;6834:119;7020:1;7009:9;7005:17;6992:31;7050:18;7042:6;7039:30;7036:117;;;7072:79;;:::i;:::-;7036:117;7185:80;7257:7;7248:6;7237:9;7233:22;7185:80;:::i;:::-;7167:98;;;;6963:312;6723:559;;;;;:::o;7288:323::-;7344:6;7393:2;7381:9;7372:7;7368:23;7364:32;7361:119;;;7399:79;;:::i;:::-;7361:119;7519:1;7544:50;7586:7;7577:6;7566:9;7562:22;7544:50;:::i;:::-;7534:60;;7490:114;7288:323;;;;:::o;7617:327::-;7675:6;7724:2;7712:9;7703:7;7699:23;7695:32;7692:119;;;7730:79;;:::i;:::-;7692:119;7850:1;7875:52;7919:7;7910:6;7899:9;7895:22;7875:52;:::i;:::-;7865:62;;7821:116;7617:327;;;;:::o;7950:349::-;8019:6;8068:2;8056:9;8047:7;8043:23;8039:32;8036:119;;;8074:79;;:::i;:::-;8036:119;8194:1;8219:63;8274:7;8265:6;8254:9;8250:22;8219:63;:::i;:::-;8209:73;;8165:127;7950:349;;;;:::o;8305:509::-;8374:6;8423:2;8411:9;8402:7;8398:23;8394:32;8391:119;;;8429:79;;:::i;:::-;8391:119;8577:1;8566:9;8562:17;8549:31;8607:18;8599:6;8596:30;8593:117;;;8629:79;;:::i;:::-;8593:117;8734:63;8789:7;8780:6;8769:9;8765:22;8734:63;:::i;:::-;8724:73;;8520:287;8305:509;;;;:::o;8820:329::-;8879:6;8928:2;8916:9;8907:7;8903:23;8899:32;8896:119;;;8934:79;;:::i;:::-;8896:119;9054:1;9079:53;9124:7;9115:6;9104:9;9100:22;9079:53;:::i;:::-;9069:63;;9025:117;8820:329;;;;:::o;9155:619::-;9232:6;9240;9248;9297:2;9285:9;9276:7;9272:23;9268:32;9265:119;;;9303:79;;:::i;:::-;9265:119;9423:1;9448:53;9493:7;9484:6;9473:9;9469:22;9448:53;:::i;:::-;9438:63;;9394:117;9550:2;9576:53;9621:7;9612:6;9601:9;9597:22;9576:53;:::i;:::-;9566:63;;9521:118;9678:2;9704:53;9749:7;9740:6;9729:9;9725:22;9704:53;:::i;:::-;9694:63;;9649:118;9155:619;;;;;:::o;9780:179::-;9849:10;9870:46;9912:3;9904:6;9870:46;:::i;:::-;9948:4;9943:3;9939:14;9925:28;;9780:179;;;;:::o;9965:118::-;10052:24;10070:5;10052:24;:::i;:::-;10047:3;10040:37;9965:118;;:::o;10119:732::-;10238:3;10267:54;10315:5;10267:54;:::i;:::-;10337:86;10416:6;10411:3;10337:86;:::i;:::-;10330:93;;10447:56;10497:5;10447:56;:::i;:::-;10526:7;10557:1;10542:284;10567:6;10564:1;10561:13;10542:284;;;10643:6;10637:13;10670:63;10729:3;10714:13;10670:63;:::i;:::-;10663:70;;10756:60;10809:6;10756:60;:::i;:::-;10746:70;;10602:224;10589:1;10586;10582:9;10577:14;;10542:284;;;10546:14;10842:3;10835:10;;10243:608;;;10119:732;;;;:::o;10857:109::-;10938:21;10953:5;10938:21;:::i;:::-;10933:3;10926:34;10857:109;;:::o;10972:360::-;11058:3;11086:38;11118:5;11086:38;:::i;:::-;11140:70;11203:6;11198:3;11140:70;:::i;:::-;11133:77;;11219:52;11264:6;11259:3;11252:4;11245:5;11241:16;11219:52;:::i;:::-;11296:29;11318:6;11296:29;:::i;:::-;11291:3;11287:39;11280:46;;11062:270;10972:360;;;;:::o;11338:364::-;11426:3;11454:39;11487:5;11454:39;:::i;:::-;11509:71;11573:6;11568:3;11509:71;:::i;:::-;11502:78;;11589:52;11634:6;11629:3;11622:4;11615:5;11611:16;11589:52;:::i;:::-;11666:29;11688:6;11666:29;:::i;:::-;11661:3;11657:39;11650:46;;11430:272;11338:364;;;;:::o;11708:377::-;11814:3;11842:39;11875:5;11842:39;:::i;:::-;11897:89;11979:6;11974:3;11897:89;:::i;:::-;11890:96;;11995:52;12040:6;12035:3;12028:4;12021:5;12017:16;11995:52;:::i;:::-;12072:6;12067:3;12063:16;12056:23;;11818:267;11708:377;;;;:::o;12091:366::-;12233:3;12254:67;12318:2;12313:3;12254:67;:::i;:::-;12247:74;;12330:93;12419:3;12330:93;:::i;:::-;12448:2;12443:3;12439:12;12432:19;;12091:366;;;:::o;12463:::-;12605:3;12626:67;12690:2;12685:3;12626:67;:::i;:::-;12619:74;;12702:93;12791:3;12702:93;:::i;:::-;12820:2;12815:3;12811:12;12804:19;;12463:366;;;:::o;12835:::-;12977:3;12998:67;13062:2;13057:3;12998:67;:::i;:::-;12991:74;;13074:93;13163:3;13074:93;:::i;:::-;13192:2;13187:3;13183:12;13176:19;;12835:366;;;:::o;13207:::-;13349:3;13370:67;13434:2;13429:3;13370:67;:::i;:::-;13363:74;;13446:93;13535:3;13446:93;:::i;:::-;13564:2;13559:3;13555:12;13548:19;;13207:366;;;:::o;13579:::-;13721:3;13742:67;13806:2;13801:3;13742:67;:::i;:::-;13735:74;;13818:93;13907:3;13818:93;:::i;:::-;13936:2;13931:3;13927:12;13920:19;;13579:366;;;:::o;13951:::-;14093:3;14114:67;14178:2;14173:3;14114:67;:::i;:::-;14107:74;;14190:93;14279:3;14190:93;:::i;:::-;14308:2;14303:3;14299:12;14292:19;;13951:366;;;:::o;14323:::-;14465:3;14486:67;14550:2;14545:3;14486:67;:::i;:::-;14479:74;;14562:93;14651:3;14562:93;:::i;:::-;14680:2;14675:3;14671:12;14664:19;;14323:366;;;:::o;14695:::-;14837:3;14858:67;14922:2;14917:3;14858:67;:::i;:::-;14851:74;;14934:93;15023:3;14934:93;:::i;:::-;15052:2;15047:3;15043:12;15036:19;;14695:366;;;:::o;15067:::-;15209:3;15230:67;15294:2;15289:3;15230:67;:::i;:::-;15223:74;;15306:93;15395:3;15306:93;:::i;:::-;15424:2;15419:3;15415:12;15408:19;;15067:366;;;:::o;15439:::-;15581:3;15602:67;15666:2;15661:3;15602:67;:::i;:::-;15595:74;;15678:93;15767:3;15678:93;:::i;:::-;15796:2;15791:3;15787:12;15780:19;;15439:366;;;:::o;15811:::-;15953:3;15974:67;16038:2;16033:3;15974:67;:::i;:::-;15967:74;;16050:93;16139:3;16050:93;:::i;:::-;16168:2;16163:3;16159:12;16152:19;;15811:366;;;:::o;16183:::-;16325:3;16346:67;16410:2;16405:3;16346:67;:::i;:::-;16339:74;;16422:93;16511:3;16422:93;:::i;:::-;16540:2;16535:3;16531:12;16524:19;;16183:366;;;:::o;16555:::-;16697:3;16718:67;16782:2;16777:3;16718:67;:::i;:::-;16711:74;;16794:93;16883:3;16794:93;:::i;:::-;16912:2;16907:3;16903:12;16896:19;;16555:366;;;:::o;16927:::-;17069:3;17090:67;17154:2;17149:3;17090:67;:::i;:::-;17083:74;;17166:93;17255:3;17166:93;:::i;:::-;17284:2;17279:3;17275:12;17268:19;;16927:366;;;:::o;17299:::-;17441:3;17462:67;17526:2;17521:3;17462:67;:::i;:::-;17455:74;;17538:93;17627:3;17538:93;:::i;:::-;17656:2;17651:3;17647:12;17640:19;;17299:366;;;:::o;17671:::-;17813:3;17834:67;17898:2;17893:3;17834:67;:::i;:::-;17827:74;;17910:93;17999:3;17910:93;:::i;:::-;18028:2;18023:3;18019:12;18012:19;;17671:366;;;:::o;18043:::-;18185:3;18206:67;18270:2;18265:3;18206:67;:::i;:::-;18199:74;;18282:93;18371:3;18282:93;:::i;:::-;18400:2;18395:3;18391:12;18384:19;;18043:366;;;:::o;18415:::-;18557:3;18578:67;18642:2;18637:3;18578:67;:::i;:::-;18571:74;;18654:93;18743:3;18654:93;:::i;:::-;18772:2;18767:3;18763:12;18756:19;;18415:366;;;:::o;18787:::-;18929:3;18950:67;19014:2;19009:3;18950:67;:::i;:::-;18943:74;;19026:93;19115:3;19026:93;:::i;:::-;19144:2;19139:3;19135:12;19128:19;;18787:366;;;:::o;19159:::-;19301:3;19322:67;19386:2;19381:3;19322:67;:::i;:::-;19315:74;;19398:93;19487:3;19398:93;:::i;:::-;19516:2;19511:3;19507:12;19500:19;;19159:366;;;:::o;19531:::-;19673:3;19694:67;19758:2;19753:3;19694:67;:::i;:::-;19687:74;;19770:93;19859:3;19770:93;:::i;:::-;19888:2;19883:3;19879:12;19872:19;;19531:366;;;:::o;19903:::-;20045:3;20066:67;20130:2;20125:3;20066:67;:::i;:::-;20059:74;;20142:93;20231:3;20142:93;:::i;:::-;20260:2;20255:3;20251:12;20244:19;;19903:366;;;:::o;20275:::-;20417:3;20438:67;20502:2;20497:3;20438:67;:::i;:::-;20431:74;;20514:93;20603:3;20514:93;:::i;:::-;20632:2;20627:3;20623:12;20616:19;;20275:366;;;:::o;20647:398::-;20806:3;20827:83;20908:1;20903:3;20827:83;:::i;:::-;20820:90;;20919:93;21008:3;20919:93;:::i;:::-;21037:1;21032:3;21028:11;21021:18;;20647:398;;;:::o;21051:366::-;21193:3;21214:67;21278:2;21273:3;21214:67;:::i;:::-;21207:74;;21290:93;21379:3;21290:93;:::i;:::-;21408:2;21403:3;21399:12;21392:19;;21051:366;;;:::o;21423:::-;21565:3;21586:67;21650:2;21645:3;21586:67;:::i;:::-;21579:74;;21662:93;21751:3;21662:93;:::i;:::-;21780:2;21775:3;21771:12;21764:19;;21423:366;;;:::o;21795:::-;21937:3;21958:67;22022:2;22017:3;21958:67;:::i;:::-;21951:74;;22034:93;22123:3;22034:93;:::i;:::-;22152:2;22147:3;22143:12;22136:19;;21795:366;;;:::o;22167:::-;22309:3;22330:67;22394:2;22389:3;22330:67;:::i;:::-;22323:74;;22406:93;22495:3;22406:93;:::i;:::-;22524:2;22519:3;22515:12;22508:19;;22167:366;;;:::o;22539:::-;22681:3;22702:67;22766:2;22761:3;22702:67;:::i;:::-;22695:74;;22778:93;22867:3;22778:93;:::i;:::-;22896:2;22891:3;22887:12;22880:19;;22539:366;;;:::o;22911:::-;23053:3;23074:67;23138:2;23133:3;23074:67;:::i;:::-;23067:74;;23150:93;23239:3;23150:93;:::i;:::-;23268:2;23263:3;23259:12;23252:19;;22911:366;;;:::o;23283:::-;23425:3;23446:67;23510:2;23505:3;23446:67;:::i;:::-;23439:74;;23522:93;23611:3;23522:93;:::i;:::-;23640:2;23635:3;23631:12;23624:19;;23283:366;;;:::o;23655:::-;23797:3;23818:67;23882:2;23877:3;23818:67;:::i;:::-;23811:74;;23894:93;23983:3;23894:93;:::i;:::-;24012:2;24007:3;24003:12;23996:19;;23655:366;;;:::o;24027:::-;24169:3;24190:67;24254:2;24249:3;24190:67;:::i;:::-;24183:74;;24266:93;24355:3;24266:93;:::i;:::-;24384:2;24379:3;24375:12;24368:19;;24027:366;;;:::o;24399:::-;24541:3;24562:67;24626:2;24621:3;24562:67;:::i;:::-;24555:74;;24638:93;24727:3;24638:93;:::i;:::-;24756:2;24751:3;24747:12;24740:19;;24399:366;;;:::o;24771:108::-;24848:24;24866:5;24848:24;:::i;:::-;24843:3;24836:37;24771:108;;:::o;24885:118::-;24972:24;24990:5;24972:24;:::i;:::-;24967:3;24960:37;24885:118;;:::o;25009:157::-;25114:45;25134:24;25152:5;25134:24;:::i;:::-;25114:45;:::i;:::-;25109:3;25102:58;25009:157;;:::o;25172:435::-;25352:3;25374:95;25465:3;25456:6;25374:95;:::i;:::-;25367:102;;25486:95;25577:3;25568:6;25486:95;:::i;:::-;25479:102;;25598:3;25591:10;;25172:435;;;;;:::o;25613:379::-;25797:3;25819:147;25962:3;25819:147;:::i;:::-;25812:154;;25983:3;25976:10;;25613:379;;;:::o;25998:397::-;26138:3;26153:75;26224:3;26215:6;26153:75;:::i;:::-;26253:2;26248:3;26244:12;26237:19;;26266:75;26337:3;26328:6;26266:75;:::i;:::-;26366:2;26361:3;26357:12;26350:19;;26386:3;26379:10;;25998:397;;;;;:::o;26401:222::-;26494:4;26532:2;26521:9;26517:18;26509:26;;26545:71;26613:1;26602:9;26598:17;26589:6;26545:71;:::i;:::-;26401:222;;;;:::o;26629:640::-;26824:4;26862:3;26851:9;26847:19;26839:27;;26876:71;26944:1;26933:9;26929:17;26920:6;26876:71;:::i;:::-;26957:72;27025:2;27014:9;27010:18;27001:6;26957:72;:::i;:::-;27039;27107:2;27096:9;27092:18;27083:6;27039:72;:::i;:::-;27158:9;27152:4;27148:20;27143:2;27132:9;27128:18;27121:48;27186:76;27257:4;27248:6;27186:76;:::i;:::-;27178:84;;26629:640;;;;;;;:::o;27275:373::-;27418:4;27456:2;27445:9;27441:18;27433:26;;27505:9;27499:4;27495:20;27491:1;27480:9;27476:17;27469:47;27533:108;27636:4;27627:6;27533:108;:::i;:::-;27525:116;;27275:373;;;;:::o;27654:210::-;27741:4;27779:2;27768:9;27764:18;27756:26;;27792:65;27854:1;27843:9;27839:17;27830:6;27792:65;:::i;:::-;27654:210;;;;:::o;27870:313::-;27983:4;28021:2;28010:9;28006:18;27998:26;;28070:9;28064:4;28060:20;28056:1;28045:9;28041:17;28034:47;28098:78;28171:4;28162:6;28098:78;:::i;:::-;28090:86;;27870:313;;;;:::o;28189:419::-;28355:4;28393:2;28382:9;28378:18;28370:26;;28442:9;28436:4;28432:20;28428:1;28417:9;28413:17;28406:47;28470:131;28596:4;28470:131;:::i;:::-;28462:139;;28189:419;;;:::o;28614:::-;28780:4;28818:2;28807:9;28803:18;28795:26;;28867:9;28861:4;28857:20;28853:1;28842:9;28838:17;28831:47;28895:131;29021:4;28895:131;:::i;:::-;28887:139;;28614:419;;;:::o;29039:::-;29205:4;29243:2;29232:9;29228:18;29220:26;;29292:9;29286:4;29282:20;29278:1;29267:9;29263:17;29256:47;29320:131;29446:4;29320:131;:::i;:::-;29312:139;;29039:419;;;:::o;29464:::-;29630:4;29668:2;29657:9;29653:18;29645:26;;29717:9;29711:4;29707:20;29703:1;29692:9;29688:17;29681:47;29745:131;29871:4;29745:131;:::i;:::-;29737:139;;29464:419;;;:::o;29889:::-;30055:4;30093:2;30082:9;30078:18;30070:26;;30142:9;30136:4;30132:20;30128:1;30117:9;30113:17;30106:47;30170:131;30296:4;30170:131;:::i;:::-;30162:139;;29889:419;;;:::o;30314:::-;30480:4;30518:2;30507:9;30503:18;30495:26;;30567:9;30561:4;30557:20;30553:1;30542:9;30538:17;30531:47;30595:131;30721:4;30595:131;:::i;:::-;30587:139;;30314:419;;;:::o;30739:::-;30905:4;30943:2;30932:9;30928:18;30920:26;;30992:9;30986:4;30982:20;30978:1;30967:9;30963:17;30956:47;31020:131;31146:4;31020:131;:::i;:::-;31012:139;;30739:419;;;:::o;31164:::-;31330:4;31368:2;31357:9;31353:18;31345:26;;31417:9;31411:4;31407:20;31403:1;31392:9;31388:17;31381:47;31445:131;31571:4;31445:131;:::i;:::-;31437:139;;31164:419;;;:::o;31589:::-;31755:4;31793:2;31782:9;31778:18;31770:26;;31842:9;31836:4;31832:20;31828:1;31817:9;31813:17;31806:47;31870:131;31996:4;31870:131;:::i;:::-;31862:139;;31589:419;;;:::o;32014:::-;32180:4;32218:2;32207:9;32203:18;32195:26;;32267:9;32261:4;32257:20;32253:1;32242:9;32238:17;32231:47;32295:131;32421:4;32295:131;:::i;:::-;32287:139;;32014:419;;;:::o;32439:::-;32605:4;32643:2;32632:9;32628:18;32620:26;;32692:9;32686:4;32682:20;32678:1;32667:9;32663:17;32656:47;32720:131;32846:4;32720:131;:::i;:::-;32712:139;;32439:419;;;:::o;32864:::-;33030:4;33068:2;33057:9;33053:18;33045:26;;33117:9;33111:4;33107:20;33103:1;33092:9;33088:17;33081:47;33145:131;33271:4;33145:131;:::i;:::-;33137:139;;32864:419;;;:::o;33289:::-;33455:4;33493:2;33482:9;33478:18;33470:26;;33542:9;33536:4;33532:20;33528:1;33517:9;33513:17;33506:47;33570:131;33696:4;33570:131;:::i;:::-;33562:139;;33289:419;;;:::o;33714:::-;33880:4;33918:2;33907:9;33903:18;33895:26;;33967:9;33961:4;33957:20;33953:1;33942:9;33938:17;33931:47;33995:131;34121:4;33995:131;:::i;:::-;33987:139;;33714:419;;;:::o;34139:::-;34305:4;34343:2;34332:9;34328:18;34320:26;;34392:9;34386:4;34382:20;34378:1;34367:9;34363:17;34356:47;34420:131;34546:4;34420:131;:::i;:::-;34412:139;;34139:419;;;:::o;34564:::-;34730:4;34768:2;34757:9;34753:18;34745:26;;34817:9;34811:4;34807:20;34803:1;34792:9;34788:17;34781:47;34845:131;34971:4;34845:131;:::i;:::-;34837:139;;34564:419;;;:::o;34989:::-;35155:4;35193:2;35182:9;35178:18;35170:26;;35242:9;35236:4;35232:20;35228:1;35217:9;35213:17;35206:47;35270:131;35396:4;35270:131;:::i;:::-;35262:139;;34989:419;;;:::o;35414:::-;35580:4;35618:2;35607:9;35603:18;35595:26;;35667:9;35661:4;35657:20;35653:1;35642:9;35638:17;35631:47;35695:131;35821:4;35695:131;:::i;:::-;35687:139;;35414:419;;;:::o;35839:::-;36005:4;36043:2;36032:9;36028:18;36020:26;;36092:9;36086:4;36082:20;36078:1;36067:9;36063:17;36056:47;36120:131;36246:4;36120:131;:::i;:::-;36112:139;;35839:419;;;:::o;36264:::-;36430:4;36468:2;36457:9;36453:18;36445:26;;36517:9;36511:4;36507:20;36503:1;36492:9;36488:17;36481:47;36545:131;36671:4;36545:131;:::i;:::-;36537:139;;36264:419;;;:::o;36689:::-;36855:4;36893:2;36882:9;36878:18;36870:26;;36942:9;36936:4;36932:20;36928:1;36917:9;36913:17;36906:47;36970:131;37096:4;36970:131;:::i;:::-;36962:139;;36689:419;;;:::o;37114:::-;37280:4;37318:2;37307:9;37303:18;37295:26;;37367:9;37361:4;37357:20;37353:1;37342:9;37338:17;37331:47;37395:131;37521:4;37395:131;:::i;:::-;37387:139;;37114:419;;;:::o;37539:::-;37705:4;37743:2;37732:9;37728:18;37720:26;;37792:9;37786:4;37782:20;37778:1;37767:9;37763:17;37756:47;37820:131;37946:4;37820:131;:::i;:::-;37812:139;;37539:419;;;:::o;37964:::-;38130:4;38168:2;38157:9;38153:18;38145:26;;38217:9;38211:4;38207:20;38203:1;38192:9;38188:17;38181:47;38245:131;38371:4;38245:131;:::i;:::-;38237:139;;37964:419;;;:::o;38389:::-;38555:4;38593:2;38582:9;38578:18;38570:26;;38642:9;38636:4;38632:20;38628:1;38617:9;38613:17;38606:47;38670:131;38796:4;38670:131;:::i;:::-;38662:139;;38389:419;;;:::o;38814:::-;38980:4;39018:2;39007:9;39003:18;38995:26;;39067:9;39061:4;39057:20;39053:1;39042:9;39038:17;39031:47;39095:131;39221:4;39095:131;:::i;:::-;39087:139;;38814:419;;;:::o;39239:::-;39405:4;39443:2;39432:9;39428:18;39420:26;;39492:9;39486:4;39482:20;39478:1;39467:9;39463:17;39456:47;39520:131;39646:4;39520:131;:::i;:::-;39512:139;;39239:419;;;:::o;39664:::-;39830:4;39868:2;39857:9;39853:18;39845:26;;39917:9;39911:4;39907:20;39903:1;39892:9;39888:17;39881:47;39945:131;40071:4;39945:131;:::i;:::-;39937:139;;39664:419;;;:::o;40089:::-;40255:4;40293:2;40282:9;40278:18;40270:26;;40342:9;40336:4;40332:20;40328:1;40317:9;40313:17;40306:47;40370:131;40496:4;40370:131;:::i;:::-;40362:139;;40089:419;;;:::o;40514:::-;40680:4;40718:2;40707:9;40703:18;40695:26;;40767:9;40761:4;40757:20;40753:1;40742:9;40738:17;40731:47;40795:131;40921:4;40795:131;:::i;:::-;40787:139;;40514:419;;;:::o;40939:::-;41105:4;41143:2;41132:9;41128:18;41120:26;;41192:9;41186:4;41182:20;41178:1;41167:9;41163:17;41156:47;41220:131;41346:4;41220:131;:::i;:::-;41212:139;;40939:419;;;:::o;41364:::-;41530:4;41568:2;41557:9;41553:18;41545:26;;41617:9;41611:4;41607:20;41603:1;41592:9;41588:17;41581:47;41645:131;41771:4;41645:131;:::i;:::-;41637:139;;41364:419;;;:::o;41789:::-;41955:4;41993:2;41982:9;41978:18;41970:26;;42042:9;42036:4;42032:20;42028:1;42017:9;42013:17;42006:47;42070:131;42196:4;42070:131;:::i;:::-;42062:139;;41789:419;;;:::o;42214:222::-;42307:4;42345:2;42334:9;42330:18;42322:26;;42358:71;42426:1;42415:9;42411:17;42402:6;42358:71;:::i;:::-;42214:222;;;;:::o;42442:129::-;42476:6;42503:20;;:::i;:::-;42493:30;;42532:33;42560:4;42552:6;42532:33;:::i;:::-;42442:129;;;:::o;42577:75::-;42610:6;42643:2;42637:9;42627:19;;42577:75;:::o;42658:307::-;42719:4;42809:18;42801:6;42798:30;42795:56;;;42831:18;;:::i;:::-;42795:56;42869:29;42891:6;42869:29;:::i;:::-;42861:37;;42953:4;42947;42943:15;42935:23;;42658:307;;;:::o;42971:308::-;43033:4;43123:18;43115:6;43112:30;43109:56;;;43145:18;;:::i;:::-;43109:56;43183:29;43205:6;43183:29;:::i;:::-;43175:37;;43267:4;43261;43257:15;43249:23;;42971:308;;;:::o;43285:132::-;43352:4;43375:3;43367:11;;43405:4;43400:3;43396:14;43388:22;;43285:132;;;:::o;43423:114::-;43490:6;43524:5;43518:12;43508:22;;43423:114;;;:::o;43543:98::-;43594:6;43628:5;43622:12;43612:22;;43543:98;;;:::o;43647:99::-;43699:6;43733:5;43727:12;43717:22;;43647:99;;;:::o;43752:113::-;43822:4;43854;43849:3;43845:14;43837:22;;43752:113;;;:::o;43871:184::-;43970:11;44004:6;43999:3;43992:19;44044:4;44039:3;44035:14;44020:29;;43871:184;;;;:::o;44061:168::-;44144:11;44178:6;44173:3;44166:19;44218:4;44213:3;44209:14;44194:29;;44061:168;;;;:::o;44235:147::-;44336:11;44373:3;44358:18;;44235:147;;;;:::o;44388:169::-;44472:11;44506:6;44501:3;44494:19;44546:4;44541:3;44537:14;44522:29;;44388:169;;;;:::o;44563:148::-;44665:11;44702:3;44687:18;;44563:148;;;;:::o;44717:525::-;44756:3;44775:19;44792:1;44775:19;:::i;:::-;44770:24;;44808:19;44825:1;44808:19;:::i;:::-;44803:24;;44996:1;44928:66;44924:74;44921:1;44917:82;44912:1;44909;44905:9;44898:17;44894:106;44891:132;;;45003:18;;:::i;:::-;44891:132;45183:1;45115:66;45111:74;45108:1;45104:82;45100:1;45097;45093:9;45089:98;45086:124;;;45190:18;;:::i;:::-;45086:124;45234:1;45231;45227:9;45220:16;;44717:525;;;;:::o;45248:305::-;45288:3;45307:20;45325:1;45307:20;:::i;:::-;45302:25;;45341:20;45359:1;45341:20;:::i;:::-;45336:25;;45495:1;45427:66;45423:74;45420:1;45417:81;45414:107;;;45501:18;;:::i;:::-;45414:107;45545:1;45542;45538:9;45531:16;;45248:305;;;;:::o;45559:385::-;45598:1;45615:19;45632:1;45615:19;:::i;:::-;45610:24;;45648:19;45665:1;45648:19;:::i;:::-;45643:24;;45686:1;45676:35;;45691:18;;:::i;:::-;45676:35;45877:1;45874;45870:9;45867:1;45864:16;45783:66;45780:1;45777:73;45760:130;45757:156;;;45893:18;;:::i;:::-;45757:156;45936:1;45933;45928:10;45923:15;;45559:385;;;;:::o;45950:185::-;45990:1;46007:20;46025:1;46007:20;:::i;:::-;46002:25;;46041:20;46059:1;46041:20;:::i;:::-;46036:25;;46080:1;46070:35;;46085:18;;:::i;:::-;46070:35;46127:1;46124;46120:9;46115:14;;45950:185;;;;:::o;46141:991::-;46180:7;46203:19;46220:1;46203:19;:::i;:::-;46198:24;;46236:19;46253:1;46236:19;:::i;:::-;46231:24;;46437:1;46369:66;46365:74;46362:1;46359:81;46354:1;46351;46347:9;46343:1;46340;46336:9;46332:25;46328:113;46325:139;;;46444:18;;:::i;:::-;46325:139;46648:1;46580:66;46575:75;46572:1;46568:83;46563:1;46560;46556:9;46552:1;46549;46545:9;46541:25;46537:115;46534:141;;;46655:18;;:::i;:::-;46534:141;46859:1;46791:66;46786:75;46783:1;46779:83;46774:1;46771;46767:9;46763:1;46760;46756:9;46752:25;46748:115;46745:141;;;46866:18;;:::i;:::-;46745:141;47069:1;47001:66;46996:75;46993:1;46989:83;46984:1;46981;46977:9;46973:1;46970;46966:9;46962:25;46958:115;46955:141;;;47076:18;;:::i;:::-;46955:141;47124:1;47121;47117:9;47106:20;;46141:991;;;;:::o;47138:348::-;47178:7;47201:20;47219:1;47201:20;:::i;:::-;47196:25;;47235:20;47253:1;47235:20;:::i;:::-;47230:25;;47423:1;47355:66;47351:74;47348:1;47345:81;47340:1;47333:9;47326:17;47322:105;47319:131;;;47430:18;;:::i;:::-;47319:131;47478:1;47475;47471:9;47460:20;;47138:348;;;;:::o;47492:527::-;47531:4;47551:19;47568:1;47551:19;:::i;:::-;47546:24;;47584:19;47601:1;47584:19;:::i;:::-;47579:24;;47773:1;47705:66;47701:74;47698:1;47694:82;47689:1;47686;47682:9;47675:17;47671:106;47668:132;;;47780:18;;:::i;:::-;47668:132;47959:1;47891:66;47887:74;47884:1;47880:82;47876:1;47873;47869:9;47865:98;47862:124;;;47966:18;;:::i;:::-;47862:124;48011:1;48008;48004:9;47996:17;;47492:527;;;;:::o;48025:191::-;48065:4;48085:20;48103:1;48085:20;:::i;:::-;48080:25;;48119:20;48137:1;48119:20;:::i;:::-;48114:25;;48158:1;48155;48152:8;48149:34;;;48163:18;;:::i;:::-;48149:34;48208:1;48205;48201:9;48193:17;;48025:191;;;;:::o;48222:96::-;48259:7;48288:24;48306:5;48288:24;:::i;:::-;48277:35;;48222:96;;;:::o;48324:104::-;48369:7;48398:24;48416:5;48398:24;:::i;:::-;48387:35;;48324:104;;;:::o;48434:90::-;48468:7;48511:5;48504:13;48497:21;48486:32;;48434:90;;;:::o;48530:149::-;48566:7;48606:66;48599:5;48595:78;48584:89;;48530:149;;;:::o;48685:76::-;48721:7;48750:5;48739:16;;48685:76;;;:::o;48767:126::-;48804:7;48844:42;48837:5;48833:54;48822:65;;48767:126;;;:::o;48899:77::-;48936:7;48965:5;48954:16;;48899:77;;;:::o;48982:154::-;49066:6;49061:3;49056;49043:30;49128:1;49119:6;49114:3;49110:16;49103:27;48982:154;;;:::o;49142:307::-;49210:1;49220:113;49234:6;49231:1;49228:13;49220:113;;;49319:1;49314:3;49310:11;49304:18;49300:1;49295:3;49291:11;49284:39;49256:2;49253:1;49249:10;49244:15;;49220:113;;;49351:6;49348:1;49345:13;49342:101;;;49431:1;49422:6;49417:3;49413:16;49406:27;49342:101;49191:258;49142:307;;;:::o;49455:320::-;49499:6;49536:1;49530:4;49526:12;49516:22;;49583:1;49577:4;49573:12;49604:18;49594:81;;49660:4;49652:6;49648:17;49638:27;;49594:81;49722:2;49714:6;49711:14;49691:18;49688:38;49685:84;;;49741:18;;:::i;:::-;49685:84;49506:269;49455:320;;;:::o;49781:281::-;49864:27;49886:4;49864:27;:::i;:::-;49856:6;49852:40;49994:6;49982:10;49979:22;49958:18;49946:10;49943:34;49940:62;49937:88;;;50005:18;;:::i;:::-;49937:88;50045:10;50041:2;50034:22;49824:238;49781:281;;:::o;50068:233::-;50107:3;50130:24;50148:5;50130:24;:::i;:::-;50121:33;;50176:66;50169:5;50166:77;50163:103;;;50246:18;;:::i;:::-;50163:103;50293:1;50286:5;50282:13;50275:20;;50068:233;;;:::o;50307:79::-;50346:7;50375:5;50364:16;;50307:79;;;:::o;50392:176::-;50424:1;50441:20;50459:1;50441:20;:::i;:::-;50436:25;;50475:20;50493:1;50475:20;:::i;:::-;50470:25;;50514:1;50504:35;;50519:18;;:::i;:::-;50504:35;50560:1;50557;50553:9;50548:14;;50392:176;;;;:::o;50574:180::-;50622:77;50619:1;50612:88;50719:4;50716:1;50709:15;50743:4;50740:1;50733:15;50760:180;50808:77;50805:1;50798:88;50905:4;50902:1;50895:15;50929:4;50926:1;50919:15;50946:180;50994:77;50991:1;50984:88;51091:4;51088:1;51081:15;51115:4;51112:1;51105:15;51132:180;51180:77;51177:1;51170:88;51277:4;51274:1;51267:15;51301:4;51298:1;51291:15;51318:180;51366:77;51363:1;51356:88;51463:4;51460:1;51453:15;51487:4;51484:1;51477:15;51504:117;51613:1;51610;51603:12;51627:117;51736:1;51733;51726:12;51750:117;51859:1;51856;51849:12;51873:117;51982:1;51979;51972:12;51996:117;52105:1;52102;52095:12;52119:117;52228:1;52225;52218:12;52242:102;52283:6;52334:2;52330:7;52325:2;52318:5;52314:14;52310:28;52300:38;;52242:102;;;:::o;52350:221::-;52490:34;52486:1;52478:6;52474:14;52467:58;52559:4;52554:2;52546:6;52542:15;52535:29;52350:221;:::o;52577:178::-;52717:30;52713:1;52705:6;52701:14;52694:54;52577:178;:::o;52761:228::-;52901:34;52897:1;52889:6;52885:14;52878:58;52970:11;52965:2;52957:6;52953:15;52946:36;52761:228;:::o;52995:225::-;53135:34;53131:1;53123:6;53119:14;53112:58;53204:8;53199:2;53191:6;53187:15;53180:33;52995:225;:::o;53226:182::-;53366:34;53362:1;53354:6;53350:14;53343:58;53226:182;:::o;53414:229::-;53554:34;53550:1;53542:6;53538:14;53531:58;53623:12;53618:2;53610:6;53606:15;53599:37;53414:229;:::o;53649:172::-;53789:24;53785:1;53777:6;53773:14;53766:48;53649:172;:::o;53827:165::-;53967:17;53963:1;53955:6;53951:14;53944:41;53827:165;:::o;53998:222::-;54138:34;54134:1;54126:6;54122:14;54115:58;54207:5;54202:2;54194:6;54190:15;54183:30;53998:222;:::o;54226:224::-;54366:34;54362:1;54354:6;54350:14;54343:58;54435:7;54430:2;54422:6;54418:15;54411:32;54226:224;:::o;54456:181::-;54596:33;54592:1;54584:6;54580:14;54573:57;54456:181;:::o;54643:245::-;54783:34;54779:1;54771:6;54767:14;54760:58;54852:28;54847:2;54839:6;54835:15;54828:53;54643:245;:::o;54894:179::-;55034:31;55030:1;55022:6;55018:14;55011:55;54894:179;:::o;55079:178::-;55219:30;55215:1;55207:6;55203:14;55196:54;55079:178;:::o;55263:244::-;55403:34;55399:1;55391:6;55387:14;55380:58;55472:27;55467:2;55459:6;55455:15;55448:52;55263:244;:::o;55513:230::-;55653:34;55649:1;55641:6;55637:14;55630:58;55722:13;55717:2;55709:6;55705:15;55698:38;55513:230;:::o;55749:225::-;55889:34;55885:1;55877:6;55873:14;55866:58;55958:8;55953:2;55945:6;55941:15;55934:33;55749:225;:::o;55980:182::-;56120:34;56116:1;56108:6;56104:14;56097:58;55980:182;:::o;56168:176::-;56308:28;56304:1;56296:6;56292:14;56285:52;56168:176;:::o;56350:237::-;56490:34;56486:1;56478:6;56474:14;56467:58;56559:20;56554:2;56546:6;56542:15;56535:45;56350:237;:::o;56593:221::-;56733:34;56729:1;56721:6;56717:14;56710:58;56802:4;56797:2;56789:6;56785:15;56778:29;56593:221;:::o;56820:179::-;56960:31;56956:1;56948:6;56944:14;56937:55;56820:179;:::o;57005:221::-;57145:34;57141:1;57133:6;57129:14;57122:58;57214:4;57209:2;57201:6;57197:15;57190:29;57005:221;:::o;57232:114::-;;:::o;57352:238::-;57492:34;57488:1;57480:6;57476:14;57469:58;57561:21;57556:2;57548:6;57544:15;57537:46;57352:238;:::o;57596:170::-;57736:22;57732:1;57724:6;57720:14;57713:46;57596:170;:::o;57772:178::-;57912:30;57908:1;57900:6;57896:14;57889:54;57772:178;:::o;57956:220::-;58096:34;58092:1;58084:6;58080:14;58073:58;58165:3;58160:2;58152:6;58148:15;58141:28;57956:220;:::o;58182:227::-;58322:34;58318:1;58310:6;58306:14;58299:58;58391:10;58386:2;58378:6;58374:15;58367:35;58182:227;:::o;58415:169::-;58555:21;58551:1;58543:6;58539:14;58532:45;58415:169;:::o;58590:233::-;58730:34;58726:1;58718:6;58714:14;58707:58;58799:16;58794:2;58786:6;58782:15;58775:41;58590:233;:::o;58829:181::-;58969:33;58965:1;58957:6;58953:14;58946:57;58829:181;:::o;59016:234::-;59156:34;59152:1;59144:6;59140:14;59133:58;59225:17;59220:2;59212:6;59208:15;59201:42;59016:234;:::o;59256:232::-;59396:34;59392:1;59384:6;59380:14;59373:58;59465:15;59460:2;59452:6;59448:15;59441:40;59256:232;:::o;59494:122::-;59567:24;59585:5;59567:24;:::i;:::-;59560:5;59557:35;59547:63;;59606:1;59603;59596:12;59547:63;59494:122;:::o;59622:138::-;59703:32;59729:5;59703:32;:::i;:::-;59696:5;59693:43;59683:71;;59750:1;59747;59740:12;59683:71;59622:138;:::o;59766:116::-;59836:21;59851:5;59836:21;:::i;:::-;59829:5;59826:32;59816:60;;59872:1;59869;59862:12;59816:60;59766:116;:::o;59888:120::-;59960:23;59977:5;59960:23;:::i;:::-;59953:5;59950:34;59940:62;;59998:1;59995;59988:12;59940:62;59888:120;:::o;60014:122::-;60087:24;60105:5;60087:24;:::i;:::-;60080:5;60077:35;60067:63;;60126:1;60123;60116:12;60067:63;60014:122;:::o

Swarm Source

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