ETH Price: $3,995.96 (+3.42%)

Token

GorillaClub (GC)
 

Overview

Max Total Supply

969 GC

Holders

578

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 GC
0x307cefd1c15cafc3d5359e306c1604c0336ace88
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
GorillaClub

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-17
*/

// File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

        return (signer, RecoverError.NoError);
    }

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

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

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

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



pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

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



pragma solidity ^0.8.0;

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;


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

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;


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

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

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

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



pragma solidity ^0.8.0;


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

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

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

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



pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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



pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/GorillaClub/GorillaClub.sol

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





 
/********************************************************************
 ________  ________  ________  ___  ___       ___       ________          ________  ___       ___  ___  ________     
|\   ____\|\   __  \|\   __  \|\  \|\  \     |\  \     |\   __  \        |\   ____\|\  \     |\  \|\  \|\   __  \    
\ \  \___|\ \  \|\  \ \  \|\  \ \  \ \  \    \ \  \    \ \  \|\  \       \ \  \___|\ \  \    \ \  \\\  \ \  \|\ /_   
 \ \  \  __\ \  \\\  \ \   _  _\ \  \ \  \    \ \  \    \ \   __  \       \ \  \    \ \  \    \ \  \\\  \ \   __  \  
  \ \  \|\  \ \  \\\  \ \  \\  \\ \  \ \  \____\ \  \____\ \  \ \  \       \ \  \____\ \  \____\ \  \\\  \ \  \|\  \ 
   \ \_______\ \_______\ \__\\ _\\ \__\ \_______\ \_______\ \__\ \__\       \ \_______\ \_______\ \_______\ \_______\
    \|_______|\|_______|\|__|\|__|\|__|\|_______|\|_______|\|__|\|__|        \|_______|\|_______|\|_______|\|_______|
 
********************************************************************/
 
contract GorillaClub is ERC721, ERC721Enumerable, Ownable {
    using Counters for Counters.Counter;
 
    uint256 public constant MAX_SUPPLY = 10000;
    uint256 public constant PRESALE_PRICE = 0.05 ether;
    uint256 public constant SALE_PRICE = 0.05 ether;
 
    address private _verifier = 0x3BBE729e8010b8Df57D20742A2Ac5c7e45ac5250;
    address proxyRegistryAddress;
 
    bool public IS_PRESALE_ACTIVE = false;
    bool public IS_SALE_ACTIVE = false;
 
    Counters.Counter private _tokenIdCounter;
 
    string private baseTokenURI = 'https://us-central1-nft-project-2.cloudfunctions.net/token/';
 
    constructor(address _proxyRegistryAddress) ERC721('GorillaClub', 'GC') {
        proxyRegistryAddress = _proxyRegistryAddress;
    }
 
    /**
     * This is used instead of msg.sender as transactions won't be sent by the original token owner, but by OpenSea.
     */
    function _msgSender() internal view override returns (address sender) {
        if (msg.sender == address(this)) {
            bytes memory array = msg.data;
            uint256 index = msg.data.length;
            assembly {
                // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those.
                sender := and(
                    mload(add(array, index)),
                    0xffffffffffffffffffffffffffffffffffffffff
                )
            }
        } else {
            sender = msg.sender;
        }
        return sender;
    }
 
    function _recoverWallet(
        address wallet,
        bytes memory signature
    ) internal pure returns (address) {
        return
            ECDSA.recover(
                ECDSA.toEthSignedMessageHash(
                    keccak256(abi.encodePacked(wallet))
                ),
                signature
            );
    }
 
    function _mintOneToken(address to) internal {
        _tokenIdCounter.increment();
        _safeMint(to, _tokenIdCounter.current());
    }
 
    function _mintTokens(
        uint256 tokensLimit,
        uint256 tokensAmount,
        uint256 tokenPrice
    ) internal {
        require(tokensAmount <= tokensLimit, 'Incorrect tokens amount');
        require(
            (_tokenIdCounter.current() + tokensAmount) <= MAX_SUPPLY,
            'Minting would exceed total supply'
        );
        require(msg.value >= (tokenPrice * tokensAmount), 'Incorrect price');
 
        address sender = _msgSender();
 
        require(
            (balanceOf(sender) + tokensAmount) <= tokensLimit,
            'Limit per wallet'
        );
 
        for (uint256 i = 0; i < tokensAmount; i++) {
            _mintOneToken(sender);
        }
    }
 
    function mintSale(uint256 tokensAmount) public payable {
        require(IS_SALE_ACTIVE, 'Sale is closed');
 
        _mintTokens(10, tokensAmount, SALE_PRICE);
    }
 
    function mintPresale(uint256 tokensAmount, bytes calldata signature) public payable {
        require(IS_PRESALE_ACTIVE, 'PreSale is closed');
 
        address signer = _recoverWallet(_msgSender(), signature);
 
        require(signer == _verifier, 'Unverified transaction');
 
        _mintTokens(5, tokensAmount, PRESALE_PRICE);
    }
 
    /**
     * Override isApprovedForAll to whitelist user's OpenSea proxy accounts to enable gas-less listings.
     */
    function isApprovedForAll(address _owner, address _operator)
        public
        view
        override
        returns (bool)
    {
        // Whitelist OpenSea proxy contract for easy trading.
        ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress);
        if (address(proxyRegistry.proxies(_owner)) == _operator) {
            return true;
        }
 
        return super.isApprovedForAll(_owner, _operator);
    }
 
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override(ERC721Enumerable, ERC721) {
        super._beforeTokenTransfer(from, to, tokenId);
    }
 
    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721Enumerable, ERC721)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
 
    function mintReserved(uint256 tokensAmount) public onlyOwner {
        require(
            _tokenIdCounter.current() + tokensAmount <= MAX_SUPPLY,
            'Minting would exceed total supply'
        );
 
        for (uint256 i = 0; i < tokensAmount; i++) {
            _mintOneToken(msg.sender);
        }
    }
 
    function _baseURI() internal view virtual override returns (string memory) {
        return baseTokenURI;
    }
 
    function setBaseURI(string memory baseURI) public onlyOwner {
        baseTokenURI = baseURI;
    }
 
    function setVerifier(address _newVerifier) public onlyOwner {
        _verifier = _newVerifier;
    }
 
    function setSaleState(bool _isPresaleActive, bool _isSaleActive)
        public
        onlyOwner
    {
        IS_PRESALE_ACTIVE = _isPresaleActive;
        IS_SALE_ACTIVE = _isSaleActive;
    }
 
    function withdrawAll() public onlyOwner {
        (bool success, ) = _msgSender().call{value: address(this).balance}('');
        require(success, 'Withdraw failed');
    }
}
 
contract OwnableDelegateProxy {}
 
contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_proxyRegistryAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"IS_PRESALE_ACTIVE","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IS_SALE_ACTIVE","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokensAmount","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mintPresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokensAmount","type":"uint256"}],"name":"mintReserved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokensAmount","type":"uint256"}],"name":"mintSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isPresaleActive","type":"bool"},{"internalType":"bool","name":"_isSaleActive","type":"bool"}],"name":"setSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newVerifier","type":"address"}],"name":"setVerifier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052733bbe729e8010b8df57d20742a2ac5c7e45ac5250600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600c60146101000a81548160ff0219169083151502179055506000600c60156101000a81548160ff0219169083151502179055506040518060600160405280603b815260200162005464603b9139600e9080519060200190620000c092919062000375565b50348015620000ce57600080fd5b506040516200549f3803806200549f8339818101604052810190620000f491906200043c565b6040518060400160405280600b81526020017f476f72696c6c61436c75620000000000000000000000000000000000000000008152506040518060400160405280600281526020017f474300000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200017892919062000375565b5080600190805190602001906200019192919062000375565b505050620001b4620001a8620001fc60201b60201c565b620002af60201b60201c565b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505062000526565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415620002a857600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff818301511692505050620002ac565b3390505b90565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200038390620004a2565b90600052602060002090601f016020900481019282620003a75760008555620003f3565b82601f10620003c257805160ff1916838001178555620003f3565b82800160010185558215620003f3579182015b82811115620003f2578251825591602001919060010190620003d5565b5b50905062000402919062000406565b5090565b5b808211156200042157600081600090555060010162000407565b5090565b60008151905062000436816200050c565b92915050565b60006020828403121562000455576200045462000507565b5b6000620004658482850162000425565b91505092915050565b60006200047b8262000482565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006002820490506001821680620004bb57607f821691505b60208210811415620004d257620004d1620004d8565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b62000517816200046e565b81146200052357600080fd5b50565b614f2e80620005366000396000f3fe6080604052600436106101d85760003560e01c806362dc6e21116101025780638da5cb5b11610095578063b88d4fde11610064578063b88d4fde1461067c578063c87b56dd146106a5578063e985e9c5146106e2578063f2fde38b1461071f576101d8565b80638da5cb5b146105d457806395d89b41146105ff5780639a5d140b1461062a578063a22cb46514610653576101d8565b806376d02b71116100d157806376d02b711461053c5780637f205a741461056757806382d29a0f14610592578063853828b6146105bd576101d8565b806362dc6e21146104805780636352211e146104ab57806370a08231146104e8578063715018a614610525576101d8565b80632f745c591161017a5780634875bccb116101495780634875bccb146103d55780634f6ccce7146103f15780635437988d1461042e57806355f804b314610457576101d8565b80632f745c591461031b57806332cb6b0c146103585780633340d62c1461038357806342842e0e146103ac576101d8565b8063095ea7b3116101b6578063095ea7b3146102825780630d06ed72146102ab57806318160ddd146102c757806323b872dd146102f2576101d8565b806301ffc9a7146101dd57806306fdde031461021a578063081812fc14610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190613595565b610748565b6040516102119190613d4f565b60405180910390f35b34801561022657600080fd5b5061022f61075a565b60405161023c9190613daf565b60405180910390f35b34801561025157600080fd5b5061026c60048036038101906102679190613665565b6107ec565b6040516102799190613ce8565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a49190613515565b610871565b005b6102c560048036038101906102c09190613692565b610989565b005b3480156102d357600080fd5b506102dc610ada565b6040516102e99190614191565b60405180910390f35b3480156102fe57600080fd5b50610319600480360381019061031491906133ff565b610ae7565b005b34801561032757600080fd5b50610342600480360381019061033d9190613515565b610b47565b60405161034f9190614191565b60405180910390f35b34801561036457600080fd5b5061036d610bec565b60405161037a9190614191565b60405180910390f35b34801561038f57600080fd5b506103aa60048036038101906103a59190613555565b610bf2565b005b3480156103b857600080fd5b506103d360048036038101906103ce91906133ff565b610ca6565b005b6103ef60048036038101906103ea9190613665565b610cc6565b005b3480156103fd57600080fd5b5061041860048036038101906104139190613665565b610d2b565b6040516104259190614191565b60405180910390f35b34801561043a57600080fd5b5061045560048036038101906104509190613392565b610d9c565b005b34801561046357600080fd5b5061047e6004803603810190610479919061361c565b610e5c565b005b34801561048c57600080fd5b50610495610ef2565b6040516104a29190614191565b60405180910390f35b3480156104b757600080fd5b506104d260048036038101906104cd9190613665565b610efd565b6040516104df9190613ce8565b60405180910390f35b3480156104f457600080fd5b5061050f600480360381019061050a9190613392565b610faf565b60405161051c9190614191565b60405180910390f35b34801561053157600080fd5b5061053a611067565b005b34801561054857600080fd5b506105516110ef565b60405161055e9190613d4f565b60405180910390f35b34801561057357600080fd5b5061057c611102565b6040516105899190614191565b60405180910390f35b34801561059e57600080fd5b506105a761110d565b6040516105b49190613d4f565b60405180910390f35b3480156105c957600080fd5b506105d2611120565b005b3480156105e057600080fd5b506105e9611252565b6040516105f69190613ce8565b60405180910390f35b34801561060b57600080fd5b5061061461127c565b6040516106219190613daf565b60405180910390f35b34801561063657600080fd5b50610651600480360381019061064c9190613665565b61130e565b005b34801561065f57600080fd5b5061067a600480360381019061067591906134d5565b61140e565b005b34801561068857600080fd5b506106a3600480360381019061069e9190613452565b61158f565b005b3480156106b157600080fd5b506106cc60048036038101906106c79190613665565b6115f1565b6040516106d99190613daf565b60405180910390f35b3480156106ee57600080fd5b50610709600480360381019061070491906133bf565b611698565b6040516107169190613d4f565b60405180910390f35b34801561072b57600080fd5b5061074660048036038101906107419190613392565b61179a565b005b600061075382611892565b9050919050565b60606000805461076990614475565b80601f016020809104026020016040519081016040528092919081815260200182805461079590614475565b80156107e25780601f106107b7576101008083540402835291602001916107e2565b820191906000526020600020905b8154815290600101906020018083116107c557829003601f168201915b5050505050905090565b60006107f78261190c565b610836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082d90614051565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061087c82610efd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e4906140f1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661090c611978565b73ffffffffffffffffffffffffffffffffffffffff16148061093b575061093a81610935611978565b611698565b5b61097a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097190613fb1565b60405180910390fd5b6109848383611a29565b505050565b600c60149054906101000a900460ff166109d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cf90614151565b60405180910390fd5b6000610a2f6109e5611978565b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611ae2565b9050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ac1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab890613f11565b60405180910390fd5b610ad460058566b1a2bc2ec50000611b24565b50505050565b6000600880549050905090565b610af8610af2611978565b82611c9e565b610b37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2e90614111565b60405180910390fd5b610b42838383611d7c565b505050565b6000610b5283610faf565b8210610b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8a90613e31565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61271081565b610bfa611978565b73ffffffffffffffffffffffffffffffffffffffff16610c18611252565b73ffffffffffffffffffffffffffffffffffffffff1614610c6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6590614071565b60405180910390fd5b81600c60146101000a81548160ff02191690831515021790555080600c60156101000a81548160ff0219169083151502179055505050565b610cc18383836040518060200160405280600081525061158f565b505050565b600c60159054906101000a900460ff16610d15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0c90613df1565b60405180910390fd5b610d28600a8266b1a2bc2ec50000611b24565b50565b6000610d35610ada565b8210610d76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6d90614131565b60405180910390fd5b60088281548110610d8a57610d8961466b565b5b90600052602060002001549050919050565b610da4611978565b73ffffffffffffffffffffffffffffffffffffffff16610dc2611252565b73ffffffffffffffffffffffffffffffffffffffff1614610e18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0f90614071565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610e64611978565b73ffffffffffffffffffffffffffffffffffffffff16610e82611252565b73ffffffffffffffffffffffffffffffffffffffff1614610ed8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecf90614071565b60405180910390fd5b80600e9080519060200190610eee92919061313b565b5050565b66b1a2bc2ec5000081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9d90613ff1565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611020576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101790613fd1565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61106f611978565b73ffffffffffffffffffffffffffffffffffffffff1661108d611252565b73ffffffffffffffffffffffffffffffffffffffff16146110e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110da90614071565b60405180910390fd5b6110ed6000611fd8565b565b600c60159054906101000a900460ff1681565b66b1a2bc2ec5000081565b600c60149054906101000a900460ff1681565b611128611978565b73ffffffffffffffffffffffffffffffffffffffff16611146611252565b73ffffffffffffffffffffffffffffffffffffffff161461119c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119390614071565b60405180910390fd5b60006111a6611978565b73ffffffffffffffffffffffffffffffffffffffff16476040516111c990613cd3565b60006040518083038185875af1925050503d8060008114611206576040519150601f19603f3d011682016040523d82523d6000602084013e61120b565b606091505b505090508061124f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124690613ed1565b60405180910390fd5b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461128b90614475565b80601f01602080910402602001604051908101604052809291908181526020018280546112b790614475565b80156113045780601f106112d957610100808354040283529160200191611304565b820191906000526020600020905b8154815290600101906020018083116112e757829003601f168201915b5050505050905090565b611316611978565b73ffffffffffffffffffffffffffffffffffffffff16611334611252565b73ffffffffffffffffffffffffffffffffffffffff161461138a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138190614071565b60405180910390fd5b61271081611398600d61209e565b6113a29190614281565b11156113e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113da90614171565b60405180910390fd5b60005b8181101561140a576113f7336120ac565b8080611402906144d8565b9150506113e6565b5050565b611416611978565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147b90613f51565b60405180910390fd5b8060056000611491611978565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661153e611978565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115839190613d4f565b60405180910390a35050565b6115a061159a611978565b83611c9e565b6115df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d690614111565b60405180910390fd5b6115eb848484846120cc565b50505050565b60606115fc8261190c565b61163b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611632906140b1565b60405180910390fd5b6000611645612128565b905060008151116116655760405180602001604052806000815250611690565b8061166f846121ba565b604051602001611680929190613c89565b6040516020818303038152906040525b915050919050565b600080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b81526004016117109190613ce8565b60206040518083038186803b15801561172857600080fd5b505afa15801561173c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061176091906135ef565b73ffffffffffffffffffffffffffffffffffffffff161415611786576001915050611794565b611790848461231b565b9150505b92915050565b6117a2611978565b73ffffffffffffffffffffffffffffffffffffffff166117c0611252565b73ffffffffffffffffffffffffffffffffffffffff1614611816576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180d90614071565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611886576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187d90613e71565b60405180910390fd5b61188f81611fd8565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806119055750611904826123af565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611a2257600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff818301511692505050611a26565b3390505b90565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a9c83610efd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611b1c611b1684604051602001611afb9190613c6e565b60405160208183030381529060405280519060200120612491565b836124c1565b905092915050565b82821115611b67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5e90613eb1565b60405180910390fd5b61271082611b75600d61209e565b611b7f9190614281565b1115611bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb790614171565b60405180910390fd5b8181611bcc9190614308565b341015611c0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0590613ef1565b60405180910390fd5b6000611c18611978565b90508383611c2583610faf565b611c2f9190614281565b1115611c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c67906140d1565b60405180910390fd5b60005b83811015611c9757611c84826120ac565b8080611c8f906144d8565b915050611c73565b5050505050565b6000611ca98261190c565b611ce8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdf90613f91565b60405180910390fd5b6000611cf383610efd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d6257508373ffffffffffffffffffffffffffffffffffffffff16611d4a846107ec565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d735750611d728185611698565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d9c82610efd565b73ffffffffffffffffffffffffffffffffffffffff1614611df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de990614091565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5990613f31565b60405180910390fd5b611e6d8383836124e8565b611e78600082611a29565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ec89190614362565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f1f9190614281565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b6120b6600d6124f8565b6120c9816120c4600d61209e565b61250e565b50565b6120d7848484611d7c565b6120e38484848461252c565b612122576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211990613e51565b60405180910390fd5b50505050565b6060600e805461213790614475565b80601f016020809104026020016040519081016040528092919081815260200182805461216390614475565b80156121b05780601f10612185576101008083540402835291602001916121b0565b820191906000526020600020905b81548152906001019060200180831161219357829003601f168201915b5050505050905090565b60606000821415612202576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612316565b600082905060005b6000821461223457808061221d906144d8565b915050600a8261222d91906142d7565b915061220a565b60008167ffffffffffffffff8111156122505761224f61469a565b5b6040519080825280601f01601f1916602001820160405280156122825781602001600182028036833780820191505090505b5090505b6000851461230f5760018261229b9190614362565b9150600a856122aa919061454f565b60306122b69190614281565b60f81b8183815181106122cc576122cb61466b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561230891906142d7565b9450612286565b8093505050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061247a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061248a5750612489826126c3565b5b9050919050565b6000816040516020016124a49190613cad565b604051602081830303815290604052805190602001209050919050565b60008060006124d0858561272d565b915091506124dd816127b0565b819250505092915050565b6124f3838383612985565b505050565b6001816000016000828254019250508190555050565b612528828260405180602001604052806000815250612a99565b5050565b600061254d8473ffffffffffffffffffffffffffffffffffffffff16612af4565b156126b6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612576611978565b8786866040518563ffffffff1660e01b81526004016125989493929190613d03565b602060405180830381600087803b1580156125b257600080fd5b505af19250505080156125e357506040513d601f19601f820116820180604052508101906125e091906135c2565b60015b612666573d8060008114612613576040519150601f19603f3d011682016040523d82523d6000602084013e612618565b606091505b5060008151141561265e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265590613e51565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506126bb565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008060418351141561276f5760008060006020860151925060408601519150606086015160001a905061276387828585612b07565b945094505050506127a9565b6040835114156127a0576000806020850151915060408501519050612795868383612c14565b9350935050506127a9565b60006002915091505b9250929050565b600060048111156127c4576127c36145de565b5b8160048111156127d7576127d66145de565b5b14156127e257612982565b600160048111156127f6576127f56145de565b5b816004811115612809576128086145de565b5b141561284a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284190613dd1565b60405180910390fd5b6002600481111561285e5761285d6145de565b5b816004811115612871576128706145de565b5b14156128b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a990613e11565b60405180910390fd5b600360048111156128c6576128c56145de565b5b8160048111156128d9576128d86145de565b5b141561291a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291190613f71565b60405180910390fd5b60048081111561292d5761292c6145de565b5b8160048111156129405761293f6145de565b5b1415612981576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297890614011565b60405180910390fd5b5b50565b612990838383612c62565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129d3576129ce81612c67565b612a12565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612a1157612a108382612cb0565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a5557612a5081612e1d565b612a94565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612a9357612a928282612eee565b5b5b505050565b612aa38383612f6d565b612ab0600084848461252c565b612aef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae690613e51565b60405180910390fd5b505050565b600080823b905060008111915050919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612b42576000600391509150612c0b565b601b8560ff1614158015612b5a5750601c8560ff1614155b15612b6c576000600491509150612c0b565b600060018787878760405160008152602001604052604051612b919493929190613d6a565b6020604051602081039080840390855afa158015612bb3573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612c0257600060019250925050612c0b565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c019050612c5487828885612b07565b935093505050935093915050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612cbd84610faf565b612cc79190614362565b9050600060076000848152602001908152602001600020549050818114612dac576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612e319190614362565b9050600060096000848152602001908152602001600020549050600060088381548110612e6157612e6061466b565b5b906000526020600020015490508060088381548110612e8357612e8261466b565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612ed257612ed161463c565b5b6001900381819060005260206000200160009055905550505050565b6000612ef983610faf565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612fdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fd490614031565b60405180910390fd5b612fe68161190c565b15613026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301d90613e91565b60405180910390fd5b613032600083836124e8565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130829190614281565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461314790614475565b90600052602060002090601f01602090048101928261316957600085556131b0565b82601f1061318257805160ff19168380011785556131b0565b828001600101855582156131b0579182015b828111156131af578251825591602001919060010190613194565b5b5090506131bd91906131c1565b5090565b5b808211156131da5760008160009055506001016131c2565b5090565b60006131f16131ec846141d1565b6141ac565b90508281526020810184848401111561320d5761320c6146d8565b5b613218848285614433565b509392505050565b600061323361322e84614202565b6141ac565b90508281526020810184848401111561324f5761324e6146d8565b5b61325a848285614433565b509392505050565b60008135905061327181614e85565b92915050565b60008135905061328681614e9c565b92915050565b60008135905061329b81614eb3565b92915050565b6000815190506132b081614eb3565b92915050565b60008083601f8401126132cc576132cb6146ce565b5b8235905067ffffffffffffffff8111156132e9576132e86146c9565b5b602083019150836001820283011115613305576133046146d3565b5b9250929050565b600082601f830112613321576133206146ce565b5b81356133318482602086016131de565b91505092915050565b60008151905061334981614eca565b92915050565b600082601f830112613364576133636146ce565b5b8135613374848260208601613220565b91505092915050565b60008135905061338c81614ee1565b92915050565b6000602082840312156133a8576133a76146e2565b5b60006133b684828501613262565b91505092915050565b600080604083850312156133d6576133d56146e2565b5b60006133e485828601613262565b92505060206133f585828601613262565b9150509250929050565b600080600060608486031215613418576134176146e2565b5b600061342686828701613262565b935050602061343786828701613262565b92505060406134488682870161337d565b9150509250925092565b6000806000806080858703121561346c5761346b6146e2565b5b600061347a87828801613262565b945050602061348b87828801613262565b935050604061349c8782880161337d565b925050606085013567ffffffffffffffff8111156134bd576134bc6146dd565b5b6134c98782880161330c565b91505092959194509250565b600080604083850312156134ec576134eb6146e2565b5b60006134fa85828601613262565b925050602061350b85828601613277565b9150509250929050565b6000806040838503121561352c5761352b6146e2565b5b600061353a85828601613262565b925050602061354b8582860161337d565b9150509250929050565b6000806040838503121561356c5761356b6146e2565b5b600061357a85828601613277565b925050602061358b85828601613277565b9150509250929050565b6000602082840312156135ab576135aa6146e2565b5b60006135b98482850161328c565b91505092915050565b6000602082840312156135d8576135d76146e2565b5b60006135e6848285016132a1565b91505092915050565b600060208284031215613605576136046146e2565b5b60006136138482850161333a565b91505092915050565b600060208284031215613632576136316146e2565b5b600082013567ffffffffffffffff8111156136505761364f6146dd565b5b61365c8482850161334f565b91505092915050565b60006020828403121561367b5761367a6146e2565b5b60006136898482850161337d565b91505092915050565b6000806000604084860312156136ab576136aa6146e2565b5b60006136b98682870161337d565b935050602084013567ffffffffffffffff8111156136da576136d96146dd565b5b6136e6868287016132b6565b92509250509250925092565b6136fb81614396565b82525050565b61371261370d82614396565b614521565b82525050565b613721816143a8565b82525050565b613730816143b4565b82525050565b613747613742826143b4565b614533565b82525050565b600061375882614233565b6137628185614249565b9350613772818560208601614442565b61377b816146e7565b840191505092915050565b60006137918261423e565b61379b8185614265565b93506137ab818560208601614442565b6137b4816146e7565b840191505092915050565b60006137ca8261423e565b6137d48185614276565b93506137e4818560208601614442565b80840191505092915050565b60006137fd601883614265565b915061380882614705565b602082019050919050565b6000613820600e83614265565b915061382b8261472e565b602082019050919050565b6000613843601f83614265565b915061384e82614757565b602082019050919050565b6000613866601c83614276565b915061387182614780565b601c82019050919050565b6000613889602b83614265565b9150613894826147a9565b604082019050919050565b60006138ac603283614265565b91506138b7826147f8565b604082019050919050565b60006138cf602683614265565b91506138da82614847565b604082019050919050565b60006138f2601c83614265565b91506138fd82614896565b602082019050919050565b6000613915601783614265565b9150613920826148bf565b602082019050919050565b6000613938600f83614265565b9150613943826148e8565b602082019050919050565b600061395b600f83614265565b915061396682614911565b602082019050919050565b600061397e601683614265565b91506139898261493a565b602082019050919050565b60006139a1602483614265565b91506139ac82614963565b604082019050919050565b60006139c4601983614265565b91506139cf826149b2565b602082019050919050565b60006139e7602283614265565b91506139f2826149db565b604082019050919050565b6000613a0a602c83614265565b9150613a1582614a2a565b604082019050919050565b6000613a2d603883614265565b9150613a3882614a79565b604082019050919050565b6000613a50602a83614265565b9150613a5b82614ac8565b604082019050919050565b6000613a73602983614265565b9150613a7e82614b17565b604082019050919050565b6000613a96602283614265565b9150613aa182614b66565b604082019050919050565b6000613ab9602083614265565b9150613ac482614bb5565b602082019050919050565b6000613adc602c83614265565b9150613ae782614bde565b604082019050919050565b6000613aff602083614265565b9150613b0a82614c2d565b602082019050919050565b6000613b22602983614265565b9150613b2d82614c56565b604082019050919050565b6000613b45602f83614265565b9150613b5082614ca5565b604082019050919050565b6000613b68601083614265565b9150613b7382614cf4565b602082019050919050565b6000613b8b602183614265565b9150613b9682614d1d565b604082019050919050565b6000613bae60008361425a565b9150613bb982614d6c565b600082019050919050565b6000613bd1603183614265565b9150613bdc82614d6f565b604082019050919050565b6000613bf4602c83614265565b9150613bff82614dbe565b604082019050919050565b6000613c17601183614265565b9150613c2282614e0d565b602082019050919050565b6000613c3a602183614265565b9150613c4582614e36565b604082019050919050565b613c598161441c565b82525050565b613c6881614426565b82525050565b6000613c7a8284613701565b60148201915081905092915050565b6000613c9582856137bf565b9150613ca182846137bf565b91508190509392505050565b6000613cb882613859565b9150613cc48284613736565b60208201915081905092915050565b6000613cde82613ba1565b9150819050919050565b6000602082019050613cfd60008301846136f2565b92915050565b6000608082019050613d1860008301876136f2565b613d2560208301866136f2565b613d326040830185613c50565b8181036060830152613d44818461374d565b905095945050505050565b6000602082019050613d646000830184613718565b92915050565b6000608082019050613d7f6000830187613727565b613d8c6020830186613c5f565b613d996040830185613727565b613da66060830184613727565b95945050505050565b60006020820190508181036000830152613dc98184613786565b905092915050565b60006020820190508181036000830152613dea816137f0565b9050919050565b60006020820190508181036000830152613e0a81613813565b9050919050565b60006020820190508181036000830152613e2a81613836565b9050919050565b60006020820190508181036000830152613e4a8161387c565b9050919050565b60006020820190508181036000830152613e6a8161389f565b9050919050565b60006020820190508181036000830152613e8a816138c2565b9050919050565b60006020820190508181036000830152613eaa816138e5565b9050919050565b60006020820190508181036000830152613eca81613908565b9050919050565b60006020820190508181036000830152613eea8161392b565b9050919050565b60006020820190508181036000830152613f0a8161394e565b9050919050565b60006020820190508181036000830152613f2a81613971565b9050919050565b60006020820190508181036000830152613f4a81613994565b9050919050565b60006020820190508181036000830152613f6a816139b7565b9050919050565b60006020820190508181036000830152613f8a816139da565b9050919050565b60006020820190508181036000830152613faa816139fd565b9050919050565b60006020820190508181036000830152613fca81613a20565b9050919050565b60006020820190508181036000830152613fea81613a43565b9050919050565b6000602082019050818103600083015261400a81613a66565b9050919050565b6000602082019050818103600083015261402a81613a89565b9050919050565b6000602082019050818103600083015261404a81613aac565b9050919050565b6000602082019050818103600083015261406a81613acf565b9050919050565b6000602082019050818103600083015261408a81613af2565b9050919050565b600060208201905081810360008301526140aa81613b15565b9050919050565b600060208201905081810360008301526140ca81613b38565b9050919050565b600060208201905081810360008301526140ea81613b5b565b9050919050565b6000602082019050818103600083015261410a81613b7e565b9050919050565b6000602082019050818103600083015261412a81613bc4565b9050919050565b6000602082019050818103600083015261414a81613be7565b9050919050565b6000602082019050818103600083015261416a81613c0a565b9050919050565b6000602082019050818103600083015261418a81613c2d565b9050919050565b60006020820190506141a66000830184613c50565b92915050565b60006141b66141c7565b90506141c282826144a7565b919050565b6000604051905090565b600067ffffffffffffffff8211156141ec576141eb61469a565b5b6141f5826146e7565b9050602081019050919050565b600067ffffffffffffffff82111561421d5761421c61469a565b5b614226826146e7565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061428c8261441c565b91506142978361441c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156142cc576142cb614580565b5b828201905092915050565b60006142e28261441c565b91506142ed8361441c565b9250826142fd576142fc6145af565b5b828204905092915050565b60006143138261441c565b915061431e8361441c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561435757614356614580565b5b828202905092915050565b600061436d8261441c565b91506143788361441c565b92508282101561438b5761438a614580565b5b828203905092915050565b60006143a1826143fc565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006143f582614396565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614460578082015181840152602081019050614445565b8381111561446f576000848401525b50505050565b6000600282049050600182168061448d57607f821691505b602082108114156144a1576144a061460d565b5b50919050565b6144b0826146e7565b810181811067ffffffffffffffff821117156144cf576144ce61469a565b5b80604052505050565b60006144e38261441c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561451657614515614580565b5b600182019050919050565b600061452c8261453d565b9050919050565b6000819050919050565b6000614548826146f8565b9050919050565b600061455a8261441c565b91506145658361441c565b925082614575576145746145af565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f53616c6520697320636c6f736564000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f496e636f727265637420746f6b656e7320616d6f756e74000000000000000000600082015250565b7f5769746864726177206661696c65640000000000000000000000000000000000600082015250565b7f496e636f72726563742070726963650000000000000000000000000000000000600082015250565b7f556e7665726966696564207472616e73616374696f6e00000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4c696d6974207065722077616c6c657400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f50726553616c6520697320636c6f736564000000000000000000000000000000600082015250565b7f4d696e74696e6720776f756c642065786365656420746f74616c20737570706c60008201527f7900000000000000000000000000000000000000000000000000000000000000602082015250565b614e8e81614396565b8114614e9957600080fd5b50565b614ea5816143a8565b8114614eb057600080fd5b50565b614ebc816143be565b8114614ec757600080fd5b50565b614ed3816143ea565b8114614ede57600080fd5b50565b614eea8161441c565b8114614ef557600080fd5b5056fea26469706673582212202de31b0133e91c3fb19279227c75f5524188a31ece1d301ebf16bdeeb253ab0164736f6c6343000807003368747470733a2f2f75732d63656e7472616c312d6e66742d70726f6a6563742d322e636c6f756466756e6374696f6e732e6e65742f746f6b656e2f000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1

