ETH Price: $3,418.65 (+1.09%)
Gas: 4 Gwei

Token

Generascope (GS)
 

Overview

Max Total Supply

1,111 GS

Holders

486

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
4 GS
0xa27be4084d7548d8019931877dd9bb75cc028696
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Generascope is a collection generated from 11 hand drawn seed images by Jason Seife.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Generascope

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-13
*/

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/cryptography/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;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 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: @openzeppelin/contracts/utils/Context.sol


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/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: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @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.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

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


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

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/generascope.sol


pragma solidity ^0.8.4;






contract Generascope is ERC721Enumerable, Ownable {
    using SafeMath for uint256;
    using Strings for uint256;
    using ECDSA for bytes32;

    uint256 public constant GS_PRIVATE = 858;
    uint256 public constant GS_PUBLIC = 253;
    uint256 public constant GS_MAX = GS_PRIVATE + GS_PUBLIC;
    uint256 public constant GS_PRICE = 0.3 ether;
    uint256 public constant GS_PURCHASE_LIMIT = 2;

    mapping(address => bool) public presalerList;
    mapping(address => uint256) public allPurchases;

    string private _contractURI;
    string private _tokenBaseURI;

    uint256 public publicAmountMinted;
    uint256 public privateAmountMinted;
    
    bool public presaleLive;
    bool public saleLive;
    bool public locked;

    constructor() ERC721("Generascope", "GS") {}

    modifier notLocked() {
        require(!locked, "Contract metadata methods are locked");
        _;
    }

    function addToPresaleList(address[] calldata entries) external onlyOwner {
        for (uint256 i = 0; i < entries.length; i++) {
            address entry = entries[i];
            require(entry != address(0), "NULL_ADDRESS");
            require(!presalerList[entry], "DUPLICATE_ENTRY");

            presalerList[entry] = true;
        }
    }

    function removeFromPresaleList(address[] calldata entries)
        external
        onlyOwner
    {
        for (uint256 i = 0; i < entries.length; i++) {
            address entry = entries[i];
            require(entry != address(0), "NULL_ADDRESS");

            presalerList[entry] = false;
        }
    }

    function buy(uint256 tokenQuantity) external payable {
        require(saleLive, "SALE_CLOSED");
        require(!presaleLive, "ONLY_PRESALE");
        require(totalSupply() < GS_MAX, "OUT_OF_STOCK");
        require(
            privateAmountMinted.add(publicAmountMinted).add(tokenQuantity) <= GS_MAX,
            "EXCEED_AVAILABLE"
        );
        require(
            allPurchases[msg.sender].add(tokenQuantity) <=
                GS_PURCHASE_LIMIT,
            "EXCEED_ALLOC"
        );
        require(GS_PRICE.mul(tokenQuantity) == msg.value, "INCORRECT_ETH_AMOUNT");

        for (uint256 i = 0; i < tokenQuantity; i++) {
            publicAmountMinted++;
            allPurchases[msg.sender]++;
            _safeMint(msg.sender, totalSupply() + 1);
        }
    }

    function presaleBuy(uint256 tokenQuantity) external payable {
        require(!saleLive && presaleLive, "PRESALE_CLOSED");
        require(presalerList[msg.sender], "NOT_QUALIFIED");
        require(totalSupply() < GS_MAX, "OUT_OF_STOCK");
        require(
            privateAmountMinted.add(tokenQuantity) <= GS_PRIVATE,
            "EXCEED_PRIVATE"
        );
        require(
            allPurchases[msg.sender].add(tokenQuantity) <=
                GS_PURCHASE_LIMIT,
            "EXCEED_ALLOC"
        );
        require(GS_PRICE.mul(tokenQuantity) == msg.value, "INCORRECT_ETH_AMOUNT");

        for (uint256 i = 0; i < tokenQuantity; i++) {
            privateAmountMinted++;
            allPurchases[msg.sender]++;
            _safeMint(msg.sender, totalSupply() + 1);
        }
    }

    function withdraw() external onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }

    function isPresaler(address addr) external view returns (bool) {
        return presalerList[addr];
    }

    function allPurchasedCount(address addr)
        external
        view
        returns (uint256)
    {
        return allPurchases[addr];
    }

    // Owner functions for enabling presale and sale
    function lockMetadata() external onlyOwner {
        locked = true;
    }

    function togglePresaleStatus() external onlyOwner {
        presaleLive = !presaleLive;
    }

    function toggleSaleStatus() external onlyOwner {
        saleLive = !saleLive;
    }

    function setContractURI(string calldata URI) external onlyOwner notLocked {
        _contractURI = URI;
    }

    function setBaseURI(string calldata URI) external onlyOwner notLocked {
        _tokenBaseURI = URI;
    }

    function contractURI() public view returns (string memory) {
        return _contractURI;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721)
        returns (string memory)
    {
        require(_exists(tokenId), "Cannot query non-existent token");

        return string(abi.encodePacked(_tokenBaseURI, tokenId.toString(), ".json"));
    }
}

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"},{"inputs":[],"name":"GS_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GS_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GS_PRIVATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GS_PUBLIC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GS_PURCHASE_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"entries","type":"address[]"}],"name":"addToPresaleList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"allPurchasedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allPurchases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenQuantity","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isPresaler","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenQuantity","type":"uint256"}],"name":"presaleBuy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presaleLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presalerList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateAmountMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicAmountMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"entries","type":"address[]"}],"name":"removeFromPresaleList","outputs":[],"stateMutability":"nonpayable","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":"saleLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePresaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280600b81526020017f47656e65726173636f70650000000000000000000000000000000000000000008152506040518060400160405280600281526020017f4753000000000000000000000000000000000000000000000000000000000000815250816000908051906020019062000096929190620001a6565b508060019080519060200190620000af929190620001a6565b505050620000d2620000c6620000d860201b60201c565b620000e060201b60201c565b620002bb565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001b49062000285565b90600052602060002090601f016020900481019282620001d8576000855562000224565b82601f10620001f357805160ff191683800117855562000224565b8280016001018555821562000224579182015b828111156200022357825182559160200191906001019062000206565b5b50905062000233919062000237565b5090565b5b808211156200025257600081600090555060010162000238565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200029e57607f821691505b60208210811415620002b557620002b462000256565b5b50919050565b61514380620002cb6000396000f3fe6080604052600436106102675760003560e01c806383a9e04911610144578063b88d4fde116100b6578063e51cec421161007a578063e51cec42146108ee578063e8a3d48514610919578063e985e9c514610944578063f2fde38b14610981578063f6a1e3a9146109aa578063fc524976146109d557610267565b8063b88d4fde14610816578063c87b56dd1461083f578063cf3090121461087c578063d96a094a146108a7578063e081b781146108c357610267565b806395d89b411161010857806395d89b4114610708578063989bdbb6146107335780639cf2e8d61461074a5780639e273b2f14610787578063a22cb465146107c4578063b179e060146107ed57610267565b806383a9e049146106335780638da5cb5b1461065e578063938e3d7b14610689578063940f1ada146106b257806395721ff6146106dd57610267565b80633ccfd60b116101dd5780636352211e116101a15780636352211e1461054657806370a0823114610583578063715018a6146105c05780637204a3c9146105d75780637bffb4ce14610600578063815f7bbd1461061757610267565b80633ccfd60b1461047557806342842e0e1461048c5780634f6ccce7146104b557806355f804b3146104f257806359a12ad51461051b57610267565b806318160ddd1161022f57806318160ddd146103515780631829831f1461037c57806323b872dd146103a7578063299980e5146103d05780632f745c591461040d57806338c7aeda1461044a57610267565b806301ffc9a71461026c578063049c5c49146102a957806306fdde03146102c0578063081812fc146102eb578063095ea7b314610328575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e91906136d0565b610a12565b6040516102a09190613718565b60405180910390f35b3480156102b557600080fd5b506102be610a8c565b005b3480156102cc57600080fd5b506102d5610b34565b6040516102e291906137cc565b60405180910390f35b3480156102f757600080fd5b50610312600480360381019061030d9190613824565b610bc6565b60405161031f9190613892565b60405180910390f35b34801561033457600080fd5b5061034f600480360381019061034a91906138d9565b610c4b565b005b34801561035d57600080fd5b50610366610d63565b6040516103739190613928565b60405180910390f35b34801561038857600080fd5b50610391610d70565b60405161039e9190613928565b60405180910390f35b3480156103b357600080fd5b506103ce60048036038101906103c99190613943565b610d7c565b005b3480156103dc57600080fd5b506103f760048036038101906103f29190613996565b610ddc565b6040516104049190613928565b60405180910390f35b34801561041957600080fd5b50610434600480360381019061042f91906138d9565b610e25565b6040516104419190613928565b60405180910390f35b34801561045657600080fd5b5061045f610eca565b60405161046c9190613928565b60405180910390f35b34801561048157600080fd5b5061048a610ecf565b005b34801561049857600080fd5b506104b360048036038101906104ae9190613943565b610f94565b005b3480156104c157600080fd5b506104dc60048036038101906104d79190613824565b610fb4565b6040516104e99190613928565b60405180910390f35b3480156104fe57600080fd5b5061051960048036038101906105149190613a28565b611025565b005b34801561052757600080fd5b50610530611107565b60405161053d9190613928565b60405180910390f35b34801561055257600080fd5b5061056d60048036038101906105689190613824565b61110d565b60405161057a9190613892565b60405180910390f35b34801561058f57600080fd5b506105aa60048036038101906105a59190613996565b6111bf565b6040516105b79190613928565b60405180910390f35b3480156105cc57600080fd5b506105d5611277565b005b3480156105e357600080fd5b506105fe60048036038101906105f99190613acb565b6112ff565b005b34801561060c57600080fd5b50610615611523565b005b610631600480360381019061062c9190613824565b6115cb565b005b34801561063f57600080fd5b5061064861190c565b6040516106559190613718565b60405180910390f35b34801561066a57600080fd5b5061067361191f565b6040516106809190613892565b60405180910390f35b34801561069557600080fd5b506106b060048036038101906106ab9190613a28565b611949565b005b3480156106be57600080fd5b506106c7611a2b565b6040516106d49190613928565b60405180910390f35b3480156106e957600080fd5b506106f2611a31565b6040516106ff9190613928565b60405180910390f35b34801561071457600080fd5b5061071d611a37565b60405161072a91906137cc565b60405180910390f35b34801561073f57600080fd5b50610748611ac9565b005b34801561075657600080fd5b50610771600480360381019061076c9190613996565b611b62565b60405161077e9190613718565b60405180910390f35b34801561079357600080fd5b506107ae60048036038101906107a99190613996565b611b82565b6040516107bb9190613718565b60405180910390f35b3480156107d057600080fd5b506107eb60048036038101906107e69190613b44565b611bd8565b005b3480156107f957600080fd5b50610814600480360381019061080f9190613acb565b611bee565b005b34801561082257600080fd5b5061083d60048036038101906108389190613cb4565b611d85565b005b34801561084b57600080fd5b5061086660048036038101906108619190613824565b611de7565b60405161087391906137cc565b60405180910390f35b34801561088857600080fd5b50610891611e63565b60405161089e9190613718565b60405180910390f35b6108c160048036038101906108bc9190613824565b611e76565b005b3480156108cf57600080fd5b506108d8612182565b6040516108e59190613718565b60405180910390f35b3480156108fa57600080fd5b50610903612195565b6040516109109190613928565b60405180910390f35b34801561092557600080fd5b5061092e61219a565b60405161093b91906137cc565b60405180910390f35b34801561095057600080fd5b5061096b60048036038101906109669190613d37565b61222c565b6040516109789190613718565b60405180910390f35b34801561098d57600080fd5b506109a860048036038101906109a39190613996565b6122c0565b005b3480156109b657600080fd5b506109bf6123b8565b6040516109cc9190613928565b60405180910390f35b3480156109e157600080fd5b506109fc60048036038101906109f79190613996565b6123ca565b604051610a099190613928565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a855750610a84826123e2565b5b9050919050565b610a946124c4565b73ffffffffffffffffffffffffffffffffffffffff16610ab261191f565b73ffffffffffffffffffffffffffffffffffffffff1614610b08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aff90613dc3565b60405180910390fd5b601160019054906101000a900460ff1615601160016101000a81548160ff021916908315150217905550565b606060008054610b4390613e12565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6f90613e12565b8015610bbc5780601f10610b9157610100808354040283529160200191610bbc565b820191906000526020600020905b815481529060010190602001808311610b9f57829003601f168201915b5050505050905090565b6000610bd1826124cc565b610c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0790613eb6565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c568261110d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbe90613f48565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ce66124c4565b73ffffffffffffffffffffffffffffffffffffffff161480610d155750610d1481610d0f6124c4565b61222c565b5b610d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4b90613fda565b60405180910390fd5b610d5e8383612538565b505050565b6000600880549050905090565b670429d069189e000081565b610d8d610d876124c4565b826125f1565b610dcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc39061406c565b60405180910390fd5b610dd78383836126cf565b505050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000610e30836111bf565b8210610e71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e68906140fe565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60fd81565b610ed76124c4565b73ffffffffffffffffffffffffffffffffffffffff16610ef561191f565b73ffffffffffffffffffffffffffffffffffffffff1614610f4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4290613dc3565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610f91573d6000803e3d6000fd5b50565b610faf83838360405180602001604052806000815250611d85565b505050565b6000610fbe610d63565b8210610fff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff690614190565b60405180910390fd5b60088281548110611013576110126141b0565b5b90600052602060002001549050919050565b61102d6124c4565b73ffffffffffffffffffffffffffffffffffffffff1661104b61191f565b73ffffffffffffffffffffffffffffffffffffffff16146110a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109890613dc3565b60405180910390fd5b601160029054906101000a900460ff16156110f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e890614251565b60405180910390fd5b8181600e91906111029291906135c1565b505050565b60105481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ad906142e3565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611230576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122790614375565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61127f6124c4565b73ffffffffffffffffffffffffffffffffffffffff1661129d61191f565b73ffffffffffffffffffffffffffffffffffffffff16146112f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ea90613dc3565b60405180910390fd5b6112fd600061292b565b565b6113076124c4565b73ffffffffffffffffffffffffffffffffffffffff1661132561191f565b73ffffffffffffffffffffffffffffffffffffffff161461137b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137290613dc3565b60405180910390fd5b60005b8282905081101561151e57600083838381811061139e5761139d6141b0565b5b90506020020160208101906113b39190613996565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611425576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141c906143e1565b60405180910390fd5b600b60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156114b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a99061444d565b60405180910390fd5b6001600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505080806115169061449c565b91505061137e565b505050565b61152b6124c4565b73ffffffffffffffffffffffffffffffffffffffff1661154961191f565b73ffffffffffffffffffffffffffffffffffffffff161461159f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159690613dc3565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b601160019054906101000a900460ff161580156115f45750601160009054906101000a900460ff165b611633576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162a90614531565b60405180910390fd5b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166116bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b69061459d565b60405180910390fd5b60fd61035a6116ce91906145bd565b6116d6610d63565b10611716576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170d9061465f565b60405180910390fd5b61035a61172e826010546129f190919063ffffffff16565b111561176f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611766906146cb565b60405180910390fd5b60026117c382600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129f190919063ffffffff16565b1115611804576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fb90614737565b60405180910390fd5b3461182082670429d069189e0000612a0790919063ffffffff16565b14611860576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611857906147a3565b60405180910390fd5b60005b81811015611908576010600081548092919061187e9061449c565b9190505550600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906118d39061449c565b91905055506118f53360016118e6610d63565b6118f091906145bd565b612a1d565b80806119009061449c565b915050611863565b5050565b601160009054906101000a900460ff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6119516124c4565b73ffffffffffffffffffffffffffffffffffffffff1661196f61191f565b73ffffffffffffffffffffffffffffffffffffffff16146119c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bc90613dc3565b60405180910390fd5b601160029054906101000a900460ff1615611a15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0c90614251565b60405180910390fd5b8181600d9190611a269291906135c1565b505050565b600f5481565b61035a81565b606060018054611a4690613e12565b80601f0160208091040260200160405190810160405280929190818152602001828054611a7290613e12565b8015611abf5780601f10611a9457610100808354040283529160200191611abf565b820191906000526020600020905b815481529060010190602001808311611aa257829003601f168201915b5050505050905090565b611ad16124c4565b73ffffffffffffffffffffffffffffffffffffffff16611aef61191f565b73ffffffffffffffffffffffffffffffffffffffff1614611b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3c90613dc3565b60405180910390fd5b6001601160026101000a81548160ff021916908315150217905550565b600b6020528060005260406000206000915054906101000a900460ff1681565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611bea611be36124c4565b8383612a3b565b5050565b611bf66124c4565b73ffffffffffffffffffffffffffffffffffffffff16611c1461191f565b73ffffffffffffffffffffffffffffffffffffffff1614611c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6190613dc3565b60405180910390fd5b60005b82829050811015611d80576000838383818110611c8d57611c8c6141b0565b5b9050602002016020810190611ca29190613996565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0b906143e1565b60405180910390fd5b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550508080611d789061449c565b915050611c6d565b505050565b611d96611d906124c4565b836125f1565b611dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dcc9061406c565b60405180910390fd5b611de184848484612ba8565b50505050565b6060611df2826124cc565b611e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e289061480f565b60405180910390fd5b600e611e3c83612c04565b604051602001611e4d92919061494b565b6040516020818303038152906040529050919050565b601160029054906101000a900460ff1681565b601160019054906101000a900460ff16611ec5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebc906149c6565b60405180910390fd5b601160009054906101000a900460ff1615611f15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0c90614a32565b60405180910390fd5b60fd61035a611f2491906145bd565b611f2c610d63565b10611f6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f639061465f565b60405180910390fd5b60fd61035a611f7b91906145bd565b611fa482611f96600f546010546129f190919063ffffffff16565b6129f190919063ffffffff16565b1115611fe5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdc90614a9e565b60405180910390fd5b600261203982600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129f190919063ffffffff16565b111561207a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207190614737565b60405180910390fd5b3461209682670429d069189e0000612a0790919063ffffffff16565b146120d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cd906147a3565b60405180910390fd5b60005b8181101561217e57600f60008154809291906120f49061449c565b9190505550600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906121499061449c565b919050555061216b33600161215c610d63565b61216691906145bd565b612a1d565b80806121769061449c565b9150506120d9565b5050565b601160019054906101000a900460ff1681565b600281565b6060600d80546121a990613e12565b80601f01602080910402602001604051908101604052809291908181526020018280546121d590613e12565b80156122225780601f106121f757610100808354040283529160200191612222565b820191906000526020600020905b81548152906001019060200180831161220557829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122c86124c4565b73ffffffffffffffffffffffffffffffffffffffff166122e661191f565b73ffffffffffffffffffffffffffffffffffffffff161461233c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233390613dc3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a390614b30565b60405180910390fd5b6123b58161292b565b50565b60fd61035a6123c791906145bd565b81565b600c6020528060005260406000206000915090505481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806124ad57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806124bd57506124bc82612d65565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166125ab8361110d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006125fc826124cc565b61263b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263290614bc2565b60405180910390fd5b60006126468361110d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806126b557508373ffffffffffffffffffffffffffffffffffffffff1661269d84610bc6565b73ffffffffffffffffffffffffffffffffffffffff16145b806126c657506126c5818561222c565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166126ef8261110d565b73ffffffffffffffffffffffffffffffffffffffff1614612745576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273c90614c54565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ac90614ce6565b60405180910390fd5b6127c0838383612dcf565b6127cb600082612538565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461281b9190614d06565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461287291906145bd565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081836129ff91906145bd565b905092915050565b60008183612a159190614d3a565b905092915050565b612a37828260405180602001604052806000815250612ee3565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aa190614de0565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612b9b9190613718565b60405180910390a3505050565b612bb38484846126cf565b612bbf84848484612f3e565b612bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf590614e72565b60405180910390fd5b50505050565b60606000821415612c4c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d60565b600082905060005b60008214612c7e578080612c679061449c565b915050600a82612c779190614ec1565b9150612c54565b60008167ffffffffffffffff811115612c9a57612c99613b89565b5b6040519080825280601f01601f191660200182016040528015612ccc5781602001600182028036833780820191505090505b5090505b60008514612d5957600182612ce59190614d06565b9150600a85612cf49190614ef2565b6030612d0091906145bd565b60f81b818381518110612d1657612d156141b0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d529190614ec1565b9450612cd0565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612dda8383836130d5565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612e1d57612e18816130da565b612e5c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612e5b57612e5a8382613123565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e9f57612e9a81613290565b612ede565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612edd57612edc8282613361565b5b5b505050565b612eed83836133e0565b612efa6000848484612f3e565b612f39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3090614e72565b60405180910390fd5b505050565b6000612f5f8473ffffffffffffffffffffffffffffffffffffffff166135ae565b156130c8578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f886124c4565b8786866040518563ffffffff1660e01b8152600401612faa9493929190614f78565b602060405180830381600087803b158015612fc457600080fd5b505af1925050508015612ff557506040513d601f19601f82011682018060405250810190612ff29190614fd9565b60015b613078573d8060008114613025576040519150601f19603f3d011682016040523d82523d6000602084013e61302a565b606091505b50600081511415613070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306790614e72565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506130cd565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613130846111bf565b61313a9190614d06565b905060006007600084815260200190815260200160002054905081811461321f576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506132a49190614d06565b90506000600960008481526020019081526020016000205490506000600883815481106132d4576132d36141b0565b5b9060005260206000200154905080600883815481106132f6576132f56141b0565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061334557613344615006565b5b6001900381819060005260206000200160009055905550505050565b600061336c836111bf565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613450576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161344790615081565b60405180910390fd5b613459816124cc565b15613499576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613490906150ed565b60405180910390fd5b6134a560008383612dcf565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134f591906145bd565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546135cd90613e12565b90600052602060002090601f0160209004810192826135ef5760008555613636565b82601f1061360857803560ff1916838001178555613636565b82800160010185558215613636579182015b8281111561363557823582559160200191906001019061361a565b5b5090506136439190613647565b5090565b5b80821115613660576000816000905550600101613648565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6136ad81613678565b81146136b857600080fd5b50565b6000813590506136ca816136a4565b92915050565b6000602082840312156136e6576136e561366e565b5b60006136f4848285016136bb565b91505092915050565b60008115159050919050565b613712816136fd565b82525050565b600060208201905061372d6000830184613709565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561376d578082015181840152602081019050613752565b8381111561377c576000848401525b50505050565b6000601f19601f8301169050919050565b600061379e82613733565b6137a8818561373e565b93506137b881856020860161374f565b6137c181613782565b840191505092915050565b600060208201905081810360008301526137e68184613793565b905092915050565b6000819050919050565b613801816137ee565b811461380c57600080fd5b50565b60008135905061381e816137f8565b92915050565b60006020828403121561383a5761383961366e565b5b60006138488482850161380f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061387c82613851565b9050919050565b61388c81613871565b82525050565b60006020820190506138a76000830184613883565b92915050565b6138b681613871565b81146138c157600080fd5b50565b6000813590506138d3816138ad565b92915050565b600080604083850312156138f0576138ef61366e565b5b60006138fe858286016138c4565b925050602061390f8582860161380f565b9150509250929050565b613922816137ee565b82525050565b600060208201905061393d6000830184613919565b92915050565b60008060006060848603121561395c5761395b61366e565b5b600061396a868287016138c4565b935050602061397b868287016138c4565b925050604061398c8682870161380f565b9150509250925092565b6000602082840312156139ac576139ab61366e565b5b60006139ba848285016138c4565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126139e8576139e76139c3565b5b8235905067ffffffffffffffff811115613a0557613a046139c8565b5b602083019150836001820283011115613a2157613a206139cd565b5b9250929050565b60008060208385031215613a3f57613a3e61366e565b5b600083013567ffffffffffffffff811115613a5d57613a5c613673565b5b613a69858286016139d2565b92509250509250929050565b60008083601f840112613a8b57613a8a6139c3565b5b8235905067ffffffffffffffff811115613aa857613aa76139c8565b5b602083019150836020820283011115613ac457613ac36139cd565b5b9250929050565b60008060208385031215613ae257613ae161366e565b5b600083013567ffffffffffffffff811115613b0057613aff613673565b5b613b0c85828601613a75565b92509250509250929050565b613b21816136fd565b8114613b2c57600080fd5b50565b600081359050613b3e81613b18565b92915050565b60008060408385031215613b5b57613b5a61366e565b5b6000613b69858286016138c4565b9250506020613b7a85828601613b2f565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613bc182613782565b810181811067ffffffffffffffff82111715613be057613bdf613b89565b5b80604052505050565b6000613bf3613664565b9050613bff8282613bb8565b919050565b600067ffffffffffffffff821115613c1f57613c1e613b89565b5b613c2882613782565b9050602081019050919050565b82818337600083830152505050565b6000613c57613c5284613c04565b613be9565b905082815260208101848484011115613c7357613c72613b84565b5b613c7e848285613c35565b509392505050565b600082601f830112613c9b57613c9a6139c3565b5b8135613cab848260208601613c44565b91505092915050565b60008060008060808587031215613cce57613ccd61366e565b5b6000613cdc878288016138c4565b9450506020613ced878288016138c4565b9350506040613cfe8782880161380f565b925050606085013567ffffffffffffffff811115613d1f57613d1e613673565b5b613d2b87828801613c86565b91505092959194509250565b60008060408385031215613d4e57613d4d61366e565b5b6000613d5c858286016138c4565b9250506020613d6d858286016138c4565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613dad60208361373e565b9150613db882613d77565b602082019050919050565b60006020820190508181036000830152613ddc81613da0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613e2a57607f821691505b60208210811415613e3e57613e3d613de3565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613ea0602c8361373e565b9150613eab82613e44565b604082019050919050565b60006020820190508181036000830152613ecf81613e93565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613f3260218361373e565b9150613f3d82613ed6565b604082019050919050565b60006020820190508181036000830152613f6181613f25565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613fc460388361373e565b9150613fcf82613f68565b604082019050919050565b60006020820190508181036000830152613ff381613fb7565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b600061405660318361373e565b915061406182613ffa565b604082019050919050565b6000602082019050818103600083015261408581614049565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006140e8602b8361373e565b91506140f38261408c565b604082019050919050565b60006020820190508181036000830152614117816140db565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b600061417a602c8361373e565b91506141858261411e565b604082019050919050565b600060208201905081810360008301526141a98161416d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f436f6e7472616374206d65746164617461206d6574686f647320617265206c6f60008201527f636b656400000000000000000000000000000000000000000000000000000000602082015250565b600061423b60248361373e565b9150614246826141df565b604082019050919050565b6000602082019050818103600083015261426a8161422e565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006142cd60298361373e565b91506142d882614271565b604082019050919050565b600060208201905081810360008301526142fc816142c0565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061435f602a8361373e565b915061436a82614303565b604082019050919050565b6000602082019050818103600083015261438e81614352565b9050919050565b7f4e554c4c5f414444524553530000000000000000000000000000000000000000600082015250565b60006143cb600c8361373e565b91506143d682614395565b602082019050919050565b600060208201905081810360008301526143fa816143be565b9050919050565b7f4455504c49434154455f454e5452590000000000000000000000000000000000600082015250565b6000614437600f8361373e565b915061444282614401565b602082019050919050565b600060208201905081810360008301526144668161442a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006144a7826137ee565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156144da576144d961446d565b5b600182019050919050565b7f50524553414c455f434c4f534544000000000000000000000000000000000000600082015250565b600061451b600e8361373e565b9150614526826144e5565b602082019050919050565b6000602082019050818103600083015261454a8161450e565b9050919050565b7f4e4f545f5155414c494649454400000000000000000000000000000000000000600082015250565b6000614587600d8361373e565b915061459282614551565b602082019050919050565b600060208201905081810360008301526145b68161457a565b9050919050565b60006145c8826137ee565b91506145d3836137ee565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146085761460761446d565b5b828201905092915050565b7f4f55545f4f465f53544f434b0000000000000000000000000000000000000000600082015250565b6000614649600c8361373e565b915061465482614613565b602082019050919050565b600060208201905081810360008301526146788161463c565b9050919050565b7f4558434545445f50524956415445000000000000000000000000000000000000600082015250565b60006146b5600e8361373e565b91506146c08261467f565b602082019050919050565b600060208201905081810360008301526146e4816146a8565b9050919050565b7f4558434545445f414c4c4f430000000000000000000000000000000000000000600082015250565b6000614721600c8361373e565b915061472c826146eb565b602082019050919050565b6000602082019050818103600083015261475081614714565b9050919050565b7f494e434f52524543545f4554485f414d4f554e54000000000000000000000000600082015250565b600061478d60148361373e565b915061479882614757565b602082019050919050565b600060208201905081810360008301526147bc81614780565b9050919050565b7f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e00600082015250565b60006147f9601f8361373e565b9150614804826147c3565b602082019050919050565b60006020820190508181036000830152614828816147ec565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461485c81613e12565b614866818661482f565b945060018216600081146148815760018114614892576148c5565b60ff198316865281860193506148c5565b61489b8561483a565b60005b838110156148bd5781548189015260018201915060208101905061489e565b838801955050505b50505092915050565b60006148d982613733565b6148e3818561482f565b93506148f381856020860161374f565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061493560058361482f565b9150614940826148ff565b600582019050919050565b6000614957828561484f565b915061496382846148ce565b915061496e82614928565b91508190509392505050565b7f53414c455f434c4f534544000000000000000000000000000000000000000000600082015250565b60006149b0600b8361373e565b91506149bb8261497a565b602082019050919050565b600060208201905081810360008301526149df816149a3565b9050919050565b7f4f4e4c595f50524553414c450000000000000000000000000000000000000000600082015250565b6000614a1c600c8361373e565b9150614a27826149e6565b602082019050919050565b60006020820190508181036000830152614a4b81614a0f565b9050919050565b7f4558434545445f415641494c41424c4500000000000000000000000000000000600082015250565b6000614a8860108361373e565b9150614a9382614a52565b602082019050919050565b60006020820190508181036000830152614ab781614a7b565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614b1a60268361373e565b9150614b2582614abe565b604082019050919050565b60006020820190508181036000830152614b4981614b0d565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614bac602c8361373e565b9150614bb782614b50565b604082019050919050565b60006020820190508181036000830152614bdb81614b9f565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000614c3e60298361373e565b9150614c4982614be2565b604082019050919050565b60006020820190508181036000830152614c6d81614c31565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614cd060248361373e565b9150614cdb82614c74565b604082019050919050565b60006020820190508181036000830152614cff81614cc3565b9050919050565b6000614d11826137ee565b9150614d1c836137ee565b925082821015614d2f57614d2e61446d565b5b828203905092915050565b6000614d45826137ee565b9150614d50836137ee565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d8957614d8861446d565b5b828202905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614dca60198361373e565b9150614dd582614d94565b602082019050919050565b60006020820190508181036000830152614df981614dbd565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614e5c60328361373e565b9150614e6782614e00565b604082019050919050565b60006020820190508181036000830152614e8b81614e4f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614ecc826137ee565b9150614ed7836137ee565b925082614ee757614ee6614e92565b5b828204905092915050565b6000614efd826137ee565b9150614f08836137ee565b925082614f1857614f17614e92565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000614f4a82614f23565b614f548185614f2e565b9350614f6481856020860161374f565b614f6d81613782565b840191505092915050565b6000608082019050614f8d6000830187613883565b614f9a6020830186613883565b614fa76040830185613919565b8181036060830152614fb98184614f3f565b905095945050505050565b600081519050614fd3816136a4565b92915050565b600060208284031215614fef57614fee61366e565b5b6000614ffd84828501614fc4565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061506b60208361373e565b915061507682615035565b602082019050919050565b6000602082019050818103600083015261509a8161505e565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006150d7601c8361373e565b91506150e2826150a1565b602082019050919050565b60006020820190508181036000830152615106816150ca565b905091905056fea26469706673582212200750cda3ba0330c0bd222a53157ceac357098d5ac043b58c02e4be8d9c8d4f3664736f6c63430008090033

