ETH Price: $3,134.60 (-2.33%)

Token

 

Overview

Max Total Supply

0

Holders

33

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
0x61fde6848477c24d36fa2f2d6259202b22670ed2
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
GladiaxyItemsV1a

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at optimistic.etherscan.io on 2022-11-21
*/

// File: @openzeppelin/[email protected]/utils/Strings.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

// File: @openzeppelin/[email protected]/utils/cryptography/ECDSA.sol


// OpenZeppelin Contracts (last updated v4.7.3) (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) {
        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.
            /// @solidity memory-safe-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 {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

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

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

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

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

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

        return (signer, RecoverError.NoError);
    }

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

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

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

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

// File: @openzeppelin/[email protected]/utils/cryptography/draft-EIP712.sol


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)

pragma solidity ^0.8.0;


/**
 * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
 *
 * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
 * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
 * they need in their contracts using a combination of `abi.encode` and `keccak256`.
 *
 * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
 * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
 * ({_hashTypedDataV4}).
 *
 * The implementation of the domain separator was designed to be as efficient as possible while still properly updating
 * the chain id to protect against replay attacks on an eventual fork of the chain.
 *
 * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
 * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
 *
 * _Available since v3.4._
 */
abstract contract EIP712 {
    /* solhint-disable var-name-mixedcase */
    // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
    // invalidate the cached domain separator if the chain id changes.
    bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
    uint256 private immutable _CACHED_CHAIN_ID;
    address private immutable _CACHED_THIS;

    bytes32 private immutable _HASHED_NAME;
    bytes32 private immutable _HASHED_VERSION;
    bytes32 private immutable _TYPE_HASH;

    /* solhint-enable var-name-mixedcase */

    /**
     * @dev Initializes the domain separator and parameter caches.
     *
     * The meaning of `name` and `version` is specified in
     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
     *
     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
     * - `version`: the current major version of the signing domain.
     *
     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
     * contract upgrade].
     */
    constructor(string memory name, string memory version) {
        bytes32 hashedName = keccak256(bytes(name));
        bytes32 hashedVersion = keccak256(bytes(version));
        bytes32 typeHash = keccak256(
            "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
        );
        _HASHED_NAME = hashedName;
        _HASHED_VERSION = hashedVersion;
        _CACHED_CHAIN_ID = block.chainid;
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
        _CACHED_THIS = address(this);
        _TYPE_HASH = typeHash;
    }

    /**
     * @dev Returns the domain separator for the current chain.
     */
    function _domainSeparatorV4() internal view returns (bytes32) {
        if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {
            return _CACHED_DOMAIN_SEPARATOR;
        } else {
            return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
        }
    }

    function _buildDomainSeparator(
        bytes32 typeHash,
        bytes32 nameHash,
        bytes32 versionHash
    ) private view returns (bytes32) {
        return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));
    }

    /**
     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
     * function returns the hash of the fully encoded EIP712 message for this domain.
     *
     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
     *
     * ```solidity
     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
     *     keccak256("Mail(address to,string contents)"),
     *     mailTo,
     *     keccak256(bytes(mailContents))
     * )));
     * address signer = ECDSA.recover(digest, signature);
     * ```
     */
    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
        return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
    }
}

// File: @openzeppelin/[email protected]/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/[email protected]/security/Pausable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// File: @openzeppelin/[email protected]/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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/[email protected]/utils/Address.sol


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/[email protected]/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/[email protected]/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/[email protected]/token/ERC1155/IERC1155Receiver.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;


/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/[email protected]/token/ERC1155/IERC1155.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/[email protected]/token/ERC1155/extensions/IERC1155MetadataURI.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

// File: @openzeppelin/[email protected]/token/ERC1155/ERC1155.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;







/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: address zero is not a valid owner");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

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

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `ids` and `amounts` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

// File: @openzeppelin/[email protected]/token/ERC1155/extensions/ERC1155Supply.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155Supply.sol)

pragma solidity ^0.8.0;


/**
 * @dev Extension of ERC1155 that adds tracking of total supply per id.
 *
 * Useful for scenarios where Fungible and Non-fungible tokens have to be
 * clearly identified. Note: While a totalSupply of 1 might mean the
 * corresponding is an NFT, there is no guarantees that no other token with the
 * same id are not going to be minted.
 */
abstract contract ERC1155Supply is ERC1155 {
    mapping(uint256 => uint256) private _totalSupply;

    /**
     * @dev Total amount of tokens in with a given id.
     */
    function totalSupply(uint256 id) public view virtual returns (uint256) {
        return _totalSupply[id];
    }

    /**
     * @dev Indicates whether any token exist with a given id, or not.
     */
    function exists(uint256 id) public view virtual returns (bool) {
        return ERC1155Supply.totalSupply(id) > 0;
    }

    /**
     * @dev See {ERC1155-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);

        if (from == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                _totalSupply[ids[i]] += amounts[i];
            }
        }

        if (to == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                uint256 id = ids[i];
                uint256 amount = amounts[i];
                uint256 supply = _totalSupply[id];
                require(supply >= amount, "ERC1155: burn amount exceeds totalSupply");
                unchecked {
                    _totalSupply[id] = supply - amount;
                }
            }
        }
    }
}

// File: @openzeppelin/[email protected]/token/ERC1155/extensions/ERC1155Burnable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/extensions/ERC1155Burnable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Extension of {ERC1155} that allows token holders to destroy both their
 * own tokens and those that they have been approved to use.
 *
 * _Available since v3.1._
 */
abstract contract ERC1155Burnable is ERC1155 {
    function burn(
        address account,
        uint256 id,
        uint256 value
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not token owner nor approved"
        );

        _burn(account, id, value);
    }

    function burnBatch(
        address account,
        uint256[] memory ids,
        uint256[] memory values
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not token owner nor approved"
        );

        _burnBatch(account, ids, values);
    }
}

// File: test1155.sol


pragma solidity ^0.8.4;