Deployed Bytecode

0x6080604052600436106101d85760003560e01c806362dc6e21116101025780638da5cb5b11610095578063b88d4fde11610064578063b88d4fde1461067c578063c87b56dd146106a5578063e985e9c5146106e2578063f2fde38b1461071f576101d8565b80638da5cb5b146105d457806395d89b41146105ff5780639a5d140b1461062a578063a22cb46514610653576101d8565b806376d02b71116100d157806376d02b711461053c5780637f205a741461056757806382d29a0f14610592578063853828b6146105bd576101d8565b806362dc6e21146104805780636352211e146104ab57806370a08231146104e8578063715018a614610525576101d8565b80632f745c591161017a5780634875bccb116101495780634875bccb146103d55780634f6ccce7146103f15780635437988d1461042e57806355f804b314610457576101d8565b80632f745c591461031b57806332cb6b0c146103585780633340d62c1461038357806342842e0e146103ac576101d8565b8063095ea7b3116101b6578063095ea7b3146102825780630d06ed72146102ab57806318160ddd146102c757806323b872dd146102f2576101d8565b806301ffc9a7146101dd57806306fdde031461021a578063081812fc14610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190613595565b610748565b6040516102119190613d4f565b60405180910390f35b34801561022657600080fd5b5061022f61075a565b60405161023c9190613daf565b60405180910390f35b34801561025157600080fd5b5061026c60048036038101906102679190613665565b6107ec565b6040516102799190613ce8565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a49190613515565b610871565b005b6102c560048036038101906102c09190613692565b610989565b005b3480156102d357600080fd5b506102dc610ada565b6040516102e99190614191565b60405180910390f35b3480156102fe57600080fd5b50610319600480360381019061031491906133ff565b610ae7565b005b34801561032757600080fd5b50610342600480360381019061033d9190613515565b610b47565b60405161034f9190614191565b60405180910390f35b34801561036457600080fd5b5061036d610bec565b60405161037a9190614191565b60405180910390f35b34801561038f57600080fd5b506103aa60048036038101906103a59190613555565b610bf2565b005b3480156103b857600080fd5b506103d360048036038101906103ce91906133ff565b610ca6565b005b6103ef60048036038101906103ea9190613665565b610cc6565b005b3480156103fd57600080fd5b5061041860048036038101906104139190613665565b610d2b565b6040516104259190614191565b60405180910390f35b34801561043a57600080fd5b5061045560048036038101906104509190613392565b610d9c565b005b34801561046357600080fd5b5061047e6004803603810190610479919061361c565b610e5c565b005b34801561048c57600080fd5b50610495610ef2565b6040516104a29190614191565b60405180910390f35b3480156104b757600080fd5b506104d260048036038101906104cd9190613665565b610efd565b6040516104df9190613ce8565b60405180910390f35b3480156104f457600080fd5b5061050f600480360381019061050a9190613392565b610faf565b60405161051c9190614191565b60405180910390f35b34801561053157600080fd5b5061053a611067565b005b34801561054857600080fd5b506105516110ef565b60405161055e9190613d4f565b60405180910390f35b34801561057357600080fd5b5061057c611102565b6040516105899190614191565b60405180910390f35b34801561059e57600080fd5b506105a761110d565b6040516105b49190613d4f565b60405180910390f35b3480156105c957600080fd5b506105d2611120565b005b3480156105e057600080fd5b506105e9611252565b6040516105f69190613ce8565b60405180910390f35b34801561060b57600080fd5b5061061461127c565b6040516106219190613daf565b60405180910390f35b34801561063657600080fd5b50610651600480360381019061064c9190613665565b61130e565b005b34801561065f57600080fd5b5061067a600480360381019061067591906134d5565b61140e565b005b34801561068857600080fd5b506106a3600480360381019061069e9190613452565b61158f565b005b3480156106b157600080fd5b506106cc60048036038101906106c79190613665565b6115f1565b6040516106d99190613daf565b60405180910390f35b3480156106ee57600080fd5b50610709600480360381019061070491906133bf565b611698565b6040516107169190613d4f565b60405180910390f35b34801561072b57600080fd5b5061074660048036038101906107419190613392565b61179a565b005b600061075382611892565b9050919050565b60606000805461076990614475565b80601f016020809104026020016040519081016040528092919081815260200182805461079590614475565b80156107e25780601f106107b7576101008083540402835291602001916107e2565b820191906000526020600020905b8154815290600101906020018083116107c557829003601f168201915b5050505050905090565b60006107f78261190c565b610836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082d90614051565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061087c82610efd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e4906140f1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661090c611978565b73ffffffffffffffffffffffffffffffffffffffff16148061093b575061093a81610935611978565b611698565b5b61097a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097190613fb1565b60405180910390fd5b6109848383611a29565b505050565b600c60149054906101000a900460ff166109d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cf90614151565b60405180910390fd5b6000610a2f6109e5611978565b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611ae2565b9050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ac1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab890613f11565b60405180910390fd5b610ad460058566b1a2bc2ec50000611b24565b50505050565b6000600880549050905090565b610af8610af2611978565b82611c9e565b610b37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2e90614111565b60405180910390fd5b610b42838383611d7c565b505050565b6000610b5283610faf565b8210610b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8a90613e31565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61271081565b610bfa611978565b73ffffffffffffffffffffffffffffffffffffffff16610c18611252565b73ffffffffffffffffffffffffffffffffffffffff1614610c6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6590614071565b60405180910390fd5b81600c60146101000a81548160ff02191690831515021790555080600c60156101000a81548160ff0219169083151502179055505050565b610cc18383836040518060200160405280600081525061158f565b505050565b600c60159054906101000a900460ff16610d15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0c90613df1565b60405180910390fd5b610d28600a8266b1a2bc2ec50000611b24565b50565b6000610d35610ada565b8210610d76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6d90614131565b60405180910390fd5b60088281548110610d8a57610d8961466b565b5b90600052602060002001549050919050565b610da4611978565b73ffffffffffffffffffffffffffffffffffffffff16610dc2611252565b73ffffffffffffffffffffffffffffffffffffffff1614610e18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0f90614071565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610e64611978565b73ffffffffffffffffffffffffffffffffffffffff16610e82611252565b73ffffffffffffffffffffffffffffffffffffffff1614610ed8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecf90614071565b60405180910390fd5b80600e9080519060200190610eee92919061313b565b5050565b66b1a2bc2ec5000081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9d90613ff1565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611020576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101790613fd1565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61106f611978565b73ffffffffffffffffffffffffffffffffffffffff1661108d611252565b73ffffffffffffffffffffffffffffffffffffffff16146110e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110da90614071565b60405180910390fd5b6110ed6000611fd8565b565b600c60159054906101000a900460ff1681565b66b1a2bc2ec5000081565b600c60149054906101000a900460ff1681565b611128611978565b73ffffffffffffffffffffffffffffffffffffffff16611146611252565b73ffffffffffffffffffffffffffffffffffffffff161461119c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119390614071565b60405180910390fd5b60006111a6611978565b73ffffffffffffffffffffffffffffffffffffffff16476040516111c990613cd3565b60006040518083038185875af1925050503d8060008114611206576040519150601f19603f3d011682016040523d82523d6000602084013e61120b565b606091505b505090508061124f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124690613ed1565b60405180910390fd5b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461128b90614475565b80601f01602080910402602001604051908101604052809291908181526020018280546112b790614475565b80156113045780601f106112d957610100808354040283529160200191611304565b820191906000526020600020905b8154815290600101906020018083116112e757829003601f168201915b5050505050905090565b611316611978565b73ffffffffffffffffffffffffffffffffffffffff16611334611252565b73ffffffffffffffffffffffffffffffffffffffff161461138a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138190614071565b60405180910390fd5b61271081611398600d61209e565b6113a29190614281565b11156113e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113da90614171565b60405180910390fd5b60005b8181101561140a576113f7336120ac565b8080611402906144d8565b9150506113e6565b5050565b611416611978565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147b90613f51565b60405180910390fd5b8060056000611491611978565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661153e611978565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115839190613d4f565b60405180910390a35050565b6115a061159a611978565b83611c9e565b6115df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d690614111565b60405180910390fd5b6115eb848484846120cc565b50505050565b60606115fc8261190c565b61163b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611632906140b1565b60405180910390fd5b6000611645612128565b905060008151116116655760405180602001604052806000815250611690565b8061166f846121ba565b604051602001611680929190613c89565b6040516020818303038152906040525b915050919050565b600080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b81526004016117109190613ce8565b60206040518083038186803b15801561172857600080fd5b505afa15801561173c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061176091906135ef565b73ffffffffffffffffffffffffffffffffffffffff161415611786576001915050611794565b611790848461231b565b9150505b92915050565b6117a2611978565b73ffffffffffffffffffffffffffffffffffffffff166117c0611252565b73ffffffffffffffffffffffffffffffffffffffff1614611816576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180d90614071565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611886576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187d90613e71565b60405180910390fd5b61188f81611fd8565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806119055750611904826123af565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611a2257600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff818301511692505050611a26565b3390505b90565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a9c83610efd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611b1c611b1684604051602001611afb9190613c6e565b60405160208183030381529060405280519060200120612491565b836124c1565b905092915050565b82821115611b67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5e90613eb1565b60405180910390fd5b61271082611b75600d61209e565b611b7f9190614281565b1115611bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb790614171565b60405180910390fd5b8181611bcc9190614308565b341015611c0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0590613ef1565b60405180910390fd5b6000611c18611978565b90508383611c2583610faf565b611c2f9190614281565b1115611c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c67906140d1565b60405180910390fd5b60005b83811015611c9757611c84826120ac565b8080611c8f906144d8565b915050611c73565b5050505050565b6000611ca98261190c565b611ce8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdf90613f91565b60405180910390fd5b6000611cf383610efd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d6257508373ffffffffffffffffffffffffffffffffffffffff16611d4a846107ec565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d735750611d728185611698565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d9c82610efd565b73ffffffffffffffffffffffffffffffffffffffff1614611df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de990614091565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5990613f31565b60405180910390fd5b611e6d8383836124e8565b611e78600082611a29565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ec89190614362565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f1f9190614281565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b6120b6600d6124f8565b6120c9816120c4600d61209e565b61250e565b50565b6120d7848484611d7c565b6120e38484848461252c565b612122576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211990613e51565b60405180910390fd5b50505050565b6060600e805461213790614475565b80601f016020809104026020016040519081016040528092919081815260200182805461216390614475565b80156121b05780601f10612185576101008083540402835291602001916121b0565b820191906000526020600020905b81548152906001019060200180831161219357829003601f168201915b5050505050905090565b60606000821415612202576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612316565b600082905060005b6000821461223457808061221d906144d8565b915050600a8261222d91906142d7565b915061220a565b60008167ffffffffffffffff8111156122505761224f61469a565b5b6040519080825280601f01601f1916602001820160405280156122825781602001600182028036833780820191505090505b5090505b6000851461230f5760018261229b9190614362565b9150600a856122aa919061454f565b60306122b69190614281565b60f81b8183815181106122cc576122cb61466b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561230891906142d7565b9450612286565b8093505050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061247a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061248a5750612489826126c3565b5b9050919050565b6000816040516020016124a49190613cad565b604051602081830303815290604052805190602001209050919050565b60008060006124d0858561272d565b915091506124dd816127b0565b819250505092915050565b6124f3838383612985565b505050565b6001816000016000828254019250508190555050565b612528828260405180602001604052806000815250612a99565b5050565b600061254d8473ffffffffffffffffffffffffffffffffffffffff16612af4565b156126b6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612576611978565b8786866040518563ffffffff1660e01b81526004016125989493929190613d03565b602060405180830381600087803b1580156125b257600080fd5b505af19250505080156125e357506040513d601f19601f820116820180604052508101906125e091906135c2565b60015b612666573d8060008114612613576040519150601f19603f3d011682016040523d82523d6000602084013e612618565b606091505b5060008151141561265e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265590613e51565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506126bb565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008060418351141561276f5760008060006020860151925060408601519150606086015160001a905061276387828585612b07565b945094505050506127a9565b6040835114156127a0576000806020850151915060408501519050612795868383612c14565b9350935050506127a9565b60006002915091505b9250929050565b600060048111156127c4576127c36145de565b5b8160048111156127d7576127d66145de565b5b14156127e257612982565b600160048111156127f6576127f56145de565b5b816004811115612809576128086145de565b5b141561284a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284190613dd1565b60405180910390fd5b6002600481111561285e5761285d6145de565b5b816004811115612871576128706145de565b5b14156128b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a990613e11565b60405180910390fd5b600360048111156128c6576128c56145de565b5b8160048111156128d9576128d86145de565b5b141561291a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291190613f71565b60405180910390fd5b60048081111561292d5761292c6145de565b5b8160048111156129405761293f6145de565b5b1415612981576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297890614011565b60405180910390fd5b5b50565b612990838383612c62565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129d3576129ce81612c67565b612a12565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612a1157612a108382612cb0565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a5557612a5081612e1d565b612a94565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612a9357612a928282612eee565b5b5b505050565b612aa38383612f6d565b612ab0600084848461252c565b612aef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae690613e51565b60405180910390fd5b505050565b600080823b905060008111915050919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612b42576000600391509150612c0b565b601b8560ff1614158015612b5a5750601c8560ff1614155b15612b6c576000600491509150612c0b565b600060018787878760405160008152602001604052604051612b919493929190613d6a565b6020604051602081039080840390855afa158015612bb3573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612c0257600060019250925050612c0b565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c019050612c5487828885612b07565b935093505050935093915050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612cbd84610faf565b612cc79190614362565b9050600060076000848152602001908152602001600020549050818114612dac576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612e319190614362565b9050600060096000848152602001908152602001600020549050600060088381548110612e6157612e6061466b565b5b906000526020600020015490508060088381548110612e8357612e8261466b565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612ed257612ed161463c565b5b6001900381819060005260206000200160009055905550505050565b6000612ef983610faf565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612fdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fd490614031565b60405180910390fd5b612fe68161190c565b15613026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301d90613e91565b60405180910390fd5b613032600083836124e8565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130829190614281565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461314790614475565b90600052602060002090601f01602090048101928261316957600085556131b0565b82601f1061318257805160ff19168380011785556131b0565b828001600101855582156131b0579182015b828111156131af578251825591602001919060010190613194565b5b5090506131bd91906131c1565b5090565b5b808211156131da5760008160009055506001016131c2565b5090565b60006131f16131ec846141d1565b6141ac565b90508281526020810184848401111561320d5761320c6146d8565b5b613218848285614433565b509392505050565b600061323361322e84614202565b6141ac565b90508281526020810184848401111561324f5761324e6146d8565b5b61325a848285614433565b509392505050565b60008135905061327181614e85565b92915050565b60008135905061328681614e9c565b92915050565b60008135905061329b81614eb3565b92915050565b6000815190506132b081614eb3565b92915050565b60008083601f8401126132cc576132cb6146ce565b5b8235905067ffffffffffffffff8111156132e9576132e86146c9565b5b602083019150836001820283011115613305576133046146d3565b5b9250929050565b600082601f830112613321576133206146ce565b5b81356133318482602086016131de565b91505092915050565b60008151905061334981614eca565b92915050565b600082601f830112613364576133636146ce565b5b8135613374848260208601613220565b91505092915050565b60008135905061338c81614ee1565b92915050565b6000602082840312156133a8576133a76146e2565b5b60006133b684828501613262565b91505092915050565b600080604083850312156133d6576133d56146e2565b5b60006133e485828601613262565b92505060206133f585828601613262565b9150509250929050565b600080600060608486031215613418576134176146e2565b5b600061342686828701613262565b935050602061343786828701613262565b92505060406134488682870161337d565b9150509250925092565b6000806000806080858703121561346c5761346b6146e2565b5b600061347a87828801613262565b945050602061348b87828801613262565b935050604061349c8782880161337d565b925050606085013567ffffffffffffffff8111156134bd576134bc6146dd565b5b6134c98782880161330c565b91505092959194509250565b600080604083850312156134ec576134eb6146e2565b5b60006134fa85828601613262565b925050602061350b85828601613277565b9150509250929050565b6000806040838503121561352c5761352b6146e2565b5b600061353a85828601613262565b925050602061354b8582860161337d565b9150509250929050565b6000806040838503121561356c5761356b6146e2565b5b600061357a85828601613277565b925050602061358b85828601613277565b9150509250929050565b6000602082840312156135ab576135aa6146e2565b5b60006135b98482850161328c565b91505092915050565b6000602082840312156135d8576135d76146e2565b5b60006135e6848285016132a1565b91505092915050565b600060208284031215613605576136046146e2565b5b60006136138482850161333a565b91505092915050565b600060208284031215613632576136316146e2565b5b600082013567ffffffffffffffff8111156136505761364f6146dd565b5b61365c8482850161334f565b91505092915050565b60006020828403121561367b5761367a6146e2565b5b60006136898482850161337d565b91505092915050565b6000806000604084860312156136ab576136aa6146e2565b5b60006136b98682870161337d565b935050602084013567ffffffffffffffff8111156136da576136d96146dd565b5b6136e6868287016132b6565b92509250509250925092565b6136fb81614396565b82525050565b61371261370d82614396565b614521565b82525050565b613721816143a8565b82525050565b613730816143b4565b82525050565b613747613742826143b4565b614533565b82525050565b600061375882614233565b6137628185614249565b9350613772818560208601614442565b61377b816146e7565b840191505092915050565b60006137918261423e565b61379b8185614265565b93506137ab818560208601614442565b6137b4816146e7565b840191505092915050565b60006137ca8261423e565b6137d48185614276565b93506137e4818560208601614442565b80840191505092915050565b60006137fd601883614265565b915061380882614705565b602082019050919050565b6000613820600e83614265565b915061382b8261472e565b602082019050919050565b6000613843601f83614265565b915061384e82614757565b602082019050919050565b6000613866601c83614276565b915061387182614780565b601c82019050919050565b6000613889602b83614265565b9150613894826147a9565b604082019050919050565b60006138ac603283614265565b91506138b7826147f8565b604082019050919050565b60006138cf602683614265565b91506138da82614847565b604082019050919050565b60006138f2601c83614265565b91506138fd82614896565b602082019050919050565b6000613915601783614265565b9150613920826148bf565b602082019050919050565b6000613938600f83614265565b9150613943826148e8565b602082019050919050565b600061395b600f83614265565b915061396682614911565b602082019050919050565b600061397e601683614265565b91506139898261493a565b602082019050919050565b60006139a1602483614265565b91506139ac82614963565b604082019050919050565b60006139c4601983614265565b91506139cf826149b2565b602082019050919050565b60006139e7602283614265565b91506139f2826149db565b604082019050919050565b6000613a0a602c83614265565b9150613a1582614a2a565b604082019050919050565b6000613a2d603883614265565b9150613a3882614a79565b604082019050919050565b6000613a50602a83614265565b9150613a5b82614ac8565b604082019050919050565b6000613a73602983614265565b9150613a7e82614b17565b604082019050919050565b6000613a96602283614265565b9150613aa182614b66565b604082019050919050565b6000613ab9602083614265565b9150613ac482614bb5565b602082019050919050565b6000613adc602c83614265565b9150613ae782614bde565b604082019050919050565b6000613aff602083614265565b9150613b0a82614c2d565b602082019050919050565b6000613b22602983614265565b9150613b2d82614c56565b604082019050919050565b6000613b45602f83614265565b9150613b5082614ca5565b604082019050919050565b6000613b68601083614265565b9150613b7382614cf4565b602082019050919050565b6000613b8b602183614265565b9150613b9682614d1d565b604082019050919050565b6000613bae60008361425a565b9150613bb982614d6c565b600082019050919050565b6000613bd1603183614265565b9150613bdc82614d6f565b604082019050919050565b6000613bf4602c83614265565b9150613bff82614dbe565b604082019050919050565b6000613c17601183614265565b9150613c2282614e0d565b602082019050919050565b6000613c3a602183614265565b9150613c4582614e36565b604082019050919050565b613c598161441c565b82525050565b613c6881614426565b82525050565b6000613c7a8284613701565b60148201915081905092915050565b6000613c9582856137bf565b9150613ca182846137bf565b91508190509392505050565b6000613cb882613859565b9150613cc48284613736565b60208201915081905092915050565b6000613cde82613ba1565b9150819050919050565b6000602082019050613cfd60008301846136f2565b92915050565b6000608082019050613d1860008301876136f2565b613d2560208301866136f2565b613d326040830185613c50565b8181036060830152613d44818461374d565b905095945050505050565b6000602082019050613d646000830184613718565b92915050565b6000608082019050613d7f6000830187613727565b613d8c6020830186613c5f565b613d996040830185613727565b613da66060830184613727565b95945050505050565b60006020820190508181036000830152613dc98184613786565b905092915050565b60006020820190508181036000830152613dea816137f0565b9050919050565b60006020820190508181036000830152613e0a81613813565b9050919050565b60006020820190508181036000830152613e2a81613836565b9050919050565b60006020820190508181036000830152613e4a8161387c565b9050919050565b60006020820190508181036000830152613e6a8161389f565b9050919050565b60006020820190508181036000830152613e8a816138c2565b9050919050565b60006020820190508181036000830152613eaa816138e5565b9050919050565b60006020820190508181036000830152613eca81613908565b9050919050565b60006020820190508181036000830152613eea8161392b565b9050919050565b60006020820190508181036000830152613f0a8161394e565b9050919050565b60006020820190508181036000830152613f2a81613971565b9050919050565b60006020820190508181036000830152613f4a81613994565b9050919050565b60006020820190508181036000830152613f6a816139b7565b9050919050565b60006020820190508181036000830152613f8a816139da565b9050919050565b60006020820190508181036000830152613faa816139fd565b9050919050565b60006020820190508181036000830152613fca81613a20565b9050919050565b60006020820190508181036000830152613fea81613a43565b9050919050565b6000602082019050818103600083015261400a81613a66565b9050919050565b6000602082019050818103600083015261402a81613a89565b9050919050565b6000602082019050818103600083015261404a81613aac565b9050919050565b6000602082019050818103600083015261406a81613acf565b9050919050565b6000602082019050818103600083015261408a81613af2565b9050919050565b600060208201905081810360008301526140aa81613b15565b9050919050565b600060208201905081810360008301526140ca81613b38565b9050919050565b600060208201905081810360008301526140ea81613b5b565b9050919050565b6000602082019050818103600083015261410a81613b7e565b9050919050565b6000602082019050818103600083015261412a81613bc4565b9050919050565b6000602082019050818103600083015261414a81613be7565b9050919050565b6000602082019050818103600083015261416a81613c0a565b9050919050565b6000602082019050818103600083015261418a81613c2d565b9050919050565b60006020820190506141a66000830184613c50565b92915050565b60006141b66141c7565b90506141c282826144a7565b919050565b6000604051905090565b600067ffffffffffffffff8211156141ec576141eb61469a565b5b6141f5826146e7565b9050602081019050919050565b600067ffffffffffffffff82111561421d5761421c61469a565b5b614226826146e7565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061428c8261441c565b91506142978361441c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156142cc576142cb614580565b5b828201905092915050565b60006142e28261441c565b91506142ed8361441c565b9250826142fd576142fc6145af565b5b828204905092915050565b60006143138261441c565b915061431e8361441c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561435757614356614580565b5b828202905092915050565b600061436d8261441c565b91506143788361441c565b92508282101561438b5761438a614580565b5b828203905092915050565b60006143a1826143fc565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006143f582614396565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614460578082015181840152602081019050614445565b8381111561446f576000848401525b50505050565b6000600282049050600182168061448d57607f821691505b602082108114156144a1576144a061460d565b5b50919050565b6144b0826146e7565b810181811067ffffffffffffffff821117156144cf576144ce61469a565b5b80604052505050565b60006144e38261441c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561451657614515614580565b5b600182019050919050565b600061452c8261453d565b9050919050565b6000819050919050565b6000614548826146f8565b9050919050565b600061455a8261441c565b91506145658361441c565b925082614575576145746145af565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f53616c6520697320636c6f736564000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f496e636f727265637420746f6b656e7320616d6f756e74000000000000000000600082015250565b7f5769746864726177206661696c65640000000000000000000000000000000000600082015250565b7f496e636f72726563742070726963650000000000000000000000000000000000600082015250565b7f556e7665726966696564207472616e73616374696f6e00000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4c696d6974207065722077616c6c657400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f50726553616c6520697320636c6f736564000000000000000000000000000000600082015250565b7f4d696e74696e6720776f756c642065786365656420746f74616c20737570706c60008201527f7900000000000000000000000000000000000000000000000000000000000000602082015250565b614e8e81614396565b8114614e9957600080fd5b50565b614ea5816143a8565b8114614eb057600080fd5b50565b614ebc816143be565b8114614ec757600080fd5b50565b614ed3816143ea565b8114614ede57600080fd5b50565b614eea8161441c565b8114614ef557600080fd5b5056fea26469706673582212202de31b0133e91c3fb19279227c75f5524188a31ece1d301ebf16bdeeb253ab0164736f6c63430008070033

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