Deployed Bytecode

0x6080604052600436106102675760003560e01c806383a9e04911610144578063b88d4fde116100b6578063e51cec421161007a578063e51cec42146108ee578063e8a3d48514610919578063e985e9c514610944578063f2fde38b14610981578063f6a1e3a9146109aa578063fc524976146109d557610267565b8063b88d4fde14610816578063c87b56dd1461083f578063cf3090121461087c578063d96a094a146108a7578063e081b781146108c357610267565b806395d89b411161010857806395d89b4114610708578063989bdbb6146107335780639cf2e8d61461074a5780639e273b2f14610787578063a22cb465146107c4578063b179e060146107ed57610267565b806383a9e049146106335780638da5cb5b1461065e578063938e3d7b14610689578063940f1ada146106b257806395721ff6146106dd57610267565b80633ccfd60b116101dd5780636352211e116101a15780636352211e1461054657806370a0823114610583578063715018a6146105c05780637204a3c9146105d75780637bffb4ce14610600578063815f7bbd1461061757610267565b80633ccfd60b1461047557806342842e0e1461048c5780634f6ccce7146104b557806355f804b3146104f257806359a12ad51461051b57610267565b806318160ddd1161022f57806318160ddd146103515780631829831f1461037c57806323b872dd146103a7578063299980e5146103d05780632f745c591461040d57806338c7aeda1461044a57610267565b806301ffc9a71461026c578063049c5c49146102a957806306fdde03146102c0578063081812fc146102eb578063095ea7b314610328575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e91906136d0565b610a12565b6040516102a09190613718565b60405180910390f35b3480156102b557600080fd5b506102be610a8c565b005b3480156102cc57600080fd5b506102d5610b34565b6040516102e291906137cc565b60405180910390f35b3480156102f757600080fd5b50610312600480360381019061030d9190613824565b610bc6565b60405161031f9190613892565b60405180910390f35b34801561033457600080fd5b5061034f600480360381019061034a91906138d9565b610c4b565b005b34801561035d57600080fd5b50610366610d63565b6040516103739190613928565b60405180910390f35b34801561038857600080fd5b50610391610d70565b60405161039e9190613928565b60405180910390f35b3480156103b357600080fd5b506103ce60048036038101906103c99190613943565b610d7c565b005b3480156103dc57600080fd5b506103f760048036038101906103f29190613996565b610ddc565b6040516104049190613928565b60405180910390f35b34801561041957600080fd5b50610434600480360381019061042f91906138d9565b610e25565b6040516104419190613928565b60405180910390f35b34801561045657600080fd5b5061045f610eca565b60405161046c9190613928565b60405180910390f35b34801561048157600080fd5b5061048a610ecf565b005b34801561049857600080fd5b506104b360048036038101906104ae9190613943565b610f94565b005b3480156104c157600080fd5b506104dc60048036038101906104d79190613824565b610fb4565b6040516104e99190613928565b60405180910390f35b3480156104fe57600080fd5b5061051960048036038101906105149190613a28565b611025565b005b34801561052757600080fd5b50610530611107565b60405161053d9190613928565b60405180910390f35b34801561055257600080fd5b5061056d60048036038101906105689190613824565b61110d565b60405161057a9190613892565b60405180910390f35b34801561058f57600080fd5b506105aa60048036038101906105a59190613996565b6111bf565b6040516105b79190613928565b60405180910390f35b3480156105cc57600080fd5b506105d5611277565b005b3480156105e357600080fd5b506105fe60048036038101906105f99190613acb565b6112ff565b005b34801561060c57600080fd5b50610615611523565b005b610631600480360381019061062c9190613824565b6115cb565b005b34801561063f57600080fd5b5061064861190c565b6040516106559190613718565b60405180910390f35b34801561066a57600080fd5b5061067361191f565b6040516106809190613892565b60405180910390f35b34801561069557600080fd5b506106b060048036038101906106ab9190613a28565b611949565b005b3480156106be57600080fd5b506106c7611a2b565b6040516106d49190613928565b60405180910390f35b3480156106e957600080fd5b506106f2611a31565b6040516106ff9190613928565b60405180910390f35b34801561071457600080fd5b5061071d611a37565b60405161072a91906137cc565b60405180910390f35b34801561073f57600080fd5b50610748611ac9565b005b34801561075657600080fd5b50610771600480360381019061076c9190613996565b611b62565b60405161077e9190613718565b60405180910390f35b34801561079357600080fd5b506107ae60048036038101906107a99190613996565b611b82565b6040516107bb9190613718565b60405180910390f35b3480156107d057600080fd5b506107eb60048036038101906107e69190613b44565b611bd8565b005b3480156107f957600080fd5b50610814600480360381019061080f9190613acb565b611bee565b005b34801561082257600080fd5b5061083d60048036038101906108389190613cb4565b611d85565b005b34801561084b57600080fd5b5061086660048036038101906108619190613824565b611de7565b60405161087391906137cc565b60405180910390f35b34801561088857600080fd5b50610891611e63565b60405161089e9190613718565b60405180910390f35b6108c160048036038101906108bc9190613824565b611e76565b005b3480156108cf57600080fd5b506108d8612182565b6040516108e59190613718565b60405180910390f35b3480156108fa57600080fd5b50610903612195565b6040516109109190613928565b60405180910390f35b34801561092557600080fd5b5061092e61219a565b60405161093b91906137cc565b60405180910390f35b34801561095057600080fd5b5061096b60048036038101906109669190613d37565b61222c565b6040516109789190613718565b60405180910390f35b34801561098d57600080fd5b506109a860048036038101906109a39190613996565b6122c0565b005b3480156109b657600080fd5b506109bf6123b8565b6040516109cc9190613928565b60405180910390f35b3480156109e157600080fd5b506109fc60048036038101906109f79190613996565b6123ca565b604051610a099190613928565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a855750610a84826123e2565b5b9050919050565b610a946124c4565b73ffffffffffffffffffffffffffffffffffffffff16610ab261191f565b73ffffffffffffffffffffffffffffffffffffffff1614610b08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aff90613dc3565b60405180910390fd5b601160019054906101000a900460ff1615601160016101000a81548160ff021916908315150217905550565b606060008054610b4390613e12565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6f90613e12565b8015610bbc5780601f10610b9157610100808354040283529160200191610bbc565b820191906000526020600020905b815481529060010190602001808311610b9f57829003601f168201915b5050505050905090565b6000610bd1826124cc565b610c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0790613eb6565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c568261110d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbe90613f48565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ce66124c4565b73ffffffffffffffffffffffffffffffffffffffff161480610d155750610d1481610d0f6124c4565b61222c565b5b610d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4b90613fda565b60405180910390fd5b610d5e8383612538565b505050565b6000600880549050905090565b670429d069189e000081565b610d8d610d876124c4565b826125f1565b610dcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc39061406c565b60405180910390fd5b610dd78383836126cf565b505050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000610e30836111bf565b8210610e71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e68906140fe565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60fd81565b610ed76124c4565b73ffffffffffffffffffffffffffffffffffffffff16610ef561191f565b73ffffffffffffffffffffffffffffffffffffffff1614610f4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4290613dc3565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610f91573d6000803e3d6000fd5b50565b610faf83838360405180602001604052806000815250611d85565b505050565b6000610fbe610d63565b8210610fff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff690614190565b60405180910390fd5b60088281548110611013576110126141b0565b5b90600052602060002001549050919050565b61102d6124c4565b73ffffffffffffffffffffffffffffffffffffffff1661104b61191f565b73ffffffffffffffffffffffffffffffffffffffff16146110a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109890613dc3565b60405180910390fd5b601160029054906101000a900460ff16156110f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e890614251565b60405180910390fd5b8181600e91906111029291906135c1565b505050565b60105481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ad906142e3565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611230576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122790614375565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61127f6124c4565b73ffffffffffffffffffffffffffffffffffffffff1661129d61191f565b73ffffffffffffffffffffffffffffffffffffffff16146112f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ea90613dc3565b60405180910390fd5b6112fd600061292b565b565b6113076124c4565b73ffffffffffffffffffffffffffffffffffffffff1661132561191f565b73ffffffffffffffffffffffffffffffffffffffff161461137b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137290613dc3565b60405180910390fd5b60005b8282905081101561151e57600083838381811061139e5761139d6141b0565b5b90506020020160208101906113b39190613996565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611425576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141c906143e1565b60405180910390fd5b600b60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156114b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a99061444d565b60405180910390fd5b6001600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505080806115169061449c565b91505061137e565b505050565b61152b6124c4565b73ffffffffffffffffffffffffffffffffffffffff1661154961191f565b73ffffffffffffffffffffffffffffffffffffffff161461159f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159690613dc3565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b601160019054906101000a900460ff161580156115f45750601160009054906101000a900460ff165b611633576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162a90614531565b60405180910390fd5b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166116bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b69061459d565b60405180910390fd5b60fd61035a6116ce91906145bd565b6116d6610d63565b10611716576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170d9061465f565b60405180910390fd5b61035a61172e826010546129f190919063ffffffff16565b111561176f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611766906146cb565b60405180910390fd5b60026117c382600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129f190919063ffffffff16565b1115611804576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fb90614737565b60405180910390fd5b3461182082670429d069189e0000612a0790919063ffffffff16565b14611860576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611857906147a3565b60405180910390fd5b60005b81811015611908576010600081548092919061187e9061449c565b9190505550600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906118d39061449c565b91905055506118f53360016118e6610d63565b6118f091906145bd565b612a1d565b80806119009061449c565b915050611863565b5050565b601160009054906101000a900460ff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6119516124c4565b73ffffffffffffffffffffffffffffffffffffffff1661196f61191f565b73ffffffffffffffffffffffffffffffffffffffff16146119c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bc90613dc3565b60405180910390fd5b601160029054906101000a900460ff1615611a15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0c90614251565b60405180910390fd5b8181600d9190611a269291906135c1565b505050565b600f5481565b61035a81565b606060018054611a4690613e12565b80601f0160208091040260200160405190810160405280929190818152602001828054611a7290613e12565b8015611abf5780601f10611a9457610100808354040283529160200191611abf565b820191906000526020600020905b815481529060010190602001808311611aa257829003601f168201915b5050505050905090565b611ad16124c4565b73ffffffffffffffffffffffffffffffffffffffff16611aef61191f565b73ffffffffffffffffffffffffffffffffffffffff1614611b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3c90613dc3565b60405180910390fd5b6001601160026101000a81548160ff021916908315150217905550565b600b6020528060005260406000206000915054906101000a900460ff1681565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611bea611be36124c4565b8383612a3b565b5050565b611bf66124c4565b73ffffffffffffffffffffffffffffffffffffffff16611c1461191f565b73ffffffffffffffffffffffffffffffffffffffff1614611c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6190613dc3565b60405180910390fd5b60005b82829050811015611d80576000838383818110611c8d57611c8c6141b0565b5b9050602002016020810190611ca29190613996565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0b906143e1565b60405180910390fd5b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550508080611d789061449c565b915050611c6d565b505050565b611d96611d906124c4565b836125f1565b611dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dcc9061406c565b60405180910390fd5b611de184848484612ba8565b50505050565b6060611df2826124cc565b611e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e289061480f565b60405180910390fd5b600e611e3c83612c04565b604051602001611e4d92919061494b565b6040516020818303038152906040529050919050565b601160029054906101000a900460ff1681565b601160019054906101000a900460ff16611ec5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebc906149c6565b60405180910390fd5b601160009054906101000a900460ff1615611f15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0c90614a32565b60405180910390fd5b60fd61035a611f2491906145bd565b611f2c610d63565b10611f6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f639061465f565b60405180910390fd5b60fd61035a611f7b91906145bd565b611fa482611f96600f546010546129f190919063ffffffff16565b6129f190919063ffffffff16565b1115611fe5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdc90614a9e565b60405180910390fd5b600261203982600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129f190919063ffffffff16565b111561207a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207190614737565b60405180910390fd5b3461209682670429d069189e0000612a0790919063ffffffff16565b146120d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cd906147a3565b60405180910390fd5b60005b8181101561217e57600f60008154809291906120f49061449c565b9190505550600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906121499061449c565b919050555061216b33600161215c610d63565b61216691906145bd565b612a1d565b80806121769061449c565b9150506120d9565b5050565b601160019054906101000a900460ff1681565b600281565b6060600d80546121a990613e12565b80601f01602080910402602001604051908101604052809291908181526020018280546121d590613e12565b80156122225780601f106121f757610100808354040283529160200191612222565b820191906000526020600020905b81548152906001019060200180831161220557829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122c86124c4565b73ffffffffffffffffffffffffffffffffffffffff166122e661191f565b73ffffffffffffffffffffffffffffffffffffffff161461233c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233390613dc3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a390614b30565b60405180910390fd5b6123b58161292b565b50565b60fd61035a6123c791906145bd565b81565b600c6020528060005260406000206000915090505481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806124ad57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806124bd57506124bc82612d65565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166125ab8361110d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006125fc826124cc565b61263b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263290614bc2565b60405180910390fd5b60006126468361110d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806126b557508373ffffffffffffffffffffffffffffffffffffffff1661269d84610bc6565b73ffffffffffffffffffffffffffffffffffffffff16145b806126c657506126c5818561222c565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166126ef8261110d565b73ffffffffffffffffffffffffffffffffffffffff1614612745576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273c90614c54565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ac90614ce6565b60405180910390fd5b6127c0838383612dcf565b6127cb600082612538565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461281b9190614d06565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461287291906145bd565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081836129ff91906145bd565b905092915050565b60008183612a159190614d3a565b905092915050565b612a37828260405180602001604052806000815250612ee3565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aa190614de0565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612b9b9190613718565b60405180910390a3505050565b612bb38484846126cf565b612bbf84848484612f3e565b612bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf590614e72565b60405180910390fd5b50505050565b60606000821415612c4c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d60565b600082905060005b60008214612c7e578080612c679061449c565b915050600a82612c779190614ec1565b9150612c54565b60008167ffffffffffffffff811115612c9a57612c99613b89565b5b6040519080825280601f01601f191660200182016040528015612ccc5781602001600182028036833780820191505090505b5090505b60008514612d5957600182612ce59190614d06565b9150600a85612cf49190614ef2565b6030612d0091906145bd565b60f81b818381518110612d1657612d156141b0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d529190614ec1565b9450612cd0565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612dda8383836130d5565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612e1d57612e18816130da565b612e5c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612e5b57612e5a8382613123565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e9f57612e9a81613290565b612ede565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612edd57612edc8282613361565b5b5b505050565b612eed83836133e0565b612efa6000848484612f3e565b612f39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3090614e72565b60405180910390fd5b505050565b6000612f5f8473ffffffffffffffffffffffffffffffffffffffff166135ae565b156130c8578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f886124c4565b8786866040518563ffffffff1660e01b8152600401612faa9493929190614f78565b602060405180830381600087803b158015612fc457600080fd5b505af1925050508015612ff557506040513d601f19601f82011682018060405250810190612ff29190614fd9565b60015b613078573d8060008114613025576040519150601f19603f3d011682016040523d82523d6000602084013e61302a565b606091505b50600081511415613070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306790614e72565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506130cd565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613130846111bf565b61313a9190614d06565b905060006007600084815260200190815260200160002054905081811461321f576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506132a49190614d06565b90506000600960008481526020019081526020016000205490506000600883815481106132d4576132d36141b0565b5b9060005260206000200154905080600883815481106132f6576132f56141b0565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061334557613344615006565b5b6001900381819060005260206000200160009055905550505050565b600061336c836111bf565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613450576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161344790615081565b60405180910390fd5b613459816124cc565b15613499576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613490906150ed565b60405180910390fd5b6134a560008383612dcf565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134f591906145bd565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546135cd90613e12565b90600052602060002090601f0160209004810192826135ef5760008555613636565b82601f1061360857803560ff1916838001178555613636565b82800160010185558215613636579182015b8281111561363557823582559160200191906001019061361a565b5b5090506136439190613647565b5090565b5b80821115613660576000816000905550600101613648565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6136ad81613678565b81146136b857600080fd5b50565b6000813590506136ca816136a4565b92915050565b6000602082840312156136e6576136e561366e565b5b60006136f4848285016136bb565b91505092915050565b60008115159050919050565b613712816136fd565b82525050565b600060208201905061372d6000830184613709565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561376d578082015181840152602081019050613752565b8381111561377c576000848401525b50505050565b6000601f19601f8301169050919050565b600061379e82613733565b6137a8818561373e565b93506137b881856020860161374f565b6137c181613782565b840191505092915050565b600060208201905081810360008301526137e68184613793565b905092915050565b6000819050919050565b613801816137ee565b811461380c57600080fd5b50565b60008135905061381e816137f8565b92915050565b60006020828403121561383a5761383961366e565b5b60006138488482850161380f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061387c82613851565b9050919050565b61388c81613871565b82525050565b60006020820190506138a76000830184613883565b92915050565b6138b681613871565b81146138c157600080fd5b50565b6000813590506138d3816138ad565b92915050565b600080604083850312156138f0576138ef61366e565b5b60006138fe858286016138c4565b925050602061390f8582860161380f565b9150509250929050565b613922816137ee565b82525050565b600060208201905061393d6000830184613919565b92915050565b60008060006060848603121561395c5761395b61366e565b5b600061396a868287016138c4565b935050602061397b868287016138c4565b925050604061398c8682870161380f565b9150509250925092565b6000602082840312156139ac576139ab61366e565b5b60006139ba848285016138c4565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126139e8576139e76139c3565b5b8235905067ffffffffffffffff811115613a0557613a046139c8565b5b602083019150836001820283011115613a2157613a206139cd565b5b9250929050565b60008060208385031215613a3f57613a3e61366e565b5b600083013567ffffffffffffffff811115613a5d57613a5c613673565b5b613a69858286016139d2565b92509250509250929050565b60008083601f840112613a8b57613a8a6139c3565b5b8235905067ffffffffffffffff811115613aa857613aa76139c8565b5b602083019150836020820283011115613ac457613ac36139cd565b5b9250929050565b60008060208385031215613ae257613ae161366e565b5b600083013567ffffffffffffffff811115613b0057613aff613673565b5b613b0c85828601613a75565b92509250509250929050565b613b21816136fd565b8114613b2c57600080fd5b50565b600081359050613b3e81613b18565b92915050565b60008060408385031215613b5b57613b5a61366e565b5b6000613b69858286016138c4565b9250506020613b7a85828601613b2f565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613bc182613782565b810181811067ffffffffffffffff82111715613be057613bdf613b89565b5b80604052505050565b6000613bf3613664565b9050613bff8282613bb8565b919050565b600067ffffffffffffffff821115613c1f57613c1e613b89565b5b613c2882613782565b9050602081019050919050565b82818337600083830152505050565b6000613c57613c5284613c04565b613be9565b905082815260208101848484011115613c7357613c72613b84565b5b613c7e848285613c35565b509392505050565b600082601f830112613c9b57613c9a6139c3565b5b8135613cab848260208601613c44565b91505092915050565b60008060008060808587031215613cce57613ccd61366e565b5b6000613cdc878288016138c4565b9450506020613ced878288016138c4565b9350506040613cfe8782880161380f565b925050606085013567ffffffffffffffff811115613d1f57613d1e613673565b5b613d2b87828801613c86565b91505092959194509250565b60008060408385031215613d4e57613d4d61366e565b5b6000613d5c858286016138c4565b9250506020613d6d858286016138c4565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613dad60208361373e565b9150613db882613d77565b602082019050919050565b60006020820190508181036000830152613ddc81613da0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613e2a57607f821691505b60208210811415613e3e57613e3d613de3565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613ea0602c8361373e565b9150613eab82613e44565b604082019050919050565b60006020820190508181036000830152613ecf81613e93565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613f3260218361373e565b9150613f3d82613ed6565b604082019050919050565b60006020820190508181036000830152613f6181613f25565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613fc460388361373e565b9150613fcf82613f68565b604082019050919050565b60006020820190508181036000830152613ff381613fb7565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b600061405660318361373e565b915061406182613ffa565b604082019050919050565b6000602082019050818103600083015261408581614049565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006140e8602b8361373e565b91506140f38261408c565b604082019050919050565b60006020820190508181036000830152614117816140db565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b600061417a602c8361373e565b91506141858261411e565b604082019050919050565b600060208201905081810360008301526141a98161416d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f436f6e7472616374206d65746164617461206d6574686f647320617265206c6f60008201527f636b656400000000000000000000000000000000000000000000000000000000602082015250565b600061423b60248361373e565b9150614246826141df565b604082019050919050565b6000602082019050818103600083015261426a8161422e565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006142cd60298361373e565b91506142d882614271565b604082019050919050565b600060208201905081810360008301526142fc816142c0565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061435f602a8361373e565b915061436a82614303565b604082019050919050565b6000602082019050818103600083015261438e81614352565b9050919050565b7f4e554c4c5f414444524553530000000000000000000000000000000000000000600082015250565b60006143cb600c8361373e565b91506143d682614395565b602082019050919050565b600060208201905081810360008301526143fa816143be565b9050919050565b7f4455504c49434154455f454e5452590000000000000000000000000000000000600082015250565b6000614437600f8361373e565b915061444282614401565b602082019050919050565b600060208201905081810360008301526144668161442a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006144a7826137ee565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156144da576144d961446d565b5b600182019050919050565b7f50524553414c455f434c4f534544000000000000000000000000000000000000600082015250565b600061451b600e8361373e565b9150614526826144e5565b602082019050919050565b6000602082019050818103600083015261454a8161450e565b9050919050565b7f4e4f545f5155414c494649454400000000000000000000000000000000000000600082015250565b6000614587600d8361373e565b915061459282614551565b602082019050919050565b600060208201905081810360008301526145b68161457a565b9050919050565b60006145c8826137ee565b91506145d3836137ee565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146085761460761446d565b5b828201905092915050565b7f4f55545f4f465f53544f434b0000000000000000000000000000000000000000600082015250565b6000614649600c8361373e565b915061465482614613565b602082019050919050565b600060208201905081810360008301526146788161463c565b9050919050565b7f4558434545445f50524956415445000000000000000000000000000000000000600082015250565b60006146b5600e8361373e565b91506146c08261467f565b602082019050919050565b600060208201905081810360008301526146e4816146a8565b9050919050565b7f4558434545445f414c4c4f430000000000000000000000000000000000000000600082015250565b6000614721600c8361373e565b915061472c826146eb565b602082019050919050565b6000602082019050818103600083015261475081614714565b9050919050565b7f494e434f52524543545f4554485f414d4f554e54000000000000000000000000600082015250565b600061478d60148361373e565b915061479882614757565b602082019050919050565b600060208201905081810360008301526147bc81614780565b9050919050565b7f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e00600082015250565b60006147f9601f8361373e565b9150614804826147c3565b602082019050919050565b60006020820190508181036000830152614828816147ec565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461485c81613e12565b614866818661482f565b945060018216600081146148815760018114614892576148c5565b60ff198316865281860193506148c5565b61489b8561483a565b60005b838110156148bd5781548189015260018201915060208101905061489e565b838801955050505b50505092915050565b60006148d982613733565b6148e3818561482f565b93506148f381856020860161374f565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061493560058361482f565b9150614940826148ff565b600582019050919050565b6000614957828561484f565b915061496382846148ce565b915061496e82614928565b91508190509392505050565b7f53414c455f434c4f534544000000000000000000000000000000000000000000600082015250565b60006149b0600b8361373e565b91506149bb8261497a565b602082019050919050565b600060208201905081810360008301526149df816149a3565b9050919050565b7f4f4e4c595f50524553414c450000000000000000000000000000000000000000600082015250565b6000614a1c600c8361373e565b9150614a27826149e6565b602082019050919050565b60006020820190508181036000830152614a4b81614a0f565b9050919050565b7f4558434545445f415641494c41424c4500000000000000000000000000000000600082015250565b6000614a8860108361373e565b9150614a9382614a52565b602082019050919050565b60006020820190508181036000830152614ab781614a7b565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614b1a60268361373e565b9150614b2582614abe565b604082019050919050565b60006020820190508181036000830152614b4981614b0d565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614bac602c8361373e565b9150614bb782614b50565b604082019050919050565b60006020820190508181036000830152614bdb81614b9f565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000614c3e60298361373e565b9150614c4982614be2565b604082019050919050565b60006020820190508181036000830152614c6d81614c31565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614cd060248361373e565b9150614cdb82614c74565b604082019050919050565b60006020820190508181036000830152614cff81614cc3565b9050919050565b6000614d11826137ee565b9150614d1c836137ee565b925082821015614d2f57614d2e61446d565b5b828203905092915050565b6000614d45826137ee565b9150614d50836137ee565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d8957614d8861446d565b5b828202905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614dca60198361373e565b9150614dd582614d94565b602082019050919050565b60006020820190508181036000830152614df981614dbd565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614e5c60328361373e565b9150614e6782614e00565b604082019050919050565b60006020820190508181036000830152614e8b81614e4f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614ecc826137ee565b9150614ed7836137ee565b925082614ee757614ee6614e92565b5b828204905092915050565b6000614efd826137ee565b9150614f08836137ee565b925082614f1857614f17614e92565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000614f4a82614f23565b614f548185614f2e565b9350614f6481856020860161374f565b614f6d81613782565b840191505092915050565b6000608082019050614f8d6000830187613883565b614f9a6020830186613883565b614fa76040830185613919565b8181036060830152614fb98184614f3f565b905095945050505050565b600081519050614fd3816136a4565b92915050565b600060208284031215614fef57614fee61366e565b5b6000614ffd84828501614fc4565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061506b60208361373e565b915061507682615035565b602082019050919050565b6000602082019050818103600083015261509a8161505e565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006150d7601c8361373e565b91506150e2826150a1565b602082019050919050565b60006020820190508181036000830152615106816150ca565b905091905056fea26469706673582212200750cda3ba0330c0bd222a53157ceac357098d5ac043b58c02e4be8d9c8d4f3664736f6c63430008090033

