Token Baby Sharks NFT

Overview CRC721

Total Supply:
644 Baby Shark

Holders:
135 addresses
Balance
6 Baby Shark
0x634a5dc4cda63ea8d0699d9387cdcfffc6408b84
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
BabySharkNFT

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at cronoscan.com on 2022-09-13
*/

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

        return (signer, RecoverError.NoError);
    }

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File: @openzeppelin\contracts\token\ERC20\IERC20.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: contracts\nft\BabyShark.sol



pragma solidity ^0.8.4;








error TransferToNonERC721ReceiverImplementer();

contract Whitelist is Ownable {
    using ECDSA for bytes32;
    address signer;

    constructor(address _signer) {
        signer = _signer;
    }

    function setSigners(address _signer) external onlyOwner {
        signer = _signer;
    }

    function getRecoverAddress(bytes calldata signature, string memory key) internal view returns (address) {
        bytes32 hash = keccak256(abi.encodePacked(this, key, msg.sender));
        hash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
        return hash.recover(signature);
    }

    function verifySignature(bytes calldata signature, string memory key) internal view returns (bool) {
        return getRecoverAddress(signature, key) == signer;
    }

    modifier onlyWhitelist(bytes calldata signature, string memory key) {
        require(signer != address (0), "Signer Not Set");
        require(verifySignature(signature, key), "Not Whitelisted 1");
        _;
    }
}