000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1

-----Decoded View---------------
Arg [0] : _proxyRegistryAddress (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1


Deployed Bytecode Sourcemap

54632:5377:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58722:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35275:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36834:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36357:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57559:345;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48023:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37724:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47691:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54742:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59621:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38134:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57380:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48213:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59509:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59399:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54791:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34969:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34699:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14974:94;;;;;;;;;;;;;:::i;:::-;;55064:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54848:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55020:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59831:175;;;;;;;;;;;;;:::i;:::-;;14323:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35444:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58943:325;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37127:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38390:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35619:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58037:452;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15223:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58722:212;58861:4;58890:36;58914:11;58890:23;:36::i;:::-;58883:43;;58722:212;;;:::o;35275:100::-;35329:13;35362:5;35355:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35275:100;:::o;36834:221::-;36910:7;36938:16;36946:7;36938;:16::i;:::-;36930:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37023:15;:24;37039:7;37023:24;;;;;;;;;;;;;;;;;;;;;37016:31;;36834:221;;;:::o;36357:411::-;36438:13;36454:23;36469:7;36454:14;:23::i;:::-;36438:39;;36502:5;36496:11;;:2;:11;;;;36488:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;36596:5;36580:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;36605:37;36622:5;36629:12;:10;:12::i;:::-;36605:16;:37::i;:::-;36580:62;36558:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;36739:21;36748:2;36752:7;36739:8;:21::i;:::-;36427:341;36357:411;;:::o;57559:345::-;57662:17;;;;;;;;;;;57654:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;57715:14;57732:39;57747:12;:10;:12::i;:::-;57761:9;;57732:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:14;:39::i;:::-;57715:56;;57803:9;;;;;;;;;;;57793:19;;:6;:19;;;57785:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;57853:43;57865:1;57868:12;54831:10;57853:11;:43::i;:::-;57643:261;57559:345;;;:::o;48023:113::-;48084:7;48111:10;:17;;;;48104:24;;48023:113;:::o;37724:339::-;37919:41;37938:12;:10;:12::i;:::-;37952:7;37919:18;:41::i;:::-;37911:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;38027:28;38037:4;38043:2;38047:7;38027:9;:28::i;:::-;37724:339;;;:::o;47691:256::-;47788:7;47824:23;47841:5;47824:16;:23::i;:::-;47816:5;:31;47808:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;47913:12;:19;47926:5;47913:19;;;;;;;;;;;;;;;:26;47933:5;47913:26;;;;;;;;;;;;47906:33;;47691:256;;;;:::o;54742:42::-;54779:5;54742:42;:::o;59621:201::-;14554:12;:10;:12::i;:::-;14543:23;;:7;:5;:7::i;:::-;:23;;;14535:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59757:16:::1;59737:17;;:36;;;;;;;;;;;;;;;;;;59801:13;59784:14;;:30;;;;;;;;;;;;;;;;;;59621:201:::0;;:::o;38134:185::-;38272:39;38289:4;38295:2;38299:7;38272:39;;;;;;;;;;;;:16;:39::i;:::-;38134:185;;;:::o;57380:170::-;57454:14;;;;;;;;;;;57446:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;57501;57513:2;57517:12;54885:10;57501:11;:41::i;:::-;57380:170;:::o;48213:233::-;48288:7;48324:30;:28;:30::i;:::-;48316:5;:38;48308:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;48421:10;48432:5;48421:17;;;;;;;;:::i;:::-;;;;;;;;;;48414:24;;48213:233;;;:::o;59509:103::-;14554:12;:10;:12::i;:::-;14543:23;;:7;:5;:7::i;:::-;:23;;;14535:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59592:12:::1;59580:9;;:24;;;;;;;;;;;;;;;;;;59509:103:::0;:::o;59399:101::-;14554:12;:10;:12::i;:::-;14543:23;;:7;:5;:7::i;:::-;:23;;;14535:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59485:7:::1;59470:12;:22;;;;;;;;;;;;:::i;:::-;;59399:101:::0;:::o;54791:50::-;54831:10;54791:50;:::o;34969:239::-;35041:7;35061:13;35077:7;:16;35085:7;35077:16;;;;;;;;;;;;;;;;;;;;;35061:32;;35129:1;35112:19;;:5;:19;;;;35104:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35195:5;35188:12;;;34969:239;;;:::o;34699:208::-;34771:7;34816:1;34799:19;;:5;:19;;;;34791:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;34883:9;:16;34893:5;34883:16;;;;;;;;;;;;;;;;34876:23;;34699:208;;;:::o;14974:94::-;14554:12;:10;:12::i;:::-;14543:23;;:7;:5;:7::i;:::-;:23;;;14535:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15039:21:::1;15057:1;15039:9;:21::i;:::-;14974:94::o:0;55064:34::-;;;;;;;;;;;;;:::o;54848:47::-;54885:10;54848:47;:::o;55020:37::-;;;;;;;;;;;;;:::o;59831:175::-;14554:12;:10;:12::i;:::-;14543:23;;:7;:5;:7::i;:::-;:23;;;14535:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59883:12:::1;59901;:10;:12::i;:::-;:17;;59926:21;59901:51;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59882:70;;;59971:7;59963:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;59871:135;59831:175::o:0;14323:87::-;14369:7;14396:6;;;;;;;;;;;14389:13;;14323:87;:::o;35444:104::-;35500:13;35533:7;35526:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35444:104;:::o;58943:325::-;14554:12;:10;:12::i;:::-;14543:23;;:7;:5;:7::i;:::-;:23;;;14535:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54779:5:::1;59065:12;59037:25;:15;:23;:25::i;:::-;:40;;;;:::i;:::-;:54;;59015:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;59171:9;59166:95;59190:12;59186:1;:16;59166:95;;;59224:25;59238:10;59224:13;:25::i;:::-;59204:3;;;;;:::i;:::-;;;;59166:95;;;;58943:325:::0;:::o;37127:295::-;37242:12;:10;:12::i;:::-;37230:24;;:8;:24;;;;37222:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;37342:8;37297:18;:32;37316:12;:10;:12::i;:::-;37297:32;;;;;;;;;;;;;;;:42;37330:8;37297:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;37395:8;37366:48;;37381:12;:10;:12::i;:::-;37366:48;;;37405:8;37366:48;;;;;;:::i;:::-;;;;;;;;37127:295;;:::o;38390:328::-;38565:41;38584:12;:10;:12::i;:::-;38598:7;38565:18;:41::i;:::-;38557:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;38671:39;38685:4;38691:2;38695:7;38704:5;38671:13;:39::i;:::-;38390:328;;;;:::o;35619:334::-;35692:13;35726:16;35734:7;35726;:16::i;:::-;35718:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;35807:21;35831:10;:8;:10::i;:::-;35807:34;;35883:1;35865:7;35859:21;:25;:86;;;;;;;;;;;;;;;;;35911:7;35920:18;:7;:16;:18::i;:::-;35894:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35859:86;35852:93;;;35619:334;;;:::o;58037:452::-;58164:4;58249:27;58293:20;;;;;;;;;;;58249:65;;58371:9;58329:51;;58337:13;:21;;;58359:6;58337:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58329:51;;;58325:95;;;58404:4;58397:11;;;;;58325:95;58440:41;58463:6;58471:9;58440:22;:41::i;:::-;58433:48;;;58037:452;;;;;:::o;15223:192::-;14554:12;:10;:12::i;:::-;14543:23;;:7;:5;:7::i;:::-;:23;;;14535:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15332:1:::1;15312:22;;:8;:22;;;;15304:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;15388:19;15398:8;15388:9;:19::i;:::-;15223:192:::0;:::o;47383:224::-;47485:4;47524:35;47509:50;;;:11;:50;;;;:90;;;;47563:36;47587:11;47563:23;:36::i;:::-;47509:90;47502:97;;47383:224;;;:::o;40228:127::-;40293:4;40345:1;40317:30;;:7;:16;40325:7;40317:16;;;;;;;;;;;;;;;;;;;;;:30;;;;40310:37;;40228:127;;;:::o;55538:611::-;55592:14;55645:4;55623:27;;:10;:27;;;55619:499;;;55667:18;55688:8;;55667:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55711:13;55727:8;;:15;;55711:31;;55979:42;55949:5;55942;55938:17;55932:24;55906:134;55896:144;;55766:289;;55619:499;;;56096:10;56087:19;;55619:499;55538:611;:::o;44210:174::-;44312:2;44285:15;:24;44301:7;44285:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;44368:7;44364:2;44330:46;;44339:23;44354:7;44339:14;:23::i;:::-;44330:46;;;;;;;;;;;;44210:174;;:::o;56158:340::-;56270:7;56310:180;56342:105;56420:6;56403:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;56393:35;;;;;;56342:28;:105::i;:::-;56466:9;56310:13;:180::i;:::-;56290:200;;56158:340;;;;:::o;56657:714::-;56819:11;56803:12;:27;;56795:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;54779:5;56920:12;56892:25;:15;:23;:25::i;:::-;:40;;;;:::i;:::-;56891:56;;56869:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;57054:12;57041:10;:25;;;;:::i;:::-;57027:9;:40;;57019:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57101:14;57118:12;:10;:12::i;:::-;57101:29;;57204:11;57187:12;57167:17;57177:6;57167:9;:17::i;:::-;:32;;;;:::i;:::-;57166:49;;57144:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;57278:9;57273:91;57297:12;57293:1;:16;57273:91;;;57331:21;57345:6;57331:13;:21::i;:::-;57311:3;;;;;:::i;:::-;;;;57273:91;;;;56784:587;56657:714;;;:::o;40522:348::-;40615:4;40640:16;40648:7;40640;:16::i;:::-;40632:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40716:13;40732:23;40747:7;40732:14;:23::i;:::-;40716:39;;40785:5;40774:16;;:7;:16;;;:51;;;;40818:7;40794:31;;:20;40806:7;40794:11;:20::i;:::-;:31;;;40774:51;:87;;;;40829:32;40846:5;40853:7;40829:16;:32::i;:::-;40774:87;40766:96;;;40522:348;;;;:::o;43514:578::-;43673:4;43646:31;;:23;43661:7;43646:14;:23::i;:::-;:31;;;43638:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;43756:1;43742:16;;:2;:16;;;;43734:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;43812:39;43833:4;43839:2;43843:7;43812:20;:39::i;:::-;43916:29;43933:1;43937:7;43916:8;:29::i;:::-;43977:1;43958:9;:15;43968:4;43958:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;44006:1;43989:9;:13;43999:2;43989:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;44037:2;44018:7;:16;44026:7;44018:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;44076:7;44072:2;44057:27;;44066:4;44057:27;;;;;;;;;;;;43514:578;;;:::o;15423:173::-;15479:16;15498:6;;;;;;;;;;;15479:25;;15524:8;15515:6;;:17;;;;;;;;;;;;;;;;;;15579:8;15548:40;;15569:8;15548:40;;;;;;;;;;;;15468:128;15423:173;:::o;9823:114::-;9888:7;9915;:14;;;9908:21;;9823:114;;;:::o;56507:141::-;56562:27;:15;:25;:27::i;:::-;56600:40;56610:2;56614:25;:15;:23;:25::i;:::-;56600:9;:40::i;:::-;56507:141;:::o;39600:315::-;39757:28;39767:4;39773:2;39777:7;39757:9;:28::i;:::-;39804:48;39827:4;39833:2;39837:7;39846:5;39804:22;:48::i;:::-;39796:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;39600:315;;;;:::o;59277:113::-;59337:13;59370:12;59363:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59277:113;:::o;10727:723::-;10783:13;11013:1;11004:5;:10;11000:53;;;11031:10;;;;;;;;;;;;;;;;;;;;;11000:53;11063:12;11078:5;11063:20;;11094:14;11119:78;11134:1;11126:4;:9;11119:78;;11152:8;;;;;:::i;:::-;;;;11183:2;11175:10;;;;;:::i;:::-;;;11119:78;;;11207:19;11239:6;11229:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11207:39;;11257:154;11273:1;11264:5;:10;11257:154;;11301:1;11291:11;;;;;:::i;:::-;;;11368:2;11360:5;:10;;;;:::i;:::-;11347:2;:24;;;;:::i;:::-;11334:39;;11317:6;11324;11317:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;11397:2;11388:11;;;;;:::i;:::-;;;11257:154;;;11435:6;11421:21;;;;;10727:723;;;;:::o;37493:164::-;37590:4;37614:18;:25;37633:5;37614:25;;;;;;;;;;;;;;;:35;37640:8;37614:35;;;;;;;;;;;;;;;;;;;;;;;;;37607:42;;37493:164;;;;:::o;34330:305::-;34432:4;34484:25;34469:40;;;:11;:40;;;;:105;;;;34541:33;34526:48;;;:11;:48;;;;34469:105;:158;;;;34591:36;34615:11;34591:23;:36::i;:::-;34469:158;34449:178;;34330:305;;;:::o;8184:269::-;8253:7;8439:4;8386:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;8376:69;;;;;;8369:76;;8184:269;;;:::o;4335:231::-;4413:7;4434:17;4453:18;4475:27;4486:4;4492:9;4475:10;:27::i;:::-;4433:69;;;;4513:18;4525:5;4513:11;:18::i;:::-;4549:9;4542:16;;;;4335:231;;;;:::o;58498:215::-;58660:45;58687:4;58693:2;58697:7;58660:26;:45::i;:::-;58498:215;;;:::o;9945:127::-;10052:1;10034:7;:14;;;:19;;;;;;;;;;;9945:127;:::o;41212:110::-;41288:26;41298:2;41302:7;41288:26;;;;;;;;;;;;:9;:26::i;:::-;41212:110;;:::o;44949:799::-;45104:4;45125:15;:2;:13;;;:15::i;:::-;45121:620;;;45177:2;45161:36;;;45198:12;:10;:12::i;:::-;45212:4;45218:7;45227:5;45161:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;45157:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45420:1;45403:6;:13;:18;45399:272;;;45446:60;;;;;;;;;;:::i;:::-;;;;;;;;45399:272;45621:6;45615:13;45606:6;45602:2;45598:15;45591:38;45157:529;45294:41;;;45284:51;;;:6;:51;;;;45277:58;;;;;45121:620;45725:4;45718:11;;44949:799;;;;;;;:::o;26309:157::-;26394:4;26433:25;26418:40;;;:11;:40;;;;26411:47;;26309:157;;;:::o;2225:1308::-;2306:7;2315:12;2560:2;2540:9;:16;:22;2536:990;;;2579:9;2603;2627:7;2836:4;2825:9;2821:20;2815:27;2810:32;;2886:4;2875:9;2871:20;2865:27;2860:32;;2944:4;2933:9;2929:20;2923:27;2920:1;2915:36;2910:41;;2987:25;2998:4;3004:1;3007;3010;2987:10;:25::i;:::-;2980:32;;;;;;;;;2536:990;3054:2;3034:9;:16;:22;3030:496;;;3073:9;3097:10;3309:4;3298:9;3294:20;3288:27;3283:32;;3360:4;3349:9;3345:20;3339:27;3333:33;;3402:23;3413:4;3419:1;3422:2;3402:10;:23::i;:::-;3395:30;;;;;;;;3030:496;3474:1;3478:35;3458:56;;;;2225:1308;;;;;;:::o;496:643::-;574:20;565:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;561:571;;;611:7;;561:571;672:29;663:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;659:473;;;718:34;;;;;;;;;;:::i;:::-;;;;;;;;659:473;783:35;774:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;770:362;;;835:41;;;;;;;;;;:::i;:::-;;;;;;;;770:362;907:30;898:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;894:238;;;954:44;;;;;;;;;;:::i;:::-;;;;;;;;894:238;1029:30;1020:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;1016:116;;;1076:44;;;;;;;;;;:::i;:::-;;;;;;;;1016:116;496:643;;:::o;49059:589::-;49203:45;49230:4;49236:2;49240:7;49203:26;:45::i;:::-;49281:1;49265:18;;:4;:18;;;49261:187;;;49300:40;49332:7;49300:31;:40::i;:::-;49261:187;;;49370:2;49362:10;;:4;:10;;;49358:90;;49389:47;49422:4;49428:7;49389:32;:47::i;:::-;49358:90;49261:187;49476:1;49462:16;;:2;:16;;;49458:183;;;49495:45;49532:7;49495:36;:45::i;:::-;49458:183;;;49568:4;49562:10;;:2;:10;;;49558:83;;49589:40;49617:2;49621:7;49589:27;:40::i;:::-;49558:83;49458:183;49059:589;;;:::o;41549:321::-;41679:18;41685:2;41689:7;41679:5;:18::i;:::-;41730:54;41761:1;41765:2;41769:7;41778:5;41730:22;:54::i;:::-;41708:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;41549:321;;;:::o;16369:387::-;16429:4;16637:12;16704:7;16692:20;16684:28;;16747:1;16740:4;:8;16733:15;;;16369:387;;;:::o;5834:1632::-;5965:7;5974:12;6899:66;6894:1;6886:10;;:79;6882:163;;;6998:1;7002:30;6982:51;;;;;;6882:163;7064:2;7059:1;:7;;;;:18;;;;;7075:2;7070:1;:7;;;;7059:18;7055:102;;;7110:1;7114:30;7094:51;;;;;;7055:102;7254:14;7271:24;7281:4;7287:1;7290;7293;7271:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7254:41;;7328:1;7310:20;;:6;:20;;;7306:103;;;7363:1;7367:29;7347:50;;;;;;;7306:103;7429:6;7437:20;7421:37;;;;;5834:1632;;;;;;;;:::o;4829:391::-;4943:7;4952:12;4977:9;4997:7;5052:66;5048:2;5044:75;5039:80;;5156:2;5151;5146:3;5142:12;5138:21;5133:26;;5187:25;5198:4;5204:1;5207;5210;5187:10;:25::i;:::-;5180:32;;;;;;4829:391;;;;;;:::o;46320:126::-;;;;:::o;50371:164::-;50475:10;:17;;;;50448:15;:24;50464:7;50448:24;;;;;;;;;;;:44;;;;50503:10;50519:7;50503:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50371:164;:::o;51162:988::-;51428:22;51478:1;51453:22;51470:4;51453:16;:22::i;:::-;:26;;;;:::i;:::-;51428:51;;51490:18;51511:17;:26;51529:7;51511:26;;;;;;;;;;;;51490:47;;51658:14;51644:10;:28;51640:328;;51689:19;51711:12;:18;51724:4;51711:18;;;;;;;;;;;;;;;:34;51730:14;51711:34;;;;;;;;;;;;51689:56;;51795:11;51762:12;:18;51775:4;51762:18;;;;;;;;;;;;;;;:30;51781:10;51762:30;;;;;;;;;;;:44;;;;51912:10;51879:17;:30;51897:11;51879:30;;;;;;;;;;;:43;;;;51674:294;51640:328;52064:17;:26;52082:7;52064:26;;;;;;;;;;;52057:33;;;52108:12;:18;52121:4;52108:18;;;;;;;;;;;;;;;:34;52127:14;52108:34;;;;;;;;;;;52101:41;;;51243:907;;51162:988;;:::o;52445:1079::-;52698:22;52743:1;52723:10;:17;;;;:21;;;;:::i;:::-;52698:46;;52755:18;52776:15;:24;52792:7;52776:24;;;;;;;;;;;;52755:45;;53127:19;53149:10;53160:14;53149:26;;;;;;;;:::i;:::-;;;;;;;;;;53127:48;;53213:11;53188:10;53199;53188:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;53324:10;53293:15;:28;53309:11;53293:28;;;;;;;;;;;:41;;;;53465:15;:24;53481:7;53465:24;;;;;;;;;;;53458:31;;;53500:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;52516:1008;;;52445:1079;:::o;49949:221::-;50034:14;50051:20;50068:2;50051:16;:20::i;:::-;50034:37;;50109:7;50082:12;:16;50095:2;50082:16;;;;;;;;;;;;;;;:24;50099:6;50082:24;;;;;;;;;;;:34;;;;50156:6;50127:17;:26;50145:7;50127:26;;;;;;;;;;;:35;;;;50023:147;49949:221;;:::o;42206:382::-;42300:1;42286:16;;:2;:16;;;;42278:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;42359:16;42367:7;42359;:16::i;:::-;42358:17;42350:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;42421:45;42450:1;42454:2;42458:7;42421:20;:45::i;:::-;42496:1;42479:9;:13;42489:2;42479:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;42527:2;42508:7;:16;42516:7;42508:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;42572:7;42568:2;42547:33;;42564:1;42547:33;;;;;;;;;;;;42206:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:552::-;1485:8;1495:6;1545:3;1538:4;1530:6;1526:17;1522:27;1512:122;;1553:79;;:::i;:::-;1512:122;1666:6;1653:20;1643:30;;1696:18;1688:6;1685:30;1682:117;;;1718:79;;:::i;:::-;1682:117;1832:4;1824:6;1820:17;1808:29;;1886:3;1878:4;1870:6;1866:17;1856:8;1852:32;1849:41;1846:128;;;1893:79;;:::i;:::-;1846:128;1428:552;;;;;:::o;1999:338::-;2054:5;2103:3;2096:4;2088:6;2084:17;2080:27;2070:122;;2111:79;;:::i;:::-;2070:122;2228:6;2215:20;2253:78;2327:3;2319:6;2312:4;2304:6;2300:17;2253:78;:::i;:::-;2244:87;;2060:277;1999:338;;;;:::o;2343:201::-;2429:5;2460:6;2454:13;2445:22;;2476:62;2532:5;2476:62;:::i;:::-;2343:201;;;;:::o;2564:340::-;2620:5;2669:3;2662:4;2654:6;2650:17;2646:27;2636:122;;2677:79;;:::i;:::-;2636:122;2794:6;2781:20;2819:79;2894:3;2886:6;2879:4;2871:6;2867:17;2819:79;:::i;:::-;2810:88;;2626:278;2564:340;;;;:::o;2910:139::-;2956:5;2994:6;2981:20;2972:29;;3010:33;3037:5;3010:33;:::i;:::-;2910:139;;;;:::o;3055:329::-;3114:6;3163:2;3151:9;3142:7;3138:23;3134:32;3131:119;;;3169:79;;:::i;:::-;3131:119;3289:1;3314:53;3359:7;3350:6;3339:9;3335:22;3314:53;:::i;:::-;3304:63;;3260:117;3055:329;;;;:::o;3390:474::-;3458:6;3466;3515:2;3503:9;3494:7;3490:23;3486:32;3483:119;;;3521:79;;:::i;:::-;3483:119;3641:1;3666:53;3711:7;3702:6;3691:9;3687:22;3666:53;:::i;:::-;3656:63;;3612:117;3768:2;3794:53;3839:7;3830:6;3819:9;3815:22;3794:53;:::i;:::-;3784:63;;3739:118;3390:474;;;;;:::o;3870:619::-;3947:6;3955;3963;4012:2;4000:9;3991:7;3987:23;3983:32;3980:119;;;4018:79;;:::i;:::-;3980:119;4138:1;4163:53;4208:7;4199:6;4188:9;4184:22;4163:53;:::i;:::-;4153:63;;4109:117;4265:2;4291:53;4336:7;4327:6;4316:9;4312:22;4291:53;:::i;:::-;4281:63;;4236:118;4393:2;4419:53;4464:7;4455:6;4444:9;4440:22;4419:53;:::i;:::-;4409:63;;4364:118;3870:619;;;;;:::o;4495:943::-;4590:6;4598;4606;4614;4663:3;4651:9;4642:7;4638:23;4634:33;4631:120;;;4670:79;;:::i;:::-;4631:120;4790:1;4815:53;4860:7;4851:6;4840:9;4836:22;4815:53;:::i;:::-;4805:63;;4761:117;4917:2;4943:53;4988:7;4979:6;4968:9;4964:22;4943:53;:::i;:::-;4933:63;;4888:118;5045:2;5071:53;5116:7;5107:6;5096:9;5092:22;5071:53;:::i;:::-;5061:63;;5016:118;5201:2;5190:9;5186:18;5173:32;5232:18;5224:6;5221:30;5218:117;;;5254:79;;:::i;:::-;5218:117;5359:62;5413:7;5404:6;5393:9;5389:22;5359:62;:::i;:::-;5349:72;;5144:287;4495:943;;;;;;;:::o;5444:468::-;5509:6;5517;5566:2;5554:9;5545:7;5541:23;5537:32;5534:119;;;5572:79;;:::i;:::-;5534:119;5692:1;5717:53;5762:7;5753:6;5742:9;5738:22;5717:53;:::i;:::-;5707:63;;5663:117;5819:2;5845:50;5887:7;5878:6;5867:9;5863:22;5845:50;:::i;:::-;5835:60;;5790:115;5444:468;;;;;:::o;5918:474::-;5986:6;5994;6043:2;6031:9;6022:7;6018:23;6014:32;6011:119;;;6049:79;;:::i;:::-;6011:119;6169:1;6194:53;6239:7;6230:6;6219:9;6215:22;6194:53;:::i;:::-;6184:63;;6140:117;6296:2;6322:53;6367:7;6358:6;6347:9;6343:22;6322:53;:::i;:::-;6312:63;;6267:118;5918:474;;;;;:::o;6398:462::-;6460:6;6468;6517:2;6505:9;6496:7;6492:23;6488:32;6485:119;;;6523:79;;:::i;:::-;6485:119;6643:1;6668:50;6710:7;6701:6;6690:9;6686:22;6668:50;:::i;:::-;6658:60;;6614:114;6767:2;6793:50;6835:7;6826:6;6815:9;6811:22;6793:50;:::i;:::-;6783:60;;6738:115;6398:462;;;;;:::o;6866:327::-;6924:6;6973:2;6961:9;6952:7;6948:23;6944:32;6941:119;;;6979:79;;:::i;:::-;6941:119;7099:1;7124:52;7168:7;7159:6;7148:9;7144:22;7124:52;:::i;:::-;7114:62;;7070:116;6866:327;;;;:::o;7199:349::-;7268:6;7317:2;7305:9;7296:7;7292:23;7288:32;7285:119;;;7323:79;;:::i;:::-;7285:119;7443:1;7468:63;7523:7;7514:6;7503:9;7499:22;7468:63;:::i;:::-;7458:73;;7414:127;7199:349;;;;:::o;7554:409::-;7653:6;7702:2;7690:9;7681:7;7677:23;7673:32;7670:119;;;7708:79;;:::i;:::-;7670:119;7828:1;7853:93;7938:7;7929:6;7918:9;7914:22;7853:93;:::i;:::-;7843:103;;7799:157;7554:409;;;;:::o;7969:509::-;8038:6;8087:2;8075:9;8066:7;8062:23;8058:32;8055:119;;;8093:79;;:::i;:::-;8055:119;8241:1;8230:9;8226:17;8213:31;8271:18;8263:6;8260:30;8257:117;;;8293:79;;:::i;:::-;8257:117;8398:63;8453:7;8444:6;8433:9;8429:22;8398:63;:::i;:::-;8388:73;;8184:287;7969:509;;;;:::o;8484:329::-;8543:6;8592:2;8580:9;8571:7;8567:23;8563:32;8560:119;;;8598:79;;:::i;:::-;8560:119;8718:1;8743:53;8788:7;8779:6;8768:9;8764:22;8743:53;:::i;:::-;8733:63;;8689:117;8484:329;;;;:::o;8819:672::-;8898:6;8906;8914;8963:2;8951:9;8942:7;8938:23;8934:32;8931:119;;;8969:79;;:::i;:::-;8931:119;9089:1;9114:53;9159:7;9150:6;9139:9;9135:22;9114:53;:::i;:::-;9104:63;;9060:117;9244:2;9233:9;9229:18;9216:32;9275:18;9267:6;9264:30;9261:117;;;9297:79;;:::i;:::-;9261:117;9410:64;9466:7;9457:6;9446:9;9442:22;9410:64;:::i;:::-;9392:82;;;;9187:297;8819:672;;;;;:::o;9497:118::-;9584:24;9602:5;9584:24;:::i;:::-;9579:3;9572:37;9497:118;;:::o;9621:157::-;9726:45;9746:24;9764:5;9746:24;:::i;:::-;9726:45;:::i;:::-;9721:3;9714:58;9621:157;;:::o;9784:109::-;9865:21;9880:5;9865:21;:::i;:::-;9860:3;9853:34;9784:109;;:::o;9899:118::-;9986:24;10004:5;9986:24;:::i;:::-;9981:3;9974:37;9899:118;;:::o;10023:157::-;10128:45;10148:24;10166:5;10148:24;:::i;:::-;10128:45;:::i;:::-;10123:3;10116:58;10023:157;;:::o;10186:360::-;10272:3;10300:38;10332:5;10300:38;:::i;:::-;10354:70;10417:6;10412:3;10354:70;:::i;:::-;10347:77;;10433:52;10478:6;10473:3;10466:4;10459:5;10455:16;10433:52;:::i;:::-;10510:29;10532:6;10510:29;:::i;:::-;10505:3;10501:39;10494:46;;10276:270;10186:360;;;;:::o;10552:364::-;10640:3;10668:39;10701:5;10668:39;:::i;:::-;10723:71;10787:6;10782:3;10723:71;:::i;:::-;10716:78;;10803:52;10848:6;10843:3;10836:4;10829:5;10825:16;10803:52;:::i;:::-;10880:29;10902:6;10880:29;:::i;:::-;10875:3;10871:39;10864:46;;10644:272;10552:364;;;;:::o;10922:377::-;11028:3;11056:39;11089:5;11056:39;:::i;:::-;11111:89;11193:6;11188:3;11111:89;:::i;:::-;11104:96;;11209:52;11254:6;11249:3;11242:4;11235:5;11231:16;11209:52;:::i;:::-;11286:6;11281:3;11277:16;11270:23;;11032:267;10922:377;;;;:::o;11305:366::-;11447:3;11468:67;11532:2;11527:3;11468:67;:::i;:::-;11461:74;;11544:93;11633:3;11544:93;:::i;:::-;11662:2;11657:3;11653:12;11646:19;;11305:366;;;:::o;11677:::-;11819:3;11840:67;11904:2;11899:3;11840:67;:::i;:::-;11833:74;;11916:93;12005:3;11916:93;:::i;:::-;12034:2;12029:3;12025:12;12018:19;;11677:366;;;:::o;12049:::-;12191:3;12212:67;12276:2;12271:3;12212:67;:::i;:::-;12205:74;;12288:93;12377:3;12288:93;:::i;:::-;12406:2;12401:3;12397:12;12390:19;;12049:366;;;:::o;12421:402::-;12581:3;12602:85;12684:2;12679:3;12602:85;:::i;:::-;12595:92;;12696:93;12785:3;12696:93;:::i;:::-;12814:2;12809:3;12805:12;12798:19;;12421:402;;;:::o;12829:366::-;12971:3;12992:67;13056:2;13051:3;12992:67;:::i;:::-;12985:74;;13068:93;13157:3;13068:93;:::i;:::-;13186:2;13181:3;13177:12;13170:19;;12829:366;;;:::o;13201:::-;13343:3;13364:67;13428:2;13423:3;13364:67;:::i;:::-;13357:74;;13440:93;13529:3;13440:93;:::i;:::-;13558:2;13553:3;13549:12;13542:19;;13201:366;;;:::o;13573:::-;13715:3;13736:67;13800:2;13795:3;13736:67;:::i;:::-;13729:74;;13812:93;13901:3;13812:93;:::i;:::-;13930:2;13925:3;13921:12;13914:19;;13573:366;;;:::o;13945:::-;14087:3;14108:67;14172:2;14167:3;14108:67;:::i;:::-;14101:74;;14184:93;14273:3;14184:93;:::i;:::-;14302:2;14297:3;14293:12;14286:19;;13945:366;;;:::o;14317:::-;14459:3;14480:67;14544:2;14539:3;14480:67;:::i;:::-;14473:74;;14556:93;14645:3;14556:93;:::i;:::-;14674:2;14669:3;14665:12;14658:19;;14317:366;;;:::o;14689:::-;14831:3;14852:67;14916:2;14911:3;14852:67;:::i;:::-;14845:74;;14928:93;15017:3;14928:93;:::i;:::-;15046:2;15041:3;15037:12;15030:19;;14689:366;;;:::o;15061:::-;15203:3;15224:67;15288:2;15283:3;15224:67;:::i;:::-;15217:74;;15300:93;15389:3;15300:93;:::i;:::-;15418:2;15413:3;15409:12;15402:19;;15061:366;;;:::o;15433:::-;15575:3;15596:67;15660:2;15655:3;15596:67;:::i;:::-;15589:74;;15672:93;15761:3;15672:93;:::i;:::-;15790:2;15785:3;15781:12;15774:19;;15433:366;;;:::o;15805:::-;15947:3;15968:67;16032:2;16027:3;15968:67;:::i;:::-;15961:74;;16044:93;16133:3;16044:93;:::i;:::-;16162:2;16157:3;16153:12;16146:19;;15805:366;;;:::o;16177:::-;16319:3;16340:67;16404:2;16399:3;16340:67;:::i;:::-;16333:74;;16416:93;16505:3;16416:93;:::i;:::-;16534:2;16529:3;16525:12;16518:19;;16177:366;;;:::o;16549:::-;16691:3;16712:67;16776:2;16771:3;16712:67;:::i;:::-;16705:74;;16788:93;16877:3;16788:93;:::i;:::-;16906:2;16901:3;16897:12;16890:19;;16549:366;;;:::o;16921:::-;17063:3;17084:67;17148:2;17143:3;17084:67;:::i;:::-;17077:74;;17160:93;17249:3;17160:93;:::i;:::-;17278:2;17273:3;17269:12;17262:19;;16921:366;;;:::o;17293:::-;17435:3;17456:67;17520:2;17515:3;17456:67;:::i;:::-;17449:74;;17532:93;17621:3;17532:93;:::i;:::-;17650:2;17645:3;17641:12;17634:19;;17293:366;;;:::o;17665:::-;17807:3;17828:67;17892:2;17887:3;17828:67;:::i;:::-;17821:74;;17904:93;17993:3;17904:93;:::i;:::-;18022:2;18017:3;18013:12;18006:19;;17665:366;;;:::o;18037:::-;18179:3;18200:67;18264:2;18259:3;18200:67;:::i;:::-;18193:74;;18276:93;18365:3;18276:93;:::i;:::-;18394:2;18389:3;18385:12;18378:19;;18037:366;;;:::o;18409:::-;18551:3;18572:67;18636:2;18631:3;18572:67;:::i;:::-;18565:74;;18648:93;18737:3;18648:93;:::i;:::-;18766:2;18761:3;18757:12;18750:19;;18409:366;;;:::o;18781:::-;18923:3;18944:67;19008:2;19003:3;18944:67;:::i;:::-;18937:74;;19020:93;19109:3;19020:93;:::i;:::-;19138:2;19133:3;19129:12;19122:19;;18781:366;;;:::o;19153:::-;19295:3;19316:67;19380:2;19375:3;19316:67;:::i;:::-;19309:74;;19392:93;19481:3;19392:93;:::i;:::-;19510:2;19505:3;19501:12;19494:19;;19153:366;;;:::o;19525:::-;19667:3;19688:67;19752:2;19747:3;19688:67;:::i;:::-;19681:74;;19764:93;19853:3;19764:93;:::i;:::-;19882:2;19877:3;19873:12;19866:19;;19525:366;;;:::o;19897:::-;20039:3;20060:67;20124:2;20119:3;20060:67;:::i;:::-;20053:74;;20136:93;20225:3;20136:93;:::i;:::-;20254:2;20249:3;20245:12;20238:19;;19897:366;;;:::o;20269:::-;20411:3;20432:67;20496:2;20491:3;20432:67;:::i;:::-;20425:74;;20508:93;20597:3;20508:93;:::i;:::-;20626:2;20621:3;20617:12;20610:19;;20269:366;;;:::o;20641:::-;20783:3;20804:67;20868:2;20863:3;20804:67;:::i;:::-;20797:74;;20880:93;20969:3;20880:93;:::i;:::-;20998:2;20993:3;20989:12;20982:19;;20641:366;;;:::o;21013:::-;21155:3;21176:67;21240:2;21235:3;21176:67;:::i;:::-;21169:74;;21252:93;21341:3;21252:93;:::i;:::-;21370:2;21365:3;21361:12;21354:19;;21013:366;;;:::o;21385:398::-;21544:3;21565:83;21646:1;21641:3;21565:83;:::i;:::-;21558:90;;21657:93;21746:3;21657:93;:::i;:::-;21775:1;21770:3;21766:11;21759:18;;21385:398;;;:::o;21789:366::-;21931:3;21952:67;22016:2;22011:3;21952:67;:::i;:::-;21945:74;;22028:93;22117:3;22028:93;:::i;:::-;22146:2;22141:3;22137:12;22130:19;;21789:366;;;:::o;22161:::-;22303:3;22324:67;22388:2;22383:3;22324:67;:::i;:::-;22317:74;;22400:93;22489:3;22400:93;:::i;:::-;22518:2;22513:3;22509:12;22502:19;;22161:366;;;:::o;22533:::-;22675:3;22696:67;22760:2;22755:3;22696:67;:::i;:::-;22689:74;;22772:93;22861:3;22772:93;:::i;:::-;22890:2;22885:3;22881:12;22874:19;;22533:366;;;:::o;22905:::-;23047:3;23068:67;23132:2;23127:3;23068:67;:::i;:::-;23061:74;;23144:93;23233:3;23144:93;:::i;:::-;23262:2;23257:3;23253:12;23246:19;;22905:366;;;:::o;23277:118::-;23364:24;23382:5;23364:24;:::i;:::-;23359:3;23352:37;23277:118;;:::o;23401:112::-;23484:22;23500:5;23484:22;:::i;:::-;23479:3;23472:35;23401:112;;:::o;23519:256::-;23631:3;23646:75;23717:3;23708:6;23646:75;:::i;:::-;23746:2;23741:3;23737:12;23730:19;;23766:3;23759:10;;23519:256;;;;:::o;23781:435::-;23961:3;23983:95;24074:3;24065:6;23983:95;:::i;:::-;23976:102;;24095:95;24186:3;24177:6;24095:95;:::i;:::-;24088:102;;24207:3;24200:10;;23781:435;;;;;:::o;24222:522::-;24435:3;24457:148;24601:3;24457:148;:::i;:::-;24450:155;;24615:75;24686:3;24677:6;24615:75;:::i;:::-;24715:2;24710:3;24706:12;24699:19;;24735:3;24728:10;;24222:522;;;;:::o;24750:379::-;24934:3;24956:147;25099:3;24956:147;:::i;:::-;24949:154;;25120:3;25113:10;;24750:379;;;:::o;25135:222::-;25228:4;25266:2;25255:9;25251:18;25243:26;;25279:71;25347:1;25336:9;25332:17;25323:6;25279:71;:::i;:::-;25135:222;;;;:::o;25363:640::-;25558:4;25596:3;25585:9;25581:19;25573:27;;25610:71;25678:1;25667:9;25663:17;25654:6;25610:71;:::i;:::-;25691:72;25759:2;25748:9;25744:18;25735:6;25691:72;:::i;:::-;25773;25841:2;25830:9;25826:18;25817:6;25773:72;:::i;:::-;25892:9;25886:4;25882:20;25877:2;25866:9;25862:18;25855:48;25920:76;25991:4;25982:6;25920:76;:::i;:::-;25912:84;;25363:640;;;;;;;:::o;26009:210::-;26096:4;26134:2;26123:9;26119:18;26111:26;;26147:65;26209:1;26198:9;26194:17;26185:6;26147:65;:::i;:::-;26009:210;;;;:::o;26225:545::-;26398:4;26436:3;26425:9;26421:19;26413:27;;26450:71;26518:1;26507:9;26503:17;26494:6;26450:71;:::i;:::-;26531:68;26595:2;26584:9;26580:18;26571:6;26531:68;:::i;:::-;26609:72;26677:2;26666:9;26662:18;26653:6;26609:72;:::i;:::-;26691;26759:2;26748:9;26744:18;26735:6;26691:72;:::i;:::-;26225:545;;;;;;;:::o;26776:313::-;26889:4;26927:2;26916:9;26912:18;26904:26;;26976:9;26970:4;26966:20;26962:1;26951:9;26947:17;26940:47;27004:78;27077:4;27068:6;27004:78;:::i;:::-;26996:86;;26776:313;;;;:::o;27095:419::-;27261:4;27299:2;27288:9;27284:18;27276:26;;27348:9;27342:4;27338:20;27334:1;27323:9;27319:17;27312:47;27376:131;27502:4;27376:131;:::i;:::-;27368:139;;27095:419;;;:::o;27520:::-;27686:4;27724:2;27713:9;27709:18;27701:26;;27773:9;27767:4;27763:20;27759:1;27748:9;27744:17;27737:47;27801:131;27927:4;27801:131;:::i;:::-;27793:139;;27520:419;;;:::o;27945:::-;28111:4;28149:2;28138:9;28134:18;28126:26;;28198:9;28192:4;28188:20;28184:1;28173:9;28169:17;28162:47;28226:131;28352:4;28226:131;:::i;:::-;28218:139;;27945:419;;;:::o;28370:::-;28536:4;28574:2;28563:9;28559:18;28551:26;;28623:9;28617:4;28613:20;28609:1;28598:9;28594:17;28587:47;28651:131;28777:4;28651:131;:::i;:::-;28643:139;;28370:419;;;:::o;28795:::-;28961:4;28999:2;28988:9;28984:18;28976:26;;29048:9;29042:4;29038:20;29034:1;29023:9;29019:17;29012:47;29076:131;29202:4;29076:131;:::i;:::-;29068:139;;28795:419;;;:::o;29220:::-;29386:4;29424:2;29413:9;29409:18;29401:26;;29473:9;29467:4;29463:20;29459:1;29448:9;29444:17;29437:47;29501:131;29627:4;29501:131;:::i;:::-;29493:139;;29220:419;;;:::o;29645:::-;29811:4;29849:2;29838:9;29834:18;29826:26;;29898:9;29892:4;29888:20;29884:1;29873:9;29869:17;29862:47;29926:131;30052:4;29926:131;:::i;:::-;29918:139;;29645:419;;;:::o;30070:::-;30236:4;30274:2;30263:9;30259:18;30251:26;;30323:9;30317:4;30313:20;30309:1;30298:9;30294:17;30287:47;30351:131;30477:4;30351:131;:::i;:::-;30343:139;;30070:419;;;:::o;30495:::-;30661:4;30699:2;30688:9;30684:18;30676:26;;30748:9;30742:4;30738:20;30734:1;30723:9;30719:17;30712:47;30776:131;30902:4;30776:131;:::i;:::-;30768:139;;30495:419;;;:::o;30920:::-;31086:4;31124:2;31113:9;31109:18;31101:26;;31173:9;31167:4;31163:20;31159:1;31148:9;31144:17;31137:47;31201:131;31327:4;31201:131;:::i;:::-;31193:139;;30920:419;;;:::o;31345:::-;31511:4;31549:2;31538:9;31534:18;31526:26;;31598:9;31592:4;31588:20;31584:1;31573:9;31569:17;31562:47;31626:131;31752:4;31626:131;:::i;:::-;31618:139;;31345:419;;;:::o;31770:::-;31936:4;31974:2;31963:9;31959:18;31951:26;;32023:9;32017:4;32013:20;32009:1;31998:9;31994:17;31987:47;32051:131;32177:4;32051:131;:::i;:::-;32043:139;;31770:419;;;:::o;32195:::-;32361:4;32399:2;32388:9;32384:18;32376:26;;32448:9;32442:4;32438:20;32434:1;32423:9;32419:17;32412:47;32476:131;32602:4;32476:131;:::i;:::-;32468:139;;32195:419;;;:::o;32620:::-;32786:4;32824:2;32813:9;32809:18;32801:26;;32873:9;32867:4;32863:20;32859:1;32848:9;32844:17;32837:47;32901:131;33027:4;32901:131;:::i;:::-;32893:139;;32620:419;;;:::o;33045:::-;33211:4;33249:2;33238:9;33234:18;33226:26;;33298:9;33292:4;33288:20;33284:1;33273:9;33269:17;33262:47;33326:131;33452:4;33326:131;:::i;:::-;33318:139;;33045:419;;;:::o;33470:::-;33636:4;33674:2;33663:9;33659:18;33651:26;;33723:9;33717:4;33713:20;33709:1;33698:9;33694:17;33687:47;33751:131;33877:4;33751:131;:::i;:::-;33743:139;;33470:419;;;:::o;33895:::-;34061:4;34099:2;34088:9;34084:18;34076:26;;34148:9;34142:4;34138:20;34134:1;34123:9;34119:17;34112:47;34176:131;34302:4;34176:131;:::i;:::-;34168:139;;33895:419;;;:::o;34320:::-;34486:4;34524:2;34513:9;34509:18;34501:26;;34573:9;34567:4;34563:20;34559:1;34548:9;34544:17;34537:47;34601:131;34727:4;34601:131;:::i;:::-;34593:139;;34320:419;;;:::o;34745:::-;34911:4;34949:2;34938:9;34934:18;34926:26;;34998:9;34992:4;34988:20;34984:1;34973:9;34969:17;34962:47;35026:131;35152:4;35026:131;:::i;:::-;35018:139;;34745:419;;;:::o;35170:::-;35336:4;35374:2;35363:9;35359:18;35351:26;;35423:9;35417:4;35413:20;35409:1;35398:9;35394:17;35387:47;35451:131;35577:4;35451:131;:::i;:::-;35443:139;;35170:419;;;:::o;35595:::-;35761:4;35799:2;35788:9;35784:18;35776:26;;35848:9;35842:4;35838:20;35834:1;35823:9;35819:17;35812:47;35876:131;36002:4;35876:131;:::i;:::-;35868:139;;35595:419;;;:::o;36020:::-;36186:4;36224:2;36213:9;36209:18;36201:26;;36273:9;36267:4;36263:20;36259:1;36248:9;36244:17;36237:47;36301:131;36427:4;36301:131;:::i;:::-;36293:139;;36020:419;;;:::o;36445:::-;36611:4;36649:2;36638:9;36634:18;36626:26;;36698:9;36692:4;36688:20;36684:1;36673:9;36669:17;36662:47;36726:131;36852:4;36726:131;:::i;:::-;36718:139;;36445:419;;;:::o;36870:::-;37036:4;37074:2;37063:9;37059:18;37051:26;;37123:9;37117:4;37113:20;37109:1;37098:9;37094:17;37087:47;37151:131;37277:4;37151:131;:::i;:::-;37143:139;;36870:419;;;:::o;37295:::-;37461:4;37499:2;37488:9;37484:18;37476:26;;37548:9;37542:4;37538:20;37534:1;37523:9;37519:17;37512:47;37576:131;37702:4;37576:131;:::i;:::-;37568:139;;37295:419;;;:::o;37720:::-;37886:4;37924:2;37913:9;37909:18;37901:26;;37973:9;37967:4;37963:20;37959:1;37948:9;37944:17;37937:47;38001:131;38127:4;38001:131;:::i;:::-;37993:139;;37720:419;;;:::o;38145:::-;38311:4;38349:2;38338:9;38334:18;38326:26;;38398:9;38392:4;38388:20;38384:1;38373:9;38369:17;38362:47;38426:131;38552:4;38426:131;:::i;:::-;38418:139;;38145:419;;;:::o;38570:::-;38736:4;38774:2;38763:9;38759:18;38751:26;;38823:9;38817:4;38813:20;38809:1;38798:9;38794:17;38787:47;38851:131;38977:4;38851:131;:::i;:::-;38843:139;;38570:419;;;:::o;38995:::-;39161:4;39199:2;39188:9;39184:18;39176:26;;39248:9;39242:4;39238:20;39234:1;39223:9;39219:17;39212:47;39276:131;39402:4;39276:131;:::i;:::-;39268:139;;38995:419;;;:::o;39420:::-;39586:4;39624:2;39613:9;39609:18;39601:26;;39673:9;39667:4;39663:20;39659:1;39648:9;39644:17;39637:47;39701:131;39827:4;39701:131;:::i;:::-;39693:139;;39420:419;;;:::o;39845:222::-;39938:4;39976:2;39965:9;39961:18;39953:26;;39989:71;40057:1;40046:9;40042:17;40033:6;39989:71;:::i;:::-;39845:222;;;;:::o;40073:129::-;40107:6;40134:20;;:::i;:::-;40124:30;;40163:33;40191:4;40183:6;40163:33;:::i;:::-;40073:129;;;:::o;40208:75::-;40241:6;40274:2;40268:9;40258:19;;40208:75;:::o;40289:307::-;40350:4;40440:18;40432:6;40429:30;40426:56;;;40462:18;;:::i;:::-;40426:56;40500:29;40522:6;40500:29;:::i;:::-;40492:37;;40584:4;40578;40574:15;40566:23;;40289:307;;;:::o;40602:308::-;40664:4;40754:18;40746:6;40743:30;40740:56;;;40776:18;;:::i;:::-;40740:56;40814:29;40836:6;40814:29;:::i;:::-;40806:37;;40898:4;40892;40888:15;40880:23;;40602:308;;;:::o;40916:98::-;40967:6;41001:5;40995:12;40985:22;;40916:98;;;:::o;41020:99::-;41072:6;41106:5;41100:12;41090:22;;41020:99;;;:::o;41125:168::-;41208:11;41242:6;41237:3;41230:19;41282:4;41277:3;41273:14;41258:29;;41125:168;;;;:::o;41299:147::-;41400:11;41437:3;41422:18;;41299:147;;;;:::o;41452:169::-;41536:11;41570:6;41565:3;41558:19;41610:4;41605:3;41601:14;41586:29;;41452:169;;;;:::o;41627:148::-;41729:11;41766:3;41751:18;;41627:148;;;;:::o;41781:305::-;41821:3;41840:20;41858:1;41840:20;:::i;:::-;41835:25;;41874:20;41892:1;41874:20;:::i;:::-;41869:25;;42028:1;41960:66;41956:74;41953:1;41950:81;41947:107;;;42034:18;;:::i;:::-;41947:107;42078:1;42075;42071:9;42064:16;;41781:305;;;;:::o;42092:185::-;42132:1;42149:20;42167:1;42149:20;:::i;:::-;42144:25;;42183:20;42201:1;42183:20;:::i;:::-;42178:25;;42222:1;42212:35;;42227:18;;:::i;:::-;42212:35;42269:1;42266;42262:9;42257:14;;42092:185;;;;:::o;42283:348::-;42323:7;42346:20;42364:1;42346:20;:::i;:::-;42341:25;;42380:20;42398:1;42380:20;:::i;:::-;42375:25;;42568:1;42500:66;42496:74;42493:1;42490:81;42485:1;42478:9;42471:17;42467:105;42464:131;;;42575:18;;:::i;:::-;42464:131;42623:1;42620;42616:9;42605:20;;42283:348;;;;:::o;42637:191::-;42677:4;42697:20;42715:1;42697:20;:::i;:::-;42692:25;;42731:20;42749:1;42731:20;:::i;:::-;42726:25;;42770:1;42767;42764:8;42761:34;;;42775:18;;:::i;:::-;42761:34;42820:1;42817;42813:9;42805:17;;42637:191;;;;:::o;42834:96::-;42871:7;42900:24;42918:5;42900:24;:::i;:::-;42889:35;;42834:96;;;:::o;42936:90::-;42970:7;43013:5;43006:13;42999:21;42988:32;;42936:90;;;:::o;43032:77::-;43069:7;43098:5;43087:16;;43032:77;;;:::o;43115:149::-;43151:7;43191:66;43184:5;43180:78;43169:89;;43115:149;;;:::o;43270:125::-;43336:7;43365:24;43383:5;43365:24;:::i;:::-;43354:35;;43270:125;;;:::o;43401:126::-;43438:7;43478:42;43471:5;43467:54;43456:65;;43401:126;;;:::o;43533:77::-;43570:7;43599:5;43588:16;;43533:77;;;:::o;43616:86::-;43651:7;43691:4;43684:5;43680:16;43669:27;;43616:86;;;:::o;43708:154::-;43792:6;43787:3;43782;43769:30;43854:1;43845:6;43840:3;43836:16;43829:27;43708:154;;;:::o;43868:307::-;43936:1;43946:113;43960:6;43957:1;43954:13;43946:113;;;44045:1;44040:3;44036:11;44030:18;44026:1;44021:3;44017:11;44010:39;43982:2;43979:1;43975:10;43970:15;;43946:113;;;44077:6;44074:1;44071:13;44068:101;;;44157:1;44148:6;44143:3;44139:16;44132:27;44068:101;43917:258;43868:307;;;:::o;44181:320::-;44225:6;44262:1;44256:4;44252:12;44242:22;;44309:1;44303:4;44299:12;44330:18;44320:81;;44386:4;44378:6;44374:17;44364:27;;44320:81;44448:2;44440:6;44437:14;44417:18;44414:38;44411:84;;;44467:18;;:::i;:::-;44411:84;44232:269;44181:320;;;:::o;44507:281::-;44590:27;44612:4;44590:27;:::i;:::-;44582:6;44578:40;44720:6;44708:10;44705:22;44684:18;44672:10;44669:34;44666:62;44663:88;;;44731:18;;:::i;:::-;44663:88;44771:10;44767:2;44760:22;44550:238;44507:281;;:::o;44794:233::-;44833:3;44856:24;44874:5;44856:24;:::i;:::-;44847:33;;44902:66;44895:5;44892:77;44889:103;;;44972:18;;:::i;:::-;44889:103;45019:1;45012:5;45008:13;45001:20;;44794:233;;;:::o;45033:100::-;45072:7;45101:26;45121:5;45101:26;:::i;:::-;45090:37;;45033:100;;;:::o;45139:79::-;45178:7;45207:5;45196:16;;45139:79;;;:::o;45224:94::-;45263:7;45292:20;45306:5;45292:20;:::i;:::-;45281:31;;45224:94;;;:::o;45324:176::-;45356:1;45373:20;45391:1;45373:20;:::i;:::-;45368:25;;45407:20;45425:1;45407:20;:::i;:::-;45402:25;;45446:1;45436:35;;45451:18;;:::i;:::-;45436:35;45492:1;45489;45485:9;45480:14;;45324:176;;;;:::o;45506:180::-;45554:77;45551:1;45544:88;45651:4;45648:1;45641:15;45675:4;45672:1;45665:15;45692:180;45740:77;45737:1;45730:88;45837:4;45834:1;45827:15;45861:4;45858:1;45851:15;45878:180;45926:77;45923:1;45916:88;46023:4;46020:1;46013:15;46047:4;46044:1;46037:15;46064:180;46112:77;46109:1;46102:88;46209:4;46206:1;46199:15;46233:4;46230:1;46223:15;46250:180;46298:77;46295:1;46288:88;46395:4;46392:1;46385:15;46419:4;46416:1;46409:15;46436:180;46484:77;46481:1;46474:88;46581:4;46578:1;46571:15;46605:4;46602:1;46595:15;46622:180;46670:77;46667:1;46660:88;46767:4;46764:1;46757:15;46791:4;46788:1;46781:15;46808:117;46917:1;46914;46907:12;46931:117;47040:1;47037;47030:12;47054:117;47163:1;47160;47153:12;47177:117;47286:1;47283;47276:12;47300:117;47409:1;47406;47399:12;47423:117;47532:1;47529;47522:12;47546:102;47587:6;47638:2;47634:7;47629:2;47622:5;47618:14;47614:28;47604:38;;47546:102;;;:::o;47654:94::-;47687:8;47735:5;47731:2;47727:14;47706:35;;47654:94;;;:::o;47754:174::-;47894:26;47890:1;47882:6;47878:14;47871:50;47754:174;:::o;47934:164::-;48074:16;48070:1;48062:6;48058:14;48051:40;47934:164;:::o;48104:181::-;48244:33;48240:1;48232:6;48228:14;48221:57;48104:181;:::o;48291:214::-;48431:66;48427:1;48419:6;48415:14;48408:90;48291:214;:::o;48511:230::-;48651:34;48647:1;48639:6;48635:14;48628:58;48720:13;48715:2;48707:6;48703:15;48696:38;48511:230;:::o;48747:237::-;48887:34;48883:1;48875:6;48871:14;48864:58;48956:20;48951:2;48943:6;48939:15;48932:45;48747:237;:::o;48990:225::-;49130:34;49126:1;49118:6;49114:14;49107:58;49199:8;49194:2;49186:6;49182:15;49175:33;48990:225;:::o;49221:178::-;49361:30;49357:1;49349:6;49345:14;49338:54;49221:178;:::o;49405:173::-;49545:25;49541:1;49533:6;49529:14;49522:49;49405:173;:::o;49584:165::-;49724:17;49720:1;49712:6;49708:14;49701:41;49584:165;:::o;49755:::-;49895:17;49891:1;49883:6;49879:14;49872:41;49755:165;:::o;49926:172::-;50066:24;50062:1;50054:6;50050:14;50043:48;49926:172;:::o;50104:223::-;50244:34;50240:1;50232:6;50228:14;50221:58;50313:6;50308:2;50300:6;50296:15;50289:31;50104:223;:::o;50333:175::-;50473:27;50469:1;50461:6;50457:14;50450:51;50333:175;:::o;50514:221::-;50654:34;50650:1;50642:6;50638:14;50631:58;50723:4;50718:2;50710:6;50706:15;50699:29;50514:221;:::o;50741:231::-;50881:34;50877:1;50869:6;50865:14;50858:58;50950:14;50945:2;50937:6;50933:15;50926:39;50741:231;:::o;50978:243::-;51118:34;51114:1;51106:6;51102:14;51095:58;51187:26;51182:2;51174:6;51170:15;51163:51;50978:243;:::o;51227:229::-;51367:34;51363:1;51355:6;51351:14;51344:58;51436:12;51431:2;51423:6;51419:15;51412:37;51227:229;:::o;51462:228::-;51602:34;51598:1;51590:6;51586:14;51579:58;51671:11;51666:2;51658:6;51654:15;51647:36;51462:228;:::o;51696:221::-;51836:34;51832:1;51824:6;51820:14;51813:58;51905:4;51900:2;51892:6;51888:15;51881:29;51696:221;:::o;51923:182::-;52063:34;52059:1;52051:6;52047:14;52040:58;51923:182;:::o;52111:231::-;52251:34;52247:1;52239:6;52235:14;52228:58;52320:14;52315:2;52307:6;52303:15;52296:39;52111:231;:::o;52348:182::-;52488:34;52484:1;52476:6;52472:14;52465:58;52348:182;:::o;52536:228::-;52676:34;52672:1;52664:6;52660:14;52653:58;52745:11;52740:2;52732:6;52728:15;52721:36;52536:228;:::o;52770:234::-;52910:34;52906:1;52898:6;52894:14;52887:58;52979:17;52974:2;52966:6;52962:15;52955:42;52770:234;:::o;53010:166::-;53150:18;53146:1;53138:6;53134:14;53127:42;53010:166;:::o;53182:220::-;53322:34;53318:1;53310:6;53306:14;53299:58;53391:3;53386:2;53378:6;53374:15;53367:28;53182:220;:::o;53408:114::-;;:::o;53528:236::-;53668:34;53664:1;53656:6;53652:14;53645:58;53737:19;53732:2;53724:6;53720:15;53713:44;53528:236;:::o;53770:231::-;53910:34;53906:1;53898:6;53894:14;53887:58;53979:14;53974:2;53966:6;53962:15;53955:39;53770:231;:::o;54007:167::-;54147:19;54143:1;54135:6;54131:14;54124:43;54007:167;:::o;54180:220::-;54320:34;54316:1;54308:6;54304:14;54297:58;54389:3;54384:2;54376:6;54372:15;54365:28;54180:220;:::o;54406:122::-;54479:24;54497:5;54479:24;:::i;:::-;54472:5;54469:35;54459:63;;54518:1;54515;54508:12;54459:63;54406:122;:::o;54534:116::-;54604:21;54619:5;54604:21;:::i;:::-;54597:5;54594:32;54584:60;;54640:1;54637;54630:12;54584:60;54534:116;:::o;54656:120::-;54728:23;54745:5;54728:23;:::i;:::-;54721:5;54718:34;54708:62;;54766:1;54763;54756:12;54708:62;54656:120;:::o;54782:180::-;54884:53;54931:5;54884:53;:::i;:::-;54877:5;54874:64;54864:92;;54952:1;54949;54942:12;54864:92;54782:180;:::o;54968:122::-;55041:24;55059:5;55041:24;:::i;:::-;55034:5;55031:35;55021:63;;55080:1;55077;55070:12;55021:63;54968:122;:::o

Swarm Source

ipfs://2de31b0133e91c3fb19279227c75f5524188a31ece1d301ebf16bdeeb253ab01
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.