contract GladiaxyItemsV1a is ERC1155, Ownable, Pausable, ERC1155Burnable, ERC1155Supply, EIP712 {
    
    using Strings for uint256;

    string private constant SIGNING_DOMAIN = "Voucher-Domain";
    string private constant SIGNATURE_VERSION = "1";
    address public minter;
    
    mapping (uint256 => string) private uris;

    constructor(address _signer) ERC1155("") EIP712(SIGNING_DOMAIN, SIGNATURE_VERSION) {
        minter = _signer;
    }

    struct LazyNFTVoucher {
        uint256 tokenId;
        uint256 price;
        uint256 amount;
        uint256 maxAmount;
        string uri;
        address buyer;
        bytes signature;
    }

    function recover(LazyNFTVoucher calldata voucher) public view returns (address) {
        bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
            keccak256("LazyNFTVoucher(uint256 tokenId,uint256 price,uint256 amount,uint256 maxAmount,string uri,address buyer)"),
            voucher.tokenId,
            voucher.price,
            voucher.amount,
            voucher.maxAmount,
            keccak256(bytes(voucher.uri)),
            voucher.buyer
        )));
        address signer = ECDSA.recover(digest, voucher.signature);
        return signer;
    }

    function changeMinter(address newMinter) public onlyOwner {
        minter = newMinter;
    }

    function _setURI(string memory newUri, uint256 tokenId) internal {
        uris[tokenId] = newUri;
    }

    function changeURI(string memory newUri, uint256 tokenId) public onlyOwner { 
        uris[tokenId] = newUri;
    }

    function pause() public onlyOwner {
        _pause();
    }

    function unpause() public onlyOwner {
        _unpause();
    }

    function mint(LazyNFTVoucher calldata voucher)
        public 
        payable
    {
        require(minter == recover(voucher), "Wrong signature");
        require(msg.value >= voucher.price, "Not enough Ether sent");
        uint256 mintAmount = voucher.amount;
        if(mintAmount + balanceOf(voucher.buyer,voucher.tokenId) > voucher.maxAmount){
            mintAmount = voucher.maxAmount - balanceOf(voucher.buyer,voucher.tokenId);
        }

        require(mintAmount > 0);
        
        _mint(voucher.buyer, voucher.tokenId, mintAmount, "");
        _setURI(voucher.uri, voucher.tokenId);

        assert(balanceOf(voucher.buyer,voucher.tokenId) <= voucher.maxAmount);
    }

    function mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data)
        public
        onlyOwner
    {
        _mintBatch(to, ids, amounts, data);
    }

    function massMint(address[] memory _to, uint256[] memory _ids, uint256[] memory _amounts)
    external
    onlyOwner
    {
        for (uint256 i = 0; i < _to.length; ++i) {
            _mint(_to[i], _ids[i], _amounts[i], "");
        }
    }

    function _beforeTokenTransfer(address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data)
        internal
        whenNotPaused
        override(ERC1155, ERC1155Supply)
    {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
    }

    function uri(uint256 tokenId) public view virtual override returns (string memory) {
        require(exists(tokenId), "ERC1155Metadata: URI query for nonexistent token");

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

 

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_signer","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMinter","type":"address"}],"name":"changeMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newUri","type":"string"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"changeURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"massMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"maxAmount","type":"uint256"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct GladiaxyItemsV1a.LazyNFTVoucher","name":"voucher","type":"tuple"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"maxAmount","type":"uint256"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct GladiaxyItemsV1a.LazyNFTVoucher","name":"voucher","type":"tuple"}],"name":"recover","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

6101406040523480156200001257600080fd5b5060405162005bbb38038062005bbb8339818101604052810190620000389190620003eb565b6040518060400160405280600e81526020017f566f75636865722d446f6d61696e0000000000000000000000000000000000008152506040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525060405180602001604052806000815250620000c581620001fe60201b60201c565b50620000e6620000da6200021a60201b60201c565b6200022260201b60201c565b6000600360146101000a81548160ff02191690831515021790555060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a081815250506200016a818484620002e860201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050806101208181525050505050505080600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505062000579565b80600290805190602001906200021692919062000324565b5050565b600033905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600083838346306040516020016200030595949392919062000450565b6040516020818303038152906040528051906020012090509392505050565b8280546200033290620004f5565b90600052602060002090601f016020900481019282620003565760008555620003a2565b82601f106200037157805160ff1916838001178555620003a2565b82800160010185558215620003a2579182015b82811115620003a157825182559160200191906001019062000384565b5b509050620003b19190620003b5565b5090565b5b80821115620003d0576000816000905550600101620003b6565b5090565b600081519050620003e5816200055f565b92915050565b6000602082840312156200040457620004036200055a565b5b60006200041484828501620003d4565b91505092915050565b6200042881620004ad565b82525050565b6200043981620004c1565b82525050565b6200044a81620004eb565b82525050565b600060a0820190506200046760008301886200042e565b6200047660208301876200042e565b6200048560408301866200042e565b6200049460608301856200043f565b620004a360808301846200041d565b9695505050505050565b6000620004ba82620004cb565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060028204905060018216806200050e57607f821691505b602082108114156200052557620005246200052b565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6200056a81620004ad565b81146200057657600080fd5b50565b60805160a05160c05160601c60e05161010051610120516155ef620005cc6000396000612cc401526000612d0601526000612ce501526000612c1a01526000612c7001526000612c9901526155ef6000f3fe6080604052600436106101655760003560e01c80634f558e79116100d15780638da5cb5b1161008a578063e985e9c511610064578063e985e9c514610516578063f242432a14610553578063f2fde38b1461057c578063f5298aca146105a557610165565b80638da5cb5b14610485578063a22cb465146104b0578063bd85b039146104d957610165565b80634f558e79146103895780635c975abb146103c65780636b20c454146103f1578063715018a61461041a5780638456cb591461043157806387e832a91461044857610165565b80631f7fdffa116101235780631f7fdffa146102915780632c4d4d18146102ba5780632eb2c2d6146102e35780633f4ba83a1461030c578063492c5a43146103235780634e1273f41461034c57610165565b8062fdd58e1461016a57806301ffc9a7146101a757806307546172146101e45780630e89341c1461020f57806312644a531461024c57806319fd30da14610268575b600080fd5b34801561017657600080fd5b50610191600480360381019061018c919061396e565b6105ce565b60405161019e9190614782565b60405180910390f35b3480156101b357600080fd5b506101ce60048036038101906101c99190613b20565b610697565b6040516101db919061433e565b60405180910390f35b3480156101f057600080fd5b506101f9610779565b6040516102069190614208565b60405180910390f35b34801561021b57600080fd5b5061023660048036038101906102319190613c1f565b61079f565b6040516102439190614460565b60405180910390f35b61026660048036038101906102619190613bd6565b6108da565b005b34801561027457600080fd5b5061028f600480360381019061028a9190613b7a565b610b00565b005b34801561029d57600080fd5b506102b860048036038101906102b39190613873565b610b34565b005b3480156102c657600080fd5b506102e160048036038101906102dc9190613615565b610b4e565b005b3480156102ef57600080fd5b5061030a60048036038101906103059190613682565b610b9a565b005b34801561031857600080fd5b50610321610c3b565b005b34801561032f57600080fd5b5061034a60048036038101906103459190613a79565b610c4d565b005b34801561035857600080fd5b50610373600480360381019061036e9190613a01565b610ce1565b60405161038091906142e5565b60405180910390f35b34801561039557600080fd5b506103b060048036038101906103ab9190613c1f565b610dfa565b6040516103bd919061433e565b60405180910390f35b3480156103d257600080fd5b506103db610e0e565b6040516103e8919061433e565b60405180910390f35b3480156103fd57600080fd5b50610418600480360381019061041391906137e8565b610e25565b005b34801561042657600080fd5b5061042f610ec2565b005b34801561043d57600080fd5b50610446610ed6565b005b34801561045457600080fd5b5061046f600480360381019061046a9190613bd6565b610ee8565b60405161047c9190614208565b60405180910390f35b34801561049157600080fd5b5061049a610ff9565b6040516104a79190614208565b60405180910390f35b3480156104bc57600080fd5b506104d760048036038101906104d2919061392e565b611023565b005b3480156104e557600080fd5b5061050060048036038101906104fb9190613c1f565b611039565b60405161050d9190614782565b60405180910390f35b34801561052257600080fd5b5061053d60048036038101906105389190613642565b611056565b60405161054a919061433e565b60405180910390f35b34801561055f57600080fd5b5061057a60048036038101906105759190613751565b6110ea565b005b34801561058857600080fd5b506105a3600480360381019061059e9190613615565b61118b565b005b3480156105b157600080fd5b506105cc60048036038101906105c791906139ae565b61120f565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561063f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610636906145c2565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061076257507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107725750610771826112ac565b5b9050919050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606107aa82610dfa565b6107e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e0906146e2565b60405180910390fd5b600060066000848152602001908152602001600020805461080990614b7a565b80601f016020809104026020016040519081016040528092919081815260200182805461083590614b7a565b80156108825780601f1061085757610100808354040283529160200191610882565b820191906000526020600020905b81548152906001019060200180831161086557829003601f168201915b5050505050905060008151116108a757604051806020016040528060008152506108d2565b806108b184611316565b6040516020016108c29291906141a2565b6040516020818303038152906040525b915050919050565b6108e381610ee8565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610972576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096990614542565b60405180910390fd5b80602001353410156109b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b090614562565b60405180910390fd5b60008160400135905081606001356109e78360a00160208101906109dd9190613615565b84600001356105ce565b826109f291906149f2565b1115610a2a57610a188260a0016020810190610a0e9190613615565b83600001356105ce565b8260600135610a279190614a79565b90505b60008111610a3757600080fd5b610a688260a0016020810190610a4d9190613615565b83600001358360405180602001604052806000815250611477565b610ac8828060800190610a7b9190614829565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508360000135611628565b8160600135610aed8360a0016020810190610ae39190613615565b84600001356105ce565b1115610afc57610afb614c61565b5b5050565b610b08611654565b81600660008381526020019081526020016000209080519060200190610b2f9291906132ce565b505050565b610b3c611654565b610b48848484846116d2565b50505050565b610b56611654565b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610ba26118ff565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610be85750610be785610be26118ff565b611056565b5b610c27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1e906144c2565b60405180910390fd5b610c348585858585611907565b5050505050565b610c43611654565b610c4b611c29565b565b610c55611654565b60005b8351811015610cdb57610cca848281518110610c7757610c76614d4c565b5b6020026020010151848381518110610c9257610c91614d4c565b5b6020026020010151848481518110610cad57610cac614d4c565b5b602002602001015160405180602001604052806000815250611477565b80610cd490614bdd565b9050610c58565b50505050565b60608151835114610d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1e90614722565b60405180910390fd5b6000835167ffffffffffffffff811115610d4457610d43614d7b565b5b604051908082528060200260200182016040528015610d725781602001602082028036833780820191505090505b50905060005b8451811015610def57610dbf858281518110610d9757610d96614d4c565b5b6020026020010151858381518110610db257610db1614d4c565b5b60200260200101516105ce565b828281518110610dd257610dd1614d4c565b5b60200260200101818152505080610de890614bdd565b9050610d78565b508091505092915050565b600080610e0683611039565b119050919050565b6000600360149054906101000a900460ff16905090565b610e2d6118ff565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610e735750610e7283610e6d6118ff565b611056565b5b610eb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea9906144c2565b60405180910390fd5b610ebd838383611c8c565b505050565b610eca611654565b610ed46000611f5b565b565b610ede611654565b610ee6612021565b565b600080610f8d7f2a9160260cb569dfe98b35cc97a3914ee9c63525997c549060a463c91bdd23178460000135856020013586604001358760600135888060800190610f339190614829565b604051610f41929190614189565b60405180910390208960a0016020810190610f5c9190613615565b604051602001610f7297969594939291906143ac565b60405160208183030381529060405280519060200120612084565b90506000610fed82858060c00190610fa591906147c6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061209e565b90508092505050919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61103561102e6118ff565b83836120c5565b5050565b600060046000838152602001908152602001600020549050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6110f26118ff565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806111385750611137856111326118ff565b611056565b5b611177576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116e906144c2565b60405180910390fd5b6111848585858585612232565b5050505050565b611193611654565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fa90614582565b60405180910390fd5b61120c81611f5b565b50565b6112176118ff565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061125d575061125c836112576118ff565b611056565b5b61129c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611293906144c2565b60405180910390fd5b6112a78383836124ce565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6060600082141561135e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611472565b600082905060005b6000821461139057808061137990614bdd565b915050600a826113899190614a48565b9150611366565b60008167ffffffffffffffff8111156113ac576113ab614d7b565b5b6040519080825280601f01601f1916602001820160405280156113de5781602001600182028036833780820191505090505b5090505b6000851461146b576001826113f79190614a79565b9150600a856114069190614c30565b603061141291906149f2565b60f81b81838151811061142857611427614d4c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856114649190614a48565b94506113e2565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156114e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114de90614762565b60405180910390fd5b60006114f16118ff565b905060006114fe85612715565b9050600061150b85612715565b905061151c8360008985858961278f565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461157b91906149f2565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516115f992919061479d565b60405180910390a4611610836000898585896127ad565b61161f836000898989896127b5565b50505050505050565b8160066000838152602001908152602001600020908051906020019061164f9291906132ce565b505050565b61165c6118ff565b73ffffffffffffffffffffffffffffffffffffffff1661167a610ff9565b73ffffffffffffffffffffffffffffffffffffffff16146116d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c7906146a2565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611742576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173990614762565b60405180910390fd5b8151835114611786576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177d90614742565b60405180910390fd5b60006117906118ff565b90506117a18160008787878761278f565b60005b845181101561185a578381815181106117c0576117bf614d4c565b5b60200260200101516000808784815181106117de576117dd614d4c565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461184091906149f2565b92505081905550808061185290614bdd565b9150506117a4565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516118d2929190614307565b60405180910390a46118e9816000878787876127ad565b6118f88160008787878761299c565b5050505050565b600033905090565b815183511461194b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194290614742565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156119bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b290614622565b60405180910390fd5b60006119c56118ff565b90506119d581878787878761278f565b60005b8451811015611b865760008582815181106119f6576119f5614d4c565b5b602002602001015190506000858381518110611a1557611a14614d4c565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aad90614682565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b6b91906149f2565b9250508190555050505080611b7f90614bdd565b90506119d8565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611bfd929190614307565b60405180910390a4611c138187878787876127ad565b611c2181878787878761299c565b505050505050565b611c31612b83565b6000600360146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611c756118ff565b604051611c829190614208565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611cfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf390614662565b60405180910390fd5b8051825114611d40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3790614742565b60405180910390fd5b6000611d4a6118ff565b9050611d6a8185600086866040518060200160405280600081525061278f565b60005b8351811015611eb7576000848281518110611d8b57611d8a614d4c565b5b602002602001015190506000848381518110611daa57611da9614d4c565b5b60200260200101519050600080600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611e4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e42906145a2565b60405180910390fd5b81810360008085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050508080611eaf90614bdd565b915050611d6d565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611f2f929190614307565b60405180910390a4611f55818560008686604051806020016040528060008152506127ad565b50505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612029612bcc565b6001600360146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861206d6118ff565b60405161207a9190614208565b60405180910390a1565b6000612097612091612c16565b83612d30565b9050919050565b60008060006120ad8585612d63565b915091506120ba81612db5565b819250505092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212b90614702565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612225919061433e565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156122a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229990614622565b60405180910390fd5b60006122ac6118ff565b905060006122b985612715565b905060006122c685612715565b90506122d683898985858961278f565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508581101561236d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236490614682565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461242291906149f2565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a60405161249f92919061479d565b60405180910390a46124b5848a8a86868a6127ad565b6124c3848a8a8a8a8a6127b5565b505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561253e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253590614662565b60405180910390fd5b60006125486118ff565b9050600061255584612715565b9050600061256284612715565b90506125828387600085856040518060200160405280600081525061278f565b600080600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084811015612619576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612610906145a2565b60405180910390fd5b84810360008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516126e692919061479d565b60405180910390a461270c848860008686604051806020016040528060008152506127ad565b50505050505050565b60606000600167ffffffffffffffff81111561273457612733614d7b565b5b6040519080825280602002602001820160405280156127625781602001602082028036833780820191505090505b509050828160008151811061277a57612779614d4c565b5b60200260200101818152505080915050919050565b612797612bcc565b6127a5868686868686612f8a565b505050505050565b505050505050565b6127d48473ffffffffffffffffffffffffffffffffffffffff1661315c565b15612994578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b815260040161281a95949392919061428b565b602060405180830381600087803b15801561283457600080fd5b505af192505050801561286557506040513d601f19601f820116820180604052508101906128629190613b4d565b60015b61290b57612871614daa565b806308c379a014156128ce57506128866154c7565b8061289157506128d0565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c59190614460565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612902906144a2565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612992576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612989906144e2565b60405180910390fd5b505b505050505050565b6129bb8473ffffffffffffffffffffffffffffffffffffffff1661315c565b15612b7b578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612a01959493929190614223565b602060405180830381600087803b158015612a1b57600080fd5b505af1925050508015612a4c57506040513d601f19601f82011682018060405250810190612a499190613b4d565b60015b612af257612a58614daa565b806308c379a01415612ab55750612a6d6154c7565b80612a785750612ab7565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aac9190614460565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae9906144a2565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b70906144e2565b60405180910390fd5b505b505050505050565b612b8b610e0e565b612bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc190614502565b60405180910390fd5b565b612bd4610e0e565b15612c14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0b90614602565b60405180910390fd5b565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015612c9257507f000000000000000000000000000000000000000000000000000000000000000046145b15612cbf577f00000000000000000000000000000000000000000000000000000000000000009050612d2d565b612d2a7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061317f565b90505b90565b60008282604051602001612d459291906141d1565b60405160208183030381529060405280519060200120905092915050565b600080604183511415612da55760008060006020860151925060408601519150606086015160001a9050612d99878285856131b9565b94509450505050612dae565b60006002915091505b9250929050565b60006004811115612dc957612dc8614cee565b5b816004811115612ddc57612ddb614cee565b5b1415612de757612f87565b60016004811115612dfb57612dfa614cee565b5b816004811115612e0e57612e0d614cee565b5b1415612e4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4690614482565b60405180910390fd5b60026004811115612e6357612e62614cee565b5b816004811115612e7657612e75614cee565b5b1415612eb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eae90614522565b60405180910390fd5b60036004811115612ecb57612eca614cee565b5b816004811115612ede57612edd614cee565b5b1415612f1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f16906145e2565b60405180910390fd5b600480811115612f3257612f31614cee565b5b816004811115612f4557612f44614cee565b5b1415612f86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7d90614642565b60405180910390fd5b5b50565b612f988686868686866132c6565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561304a5760005b835181101561304857828181518110612fec57612feb614d4c565b5b60200260200101516004600086848151811061300b5761300a614d4c565b5b60200260200101518152602001908152602001600020600082825461303091906149f2565b925050819055508061304190614bdd565b9050612fd0565b505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156131545760005b83518110156131525760008482815181106130a05761309f614d4c565b5b6020026020010151905060008483815181106130bf576130be614d4c565b5b6020026020010151905060006004600084815260200190815260200160002054905081811015613124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311b906146c2565b60405180910390fd5b81810360046000858152602001908152602001600020819055505050508061314b90614bdd565b9050613082565b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000838383463060405160200161319a959493929190614359565b6040516020818303038152906040528051906020012090509392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156131f45760006003915091506132bd565b601b8560ff161415801561320c5750601c8560ff1614155b1561321e5760006004915091506132bd565b600060018787878760405160008152602001604052604051613243949392919061441b565b6020604051602081039080840390855afa158015613265573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156132b4576000600192509250506132bd565b80600092509250505b94509492505050565b505050505050565b8280546132da90614b7a565b90600052602060002090601f0160209004810192826132fc5760008555613343565b82601f1061331557805160ff1916838001178555613343565b82800160010185558215613343579182015b82811115613342578251825591602001919060010190613327565b5b5090506133509190613354565b5090565b5b8082111561336d576000816000905550600101613355565b5090565b600061338461337f846148b1565b61488c565b905080838252602082019050828560208602820111156133a7576133a6614de0565b5b60005b858110156133d757816133bd88826134d5565b8452602084019350602083019250506001810190506133aa565b5050509392505050565b60006133f46133ef846148dd565b61488c565b9050808382526020820190508285602086028201111561341757613416614de0565b5b60005b85811015613447578161342d8882613600565b84526020840193506020830192505060018101905061341a565b5050509392505050565b600061346461345f84614909565b61488c565b9050828152602081018484840111156134805761347f614dea565b5b61348b848285614b38565b509392505050565b60006134a66134a18461493a565b61488c565b9050828152602081018484840111156134c2576134c1614dea565b5b6134cd848285614b38565b509392505050565b6000813590506134e48161555d565b92915050565b600082601f8301126134ff576134fe614dcc565b5b813561350f848260208601613371565b91505092915050565b600082601f83011261352d5761352c614dcc565b5b813561353d8482602086016133e1565b91505092915050565b60008135905061355581615574565b92915050565b60008135905061356a8161558b565b92915050565b60008151905061357f8161558b565b92915050565b600082601f83011261359a57613599614dcc565b5b81356135aa848260208601613451565b91505092915050565b600082601f8301126135c8576135c7614dcc565b5b81356135d8848260208601613493565b91505092915050565b600060e082840312156135f7576135f6614dd6565b5b81905092915050565b60008135905061360f816155a2565b92915050565b60006020828403121561362b5761362a614df4565b5b6000613639848285016134d5565b91505092915050565b6000806040838503121561365957613658614df4565b5b6000613667858286016134d5565b9250506020613678858286016134d5565b9150509250929050565b600080600080600060a0868803121561369e5761369d614df4565b5b60006136ac888289016134d5565b95505060206136bd888289016134d5565b945050604086013567ffffffffffffffff8111156136de576136dd614def565b5b6136ea88828901613518565b935050606086013567ffffffffffffffff81111561370b5761370a614def565b5b61371788828901613518565b925050608086013567ffffffffffffffff81111561373857613737614def565b5b61374488828901613585565b9150509295509295909350565b600080600080600060a0868803121561376d5761376c614df4565b5b600061377b888289016134d5565b955050602061378c888289016134d5565b945050604061379d88828901613600565b93505060606137ae88828901613600565b925050608086013567ffffffffffffffff8111156137cf576137ce614def565b5b6137db88828901613585565b9150509295509295909350565b60008060006060848603121561380157613800614df4565b5b600061380f868287016134d5565b935050602084013567ffffffffffffffff8111156138305761382f614def565b5b61383c86828701613518565b925050604084013567ffffffffffffffff81111561385d5761385c614def565b5b61386986828701613518565b9150509250925092565b6000806000806080858703121561388d5761388c614df4565b5b600061389b878288016134d5565b945050602085013567ffffffffffffffff8111156138bc576138bb614def565b5b6138c887828801613518565b935050604085013567ffffffffffffffff8111156138e9576138e8614def565b5b6138f587828801613518565b925050606085013567ffffffffffffffff81111561391657613915614def565b5b61392287828801613585565b91505092959194509250565b6000806040838503121561394557613944614df4565b5b6000613953858286016134d5565b925050602061396485828601613546565b9150509250929050565b6000806040838503121561398557613984614df4565b5b6000613993858286016134d5565b92505060206139a485828601613600565b9150509250929050565b6000806000606084860312156139c7576139c6614df4565b5b60006139d5868287016134d5565b93505060206139e686828701613600565b92505060406139f786828701613600565b9150509250925092565b60008060408385031215613a1857613a17614df4565b5b600083013567ffffffffffffffff811115613a3657613a35614def565b5b613a42858286016134ea565b925050602083013567ffffffffffffffff811115613a6357613a62614def565b5b613a6f85828601613518565b9150509250929050565b600080600060608486031215613a9257613a91614df4565b5b600084013567ffffffffffffffff811115613ab057613aaf614def565b5b613abc868287016134ea565b935050602084013567ffffffffffffffff811115613add57613adc614def565b5b613ae986828701613518565b925050604084013567ffffffffffffffff811115613b0a57613b09614def565b5b613b1686828701613518565b9150509250925092565b600060208284031215613b3657613b35614df4565b5b6000613b448482850161355b565b91505092915050565b600060208284031215613b6357613b62614df4565b5b6000613b7184828501613570565b91505092915050565b60008060408385031215613b9157613b90614df4565b5b600083013567ffffffffffffffff811115613baf57613bae614def565b5b613bbb858286016135b3565b9250506020613bcc85828601613600565b9150509250929050565b600060208284031215613bec57613beb614df4565b5b600082013567ffffffffffffffff811115613c0a57613c09614def565b5b613c16848285016135e1565b91505092915050565b600060208284031215613c3557613c34614df4565b5b6000613c4384828501613600565b91505092915050565b6000613c58838361415c565b60208301905092915050565b613c6d81614aad565b82525050565b6000613c7e8261497b565b613c8881856149a9565b9350613c938361496b565b8060005b83811015613cc4578151613cab8882613c4c565b9750613cb68361499c565b925050600181019050613c97565b5085935050505092915050565b613cda81614abf565b82525050565b613ce981614acb565b82525050565b613d00613cfb82614acb565b614c26565b82525050565b6000613d1283856149cb565b9350613d1f838584614b38565b82840190509392505050565b6000613d3682614986565b613d4081856149ba565b9350613d50818560208601614b47565b613d5981614df9565b840191505092915050565b6000613d6f82614991565b613d7981856149d6565b9350613d89818560208601614b47565b613d9281614df9565b840191505092915050565b6000613da882614991565b613db281856149e7565b9350613dc2818560208601614b47565b80840191505092915050565b6000613ddb6018836149d6565b9150613de682614e17565b602082019050919050565b6000613dfe6034836149d6565b9150613e0982614e40565b604082019050919050565b6000613e21602f836149d6565b9150613e2c82614e8f565b604082019050919050565b6000613e446028836149d6565b9150613e4f82614ede565b604082019050919050565b6000613e676014836149d6565b9150613e7282614f2d565b602082019050919050565b6000613e8a601f836149d6565b9150613e9582614f56565b602082019050919050565b6000613ead600f836149d6565b9150613eb882614f7f565b602082019050919050565b6000613ed06015836149d6565b9150613edb82614fa8565b602082019050919050565b6000613ef36026836149d6565b9150613efe82614fd1565b604082019050919050565b6000613f166024836149d6565b9150613f2182615020565b604082019050919050565b6000613f396002836149e7565b9150613f448261506f565b600282019050919050565b6000613f5c602a836149d6565b9150613f6782615098565b604082019050919050565b6000613f7f6022836149d6565b9150613f8a826150e7565b604082019050919050565b6000613fa26010836149d6565b9150613fad82615136565b602082019050919050565b6000613fc56025836149d6565b9150613fd08261515f565b604082019050919050565b6000613fe86022836149d6565b9150613ff3826151ae565b604082019050919050565b600061400b6023836149d6565b9150614016826151fd565b604082019050919050565b600061402e602a836149d6565b91506140398261524c565b604082019050919050565b60006140516005836149e7565b915061405c8261529b565b600582019050919050565b60006140746020836149d6565b915061407f826152c4565b602082019050919050565b60006140976028836149d6565b91506140a2826152ed565b604082019050919050565b60006140ba6030836149d6565b91506140c58261533c565b604082019050919050565b60006140dd6029836149d6565b91506140e88261538b565b604082019050919050565b60006141006029836149d6565b915061410b826153da565b604082019050919050565b60006141236028836149d6565b915061412e82615429565b604082019050919050565b60006141466021836149d6565b915061415182615478565b604082019050919050565b61416581614b21565b82525050565b61417481614b21565b82525050565b61418381614b2b565b82525050565b6000614196828486613d06565b91508190509392505050565b60006141ae8285613d9d565b91506141ba8284613d9d565b91506141c582614044565b91508190509392505050565b60006141dc82613f2c565b91506141e88285613cef565b6020820191506141f88284613cef565b6020820191508190509392505050565b600060208201905061421d6000830184613c64565b92915050565b600060a0820190506142386000830188613c64565b6142456020830187613c64565b81810360408301526142578186613c73565b9050818103606083015261426b8185613c73565b9050818103608083015261427f8184613d2b565b90509695505050505050565b600060a0820190506142a06000830188613c64565b6142ad6020830187613c64565b6142ba604083018661416b565b6142c7606083018561416b565b81810360808301526142d98184613d2b565b90509695505050505050565b600060208201905081810360008301526142ff8184613c73565b905092915050565b600060408201905081810360008301526143218185613c73565b905081810360208301526143358184613c73565b90509392505050565b60006020820190506143536000830184613cd1565b92915050565b600060a08201905061436e6000830188613ce0565b61437b6020830187613ce0565b6143886040830186613ce0565b614395606083018561416b565b6143a26080830184613c64565b9695505050505050565b600060e0820190506143c1600083018a613ce0565b6143ce602083018961416b565b6143db604083018861416b565b6143e8606083018761416b565b6143f5608083018661416b565b61440260a0830185613ce0565b61440f60c0830184613c64565b98975050505050505050565b60006080820190506144306000830187613ce0565b61443d602083018661417a565b61444a6040830185613ce0565b6144576060830184613ce0565b95945050505050565b6000602082019050818103600083015261447a8184613d64565b905092915050565b6000602082019050818103600083015261449b81613dce565b9050919050565b600060208201905081810360008301526144bb81613df1565b9050919050565b600060208201905081810360008301526144db81613e14565b9050919050565b600060208201905081810360008301526144fb81613e37565b9050919050565b6000602082019050818103600083015261451b81613e5a565b9050919050565b6000602082019050818103600083015261453b81613e7d565b9050919050565b6000602082019050818103600083015261455b81613ea0565b9050919050565b6000602082019050818103600083015261457b81613ec3565b9050919050565b6000602082019050818103600083015261459b81613ee6565b9050919050565b600060208201905081810360008301526145bb81613f09565b9050919050565b600060208201905081810360008301526145db81613f4f565b9050919050565b600060208201905081810360008301526145fb81613f72565b9050919050565b6000602082019050818103600083015261461b81613f95565b9050919050565b6000602082019050818103600083015261463b81613fb8565b9050919050565b6000602082019050818103600083015261465b81613fdb565b9050919050565b6000602082019050818103600083015261467b81613ffe565b9050919050565b6000602082019050818103600083015261469b81614021565b9050919050565b600060208201905081810360008301526146bb81614067565b9050919050565b600060208201905081810360008301526146db8161408a565b9050919050565b600060208201905081810360008301526146fb816140ad565b9050919050565b6000602082019050818103600083015261471b816140d0565b9050919050565b6000602082019050818103600083015261473b816140f3565b9050919050565b6000602082019050818103600083015261475b81614116565b9050919050565b6000602082019050818103600083015261477b81614139565b9050919050565b6000602082019050614797600083018461416b565b92915050565b60006040820190506147b2600083018561416b565b6147bf602083018461416b565b9392505050565b600080833560016020038436030381126147e3576147e2614ddb565b5b80840192508235915067ffffffffffffffff82111561480557614804614dd1565b5b60208301925060018202360383131561482157614820614de5565b5b509250929050565b6000808335600160200384360303811261484657614845614ddb565b5b80840192508235915067ffffffffffffffff82111561486857614867614dd1565b5b60208301925060018202360383131561488457614883614de5565b5b509250929050565b60006148966148a7565b90506148a28282614bac565b919050565b6000604051905090565b600067ffffffffffffffff8211156148cc576148cb614d7b565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156148f8576148f7614d7b565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561492457614923614d7b565b5b61492d82614df9565b9050602081019050919050565b600067ffffffffffffffff82111561495557614954614d7b565b5b61495e82614df9565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006149fd82614b21565b9150614a0883614b21565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614a3d57614a3c614c90565b5b828201905092915050565b6000614a5382614b21565b9150614a5e83614b21565b925082614a6e57614a6d614cbf565b5b828204905092915050565b6000614a8482614b21565b9150614a8f83614b21565b925082821015614aa257614aa1614c90565b5b828203905092915050565b6000614ab882614b01565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614b65578082015181840152602081019050614b4a565b83811115614b74576000848401525b50505050565b60006002820490506001821680614b9257607f821691505b60208210811415614ba657614ba5614d1d565b5b50919050565b614bb582614df9565b810181811067ffffffffffffffff82111715614bd457614bd3614d7b565b5b80604052505050565b6000614be882614b21565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c1b57614c1a614c90565b5b600182019050919050565b6000819050919050565b6000614c3b82614b21565b9150614c4683614b21565b925082614c5657614c55614cbf565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d1115614dc95760046000803e614dc6600051614e0a565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206e6f7220617070726f7665640000000000000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f57726f6e67207369676e61747572650000000000000000000000000000000000600082015250565b7f4e6f7420656e6f7567682045746865722073656e740000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243313135353a206275726e20616d6f756e74206578636565647320746f7460008201527f616c537570706c79000000000000000000000000000000000000000000000000602082015250565b7f455243313135354d657461646174613a2055524920717565727920666f72206e60008201527f6f6e6578697374656e7420746f6b656e00000000000000000000000000000000602082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600060443d10156154d75761555a565b6154df6148a7565b60043d036004823e80513d602482011167ffffffffffffffff8211171561550757505061555a565b808201805167ffffffffffffffff811115615525575050505061555a565b80602083010160043d03850181111561554257505050505061555a565b61555182602001850186614bac565b82955050505050505b90565b61556681614aad565b811461557157600080fd5b50565b61557d81614abf565b811461558857600080fd5b50565b61559481614ad5565b811461559f57600080fd5b50565b6155ab81614b21565b81146155b657600080fd5b5056fea264697066735822122063a9f6a7d656e2929ba64afbb5a7d11be43cdc83e4876b59292ae4f85bdfc01364736f6c634300080700330000000000000000000000008c4c69feeaa7c178bb56c87e791eb2b964f114c1

Deployed Bytecode

0x6080604052600436106101655760003560e01c80634f558e79116100d15780638da5cb5b1161008a578063e985e9c511610064578063e985e9c514610516578063f242432a14610553578063f2fde38b1461057c578063f5298aca146105a557610165565b80638da5cb5b14610485578063a22cb465146104b0578063bd85b039146104d957610165565b80634f558e79146103895780635c975abb146103c65780636b20c454146103f1578063715018a61461041a5780638456cb591461043157806387e832a91461044857610165565b80631f7fdffa116101235780631f7fdffa146102915780632c4d4d18146102ba5780632eb2c2d6146102e35780633f4ba83a1461030c578063492c5a43146103235780634e1273f41461034c57610165565b8062fdd58e1461016a57806301ffc9a7146101a757806307546172146101e45780630e89341c1461020f57806312644a531461024c57806319fd30da14610268575b600080fd5b34801561017657600080fd5b50610191600480360381019061018c919061396e565b6105ce565b60405161019e9190614782565b60405180910390f35b3480156101b357600080fd5b506101ce60048036038101906101c99190613b20565b610697565b6040516101db919061433e565b60405180910390f35b3480156101f057600080fd5b506101f9610779565b6040516102069190614208565b60405180910390f35b34801561021b57600080fd5b5061023660048036038101906102319190613c1f565b61079f565b6040516102439190614460565b60405180910390f35b61026660048036038101906102619190613bd6565b6108da565b005b34801561027457600080fd5b5061028f600480360381019061028a9190613b7a565b610b00565b005b34801561029d57600080fd5b506102b860048036038101906102b39190613873565b610b34565b005b3480156102c657600080fd5b506102e160048036038101906102dc9190613615565b610b4e565b005b3480156102ef57600080fd5b5061030a60048036038101906103059190613682565b610b9a565b005b34801561031857600080fd5b50610321610c3b565b005b34801561032f57600080fd5b5061034a60048036038101906103459190613a79565b610c4d565b005b34801561035857600080fd5b50610373600480360381019061036e9190613a01565b610ce1565b60405161038091906142e5565b60405180910390f35b34801561039557600080fd5b506103b060048036038101906103ab9190613c1f565b610dfa565b6040516103bd919061433e565b60405180910390f35b3480156103d257600080fd5b506103db610e0e565b6040516103e8919061433e565b60405180910390f35b3480156103fd57600080fd5b50610418600480360381019061041391906137e8565b610e25565b005b34801561042657600080fd5b5061042f610ec2565b005b34801561043d57600080fd5b50610446610ed6565b005b34801561045457600080fd5b5061046f600480360381019061046a9190613bd6565b610ee8565b60405161047c9190614208565b60405180910390f35b34801561049157600080fd5b5061049a610ff9565b6040516104a79190614208565b60405180910390f35b3480156104bc57600080fd5b506104d760048036038101906104d2919061392e565b611023565b005b3480156104e557600080fd5b5061050060048036038101906104fb9190613c1f565b611039565b60405161050d9190614782565b60405180910390f35b34801561052257600080fd5b5061053d60048036038101906105389190613642565b611056565b60405161054a919061433e565b60405180910390f35b34801561055f57600080fd5b5061057a60048036038101906105759190613751565b6110ea565b005b34801561058857600080fd5b506105a3600480360381019061059e9190613615565b61118b565b005b3480156105b157600080fd5b506105cc60048036038101906105c791906139ae565b61120f565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561063f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610636906145c2565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061076257507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107725750610771826112ac565b5b9050919050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606107aa82610dfa565b6107e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e0906146e2565b60405180910390fd5b600060066000848152602001908152602001600020805461080990614b7a565b80601f016020809104026020016040519081016040528092919081815260200182805461083590614b7a565b80156108825780601f1061085757610100808354040283529160200191610882565b820191906000526020600020905b81548152906001019060200180831161086557829003601f168201915b5050505050905060008151116108a757604051806020016040528060008152506108d2565b806108b184611316565b6040516020016108c29291906141a2565b6040516020818303038152906040525b915050919050565b6108e381610ee8565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610972576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096990614542565b60405180910390fd5b80602001353410156109b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b090614562565b60405180910390fd5b60008160400135905081606001356109e78360a00160208101906109dd9190613615565b84600001356105ce565b826109f291906149f2565b1115610a2a57610a188260a0016020810190610a0e9190613615565b83600001356105ce565b8260600135610a279190614a79565b90505b60008111610a3757600080fd5b610a688260a0016020810190610a4d9190613615565b83600001358360405180602001604052806000815250611477565b610ac8828060800190610a7b9190614829565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508360000135611628565b8160600135610aed8360a0016020810190610ae39190613615565b84600001356105ce565b1115610afc57610afb614c61565b5b5050565b610b08611654565b81600660008381526020019081526020016000209080519060200190610b2f9291906132ce565b505050565b610b3c611654565b610b48848484846116d2565b50505050565b610b56611654565b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610ba26118ff565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610be85750610be785610be26118ff565b611056565b5b610c27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1e906144c2565b60405180910390fd5b610c348585858585611907565b5050505050565b610c43611654565b610c4b611c29565b565b610c55611654565b60005b8351811015610cdb57610cca848281518110610c7757610c76614d4c565b5b6020026020010151848381518110610c9257610c91614d4c565b5b6020026020010151848481518110610cad57610cac614d4c565b5b602002602001015160405180602001604052806000815250611477565b80610cd490614bdd565b9050610c58565b50505050565b60608151835114610d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1e90614722565b60405180910390fd5b6000835167ffffffffffffffff811115610d4457610d43614d7b565b5b604051908082528060200260200182016040528015610d725781602001602082028036833780820191505090505b50905060005b8451811015610def57610dbf858281518110610d9757610d96614d4c565b5b6020026020010151858381518110610db257610db1614d4c565b5b60200260200101516105ce565b828281518110610dd257610dd1614d4c565b5b60200260200101818152505080610de890614bdd565b9050610d78565b508091505092915050565b600080610e0683611039565b119050919050565b6000600360149054906101000a900460ff16905090565b610e2d6118ff565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610e735750610e7283610e6d6118ff565b611056565b5b610eb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea9906144c2565b60405180910390fd5b610ebd838383611c8c565b505050565b610eca611654565b610ed46000611f5b565b565b610ede611654565b610ee6612021565b565b600080610f8d7f2a9160260cb569dfe98b35cc97a3914ee9c63525997c549060a463c91bdd23178460000135856020013586604001358760600135888060800190610f339190614829565b604051610f41929190614189565b60405180910390208960a0016020810190610f5c9190613615565b604051602001610f7297969594939291906143ac565b60405160208183030381529060405280519060200120612084565b90506000610fed82858060c00190610fa591906147c6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061209e565b90508092505050919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61103561102e6118ff565b83836120c5565b5050565b600060046000838152602001908152602001600020549050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6110f26118ff565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806111385750611137856111326118ff565b611056565b5b611177576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116e906144c2565b60405180910390fd5b6111848585858585612232565b5050505050565b611193611654565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fa90614582565b60405180910390fd5b61120c81611f5b565b50565b6112176118ff565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061125d575061125c836112576118ff565b611056565b5b61129c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611293906144c2565b60405180910390fd5b6112a78383836124ce565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6060600082141561135e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611472565b600082905060005b6000821461139057808061137990614bdd565b915050600a826113899190614a48565b9150611366565b60008167ffffffffffffffff8111156113ac576113ab614d7b565b5b6040519080825280601f01601f1916602001820160405280156113de5781602001600182028036833780820191505090505b5090505b6000851461146b576001826113f79190614a79565b9150600a856114069190614c30565b603061141291906149f2565b60f81b81838151811061142857611427614d4c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856114649190614a48565b94506113e2565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156114e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114de90614762565b60405180910390fd5b60006114f16118ff565b905060006114fe85612715565b9050600061150b85612715565b905061151c8360008985858961278f565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461157b91906149f2565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516115f992919061479d565b60405180910390a4611610836000898585896127ad565b61161f836000898989896127b5565b50505050505050565b8160066000838152602001908152602001600020908051906020019061164f9291906132ce565b505050565b61165c6118ff565b73ffffffffffffffffffffffffffffffffffffffff1661167a610ff9565b73ffffffffffffffffffffffffffffffffffffffff16146116d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c7906146a2565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611742576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173990614762565b60405180910390fd5b8151835114611786576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177d90614742565b60405180910390fd5b60006117906118ff565b90506117a18160008787878761278f565b60005b845181101561185a578381815181106117c0576117bf614d4c565b5b60200260200101516000808784815181106117de576117dd614d4c565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461184091906149f2565b92505081905550808061185290614bdd565b9150506117a4565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516118d2929190614307565b60405180910390a46118e9816000878787876127ad565b6118f88160008787878761299c565b5050505050565b600033905090565b815183511461194b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194290614742565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156119bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b290614622565b60405180910390fd5b60006119c56118ff565b90506119d581878787878761278f565b60005b8451811015611b865760008582815181106119f6576119f5614d4c565b5b602002602001015190506000858381518110611a1557611a14614d4c565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aad90614682565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b6b91906149f2565b9250508190555050505080611b7f90614bdd565b90506119d8565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611bfd929190614307565b60405180910390a4611c138187878787876127ad565b611c2181878787878761299c565b505050505050565b611c31612b83565b6000600360146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611c756118ff565b604051611c829190614208565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611cfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf390614662565b60405180910390fd5b8051825114611d40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3790614742565b60405180910390fd5b6000611d4a6118ff565b9050611d6a8185600086866040518060200160405280600081525061278f565b60005b8351811015611eb7576000848281518110611d8b57611d8a614d4c565b5b602002602001015190506000848381518110611daa57611da9614d4c565b5b60200260200101519050600080600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611e4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e42906145a2565b60405180910390fd5b81810360008085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050508080611eaf90614bdd565b915050611d6d565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611f2f929190614307565b60405180910390a4611f55818560008686604051806020016040528060008152506127ad565b50505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612029612bcc565b6001600360146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861206d6118ff565b60405161207a9190614208565b60405180910390a1565b6000612097612091612c16565b83612d30565b9050919050565b60008060006120ad8585612d63565b915091506120ba81612db5565b819250505092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212b90614702565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612225919061433e565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156122a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229990614622565b60405180910390fd5b60006122ac6118ff565b905060006122b985612715565b905060006122c685612715565b90506122d683898985858961278f565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508581101561236d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236490614682565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461242291906149f2565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a60405161249f92919061479d565b60405180910390a46124b5848a8a86868a6127ad565b6124c3848a8a8a8a8a6127b5565b505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561253e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253590614662565b60405180910390fd5b60006125486118ff565b9050600061255584612715565b9050600061256284612715565b90506125828387600085856040518060200160405280600081525061278f565b600080600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084811015612619576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612610906145a2565b60405180910390fd5b84810360008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516126e692919061479d565b60405180910390a461270c848860008686604051806020016040528060008152506127ad565b50505050505050565b60606000600167ffffffffffffffff81111561273457612733614d7b565b5b6040519080825280602002602001820160405280156127625781602001602082028036833780820191505090505b509050828160008151811061277a57612779614d4c565b5b60200260200101818152505080915050919050565b612797612bcc565b6127a5868686868686612f8a565b505050505050565b505050505050565b6127d48473ffffffffffffffffffffffffffffffffffffffff1661315c565b15612994578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b815260040161281a95949392919061428b565b602060405180830381600087803b15801561283457600080fd5b505af192505050801561286557506040513d601f19601f820116820180604052508101906128629190613b4d565b60015b61290b57612871614daa565b806308c379a014156128ce57506128866154c7565b8061289157506128d0565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c59190614460565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612902906144a2565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612992576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612989906144e2565b60405180910390fd5b505b505050505050565b6129bb8473ffffffffffffffffffffffffffffffffffffffff1661315c565b15612b7b578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612a01959493929190614223565b602060405180830381600087803b158015612a1b57600080fd5b505af1925050508015612a4c57506040513d601f19601f82011682018060405250810190612a499190613b4d565b60015b612af257612a58614daa565b806308c379a01415612ab55750612a6d6154c7565b80612a785750612ab7565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aac9190614460565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae9906144a2565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b70906144e2565b60405180910390fd5b505b505050505050565b612b8b610e0e565b612bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc190614502565b60405180910390fd5b565b612bd4610e0e565b15612c14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0b90614602565b60405180910390fd5b565b60007f000000000000000000000000fe72ee1975316cac41213ad68f0fbcced35aac3573ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015612c9257507f000000000000000000000000000000000000000000000000000000000000000a46145b15612cbf577f6d7921fe89905a6d4750a4e6ee38dd9f9548c9ee816ed0539adaf236826bbcf19050612d2d565b612d2a7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f9a96ac6c429b646f3a1d68f53bc09336942a2d67d2baf569383390a80b9965d77fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc661317f565b90505b90565b60008282604051602001612d459291906141d1565b60405160208183030381529060405280519060200120905092915050565b600080604183511415612da55760008060006020860151925060408601519150606086015160001a9050612d99878285856131b9565b94509450505050612dae565b60006002915091505b9250929050565b60006004811115612dc957612dc8614cee565b5b816004811115612ddc57612ddb614cee565b5b1415612de757612f87565b60016004811115612dfb57612dfa614cee565b5b816004811115612e0e57612e0d614cee565b5b1415612e4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4690614482565b60405180910390fd5b60026004811115612e6357612e62614cee565b5b816004811115612e7657612e75614cee565b5b1415612eb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eae90614522565b60405180910390fd5b60036004811115612ecb57612eca614cee565b5b816004811115612ede57612edd614cee565b5b1415612f1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f16906145e2565b60405180910390fd5b600480811115612f3257612f31614cee565b5b816004811115612f4557612f44614cee565b5b1415612f86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7d90614642565b60405180910390fd5b5b50565b612f988686868686866132c6565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561304a5760005b835181101561304857828181518110612fec57612feb614d4c565b5b60200260200101516004600086848151811061300b5761300a614d4c565b5b60200260200101518152602001908152602001600020600082825461303091906149f2565b925050819055508061304190614bdd565b9050612fd0565b505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156131545760005b83518110156131525760008482815181106130a05761309f614d4c565b5b6020026020010151905060008483815181106130bf576130be614d4c565b5b6020026020010151905060006004600084815260200190815260200160002054905081811015613124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311b906146c2565b60405180910390fd5b81810360046000858152602001908152602001600020819055505050508061314b90614bdd565b9050613082565b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000838383463060405160200161319a959493929190614359565b6040516020818303038152906040528051906020012090509392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156131f45760006003915091506132bd565b601b8560ff161415801561320c5750601c8560ff1614155b1561321e5760006004915091506132bd565b600060018787878760405160008152602001604052604051613243949392919061441b565b6020604051602081039080840390855afa158015613265573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156132b4576000600192509250506132bd565b80600092509250505b94509492505050565b505050505050565b8280546132da90614b7a565b90600052602060002090601f0160209004810192826132fc5760008555613343565b82601f1061331557805160ff1916838001178555613343565b82800160010185558215613343579182015b82811115613342578251825591602001919060010190613327565b5b5090506133509190613354565b5090565b5b8082111561336d576000816000905550600101613355565b5090565b600061338461337f846148b1565b61488c565b905080838252602082019050828560208602820111156133a7576133a6614de0565b5b60005b858110156133d757816133bd88826134d5565b8452602084019350602083019250506001810190506133aa565b5050509392505050565b60006133f46133ef846148dd565b61488c565b9050808382526020820190508285602086028201111561341757613416614de0565b5b60005b85811015613447578161342d8882613600565b84526020840193506020830192505060018101905061341a565b5050509392505050565b600061346461345f84614909565b61488c565b9050828152602081018484840111156134805761347f614dea565b5b61348b848285614b38565b509392505050565b60006134a66134a18461493a565b61488c565b9050828152602081018484840111156134c2576134c1614dea565b5b6134cd848285614b38565b509392505050565b6000813590506134e48161555d565b92915050565b600082601f8301126134ff576134fe614dcc565b5b813561350f848260208601613371565b91505092915050565b600082601f83011261352d5761352c614dcc565b5b813561353d8482602086016133e1565b91505092915050565b60008135905061355581615574565b92915050565b60008135905061356a8161558b565b92915050565b60008151905061357f8161558b565b92915050565b600082601f83011261359a57613599614dcc565b5b81356135aa848260208601613451565b91505092915050565b600082601f8301126135c8576135c7614dcc565b5b81356135d8848260208601613493565b91505092915050565b600060e082840312156135f7576135f6614dd6565b5b81905092915050565b60008135905061360f816155a2565b92915050565b60006020828403121561362b5761362a614df4565b5b6000613639848285016134d5565b91505092915050565b6000806040838503121561365957613658614df4565b5b6000613667858286016134d5565b9250506020613678858286016134d5565b9150509250929050565b600080600080600060a0868803121561369e5761369d614df4565b5b60006136ac888289016134d5565b95505060206136bd888289016134d5565b945050604086013567ffffffffffffffff8111156136de576136dd614def565b5b6136ea88828901613518565b935050606086013567ffffffffffffffff81111561370b5761370a614def565b5b61371788828901613518565b925050608086013567ffffffffffffffff81111561373857613737614def565b5b61374488828901613585565b9150509295509295909350565b600080600080600060a0868803121561376d5761376c614df4565b5b600061377b888289016134d5565b955050602061378c888289016134d5565b945050604061379d88828901613600565b93505060606137ae88828901613600565b925050608086013567ffffffffffffffff8111156137cf576137ce614def565b5b6137db88828901613585565b9150509295509295909350565b60008060006060848603121561380157613800614df4565b5b600061380f868287016134d5565b935050602084013567ffffffffffffffff8111156138305761382f614def565b5b61383c86828701613518565b925050604084013567ffffffffffffffff81111561385d5761385c614def565b5b61386986828701613518565b9150509250925092565b6000806000806080858703121561388d5761388c614df4565b5b600061389b878288016134d5565b945050602085013567ffffffffffffffff8111156138bc576138bb614def565b5b6138c887828801613518565b935050604085013567ffffffffffffffff8111156138e9576138e8614def565b5b6138f587828801613518565b925050606085013567ffffffffffffffff81111561391657613915614def565b5b61392287828801613585565b91505092959194509250565b6000806040838503121561394557613944614df4565b5b6000613953858286016134d5565b925050602061396485828601613546565b9150509250929050565b6000806040838503121561398557613984614df4565b5b6000613993858286016134d5565b92505060206139a485828601613600565b9150509250929050565b6000806000606084860312156139c7576139c6614df4565b5b60006139d5868287016134d5565b93505060206139e686828701613600565b92505060406139f786828701613600565b9150509250925092565b60008060408385031215613a1857613a17614df4565b5b600083013567ffffffffffffffff811115613a3657613a35614def565b5b613a42858286016134ea565b925050602083013567ffffffffffffffff811115613a6357613a62614def565b5b613a6f85828601613518565b9150509250929050565b600080600060608486031215613a9257613a91614df4565b5b600084013567ffffffffffffffff811115613ab057613aaf614def565b5b613abc868287016134ea565b935050602084013567ffffffffffffffff811115613add57613adc614def565b5b613ae986828701613518565b925050604084013567ffffffffffffffff811115613b0a57613b09614def565b5b613b1686828701613518565b9150509250925092565b600060208284031215613b3657613b35614df4565b5b6000613b448482850161355b565b91505092915050565b600060208284031215613b6357613b62614df4565b5b6000613b7184828501613570565b91505092915050565b60008060408385031215613b9157613b90614df4565b5b600083013567ffffffffffffffff811115613baf57613bae614def565b5b613bbb858286016135b3565b9250506020613bcc85828601613600565b9150509250929050565b600060208284031215613bec57613beb614df4565b5b600082013567ffffffffffffffff811115613c0a57613c09614def565b5b613c16848285016135e1565b91505092915050565b600060208284031215613c3557613c34614df4565b5b6000613c4384828501613600565b91505092915050565b6000613c58838361415c565b60208301905092915050565b613c6d81614aad565b82525050565b6000613c7e8261497b565b613c8881856149a9565b9350613c938361496b565b8060005b83811015613cc4578151613cab8882613c4c565b9750613cb68361499c565b925050600181019050613c97565b5085935050505092915050565b613cda81614abf565b82525050565b613ce981614acb565b82525050565b613d00613cfb82614acb565b614c26565b82525050565b6000613d1283856149cb565b9350613d1f838584614b38565b82840190509392505050565b6000613d3682614986565b613d4081856149ba565b9350613d50818560208601614b47565b613d5981614df9565b840191505092915050565b6000613d6f82614991565b613d7981856149d6565b9350613d89818560208601614b47565b613d9281614df9565b840191505092915050565b6000613da882614991565b613db281856149e7565b9350613dc2818560208601614b47565b80840191505092915050565b6000613ddb6018836149d6565b9150613de682614e17565b602082019050919050565b6000613dfe6034836149d6565b9150613e0982614e40565b604082019050919050565b6000613e21602f836149d6565b9150613e2c82614e8f565b604082019050919050565b6000613e446028836149d6565b9150613e4f82614ede565b604082019050919050565b6000613e676014836149d6565b9150613e7282614f2d565b602082019050919050565b6000613e8a601f836149d6565b9150613e9582614f56565b602082019050919050565b6000613ead600f836149d6565b9150613eb882614f7f565b602082019050919050565b6000613ed06015836149d6565b9150613edb82614fa8565b602082019050919050565b6000613ef36026836149d6565b9150613efe82614fd1565b604082019050919050565b6000613f166024836149d6565b9150613f2182615020565b604082019050919050565b6000613f396002836149e7565b9150613f448261506f565b600282019050919050565b6000613f5c602a836149d6565b9150613f6782615098565b604082019050919050565b6000613f7f6022836149d6565b9150613f8a826150e7565b604082019050919050565b6000613fa26010836149d6565b9150613fad82615136565b602082019050919050565b6000613fc56025836149d6565b9150613fd08261515f565b604082019050919050565b6000613fe86022836149d6565b9150613ff3826151ae565b604082019050919050565b600061400b6023836149d6565b9150614016826151fd565b604082019050919050565b600061402e602a836149d6565b91506140398261524c565b604082019050919050565b60006140516005836149e7565b915061405c8261529b565b600582019050919050565b60006140746020836149d6565b915061407f826152c4565b602082019050919050565b60006140976028836149d6565b91506140a2826152ed565b604082019050919050565b60006140ba6030836149d6565b91506140c58261533c565b604082019050919050565b60006140dd6029836149d6565b91506140e88261538b565b604082019050919050565b60006141006029836149d6565b915061410b826153da565b604082019050919050565b60006141236028836149d6565b915061412e82615429565b604082019050919050565b60006141466021836149d6565b915061415182615478565b604082019050919050565b61416581614b21565b82525050565b61417481614b21565b82525050565b61418381614b2b565b82525050565b6000614196828486613d06565b91508190509392505050565b60006141ae8285613d9d565b91506141ba8284613d9d565b91506141c582614044565b91508190509392505050565b60006141dc82613f2c565b91506141e88285613cef565b6020820191506141f88284613cef565b6020820191508190509392505050565b600060208201905061421d6000830184613c64565b92915050565b600060a0820190506142386000830188613c64565b6142456020830187613c64565b81810360408301526142578186613c73565b9050818103606083015261426b8185613c73565b9050818103608083015261427f8184613d2b565b90509695505050505050565b600060a0820190506142a06000830188613c64565b6142ad6020830187613c64565b6142ba604083018661416b565b6142c7606083018561416b565b81810360808301526142d98184613d2b565b90509695505050505050565b600060208201905081810360008301526142ff8184613c73565b905092915050565b600060408201905081810360008301526143218185613c73565b905081810360208301526143358184613c73565b90509392505050565b60006020820190506143536000830184613cd1565b92915050565b600060a08201905061436e6000830188613ce0565b61437b6020830187613ce0565b6143886040830186613ce0565b614395606083018561416b565b6143a26080830184613c64565b9695505050505050565b600060e0820190506143c1600083018a613ce0565b6143ce602083018961416b565b6143db604083018861416b565b6143e8606083018761416b565b6143f5608083018661416b565b61440260a0830185613ce0565b61440f60c0830184613c64565b98975050505050505050565b60006080820190506144306000830187613ce0565b61443d602083018661417a565b61444a6040830185613ce0565b6144576060830184613ce0565b95945050505050565b6000602082019050818103600083015261447a8184613d64565b905092915050565b6000602082019050818103600083015261449b81613dce565b9050919050565b600060208201905081810360008301526144bb81613df1565b9050919050565b600060208201905081810360008301526144db81613e14565b9050919050565b600060208201905081810360008301526144fb81613e37565b9050919050565b6000602082019050818103600083015261451b81613e5a565b9050919050565b6000602082019050818103600083015261453b81613e7d565b9050919050565b6000602082019050818103600083015261455b81613ea0565b9050919050565b6000602082019050818103600083015261457b81613ec3565b9050919050565b6000602082019050818103600083015261459b81613ee6565b9050919050565b600060208201905081810360008301526145bb81613f09565b9050919050565b600060208201905081810360008301526145db81613f4f565b9050919050565b600060208201905081810360008301526145fb81613f72565b9050919050565b6000602082019050818103600083015261461b81613f95565b9050919050565b6000602082019050818103600083015261463b81613fb8565b9050919050565b6000602082019050818103600083015261465b81613fdb565b9050919050565b6000602082019050818103600083015261467b81613ffe565b9050919050565b6000602082019050818103600083015261469b81614021565b9050919050565b600060208201905081810360008301526146bb81614067565b9050919050565b600060208201905081810360008301526146db8161408a565b9050919050565b600060208201905081810360008301526146fb816140ad565b9050919050565b6000602082019050818103600083015261471b816140d0565b9050919050565b6000602082019050818103600083015261473b816140f3565b9050919050565b6000602082019050818103600083015261475b81614116565b9050919050565b6000602082019050818103600083015261477b81614139565b9050919050565b6000602082019050614797600083018461416b565b92915050565b60006040820190506147b2600083018561416b565b6147bf602083018461416b565b9392505050565b600080833560016020038436030381126147e3576147e2614ddb565b5b80840192508235915067ffffffffffffffff82111561480557614804614dd1565b5b60208301925060018202360383131561482157614820614de5565b5b509250929050565b6000808335600160200384360303811261484657614845614ddb565b5b80840192508235915067ffffffffffffffff82111561486857614867614dd1565b5b60208301925060018202360383131561488457614883614de5565b5b509250929050565b60006148966148a7565b90506148a28282614bac565b919050565b6000604051905090565b600067ffffffffffffffff8211156148cc576148cb614d7b565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156148f8576148f7614d7b565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561492457614923614d7b565b5b61492d82614df9565b9050602081019050919050565b600067ffffffffffffffff82111561495557614954614d7b565b5b61495e82614df9565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006149fd82614b21565b9150614a0883614b21565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614a3d57614a3c614c90565b5b828201905092915050565b6000614a5382614b21565b9150614a5e83614b21565b925082614a6e57614a6d614cbf565b5b828204905092915050565b6000614a8482614b21565b9150614a8f83614b21565b925082821015614aa257614aa1614c90565b5b828203905092915050565b6000614ab882614b01565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614b65578082015181840152602081019050614b4a565b83811115614b74576000848401525b50505050565b60006002820490506001821680614b9257607f821691505b60208210811415614ba657614ba5614d1d565b5b50919050565b614bb582614df9565b810181811067ffffffffffffffff82111715614bd457614bd3614d7b565b5b80604052505050565b6000614be882614b21565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c1b57614c1a614c90565b5b600182019050919050565b6000819050919050565b6000614c3b82614b21565b9150614c4683614b21565b925082614c5657614c55614cbf565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d1115614dc95760046000803e614dc6600051614e0a565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206e6f7220617070726f7665640000000000000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f57726f6e67207369676e61747572650000000000000000000000000000000000600082015250565b7f4e6f7420656e6f7567682045746865722073656e740000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243313135353a206275726e20616d6f756e74206578636565647320746f7460008201527f616c537570706c79000000000000000000000000000000000000000000000000602082015250565b7f455243313135354d657461646174613a2055524920717565727920666f72206e60008201527f6f6e6578697374656e7420746f6b656e00000000000000000000000000000000602082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600060443d10156154d75761555a565b6154df6148a7565b60043d036004823e80513d602482011167ffffffffffffffff8211171561550757505061555a565b808201805167ffffffffffffffff811115615525575050505061555a565b80602083010160043d03850181111561554257505050505061555a565b61555182602001850186614bac565b82955050505050505b90565b61556681614aad565b811461557157600080fd5b50565b61557d81614abf565b811461558857600080fd5b50565b61559481614ad5565b811461559f57600080fd5b50565b6155ab81614b21565b81146155b657600080fd5b5056fea264697066735822122063a9f6a7d656e2929ba64afbb5a7d11be43cdc83e4876b59292ae4f85bdfc01364736f6c63430008070033

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

0000000000000000000000008c4c69feeaa7c178bb56c87e791eb2b964f114c1

-----Decoded View---------------
Arg [0] : _signer (address): 0x8c4C69feeAa7C178Bb56c87E791EB2b964F114c1

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000008c4c69feeaa7c178bb56c87e791eb2b964f114c1


Deployed Bytecode Sourcemap

61298:3593:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42458:230;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41481:310;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61559:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64541:340;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63052:703;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62785:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63763:191;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62568:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44402:439;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62979:65;;;;;;;;;;;;;:::i;:::-;;63962:249;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42854:524;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58942:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18697:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60864:359;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21568:103;;;;;;;;;;;;;:::i;:::-;;62910:61;;;;;;;;;;;;;:::i;:::-;;61980:580;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20920:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43451:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58731:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43678:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43918:407;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21826:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60529:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42458:230;42544:7;42591:1;42572:21;;:7;:21;;;;42564:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;42658:9;:13;42668:2;42658:13;;;;;;;;;;;:22;42672:7;42658:22;;;;;;;;;;;;;;;;42651:29;;42458:230;;;;:::o;41481:310::-;41583:4;41635:26;41620:41;;;:11;:41;;;;:110;;;;41693:37;41678:52;;;:11;:52;;;;41620:110;:163;;;;41747:36;41771:11;41747:23;:36::i;:::-;41620:163;41600:183;;41481:310;;;:::o;61559:21::-;;;;;;;;;;;;;:::o;64541:340::-;64609:13;64643:15;64650:7;64643:6;:15::i;:::-;64635:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;64724:21;64748:4;:13;64753:7;64748:13;;;;;;;;;;;64724:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64803:1;64785:7;64779:21;:25;:94;;;;;;;;;;;;;;;;;64831:7;64840:18;:7;:16;:18::i;:::-;64814:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64779:94;64772:101;;;64541:340;;;:::o;63052:703::-;63167:16;63175:7;63167;:16::i;:::-;63157:26;;:6;;;;;;;;;;;:26;;;63149:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;63235:7;:13;;;63222:9;:26;;63214:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;63285:18;63306:7;:14;;;63285:35;;63390:7;:17;;;63347:40;63357:7;:13;;;;;;;;;;:::i;:::-;63371:7;:15;;;63347:9;:40::i;:::-;63334:10;:53;;;;:::i;:::-;:73;63331:177;;;63456:40;63466:7;:13;;;;;;;;;;:::i;:::-;63480:7;:15;;;63456:9;:40::i;:::-;63436:7;:17;;;:60;;;;:::i;:::-;63423:73;;63331:177;63541:1;63528:10;:14;63520:23;;;;;;63564:53;63570:7;:13;;;;;;;;;;:::i;:::-;63585:7;:15;;;63602:10;63564:53;;;;;;;;;;;;:5;:53::i;:::-;63628:37;63636:7;:11;;;;;;;;:::i;:::-;63628:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63649:7;:15;;;63628:7;:37::i;:::-;63729:7;:17;;;63685:40;63695:7;:13;;;;;;;;;;:::i;:::-;63709:7;:15;;;63685:9;:40::i;:::-;:61;;63678:69;;;;:::i;:::-;;63138:617;63052:703;:::o;62785:117::-;20806:13;:11;:13::i;:::-;62888:6:::1;62872:4;:13;62877:7;62872:13;;;;;;;;;;;:22;;;;;;;;;;;;:::i;:::-;;62785:117:::0;;:::o;63763:191::-;20806:13;:11;:13::i;:::-;63912:34:::1;63923:2;63927:3;63932:7;63941:4;63912:10;:34::i;:::-;63763:191:::0;;;;:::o;62568:95::-;20806:13;:11;:13::i;:::-;62646:9:::1;62637:6;;:18;;;;;;;;;;;;;;;;;;62568:95:::0;:::o;44402:439::-;44643:12;:10;:12::i;:::-;44635:20;;:4;:20;;;:60;;;;44659:36;44676:4;44682:12;:10;:12::i;:::-;44659:16;:36::i;:::-;44635:60;44613:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;44781:52;44804:4;44810:2;44814:3;44819:7;44828:4;44781:22;:52::i;:::-;44402:439;;;;;:::o;62979:65::-;20806:13;:11;:13::i;:::-;63026:10:::1;:8;:10::i;:::-;62979:65::o:0;63962:249::-;20806:13;:11;:13::i;:::-;64102:9:::1;64097:107;64121:3;:10;64117:1;:14;64097:107;;;64153:39;64159:3;64163:1;64159:6;;;;;;;;:::i;:::-;;;;;;;;64167:4;64172:1;64167:7;;;;;;;;:::i;:::-;;;;;;;;64176:8;64185:1;64176:11;;;;;;;;:::i;:::-;;;;;;;;64153:39;;;;;;;;;;;::::0;:5:::1;:39::i;:::-;64133:3;;;;:::i;:::-;;;64097:107;;;;63962:249:::0;;;:::o;42854:524::-;43010:16;43071:3;:10;43052:8;:15;:29;43044:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;43140:30;43187:8;:15;43173:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43140:63;;43221:9;43216:122;43240:8;:15;43236:1;:19;43216:122;;;43296:30;43306:8;43315:1;43306:11;;;;;;;;:::i;:::-;;;;;;;;43319:3;43323:1;43319:6;;;;;;;;:::i;:::-;;;;;;;;43296:9;:30::i;:::-;43277:13;43291:1;43277:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;43257:3;;;;:::i;:::-;;;43216:122;;;;43357:13;43350:20;;;42854:524;;;;:::o;58942:122::-;58999:4;59055:1;59023:29;59049:2;59023:25;:29::i;:::-;:33;59016:40;;58942:122;;;:::o;18697:86::-;18744:4;18768:7;;;;;;;;;;;18761:14;;18697:86;:::o;60864:359::-;61040:12;:10;:12::i;:::-;61029:23;;:7;:23;;;:66;;;;61056:39;61073:7;61082:12;:10;:12::i;:::-;61056:16;:39::i;:::-;61029:66;61007:163;;;;;;;;;;;;:::i;:::-;;;;;;;;;61183:32;61194:7;61203:3;61208:6;61183:10;:32::i;:::-;60864:359;;;:::o;21568:103::-;20806:13;:11;:13::i;:::-;21633:30:::1;21660:1;21633:18;:30::i;:::-;21568:103::o:0;62910:61::-;20806:13;:11;:13::i;:::-;62955:8:::1;:6;:8::i;:::-;62910:61::o:0;61980:580::-;62051:7;62071:14;62088:372;62140:116;62271:7;:15;;;62301:7;:13;;;62329:7;:14;;;62358:7;:17;;;62406:7;:11;;;;;;;;:::i;:::-;62390:29;;;;;;;:::i;:::-;;;;;;;;62434:7;:13;;;;;;;;;;:::i;:::-;62115:343;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62105:354;;;;;;62088:16;:372::i;:::-;62071:389;;62471:14;62488:40;62502:6;62510:7;:17;;;;;;;;:::i;:::-;62488:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;:40::i;:::-;62471:57;;62546:6;62539:13;;;;61980:580;;;:::o;20920:87::-;20966:7;20993:6;;;;;;;;;;;20986:13;;20920:87;:::o;43451:155::-;43546:52;43565:12;:10;:12::i;:::-;43579:8;43589;43546:18;:52::i;:::-;43451:155;;:::o;58731:113::-;58793:7;58820:12;:16;58833:2;58820:16;;;;;;;;;;;;58813:23;;58731:113;;;:::o;43678:168::-;43777:4;43801:18;:27;43820:7;43801:27;;;;;;;;;;;;;;;:37;43829:8;43801:37;;;;;;;;;;;;;;;;;;;;;;;;;43794:44;;43678:168;;;;:::o;43918:407::-;44134:12;:10;:12::i;:::-;44126:20;;:4;:20;;;:60;;;;44150:36;44167:4;44173:12;:10;:12::i;:::-;44150:16;:36::i;:::-;44126:60;44104:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;44272:45;44290:4;44296:2;44300;44304:6;44312:4;44272:17;:45::i;:::-;43918:407;;;;;:::o;21826:201::-;20806:13;:11;:13::i;:::-;21935:1:::1;21915:22;;:8;:22;;;;21907:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21991:28;22010:8;21991:18;:28::i;:::-;21826:201:::0;:::o;60529:327::-;60680:12;:10;:12::i;:::-;60669:23;;:7;:23;;;:66;;;;60696:39;60713:7;60722:12;:10;:12::i;:::-;60696:16;:39::i;:::-;60669:66;60647:163;;;;;;;;;;;;:::i;:::-;;;;;;;;;60823:25;60829:7;60838:2;60842:5;60823;:25::i;:::-;60529:327;;;:::o;32738:157::-;32823:4;32862:25;32847:40;;;:11;:40;;;;32840:47;;32738:157;;;:::o;436:723::-;492:13;722:1;713:5;:10;709:53;;;740:10;;;;;;;;;;;;;;;;;;;;;709:53;772:12;787:5;772:20;;803:14;828:78;843:1;835:4;:9;828:78;;861:8;;;;;:::i;:::-;;;;892:2;884:10;;;;;:::i;:::-;;;828:78;;;916:19;948:6;938:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;916:39;;966:154;982:1;973:5;:10;966:154;;1010:1;1000:11;;;;;:::i;:::-;;;1077:2;1069:5;:10;;;;:::i;:::-;1056:2;:24;;;;:::i;:::-;1043:39;;1026:6;1033;1026:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1106:2;1097:11;;;;;:::i;:::-;;;966:154;;;1144:6;1130:21;;;;;436:723;;;;:::o;49101:729::-;49268:1;49254:16;;:2;:16;;;;49246:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;49321:16;49340:12;:10;:12::i;:::-;49321:31;;49363:20;49386:21;49404:2;49386:17;:21::i;:::-;49363:44;;49418:24;49445:25;49463:6;49445:17;:25::i;:::-;49418:52;;49483:66;49504:8;49522:1;49526:2;49530:3;49535:7;49544:4;49483:20;:66::i;:::-;49583:6;49562:9;:13;49572:2;49562:13;;;;;;;;;;;:17;49576:2;49562:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;49642:2;49605:52;;49638:1;49605:52;;49620:8;49605:52;;;49646:2;49650:6;49605:52;;;;;;;:::i;:::-;;;;;;;;49670:65;49690:8;49708:1;49712:2;49716:3;49721:7;49730:4;49670:19;:65::i;:::-;49748:74;49779:8;49797:1;49801:2;49805;49809:6;49817:4;49748:30;:74::i;:::-;49235:595;;;49101:729;;;;:::o;62671:106::-;62763:6;62747:4;:13;62752:7;62747:13;;;;;;;;;;;:22;;;;;;;;;;;;:::i;:::-;;62671:106;;:::o;21085:132::-;21160:12;:10;:12::i;:::-;21149:23;;:7;:5;:7::i;:::-;:23;;;21141:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21085:132::o;50233:813::-;50425:1;50411:16;;:2;:16;;;;50403:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;50498:7;:14;50484:3;:10;:28;50476:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;50570:16;50589:12;:10;:12::i;:::-;50570:31;;50614:66;50635:8;50653:1;50657:2;50661:3;50666:7;50675:4;50614:20;:66::i;:::-;50698:9;50693:103;50717:3;:10;50713:1;:14;50693:103;;;50774:7;50782:1;50774:10;;;;;;;;:::i;:::-;;;;;;;;50749:9;:17;50759:3;50763:1;50759:6;;;;;;;;:::i;:::-;;;;;;;;50749:17;;;;;;;;;;;:21;50767:2;50749:21;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;50729:3;;;;;:::i;:::-;;;;50693:103;;;;50849:2;50813:53;;50845:1;50813:53;;50827:8;50813:53;;;50853:3;50858:7;50813:53;;;;;;;:::i;:::-;;;;;;;;50879:65;50899:8;50917:1;50921:2;50925:3;50930:7;50939:4;50879:19;:65::i;:::-;50957:81;50993:8;51011:1;51015:2;51019:3;51024:7;51033:4;50957:35;:81::i;:::-;50392:654;50233:813;;;;:::o;16804:98::-;16857:7;16884:10;16877:17;;16804:98;:::o;46637:1146::-;46864:7;:14;46850:3;:10;:28;46842:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;46956:1;46942:16;;:2;:16;;;;46934:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;47013:16;47032:12;:10;:12::i;:::-;47013:31;;47057:60;47078:8;47088:4;47094:2;47098:3;47103:7;47112:4;47057:20;:60::i;:::-;47135:9;47130:421;47154:3;:10;47150:1;:14;47130:421;;;47186:10;47199:3;47203:1;47199:6;;;;;;;;:::i;:::-;;;;;;;;47186:19;;47220:14;47237:7;47245:1;47237:10;;;;;;;;:::i;:::-;;;;;;;;47220:27;;47264:19;47286:9;:13;47296:2;47286:13;;;;;;;;;;;:19;47300:4;47286:19;;;;;;;;;;;;;;;;47264:41;;47343:6;47328:11;:21;;47320:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;47476:6;47462:11;:20;47440:9;:13;47450:2;47440:13;;;;;;;;;;;:19;47454:4;47440:19;;;;;;;;;;;;;;;:42;;;;47533:6;47512:9;:13;47522:2;47512:13;;;;;;;;;;;:17;47526:2;47512:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;47171:380;;;47166:3;;;;:::i;:::-;;;47130:421;;;;47598:2;47568:47;;47592:4;47568:47;;47582:8;47568:47;;;47602:3;47607:7;47568:47;;;;;;;:::i;:::-;;;;;;;;47628:59;47648:8;47658:4;47664:2;47668:3;47673:7;47682:4;47628:19;:59::i;:::-;47700:75;47736:8;47746:4;47752:2;47756:3;47761:7;47770:4;47700:35;:75::i;:::-;46831:952;46637:1146;;;;;:::o;19552:120::-;18561:16;:14;:16::i;:::-;19621:5:::1;19611:7;;:15;;;;;;;;;;;;;;;;;;19642:22;19651:12;:10;:12::i;:::-;19642:22;;;;;;:::i;:::-;;;;;;;;19552:120::o:0;52402:969::-;52570:1;52554:18;;:4;:18;;;;52546:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;52645:7;:14;52631:3;:10;:28;52623:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;52717:16;52736:12;:10;:12::i;:::-;52717:31;;52761:66;52782:8;52792:4;52806:1;52810:3;52815:7;52761:66;;;;;;;;;;;;:20;:66::i;:::-;52845:9;52840:373;52864:3;:10;52860:1;:14;52840:373;;;52896:10;52909:3;52913:1;52909:6;;;;;;;;:::i;:::-;;;;;;;;52896:19;;52930:14;52947:7;52955:1;52947:10;;;;;;;;:::i;:::-;;;;;;;;52930:27;;52974:19;52996:9;:13;53006:2;52996:13;;;;;;;;;;;:19;53010:4;52996:19;;;;;;;;;;;;;;;;52974:41;;53053:6;53038:11;:21;;53030:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;53180:6;53166:11;:20;53144:9;:13;53154:2;53144:13;;;;;;;;;;;:19;53158:4;53144:19;;;;;;;;;;;;;;;:42;;;;52881:332;;;52876:3;;;;;:::i;:::-;;;;52840:373;;;;53268:1;53230:55;;53254:4;53230:55;;53244:8;53230:55;;;53272:3;53277:7;53230:55;;;;;;;:::i;:::-;;;;;;;;53298:65;53318:8;53328:4;53342:1;53346:3;53351:7;53298:65;;;;;;;;;;;;:19;:65::i;:::-;52535:836;52402:969;;;:::o;22187:191::-;22261:16;22280:6;;;;;;;;;;;22261:25;;22306:8;22297:6;;:17;;;;;;;;;;;;;;;;;;22361:8;22330:40;;22351:8;22330:40;;;;;;;;;;;;22250:128;22187:191;:::o;19293:118::-;18302:19;:17;:19::i;:::-;19363:4:::1;19353:7;;:14;;;;;;;;;;;;;;;;;;19383:20;19390:12;:10;:12::i;:::-;19383:20;;;;;;:::i;:::-;;;;;;;;19293:118::o:0;15945:167::-;16022:7;16049:55;16071:20;:18;:20::i;:::-;16093:10;16049:21;:55::i;:::-;16042:62;;15945:167;;;:::o;6365:231::-;6443:7;6464:17;6483:18;6505:27;6516:4;6522:9;6505:10;:27::i;:::-;6463:69;;;;6543:18;6555:5;6543:11;:18::i;:::-;6579:9;6572:16;;;;6365:231;;;;:::o;53514:331::-;53669:8;53660:17;;:5;:17;;;;53652:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;53772:8;53734:18;:25;53753:5;53734:25;;;;;;;;;;;;;;;:35;53760:8;53734:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;53818:8;53796:41;;53811:5;53796:41;;;53828:8;53796:41;;;;;;:::i;:::-;;;;;;;;53514:331;;;:::o;45305:974::-;45507:1;45493:16;;:2;:16;;;;45485:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;45564:16;45583:12;:10;:12::i;:::-;45564:31;;45606:20;45629:21;45647:2;45629:17;:21::i;:::-;45606:44;;45661:24;45688:25;45706:6;45688:17;:25::i;:::-;45661:52;;45726:60;45747:8;45757:4;45763:2;45767:3;45772:7;45781:4;45726:20;:60::i;:::-;45799:19;45821:9;:13;45831:2;45821:13;;;;;;;;;;;:19;45835:4;45821:19;;;;;;;;;;;;;;;;45799:41;;45874:6;45859:11;:21;;45851:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;45999:6;45985:11;:20;45963:9;:13;45973:2;45963:13;;;;;;;;;;;:19;45977:4;45963:19;;;;;;;;;;;;;;;:42;;;;46048:6;46027:9;:13;46037:2;46027:13;;;;;;;;;;;:17;46041:2;46027:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;46103:2;46072:46;;46097:4;46072:46;;46087:8;46072:46;;;46107:2;46111:6;46072:46;;;;;;;:::i;:::-;;;;;;;;46131:59;46151:8;46161:4;46167:2;46171:3;46176:7;46185:4;46131:19;:59::i;:::-;46203:68;46234:8;46244:4;46250:2;46254;46258:6;46266:4;46203:30;:68::i;:::-;45474:805;;;;45305:974;;;;;:::o;51344:808::-;51487:1;51471:18;;:4;:18;;;;51463:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;51542:16;51561:12;:10;:12::i;:::-;51542:31;;51584:20;51607:21;51625:2;51607:17;:21::i;:::-;51584:44;;51639:24;51666:25;51684:6;51666:17;:25::i;:::-;51639:52;;51704:66;51725:8;51735:4;51749:1;51753:3;51758:7;51704:66;;;;;;;;;;;;:20;:66::i;:::-;51783:19;51805:9;:13;51815:2;51805:13;;;;;;;;;;;:19;51819:4;51805:19;;;;;;;;;;;;;;;;51783:41;;51858:6;51843:11;:21;;51835:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;51977:6;51963:11;:20;51941:9;:13;51951:2;51941:13;;;;;;;;;;;:19;51955:4;51941:19;;;;;;;;;;;;;;;:42;;;;52051:1;52012:54;;52037:4;52012:54;;52027:8;52012:54;;;52055:2;52059:6;52012:54;;;;;;;:::i;:::-;;;;;;;;52079:65;52099:8;52109:4;52123:1;52127:3;52132:7;52079:65;;;;;;;;;;;;:19;:65::i;:::-;51452:700;;;;51344:808;;;:::o;57780:198::-;57846:16;57875:22;57914:1;57900:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57875:41;;57938:7;57927:5;57933:1;57927:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;57965:5;57958:12;;;57780:198;;;:::o;64219:314::-;18302:19;:17;:19::i;:::-;64459:66:::1;64486:8;64496:4;64502:2;64506:3;64511:7;64520:4;64459:26;:66::i;:::-;64219:314:::0;;;;;;:::o;55979:220::-;;;;;;;:::o;56207:744::-;56422:15;:2;:13;;;:15::i;:::-;56418:526;;;56475:2;56458:38;;;56497:8;56507:4;56513:2;56517:6;56525:4;56458:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;56454:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;56806:6;56799:14;;;;;;;;;;;:::i;:::-;;;;;;;;56454:479;;;56855:62;;;;;;;;;;:::i;:::-;;;;;;;;56454:479;56592:43;;;56580:55;;;:8;:55;;;;56576:154;;56660:50;;;;;;;;;;:::i;:::-;;;;;;;;56576:154;56531:214;56418:526;56207:744;;;;;;:::o;56959:813::-;57199:15;:2;:13;;;:15::i;:::-;57195:570;;;57252:2;57235:43;;;57279:8;57289:4;57295:3;57300:7;57309:4;57235:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;57231:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;57627:6;57620:14;;;;;;;;;;;:::i;:::-;;;;;;;;57231:523;;;57676:62;;;;;;;;;;:::i;:::-;;;;;;;;57231:523;57408:48;;;57396:60;;;:8;:60;;;;57392:159;;57481:50;;;;;;;;;;:::i;:::-;;;;;;;;57392:159;57315:251;57195:570;56959:813;;;;;;:::o;19041:108::-;19108:8;:6;:8::i;:::-;19100:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;19041:108::o;18856:::-;18927:8;:6;:8::i;:::-;18926:9;18918:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;18856:108::o;14718:314::-;14771:7;14812:12;14795:29;;14803:4;14795:29;;;:66;;;;;14845:16;14828:13;:33;14795:66;14791:234;;;14885:24;14878:31;;;;14791:234;14949:64;14971:10;14983:12;14997:15;14949:21;:64::i;:::-;14942:71;;14718:314;;:::o;11279:196::-;11372:7;11438:15;11455:10;11409:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;11399:68;;;;;;11392:75;;11279:196;;;;:::o;4816:747::-;4897:7;4906:12;4955:2;4935:9;:16;:22;4931:625;;;4974:9;4998;5022:7;5279:4;5268:9;5264:20;5258:27;5253:32;;5329:4;5318:9;5314:20;5308:27;5303:32;;5387:4;5376:9;5372:20;5366:27;5363:1;5358:36;5353:41;;5430:25;5441:4;5447:1;5450;5453;5430:10;:25::i;:::-;5423:32;;;;;;;;;4931:625;5504:1;5508:35;5488:56;;;;4816:747;;;;;;:::o;3087:643::-;3165:20;3156:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;3152:571;;;3202:7;;3152:571;3263:29;3254:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;3250:473;;;3309:34;;;;;;;;;;:::i;:::-;;;;;;;;3250:473;3374:35;3365:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;3361:362;;;3426:41;;;;;;;;;;:::i;:::-;;;;;;;;3361:362;3498:30;3489:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;3485:238;;;3545:44;;;;;;;;;;:::i;:::-;;;;;;;;3485:238;3620:30;3611:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;3607:116;;;3667:44;;;;;;;;;;:::i;:::-;;;;;;;;3607:116;3087:643;;:::o;59139:931::-;59378:66;59405:8;59415:4;59421:2;59425:3;59430:7;59439:4;59378:26;:66::i;:::-;59477:1;59461:18;;:4;:18;;;59457:160;;;59501:9;59496:110;59520:3;:10;59516:1;:14;59496:110;;;59580:7;59588:1;59580:10;;;;;;;;:::i;:::-;;;;;;;;59556:12;:20;59569:3;59573:1;59569:6;;;;;;;;:::i;:::-;;;;;;;;59556:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;59532:3;;;;:::i;:::-;;;59496:110;;;;59457:160;59647:1;59633:16;;:2;:16;;;59629:434;;;59671:9;59666:386;59690:3;:10;59686:1;:14;59666:386;;;59726:10;59739:3;59743:1;59739:6;;;;;;;;:::i;:::-;;;;;;;;59726:19;;59764:14;59781:7;59789:1;59781:10;;;;;;;;:::i;:::-;;;;;;;;59764:27;;59810:14;59827:12;:16;59840:2;59827:16;;;;;;;;;;;;59810:33;;59880:6;59870;:16;;59862:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;60011:6;60002;:15;59983:12;:16;59996:2;59983:16;;;;;;;;;;;:34;;;;59707:345;;;59702:3;;;;:::i;:::-;;;59666:386;;;;59629:434;59139:931;;;;;;:::o;23624:326::-;23684:4;23941:1;23919:7;:19;;;:23;23912:30;;23624:326;;;:::o;15040:263::-;15184:7;15232:8;15242;15252:11;15265:13;15288:4;15221:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;15211:84;;;;;;15204:91;;15040:263;;;;;:::o;7817:1632::-;7948:7;7957:12;8882:66;8877:1;8869:10;;:79;8865:163;;;8981:1;8985:30;8965:51;;;;;;8865:163;9047:2;9042:1;:7;;;;:18;;;;;9058:2;9053:1;:7;;;;9042:18;9038:102;;;9093:1;9097:30;9077:51;;;;;;9038:102;9237:14;9254:24;9264:4;9270:1;9273;9276;9254:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9237:41;;9311:1;9293:20;;:6;:20;;;9289:103;;;9346:1;9350:29;9330:50;;;;;;;9289:103;9412:6;9420:20;9404:37;;;;;7817:1632;;;;;;;;:::o;54803:221::-;;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:412::-;1991:5;2016:66;2032:49;2074:6;2032:49;:::i;:::-;2016:66;:::i;:::-;2007:75;;2105:6;2098:5;2091:21;2143:4;2136:5;2132:16;2181:3;2172:6;2167:3;2163:16;2160:25;2157:112;;;2188:79;;:::i;:::-;2157:112;2278:41;2312:6;2307:3;2302;2278:41;:::i;:::-;1997:328;1913:412;;;;;:::o;2331:139::-;2377:5;2415:6;2402:20;2393:29;;2431:33;2458:5;2431:33;:::i;:::-;2331:139;;;;:::o;2493:370::-;2564:5;2613:3;2606:4;2598:6;2594:17;2590:27;2580:122;;2621:79;;:::i;:::-;2580:122;2738:6;2725:20;2763:94;2853:3;2845:6;2838:4;2830:6;2826:17;2763:94;:::i;:::-;2754:103;;2570:293;2493:370;;;;:::o;2886:::-;2957:5;3006:3;2999:4;2991:6;2987:17;2983:27;2973:122;;3014:79;;:::i;:::-;2973:122;3131:6;3118:20;3156:94;3246:3;3238:6;3231:4;3223:6;3219:17;3156:94;:::i;:::-;3147:103;;2963:293;2886:370;;;;:::o;3262:133::-;3305:5;3343:6;3330:20;3321:29;;3359:30;3383:5;3359:30;:::i;:::-;3262:133;;;;:::o;3401:137::-;3446:5;3484:6;3471:20;3462:29;;3500:32;3526:5;3500:32;:::i;:::-;3401:137;;;;:::o;3544:141::-;3600:5;3631:6;3625:13;3616:22;;3647:32;3673:5;3647:32;:::i;:::-;3544:141;;;;:::o;3704:338::-;3759:5;3808:3;3801:4;3793:6;3789:17;3785:27;3775:122;;3816:79;;:::i;:::-;3775:122;3933:6;3920:20;3958:78;4032:3;4024:6;4017:4;4009:6;4005:17;3958:78;:::i;:::-;3949:87;;3765:277;3704:338;;;;:::o;4062:340::-;4118:5;4167:3;4160:4;4152:6;4148:17;4144:27;4134:122;;4175:79;;:::i;:::-;4134:122;4292:6;4279:20;4317:79;4392:3;4384:6;4377:4;4369:6;4365:17;4317:79;:::i;:::-;4308:88;;4124:278;4062:340;;;;:::o;4454:239::-;4534:5;4575:3;4566:6;4561:3;4557:16;4553:26;4550:113;;;4582:79;;:::i;:::-;4550:113;4681:6;4672:15;;4454:239;;;;:::o;4699:139::-;4745:5;4783:6;4770:20;4761:29;;4799:33;4826:5;4799:33;:::i;:::-;4699:139;;;;:::o;4844:329::-;4903:6;4952:2;4940:9;4931:7;4927:23;4923:32;4920:119;;;4958:79;;:::i;:::-;4920:119;5078:1;5103:53;5148:7;5139:6;5128:9;5124:22;5103:53;:::i;:::-;5093:63;;5049:117;4844:329;;;;:::o;5179:474::-;5247:6;5255;5304:2;5292:9;5283:7;5279:23;5275:32;5272:119;;;5310:79;;:::i;:::-;5272:119;5430:1;5455:53;5500:7;5491:6;5480:9;5476:22;5455:53;:::i;:::-;5445:63;;5401:117;5557:2;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5528:118;5179:474;;;;;:::o;5659:1509::-;5813:6;5821;5829;5837;5845;5894:3;5882:9;5873:7;5869:23;5865:33;5862:120;;;5901:79;;:::i;:::-;5862:120;6021:1;6046:53;6091:7;6082:6;6071:9;6067:22;6046:53;:::i;:::-;6036:63;;5992:117;6148:2;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6119:118;6304:2;6293:9;6289:18;6276:32;6335:18;6327:6;6324:30;6321:117;;;6357:79;;:::i;:::-;6321:117;6462:78;6532:7;6523:6;6512:9;6508:22;6462:78;:::i;:::-;6452:88;;6247:303;6617:2;6606:9;6602:18;6589:32;6648:18;6640:6;6637:30;6634:117;;;6670:79;;:::i;:::-;6634:117;6775:78;6845:7;6836:6;6825:9;6821:22;6775:78;:::i;:::-;6765:88;;6560:303;6930:3;6919:9;6915:19;6902:33;6962:18;6954:6;6951:30;6948:117;;;6984:79;;:::i;:::-;6948:117;7089:62;7143:7;7134:6;7123:9;7119:22;7089:62;:::i;:::-;7079:72;;6873:288;5659:1509;;;;;;;;:::o;7174:1089::-;7278:6;7286;7294;7302;7310;7359:3;7347:9;7338:7;7334:23;7330:33;7327:120;;;7366:79;;:::i;:::-;7327:120;7486:1;7511:53;7556:7;7547:6;7536:9;7532:22;7511:53;:::i;:::-;7501:63;;7457:117;7613:2;7639:53;7684:7;7675:6;7664:9;7660:22;7639:53;:::i;:::-;7629:63;;7584:118;7741:2;7767:53;7812:7;7803:6;7792:9;7788:22;7767:53;:::i;:::-;7757:63;;7712:118;7869:2;7895:53;7940:7;7931:6;7920:9;7916:22;7895:53;:::i;:::-;7885:63;;7840:118;8025:3;8014:9;8010:19;7997:33;8057:18;8049:6;8046:30;8043:117;;;8079:79;;:::i;:::-;8043:117;8184:62;8238:7;8229:6;8218:9;8214:22;8184:62;:::i;:::-;8174:72;;7968:288;7174:1089;;;;;;;;:::o;8269:1039::-;8396:6;8404;8412;8461:2;8449:9;8440:7;8436:23;8432:32;8429:119;;;8467:79;;:::i;:::-;8429:119;8587:1;8612:53;8657:7;8648:6;8637:9;8633:22;8612:53;:::i;:::-;8602:63;;8558:117;8742:2;8731:9;8727:18;8714:32;8773:18;8765:6;8762:30;8759:117;;;8795:79;;:::i;:::-;8759:117;8900:78;8970:7;8961:6;8950:9;8946:22;8900:78;:::i;:::-;8890:88;;8685:303;9055:2;9044:9;9040:18;9027:32;9086:18;9078:6;9075:30;9072:117;;;9108:79;;:::i;:::-;9072:117;9213:78;9283:7;9274:6;9263:9;9259:22;9213:78;:::i;:::-;9203:88;;8998:303;8269:1039;;;;;:::o;9314:1363::-;9459:6;9467;9475;9483;9532:3;9520:9;9511:7;9507:23;9503:33;9500:120;;;9539:79;;:::i;:::-;9500:120;9659:1;9684:53;9729:7;9720:6;9709:9;9705:22;9684:53;:::i;:::-;9674:63;;9630:117;9814:2;9803:9;9799:18;9786:32;9845:18;9837:6;9834:30;9831:117;;;9867:79;;:::i;:::-;9831:117;9972:78;10042:7;10033:6;10022:9;10018:22;9972:78;:::i;:::-;9962:88;;9757:303;10127:2;10116:9;10112:18;10099:32;10158:18;10150:6;10147:30;10144:117;;;10180:79;;:::i;:::-;10144:117;10285:78;10355:7;10346:6;10335:9;10331:22;10285:78;:::i;:::-;10275:88;;10070:303;10440:2;10429:9;10425:18;10412:32;10471:18;10463:6;10460:30;10457:117;;;10493:79;;:::i;:::-;10457:117;10598:62;10652:7;10643:6;10632:9;10628:22;10598:62;:::i;:::-;10588:72;;10383:287;9314:1363;;;;;;;:::o;10683:468::-;10748:6;10756;10805:2;10793:9;10784:7;10780:23;10776:32;10773:119;;;10811:79;;:::i;:::-;10773:119;10931:1;10956:53;11001:7;10992:6;10981:9;10977:22;10956:53;:::i;:::-;10946:63;;10902:117;11058:2;11084:50;11126:7;11117:6;11106:9;11102:22;11084:50;:::i;:::-;11074:60;;11029:115;10683:468;;;;;:::o;11157:474::-;11225:6;11233;11282:2;11270:9;11261:7;11257:23;11253:32;11250:119;;;11288:79;;:::i;:::-;11250:119;11408:1;11433:53;11478:7;11469:6;11458:9;11454:22;11433:53;:::i;:::-;11423:63;;11379:117;11535:2;11561:53;11606:7;11597:6;11586:9;11582:22;11561:53;:::i;:::-;11551:63;;11506:118;11157:474;;;;;:::o;11637:619::-;11714:6;11722;11730;11779:2;11767:9;11758:7;11754:23;11750:32;11747:119;;;11785:79;;:::i;:::-;11747:119;11905:1;11930:53;11975:7;11966:6;11955:9;11951:22;11930:53;:::i;:::-;11920:63;;11876:117;12032:2;12058:53;12103:7;12094:6;12083:9;12079:22;12058:53;:::i;:::-;12048:63;;12003:118;12160:2;12186:53;12231:7;12222:6;12211:9;12207:22;12186:53;:::i;:::-;12176:63;;12131:118;11637:619;;;;;:::o;12262:894::-;12380:6;12388;12437:2;12425:9;12416:7;12412:23;12408:32;12405:119;;;12443:79;;:::i;:::-;12405:119;12591:1;12580:9;12576:17;12563:31;12621:18;12613:6;12610:30;12607:117;;;12643:79;;:::i;:::-;12607:117;12748:78;12818:7;12809:6;12798:9;12794:22;12748:78;:::i;:::-;12738:88;;12534:302;12903:2;12892:9;12888:18;12875:32;12934:18;12926:6;12923:30;12920:117;;;12956:79;;:::i;:::-;12920:117;13061:78;13131:7;13122:6;13111:9;13107:22;13061:78;:::i;:::-;13051:88;;12846:303;12262:894;;;;;:::o;13162:1249::-;13314:6;13322;13330;13379:2;13367:9;13358:7;13354:23;13350:32;13347:119;;;13385:79;;:::i;:::-;13347:119;13533:1;13522:9;13518:17;13505:31;13563:18;13555:6;13552:30;13549:117;;;13585:79;;:::i;:::-;13549:117;13690:78;13760:7;13751:6;13740:9;13736:22;13690:78;:::i;:::-;13680:88;;13476:302;13845:2;13834:9;13830:18;13817:32;13876:18;13868:6;13865:30;13862:117;;;13898:79;;:::i;:::-;13862:117;14003:78;14073:7;14064:6;14053:9;14049:22;14003:78;:::i;:::-;13993:88;;13788:303;14158:2;14147:9;14143:18;14130:32;14189:18;14181:6;14178:30;14175:117;;;14211:79;;:::i;:::-;14175:117;14316:78;14386:7;14377:6;14366:9;14362:22;14316:78;:::i;:::-;14306:88;;14101:303;13162:1249;;;;;:::o;14417:327::-;14475:6;14524:2;14512:9;14503:7;14499:23;14495:32;14492:119;;;14530:79;;:::i;:::-;14492:119;14650:1;14675:52;14719:7;14710:6;14699:9;14695:22;14675:52;:::i;:::-;14665:62;;14621:116;14417:327;;;;:::o;14750:349::-;14819:6;14868:2;14856:9;14847:7;14843:23;14839:32;14836:119;;;14874:79;;:::i;:::-;14836:119;14994:1;15019:63;15074:7;15065:6;15054:9;15050:22;15019:63;:::i;:::-;15009:73;;14965:127;14750:349;;;;:::o;15105:654::-;15183:6;15191;15240:2;15228:9;15219:7;15215:23;15211:32;15208:119;;;15246:79;;:::i;:::-;15208:119;15394:1;15383:9;15379:17;15366:31;15424:18;15416:6;15413:30;15410:117;;;15446:79;;:::i;:::-;15410:117;15551:63;15606:7;15597:6;15586:9;15582:22;15551:63;:::i;:::-;15541:73;;15337:287;15663:2;15689:53;15734:7;15725:6;15714:9;15710:22;15689:53;:::i;:::-;15679:63;;15634:118;15105:654;;;;;:::o;15765:557::-;15858:6;15907:2;15895:9;15886:7;15882:23;15878:32;15875:119;;;15913:79;;:::i;:::-;15875:119;16061:1;16050:9;16046:17;16033:31;16091:18;16083:6;16080:30;16077:117;;;16113:79;;:::i;:::-;16077:117;16218:87;16297:7;16288:6;16277:9;16273:22;16218:87;:::i;:::-;16208:97;;16004:311;15765:557;;;;:::o;16328:329::-;16387:6;16436:2;16424:9;16415:7;16411:23;16407:32;16404:119;;;16442:79;;:::i;:::-;16404:119;16562:1;16587:53;16632:7;16623:6;16612:9;16608:22;16587:53;:::i;:::-;16577:63;;16533:117;16328:329;;;;:::o;16663:179::-;16732:10;16753:46;16795:3;16787:6;16753:46;:::i;:::-;16831:4;16826:3;16822:14;16808:28;;16663:179;;;;:::o;16848:118::-;16935:24;16953:5;16935:24;:::i;:::-;16930:3;16923:37;16848:118;;:::o;17002:732::-;17121:3;17150:54;17198:5;17150:54;:::i;:::-;17220:86;17299:6;17294:3;17220:86;:::i;:::-;17213:93;;17330:56;17380:5;17330:56;:::i;:::-;17409:7;17440:1;17425:284;17450:6;17447:1;17444:13;17425:284;;;17526:6;17520:13;17553:63;17612:3;17597:13;17553:63;:::i;:::-;17546:70;;17639:60;17692:6;17639:60;:::i;:::-;17629:70;;17485:224;17472:1;17469;17465:9;17460:14;;17425:284;;;17429:14;17725:3;17718:10;;17126:608;;;17002:732;;;;:::o;17740:109::-;17821:21;17836:5;17821:21;:::i;:::-;17816:3;17809:34;17740:109;;:::o;17855:118::-;17942:24;17960:5;17942:24;:::i;:::-;17937:3;17930:37;17855:118;;:::o;17979:157::-;18084:45;18104:24;18122:5;18104:24;:::i;:::-;18084:45;:::i;:::-;18079:3;18072:58;17979:157;;:::o;18164:314::-;18278:3;18299:88;18380:6;18375:3;18299:88;:::i;:::-;18292:95;;18397:43;18433:6;18428:3;18421:5;18397:43;:::i;:::-;18465:6;18460:3;18456:16;18449:23;;18164:314;;;;;:::o;18484:360::-;18570:3;18598:38;18630:5;18598:38;:::i;:::-;18652:70;18715:6;18710:3;18652:70;:::i;:::-;18645:77;;18731:52;18776:6;18771:3;18764:4;18757:5;18753:16;18731:52;:::i;:::-;18808:29;18830:6;18808:29;:::i;:::-;18803:3;18799:39;18792:46;;18574:270;18484:360;;;;:::o;18850:364::-;18938:3;18966:39;18999:5;18966:39;:::i;:::-;19021:71;19085:6;19080:3;19021:71;:::i;:::-;19014:78;;19101:52;19146:6;19141:3;19134:4;19127:5;19123:16;19101:52;:::i;:::-;19178:29;19200:6;19178:29;:::i;:::-;19173:3;19169:39;19162:46;;18942:272;18850:364;;;;:::o;19220:377::-;19326:3;19354:39;19387:5;19354:39;:::i;:::-;19409:89;19491:6;19486:3;19409:89;:::i;:::-;19402:96;;19507:52;19552:6;19547:3;19540:4;19533:5;19529:16;19507:52;:::i;:::-;19584:6;19579:3;19575:16;19568:23;;19330:267;19220:377;;;;:::o;19603:366::-;19745:3;19766:67;19830:2;19825:3;19766:67;:::i;:::-;19759:74;;19842:93;19931:3;19842:93;:::i;:::-;19960:2;19955:3;19951:12;19944:19;;19603:366;;;:::o;19975:::-;20117:3;20138:67;20202:2;20197:3;20138:67;:::i;:::-;20131:74;;20214:93;20303:3;20214:93;:::i;:::-;20332:2;20327:3;20323:12;20316:19;;19975:366;;;:::o;20347:::-;20489:3;20510:67;20574:2;20569:3;20510:67;:::i;:::-;20503:74;;20586:93;20675:3;20586:93;:::i;:::-;20704:2;20699:3;20695:12;20688:19;;20347:366;;;:::o;20719:::-;20861:3;20882:67;20946:2;20941:3;20882:67;:::i;:::-;20875:74;;20958:93;21047:3;20958:93;:::i;:::-;21076:2;21071:3;21067:12;21060:19;;20719:366;;;:::o;21091:::-;21233:3;21254:67;21318:2;21313:3;21254:67;:::i;:::-;21247:74;;21330:93;21419:3;21330:93;:::i;:::-;21448:2;21443:3;21439:12;21432:19;;21091:366;;;:::o;21463:::-;21605:3;21626:67;21690:2;21685:3;21626:67;:::i;:::-;21619:74;;21702:93;21791:3;21702:93;:::i;:::-;21820:2;21815:3;21811:12;21804:19;;21463:366;;;:::o;21835:::-;21977:3;21998:67;22062:2;22057:3;21998:67;:::i;:::-;21991:74;;22074:93;22163:3;22074:93;:::i;:::-;22192:2;22187:3;22183:12;22176:19;;21835:366;;;:::o;22207:::-;22349:3;22370:67;22434:2;22429:3;22370:67;:::i;:::-;22363:74;;22446:93;22535:3;22446:93;:::i;:::-;22564:2;22559:3;22555:12;22548:19;;22207:366;;;:::o;22579:::-;22721:3;22742:67;22806:2;22801:3;22742:67;:::i;:::-;22735:74;;22818:93;22907:3;22818:93;:::i;:::-;22936:2;22931:3;22927:12;22920:19;;22579:366;;;:::o;22951:::-;23093:3;23114:67;23178:2;23173:3;23114:67;:::i;:::-;23107:74;;23190:93;23279:3;23190:93;:::i;:::-;23308:2;23303:3;23299:12;23292:19;;22951:366;;;:::o;23323:400::-;23483:3;23504:84;23586:1;23581:3;23504:84;:::i;:::-;23497:91;;23597:93;23686:3;23597:93;:::i;:::-;23715:1;23710:3;23706:11;23699:18;;23323:400;;;:::o;23729:366::-;23871:3;23892:67;23956:2;23951:3;23892:67;:::i;:::-;23885:74;;23968:93;24057:3;23968:93;:::i;:::-;24086:2;24081:3;24077:12;24070:19;;23729:366;;;:::o;24101:::-;24243:3;24264:67;24328:2;24323:3;24264:67;:::i;:::-;24257:74;;24340:93;24429:3;24340:93;:::i;:::-;24458:2;24453:3;24449:12;24442:19;;24101:366;;;:::o;24473:::-;24615:3;24636:67;24700:2;24695:3;24636:67;:::i;:::-;24629:74;;24712:93;24801:3;24712:93;:::i;:::-;24830:2;24825:3;24821:12;24814:19;;24473:366;;;:::o;24845:::-;24987:3;25008:67;25072:2;25067:3;25008:67;:::i;:::-;25001:74;;25084:93;25173:3;25084:93;:::i;:::-;25202:2;25197:3;25193:12;25186:19;;24845:366;;;:::o;25217:::-;25359:3;25380:67;25444:2;25439:3;25380:67;:::i;:::-;25373:74;;25456:93;25545:3;25456:93;:::i;:::-;25574:2;25569:3;25565:12;25558:19;;25217:366;;;:::o;25589:::-;25731:3;25752:67;25816:2;25811:3;25752:67;:::i;:::-;25745:74;;25828:93;25917:3;25828:93;:::i;:::-;25946:2;25941:3;25937:12;25930:19;;25589:366;;;:::o;25961:::-;26103:3;26124:67;26188:2;26183:3;26124:67;:::i;:::-;26117:74;;26200:93;26289:3;26200:93;:::i;:::-;26318:2;26313:3;26309:12;26302:19;;25961:366;;;:::o;26333:400::-;26493:3;26514:84;26596:1;26591:3;26514:84;:::i;:::-;26507:91;;26607:93;26696:3;26607:93;:::i;:::-;26725:1;26720:3;26716:11;26709:18;;26333:400;;;:::o;26739:366::-;26881:3;26902:67;26966:2;26961:3;26902:67;:::i;:::-;26895:74;;26978:93;27067:3;26978:93;:::i;:::-;27096:2;27091:3;27087:12;27080:19;;26739:366;;;:::o;27111:::-;27253:3;27274:67;27338:2;27333:3;27274:67;:::i;:::-;27267:74;;27350:93;27439:3;27350:93;:::i;:::-;27468:2;27463:3;27459:12;27452:19;;27111:366;;;:::o;27483:::-;27625:3;27646:67;27710:2;27705:3;27646:67;:::i;:::-;27639:74;;27722:93;27811:3;27722:93;:::i;:::-;27840:2;27835:3;27831:12;27824:19;;27483:366;;;:::o;27855:::-;27997:3;28018:67;28082:2;28077:3;28018:67;:::i;:::-;28011:74;;28094:93;28183:3;28094:93;:::i;:::-;28212:2;28207:3;28203:12;28196:19;;27855:366;;;:::o;28227:::-;28369:3;28390:67;28454:2;28449:3;28390:67;:::i;:::-;28383:74;;28466:93;28555:3;28466:93;:::i;:::-;28584:2;28579:3;28575:12;28568:19;;28227:366;;;:::o;28599:::-;28741:3;28762:67;28826:2;28821:3;28762:67;:::i;:::-;28755:74;;28838:93;28927:3;28838:93;:::i;:::-;28956:2;28951:3;28947:12;28940:19;;28599:366;;;:::o;28971:::-;29113:3;29134:67;29198:2;29193:3;29134:67;:::i;:::-;29127:74;;29210:93;29299:3;29210:93;:::i;:::-;29328:2;29323:3;29319:12;29312:19;;28971:366;;;:::o;29343:108::-;29420:24;29438:5;29420:24;:::i;:::-;29415:3;29408:37;29343:108;;:::o;29457:118::-;29544:24;29562:5;29544:24;:::i;:::-;29539:3;29532:37;29457:118;;:::o;29581:112::-;29664:22;29680:5;29664:22;:::i;:::-;29659:3;29652:35;29581:112;;:::o;29699:291::-;29839:3;29861:103;29960:3;29951:6;29943;29861:103;:::i;:::-;29854:110;;29981:3;29974:10;;29699:291;;;;;:::o;29996:701::-;30277:3;30299:95;30390:3;30381:6;30299:95;:::i;:::-;30292:102;;30411:95;30502:3;30493:6;30411:95;:::i;:::-;30404:102;;30523:148;30667:3;30523:148;:::i;:::-;30516:155;;30688:3;30681:10;;29996:701;;;;;:::o;30703:663::-;30944:3;30966:148;31110:3;30966:148;:::i;:::-;30959:155;;31124:75;31195:3;31186:6;31124:75;:::i;:::-;31224:2;31219:3;31215:12;31208:19;;31237:75;31308:3;31299:6;31237:75;:::i;:::-;31337:2;31332:3;31328:12;31321:19;;31357:3;31350:10;;30703:663;;;;;:::o;31372:222::-;31465:4;31503:2;31492:9;31488:18;31480:26;;31516:71;31584:1;31573:9;31569:17;31560:6;31516:71;:::i;:::-;31372:222;;;;:::o;31600:1053::-;31923:4;31961:3;31950:9;31946:19;31938:27;;31975:71;32043:1;32032:9;32028:17;32019:6;31975:71;:::i;:::-;32056:72;32124:2;32113:9;32109:18;32100:6;32056:72;:::i;:::-;32175:9;32169:4;32165:20;32160:2;32149:9;32145:18;32138:48;32203:108;32306:4;32297:6;32203:108;:::i;:::-;32195:116;;32358:9;32352:4;32348:20;32343:2;32332:9;32328:18;32321:48;32386:108;32489:4;32480:6;32386:108;:::i;:::-;32378:116;;32542:9;32536:4;32532:20;32526:3;32515:9;32511:19;32504:49;32570:76;32641:4;32632:6;32570:76;:::i;:::-;32562:84;;31600:1053;;;;;;;;:::o;32659:751::-;32882:4;32920:3;32909:9;32905:19;32897:27;;32934:71;33002:1;32991:9;32987:17;32978:6;32934:71;:::i;:::-;33015:72;33083:2;33072:9;33068:18;33059:6;33015:72;:::i;:::-;33097;33165:2;33154:9;33150:18;33141:6;33097:72;:::i;:::-;33179;33247:2;33236:9;33232:18;33223:6;33179:72;:::i;:::-;33299:9;33293:4;33289:20;33283:3;33272:9;33268:19;33261:49;33327:76;33398:4;33389:6;33327:76;:::i;:::-;33319:84;;32659:751;;;;;;;;:::o;33416:373::-;33559:4;33597:2;33586:9;33582:18;33574:26;;33646:9;33640:4;33636:20;33632:1;33621:9;33617:17;33610:47;33674:108;33777:4;33768:6;33674:108;:::i;:::-;33666:116;;33416:373;;;;:::o;33795:634::-;34016:4;34054:2;34043:9;34039:18;34031:26;;34103:9;34097:4;34093:20;34089:1;34078:9;34074:17;34067:47;34131:108;34234:4;34225:6;34131:108;:::i;:::-;34123:116;;34286:9;34280:4;34276:20;34271:2;34260:9;34256:18;34249:48;34314:108;34417:4;34408:6;34314:108;:::i;:::-;34306:116;;33795:634;;;;;:::o;34435:210::-;34522:4;34560:2;34549:9;34545:18;34537:26;;34573:65;34635:1;34624:9;34620:17;34611:6;34573:65;:::i;:::-;34435:210;;;;:::o;34651:664::-;34856:4;34894:3;34883:9;34879:19;34871:27;;34908:71;34976:1;34965:9;34961:17;34952:6;34908:71;:::i;:::-;34989:72;35057:2;35046:9;35042:18;35033:6;34989:72;:::i;:::-;35071;35139:2;35128:9;35124:18;35115:6;35071:72;:::i;:::-;35153;35221:2;35210:9;35206:18;35197:6;35153:72;:::i;:::-;35235:73;35303:3;35292:9;35288:19;35279:6;35235:73;:::i;:::-;34651:664;;;;;;;;:::o;35321:886::-;35582:4;35620:3;35609:9;35605:19;35597:27;;35634:71;35702:1;35691:9;35687:17;35678:6;35634:71;:::i;:::-;35715:72;35783:2;35772:9;35768:18;35759:6;35715:72;:::i;:::-;35797;35865:2;35854:9;35850:18;35841:6;35797:72;:::i;:::-;35879;35947:2;35936:9;35932:18;35923:6;35879:72;:::i;:::-;35961:73;36029:3;36018:9;36014:19;36005:6;35961:73;:::i;:::-;36044;36112:3;36101:9;36097:19;36088:6;36044:73;:::i;:::-;36127;36195:3;36184:9;36180:19;36171:6;36127:73;:::i;:::-;35321:886;;;;;;;;;;:::o;36213:545::-;36386:4;36424:3;36413:9;36409:19;36401:27;;36438:71;36506:1;36495:9;36491:17;36482:6;36438:71;:::i;:::-;36519:68;36583:2;36572:9;36568:18;36559:6;36519:68;:::i;:::-;36597:72;36665:2;36654:9;36650:18;36641:6;36597:72;:::i;:::-;36679;36747:2;36736:9;36732:18;36723:6;36679:72;:::i;:::-;36213:545;;;;;;;:::o;36764:313::-;36877:4;36915:2;36904:9;36900:18;36892:26;;36964:9;36958:4;36954:20;36950:1;36939:9;36935:17;36928:47;36992:78;37065:4;37056:6;36992:78;:::i;:::-;36984:86;;36764:313;;;;:::o;37083:419::-;37249:4;37287:2;37276:9;37272:18;37264:26;;37336:9;37330:4;37326:20;37322:1;37311:9;37307:17;37300:47;37364:131;37490:4;37364:131;:::i;:::-;37356:139;;37083:419;;;:::o;37508:::-;37674:4;37712:2;37701:9;37697:18;37689:26;;37761:9;37755:4;37751:20;37747:1;37736:9;37732:17;37725:47;37789:131;37915:4;37789:131;:::i;:::-;37781:139;;37508:419;;;:::o;37933:::-;38099:4;38137:2;38126:9;38122:18;38114:26;;38186:9;38180:4;38176:20;38172:1;38161:9;38157:17;38150:47;38214:131;38340:4;38214:131;:::i;:::-;38206:139;;37933:419;;;:::o;38358:::-;38524:4;38562:2;38551:9;38547:18;38539:26;;38611:9;38605:4;38601:20;38597:1;38586:9;38582:17;38575:47;38639:131;38765:4;38639:131;:::i;:::-;38631:139;;38358:419;;;:::o;38783:::-;38949:4;38987:2;38976:9;38972:18;38964:26;;39036:9;39030:4;39026:20;39022:1;39011:9;39007:17;39000:47;39064:131;39190:4;39064:131;:::i;:::-;39056:139;;38783:419;;;:::o;39208:::-;39374:4;39412:2;39401:9;39397:18;39389:26;;39461:9;39455:4;39451:20;39447:1;39436:9;39432:17;39425:47;39489:131;39615:4;39489:131;:::i;:::-;39481:139;;39208:419;;;:::o;39633:::-;39799:4;39837:2;39826:9;39822:18;39814:26;;39886:9;39880:4;39876:20;39872:1;39861:9;39857:17;39850:47;39914:131;40040:4;39914:131;:::i;:::-;39906:139;;39633:419;;;:::o;40058:::-;40224:4;40262:2;40251:9;40247:18;40239:26;;40311:9;40305:4;40301:20;40297:1;40286:9;40282:17;40275:47;40339:131;40465:4;40339:131;:::i;:::-;40331:139;;40058:419;;;:::o;40483:::-;40649:4;40687:2;40676:9;40672:18;40664:26;;40736:9;40730:4;40726:20;40722:1;40711:9;40707:17;40700:47;40764:131;40890:4;40764:131;:::i;:::-;40756:139;;40483:419;;;:::o;40908:::-;41074:4;41112:2;41101:9;41097:18;41089:26;;41161:9;41155:4;41151:20;41147:1;41136:9;41132:17;41125:47;41189:131;41315:4;41189:131;:::i;:::-;41181:139;;40908:419;;;:::o;41333:::-;41499:4;41537:2;41526:9;41522:18;41514:26;;41586:9;41580:4;41576:20;41572:1;41561:9;41557:17;41550:47;41614:131;41740:4;41614:131;:::i;:::-;41606:139;;41333:419;;;:::o;41758:::-;41924:4;41962:2;41951:9;41947:18;41939:26;;42011:9;42005:4;42001:20;41997:1;41986:9;41982:17;41975:47;42039:131;42165:4;42039:131;:::i;:::-;42031:139;;41758:419;;;:::o;42183:::-;42349:4;42387:2;42376:9;42372:18;42364:26;;42436:9;42430:4;42426:20;42422:1;42411:9;42407:17;42400:47;42464:131;42590:4;42464:131;:::i;:::-;42456:139;;42183:419;;;:::o;42608:::-;42774:4;42812:2;42801:9;42797:18;42789:26;;42861:9;42855:4;42851:20;42847:1;42836:9;42832:17;42825:47;42889:131;43015:4;42889:131;:::i;:::-;42881:139;;42608:419;;;:::o;43033:::-;43199:4;43237:2;43226:9;43222:18;43214:26;;43286:9;43280:4;43276:20;43272:1;43261:9;43257:17;43250:47;43314:131;43440:4;43314:131;:::i;:::-;43306:139;;43033:419;;;:::o;43458:::-;43624:4;43662:2;43651:9;43647:18;43639:26;;43711:9;43705:4;43701:20;43697:1;43686:9;43682:17;43675:47;43739:131;43865:4;43739:131;:::i;:::-;43731:139;;43458:419;;;:::o;43883:::-;44049:4;44087:2;44076:9;44072:18;44064:26;;44136:9;44130:4;44126:20;44122:1;44111:9;44107:17;44100:47;44164:131;44290:4;44164:131;:::i;:::-;44156:139;;43883:419;;;:::o;44308:::-;44474:4;44512:2;44501:9;44497:18;44489:26;;44561:9;44555:4;44551:20;44547:1;44536:9;44532:17;44525:47;44589:131;44715:4;44589:131;:::i;:::-;44581:139;;44308:419;;;:::o;44733:::-;44899:4;44937:2;44926:9;44922:18;44914:26;;44986:9;44980:4;44976:20;44972:1;44961:9;44957:17;44950:47;45014:131;45140:4;45014:131;:::i;:::-;45006:139;;44733:419;;;:::o;45158:::-;45324:4;45362:2;45351:9;45347:18;45339:26;;45411:9;45405:4;45401:20;45397:1;45386:9;45382:17;45375:47;45439:131;45565:4;45439:131;:::i;:::-;45431:139;;45158:419;;;:::o;45583:::-;45749:4;45787:2;45776:9;45772:18;45764:26;;45836:9;45830:4;45826:20;45822:1;45811:9;45807:17;45800:47;45864:131;45990:4;45864:131;:::i;:::-;45856:139;;45583:419;;;:::o;46008:::-;46174:4;46212:2;46201:9;46197:18;46189:26;;46261:9;46255:4;46251:20;46247:1;46236:9;46232:17;46225:47;46289:131;46415:4;46289:131;:::i;:::-;46281:139;;46008:419;;;:::o;46433:::-;46599:4;46637:2;46626:9;46622:18;46614:26;;46686:9;46680:4;46676:20;46672:1;46661:9;46657:17;46650:47;46714:131;46840:4;46714:131;:::i;:::-;46706:139;;46433:419;;;:::o;46858:::-;47024:4;47062:2;47051:9;47047:18;47039:26;;47111:9;47105:4;47101:20;47097:1;47086:9;47082:17;47075:47;47139:131;47265:4;47139:131;:::i;:::-;47131:139;;46858:419;;;:::o;47283:222::-;47376:4;47414:2;47403:9;47399:18;47391:26;;47427:71;47495:1;47484:9;47480:17;47471:6;47427:71;:::i;:::-;47283:222;;;;:::o;47511:332::-;47632:4;47670:2;47659:9;47655:18;47647:26;;47683:71;47751:1;47740:9;47736:17;47727:6;47683:71;:::i;:::-;47764:72;47832:2;47821:9;47817:18;47808:6;47764:72;:::i;:::-;47511:332;;;;;:::o;47849:724::-;47926:4;47932:6;47988:11;47975:25;48088:1;48082:4;48078:12;48067:8;48051:14;48047:29;48043:48;48023:18;48019:73;48009:168;;48096:79;;:::i;:::-;48009:168;48208:18;48198:8;48194:33;48186:41;;48260:4;48247:18;48237:28;;48288:18;48280:6;48277:30;48274:117;;;48310:79;;:::i;:::-;48274:117;48418:2;48412:4;48408:13;48400:21;;48475:4;48467:6;48463:17;48447:14;48443:38;48437:4;48433:49;48430:136;;;48485:79;;:::i;:::-;48430:136;47939:634;47849:724;;;;;:::o;48579:725::-;48657:4;48663:6;48719:11;48706:25;48819:1;48813:4;48809:12;48798:8;48782:14;48778:29;48774:48;48754:18;48750:73;48740:168;;48827:79;;:::i;:::-;48740:168;48939:18;48929:8;48925:33;48917:41;;48991:4;48978:18;48968:28;;49019:18;49011:6;49008:30;49005:117;;;49041:79;;:::i;:::-;49005:117;49149:2;49143:4;49139:13;49131:21;;49206:4;49198:6;49194:17;49178:14;49174:38;49168:4;49164:49;49161:136;;;49216:79;;:::i;:::-;49161:136;48670:634;48579:725;;;;;:::o;49310:129::-;49344:6;49371:20;;:::i;:::-;49361:30;;49400:33;49428:4;49420:6;49400:33;:::i;:::-;49310:129;;;:::o;49445:75::-;49478:6;49511:2;49505:9;49495:19;;49445:75;:::o;49526:311::-;49603:4;49693:18;49685:6;49682:30;49679:56;;;49715:18;;:::i;:::-;49679:56;49765:4;49757:6;49753:17;49745:25;;49825:4;49819;49815:15;49807:23;;49526:311;;;:::o;49843:::-;49920:4;50010:18;50002:6;49999:30;49996:56;;;50032:18;;:::i;:::-;49996:56;50082:4;50074:6;50070:17;50062:25;;50142:4;50136;50132:15;50124:23;;49843:311;;;:::o;50160:307::-;50221:4;50311:18;50303:6;50300:30;50297:56;;;50333:18;;:::i;:::-;50297:56;50371:29;50393:6;50371:29;:::i;:::-;50363:37;;50455:4;50449;50445:15;50437:23;;50160:307;;;:::o;50473:308::-;50535:4;50625:18;50617:6;50614:30;50611:56;;;50647:18;;:::i;:::-;50611:56;50685:29;50707:6;50685:29;:::i;:::-;50677:37;;50769:4;50763;50759:15;50751:23;;50473:308;;;:::o;50787:132::-;50854:4;50877:3;50869:11;;50907:4;50902:3;50898:14;50890:22;;50787:132;;;:::o;50925:114::-;50992:6;51026:5;51020:12;51010:22;;50925:114;;;:::o;51045:98::-;51096:6;51130:5;51124:12;51114:22;;51045:98;;;:::o;51149:99::-;51201:6;51235:5;51229:12;51219:22;;51149:99;;;:::o;51254:113::-;51324:4;51356;51351:3;51347:14;51339:22;;51254:113;;;:::o;51373:184::-;51472:11;51506:6;51501:3;51494:19;51546:4;51541:3;51537:14;51522:29;;51373:184;;;;:::o;51563:168::-;51646:11;51680:6;51675:3;51668:19;51720:4;51715:3;51711:14;51696:29;;51563:168;;;;:::o;51737:147::-;51838:11;51875:3;51860:18;;51737:147;;;;:::o;51890:169::-;51974:11;52008:6;52003:3;51996:19;52048:4;52043:3;52039:14;52024:29;;51890:169;;;;:::o;52065:148::-;52167:11;52204:3;52189:18;;52065:148;;;;:::o;52219:305::-;52259:3;52278:20;52296:1;52278:20;:::i;:::-;52273:25;;52312:20;52330:1;52312:20;:::i;:::-;52307:25;;52466:1;52398:66;52394:74;52391:1;52388:81;52385:107;;;52472:18;;:::i;:::-;52385:107;52516:1;52513;52509:9;52502:16;;52219:305;;;;:::o;52530:185::-;52570:1;52587:20;52605:1;52587:20;:::i;:::-;52582:25;;52621:20;52639:1;52621:20;:::i;:::-;52616:25;;52660:1;52650:35;;52665:18;;:::i;:::-;52650:35;52707:1;52704;52700:9;52695:14;;52530:185;;;;:::o;52721:191::-;52761:4;52781:20;52799:1;52781:20;:::i;:::-;52776:25;;52815:20;52833:1;52815:20;:::i;:::-;52810:25;;52854:1;52851;52848:8;52845:34;;;52859:18;;:::i;:::-;52845:34;52904:1;52901;52897:9;52889:17;;52721:191;;;;:::o;52918:96::-;52955:7;52984:24;53002:5;52984:24;:::i;:::-;52973:35;;52918:96;;;:::o;53020:90::-;53054:7;53097:5;53090:13;53083:21;53072:32;;53020:90;;;:::o;53116:77::-;53153:7;53182:5;53171:16;;53116:77;;;:::o;53199:149::-;53235:7;53275:66;53268:5;53264:78;53253:89;;53199:149;;;:::o;53354:126::-;53391:7;53431:42;53424:5;53420:54;53409:65;;53354:126;;;:::o;53486:77::-;53523:7;53552:5;53541:16;;53486:77;;;:::o;53569:86::-;53604:7;53644:4;53637:5;53633:16;53622:27;;53569:86;;;:::o;53661:154::-;53745:6;53740:3;53735;53722:30;53807:1;53798:6;53793:3;53789:16;53782:27;53661:154;;;:::o;53821:307::-;53889:1;53899:113;53913:6;53910:1;53907:13;53899:113;;;53998:1;53993:3;53989:11;53983:18;53979:1;53974:3;53970:11;53963:39;53935:2;53932:1;53928:10;53923:15;;53899:113;;;54030:6;54027:1;54024:13;54021:101;;;54110:1;54101:6;54096:3;54092:16;54085:27;54021:101;53870:258;53821:307;;;:::o;54134:320::-;54178:6;54215:1;54209:4;54205:12;54195:22;;54262:1;54256:4;54252:12;54283:18;54273:81;;54339:4;54331:6;54327:17;54317:27;;54273:81;54401:2;54393:6;54390:14;54370:18;54367:38;54364:84;;;54420:18;;:::i;:::-;54364:84;54185:269;54134:320;;;:::o;54460:281::-;54543:27;54565:4;54543:27;:::i;:::-;54535:6;54531:40;54673:6;54661:10;54658:22;54637:18;54625:10;54622:34;54619:62;54616:88;;;54684:18;;:::i;:::-;54616:88;54724:10;54720:2;54713:22;54503:238;54460:281;;:::o;54747:233::-;54786:3;54809:24;54827:5;54809:24;:::i;:::-;54800:33;;54855:66;54848:5;54845:77;54842:103;;;54925:18;;:::i;:::-;54842:103;54972:1;54965:5;54961:13;54954:20;;54747:233;;;:::o;54986:79::-;55025:7;55054:5;55043:16;;54986:79;;;:::o;55071:176::-;55103:1;55120:20;55138:1;55120:20;:::i;:::-;55115:25;;55154:20;55172:1;55154:20;:::i;:::-;55149:25;;55193:1;55183:35;;55198:18;;:::i;:::-;55183:35;55239:1;55236;55232:9;55227:14;;55071:176;;;;:::o;55253:180::-;55301:77;55298:1;55291:88;55398:4;55395:1;55388:15;55422:4;55419:1;55412:15;55439:180;55487:77;55484:1;55477:88;55584:4;55581:1;55574:15;55608:4;55605:1;55598:15;55625:180;55673:77;55670:1;55663:88;55770:4;55767:1;55760:15;55794:4;55791:1;55784:15;55811:180;55859:77;55856:1;55849:88;55956:4;55953:1;55946:15;55980:4;55977:1;55970:15;55997:180;56045:77;56042:1;56035:88;56142:4;56139:1;56132:15;56166:4;56163:1;56156:15;56183:180;56231:77;56228:1;56221:88;56328:4;56325:1;56318:15;56352:4;56349:1;56342:15;56369:180;56417:77;56414:1;56407:88;56514:4;56511:1;56504:15;56538:4;56535:1;56528:15;56555:183;56590:3;56628:1;56610:16;56607:23;56604:128;;;56666:1;56663;56660;56645:23;56688:34;56719:1;56713:8;56688:34;:::i;:::-;56681:41;;56604:128;56555:183;:::o;56744:117::-;56853:1;56850;56843:12;56867:117;56976:1;56973;56966:12;56990:117;57099:1;57096;57089:12;57113:117;57222:1;57219;57212:12;57236:117;57345:1;57342;57335:12;57359:117;57468:1;57465;57458:12;57482:117;57591:1;57588;57581:12;57605:117;57714:1;57711;57704:12;57728:117;57837:1;57834;57827:12;57851:102;57892:6;57943:2;57939:7;57934:2;57927:5;57923:14;57919:28;57909:38;;57851:102;;;:::o;57959:106::-;58003:8;58052:5;58047:3;58043:15;58022:36;;57959:106;;;:::o;58071:174::-;58211:26;58207:1;58199:6;58195:14;58188:50;58071:174;:::o;58251:239::-;58391:34;58387:1;58379:6;58375:14;58368:58;58460:22;58455:2;58447:6;58443:15;58436:47;58251:239;:::o;58496:234::-;58636:34;58632:1;58624:6;58620:14;58613:58;58705:17;58700:2;58692:6;58688:15;58681:42;58496:234;:::o;58736:227::-;58876:34;58872:1;58864:6;58860:14;58853:58;58945:10;58940:2;58932:6;58928:15;58921:35;58736:227;:::o;58969:170::-;59109:22;59105:1;59097:6;59093:14;59086:46;58969:170;:::o;59145:181::-;59285:33;59281:1;59273:6;59269:14;59262:57;59145:181;:::o;59332:165::-;59472:17;59468:1;59460:6;59456:14;59449:41;59332:165;:::o;59503:171::-;59643:23;59639:1;59631:6;59627:14;59620:47;59503:171;:::o;59680:225::-;59820:34;59816:1;59808:6;59804:14;59797:58;59889:8;59884:2;59876:6;59872:15;59865:33;59680:225;:::o;59911:223::-;60051:34;60047:1;60039:6;60035:14;60028:58;60120:6;60115:2;60107:6;60103:15;60096:31;59911:223;:::o;60140:214::-;60280:66;60276:1;60268:6;60264:14;60257:90;60140:214;:::o;60360:229::-;60500:34;60496:1;60488:6;60484:14;60477:58;60569:12;60564:2;60556:6;60552:15;60545:37;60360:229;:::o;60595:221::-;60735:34;60731:1;60723:6;60719:14;60712:58;60804:4;60799:2;60791:6;60787:15;60780:29;60595:221;:::o;60822:166::-;60962:18;60958:1;60950:6;60946:14;60939:42;60822:166;:::o;60994:224::-;61134:34;61130:1;61122:6;61118:14;61111:58;61203:7;61198:2;61190:6;61186:15;61179:32;60994:224;:::o;61224:221::-;61364:34;61360:1;61352:6;61348:14;61341:58;61433:4;61428:2;61420:6;61416:15;61409:29;61224:221;:::o;61451:222::-;61591:34;61587:1;61579:6;61575:14;61568:58;61660:5;61655:2;61647:6;61643:15;61636:30;61451:222;:::o;61679:229::-;61819:34;61815:1;61807:6;61803:14;61796:58;61888:12;61883:2;61875:6;61871:15;61864:37;61679:229;:::o;61914:155::-;62054:7;62050:1;62042:6;62038:14;62031:31;61914:155;:::o;62075:182::-;62215:34;62211:1;62203:6;62199:14;62192:58;62075:182;:::o;62263:227::-;62403:34;62399:1;62391:6;62387:14;62380:58;62472:10;62467:2;62459:6;62455:15;62448:35;62263:227;:::o;62496:235::-;62636:34;62632:1;62624:6;62620:14;62613:58;62705:18;62700:2;62692:6;62688:15;62681:43;62496:235;:::o;62737:228::-;62877:34;62873:1;62865:6;62861:14;62854:58;62946:11;62941:2;62933:6;62929:15;62922:36;62737:228;:::o;62971:::-;63111:34;63107:1;63099:6;63095:14;63088:58;63180:11;63175:2;63167:6;63163:15;63156:36;62971:228;:::o;63205:227::-;63345:34;63341:1;63333:6;63329:14;63322:58;63414:10;63409:2;63401:6;63397:15;63390:35;63205:227;:::o;63438:220::-;63578:34;63574:1;63566:6;63562:14;63555:58;63647:3;63642:2;63634:6;63630:15;63623:28;63438:220;:::o;63664:711::-;63703:3;63741:4;63723:16;63720:26;63717:39;;;63749:5;;63717:39;63778:20;;:::i;:::-;63853:1;63835:16;63831:24;63828:1;63822:4;63807:49;63886:4;63880:11;63985:16;63978:4;63970:6;63966:17;63963:39;63930:18;63922:6;63919:30;63903:113;63900:146;;;64031:5;;;;63900:146;64077:6;64071:4;64067:17;64113:3;64107:10;64140:18;64132:6;64129:30;64126:43;;;64162:5;;;;;;64126:43;64210:6;64203:4;64198:3;64194:14;64190:27;64269:1;64251:16;64247:24;64241:4;64237:35;64232:3;64229:44;64226:57;;;64276:5;;;;;;;64226:57;64293;64341:6;64335:4;64331:17;64323:6;64319:30;64313:4;64293:57;:::i;:::-;64366:3;64359:10;;63707:668;;;;;63664:711;;:::o;64381:122::-;64454:24;64472:5;64454:24;:::i;:::-;64447:5;64444:35;64434:63;;64493:1;64490;64483:12;64434:63;64381:122;:::o;64509:116::-;64579:21;64594:5;64579:21;:::i;:::-;64572:5;64569:32;64559:60;;64615:1;64612;64605:12;64559:60;64509:116;:::o;64631:120::-;64703:23;64720:5;64703:23;:::i;:::-;64696:5;64693:34;64683:62;;64741:1;64738;64731:12;64683:62;64631:120;:::o;64757:122::-;64830:24;64848:5;64830:24;:::i;:::-;64823:5;64820:35;64810:63;;64869:1;64866;64859:12;64810:63;64757:122;:::o

Swarm Source

ipfs://63a9f6a7d656e2929ba64afbb5a7d11be43cdc83e4876b59292ae4f85bdfc013
[ 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.