contract BabySharkNFT is IERC721, Whitelist {
    using Address for address;
    using Strings for uint256;

    string private _name = "Baby Sharks NFT";
    string private _symbol = "Baby Shark";

    uint16 public pubsaleSupply = 10000;
    uint16 public limitPerAddress = 1000;
    uint16 public airdropLimitPerAddress = 1;
    uint16 public presaleLimitPerAddress = 1000;
    uint public totalSupply;

    bool public revealed;

    bool public presaleOpen;
    bool public airdropOpen;
    bool public pubsaleOpen;

    uint public presaleCost = 1700 ether;
    uint256 public cost = 2100 ether;
    uint256 internal _currentIndex = 1;

    mapping(address => uint256) private _balances;
    mapping(uint256 => address) public ownership;
    mapping(address => uint256) public addressMints;
    mapping(address => uint256) _presaleLimits;
    mapping(address => uint256) public presaledAmounts;
    mapping(address => uint256) _airdropLimits;
    mapping(address => uint256) public airdropAmounts;

    string public baseURI;
    string public norevealedURI;
    string public baseExtension;

    mapping(uint256 => address) private _tokenApprovals;
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    modifier onlyTokenOwner(uint256 tokenId) {
        require(
            ownerOf(tokenId) == msg.sender,
            "ERROR! You must be the token owner"
        );
        _;
    }

    constructor(address _signer) Whitelist(_signer) {}

    function name() public view returns (string memory) {
        return _name;
    }

    function symbol() public view returns (string memory) {
        return _symbol;
    }

    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

    function getApproved(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        require(
            tokenId <= totalSupply,
            "ERC721: approved query for nonexistent token"
        );

        return _tokenApprovals[tokenId];
    }

    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        _setApprovalForAll(msg.sender, operator, approved);
    }

    function isApprovedForAll(address owner, address operator)
        public
        view
        virtual
        override
        returns (bool)
    {
        return _operatorApprovals[owner][operator];
    }

    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ownerOf(tokenId), to, tokenId);
    }

    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    function airdropLimit(address user) public view returns (uint) {
        if (_airdropLimits[user] > 0) return _airdropLimits[user];
        return airdropLimitPerAddress;
    }

    function presaleLimit(address user) public view returns (uint) {
        if (_presaleLimits[user] > 0) return _presaleLimits[user];
        return presaleLimitPerAddress;
    }

    function setCost(uint256 _cost) external onlyOwner {
        cost = _cost;
    }

    function setPresaleCost(uint256 _cost) external onlyOwner {
        presaleCost = _cost;
    }

    function setLimitPerAddress(uint8 _limit) external onlyOwner {
        limitPerAddress = _limit;
    }

    function setPresaleLimitPerAddress(uint8 _limit) external onlyOwner {
        presaleLimitPerAddress = _limit;
    }

    function setAirdropLimitPerAddress(uint8 _limit) external onlyOwner {
        airdropLimitPerAddress = _limit;
    }

    function enablePresale(bool enabled) external onlyOwner {
        presaleOpen = enabled;
    }

    function enableAirdrop(bool enabled) external onlyOwner {
        airdropOpen = enabled;
    }

    function setAirdropLimits(address[] calldata users, uint[] calldata amounts) external onlyOwner {
        uint i;
        for (i = 0; i < users.length; i+=1) {
            _airdropLimits[users[i]] = amounts[i];
        }
    }

    function setPresaleLimits(address[] calldata users, uint[] calldata amounts) external onlyOwner {
        uint i;
        for (i = 0; i < users.length; i+=1) {
            _presaleLimits[users[i]] = amounts[i];
        }
    }

    function startPubsale() external onlyOwner {
        pubsaleOpen = true;
        presaleOpen = false;
        airdropOpen = false;
    }

    function endPubsale() external onlyOwner {
        pubsaleOpen = false;
    }

    function balanceOf(address owner) public view override returns (uint256) {
        return _balances[owner];
    }

    function ownerOf(uint256 tokenId) public view override returns (address) {
        if (tokenId >= _currentIndex) {
            return address(0);
        }

        uint256 id = tokenId;
        while (id > 1 && ownership[id] == address(0)) {
            id -= 1;
        }
        return ownership[id];
    }

    function mint(uint256 amount) external payable {
        require(
            addressMints[msg.sender] + amount <= limitPerAddress,
            "ERROR: NFT limit"
        );
        require(pubsaleOpen, "Public sale is not open");
        require(totalSupply + amount <= pubsaleSupply, "Invalid amount");

        uint256 totalCost = cost * amount;
        require(msg.value >= totalCost, "Insufficient payment");

        if (msg.value > totalCost) {
            payable(msg.sender).transfer(msg.value - totalCost);
        }

        for (uint256 i = 0; i < amount; i += 1) {
            emit Transfer(address(0), msg.sender, _currentIndex + i);
        }

        ownership[_currentIndex] = msg.sender;
        _mint(msg.sender, amount);

        totalSupply += amount;
    }

    function mintAirdrop(uint256 amount, bytes calldata signature) external onlyWhitelist(signature, "-AD-") {
        require(
            airdropAmounts[msg.sender] + amount <= airdropLimit(msg.sender),
            "ERROR: Airdrop limited!"
        );
        require(airdropOpen, "Airdrop is not open");
        require(totalSupply + amount <= pubsaleSupply, "Invalid amount");

        for (uint256 i = 0; i < amount; i += 1) {
            emit Transfer(address(0), msg.sender, _currentIndex + i);
        }

        ownership[_currentIndex] = msg.sender;
        _mint(msg.sender, amount);

        totalSupply += amount;
        airdropAmounts[msg.sender] += amount;
    }

    function mintPresale(uint256 amount, bytes calldata signature) external payable onlyWhitelist(signature, "-WL-") {
        require(
            presaledAmounts[msg.sender] + amount <= presaleLimit(msg.sender),
            "ERROR: NFT limit"
        );
        require(presaleOpen, "Presale is not open");
        require(totalSupply + amount <= pubsaleSupply, "Invalid amount");

        uint256 totalCost = presaleCost * amount;
        require(msg.value >= totalCost, "Insufficient payment");

        for (uint256 i = 0; i < amount; i += 1) {
            emit Transfer(address(0), msg.sender, _currentIndex + i);
        }

        if (msg.value > totalCost) {
            payable(msg.sender).transfer(msg.value - totalCost);
        }

        ownership[_currentIndex] = msg.sender;
        _mint(msg.sender, amount);

        totalSupply += amount;
        presaledAmounts[msg.sender] += amount;
    }

    function premint(uint256 amount, address to) external onlyOwner {

        for (uint256 i = 0; i < amount; i += 1) {
            emit Transfer(address(0), to, _currentIndex + i);
        }

        ownership[_currentIndex] = to;
        _mint(to, amount);

        totalSupply += amount;
    }

    function _mint(address to, uint256 amount) internal {
        _balances[to] += amount;
        addressMints[to] += amount;
        _currentIndex += amount;
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override {
        _transfer(from, to, tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override {
        safeTransferFrom(from, to, tokenId, "");
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);

        if (!_checkOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal {
        address preOwner = ownerOf(tokenId);

        require(from != to, "You cannot transfer to yourself");
        require(from == preOwner, "Invalid from address");
        require(
            msg.sender == preOwner ||
                isApprovedForAll(preOwner, msg.sender) ||
                getApproved(tokenId) == msg.sender,
            "Access denied"
        );

        _approve(address(0), tokenId);

        ownership[tokenId] = to;

        uint256 nextId = tokenId + 1;

        if (ownership[nextId] == address(0) && nextId < _currentIndex) {
            ownership[nextId] = preOwner;
        }

        _balances[preOwner] -= 1;
        _balances[to] += 1;

        emit Transfer(from, to, tokenId);
    }

    function tokenURI(uint256 tokenId) public view returns (string memory) {
        require(
            tokenId <= totalSupply,
            "ERC721Metadata: URI query for nonexistent token"
        );

        if (revealed == false) {
            return norevealedURI;
        }

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

    function setBaseURI(string memory _baseURI) external onlyOwner {
        baseURI = _baseURI;
    }

    function setUnrevealedURI(string memory _uri) external onlyOwner {
        norevealedURI = _uri;
    }

    function setBaseExtension(string memory _ext) external onlyOwner {
        baseExtension = _ext;
    }

    function setPubsaleSupply(uint16 _amount) external onlyOwner {
        pubsaleSupply = _amount;
    }

    function reveal() external onlyOwner {
        revealed = true;
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(IERC165)
        returns (bool)
    {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            interfaceId == type(IERC165).interfaceId;
    }

    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try
                IERC721Receiver(to).onERC721Received(
                    msg.sender,
                    from,
                    tokenId,
                    _data
                )
            returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert TransferToNonERC721ReceiverImplementer();
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    function withdraw(address payable to) external onlyOwner {
        Address.sendValue(to, address(this).balance);
    }

    function recoverToken(address token, address to) external onlyOwner {
        IERC20(token).transfer(to, IERC20(token).balanceOf(address(this)));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_signer","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"airdropAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"airdropLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"airdropLimitPerAddress","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"airdropOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"enableAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"enablePresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endPubsale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitPerAddress","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mintAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mintPresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"norevealedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownership","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"premint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"presaleCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"presaleLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleLimitPerAddress","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presaledAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pubsaleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pubsaleSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"recoverToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_limit","type":"uint8"}],"name":"setAirdropLimitPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"setAirdropLimits","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":"_ext","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_limit","type":"uint8"}],"name":"setLimitPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setPresaleCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_limit","type":"uint8"}],"name":"setPresaleLimitPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"setPresaleLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_amount","type":"uint16"}],"name":"setPubsaleSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"}],"name":"setSigners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setUnrevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPubsale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c0604052600f60808190526e1098589e4814da185c9adcc8139195608a1b60a090815262000032916002919062000153565b5060408051808201909152600a808252694261627920536861726b60b01b6020909201918252620000669160039162000153565b50600480546001600160401b0319166703e8000103e82710179055685c283d4103941000006007556871d75ab9b9205000006008556001600955348015620000ad57600080fd5b50604051620038b3380380620038b3833981016040819052620000d091620001f9565b80620000dc3362000103565b600180546001600160a01b0319166001600160a01b03929092169190911790555062000266565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620001619062000229565b90600052602060002090601f016020900481019282620001855760008555620001d0565b82601f10620001a057805160ff1916838001178555620001d0565b82800160010185558215620001d0579182015b82811115620001d0578251825591602001919060010190620001b3565b50620001de929150620001e2565b5090565b5b80821115620001de5760008155600101620001e3565b6000602082840312156200020b578081fd5b81516001600160a01b038116811462000222578182fd5b9392505050565b600181811c908216806200023e57607f821691505b602082108114156200026057634e487b7160e01b600052602260045260246000fd5b50919050565b61363d80620002766000396000f3fe60806040526004361061038c5760003560e01c80638611244c116101dc578063bee6348a11610102578063d5279b37116100a0578063e985e9c51161006f578063e985e9c514610a7f578063f2fde38b14610a9f578063fe2c7fee14610abf578063feaea58614610adf57600080fd5b8063d5279b37146109fc578063da3ef23f14610a1c578063df1b542a14610a3c578063df2659bb14610a5f57600080fd5b8063c87b56dd116100dc578063c87b56dd1461096f578063cdc324a91461098f578063cfbe7355146109bc578063d1454bf4146109dc57600080fd5b8063bee6348a14610919578063bfcc78cc14610938578063c66828621461095a57600080fd5b8063a0f45b691161017a578063b47876ea11610149578063b47876ea146108a4578063b4a0dd4f146108c4578063b584b78d146108e4578063b88d4fde146108f957600080fd5b8063a0f45b6914610819578063a22cb4651461084f578063a475b5dd1461086f578063a61b72951461088457600080fd5b806395d89b41116101b657806395d89b41146107a3578063964c33b5146107b85780639c3e73c3146107e5578063a0712d681461080657600080fd5b80638611244c146107505780638da5cb5b146107655780638fdcf9421461078357600080fd5b806335fb7d69116102c157806355f804b31161025f5780636c0360eb1161022e5780636c0360eb146106c357806370a08231146106d8578063715018a61461070e57806381e1943b1461072357600080fd5b806355f804b31461064357806359862f3b146106635780636352211e146106835780636833a228146106a357600080fd5b806344a0d68a1161029b57806344a0d68a146105c957806351830227146105e957806351cff8d914610603578063538dba3e1461062357600080fd5b806335fb7d691461056e57806342842e0e1461058e57806342ca1d09146105ae57600080fd5b806313faede61161032e57806323b872dd1161030857806323b872dd146104e45780632a23d07d146105045780632a484ad41461051a57806334cd27f11461054e57600080fd5b806313faede61461048a57806314102159146104ae57806318160ddd146104ce57600080fd5b8063081812fc1161036a578063081812fc146103ff578063095ea7b3146104375780630c93cb1f146104575780630d06ed721461047757600080fd5b806301ffc9a71461039157806303a17969146103c657806306fdde03146103dd575b600080fd5b34801561039d57600080fd5b506103b16103ac366004613105565b610aff565b60405190151581526020015b60405180910390f35b3480156103d257600080fd5b506103db610b51565b005b3480156103e957600080fd5b506103f2610b93565b6040516103bd9190613404565b34801561040b57600080fd5b5061041f61041a3660046131a5565b610c25565b6040516001600160a01b0390911681526020016103bd565b34801561044357600080fd5b506103db610452366004613039565b610caa565b34801561046357600080fd5b506103db610472366004613064565b610dc0565b6103db6104853660046131f9565b610e88565b34801561049657600080fd5b506104a060085481565b6040519081526020016103bd565b3480156104ba57600080fd5b506104a06104c9366004612efb565b611175565b3480156104da57600080fd5b506104a060055481565b3480156104f057600080fd5b506103db6104ff366004612f4f565b6111c2565b34801561051057600080fd5b506104a060075481565b34801561052657600080fd5b5060045461053b9062010000900461ffff1681565b60405161ffff90911681526020016103bd565b34801561055a57600080fd5b506103db610569366004613270565b6111cd565b34801561057a57600080fd5b506103db610589366004613270565b61121a565b34801561059a57600080fd5b506103db6105a9366004612f4f565b611266565b3480156105ba57600080fd5b5060045461053b9061ffff1681565b3480156105d557600080fd5b506103db6105e43660046131a5565b611281565b3480156105f557600080fd5b506006546103b19060ff1681565b34801561060f57600080fd5b506103db61061e366004612efb565b6112b0565b34801561062f57600080fd5b506103db61063e3660046131d5565b6112e7565b34801561064f57600080fd5b506103db61065e36600461313d565b6113b0565b34801561066f57600080fd5b506006546103b19062010000900460ff1681565b34801561068f57600080fd5b5061041f61069e3660046131a5565b6113f1565b3480156106af57600080fd5b506103db6106be366004613270565b611460565b3480156106cf57600080fd5b506103f26114a8565b3480156106e457600080fd5b506104a06106f3366004612efb565b6001600160a01b03166000908152600a602052604090205490565b34801561071a57600080fd5b506103db611536565b34801561072f57600080fd5b506104a061073e366004612efb565b600e6020526000908152604090205481565b34801561075c57600080fd5b506103db61156c565b34801561077157600080fd5b506000546001600160a01b031661041f565b34801561078f57600080fd5b506103db61079e3660046131a5565b6115ab565b3480156107af57600080fd5b506103f26115da565b3480156107c457600080fd5b506104a06107d3366004612efb565b600c6020526000908152604090205481565b3480156107f157600080fd5b506006546103b1906301000000900460ff1681565b6103db6108143660046131a5565b6115e9565b34801561082557600080fd5b5061041f6108343660046131a5565b600b602052600090815260409020546001600160a01b031681565b34801561085b57600080fd5b506103db61086a36600461300c565b6117f1565b34801561087b57600080fd5b506103db6117fc565b34801561089057600080fd5b506103db61089f3660046130cd565b611835565b3480156108b057600080fd5b506103db6108bf366004612efb565b61187b565b3480156108d057600080fd5b506104a06108df366004612efb565b6118c7565b3480156108f057600080fd5b506103f2611915565b34801561090557600080fd5b506103db610914366004612f8f565b611922565b34801561092557600080fd5b506006546103b190610100900460ff1681565b34801561094457600080fd5b5060045461053b90600160301b900461ffff1681565b34801561096657600080fd5b506103f261195c565b34801561097b57600080fd5b506103f261098a3660046131a5565b611969565b34801561099b57600080fd5b506104a06109aa366004612efb565b60106020526000908152604090205481565b3480156109c857600080fd5b506103db6109d7366004613183565b611b53565b3480156109e857600080fd5b506103db6109f73660046130cd565b611b95565b348015610a0857600080fd5b506103db610a173660046131f9565b611bd9565b348015610a2857600080fd5b506103db610a3736600461313d565b611e3a565b348015610a4857600080fd5b5060045461053b90640100000000900461ffff1681565b348015610a6b57600080fd5b506103db610a7a366004613064565b611e77565b348015610a8b57600080fd5b506103b1610a9a366004612f17565b611f38565b348015610aab57600080fd5b506103db610aba366004612efb565b611f66565b348015610acb57600080fd5b506103db610ada36600461313d565b611ffe565b348015610aeb57600080fd5b506103db610afa366004612f17565b61203b565b60006001600160e01b031982166380ac58cd60e01b1480610b3057506001600160e01b03198216635b5e139f60e01b145b80610b4b57506001600160e01b031982166301ffc9a760e01b145b92915050565b6000546001600160a01b03163314610b845760405162461bcd60e51b8152600401610b7b9061343f565b60405180910390fd5b6006805463ff00000019169055565b606060028054610ba290613502565b80601f0160208091040260200160405190810160405280929190818152602001828054610bce90613502565b8015610c1b5780601f10610bf057610100808354040283529160200191610c1b565b820191906000526020600020905b815481529060010190602001808311610bfe57829003601f168201915b5050505050905090565b6000600554821115610c8e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b7b565b506000908152601460205260409020546001600160a01b031690565b6000610cb5826113f1565b9050806001600160a01b0316836001600160a01b03161415610d235760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b7b565b336001600160a01b0382161480610d3f5750610d3f8133611f38565b610db15760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b7b565b610dbb8383612164565b505050565b6000546001600160a01b03163314610dea5760405162461bcd60e51b8152600401610b7b9061343f565b60005b83811015610e8157828282818110610e1557634e487b7160e01b600052603260045260246000fd5b90506020020135600d6000878785818110610e4057634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610e559190612efb565b6001600160a01b03168152602081019190915260400160002055610e7a600182613474565b9050610ded565b5050505050565b6040805180820190915260048152632d574c2d60e01b6020820152600154839183916001600160a01b0316610ef05760405162461bcd60e51b815260206004820152600e60248201526d14da59db995c88139bdd0814d95d60921b6044820152606401610b7b565b610efb8383836121d2565b610f3b5760405162461bcd60e51b81526020600482015260116024820152704e6f742057686974656c6973746564203160781b6044820152606401610b7b565b610f4433611175565b336000908152600e6020526040902054610f5f908890613474565b1115610fa05760405162461bcd60e51b815260206004820152601060248201526f11549493d48e88139195081b1a5b5a5d60821b6044820152606401610b7b565b600654610100900460ff16610fed5760405162461bcd60e51b8152602060048201526013602482015272283932b9b0b6329034b9903737ba1037b832b760691b6044820152606401610b7b565b60045460055461ffff90911690611005908890613474565b11156110235760405162461bcd60e51b8152600401610b7b90613417565b60008660075461103391906134a0565b90508034101561107c5760405162461bcd60e51b8152602060048201526014602482015273125b9cdd59999a58da595b9d081c185e5b595b9d60621b6044820152606401610b7b565b60005b878110156110c257806009546110959190613474565b60405133906000906000805160206135e8833981519152908290a46110bb600182613474565b905061107f565b508034111561110357336108fc6110d983346134bf565b6040518115909202916000818181858888f19350505050158015611101573d6000803e3d6000fd5b505b6009546000908152600b6020526040902080546001600160a01b0319163390811790915561113190886121fe565b86600560008282546111439190613474565b9091555050336000908152600e602052604081208054899290611167908490613474565b909155505050505050505050565b6001600160a01b0381166000908152600d6020526040812054156111af57506001600160a01b03166000908152600d602052604090205490565b5050600454600160301b900461ffff1690565b610dbb83838361226c565b6000546001600160a01b031633146111f75760405162461bcd60e51b8152600401610b7b9061343f565b6004805467ffff000000000000191660ff92909216600160301b02919091179055565b6000546001600160a01b031633146112445760405162461bcd60e51b8152600401610b7b9061343f565b6004805465ffff00000000191660ff9290921664010000000002919091179055565b610dbb83838360405180602001604052806000815250611922565b6000546001600160a01b031633146112ab5760405162461bcd60e51b8152600401610b7b9061343f565b600855565b6000546001600160a01b031633146112da5760405162461bcd60e51b8152600401610b7b9061343f565b6112e481476124c5565b50565b6000546001600160a01b031633146113115760405162461bcd60e51b8152600401610b7b9061343f565b60005b82811015611360578060095461132a9190613474565b6040516001600160a01b038416906000906000805160206135e8833981519152908290a4611359600182613474565b9050611314565b506009546000908152600b6020526040902080546001600160a01b0319166001600160a01b03831617905561139581836121fe565b81600560008282546113a79190613474565b90915550505050565b6000546001600160a01b031633146113da5760405162461bcd60e51b8152600401610b7b9061343f565b80516113ed906011906020840190612da9565b5050565b6000600954821061140457506000919050565b815b60018111801561142b57506000818152600b60205260409020546001600160a01b0316155b156114425761143b6001826134bf565b9050611406565b6000908152600b60205260409020546001600160a01b031692915050565b6000546001600160a01b0316331461148a5760405162461bcd60e51b8152600401610b7b9061343f565b6004805463ffff0000191660ff929092166201000002919091179055565b601180546114b590613502565b80601f01602080910402602001604051908101604052809291908181526020018280546114e190613502565b801561152e5780601f106115035761010080835404028352916020019161152e565b820191906000526020600020905b81548152906001019060200180831161151157829003601f168201915b505050505081565b6000546001600160a01b031633146115605760405162461bcd60e51b8152600401610b7b9061343f565b61156a60006125de565b565b6000546001600160a01b031633146115965760405162461bcd60e51b8152600401610b7b9061343f565b6006805463ffffff0019166301000000179055565b6000546001600160a01b031633146115d55760405162461bcd60e51b8152600401610b7b9061343f565b600755565b606060038054610ba290613502565b600454336000908152600c60205260409020546201000090910461ffff1690611613908390613474565b11156116545760405162461bcd60e51b815260206004820152601060248201526f11549493d48e88139195081b1a5b5a5d60821b6044820152606401610b7b565b6006546301000000900460ff166116ad5760405162461bcd60e51b815260206004820152601760248201527f5075626c69632073616c65206973206e6f74206f70656e0000000000000000006044820152606401610b7b565b60045460055461ffff909116906116c5908390613474565b11156116e35760405162461bcd60e51b8152600401610b7b90613417565b6000816008546116f391906134a0565b90508034101561173c5760405162461bcd60e51b8152602060048201526014602482015273125b9cdd59999a58da595b9d081c185e5b595b9d60621b6044820152606401610b7b565b8034111561177c57336108fc61175283346134bf565b6040518115909202916000818181858888f1935050505015801561177a573d6000803e3d6000fd5b505b60005b828110156117c257806009546117959190613474565b60405133906000906000805160206135e8833981519152908290a46117bb600182613474565b905061177f565b506009546000908152600b6020526040902080546001600160a01b0319163390811790915561139590836121fe565b6113ed33838361262e565b6000546001600160a01b031633146118265760405162461bcd60e51b8152600401610b7b9061343f565b6006805460ff19166001179055565b6000546001600160a01b0316331461185f5760405162461bcd60e51b8152600401610b7b9061343f565b60068054911515620100000262ff000019909216919091179055565b6000546001600160a01b031633146118a55760405162461bcd60e51b8152600401610b7b9061343f565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152600f60205260408120541561190157506001600160a01b03166000908152600f602052604090205490565b5050600454640100000000900461ffff1690565b601280546114b590613502565b61192d84848461226c565b611939848484846126fd565b611956576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b601380546114b590613502565b60606005548211156119d55760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b7b565b60065460ff16611a7157601280546119ec90613502565b80601f0160208091040260200160405190810160405280929190818152602001828054611a1890613502565b8015611a655780601f10611a3a57610100808354040283529160200191611a65565b820191906000526020600020905b815481529060010190602001808311611a4857829003601f168201915b50505050509050919050565b600060118054611a8090613502565b80601f0160208091040260200160405190810160405280929190818152602001828054611aac90613502565b8015611af95780601f10611ace57610100808354040283529160200191611af9565b820191906000526020600020905b815481529060010190602001808311611adc57829003601f168201915b505050505090506000815111611b1e5760405180602001604052806000815250611b4c565b80611b288461280c565b6013604051602001611b3c93929190613305565b6040516020818303038152906040525b9392505050565b6000546001600160a01b03163314611b7d5760405162461bcd60e51b8152600401610b7b9061343f565b6004805461ffff191661ffff92909216919091179055565b6000546001600160a01b03163314611bbf5760405162461bcd60e51b8152600401610b7b9061343f565b600680549115156101000261ff0019909216919091179055565b6040805180820190915260048152632d41442d60e01b6020820152600154839183916001600160a01b0316611c415760405162461bcd60e51b815260206004820152600e60248201526d14da59db995c88139bdd0814d95d60921b6044820152606401610b7b565b611c4c8383836121d2565b611c8c5760405162461bcd60e51b81526020600482015260116024820152704e6f742057686974656c6973746564203160781b6044820152606401610b7b565b611c95336118c7565b33600090815260106020526040902054611cb0908890613474565b1115611cfe5760405162461bcd60e51b815260206004820152601760248201527f4552524f523a2041697264726f70206c696d69746564210000000000000000006044820152606401610b7b565b60065462010000900460ff16611d4c5760405162461bcd60e51b815260206004820152601360248201527220b4b9323937b81034b9903737ba1037b832b760691b6044820152606401610b7b565b60045460055461ffff90911690611d64908890613474565b1115611d825760405162461bcd60e51b8152600401610b7b90613417565b60005b86811015611dc85780600954611d9b9190613474565b60405133906000906000805160206135e8833981519152908290a4611dc1600182613474565b9050611d85565b506009546000908152600b6020526040902080546001600160a01b03191633908117909155611df790876121fe565b8560056000828254611e099190613474565b90915550503360009081526010602052604081208054889290611e2d908490613474565b9091555050505050505050565b6000546001600160a01b03163314611e645760405162461bcd60e51b8152600401610b7b9061343f565b80516113ed906013906020840190612da9565b6000546001600160a01b03163314611ea15760405162461bcd60e51b8152600401610b7b9061343f565b60005b83811015610e8157828282818110611ecc57634e487b7160e01b600052603260045260246000fd5b90506020020135600f6000878785818110611ef757634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611f0c9190612efb565b6001600160a01b03168152602081019190915260400160002055611f31600182613474565b9050611ea4565b6001600160a01b03918216600090815260156020908152604080832093909416825291909152205460ff1690565b6000546001600160a01b03163314611f905760405162461bcd60e51b8152600401610b7b9061343f565b6001600160a01b038116611ff55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b7b565b6112e4816125de565b6000546001600160a01b031633146120285760405162461bcd60e51b8152600401610b7b9061343f565b80516113ed906012906020840190612da9565b6000546001600160a01b031633146120655760405162461bcd60e51b8152600401610b7b9061343f565b6040516370a0823160e01b81523060048201526001600160a01b0383169063a9059cbb90839083906370a082319060240160206040518083038186803b1580156120ae57600080fd5b505afa1580156120c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e691906131bd565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561212c57600080fd5b505af1158015612140573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dbb91906130e9565b600081815260146020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612199826113f1565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6001546000906001600160a01b03166121ec858585612926565b6001600160a01b031614949350505050565b6001600160a01b0382166000908152600a602052604081208054839290612226908490613474565b90915550506001600160a01b0382166000908152600c602052604081208054839290612253908490613474565b9250508190555080600960008282546113a79190613474565b6000612277826113f1565b9050826001600160a01b0316846001600160a01b031614156122db5760405162461bcd60e51b815260206004820152601f60248201527f596f752063616e6e6f74207472616e7366657220746f20796f757273656c66006044820152606401610b7b565b806001600160a01b0316846001600160a01b0316146123335760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642066726f6d206164647265737360601b6044820152606401610b7b565b336001600160a01b038216148061234f575061234f8133611f38565b8061236a57503361235f83610c25565b6001600160a01b0316145b6123a65760405162461bcd60e51b815260206004820152600d60248201526c1058d8d95cdcc819195b9a5959609a1b6044820152606401610b7b565b6123b1600083612164565b6000828152600b6020526040812080546001600160a01b0319166001600160a01b0386161790556123e3836001613474565b6000818152600b60205260409020549091506001600160a01b031615801561240c575060095481105b15612439576000818152600b6020526040902080546001600160a01b0319166001600160a01b0384161790555b6001600160a01b0382166000908152600a602052604081208054600192906124629084906134bf565b90915550506001600160a01b0384166000908152600a60205260408120805460019290612490908490613474565b909155505060405183906001600160a01b0380871691908816906000805160206135e883398151915290600090a45050505050565b804710156125155760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b7b565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612562576040519150601f19603f3d011682016040523d82523d6000602084013e612567565b606091505b5050905080610dbb5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b7b565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b031614156126905760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b7b565b6001600160a01b03838116600081815260156020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60006001600160a01b0384163b1561280057604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906127419033908990889088906004016133c7565b602060405180830381600087803b15801561275b57600080fd5b505af192505050801561278b575060408051601f3d908101601f1916820190925261278891810190613121565b60015b6127e6573d8080156127b9576040519150601f19603f3d011682016040523d82523d6000602084013e6127be565b606091505b5080516127de576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612804565b5060015b949350505050565b6060816128305750506040805180820190915260018152600360fc1b602082015290565b8160005b811561285a57806128448161353d565b91506128539050600a8361348c565b9150612834565b60008167ffffffffffffffff81111561288357634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156128ad576020820181803683370190505b5090505b8415612804576128c26001836134bf565b91506128cf600a86613558565b6128da906030613474565b60f81b8183815181106128fd57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061291f600a8661348c565b94506128b1565b60008030833360405160200161293e939291906132bd565b60408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c82018190529150605c016040516020818303038152906040528051906020012090506129e585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525085939250506129ee9050565b95945050505050565b60008060006129fd8585612a12565b91509150612a0a81612a82565b509392505050565b600080825160411415612a495760208301516040840151606085015160001a612a3d87828585612c83565b94509450505050612a7b565b825160401415612a735760208301516040840151612a68868383612d70565b935093505050612a7b565b506000905060025b9250929050565b6000816004811115612aa457634e487b7160e01b600052602160045260246000fd5b1415612aad5750565b6001816004811115612acf57634e487b7160e01b600052602160045260246000fd5b1415612b1d5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610b7b565b6002816004811115612b3f57634e487b7160e01b600052602160045260246000fd5b1415612b8d5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610b7b565b6003816004811115612baf57634e487b7160e01b600052602160045260246000fd5b1415612c085760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610b7b565b6004816004811115612c2a57634e487b7160e01b600052602160045260246000fd5b14156112e45760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610b7b565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612cba5750600090506003612d67565b8460ff16601b14158015612cd257508460ff16601c14155b15612ce35750600090506004612d67565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612d37573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612d6057600060019250925050612d67565b9150600090505b94509492505050565b6000806001600160ff1b03831681612d8d60ff86901c601b613474565b9050612d9b87828885612c83565b935093505050935093915050565b828054612db590613502565b90600052602060002090601f016020900481019282612dd75760008555612e1d565b82601f10612df057805160ff1916838001178555612e1d565b82800160010185558215612e1d579182015b82811115612e1d578251825591602001919060010190612e02565b50612e29929150612e2d565b5090565b5b80821115612e295760008155600101612e2e565b600067ffffffffffffffff80841115612e5d57612e5d613598565b604051601f8501601f19908116603f01168101908282118183101715612e8557612e85613598565b81604052809350858152868686011115612e9e57600080fd5b858560208301376000602087830101525050509392505050565b60008083601f840112612ec9578182fd5b50813567ffffffffffffffff811115612ee0578182fd5b6020830191508360208260051b8501011115612a7b57600080fd5b600060208284031215612f0c578081fd5b8135611b4c816135ae565b60008060408385031215612f29578081fd5b8235612f34816135ae565b91506020830135612f44816135ae565b809150509250929050565b600080600060608486031215612f63578081fd5b8335612f6e816135ae565b92506020840135612f7e816135ae565b929592945050506040919091013590565b60008060008060808587031215612fa4578081fd5b8435612faf816135ae565b93506020850135612fbf816135ae565b925060408501359150606085013567ffffffffffffffff811115612fe1578182fd5b8501601f81018713612ff1578182fd5b61300087823560208401612e42565b91505092959194509250565b6000806040838503121561301e578182fd5b8235613029816135ae565b91506020830135612f44816135c3565b6000806040838503121561304b578182fd5b8235613056816135ae565b946020939093013593505050565b60008060008060408587031215613079578384fd5b843567ffffffffffffffff80821115613090578586fd5b61309c88838901612eb8565b909650945060208701359150808211156130b4578384fd5b506130c187828801612eb8565b95989497509550505050565b6000602082840312156130de578081fd5b8135611b4c816135c3565b6000602082840312156130fa578081fd5b8151611b4c816135c3565b600060208284031215613116578081fd5b8135611b4c816135d1565b600060208284031215613132578081fd5b8151611b4c816135d1565b60006020828403121561314e578081fd5b813567ffffffffffffffff811115613164578182fd5b8201601f81018413613174578182fd5b61280484823560208401612e42565b600060208284031215613194578081fd5b813561ffff81168114611b4c578182fd5b6000602082840312156131b6578081fd5b5035919050565b6000602082840312156131ce578081fd5b5051919050565b600080604083850312156131e7578182fd5b823591506020830135612f44816135ae565b60008060006040848603121561320d578081fd5b83359250602084013567ffffffffffffffff8082111561322b578283fd5b818601915086601f83011261323e578283fd5b81358181111561324c578384fd5b87602082850101111561325d578384fd5b6020830194508093505050509250925092565b600060208284031215613281578081fd5b813560ff81168114611b4c578182fd5b600081518084526132a98160208601602086016134d6565b601f01601f19169290920160200192915050565b60006bffffffffffffffffffffffff19808660601b16835284516132e88160148601602089016134d6565b60609490941b169190920160148101919091526028019392505050565b6000845160206133188285838a016134d6565b85519184019161332b8184848a016134d6565b85549201918390600181811c908083168061334757607f831692505b85831081141561336557634e487b7160e01b88526022600452602488fd5b808015613379576001811461338a576133b6565b60ff198516885283880195506133b6565b60008b815260209020895b858110156133ae5781548a820152908401908801613395565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906133fa90830184613291565b9695505050505050565b602081526000611b4c6020830184613291565b6020808252600e908201526d125b9d985b1a5908185b5bdd5b9d60921b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600082198211156134875761348761356c565b500190565b60008261349b5761349b613582565b500490565b60008160001904831182151516156134ba576134ba61356c565b500290565b6000828210156134d1576134d161356c565b500390565b60005b838110156134f15781810151838201526020016134d9565b838111156119565750506000910152565b600181811c9082168061351657607f821691505b6020821081141561353757634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156135515761355161356c565b5060010190565b60008261356757613567613582565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146112e457600080fd5b80151581146112e457600080fd5b6001600160e01b0319811681146112e457600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220b109f4e26cd1d18043d23c428e73ef7dc2183755bd17583e259b5b87afdd38a664736f6c63430008040033000000000000000000000000635be83d56fe9b6a9f9a232f8d051eff9a415f13

Deployed Bytecode

0x60806040526004361061038c5760003560e01c80638611244c116101dc578063bee6348a11610102578063d5279b37116100a0578063e985e9c51161006f578063e985e9c514610a7f578063f2fde38b14610a9f578063fe2c7fee14610abf578063feaea58614610adf57600080fd5b8063d5279b37146109fc578063da3ef23f14610a1c578063df1b542a14610a3c578063df2659bb14610a5f57600080fd5b8063c87b56dd116100dc578063c87b56dd1461096f578063cdc324a91461098f578063cfbe7355146109bc578063d1454bf4146109dc57600080fd5b8063bee6348a14610919578063bfcc78cc14610938578063c66828621461095a57600080fd5b8063a0f45b691161017a578063b47876ea11610149578063b47876ea146108a4578063b4a0dd4f146108c4578063b584b78d146108e4578063b88d4fde146108f957600080fd5b8063a0f45b6914610819578063a22cb4651461084f578063a475b5dd1461086f578063a61b72951461088457600080fd5b806395d89b41116101b657806395d89b41146107a3578063964c33b5146107b85780639c3e73c3146107e5578063a0712d681461080657600080fd5b80638611244c146107505780638da5cb5b146107655780638fdcf9421461078357600080fd5b806335fb7d69116102c157806355f804b31161025f5780636c0360eb1161022e5780636c0360eb146106c357806370a08231146106d8578063715018a61461070e57806381e1943b1461072357600080fd5b806355f804b31461064357806359862f3b146106635780636352211e146106835780636833a228146106a357600080fd5b806344a0d68a1161029b57806344a0d68a146105c957806351830227146105e957806351cff8d914610603578063538dba3e1461062357600080fd5b806335fb7d691461056e57806342842e0e1461058e57806342ca1d09146105ae57600080fd5b806313faede61161032e57806323b872dd1161030857806323b872dd146104e45780632a23d07d146105045780632a484ad41461051a57806334cd27f11461054e57600080fd5b806313faede61461048a57806314102159146104ae57806318160ddd146104ce57600080fd5b8063081812fc1161036a578063081812fc146103ff578063095ea7b3146104375780630c93cb1f146104575780630d06ed721461047757600080fd5b806301ffc9a71461039157806303a17969146103c657806306fdde03146103dd575b600080fd5b34801561039d57600080fd5b506103b16103ac366004613105565b610aff565b60405190151581526020015b60405180910390f35b3480156103d257600080fd5b506103db610b51565b005b3480156103e957600080fd5b506103f2610b93565b6040516103bd9190613404565b34801561040b57600080fd5b5061041f61041a3660046131a5565b610c25565b6040516001600160a01b0390911681526020016103bd565b34801561044357600080fd5b506103db610452366004613039565b610caa565b34801561046357600080fd5b506103db610472366004613064565b610dc0565b6103db6104853660046131f9565b610e88565b34801561049657600080fd5b506104a060085481565b6040519081526020016103bd565b3480156104ba57600080fd5b506104a06104c9366004612efb565b611175565b3480156104da57600080fd5b506104a060055481565b3480156104f057600080fd5b506103db6104ff366004612f4f565b6111c2565b34801561051057600080fd5b506104a060075481565b34801561052657600080fd5b5060045461053b9062010000900461ffff1681565b60405161ffff90911681526020016103bd565b34801561055a57600080fd5b506103db610569366004613270565b6111cd565b34801561057a57600080fd5b506103db610589366004613270565b61121a565b34801561059a57600080fd5b506103db6105a9366004612f4f565b611266565b3480156105ba57600080fd5b5060045461053b9061ffff1681565b3480156105d557600080fd5b506103db6105e43660046131a5565b611281565b3480156105f557600080fd5b506006546103b19060ff1681565b34801561060f57600080fd5b506103db61061e366004612efb565b6112b0565b34801561062f57600080fd5b506103db61063e3660046131d5565b6112e7565b34801561064f57600080fd5b506103db61065e36600461313d565b6113b0565b34801561066f57600080fd5b506006546103b19062010000900460ff1681565b34801561068f57600080fd5b5061041f61069e3660046131a5565b6113f1565b3480156106af57600080fd5b506103db6106be366004613270565b611460565b3480156106cf57600080fd5b506103f26114a8565b3480156106e457600080fd5b506104a06106f3366004612efb565b6001600160a01b03166000908152600a602052604090205490565b34801561071a57600080fd5b506103db611536565b34801561072f57600080fd5b506104a061073e366004612efb565b600e6020526000908152604090205481565b34801561075c57600080fd5b506103db61156c565b34801561077157600080fd5b506000546001600160a01b031661041f565b34801561078f57600080fd5b506103db61079e3660046131a5565b6115ab565b3480156107af57600080fd5b506103f26115da565b3480156107c457600080fd5b506104a06107d3366004612efb565b600c6020526000908152604090205481565b3480156107f157600080fd5b506006546103b1906301000000900460ff1681565b6103db6108143660046131a5565b6115e9565b34801561082557600080fd5b5061041f6108343660046131a5565b600b602052600090815260409020546001600160a01b031681565b34801561085b57600080fd5b506103db61086a36600461300c565b6117f1565b34801561087b57600080fd5b506103db6117fc565b34801561089057600080fd5b506103db61089f3660046130cd565b611835565b3480156108b057600080fd5b506103db6108bf366004612efb565b61187b565b3480156108d057600080fd5b506104a06108df366004612efb565b6118c7565b3480156108f057600080fd5b506103f2611915565b34801561090557600080fd5b506103db610914366004612f8f565b611922565b34801561092557600080fd5b506006546103b190610100900460ff1681565b34801561094457600080fd5b5060045461053b90600160301b900461ffff1681565b34801561096657600080fd5b506103f261195c565b34801561097b57600080fd5b506103f261098a3660046131a5565b611969565b34801561099b57600080fd5b506104a06109aa366004612efb565b60106020526000908152604090205481565b3480156109c857600080fd5b506103db6109d7366004613183565b611b53565b3480156109e857600080fd5b506103db6109f73660046130cd565b611b95565b348015610a0857600080fd5b506103db610a173660046131f9565b611bd9565b348015610a2857600080fd5b506103db610a3736600461313d565b611e3a565b348015610a4857600080fd5b5060045461053b90640100000000900461ffff1681565b348015610a6b57600080fd5b506103db610a7a366004613064565b611e77565b348015610a8b57600080fd5b506103b1610a9a366004612f17565b611f38565b348015610aab57600080fd5b506103db610aba366004612efb565b611f66565b348015610acb57600080fd5b506103db610ada36600461313d565b611ffe565b348015610aeb57600080fd5b506103db610afa366004612f17565b61203b565b60006001600160e01b031982166380ac58cd60e01b1480610b3057506001600160e01b03198216635b5e139f60e01b145b80610b4b57506001600160e01b031982166301ffc9a760e01b145b92915050565b6000546001600160a01b03163314610b845760405162461bcd60e51b8152600401610b7b9061343f565b60405180910390fd5b6006805463ff00000019169055565b606060028054610ba290613502565b80601f0160208091040260200160405190810160405280929190818152602001828054610bce90613502565b8015610c1b5780601f10610bf057610100808354040283529160200191610c1b565b820191906000526020600020905b815481529060010190602001808311610bfe57829003601f168201915b5050505050905090565b6000600554821115610c8e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b7b565b506000908152601460205260409020546001600160a01b031690565b6000610cb5826113f1565b9050806001600160a01b0316836001600160a01b03161415610d235760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b7b565b336001600160a01b0382161480610d3f5750610d3f8133611f38565b610db15760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b7b565b610dbb8383612164565b505050565b6000546001600160a01b03163314610dea5760405162461bcd60e51b8152600401610b7b9061343f565b60005b83811015610e8157828282818110610e1557634e487b7160e01b600052603260045260246000fd5b90506020020135600d6000878785818110610e4057634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610e559190612efb565b6001600160a01b03168152602081019190915260400160002055610e7a600182613474565b9050610ded565b5050505050565b6040805180820190915260048152632d574c2d60e01b6020820152600154839183916001600160a01b0316610ef05760405162461bcd60e51b815260206004820152600e60248201526d14da59db995c88139bdd0814d95d60921b6044820152606401610b7b565b610efb8383836121d2565b610f3b5760405162461bcd60e51b81526020600482015260116024820152704e6f742057686974656c6973746564203160781b6044820152606401610b7b565b610f4433611175565b336000908152600e6020526040902054610f5f908890613474565b1115610fa05760405162461bcd60e51b815260206004820152601060248201526f11549493d48e88139195081b1a5b5a5d60821b6044820152606401610b7b565b600654610100900460ff16610fed5760405162461bcd60e51b8152602060048201526013602482015272283932b9b0b6329034b9903737ba1037b832b760691b6044820152606401610b7b565b60045460055461ffff90911690611005908890613474565b11156110235760405162461bcd60e51b8152600401610b7b90613417565b60008660075461103391906134a0565b90508034101561107c5760405162461bcd60e51b8152602060048201526014602482015273125b9cdd59999a58da595b9d081c185e5b595b9d60621b6044820152606401610b7b565b60005b878110156110c257806009546110959190613474565b60405133906000906000805160206135e8833981519152908290a46110bb600182613474565b905061107f565b508034111561110357336108fc6110d983346134bf565b6040518115909202916000818181858888f19350505050158015611101573d6000803e3d6000fd5b505b6009546000908152600b6020526040902080546001600160a01b0319163390811790915561113190886121fe565b86600560008282546111439190613474565b9091555050336000908152600e602052604081208054899290611167908490613474565b909155505050505050505050565b6001600160a01b0381166000908152600d6020526040812054156111af57506001600160a01b03166000908152600d602052604090205490565b5050600454600160301b900461ffff1690565b610dbb83838361226c565b6000546001600160a01b031633146111f75760405162461bcd60e51b8152600401610b7b9061343f565b6004805467ffff000000000000191660ff92909216600160301b02919091179055565b6000546001600160a01b031633146112445760405162461bcd60e51b8152600401610b7b9061343f565b6004805465ffff00000000191660ff9290921664010000000002919091179055565b610dbb83838360405180602001604052806000815250611922565b6000546001600160a01b031633146112ab5760405162461bcd60e51b8152600401610b7b9061343f565b600855565b6000546001600160a01b031633146112da5760405162461bcd60e51b8152600401610b7b9061343f565b6112e481476124c5565b50565b6000546001600160a01b031633146113115760405162461bcd60e51b8152600401610b7b9061343f565b60005b82811015611360578060095461132a9190613474565b6040516001600160a01b038416906000906000805160206135e8833981519152908290a4611359600182613474565b9050611314565b506009546000908152600b6020526040902080546001600160a01b0319166001600160a01b03831617905561139581836121fe565b81600560008282546113a79190613474565b90915550505050565b6000546001600160a01b031633146113da5760405162461bcd60e51b8152600401610b7b9061343f565b80516113ed906011906020840190612da9565b5050565b6000600954821061140457506000919050565b815b60018111801561142b57506000818152600b60205260409020546001600160a01b0316155b156114425761143b6001826134bf565b9050611406565b6000908152600b60205260409020546001600160a01b031692915050565b6000546001600160a01b0316331461148a5760405162461bcd60e51b8152600401610b7b9061343f565b6004805463ffff0000191660ff929092166201000002919091179055565b601180546114b590613502565b80601f01602080910402602001604051908101604052809291908181526020018280546114e190613502565b801561152e5780601f106115035761010080835404028352916020019161152e565b820191906000526020600020905b81548152906001019060200180831161151157829003601f168201915b505050505081565b6000546001600160a01b031633146115605760405162461bcd60e51b8152600401610b7b9061343f565b61156a60006125de565b565b6000546001600160a01b031633146115965760405162461bcd60e51b8152600401610b7b9061343f565b6006805463ffffff0019166301000000179055565b6000546001600160a01b031633146115d55760405162461bcd60e51b8152600401610b7b9061343f565b600755565b606060038054610ba290613502565b600454336000908152600c60205260409020546201000090910461ffff1690611613908390613474565b11156116545760405162461bcd60e51b815260206004820152601060248201526f11549493d48e88139195081b1a5b5a5d60821b6044820152606401610b7b565b6006546301000000900460ff166116ad5760405162461bcd60e51b815260206004820152601760248201527f5075626c69632073616c65206973206e6f74206f70656e0000000000000000006044820152606401610b7b565b60045460055461ffff909116906116c5908390613474565b11156116e35760405162461bcd60e51b8152600401610b7b90613417565b6000816008546116f391906134a0565b90508034101561173c5760405162461bcd60e51b8152602060048201526014602482015273125b9cdd59999a58da595b9d081c185e5b595b9d60621b6044820152606401610b7b565b8034111561177c57336108fc61175283346134bf565b6040518115909202916000818181858888f1935050505015801561177a573d6000803e3d6000fd5b505b60005b828110156117c257806009546117959190613474565b60405133906000906000805160206135e8833981519152908290a46117bb600182613474565b905061177f565b506009546000908152600b6020526040902080546001600160a01b0319163390811790915561139590836121fe565b6113ed33838361262e565b6000546001600160a01b031633146118265760405162461bcd60e51b8152600401610b7b9061343f565b6006805460ff19166001179055565b6000546001600160a01b0316331461185f5760405162461bcd60e51b8152600401610b7b9061343f565b60068054911515620100000262ff000019909216919091179055565b6000546001600160a01b031633146118a55760405162461bcd60e51b8152600401610b7b9061343f565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152600f60205260408120541561190157506001600160a01b03166000908152600f602052604090205490565b5050600454640100000000900461ffff1690565b601280546114b590613502565b61192d84848461226c565b611939848484846126fd565b611956576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b601380546114b590613502565b60606005548211156119d55760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b7b565b60065460ff16611a7157601280546119ec90613502565b80601f0160208091040260200160405190810160405280929190818152602001828054611a1890613502565b8015611a655780601f10611a3a57610100808354040283529160200191611a65565b820191906000526020600020905b815481529060010190602001808311611a4857829003601f168201915b50505050509050919050565b600060118054611a8090613502565b80601f0160208091040260200160405190810160405280929190818152602001828054611aac90613502565b8015611af95780601f10611ace57610100808354040283529160200191611af9565b820191906000526020600020905b815481529060010190602001808311611adc57829003601f168201915b505050505090506000815111611b1e5760405180602001604052806000815250611b4c565b80611b288461280c565b6013604051602001611b3c93929190613305565b6040516020818303038152906040525b9392505050565b6000546001600160a01b03163314611b7d5760405162461bcd60e51b8152600401610b7b9061343f565b6004805461ffff191661ffff92909216919091179055565b6000546001600160a01b03163314611bbf5760405162461bcd60e51b8152600401610b7b9061343f565b600680549115156101000261ff0019909216919091179055565b6040805180820190915260048152632d41442d60e01b6020820152600154839183916001600160a01b0316611c415760405162461bcd60e51b815260206004820152600e60248201526d14da59db995c88139bdd0814d95d60921b6044820152606401610b7b565b611c4c8383836121d2565b611c8c5760405162461bcd60e51b81526020600482015260116024820152704e6f742057686974656c6973746564203160781b6044820152606401610b7b565b611c95336118c7565b33600090815260106020526040902054611cb0908890613474565b1115611cfe5760405162461bcd60e51b815260206004820152601760248201527f4552524f523a2041697264726f70206c696d69746564210000000000000000006044820152606401610b7b565b60065462010000900460ff16611d4c5760405162461bcd60e51b815260206004820152601360248201527220b4b9323937b81034b9903737ba1037b832b760691b6044820152606401610b7b565b60045460055461ffff90911690611d64908890613474565b1115611d825760405162461bcd60e51b8152600401610b7b90613417565b60005b86811015611dc85780600954611d9b9190613474565b60405133906000906000805160206135e8833981519152908290a4611dc1600182613474565b9050611d85565b506009546000908152600b6020526040902080546001600160a01b03191633908117909155611df790876121fe565b8560056000828254611e099190613474565b90915550503360009081526010602052604081208054889290611e2d908490613474565b9091555050505050505050565b6000546001600160a01b03163314611e645760405162461bcd60e51b8152600401610b7b9061343f565b80516113ed906013906020840190612da9565b6000546001600160a01b03163314611ea15760405162461bcd60e51b8152600401610b7b9061343f565b60005b83811015610e8157828282818110611ecc57634e487b7160e01b600052603260045260246000fd5b90506020020135600f6000878785818110611ef757634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611f0c9190612efb565b6001600160a01b03168152602081019190915260400160002055611f31600182613474565b9050611ea4565b6001600160a01b03918216600090815260156020908152604080832093909416825291909152205460ff1690565b6000546001600160a01b03163314611f905760405162461bcd60e51b8152600401610b7b9061343f565b6001600160a01b038116611ff55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b7b565b6112e4816125de565b6000546001600160a01b031633146120285760405162461bcd60e51b8152600401610b7b9061343f565b80516113ed906012906020840190612da9565b6000546001600160a01b031633146120655760405162461bcd60e51b8152600401610b7b9061343f565b6040516370a0823160e01b81523060048201526001600160a01b0383169063a9059cbb90839083906370a082319060240160206040518083038186803b1580156120ae57600080fd5b505afa1580156120c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e691906131bd565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561212c57600080fd5b505af1158015612140573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dbb91906130e9565b600081815260146020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612199826113f1565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6001546000906001600160a01b03166121ec858585612926565b6001600160a01b031614949350505050565b6001600160a01b0382166000908152600a602052604081208054839290612226908490613474565b90915550506001600160a01b0382166000908152600c602052604081208054839290612253908490613474565b9250508190555080600960008282546113a79190613474565b6000612277826113f1565b9050826001600160a01b0316846001600160a01b031614156122db5760405162461bcd60e51b815260206004820152601f60248201527f596f752063616e6e6f74207472616e7366657220746f20796f757273656c66006044820152606401610b7b565b806001600160a01b0316846001600160a01b0316146123335760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642066726f6d206164647265737360601b6044820152606401610b7b565b336001600160a01b038216148061234f575061234f8133611f38565b8061236a57503361235f83610c25565b6001600160a01b0316145b6123a65760405162461bcd60e51b815260206004820152600d60248201526c1058d8d95cdcc819195b9a5959609a1b6044820152606401610b7b565b6123b1600083612164565b6000828152600b6020526040812080546001600160a01b0319166001600160a01b0386161790556123e3836001613474565b6000818152600b60205260409020549091506001600160a01b031615801561240c575060095481105b15612439576000818152600b6020526040902080546001600160a01b0319166001600160a01b0384161790555b6001600160a01b0382166000908152600a602052604081208054600192906124629084906134bf565b90915550506001600160a01b0384166000908152600a60205260408120805460019290612490908490613474565b909155505060405183906001600160a01b0380871691908816906000805160206135e883398151915290600090a45050505050565b804710156125155760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b7b565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612562576040519150601f19603f3d011682016040523d82523d6000602084013e612567565b606091505b5050905080610dbb5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b7b565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b031614156126905760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b7b565b6001600160a01b03838116600081815260156020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60006001600160a01b0384163b1561280057604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906127419033908990889088906004016133c7565b602060405180830381600087803b15801561275b57600080fd5b505af192505050801561278b575060408051601f3d908101601f1916820190925261278891810190613121565b60015b6127e6573d8080156127b9576040519150601f19603f3d011682016040523d82523d6000602084013e6127be565b606091505b5080516127de576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612804565b5060015b949350505050565b6060816128305750506040805180820190915260018152600360fc1b602082015290565b8160005b811561285a57806128448161353d565b91506128539050600a8361348c565b9150612834565b60008167ffffffffffffffff81111561288357634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156128ad576020820181803683370190505b5090505b8415612804576128c26001836134bf565b91506128cf600a86613558565b6128da906030613474565b60f81b8183815181106128fd57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061291f600a8661348c565b94506128b1565b60008030833360405160200161293e939291906132bd565b60408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c82018190529150605c016040516020818303038152906040528051906020012090506129e585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525085939250506129ee9050565b95945050505050565b60008060006129fd8585612a12565b91509150612a0a81612a82565b509392505050565b600080825160411415612a495760208301516040840151606085015160001a612a3d87828585612c83565b94509450505050612a7b565b825160401415612a735760208301516040840151612a68868383612d70565b935093505050612a7b565b506000905060025b9250929050565b6000816004811115612aa457634e487b7160e01b600052602160045260246000fd5b1415612aad5750565b6001816004811115612acf57634e487b7160e01b600052602160045260246000fd5b1415612b1d5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610b7b565b6002816004811115612b3f57634e487b7160e01b600052602160045260246000fd5b1415612b8d5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610b7b565b6003816004811115612baf57634e487b7160e01b600052602160045260246000fd5b1415612c085760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610b7b565b6004816004811115612c2a57634e487b7160e01b600052602160045260246000fd5b14156112e45760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610b7b565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612cba5750600090506003612d67565b8460ff16601b14158015612cd257508460ff16601c14155b15612ce35750600090506004612d67565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612d37573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612d6057600060019250925050612d67565b9150600090505b94509492505050565b6000806001600160ff1b03831681612d8d60ff86901c601b613474565b9050612d9b87828885612c83565b935093505050935093915050565b828054612db590613502565b90600052602060002090601f016020900481019282612dd75760008555612e1d565b82601f10612df057805160ff1916838001178555612e1d565b82800160010185558215612e1d579182015b82811115612e1d578251825591602001919060010190612e02565b50612e29929150612e2d565b5090565b5b80821115612e295760008155600101612e2e565b600067ffffffffffffffff80841115612e5d57612e5d613598565b604051601f8501601f19908116603f01168101908282118183101715612e8557612e85613598565b81604052809350858152868686011115612e9e57600080fd5b858560208301376000602087830101525050509392505050565b60008083601f840112612ec9578182fd5b50813567ffffffffffffffff811115612ee0578182fd5b6020830191508360208260051b8501011115612a7b57600080fd5b600060208284031215612f0c578081fd5b8135611b4c816135ae565b60008060408385031215612f29578081fd5b8235612f34816135ae565b91506020830135612f44816135ae565b809150509250929050565b600080600060608486031215612f63578081fd5b8335612f6e816135ae565b92506020840135612f7e816135ae565b929592945050506040919091013590565b60008060008060808587031215612fa4578081fd5b8435612faf816135ae565b93506020850135612fbf816135ae565b925060408501359150606085013567ffffffffffffffff811115612fe1578182fd5b8501601f81018713612ff1578182fd5b61300087823560208401612e42565b91505092959194509250565b6000806040838503121561301e578182fd5b8235613029816135ae565b91506020830135612f44816135c3565b6000806040838503121561304b578182fd5b8235613056816135ae565b946020939093013593505050565b60008060008060408587031215613079578384fd5b843567ffffffffffffffff80821115613090578586fd5b61309c88838901612eb8565b909650945060208701359150808211156130b4578384fd5b506130c187828801612eb8565b95989497509550505050565b6000602082840312156130de578081fd5b8135611b4c816135c3565b6000602082840312156130fa578081fd5b8151611b4c816135c3565b600060208284031215613116578081fd5b8135611b4c816135d1565b600060208284031215613132578081fd5b8151611b4c816135d1565b60006020828403121561314e578081fd5b813567ffffffffffffffff811115613164578182fd5b8201601f81018413613174578182fd5b61280484823560208401612e42565b600060208284031215613194578081fd5b813561ffff81168114611b4c578182fd5b6000602082840312156131b6578081fd5b5035919050565b6000602082840312156131ce578081fd5b5051919050565b600080604083850312156131e7578182fd5b823591506020830135612f44816135ae565b60008060006040848603121561320d578081fd5b83359250602084013567ffffffffffffffff8082111561322b578283fd5b818601915086601f83011261323e578283fd5b81358181111561324c578384fd5b87602082850101111561325d578384fd5b6020830194508093505050509250925092565b600060208284031215613281578081fd5b813560ff81168114611b4c578182fd5b600081518084526132a98160208601602086016134d6565b601f01601f19169290920160200192915050565b60006bffffffffffffffffffffffff19808660601b16835284516132e88160148601602089016134d6565b60609490941b169190920160148101919091526028019392505050565b6000845160206133188285838a016134d6565b85519184019161332b8184848a016134d6565b85549201918390600181811c908083168061334757607f831692505b85831081141561336557634e487b7160e01b88526022600452602488fd5b808015613379576001811461338a576133b6565b60ff198516885283880195506133b6565b60008b815260209020895b858110156133ae5781548a820152908401908801613395565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906133fa90830184613291565b9695505050505050565b602081526000611b4c6020830184613291565b6020808252600e908201526d125b9d985b1a5908185b5bdd5b9d60921b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600082198211156134875761348761356c565b500190565b60008261349b5761349b613582565b500490565b60008160001904831182151516156134ba576134ba61356c565b500290565b6000828210156134d1576134d161356c565b500390565b60005b838110156134f15781810151838201526020016134d9565b838111156119565750506000910152565b600181811c9082168061351657607f821691505b6020821081141561353757634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156135515761355161356c565b5060010190565b60008261356757613567613582565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146112e457600080fd5b80151581146112e457600080fd5b6001600160e01b0319811681146112e457600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220b109f4e26cd1d18043d23c428e73ef7dc2183755bd17583e259b5b87afdd38a664736f6c63430008040033

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

000000000000000000000000635be83d56fe9b6a9f9a232f8d051eff9a415f13

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

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000635be83d56fe9b6a9f9a232f8d051eff9a415f13


Deployed ByteCode Sourcemap

35294:12915:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46637:351;;;;;;;;;;-1:-1:-1;46637:351:0;;;;;:::i;:::-;;:::i;:::-;;;12456:14:1;;12449:22;12431:41;;12419:2;12404:18;46637:351:0;;;;;;;;40417:79;;;;;;;;;;;;;:::i;:::-;;36822:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;37416:314::-;;;;;;;;;;-1:-1:-1;37416:314:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;11475:32:1;;;11457:51;;11445:2;11430:18;37416:314:0;11412:102:1;37008:400:0;;;;;;;;;;-1:-1:-1;37008:400:0;;;;;:::i;:::-;;:::i;40030:231::-;;;;;;;;;;-1:-1:-1;40030:231:0;;;;;:::i;:::-;;:::i;42462:930::-;;;;;;:::i;:::-;;:::i;35882:32::-;;;;;;;;;;;;;;;;;;;22708:25:1;;;22696:2;22681:18;35882:32:0;22663:76:1;38838:179:0;;;;;;;;;;-1:-1:-1;38838:179:0;;;;;:::i;:::-;;:::i;35686:23::-;;;;;;;;;;;;;;;;43884:162;;;;;;;;;;-1:-1:-1;43884:162:0;;;;;:::i;:::-;;:::i;35839:36::-;;;;;;;;;;;;;;;;35546;;;;;;;;;;-1:-1:-1;35546:36:0;;;;;;;;;;;;;;22543:6:1;22531:19;;;22513:38;;22501:2;22486:18;35546:36:0;22468:89:1;39331:118:0;;;;;;;;;;-1:-1:-1;39331:118:0;;;;;:::i;:::-;;:::i;39457:::-;;;;;;;;;;-1:-1:-1;39457:118:0;;;;;:::i;:::-;;:::i;44054:177::-;;;;;;;;;;-1:-1:-1;44054:177:0;;;;;:::i;:::-;;:::i;35504:35::-;;;;;;;;;;-1:-1:-1;35504:35:0;;;;;;;;39025:82;;;;;;;;;;-1:-1:-1;39025:82:0;;;;;:::i;:::-;;:::i;35718:20::-;;;;;;;;;;-1:-1:-1;35718:20:0;;;;;;;;47925:120;;;;;;;;;;-1:-1:-1;47925:120:0;;;;;:::i;:::-;;:::i;43400:303::-;;;;;;;;;;-1:-1:-1;43400:303:0;;;;;:::i;:::-;;:::i;46115:100::-;;;;;;;;;;-1:-1:-1;46115:100:0;;;;;:::i;:::-;;:::i;35777:23::-;;;;;;;;;;-1:-1:-1;35777:23:0;;;;;;;;;;;40627:319;;;;;;;;;;-1:-1:-1;40627:319:0;;;;;:::i;:::-;;:::i;39219:104::-;;;;;;;;;;-1:-1:-1;39219:104:0;;;;;:::i;:::-;;:::i;36334:21::-;;;;;;;;;;;;;:::i;40504:115::-;;;;;;;;;;-1:-1:-1;40504:115:0;;;;;:::i;:::-;-1:-1:-1;;;;;40595:16:0;40568:7;40595:16;;;:9;:16;;;;;;;40504:115;2650:103;;;;;;;;;;;;;:::i;36170:50::-;;;;;;;;;;-1:-1:-1;36170:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;40269:140;;;;;;;;;;;;;:::i;1999:87::-;;;;;;;;;;-1:-1:-1;2045:7:0;2072:6;-1:-1:-1;;;;;2072:6:0;1999:87;;39115:96;;;;;;;;;;-1:-1:-1;39115:96:0;;;;;:::i;:::-;;:::i;36913:87::-;;;;;;;;;;;;;:::i;36067:47::-;;;;;;;;;;-1:-1:-1;36067:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;35807:23;;;;;;;;;;-1:-1:-1;35807:23:0;;;;;;;;;;;40954:801;;;;;;:::i;:::-;;:::i;36016:44::-;;;;;;;;;;-1:-1:-1;36016:44:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;36016:44:0;;;37738:185;;;;;;;;;;-1:-1:-1;37738:185:0;;;;;:::i;:::-;;:::i;46558:71::-;;;;;;;;;;;;;:::i;39687:96::-;;;;;;;;;;-1:-1:-1;39687:96:0;;;;;:::i;:::-;;:::i;34469:91::-;;;;;;;;;;-1:-1:-1;34469:91:0;;;;;:::i;:::-;;:::i;38651:179::-;;;;;;;;;;-1:-1:-1;38651:179:0;;;;;:::i;:::-;;:::i;36362:27::-;;;;;;;;;;;;;:::i;44239:336::-;;;;;;;;;;-1:-1:-1;44239:336:0;;;;;:::i;:::-;;:::i;35747:23::-;;;;;;;;;;-1:-1:-1;35747:23:0;;;;;;;;;;;35636:43;;;;;;;;;;-1:-1:-1;35636:43:0;;;;-1:-1:-1;;;35636:43:0;;;;;;36396:27;;;;;;;;;;;;;:::i;45447:660::-;;;;;;;;;;-1:-1:-1;45447:660:0;;;;;:::i;:::-;;:::i;36276:49::-;;;;;;;;;;-1:-1:-1;36276:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;46447:103;;;;;;;;;;-1:-1:-1;46447:103:0;;;;;:::i;:::-;;:::i;39583:96::-;;;;;;;;;;-1:-1:-1;39583:96:0;;;;;:::i;:::-;;:::i;41763:691::-;;;;;;;;;;-1:-1:-1;41763:691:0;;;;;:::i;:::-;;:::i;46335:104::-;;;;;;;;;;-1:-1:-1;46335:104:0;;;;;:::i;:::-;;:::i;35589:40::-;;;;;;;;;;-1:-1:-1;35589:40:0;;;;;;;;;;;39791:231;;;;;;;;;;-1:-1:-1;39791:231:0;;;;;:::i;:::-;;:::i;37931:214::-;;;;;;;;;;-1:-1:-1;37931:214:0;;;;;:::i;:::-;;:::i;2908:201::-;;;;;;;;;;-1:-1:-1;2908:201:0;;;;;:::i;:::-;;:::i;46223:104::-;;;;;;;;;;-1:-1:-1;46223:104:0;;;;;:::i;:::-;;:::i;48053:153::-;;;;;;;;;;-1:-1:-1;48053:153:0;;;;;:::i;:::-;;:::i;46637:351::-;46776:4;-1:-1:-1;;;;;;46818:40:0;;-1:-1:-1;;;46818:40:0;;:105;;-1:-1:-1;;;;;;;46875:48:0;;-1:-1:-1;;;46875:48:0;46818:105;:162;;;-1:-1:-1;;;;;;;46940:40:0;;-1:-1:-1;;;46940:40:0;46818:162;46798:182;46637:351;-1:-1:-1;;46637:351:0:o;40417:79::-;2045:7;2072:6;-1:-1:-1;;;;;2072:6:0;803:10;2219:23;2211:68;;;;-1:-1:-1;;;2211:68:0;;;;;;;:::i;:::-;;;;;;;;;40469:11:::1;:19:::0;;-1:-1:-1;;40469:19:0::1;::::0;;40417:79::o;36822:83::-;36859:13;36892:5;36885:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36822:83;:::o;37416:314::-;37537:7;37595:11;;37584:7;:22;;37562:116;;;;-1:-1:-1;;;37562:116:0;;19577:2:1;37562:116:0;;;19559:21:1;19616:2;19596:18;;;19589:30;19655:34;19635:18;;;19628:62;-1:-1:-1;;;19706:18:1;;;19699:42;19758:19;;37562:116:0;19549:234:1;37562:116:0;-1:-1:-1;37698:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;37698:24:0;;37416:314::o;37008:400::-;37089:13;37105:16;37113:7;37105;:16::i;:::-;37089:32;;37146:5;-1:-1:-1;;;;;37140:11:0;:2;-1:-1:-1;;;;;37140:11:0;;;37132:57;;;;-1:-1:-1;;;37132:57:0;;21115:2:1;37132:57:0;;;21097:21:1;21154:2;21134:18;;;21127:30;21193:34;21173:18;;;21166:62;-1:-1:-1;;;21244:18:1;;;21237:31;21285:19;;37132:57:0;21087:223:1;37132:57:0;37224:10;-1:-1:-1;;;;;37224:19:0;;;;:58;;;37247:35;37264:5;37271:10;37247:16;:35::i;:::-;37202:164;;;;-1:-1:-1;;;37202:164:0;;18400:2:1;37202:164:0;;;18382:21:1;18439:2;18419:18;;;18412:30;18478:34;18458:18;;;18451:62;18549:26;18529:18;;;18522:54;18593:19;;37202:164:0;18372:246:1;37202:164:0;37379:21;37388:2;37392:7;37379:8;:21::i;:::-;37008:400;;;:::o;40030:231::-;2045:7;2072:6;-1:-1:-1;;;;;2072:6:0;803:10;2219:23;2211:68;;;;-1:-1:-1;;;2211:68:0;;;;;;;:::i;:::-;40137:6:::1;40154:100;40166:16:::0;;::::1;40154:100;;;40232:7;;40240:1;40232:10;;;;;-1:-1:-1::0;;;40232:10:0::1;;;;;;;;;;;;;;;40205:14;:24;40220:5;;40226:1;40220:8;;;;;-1:-1:-1::0;;;40220:8:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;40205:24:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;40205:24:0;:37;40184:4:::1;40187:1;40184:4:::0;::::1;:::i;:::-;;;40154:100;;;2290:1;40030:231:::0;;;;:::o;42462:930::-;35068:219;;;;;;;;;;;;-1:-1:-1;;;35068:219:0;;;;35155:6;;42556:9;;;;-1:-1:-1;;;;;35155:6:0;35147:48;;;;-1:-1:-1;;;35147:48:0;;14371:2:1;35147:48:0;;;14353:21:1;14410:2;14390:18;;;14383:30;-1:-1:-1;;;14429:18:1;;;14422:44;14483:18;;35147:48:0;14343:164:1;35147:48:0;35214:31;35230:9;;35241:3;35214:15;:31::i;:::-;35206:61;;;;-1:-1:-1;;;35206:61:0;;13665:2:1;35206:61:0;;;13647:21:1;13704:2;13684:18;;;13677:30;-1:-1:-1;;;13723:18:1;;;13716:47;13780:18;;35206:61:0;13637:167:1;35206:61:0;42648:24:::1;42661:10;42648:12;:24::i;:::-;42624:10;42608:27;::::0;;;:15:::1;:27;::::0;;;;;:36:::1;::::0;42638:6;;42608:36:::1;:::i;:::-;:64;;42586:130;;;::::0;-1:-1:-1;;;42586:130:0;;16518:2:1;42586:130:0::1;::::0;::::1;16500:21:1::0;16557:2;16537:18;;;16530:30;-1:-1:-1;;;16576:18:1;;;16569:46;16632:18;;42586:130:0::1;16490:166:1::0;42586:130:0::1;42735:11;::::0;::::1;::::0;::::1;;;42727:43;;;::::0;-1:-1:-1;;;42727:43:0;;20767:2:1;42727:43:0::1;::::0;::::1;20749:21:1::0;20806:2;20786:18;;;20779:30;-1:-1:-1;;;20825:18:1;;;20818:49;20884:18;;42727:43:0::1;20739:169:1::0;42727:43:0::1;42813:13;::::0;42789:11:::1;::::0;42813:13:::1;::::0;;::::1;::::0;42789:20:::1;::::0;42803:6;;42789:20:::1;:::i;:::-;:37;;42781:64;;;;-1:-1:-1::0;;;42781:64:0::1;;;;;;;:::i;:::-;42858:17;42892:6;42878:11;;:20;;;;:::i;:::-;42858:40;;42930:9;42917;:22;;42909:55;;;::::0;-1:-1:-1;;;42909:55:0;;19228:2:1;42909:55:0::1;::::0;::::1;19210:21:1::0;19267:2;19247:18;;;19240:30;-1:-1:-1;;;19286:18:1;;;19279:50;19346:18;;42909:55:0::1;19200:170:1::0;42909:55:0::1;42982:9;42977:123;43001:6;42997:1;:10;42977:123;;;43086:1;43070:13;;:17;;;;:::i;:::-;43037:51;::::0;43058:10:::1;::::0;43054:1:::1;::::0;-1:-1:-1;;;;;;;;;;;43037:51:0;43054:1;;43037:51:::1;43009:6;43014:1;43009:6:::0;::::1;:::i;:::-;;;42977:123;;;;43128:9;43116;:21;43112:105;;;43162:10;43154:51;43183:21;43195:9:::0;43183::::1;:21;:::i;:::-;43154:51;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;43112:105;43239:13;::::0;43229:24:::1;::::0;;;:9:::1;:24;::::0;;;;:37;;-1:-1:-1;;;;;;43229:37:0::1;43256:10;43229:37:::0;;::::1;::::0;;;43277:25:::1;::::0;43295:6;43277:5:::1;:25::i;:::-;43330:6;43315:11;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;43363:10:0::1;43347:27;::::0;;;:15:::1;:27;::::0;;;;:37;;43378:6;;43347:27;:37:::1;::::0;43378:6;;43347:37:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;;;42462:930:0:o;38838:179::-;-1:-1:-1;;;;;38916:20:0;;38895:4;38916:20;;;:14;:20;;;;;;:24;38912:57;;-1:-1:-1;;;;;;38949:20:0;;;;;:14;:20;;;;;;;38838:179::o;38912:57::-;-1:-1:-1;;38987:22:0;;-1:-1:-1;;;38987:22:0;;;;;38838:179::o;43884:162::-;44010:28;44020:4;44026:2;44030:7;44010:9;:28::i;39331:118::-;2045:7;2072:6;-1:-1:-1;;;;;2072:6:0;803:10;2219:23;2211:68;;;;-1:-1:-1;;;2211:68:0;;;;;;;:::i;:::-;39410:22:::1;:31:::0;;-1:-1:-1;;39410:31:0::1;;::::0;;;::::1;-1:-1:-1::0;;;39410:31:0::1;::::0;;;::::1;::::0;;39331:118::o;39457:::-;2045:7;2072:6;-1:-1:-1;;;;;2072:6:0;803:10;2219:23;2211:68;;;;-1:-1:-1;;;2211:68:0;;;;;;;:::i;:::-;39536:22:::1;:31:::0;;-1:-1:-1;;39536:31:0::1;;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;39457:118::o;44054:177::-;44184:39;44201:4;44207:2;44211:7;44184:39;;;;;;;;;;;;:16;:39::i;39025:82::-;2045:7;2072:6;-1:-1:-1;;;;;2072:6:0;803:10;2219:23;2211:68;;;;-1:-1:-1;;;2211:68:0;;;;;;;:::i;:::-;39087:4:::1;:12:::0;39025:82::o;47925:120::-;2045:7;2072:6;-1:-1:-1;;;;;2072:6:0;803:10;2219:23;2211:68;;;;-1:-1:-1;;;2211:68:0;;;;;;;:::i;:::-;47993:44:::1;48011:2;48015:21;47993:17;:44::i;:::-;47925:120:::0;:::o;43400:303::-;2045:7;2072:6;-1:-1:-1;;;;;2072:6:0;803:10;2219:23;2211:68;;;;-1:-1:-1;;;2211:68:0;;;;;;;:::i;:::-;43482:9:::1;43477:115;43501:6;43497:1;:10;43477:115;;;43578:1;43562:13;;:17;;;;:::i;:::-;43537:43;::::0;-1:-1:-1;;;;;43537:43:0;::::1;::::0;43554:1:::1;::::0;-1:-1:-1;;;;;;;;;;;43537:43:0;43554:1;;43537:43:::1;43509:6;43514:1;43509:6:::0;::::1;:::i;:::-;;;43477:115;;;-1:-1:-1::0;43614:13:0::1;::::0;43604:24:::1;::::0;;;:9:::1;:24;::::0;;;;:29;;-1:-1:-1;;;;;;43604:29:0::1;-1:-1:-1::0;;;;;43604:29:0;::::1;;::::0;;43644:17:::1;43604:29:::0;43654:6;43644:5:::1;:17::i;:::-;43689:6;43674:11;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;43400:303:0:o;46115:100::-;2045:7;2072:6;-1:-1:-1;;;;;2072:6:0;803:10;2219:23;2211:68;;;;-1:-1:-1;;;2211:68:0;;;;;;;:::i;:::-;46189:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;46115:100:::0;:::o;40627:319::-;40691:7;40726:13;;40715:7;:24;40711:74;;-1:-1:-1;40771:1:0;;40627:319;-1:-1:-1;40627:319:0:o;40711:74::-;40810:7;40828:80;40840:1;40835:2;:6;:37;;;;-1:-1:-1;40870:1:0;40845:13;;;:9;:13;;;;;;-1:-1:-1;;;;;40845:13:0;:27;40835:37;40828:80;;;40889:7;40895:1;40889:7;;:::i;:::-;;;40828:80;;;40925:13;;;;:9;:13;;;;;;-1:-1:-1;;;;;40925:13:0;;40627:319;-1:-1:-1;;40627:319:0:o;39219:104::-;2045:7;2072:6;-1:-1:-1;;;;;2072:6:0;803:10;2219:23;2211:68;;;;-1:-1:-1;;;2211:68:0;;;;;;;:::i;:::-;39291:15:::1;:24:::0;;-1:-1:-1;;39291:24:0::1;;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;39219:104::o;36334:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2650:103::-;2045:7;2072:6;-1:-1:-1;;;;;2072:6:0;803:10;2219:23;2211:68;;;;-1:-1:-1;;;2211:68:0;;;;;;;:::i;:::-;2715:30:::1;2742:1;2715:18;:30::i;:::-;2650:103::o:0;40269:140::-;2045:7;2072:6;-1:-1:-1;;;;;2072:6:0;803:10;2219:23;2211:68;;;;-1:-1:-1;;;2211:68:0;;;;;;;:::i;:::-;40323:11:::1;:18:::0;;-1:-1:-1;;40382:19:0;40323:18;40382:19;;;40269:140::o;39115:96::-;2045:7;2072:6;-1:-1:-1;;;;;2072:6:0;803:10;2219:23;2211:68;;;;-1:-1:-1;;;2211:68:0;;;;;;;:::i;:::-;39184:11:::1;:19:::0;39115:96::o;36913:87::-;36952:13;36985:7;36978:14;;;;;:::i;40954:801::-;41071:15;;41047:10;41034:24;;;;:12;:24;;;;;;41071:15;;;;;;;41034:33;;41061:6;;41034:33;:::i;:::-;:52;;41012:118;;;;-1:-1:-1;;;41012:118:0;;16518:2:1;41012:118:0;;;16500:21:1;16557:2;16537:18;;;16530:30;-1:-1:-1;;;16576:18:1;;;16569:46;16632:18;;41012:118:0;16490:166:1;41012:118:0;41149:11;;;;;;;41141:47;;;;-1:-1:-1;;;41141:47:0;;21859:2:1;41141:47:0;;;21841:21:1;21898:2;21878:18;;;21871:30;21937:25;21917:18;;;21910:53;21980:18;;41141:47:0;21831:173:1;41141:47:0;41231:13;;41207:11;;41231:13;;;;;41207:20;;41221:6;;41207:20;:::i;:::-;:37;;41199:64;;;;-1:-1:-1;;;41199:64:0;;;;;;;:::i;:::-;41276:17;41303:6;41296:4;;:13;;;;:::i;:::-;41276:33;;41341:9;41328;:22;;41320:55;;;;-1:-1:-1;;;41320:55:0;;19228:2:1;41320:55:0;;;19210:21:1;19267:2;19247:18;;;19240:30;-1:-1:-1;;;19286:18:1;;;19279:50;19346:18;;41320:55:0;19200:170:1;41320:55:0;41404:9;41392;:21;41388:105;;;41438:10;41430:51;41459:21;41471:9;41459;:21;:::i;:::-;41430:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41388:105;41510:9;41505:123;41529:6;41525:1;:10;41505:123;;;41614:1;41598:13;;:17;;;;:::i;:::-;41565:51;;41586:10;;41582:1;;-1:-1:-1;;;;;;;;;;;41565:51:0;41582:1;;41565:51;41537:6;41542:1;41537:6;;:::i;:::-;;;41505:123;;;-1:-1:-1;41650:13:0;;41640:24;;;;:9;:24;;;;;:37;;-1:-1:-1;;;;;;41640:37:0;41667:10;41640:37;;;;;;41688:25;;41706:6;41688:5;:25::i;37738:185::-;37865:50;37884:10;37896:8;37906;37865:18;:50::i;46558:71::-;2045:7;2072:6;-1:-1:-1;;;;;2072:6:0;803:10;2219:23;2211:68;;;;-1:-1:-1;;;2211:68:0;;;;;;;:::i;:::-;46606:8:::1;:15:::0;;-1:-1:-1;;46606:15:0::1;46617:4;46606:15;::::0;;46558:71::o;39687:96::-;2045:7;2072:6;-1:-1:-1;;;;;2072:6:0;803:10;2219:23;2211:68;;;;-1:-1:-1;;;2211:68:0;;;;;;;:::i;:::-;39754:11:::1;:21:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;39754:21:0;;::::1;::::0;;;::::1;::::0;;39687:96::o;34469:91::-;2045:7;2072:6;-1:-1:-1;;;;;2072:6:0;803:10;2219:23;2211:68;;;;-1:-1:-1;;;2211:68:0;;;;;;;:::i;:::-;34536:6:::1;:16:::0;;-1:-1:-1;;;;;;34536:16:0::1;-1:-1:-1::0;;;;;34536:16:0;;;::::1;::::0;;;::::1;::::0;;34469:91::o;38651:179::-;-1:-1:-1;;;;;38729:20:0;;38708:4;38729:20;;;:14;:20;;;;;;:24;38725:57;;-1:-1:-1;;;;;;38762:20:0;;;;;:14;:20;;;;;;;38651:179::o;38725:57::-;-1:-1:-1;;38800:22:0;;;;;;;;38651:179::o;36362:27::-;;;;;;;:::i;44239:336::-;44398:28;44408:4;44414:2;44418:7;44398:9;:28::i;:::-;44444:48;44467:4;44473:2;44477:7;44486:5;44444:22;:48::i;:::-;44439:129;;44516:40;;-1:-1:-1;;;44516:40:0;;;;;;;;;;;44439:129;44239:336;;;;:::o;36396:27::-;;;;;;;:::i;45447:660::-;45503:13;45562:11;;45551:7;:22;;45529:119;;;;-1:-1:-1;;;45529:119:0;;20351:2:1;45529:119:0;;;20333:21:1;20390:2;20370:18;;;20363:30;20429:34;20409:18;;;20402:62;-1:-1:-1;;;20480:18:1;;;20473:45;20535:19;;45529:119:0;20323:237:1;45529:119:0;45665:8;;;;45661:70;;45706:13;45699:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45447:660;;;:::o;45661:70::-;45743:28;45774:7;45743:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45843:1;45818:14;45812:28;:32;:287;;;;;;;;;;;;;;;;;45936:14;45977:18;:7;:16;:18::i;:::-;46022:13;45893:165;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45812:287;45792:307;45447:660;-1:-1:-1;;;45447:660:0:o;46447:103::-;2045:7;2072:6;-1:-1:-1;;;;;2072:6:0;803:10;2219:23;2211:68;;;;-1:-1:-1;;;2211:68:0;;;;;;;:::i;:::-;46519:13:::1;:23:::0;;-1:-1:-1;;46519:23:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;46447:103::o;39583:96::-;2045:7;2072:6;-1:-1:-1;;;;;2072:6:0;803:10;2219:23;2211:68;;;;-1:-1:-1;;;2211:68:0;;;;;;;:::i;:::-;39650:11:::1;:21:::0;;;::::1;;;;-1:-1:-1::0;;39650:21:0;;::::1;::::0;;;::::1;::::0;;39583:96::o;41763:691::-;35068:219;;;;;;;;;;;;-1:-1:-1;;;35068:219:0;;;;35155:6;;41849:9;;;;-1:-1:-1;;;;;35155:6:0;35147:48;;;;-1:-1:-1;;;35147:48:0;;14371:2:1;35147:48:0;;;14353:21:1;14410:2;14390:18;;;14383:30;-1:-1:-1;;;14429:18:1;;;14422:44;14483:18;;35147:48:0;14343:164:1;35147:48:0;35214:31;35230:9;;35241:3;35214:15;:31::i;:::-;35206:61;;;;-1:-1:-1;;;35206:61:0;;13665:2:1;35206:61:0;;;13647:21:1;13704:2;13684:18;;;13677:30;-1:-1:-1;;;13723:18:1;;;13716:47;13780:18;;35206:61:0;13637:167:1;35206:61:0;41940:24:::1;41953:10;41940:12;:24::i;:::-;41916:10;41901:26;::::0;;;:14:::1;:26;::::0;;;;;:35:::1;::::0;41930:6;;41901:35:::1;:::i;:::-;:63;;41879:136;;;::::0;-1:-1:-1;;;41879:136:0;;15812:2:1;41879:136:0::1;::::0;::::1;15794:21:1::0;15851:2;15831:18;;;15824:30;15890:25;15870:18;;;15863:53;15933:18;;41879:136:0::1;15784:173:1::0;41879:136:0::1;42034:11;::::0;;;::::1;;;42026:43;;;::::0;-1:-1:-1;;;42026:43:0;;15121:2:1;42026:43:0::1;::::0;::::1;15103:21:1::0;15160:2;15140:18;;;15133:30;-1:-1:-1;;;15179:18:1;;;15172:49;15238:18;;42026:43:0::1;15093:169:1::0;42026:43:0::1;42112:13;::::0;42088:11:::1;::::0;42112:13:::1;::::0;;::::1;::::0;42088:20:::1;::::0;42102:6;;42088:20:::1;:::i;:::-;:37;;42080:64;;;;-1:-1:-1::0;;;42080:64:0::1;;;;;;;:::i;:::-;42162:9;42157:123;42181:6;42177:1;:10;42157:123;;;42266:1;42250:13;;:17;;;;:::i;:::-;42217:51;::::0;42238:10:::1;::::0;42234:1:::1;::::0;-1:-1:-1;;;;;;;;;;;42217:51:0;42234:1;;42217:51:::1;42189:6;42194:1;42189:6:::0;::::1;:::i;:::-;;;42157:123;;;-1:-1:-1::0;42302:13:0::1;::::0;42292:24:::1;::::0;;;:9:::1;:24;::::0;;;;:37;;-1:-1:-1;;;;;;42292:37:0::1;42319:10;42292:37:::0;;::::1;::::0;;;42340:25:::1;::::0;42358:6;42340:5:::1;:25::i;:::-;42393:6;42378:11;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;42425:10:0::1;42410:26;::::0;;;:14:::1;:26;::::0;;;;:36;;42440:6;;42410:26;:36:::1;::::0;42440:6;;42410:36:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;;41763:691:0:o;46335:104::-;2045:7;2072:6;-1:-1:-1;;;;;2072:6:0;803:10;2219:23;2211:68;;;;-1:-1:-1;;;2211:68:0;;;;;;;:::i;:::-;46411:20;;::::1;::::0;:13:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;39791:231::-:0;2045:7;2072:6;-1:-1:-1;;;;;2072:6:0;803:10;2219:23;2211:68;;;;-1:-1:-1;;;2211:68:0;;;;;;;:::i;:::-;39898:6:::1;39915:100;39927:16:::0;;::::1;39915:100;;;39993:7;;40001:1;39993:10;;;;;-1:-1:-1::0;;;39993:10:0::1;;;;;;;;;;;;;;;39966:14;:24;39981:5;;39987:1;39981:8;;;;;-1:-1:-1::0;;;39981:8:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;39966:24:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;39966:24:0;:37;39945:4:::1;39948:1;39945:4:::0;::::1;:::i;:::-;;;39915:100;;37931:214:::0;-1:-1:-1;;;;;38102:25:0;;;38073:4;38102:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;37931:214::o;2908:201::-;2045:7;2072:6;-1:-1:-1;;;;;2072:6:0;803:10;2219:23;2211:68;;;;-1:-1:-1;;;2211:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2997:22:0;::::1;2989:73;;;::::0;-1:-1:-1;;;2989:73:0;;14714:2:1;2989:73:0::1;::::0;::::1;14696:21:1::0;14753:2;14733:18;;;14726:30;14792:34;14772:18;;;14765:62;-1:-1:-1;;;14843:18:1;;;14836:36;14889:19;;2989:73:0::1;14686:228:1::0;2989:73:0::1;3073:28;3092:8;3073:18;:28::i;46223:104::-:0;2045:7;2072:6;-1:-1:-1;;;;;2072:6:0;803:10;2219:23;2211:68;;;;-1:-1:-1;;;2211:68:0;;;;;;;:::i;:::-;46299:20;;::::1;::::0;:13:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;48053:153::-:0;2045:7;2072:6;-1:-1:-1;;;;;2072:6:0;803:10;2219:23;2211:68;;;;-1:-1:-1;;;2211:68:0;;;;;;;:::i;:::-;48159:38:::1;::::0;-1:-1:-1;;;48159:38:0;;48191:4:::1;48159:38;::::0;::::1;11457:51:1::0;-1:-1:-1;;;;;48132:22:0;::::1;::::0;::::1;::::0;48155:2;;48132:22;;48159:23:::1;::::0;11430:18:1;;48159:38:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48132:66;::::0;-1:-1:-1;;;;;;48132:66:0::1;::::0;;;;;;-1:-1:-1;;;;;12204:32:1;;;48132:66:0::1;::::0;::::1;12186:51:1::0;12253:18;;;12246:34;12159:18;;48132:66:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;38153:167::-:0;38228:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;38228:29:0;-1:-1:-1;;;;;38228:29:0;;;;;;;;:24;;38282:16;38228:24;38282:7;:16::i;:::-;-1:-1:-1;;;;;38273:39:0;;;;;;;;;;;38153:167;;:::o;34892:168::-;35046:6;;34985:4;;-1:-1:-1;;;;;35046:6:0;35009:33;35027:9;;35038:3;35009:17;:33::i;:::-;-1:-1:-1;;;;;35009:43:0;;;34892:168;-1:-1:-1;;;;34892:168:0:o;43711:165::-;-1:-1:-1;;;;;43774:13:0;;;;;;:9;:13;;;;;:23;;43791:6;;43774:13;:23;;43791:6;;43774:23;:::i;:::-;;;;-1:-1:-1;;;;;;;43808:16:0;;;;;;:12;:16;;;;;:26;;43828:6;;43808:16;:26;;43828:6;;43808:26;:::i;:::-;;;;;;;;43862:6;43845:13;;:23;;;;;;;:::i;44583:856::-;44699:16;44718;44726:7;44718;:16::i;:::-;44699:35;;44763:2;-1:-1:-1;;;;;44755:10:0;:4;-1:-1:-1;;;;;44755:10:0;;;44747:54;;;;-1:-1:-1;;;44747:54:0;;22211:2:1;44747:54:0;;;22193:21:1;22250:2;22230:18;;;22223:30;22289:33;22269:18;;;22262:61;22340:18;;44747:54:0;22183:181:1;44747:54:0;44828:8;-1:-1:-1;;;;;44820:16:0;:4;-1:-1:-1;;;;;44820:16:0;;44812:49;;;;-1:-1:-1;;;44812:49:0;;18051:2:1;44812:49:0;;;18033:21:1;18090:2;18070:18;;;18063:30;-1:-1:-1;;;18109:18:1;;;18102:50;18169:18;;44812:49:0;18023:170:1;44812:49:0;44894:10;-1:-1:-1;;;;;44894:22:0;;;;:81;;;44937:38;44954:8;44964:10;44937:16;:38::i;:::-;44894:136;;;-1:-1:-1;45020:10:0;44996:20;45008:7;44996:11;:20::i;:::-;-1:-1:-1;;;;;44996:34:0;;44894:136;44872:199;;;;-1:-1:-1;;;44872:199:0;;21517:2:1;44872:199:0;;;21499:21:1;21556:2;21536:18;;;21529:30;-1:-1:-1;;;21575:18:1;;;21568:43;21628:18;;44872:199:0;21489:163:1;44872:199:0;45084:29;45101:1;45105:7;45084:8;:29::i;:::-;45126:18;;;;:9;:18;;;;;:23;;-1:-1:-1;;;;;;45126:23:0;-1:-1:-1;;;;;45126:23:0;;;;;45179:11;45126:18;-1:-1:-1;45179:11:0;:::i;:::-;45236:1;45207:17;;;:9;:17;;;;;;45162:28;;-1:-1:-1;;;;;;45207:17:0;:31;:57;;;;;45251:13;;45242:6;:22;45207:57;45203:118;;;45281:17;;;;:9;:17;;;;;:28;;-1:-1:-1;;;;;;45281:28:0;-1:-1:-1;;;;;45281:28:0;;;;;45203:118;-1:-1:-1;;;;;45333:19:0;;;;;;:9;:19;;;;;:24;;45356:1;;45333:19;:24;;45356:1;;45333:24;:::i;:::-;;;;-1:-1:-1;;;;;;;45368:13:0;;;;;;:9;:13;;;;;:18;;45385:1;;45368:13;:18;;45385:1;;45368:18;:::i;:::-;;;;-1:-1:-1;;45404:27:0;;45423:7;;-1:-1:-1;;;;;45404:27:0;;;;;;;;-1:-1:-1;;;;;;;;;;;45404:27:0;;;;44583:856;;;;;:::o;25281:317::-;25396:6;25371:21;:31;;25363:73;;;;-1:-1:-1;;;25363:73:0;;17693:2:1;25363:73:0;;;17675:21:1;17732:2;17712:18;;;17705:30;17771:31;17751:18;;;17744:59;17820:18;;25363:73:0;17665:179:1;25363:73:0;25450:12;25468:9;-1:-1:-1;;;;;25468:14:0;25490:6;25468:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25449:52;;;25520:7;25512:78;;;;-1:-1:-1;;;25512:78:0;;16863:2:1;25512:78:0;;;16845:21:1;16902:2;16882:18;;;16875:30;16941:34;16921:18;;;16914:62;17012:28;16992:18;;;16985:56;17058:19;;25512:78:0;16835:248:1;3269:191:0;3343:16;3362:6;;-1:-1:-1;;;;;3379:17:0;;;-1:-1:-1;;;;;;3379:17:0;;;;;;3412:40;;3362:6;;;;;;;3412:40;;3343:16;3412:40;3269:191;;:::o;38328:315::-;38483:8;-1:-1:-1;;;;;38474:17:0;:5;-1:-1:-1;;;;;38474:17:0;;;38466:55;;;;-1:-1:-1;;;38466:55:0;;16164:2:1;38466:55:0;;;16146:21:1;16203:2;16183:18;;;16176:30;16242:27;16222:18;;;16215:55;16287:18;;38466:55:0;16136:175:1;38466:55:0;-1:-1:-1;;;;;38532:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;38532:46:0;;;;;;;;;;38594:41;;12431::1;;;38594::0;;12404:18:1;38594:41:0;;;;;;;38328:315;;;:::o;46996:921::-;47151:4;-1:-1:-1;;;;;47172:13:0;;24315:19;:23;47168:742;;47225:173;;-1:-1:-1;;;47225:173:0;;-1:-1:-1;;;;;47225:36:0;;;;;:173;;47284:10;;47317:4;;47344:7;;47374:5;;47225:173;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47225:173:0;;;;;;;;-1:-1:-1;;47225:173:0;;;;;;;;;;;;:::i;:::-;;;47204:651;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47585:13:0;;47581:259;;47635:40;;-1:-1:-1;;;47635:40:0;;;;;;;;;;;47581:259;47790:6;47784:13;47775:6;47771:2;47767:15;47760:38;47204:651;-1:-1:-1;;;;;;47462:55:0;-1:-1:-1;;;47462:55:0;;-1:-1:-1;47455:62:0;;47168:742;-1:-1:-1;47894:4:0;47168:742;46996:921;;;;;;:::o;3845:723::-;3901:13;4122:10;4118:53;;-1:-1:-1;;4149:10:0;;;;;;;;;;;;-1:-1:-1;;;4149:10:0;;;;;3845:723::o;4118:53::-;4196:5;4181:12;4237:78;4244:9;;4237:78;;4270:8;;;;:::i;:::-;;-1:-1:-1;4293:10:0;;-1:-1:-1;4301:2:0;4293:10;;:::i;:::-;;;4237:78;;;4325:19;4357:6;4347:17;;;;;;-1:-1:-1;;;4347:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4347:17:0;;4325:39;;4375:154;4382:10;;4375:154;;4409:11;4419:1;4409:11;;:::i;:::-;;-1:-1:-1;4478:10:0;4486:2;4478:5;:10;:::i;:::-;4465:24;;:2;:24;:::i;:::-;4452:39;;4435:6;4442;4435:14;;;;;;-1:-1:-1;;;4435:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;4435:56:0;;;;;;;;-1:-1:-1;4506:11:0;4515:2;4506:11;;:::i;:::-;;;4375:154;;34568:316;34663:7;34683:12;34725:4;34731:3;34736:10;34708:39;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;34708:39:0;;;;;;;;;;34698:50;;34708:39;34698:50;;;;10958:66:1;34776:58:0;;;10946:79:1;;;;11041:12;;;11034:28;;;34698:50:0;-1:-1:-1;11078:12:1;;34776:58:0;;;;;;;;;;;;34766:69;;;;;;34759:76;;34853:23;34866:9;;34853:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34853:4:0;;:23;-1:-1:-1;;34853:12:0;:23;-1:-1:-1;34853:23:0:i;:::-;34846:30;34568:316;-1:-1:-1;;;;;34568:316:0:o;10021:231::-;10099:7;10120:17;10139:18;10161:27;10172:4;10178:9;10161:10;:27::i;:::-;10119:69;;;;10199:18;10211:5;10199:11;:18::i;:::-;-1:-1:-1;10235:9:0;10021:231;-1:-1:-1;;;10021:231:0:o;7911:1308::-;7992:7;8001:12;8226:9;:16;8246:2;8226:22;8222:990;;;8522:4;8507:20;;8501:27;8572:4;8557:20;;8551:27;8630:4;8615:20;;8609:27;8265:9;8601:36;8673:25;8684:4;8601:36;8501:27;8551;8673:10;:25::i;:::-;8666:32;;;;;;;;;8222:990;8720:9;:16;8740:2;8720:22;8716:496;;;8995:4;8980:20;;8974:27;9046:4;9031:20;;9025:27;9088:23;9099:4;8974:27;9025;9088:10;:23::i;:::-;9081:30;;;;;;;;8716:496;-1:-1:-1;9160:1:0;;-1:-1:-1;9164:35:0;8716:496;7911:1308;;;;;:::o;6182:643::-;6260:20;6251:5;:29;;;;;;-1:-1:-1;;;6251:29:0;;;;;;;;;;6247:571;;;6182:643;:::o;6247:571::-;6358:29;6349:5;:38;;;;;;-1:-1:-1;;;6349:38:0;;;;;;;;;;6345:473;;;6404:34;;-1:-1:-1;;;6404:34:0;;13312:2:1;6404:34:0;;;13294:21:1;13351:2;13331:18;;;13324:30;13390:26;13370:18;;;13363:54;13434:18;;6404:34:0;13284:174:1;6345:473:0;6469:35;6460:5;:44;;;;;;-1:-1:-1;;;6460:44:0;;;;;;;;;;6456:362;;;6521:41;;-1:-1:-1;;;6521:41:0;;14011:2:1;6521:41:0;;;13993:21:1;14050:2;14030:18;;;14023:30;14089:33;14069:18;;;14062:61;14140:18;;6521:41:0;13983:181:1;6456:362:0;6593:30;6584:5;:39;;;;;;-1:-1:-1;;;6584:39:0;;;;;;;;;;6580:238;;;6640:44;;-1:-1:-1;;;6640:44:0;;17290:2:1;6640:44:0;;;17272:21:1;17329:2;17309:18;;;17302:30;17368:34;17348:18;;;17341:62;-1:-1:-1;;;17419:18:1;;;17412:32;17461:19;;6640:44:0;17262:224:1;6580:238:0;6715:30;6706:5;:39;;;;;;-1:-1:-1;;;6706:39:0;;;;;;;;;;6702:116;;;6762:44;;-1:-1:-1;;;6762:44:0;;18825:2:1;6762:44:0;;;18807:21:1;18864:2;18844:18;;;18837:30;18903:34;18883:18;;;18876:62;-1:-1:-1;;;18954:18:1;;;18947:32;18996:19;;6762:44:0;18797:224:1;11473:1632:0;11604:7;;12538:66;12525:79;;12521:163;;;-1:-1:-1;12637:1:0;;-1:-1:-1;12641:30:0;12621:51;;12521:163;12698:1;:7;;12703:2;12698:7;;:18;;;;;12709:1;:7;;12714:2;12709:7;;12698:18;12694:102;;;-1:-1:-1;12749:1:0;;-1:-1:-1;12753:30:0;12733:51;;12694:102;12910:24;;;12893:14;12910:24;;;;;;;;;12710:25:1;;;12783:4;12771:17;;12751:18;;;12744:45;;;;12805:18;;;12798:34;;;12848:18;;;12841:34;;;12910:24:0;;12682:19:1;;12910:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;12910:24:0;;-1:-1:-1;;12910:24:0;;;-1:-1:-1;;;;;;;12949:20:0;;12945:103;;13002:1;13006:29;12986:50;;;;;;;12945:103;13068:6;-1:-1:-1;13076:20:0;;-1:-1:-1;11473:1632:0;;;;;;;;:::o;10515:344::-;10629:7;;-1:-1:-1;;;;;10675:80:0;;10629:7;10782:25;10798:3;10783:18;;;10805:2;10782:25;:::i;:::-;10766:42;;10826:25;10837:4;10843:1;10846;10849;10826:10;:25::i;:::-;10819:32;;;;;;10515:344;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:2;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:2;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:2;;;532:1;529;522:12;491:2;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;88:557;;;;;:::o;650:395::-;713:8;723:6;777:3;770:4;762:6;758:17;754:27;744:2;;802:8;792;785:26;744:2;-1:-1:-1;832:20:1;;875:18;864:30;;861:2;;;914:8;904;897:26;861:2;958:4;950:6;946:17;934:29;;1018:3;1011:4;1001:6;998:1;994:14;986:6;982:27;978:38;975:47;972:2;;;1035:1;1032;1025:12;1050:257;1109:6;1162:2;1150:9;1141:7;1137:23;1133:32;1130:2;;;1183:6;1175;1168:22;1130:2;1227:9;1214:23;1246:31;1271:5;1246:31;:::i;1582:398::-;1650:6;1658;1711:2;1699:9;1690:7;1686:23;1682:32;1679:2;;;1732:6;1724;1717:22;1679:2;1776:9;1763:23;1795:31;1820:5;1795:31;:::i;:::-;1845:5;-1:-1:-1;1902:2:1;1887:18;;1874:32;1915:33;1874:32;1915:33;:::i;:::-;1967:7;1957:17;;;1669:311;;;;;:::o;1985:466::-;2062:6;2070;2078;2131:2;2119:9;2110:7;2106:23;2102:32;2099:2;;;2152:6;2144;2137:22;2099:2;2196:9;2183:23;2215:31;2240:5;2215:31;:::i;:::-;2265:5;-1:-1:-1;2322:2:1;2307:18;;2294:32;2335:33;2294:32;2335:33;:::i;:::-;2089:362;;2387:7;;-1:-1:-1;;;2441:2:1;2426:18;;;;2413:32;;2089:362::o;2456:824::-;2551:6;2559;2567;2575;2628:3;2616:9;2607:7;2603:23;2599:33;2596:2;;;2650:6;2642;2635:22;2596:2;2694:9;2681:23;2713:31;2738:5;2713:31;:::i;:::-;2763:5;-1:-1:-1;2820:2:1;2805:18;;2792:32;2833:33;2792:32;2833:33;:::i;:::-;2885:7;-1:-1:-1;2939:2:1;2924:18;;2911:32;;-1:-1:-1;2994:2:1;2979:18;;2966:32;3021:18;3010:30;;3007:2;;;3058:6;3050;3043:22;3007:2;3086:22;;3139:4;3131:13;;3127:27;-1:-1:-1;3117:2:1;;3173:6;3165;3158:22;3117:2;3201:73;3266:7;3261:2;3248:16;3243:2;3239;3235:11;3201:73;:::i;:::-;3191:83;;;2586:694;;;;;;;:::o;3285:392::-;3350:6;3358;3411:2;3399:9;3390:7;3386:23;3382:32;3379:2;;;3432:6;3424;3417:22;3379:2;3476:9;3463:23;3495:31;3520:5;3495:31;:::i;:::-;3545:5;-1:-1:-1;3602:2:1;3587:18;;3574:32;3615:30;3574:32;3615:30;:::i;3682:325::-;3750:6;3758;3811:2;3799:9;3790:7;3786:23;3782:32;3779:2;;;3832:6;3824;3817:22;3779:2;3876:9;3863:23;3895:31;3920:5;3895:31;:::i;:::-;3945:5;3997:2;3982:18;;;;3969:32;;-1:-1:-1;;;3769:238:1:o;4012:803::-;4134:6;4142;4150;4158;4211:2;4199:9;4190:7;4186:23;4182:32;4179:2;;;4232:6;4224;4217:22;4179:2;4277:9;4264:23;4306:18;4347:2;4339:6;4336:14;4333:2;;;4368:6;4360;4353:22;4333:2;4412:70;4474:7;4465:6;4454:9;4450:22;4412:70;:::i;:::-;4501:8;;-1:-1:-1;4386:96:1;-1:-1:-1;4589:2:1;4574:18;;4561:32;;-1:-1:-1;4605:16:1;;;4602:2;;;4639:6;4631;4624:22;4602:2;;4683:72;4747:7;4736:8;4725:9;4721:24;4683:72;:::i;:::-;4169:646;;;;-1:-1:-1;4774:8:1;-1:-1:-1;;;;4169:646:1:o;4820:251::-;4876:6;4929:2;4917:9;4908:7;4904:23;4900:32;4897:2;;;4950:6;4942;4935:22;4897:2;4994:9;4981:23;5013:28;5035:5;5013:28;:::i;5076:255::-;5143:6;5196:2;5184:9;5175:7;5171:23;5167:32;5164:2;;;5217:6;5209;5202:22;5164:2;5254:9;5248:16;5273:28;5295:5;5273:28;:::i;5336:255::-;5394:6;5447:2;5435:9;5426:7;5422:23;5418:32;5415:2;;;5468:6;5460;5453:22;5415:2;5512:9;5499:23;5531:30;5555:5;5531:30;:::i;5596:259::-;5665:6;5718:2;5706:9;5697:7;5693:23;5689:32;5686:2;;;5739:6;5731;5724:22;5686:2;5776:9;5770:16;5795:30;5819:5;5795:30;:::i;5860:480::-;5929:6;5982:2;5970:9;5961:7;5957:23;5953:32;5950:2;;;6003:6;5995;5988:22;5950:2;6048:9;6035:23;6081:18;6073:6;6070:30;6067:2;;;6118:6;6110;6103:22;6067:2;6146:22;;6199:4;6191:13;;6187:27;-1:-1:-1;6177:2:1;;6233:6;6225;6218:22;6177:2;6261:73;6326:7;6321:2;6308:16;6303:2;6299;6295:11;6261:73;:::i;6345:292::-;6403:6;6456:2;6444:9;6435:7;6431:23;6427:32;6424:2;;;6477:6;6469;6462:22;6424:2;6521:9;6508:23;6571:6;6564:5;6560:18;6553:5;6550:29;6540:2;;6598:6;6590;6583:22;6642:190;6701:6;6754:2;6742:9;6733:7;6729:23;6725:32;6722:2;;;6775:6;6767;6760:22;6722:2;-1:-1:-1;6803:23:1;;6712:120;-1:-1:-1;6712:120:1:o;6837:194::-;6907:6;6960:2;6948:9;6939:7;6935:23;6931:32;6928:2;;;6981:6;6973;6966:22;6928:2;-1:-1:-1;7009:16:1;;6918:113;-1:-1:-1;6918:113:1:o;7036:325::-;7104:6;7112;7165:2;7153:9;7144:7;7140:23;7136:32;7133:2;;;7186:6;7178;7171:22;7133:2;7227:9;7214:23;7204:33;;7287:2;7276:9;7272:18;7259:32;7300:31;7325:5;7300:31;:::i;7366:709::-;7445:6;7453;7461;7514:2;7502:9;7493:7;7489:23;7485:32;7482:2;;;7535:6;7527;7520:22;7482:2;7576:9;7563:23;7553:33;;7637:2;7626:9;7622:18;7609:32;7660:18;7701:2;7693:6;7690:14;7687:2;;;7722:6;7714;7707:22;7687:2;7765:6;7754:9;7750:22;7740:32;;7810:7;7803:4;7799:2;7795:13;7791:27;7781:2;;7837:6;7829;7822:22;7781:2;7882;7869:16;7908:2;7900:6;7897:14;7894:2;;;7929:6;7921;7914:22;7894:2;7979:7;7974:2;7965:6;7961:2;7957:15;7953:24;7950:37;7947:2;;;8005:6;7997;7990:22;7947:2;8041;8037;8033:11;8023:21;;8063:6;8053:16;;;;;7472:603;;;;;:::o;8080:289::-;8137:6;8190:2;8178:9;8169:7;8165:23;8161:32;8158:2;;;8211:6;8203;8196:22;8158:2;8255:9;8242:23;8305:4;8298:5;8294:16;8287:5;8284:27;8274:2;;8330:6;8322;8315:22;8374:257;8415:3;8453:5;8447:12;8480:6;8475:3;8468:19;8496:63;8552:6;8545:4;8540:3;8536:14;8529:4;8522:5;8518:16;8496:63;:::i;:::-;8613:2;8592:15;-1:-1:-1;;8588:29:1;8579:39;;;;8620:4;8575:50;;8423:208;-1:-1:-1;;8423:208:1:o;8636:539::-;8841:3;8873:26;8869:31;8942:2;8933:6;8929:2;8925:15;8921:24;8916:3;8909:37;8975:6;8969:13;8991:62;9046:6;9041:2;9036:3;9032:12;9025:4;9017:6;9013:17;8991:62;:::i;:::-;9125:2;9121:15;;;;9117:24;9072:16;;;;9112:2;9104:11;;9097:45;;;;9166:2;9158:11;;;-1:-1:-1;;;8849:326:1:o;9180:1531::-;9404:3;9442:6;9436:13;9468:4;9481:51;9525:6;9520:3;9515:2;9507:6;9503:15;9481:51;:::i;:::-;9595:13;;9554:16;;;;9617:55;9595:13;9554:16;9639:15;;;9617:55;:::i;:::-;9763:13;;9694:20;;;9734:3;;9823:1;9845:18;;;;9898;;;;9925:2;;10003:4;9993:8;9989:19;9977:31;;9925:2;10066;10056:8;10053:16;10033:18;10030:40;10027:2;;;-1:-1:-1;;;10093:33:1;;10149:4;10146:1;10139:15;10179:4;10100:3;10167:17;10027:2;10210:18;10237:110;;;;10361:1;10356:330;;;;10203:483;;10237:110;-1:-1:-1;;10272:24:1;;10258:39;;10317:20;;;;-1:-1:-1;10237:110:1;;10356:330;22791:4;22810:17;;;22860:4;22844:21;;10451:3;10467:169;10481:8;10478:1;10475:15;10467:169;;;10563:14;;10548:13;;;10541:37;10606:16;;;;10498:10;;10467:169;;;10471:3;;10667:8;10660:5;10656:20;10649:27;;10203:483;-1:-1:-1;10702:3:1;;9412:1299;-1:-1:-1;;;;;;;;;;;9412:1299:1:o;11519:488::-;-1:-1:-1;;;;;11788:15:1;;;11770:34;;11840:15;;11835:2;11820:18;;11813:43;11887:2;11872:18;;11865:34;;;11935:3;11930:2;11915:18;;11908:31;;;11713:4;;11956:45;;11981:19;;11973:6;11956:45;:::i;:::-;11948:53;11722:285;-1:-1:-1;;;;;;11722:285:1:o;12886:219::-;13035:2;13024:9;13017:21;12998:4;13055:44;13095:2;13084:9;13080:18;13072:6;13055:44;:::i;15267:338::-;15469:2;15451:21;;;15508:2;15488:18;;;15481:30;-1:-1:-1;;;15542:2:1;15527:18;;15520:44;15596:2;15581:18;;15441:164::o;19788:356::-;19990:2;19972:21;;;20009:18;;;20002:30;20068:34;20063:2;20048:18;;20041:62;20135:2;20120:18;;19962:182::o;22876:128::-;22916:3;22947:1;22943:6;22940:1;22937:13;22934:2;;;22953:18;;:::i;:::-;-1:-1:-1;22989:9:1;;22924:80::o;23009:120::-;23049:1;23075;23065:2;;23080:18;;:::i;:::-;-1:-1:-1;23114:9:1;;23055:74::o;23134:168::-;23174:7;23240:1;23236;23232:6;23228:14;23225:1;23222:21;23217:1;23210:9;23203:17;23199:45;23196:2;;;23247:18;;:::i;:::-;-1:-1:-1;23287:9:1;;23186:116::o;23307:125::-;23347:4;23375:1;23372;23369:8;23366:2;;;23380:18;;:::i;:::-;-1:-1:-1;23417:9:1;;23356:76::o;23437:258::-;23509:1;23519:113;23533:6;23530:1;23527:13;23519:113;;;23609:11;;;23603:18;23590:11;;;23583:39;23555:2;23548:10;23519:113;;;23650:6;23647:1;23644:13;23641:2;;;-1:-1:-1;;23685:1:1;23667:16;;23660:27;23490:205::o;23700:380::-;23779:1;23775:12;;;;23822;;;23843:2;;23897:4;23889:6;23885:17;23875:27;;23843:2;23950;23942:6;23939:14;23919:18;23916:38;23913:2;;;23996:10;23991:3;23987:20;23984:1;23977:31;24031:4;24028:1;24021:15;24059:4;24056:1;24049:15;23913:2;;23755:325;;;:::o;24085:135::-;24124:3;-1:-1:-1;;24145:17:1;;24142:2;;;24165:18;;:::i;:::-;-1:-1:-1;24212:1:1;24201:13;;24132:88::o;24225:112::-;24257:1;24283;24273:2;;24288:18;;:::i;:::-;-1:-1:-1;24322:9:1;;24263:74::o;24342:127::-;24403:10;24398:3;24394:20;24391:1;24384:31;24434:4;24431:1;24424:15;24458:4;24455:1;24448:15;24474:127;24535:10;24530:3;24526:20;24523:1;24516:31;24566:4;24563:1;24556:15;24590:4;24587:1;24580:15;24606:127;24667:10;24662:3;24658:20;24655:1;24648:31;24698:4;24695:1;24688:15;24722:4;24719:1;24712:15;24738:131;-1:-1:-1;;;;;24813:31:1;;24803:42;;24793:2;;24859:1;24856;24849:12;24874:118;24960:5;24953:13;24946:21;24939:5;24936:32;24926:2;;24982:1;24979;24972:12;24997:131;-1:-1:-1;;;;;;25071:32:1;;25061:43;;25051:2;;25118:1;25115;25108:12

Swarm Source

ipfs://b109f4e26cd1d18043d23c428e73ef7dc2183755bd17583e259b5b87afdd38a6
Loading