Deployed Bytecode Sourcemap

61084:4609:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54859:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64960:86;;;;;;;;;;;;;:::i;:::-;;42353:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43912:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43435:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55499:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61393:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44662:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64563:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55167:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61285:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64331:109;;;;;;;;;;;;;:::i;:::-;;45072:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55689:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65173:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61716:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42047:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41777:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21323:103;;;;;;;;;;;;;:::i;:::-;;62015:354;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64857:95;;;;;;;;;;;;;:::i;:::-;;63509:814;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61763:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20672:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65054:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61676:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61238:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42522:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64774:75;;;;;;;;;;;;;:::i;:::-;;61498:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64448:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44205:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62377:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45328:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65394:296;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61820:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62705:796;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61793:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61444:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65289:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44431:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21581:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61331:55;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61549:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54859:224;54961:4;55000:35;54985:50;;;:11;:50;;;;:90;;;;55039:36;55063:11;55039:23;:36::i;:::-;54985:90;54978:97;;54859:224;;;:::o;64960:86::-;20903:12;:10;:12::i;:::-;20892:23;;:7;:5;:7::i;:::-;:23;;;20884:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65030:8:::1;;;;;;;;;;;65029:9;65018:8;;:20;;;;;;;;;;;;;;;;;;64960:86::o:0;42353:100::-;42407:13;42440:5;42433:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42353:100;:::o;43912:221::-;43988:7;44016:16;44024:7;44016;:16::i;:::-;44008:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;44101:15;:24;44117:7;44101:24;;;;;;;;;;;;;;;;;;;;;44094:31;;43912:221;;;:::o;43435:411::-;43516:13;43532:23;43547:7;43532:14;:23::i;:::-;43516:39;;43580:5;43574:11;;:2;:11;;;;43566:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;43674:5;43658:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;43683:37;43700:5;43707:12;:10;:12::i;:::-;43683:16;:37::i;:::-;43658:62;43636:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;43817:21;43826:2;43830:7;43817:8;:21::i;:::-;43505:341;43435:411;;:::o;55499:113::-;55560:7;55587:10;:17;;;;55580:24;;55499:113;:::o;61393:44::-;61428:9;61393:44;:::o;44662:339::-;44857:41;44876:12;:10;:12::i;:::-;44890:7;44857:18;:41::i;:::-;44849:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;44965:28;44975:4;44981:2;44985:7;44965:9;:28::i;:::-;44662:339;;;:::o;64563:149::-;64654:7;64686:12;:18;64699:4;64686:18;;;;;;;;;;;;;;;;64679:25;;64563:149;;;:::o;55167:256::-;55264:7;55300:23;55317:5;55300:16;:23::i;:::-;55292:5;:31;55284:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;55389:12;:19;55402:5;55389:19;;;;;;;;;;;;;;;:26;55409:5;55389:26;;;;;;;;;;;;55382:33;;55167:256;;;;:::o;61285:39::-;61321:3;61285:39;:::o;64331:109::-;20903:12;:10;:12::i;:::-;20892:23;;:7;:5;:7::i;:::-;:23;;;20884:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64389:10:::1;64381:28;;:51;64410:21;64381:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;64331:109::o:0;45072:185::-;45210:39;45227:4;45233:2;45237:7;45210:39;;;;;;;;;;;;:16;:39::i;:::-;45072:185;;;:::o;55689:233::-;55764:7;55800:30;:28;:30::i;:::-;55792:5;:38;55784:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;55897:10;55908:5;55897:17;;;;;;;;:::i;:::-;;;;;;;;;;55890:24;;55689:233;;;:::o;65173:108::-;20903:12;:10;:12::i;:::-;20892:23;;:7;:5;:7::i;:::-;:23;;;20884:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61940:6:::1;;;;;;;;;;;61939:7;61931:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;65270:3:::2;;65254:13;:19;;;;;;;:::i;:::-;;65173:108:::0;;:::o;61716:34::-;;;;:::o;42047:239::-;42119:7;42139:13;42155:7;:16;42163:7;42155:16;;;;;;;;;;;;;;;;;;;;;42139:32;;42207:1;42190:19;;:5;:19;;;;42182:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42273:5;42266:12;;;42047:239;;;:::o;41777:208::-;41849:7;41894:1;41877:19;;:5;:19;;;;41869:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;41961:9;:16;41971:5;41961:16;;;;;;;;;;;;;;;;41954:23;;41777:208;;;:::o;21323:103::-;20903:12;:10;:12::i;:::-;20892:23;;:7;:5;:7::i;:::-;:23;;;20884:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21388:30:::1;21415:1;21388:18;:30::i;:::-;21323:103::o:0;62015:354::-;20903:12;:10;:12::i;:::-;20892:23;;:7;:5;:7::i;:::-;:23;;;20884:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62104:9:::1;62099:263;62123:7;;:14;;62119:1;:18;62099:263;;;62159:13;62175:7;;62183:1;62175:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;62159:26;;62225:1;62208:19;;:5;:19;;;;62200:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;62268:12;:19;62281:5;62268:19;;;;;;;;;;;;;;;;;;;;;;;;;62267:20;62259:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;62346:4;62324:12;:19;62337:5;62324:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;62144:218;62139:3;;;;;:::i;:::-;;;;62099:263;;;;62015:354:::0;;:::o;64857:95::-;20903:12;:10;:12::i;:::-;20892:23;;:7;:5;:7::i;:::-;:23;;;20884:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64933:11:::1;;;;;;;;;;;64932:12;64918:11;;:26;;;;;;;;;;;;;;;;;;64857:95::o:0;63509:814::-;63589:8;;;;;;;;;;;63588:9;:24;;;;;63601:11;;;;;;;;;;;63588:24;63580:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;63650:12;:24;63663:10;63650:24;;;;;;;;;;;;;;;;;;;;;;;;;63642:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;61321:3;61275;61364:22;;;;:::i;:::-;63711:13;:11;:13::i;:::-;:22;63703:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;61275:3;63783:38;63807:13;63783:19;;:23;;:38;;;;:::i;:::-;:52;;63761:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;61488:1;63910:43;63939:13;63910:12;:24;63923:10;63910:24;;;;;;;;;;;;;;;;:28;;:43;;;;:::i;:::-;:81;;63888:143;;;;;;;;;;;;:::i;:::-;;;;;;;;;64081:9;64050:27;64063:13;61428:9;64050:12;;:27;;;;:::i;:::-;:40;64042:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;64133:9;64128:188;64152:13;64148:1;:17;64128:188;;;64187:19;;:21;;;;;;;;;:::i;:::-;;;;;;64223:12;:24;64236:10;64223:24;;;;;;;;;;;;;;;;:26;;;;;;;;;:::i;:::-;;;;;;64264:40;64274:10;64302:1;64286:13;:11;:13::i;:::-;:17;;;;:::i;:::-;64264:9;:40::i;:::-;64167:3;;;;;:::i;:::-;;;;64128:188;;;;63509:814;:::o;61763:23::-;;;;;;;;;;;;;:::o;20672:87::-;20718:7;20745:6;;;;;;;;;;;20738:13;;20672:87;:::o;65054:111::-;20903:12;:10;:12::i;:::-;20892:23;;:7;:5;:7::i;:::-;:23;;;20884:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61940:6:::1;;;;;;;;;;;61939:7;61931:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;65154:3:::2;;65139:12;:18;;;;;;;:::i;:::-;;65054:111:::0;;:::o;61676:33::-;;;;:::o;61238:40::-;61275:3;61238:40;:::o;42522:104::-;42578:13;42611:7;42604:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42522:104;:::o;64774:75::-;20903:12;:10;:12::i;:::-;20892:23;;:7;:5;:7::i;:::-;:23;;;20884:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64837:4:::1;64828:6;;:13;;;;;;;;;;;;;;;;;;64774:75::o:0;61498:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;64448:107::-;64505:4;64529:12;:18;64542:4;64529:18;;;;;;;;;;;;;;;;;;;;;;;;;64522:25;;64448:107;;;:::o;44205:155::-;44300:52;44319:12;:10;:12::i;:::-;44333:8;44343;44300:18;:52::i;:::-;44205:155;;:::o;62377:320::-;20903:12;:10;:12::i;:::-;20892:23;;:7;:5;:7::i;:::-;:23;;;20884:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62494:9:::1;62489:201;62513:7;;:14;;62509:1;:18;62489:201;;;62549:13;62565:7;;62573:1;62565:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;62549:26;;62615:1;62598:19;;:5;:19;;;;62590:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;62673:5;62651:12;:19;62664:5;62651:19;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;62534:156;62529:3;;;;;:::i;:::-;;;;62489:201;;;;62377:320:::0;;:::o;45328:328::-;45503:41;45522:12;:10;:12::i;:::-;45536:7;45503:18;:41::i;:::-;45495:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;45609:39;45623:4;45629:2;45633:7;45642:5;45609:13;:39::i;:::-;45328:328;;;;:::o;65394:296::-;65503:13;65542:16;65550:7;65542;:16::i;:::-;65534:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;65638:13;65653:18;:7;:16;:18::i;:::-;65621:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65607:75;;65394:296;;;:::o;61820:18::-;;;;;;;;;;;;;:::o;62705:796::-;62777:8;;;;;;;;;;;62769:32;;;;;;;;;;;;:::i;:::-;;;;;;;;;62821:11;;;;;;;;;;;62820:12;62812:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;61321:3;61275;61364:22;;;;:::i;:::-;62868:13;:11;:13::i;:::-;:22;62860:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;61321:3;61275;61364:22;;;;:::i;:::-;62940:62;62988:13;62940:43;62964:18;;62940:19;;:23;;:43;;;;:::i;:::-;:47;;:62;;;;:::i;:::-;:72;;62918:138;;;;;;;;;;;;:::i;:::-;;;;;;;;;61488:1;63089:43;63118:13;63089:12;:24;63102:10;63089:24;;;;;;;;;;;;;;;;:28;;:43;;;;:::i;:::-;:81;;63067:143;;;;;;;;;;;;:::i;:::-;;;;;;;;;63260:9;63229:27;63242:13;61428:9;63229:12;;:27;;;;:::i;:::-;:40;63221:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;63312:9;63307:187;63331:13;63327:1;:17;63307:187;;;63366:18;;:20;;;;;;;;;:::i;:::-;;;;;;63401:12;:24;63414:10;63401:24;;;;;;;;;;;;;;;;:26;;;;;;;;;:::i;:::-;;;;;;63442:40;63452:10;63480:1;63464:13;:11;:13::i;:::-;:17;;;;:::i;:::-;63442:9;:40::i;:::-;63346:3;;;;;:::i;:::-;;;;63307:187;;;;62705:796;:::o;61793:20::-;;;;;;;;;;;;;:::o;61444:45::-;61488:1;61444:45;:::o;65289:97::-;65333:13;65366:12;65359:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65289:97;:::o;44431:164::-;44528:4;44552:18;:25;44571:5;44552:25;;;;;;;;;;;;;;;:35;44578:8;44552:35;;;;;;;;;;;;;;;;;;;;;;;;;44545:42;;44431:164;;;;:::o;21581:201::-;20903:12;:10;:12::i;:::-;20892:23;;:7;:5;:7::i;:::-;:23;;;20884:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21690:1:::1;21670:22;;:8;:22;;;;21662:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21746:28;21765:8;21746:18;:28::i;:::-;21581:201:::0;:::o;61331:55::-;61321:3;61275;61364:22;;;;:::i;:::-;61331:55;:::o;61549:47::-;;;;;;;;;;;;;;;;;:::o;41408:305::-;41510:4;41562:25;41547:40;;;:11;:40;;;;:105;;;;41619:33;41604:48;;;:11;:48;;;;41547:105;:158;;;;41669:36;41693:11;41669:23;:36::i;:::-;41547:158;41527:178;;41408:305;;;:::o;19396:98::-;19449:7;19476:10;19469:17;;19396:98;:::o;47166:127::-;47231:4;47283:1;47255:30;;:7;:16;47263:7;47255:16;;;;;;;;;;;;;;;;;;;;;:30;;;;47248:37;;47166:127;;;:::o;51148:174::-;51250:2;51223:15;:24;51239:7;51223:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;51306:7;51302:2;51268:46;;51277:23;51292:7;51277:14;:23::i;:::-;51268:46;;;;;;;;;;;;51148:174;;:::o;47460:348::-;47553:4;47578:16;47586:7;47578;:16::i;:::-;47570:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;47654:13;47670:23;47685:7;47670:14;:23::i;:::-;47654:39;;47723:5;47712:16;;:7;:16;;;:51;;;;47756:7;47732:31;;:20;47744:7;47732:11;:20::i;:::-;:31;;;47712:51;:87;;;;47767:32;47784:5;47791:7;47767:16;:32::i;:::-;47712:87;47704:96;;;47460:348;;;;:::o;50452:578::-;50611:4;50584:31;;:23;50599:7;50584:14;:23::i;:::-;:31;;;50576:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;50694:1;50680:16;;:2;:16;;;;50672:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;50750:39;50771:4;50777:2;50781:7;50750:20;:39::i;:::-;50854:29;50871:1;50875:7;50854:8;:29::i;:::-;50915:1;50896:9;:15;50906:4;50896:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;50944:1;50927:9;:13;50937:2;50927:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;50975:2;50956:7;:16;50964:7;50956:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;51014:7;51010:2;50995:27;;51004:4;50995:27;;;;;;;;;;;;50452:578;;;:::o;21942:191::-;22016:16;22035:6;;;;;;;;;;;22016:25;;22061:8;22052:6;;:17;;;;;;;;;;;;;;;;;;22116:8;22085:40;;22106:8;22085:40;;;;;;;;;;;;22005:128;21942:191;:::o;2862:98::-;2920:7;2951:1;2947;:5;;;;:::i;:::-;2940:12;;2862:98;;;;:::o;3600:::-;3658:7;3689:1;3685;:5;;;;:::i;:::-;3678:12;;3600:98;;;;:::o;48150:110::-;48226:26;48236:2;48240:7;48226:26;;;;;;;;;;;;:9;:26::i;:::-;48150:110;;:::o;51464:315::-;51619:8;51610:17;;:5;:17;;;;51602:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;51706:8;51668:18;:25;51687:5;51668:25;;;;;;;;;;;;;;;:35;51694:8;51668:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;51752:8;51730:41;;51745:5;51730:41;;;51762:8;51730:41;;;;;;:::i;:::-;;;;;;;;51464:315;;;:::o;46538:::-;46695:28;46705:4;46711:2;46715:7;46695:9;:28::i;:::-;46742:48;46765:4;46771:2;46775:7;46784:5;46742:22;:48::i;:::-;46734:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;46538:315;;;;:::o;7392:723::-;7448:13;7678:1;7669:5;:10;7665:53;;;7696:10;;;;;;;;;;;;;;;;;;;;;7665:53;7728:12;7743:5;7728:20;;7759:14;7784:78;7799:1;7791:4;:9;7784:78;;7817:8;;;;;:::i;:::-;;;;7848:2;7840:10;;;;;:::i;:::-;;;7784:78;;;7872:19;7904:6;7894:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7872:39;;7922:154;7938:1;7929:5;:10;7922:154;;7966:1;7956:11;;;;;:::i;:::-;;;8033:2;8025:5;:10;;;;:::i;:::-;8012:2;:24;;;;:::i;:::-;7999:39;;7982:6;7989;7982:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;8062:2;8053:11;;;;;:::i;:::-;;;7922:154;;;8100:6;8086:21;;;;;7392:723;;;;:::o;33104:157::-;33189:4;33228:25;33213:40;;;:11;:40;;;;33206:47;;33104:157;;;:::o;56535:589::-;56679:45;56706:4;56712:2;56716:7;56679:26;:45::i;:::-;56757:1;56741:18;;:4;:18;;;56737:187;;;56776:40;56808:7;56776:31;:40::i;:::-;56737:187;;;56846:2;56838:10;;:4;:10;;;56834:90;;56865:47;56898:4;56904:7;56865:32;:47::i;:::-;56834:90;56737:187;56952:1;56938:16;;:2;:16;;;56934:183;;;56971:45;57008:7;56971:36;:45::i;:::-;56934:183;;;57044:4;57038:10;;:2;:10;;;57034:83;;57065:40;57093:2;57097:7;57065:27;:40::i;:::-;57034:83;56934:183;56535:589;;;:::o;48487:321::-;48617:18;48623:2;48627:7;48617:5;:18::i;:::-;48668:54;48699:1;48703:2;48707:7;48716:5;48668:22;:54::i;:::-;48646:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;48487:321;;;:::o;52344:799::-;52499:4;52520:15;:2;:13;;;:15::i;:::-;52516:620;;;52572:2;52556:36;;;52593:12;:10;:12::i;:::-;52607:4;52613:7;52622:5;52556:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;52552:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52815:1;52798:6;:13;:18;52794:272;;;52841:60;;;;;;;;;;:::i;:::-;;;;;;;;52794:272;53016:6;53010:13;53001:6;52997:2;52993:15;52986:38;52552:529;52689:41;;;52679:51;;;:6;:51;;;;52672:58;;;;;52516:620;53120:4;53113:11;;52344:799;;;;;;;:::o;53715:126::-;;;;:::o;57847:164::-;57951:10;:17;;;;57924:15;:24;57940:7;57924:24;;;;;;;;;;;:44;;;;57979:10;57995:7;57979:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57847:164;:::o;58638:988::-;58904:22;58954:1;58929:22;58946:4;58929:16;:22::i;:::-;:26;;;;:::i;:::-;58904:51;;58966:18;58987:17;:26;59005:7;58987:26;;;;;;;;;;;;58966:47;;59134:14;59120:10;:28;59116:328;;59165:19;59187:12;:18;59200:4;59187:18;;;;;;;;;;;;;;;:34;59206:14;59187:34;;;;;;;;;;;;59165:56;;59271:11;59238:12;:18;59251:4;59238:18;;;;;;;;;;;;;;;:30;59257:10;59238:30;;;;;;;;;;;:44;;;;59388:10;59355:17;:30;59373:11;59355:30;;;;;;;;;;;:43;;;;59150:294;59116:328;59540:17;:26;59558:7;59540:26;;;;;;;;;;;59533:33;;;59584:12;:18;59597:4;59584:18;;;;;;;;;;;;;;;:34;59603:14;59584:34;;;;;;;;;;;59577:41;;;58719:907;;58638:988;;:::o;59921:1079::-;60174:22;60219:1;60199:10;:17;;;;:21;;;;:::i;:::-;60174:46;;60231:18;60252:15;:24;60268:7;60252:24;;;;;;;;;;;;60231:45;;60603:19;60625:10;60636:14;60625:26;;;;;;;;:::i;:::-;;;;;;;;;;60603:48;;60689:11;60664:10;60675;60664:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;60800:10;60769:15;:28;60785:11;60769:28;;;;;;;;;;;:41;;;;60941:15;:24;60957:7;60941:24;;;;;;;;;;;60934:31;;;60976:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;59992:1008;;;59921:1079;:::o;57425:221::-;57510:14;57527:20;57544:2;57527:16;:20::i;:::-;57510:37;;57585:7;57558:12;:16;57571:2;57558:16;;;;;;;;;;;;;;;:24;57575:6;57558:24;;;;;;;;;;;:34;;;;57632:6;57603:17;:26;57621:7;57603:26;;;;;;;;;;;:35;;;;57499:147;57425:221;;:::o;49144:382::-;49238:1;49224:16;;:2;:16;;;;49216:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;49297:16;49305:7;49297;:16::i;:::-;49296:17;49288:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;49359:45;49388:1;49392:2;49396:7;49359:20;:45::i;:::-;49434:1;49417:9;:13;49427:2;49417:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;49465:2;49446:7;:16;49454:7;49446:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;49510:7;49506:2;49485:33;;49502:1;49485:33;;;;;;;;;;;;49144:382;;:::o;22960:387::-;23020:4;23228:12;23295:7;23283:20;23275:28;;23338:1;23331:4;:8;23324:15;;;22960:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:329::-;5974:6;6023:2;6011:9;6002:7;5998:23;5994:32;5991:119;;;6029:79;;:::i;:::-;5991:119;6149:1;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6120:117;5915:329;;;;:::o;6250:117::-;6359:1;6356;6349:12;6373:117;6482:1;6479;6472:12;6496:117;6605:1;6602;6595:12;6633:553;6691:8;6701:6;6751:3;6744:4;6736:6;6732:17;6728:27;6718:122;;6759:79;;:::i;:::-;6718:122;6872:6;6859:20;6849:30;;6902:18;6894:6;6891:30;6888:117;;;6924:79;;:::i;:::-;6888:117;7038:4;7030:6;7026:17;7014:29;;7092:3;7084:4;7076:6;7072:17;7062:8;7058:32;7055:41;7052:128;;;7099:79;;:::i;:::-;7052:128;6633:553;;;;;:::o;7192:529::-;7263:6;7271;7320:2;7308:9;7299:7;7295:23;7291:32;7288:119;;;7326:79;;:::i;:::-;7288:119;7474:1;7463:9;7459:17;7446:31;7504:18;7496:6;7493:30;7490:117;;;7526:79;;:::i;:::-;7490:117;7639:65;7696:7;7687:6;7676:9;7672:22;7639:65;:::i;:::-;7621:83;;;;7417:297;7192:529;;;;;:::o;7744:568::-;7817:8;7827:6;7877:3;7870:4;7862:6;7858:17;7854:27;7844:122;;7885:79;;:::i;:::-;7844:122;7998:6;7985:20;7975:30;;8028:18;8020:6;8017:30;8014:117;;;8050:79;;:::i;:::-;8014:117;8164:4;8156:6;8152:17;8140:29;;8218:3;8210:4;8202:6;8198:17;8188:8;8184:32;8181:41;8178:128;;;8225:79;;:::i;:::-;8178:128;7744:568;;;;;:::o;8318:559::-;8404:6;8412;8461:2;8449:9;8440:7;8436:23;8432:32;8429:119;;;8467:79;;:::i;:::-;8429:119;8615:1;8604:9;8600:17;8587:31;8645:18;8637:6;8634:30;8631:117;;;8667:79;;:::i;:::-;8631:117;8780:80;8852:7;8843:6;8832:9;8828:22;8780:80;:::i;:::-;8762:98;;;;8558:312;8318:559;;;;;:::o;8883:116::-;8953:21;8968:5;8953:21;:::i;:::-;8946:5;8943:32;8933:60;;8989:1;8986;8979:12;8933:60;8883:116;:::o;9005:133::-;9048:5;9086:6;9073:20;9064:29;;9102:30;9126:5;9102:30;:::i;:::-;9005:133;;;;:::o;9144:468::-;9209:6;9217;9266:2;9254:9;9245:7;9241:23;9237:32;9234:119;;;9272:79;;:::i;:::-;9234:119;9392:1;9417:53;9462:7;9453:6;9442:9;9438:22;9417:53;:::i;:::-;9407:63;;9363:117;9519:2;9545:50;9587:7;9578:6;9567:9;9563:22;9545:50;:::i;:::-;9535:60;;9490:115;9144:468;;;;;:::o;9618:117::-;9727:1;9724;9717:12;9741:180;9789:77;9786:1;9779:88;9886:4;9883:1;9876:15;9910:4;9907:1;9900:15;9927:281;10010:27;10032:4;10010:27;:::i;:::-;10002:6;9998:40;10140:6;10128:10;10125:22;10104:18;10092:10;10089:34;10086:62;10083:88;;;10151:18;;:::i;:::-;10083:88;10191:10;10187:2;10180:22;9970:238;9927:281;;:::o;10214:129::-;10248:6;10275:20;;:::i;:::-;10265:30;;10304:33;10332:4;10324:6;10304:33;:::i;:::-;10214:129;;;:::o;10349:307::-;10410:4;10500:18;10492:6;10489:30;10486:56;;;10522:18;;:::i;:::-;10486:56;10560:29;10582:6;10560:29;:::i;:::-;10552:37;;10644:4;10638;10634:15;10626:23;;10349:307;;;:::o;10662:154::-;10746:6;10741:3;10736;10723:30;10808:1;10799:6;10794:3;10790:16;10783:27;10662:154;;;:::o;10822:410::-;10899:5;10924:65;10940:48;10981:6;10940:48;:::i;:::-;10924:65;:::i;:::-;10915:74;;11012:6;11005:5;10998:21;11050:4;11043:5;11039:16;11088:3;11079:6;11074:3;11070:16;11067:25;11064:112;;;11095:79;;:::i;:::-;11064:112;11185:41;11219:6;11214:3;11209;11185:41;:::i;:::-;10905:327;10822:410;;;;;:::o;11251:338::-;11306:5;11355:3;11348:4;11340:6;11336:17;11332:27;11322:122;;11363:79;;:::i;:::-;11322:122;11480:6;11467:20;11505:78;11579:3;11571:6;11564:4;11556:6;11552:17;11505:78;:::i;:::-;11496:87;;11312:277;11251:338;;;;:::o;11595:943::-;11690:6;11698;11706;11714;11763:3;11751:9;11742:7;11738:23;11734:33;11731:120;;;11770:79;;:::i;:::-;11731:120;11890:1;11915:53;11960:7;11951:6;11940:9;11936:22;11915:53;:::i;:::-;11905:63;;11861:117;12017:2;12043:53;12088:7;12079:6;12068:9;12064:22;12043:53;:::i;:::-;12033:63;;11988:118;12145:2;12171:53;12216:7;12207:6;12196:9;12192:22;12171:53;:::i;:::-;12161:63;;12116:118;12301:2;12290:9;12286:18;12273:32;12332:18;12324:6;12321:30;12318:117;;;12354:79;;:::i;:::-;12318:117;12459:62;12513:7;12504:6;12493:9;12489:22;12459:62;:::i;:::-;12449:72;;12244:287;11595:943;;;;;;;:::o;12544:474::-;12612:6;12620;12669:2;12657:9;12648:7;12644:23;12640:32;12637:119;;;12675:79;;:::i;:::-;12637:119;12795:1;12820:53;12865:7;12856:6;12845:9;12841:22;12820:53;:::i;:::-;12810:63;;12766:117;12922:2;12948:53;12993:7;12984:6;12973:9;12969:22;12948:53;:::i;:::-;12938:63;;12893:118;12544:474;;;;;:::o;13024:182::-;13164:34;13160:1;13152:6;13148:14;13141:58;13024:182;:::o;13212:366::-;13354:3;13375:67;13439:2;13434:3;13375:67;:::i;:::-;13368:74;;13451:93;13540:3;13451:93;:::i;:::-;13569:2;13564:3;13560:12;13553:19;;13212:366;;;:::o;13584:419::-;13750:4;13788:2;13777:9;13773:18;13765:26;;13837:9;13831:4;13827:20;13823:1;13812:9;13808:17;13801:47;13865:131;13991:4;13865:131;:::i;:::-;13857:139;;13584:419;;;:::o;14009:180::-;14057:77;14054:1;14047:88;14154:4;14151:1;14144:15;14178:4;14175:1;14168:15;14195:320;14239:6;14276:1;14270:4;14266:12;14256:22;;14323:1;14317:4;14313:12;14344:18;14334:81;;14400:4;14392:6;14388:17;14378:27;;14334:81;14462:2;14454:6;14451:14;14431:18;14428:38;14425:84;;;14481:18;;:::i;:::-;14425:84;14246:269;14195:320;;;:::o;14521:231::-;14661:34;14657:1;14649:6;14645:14;14638:58;14730:14;14725:2;14717:6;14713:15;14706:39;14521:231;:::o;14758:366::-;14900:3;14921:67;14985:2;14980:3;14921:67;:::i;:::-;14914:74;;14997:93;15086:3;14997:93;:::i;:::-;15115:2;15110:3;15106:12;15099:19;;14758:366;;;:::o;15130:419::-;15296:4;15334:2;15323:9;15319:18;15311:26;;15383:9;15377:4;15373:20;15369:1;15358:9;15354:17;15347:47;15411:131;15537:4;15411:131;:::i;:::-;15403:139;;15130:419;;;:::o;15555:220::-;15695:34;15691:1;15683:6;15679:14;15672:58;15764:3;15759:2;15751:6;15747:15;15740:28;15555:220;:::o;15781:366::-;15923:3;15944:67;16008:2;16003:3;15944:67;:::i;:::-;15937:74;;16020:93;16109:3;16020:93;:::i;:::-;16138:2;16133:3;16129:12;16122:19;;15781:366;;;:::o;16153:419::-;16319:4;16357:2;16346:9;16342:18;16334:26;;16406:9;16400:4;16396:20;16392:1;16381:9;16377:17;16370:47;16434:131;16560:4;16434:131;:::i;:::-;16426:139;;16153:419;;;:::o;16578:243::-;16718:34;16714:1;16706:6;16702:14;16695:58;16787:26;16782:2;16774:6;16770:15;16763:51;16578:243;:::o;16827:366::-;16969:3;16990:67;17054:2;17049:3;16990:67;:::i;:::-;16983:74;;17066:93;17155:3;17066:93;:::i;:::-;17184:2;17179:3;17175:12;17168:19;;16827:366;;;:::o;17199:419::-;17365:4;17403:2;17392:9;17388:18;17380:26;;17452:9;17446:4;17442:20;17438:1;17427:9;17423:17;17416:47;17480:131;17606:4;17480:131;:::i;:::-;17472:139;;17199:419;;;:::o;17624:236::-;17764:34;17760:1;17752:6;17748:14;17741:58;17833:19;17828:2;17820:6;17816:15;17809:44;17624:236;:::o;17866:366::-;18008:3;18029:67;18093:2;18088:3;18029:67;:::i;:::-;18022:74;;18105:93;18194:3;18105:93;:::i;:::-;18223:2;18218:3;18214:12;18207:19;;17866:366;;;:::o;18238:419::-;18404:4;18442:2;18431:9;18427:18;18419:26;;18491:9;18485:4;18481:20;18477:1;18466:9;18462:17;18455:47;18519:131;18645:4;18519:131;:::i;:::-;18511:139;;18238:419;;;:::o;18663:230::-;18803:34;18799:1;18791:6;18787:14;18780:58;18872:13;18867:2;18859:6;18855:15;18848:38;18663:230;:::o;18899:366::-;19041:3;19062:67;19126:2;19121:3;19062:67;:::i;:::-;19055:74;;19138:93;19227:3;19138:93;:::i;:::-;19256:2;19251:3;19247:12;19240:19;;18899:366;;;:::o;19271:419::-;19437:4;19475:2;19464:9;19460:18;19452:26;;19524:9;19518:4;19514:20;19510:1;19499:9;19495:17;19488:47;19552:131;19678:4;19552:131;:::i;:::-;19544:139;;19271:419;;;:::o;19696:231::-;19836:34;19832:1;19824:6;19820:14;19813:58;19905:14;19900:2;19892:6;19888:15;19881:39;19696:231;:::o;19933:366::-;20075:3;20096:67;20160:2;20155:3;20096:67;:::i;:::-;20089:74;;20172:93;20261:3;20172:93;:::i;:::-;20290:2;20285:3;20281:12;20274:19;;19933:366;;;:::o;20305:419::-;20471:4;20509:2;20498:9;20494:18;20486:26;;20558:9;20552:4;20548:20;20544:1;20533:9;20529:17;20522:47;20586:131;20712:4;20586:131;:::i;:::-;20578:139;;20305:419;;;:::o;20730:180::-;20778:77;20775:1;20768:88;20875:4;20872:1;20865:15;20899:4;20896:1;20889:15;20916:223;21056:34;21052:1;21044:6;21040:14;21033:58;21125:6;21120:2;21112:6;21108:15;21101:31;20916:223;:::o;21145:366::-;21287:3;21308:67;21372:2;21367:3;21308:67;:::i;:::-;21301:74;;21384:93;21473:3;21384:93;:::i;:::-;21502:2;21497:3;21493:12;21486:19;;21145:366;;;:::o;21517:419::-;21683:4;21721:2;21710:9;21706:18;21698:26;;21770:9;21764:4;21760:20;21756:1;21745:9;21741:17;21734:47;21798:131;21924:4;21798:131;:::i;:::-;21790:139;;21517:419;;;:::o;21942:228::-;22082:34;22078:1;22070:6;22066:14;22059:58;22151:11;22146:2;22138:6;22134:15;22127:36;21942:228;:::o;22176:366::-;22318:3;22339:67;22403:2;22398:3;22339:67;:::i;:::-;22332:74;;22415:93;22504:3;22415:93;:::i;:::-;22533:2;22528:3;22524:12;22517:19;;22176:366;;;:::o;22548:419::-;22714:4;22752:2;22741:9;22737:18;22729:26;;22801:9;22795:4;22791:20;22787:1;22776:9;22772:17;22765:47;22829:131;22955:4;22829:131;:::i;:::-;22821:139;;22548:419;;;:::o;22973:229::-;23113:34;23109:1;23101:6;23097:14;23090:58;23182:12;23177:2;23169:6;23165:15;23158:37;22973:229;:::o;23208:366::-;23350:3;23371:67;23435:2;23430:3;23371:67;:::i;:::-;23364:74;;23447:93;23536:3;23447:93;:::i;:::-;23565:2;23560:3;23556:12;23549:19;;23208:366;;;:::o;23580:419::-;23746:4;23784:2;23773:9;23769:18;23761:26;;23833:9;23827:4;23823:20;23819:1;23808:9;23804:17;23797:47;23861:131;23987:4;23861:131;:::i;:::-;23853:139;;23580:419;;;:::o;24005:162::-;24145:14;24141:1;24133:6;24129:14;24122:38;24005:162;:::o;24173:366::-;24315:3;24336:67;24400:2;24395:3;24336:67;:::i;:::-;24329:74;;24412:93;24501:3;24412:93;:::i;:::-;24530:2;24525:3;24521:12;24514:19;;24173:366;;;:::o;24545:419::-;24711:4;24749:2;24738:9;24734:18;24726:26;;24798:9;24792:4;24788:20;24784:1;24773:9;24769:17;24762:47;24826:131;24952:4;24826:131;:::i;:::-;24818:139;;24545:419;;;:::o;24970:165::-;25110:17;25106:1;25098:6;25094:14;25087:41;24970:165;:::o;25141:366::-;25283:3;25304:67;25368:2;25363:3;25304:67;:::i;:::-;25297:74;;25380:93;25469:3;25380:93;:::i;:::-;25498:2;25493:3;25489:12;25482:19;;25141:366;;;:::o;25513:419::-;25679:4;25717:2;25706:9;25702:18;25694:26;;25766:9;25760:4;25756:20;25752:1;25741:9;25737:17;25730:47;25794:131;25920:4;25794:131;:::i;:::-;25786:139;;25513:419;;;:::o;25938:180::-;25986:77;25983:1;25976:88;26083:4;26080:1;26073:15;26107:4;26104:1;26097:15;26124:233;26163:3;26186:24;26204:5;26186:24;:::i;:::-;26177:33;;26232:66;26225:5;26222:77;26219:103;;;26302:18;;:::i;:::-;26219:103;26349:1;26342:5;26338:13;26331:20;;26124:233;;;:::o;26363:164::-;26503:16;26499:1;26491:6;26487:14;26480:40;26363:164;:::o;26533:366::-;26675:3;26696:67;26760:2;26755:3;26696:67;:::i;:::-;26689:74;;26772:93;26861:3;26772:93;:::i;:::-;26890:2;26885:3;26881:12;26874:19;;26533:366;;;:::o;26905:419::-;27071:4;27109:2;27098:9;27094:18;27086:26;;27158:9;27152:4;27148:20;27144:1;27133:9;27129:17;27122:47;27186:131;27312:4;27186:131;:::i;:::-;27178:139;;26905:419;;;:::o;27330:163::-;27470:15;27466:1;27458:6;27454:14;27447:39;27330:163;:::o;27499:366::-;27641:3;27662:67;27726:2;27721:3;27662:67;:::i;:::-;27655:74;;27738:93;27827:3;27738:93;:::i;:::-;27856:2;27851:3;27847:12;27840:19;;27499:366;;;:::o;27871:419::-;28037:4;28075:2;28064:9;28060:18;28052:26;;28124:9;28118:4;28114:20;28110:1;28099:9;28095:17;28088:47;28152:131;28278:4;28152:131;:::i;:::-;28144:139;;27871:419;;;:::o;28296:305::-;28336:3;28355:20;28373:1;28355:20;:::i;:::-;28350:25;;28389:20;28407:1;28389:20;:::i;:::-;28384:25;;28543:1;28475:66;28471:74;28468:1;28465:81;28462:107;;;28549:18;;:::i;:::-;28462:107;28593:1;28590;28586:9;28579:16;;28296:305;;;;:::o;28607:162::-;28747:14;28743:1;28735:6;28731:14;28724:38;28607:162;:::o;28775:366::-;28917:3;28938:67;29002:2;28997:3;28938:67;:::i;:::-;28931:74;;29014:93;29103:3;29014:93;:::i;:::-;29132:2;29127:3;29123:12;29116:19;;28775:366;;;:::o;29147:419::-;29313:4;29351:2;29340:9;29336:18;29328:26;;29400:9;29394:4;29390:20;29386:1;29375:9;29371:17;29364:47;29428:131;29554:4;29428:131;:::i;:::-;29420:139;;29147:419;;;:::o;29572:164::-;29712:16;29708:1;29700:6;29696:14;29689:40;29572:164;:::o;29742:366::-;29884:3;29905:67;29969:2;29964:3;29905:67;:::i;:::-;29898:74;;29981:93;30070:3;29981:93;:::i;:::-;30099:2;30094:3;30090:12;30083:19;;29742:366;;;:::o;30114:419::-;30280:4;30318:2;30307:9;30303:18;30295:26;;30367:9;30361:4;30357:20;30353:1;30342:9;30338:17;30331:47;30395:131;30521:4;30395:131;:::i;:::-;30387:139;;30114:419;;;:::o;30539:162::-;30679:14;30675:1;30667:6;30663:14;30656:38;30539:162;:::o;30707:366::-;30849:3;30870:67;30934:2;30929:3;30870:67;:::i;:::-;30863:74;;30946:93;31035:3;30946:93;:::i;:::-;31064:2;31059:3;31055:12;31048:19;;30707:366;;;:::o;31079:419::-;31245:4;31283:2;31272:9;31268:18;31260:26;;31332:9;31326:4;31322:20;31318:1;31307:9;31303:17;31296:47;31360:131;31486:4;31360:131;:::i;:::-;31352:139;;31079:419;;;:::o;31504:170::-;31644:22;31640:1;31632:6;31628:14;31621:46;31504:170;:::o;31680:366::-;31822:3;31843:67;31907:2;31902:3;31843:67;:::i;:::-;31836:74;;31919:93;32008:3;31919:93;:::i;:::-;32037:2;32032:3;32028:12;32021:19;;31680:366;;;:::o;32052:419::-;32218:4;32256:2;32245:9;32241:18;32233:26;;32305:9;32299:4;32295:20;32291:1;32280:9;32276:17;32269:47;32333:131;32459:4;32333:131;:::i;:::-;32325:139;;32052:419;;;:::o;32477:181::-;32617:33;32613:1;32605:6;32601:14;32594:57;32477:181;:::o;32664:366::-;32806:3;32827:67;32891:2;32886:3;32827:67;:::i;:::-;32820:74;;32903:93;32992:3;32903:93;:::i;:::-;33021:2;33016:3;33012:12;33005:19;;32664:366;;;:::o;33036:419::-;33202:4;33240:2;33229:9;33225:18;33217:26;;33289:9;33283:4;33279:20;33275:1;33264:9;33260:17;33253:47;33317:131;33443:4;33317:131;:::i;:::-;33309:139;;33036:419;;;:::o;33461:148::-;33563:11;33600:3;33585:18;;33461:148;;;;:::o;33615:141::-;33664:4;33687:3;33679:11;;33710:3;33707:1;33700:14;33744:4;33741:1;33731:18;33723:26;;33615:141;;;:::o;33786:845::-;33889:3;33926:5;33920:12;33955:36;33981:9;33955:36;:::i;:::-;34007:89;34089:6;34084:3;34007:89;:::i;:::-;34000:96;;34127:1;34116:9;34112:17;34143:1;34138:137;;;;34289:1;34284:341;;;;34105:520;;34138:137;34222:4;34218:9;34207;34203:25;34198:3;34191:38;34258:6;34253:3;34249:16;34242:23;;34138:137;;34284:341;34351:38;34383:5;34351:38;:::i;:::-;34411:1;34425:154;34439:6;34436:1;34433:13;34425:154;;;34513:7;34507:14;34503:1;34498:3;34494:11;34487:35;34563:1;34554:7;34550:15;34539:26;;34461:4;34458:1;34454:12;34449:17;;34425:154;;;34608:6;34603:3;34599:16;34592:23;;34291:334;;34105:520;;33893:738;;33786:845;;;;:::o;34637:377::-;34743:3;34771:39;34804:5;34771:39;:::i;:::-;34826:89;34908:6;34903:3;34826:89;:::i;:::-;34819:96;;34924:52;34969:6;34964:3;34957:4;34950:5;34946:16;34924:52;:::i;:::-;35001:6;34996:3;34992:16;34985:23;;34747:267;34637:377;;;;:::o;35020:155::-;35160:7;35156:1;35148:6;35144:14;35137:31;35020:155;:::o;35181:400::-;35341:3;35362:84;35444:1;35439:3;35362:84;:::i;:::-;35355:91;;35455:93;35544:3;35455:93;:::i;:::-;35573:1;35568:3;35564:11;35557:18;;35181:400;;;:::o;35587:695::-;35865:3;35887:92;35975:3;35966:6;35887:92;:::i;:::-;35880:99;;35996:95;36087:3;36078:6;35996:95;:::i;:::-;35989:102;;36108:148;36252:3;36108:148;:::i;:::-;36101:155;;36273:3;36266:10;;35587:695;;;;;:::o;36288:161::-;36428:13;36424:1;36416:6;36412:14;36405:37;36288:161;:::o;36455:366::-;36597:3;36618:67;36682:2;36677:3;36618:67;:::i;:::-;36611:74;;36694:93;36783:3;36694:93;:::i;:::-;36812:2;36807:3;36803:12;36796:19;;36455:366;;;:::o;36827:419::-;36993:4;37031:2;37020:9;37016:18;37008:26;;37080:9;37074:4;37070:20;37066:1;37055:9;37051:17;37044:47;37108:131;37234:4;37108:131;:::i;:::-;37100:139;;36827:419;;;:::o;37252:162::-;37392:14;37388:1;37380:6;37376:14;37369:38;37252:162;:::o;37420:366::-;37562:3;37583:67;37647:2;37642:3;37583:67;:::i;:::-;37576:74;;37659:93;37748:3;37659:93;:::i;:::-;37777:2;37772:3;37768:12;37761:19;;37420:366;;;:::o;37792:419::-;37958:4;37996:2;37985:9;37981:18;37973:26;;38045:9;38039:4;38035:20;38031:1;38020:9;38016:17;38009:47;38073:131;38199:4;38073:131;:::i;:::-;38065:139;;37792:419;;;:::o;38217:166::-;38357:18;38353:1;38345:6;38341:14;38334:42;38217:166;:::o;38389:366::-;38531:3;38552:67;38616:2;38611:3;38552:67;:::i;:::-;38545:74;;38628:93;38717:3;38628:93;:::i;:::-;38746:2;38741:3;38737:12;38730:19;;38389:366;;;:::o;38761:419::-;38927:4;38965:2;38954:9;38950:18;38942:26;;39014:9;39008:4;39004:20;39000:1;38989:9;38985:17;38978:47;39042:131;39168:4;39042:131;:::i;:::-;39034:139;;38761:419;;;:::o;39186:225::-;39326:34;39322:1;39314:6;39310:14;39303:58;39395:8;39390:2;39382:6;39378:15;39371:33;39186:225;:::o;39417:366::-;39559:3;39580:67;39644:2;39639:3;39580:67;:::i;:::-;39573:74;;39656:93;39745:3;39656:93;:::i;:::-;39774:2;39769:3;39765:12;39758:19;;39417:366;;;:::o;39789:419::-;39955:4;39993:2;39982:9;39978:18;39970:26;;40042:9;40036:4;40032:20;40028:1;40017:9;40013:17;40006:47;40070:131;40196:4;40070:131;:::i;:::-;40062:139;;39789:419;;;:::o;40214:231::-;40354:34;40350:1;40342:6;40338:14;40331:58;40423:14;40418:2;40410:6;40406:15;40399:39;40214:231;:::o;40451:366::-;40593:3;40614:67;40678:2;40673:3;40614:67;:::i;:::-;40607:74;;40690:93;40779:3;40690:93;:::i;:::-;40808:2;40803:3;40799:12;40792:19;;40451:366;;;:::o;40823:419::-;40989:4;41027:2;41016:9;41012:18;41004:26;;41076:9;41070:4;41066:20;41062:1;41051:9;41047:17;41040:47;41104:131;41230:4;41104:131;:::i;:::-;41096:139;;40823:419;;;:::o;41248:228::-;41388:34;41384:1;41376:6;41372:14;41365:58;41457:11;41452:2;41444:6;41440:15;41433:36;41248:228;:::o;41482:366::-;41624:3;41645:67;41709:2;41704:3;41645:67;:::i;:::-;41638:74;;41721:93;41810:3;41721:93;:::i;:::-;41839:2;41834:3;41830:12;41823:19;;41482:366;;;:::o;41854:419::-;42020:4;42058:2;42047:9;42043:18;42035:26;;42107:9;42101:4;42097:20;42093:1;42082:9;42078:17;42071:47;42135:131;42261:4;42135:131;:::i;:::-;42127:139;;41854:419;;;:::o;42279:223::-;42419:34;42415:1;42407:6;42403:14;42396:58;42488:6;42483:2;42475:6;42471:15;42464:31;42279:223;:::o;42508:366::-;42650:3;42671:67;42735:2;42730:3;42671:67;:::i;:::-;42664:74;;42747:93;42836:3;42747:93;:::i;:::-;42865:2;42860:3;42856:12;42849:19;;42508:366;;;:::o;42880:419::-;43046:4;43084:2;43073:9;43069:18;43061:26;;43133:9;43127:4;43123:20;43119:1;43108:9;43104:17;43097:47;43161:131;43287:4;43161:131;:::i;:::-;43153:139;;42880:419;;;:::o;43305:191::-;43345:4;43365:20;43383:1;43365:20;:::i;:::-;43360:25;;43399:20;43417:1;43399:20;:::i;:::-;43394:25;;43438:1;43435;43432:8;43429:34;;;43443:18;;:::i;:::-;43429:34;43488:1;43485;43481:9;43473:17;;43305:191;;;;:::o;43502:348::-;43542:7;43565:20;43583:1;43565:20;:::i;:::-;43560:25;;43599:20;43617:1;43599:20;:::i;:::-;43594:25;;43787:1;43719:66;43715:74;43712:1;43709:81;43704:1;43697:9;43690:17;43686:105;43683:131;;;43794:18;;:::i;:::-;43683:131;43842:1;43839;43835:9;43824:20;;43502:348;;;;:::o;43856:175::-;43996:27;43992:1;43984:6;43980:14;43973:51;43856:175;:::o;44037:366::-;44179:3;44200:67;44264:2;44259:3;44200:67;:::i;:::-;44193:74;;44276:93;44365:3;44276:93;:::i;:::-;44394:2;44389:3;44385:12;44378:19;;44037:366;;;:::o;44409:419::-;44575:4;44613:2;44602:9;44598:18;44590:26;;44662:9;44656:4;44652:20;44648:1;44637:9;44633:17;44626:47;44690:131;44816:4;44690:131;:::i;:::-;44682:139;;44409:419;;;:::o;44834:237::-;44974:34;44970:1;44962:6;44958:14;44951:58;45043:20;45038:2;45030:6;45026:15;45019:45;44834:237;:::o;45077:366::-;45219:3;45240:67;45304:2;45299:3;45240:67;:::i;:::-;45233:74;;45316:93;45405:3;45316:93;:::i;:::-;45434:2;45429:3;45425:12;45418:19;;45077:366;;;:::o;45449:419::-;45615:4;45653:2;45642:9;45638:18;45630:26;;45702:9;45696:4;45692:20;45688:1;45677:9;45673:17;45666:47;45730:131;45856:4;45730:131;:::i;:::-;45722:139;;45449:419;;;:::o;45874:180::-;45922:77;45919:1;45912:88;46019:4;46016:1;46009:15;46043:4;46040:1;46033:15;46060:185;46100:1;46117:20;46135:1;46117:20;:::i;:::-;46112:25;;46151:20;46169:1;46151:20;:::i;:::-;46146:25;;46190:1;46180:35;;46195:18;;:::i;:::-;46180:35;46237:1;46234;46230:9;46225:14;;46060:185;;;;:::o;46251:176::-;46283:1;46300:20;46318:1;46300:20;:::i;:::-;46295:25;;46334:20;46352:1;46334:20;:::i;:::-;46329:25;;46373:1;46363:35;;46378:18;;:::i;:::-;46363:35;46419:1;46416;46412:9;46407:14;;46251:176;;;;:::o;46433:98::-;46484:6;46518:5;46512:12;46502:22;;46433:98;;;:::o;46537:168::-;46620:11;46654:6;46649:3;46642:19;46694:4;46689:3;46685:14;46670:29;;46537:168;;;;:::o;46711:360::-;46797:3;46825:38;46857:5;46825:38;:::i;:::-;46879:70;46942:6;46937:3;46879:70;:::i;:::-;46872:77;;46958:52;47003:6;46998:3;46991:4;46984:5;46980:16;46958:52;:::i;:::-;47035:29;47057:6;47035:29;:::i;:::-;47030:3;47026:39;47019:46;;46801:270;46711:360;;;;:::o;47077:640::-;47272:4;47310:3;47299:9;47295:19;47287:27;;47324:71;47392:1;47381:9;47377:17;47368:6;47324:71;:::i;:::-;47405:72;47473:2;47462:9;47458:18;47449:6;47405:72;:::i;:::-;47487;47555:2;47544:9;47540:18;47531:6;47487:72;:::i;:::-;47606:9;47600:4;47596:20;47591:2;47580:9;47576:18;47569:48;47634:76;47705:4;47696:6;47634:76;:::i;:::-;47626:84;;47077:640;;;;;;;:::o;47723:141::-;47779:5;47810:6;47804:13;47795:22;;47826:32;47852:5;47826:32;:::i;:::-;47723:141;;;;:::o;47870:349::-;47939:6;47988:2;47976:9;47967:7;47963:23;47959:32;47956:119;;;47994:79;;:::i;:::-;47956:119;48114:1;48139:63;48194:7;48185:6;48174:9;48170:22;48139:63;:::i;:::-;48129:73;;48085:127;47870:349;;;;:::o;48225:180::-;48273:77;48270:1;48263:88;48370:4;48367:1;48360:15;48394:4;48391:1;48384:15;48411:182;48551:34;48547:1;48539:6;48535:14;48528:58;48411:182;:::o;48599:366::-;48741:3;48762:67;48826:2;48821:3;48762:67;:::i;:::-;48755:74;;48838:93;48927:3;48838:93;:::i;:::-;48956:2;48951:3;48947:12;48940:19;;48599:366;;;:::o;48971:419::-;49137:4;49175:2;49164:9;49160:18;49152:26;;49224:9;49218:4;49214:20;49210:1;49199:9;49195:17;49188:47;49252:131;49378:4;49252:131;:::i;:::-;49244:139;;48971:419;;;:::o;49396:178::-;49536:30;49532:1;49524:6;49520:14;49513:54;49396:178;:::o;49580:366::-;49722:3;49743:67;49807:2;49802:3;49743:67;:::i;:::-;49736:74;;49819:93;49908:3;49819:93;:::i;:::-;49937:2;49932:3;49928:12;49921:19;;49580:366;;;:::o;49952:419::-;50118:4;50156:2;50145:9;50141:18;50133:26;;50205:9;50199:4;50195:20;50191:1;50180:9;50176:17;50169:47;50233:131;50359:4;50233:131;:::i;:::-;50225:139;;49952:419;;;:::o

Swarm Source

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