ETH Price: $3,294.45 (-0.56%)
Gas: 7 Gwei

Token

Demions (DEMIONS)
 

Overview

Max Total Supply

333 DEMIONS

Holders

113

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
4 DEMIONS
0xaf88dbddb9eb09a74fa60280a60f7d5c60bb6bf6
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Demions

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-14
*/

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


// OpenZeppelin Contracts (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/utils/Context.sol


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (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/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts (last updated v4.6.0) (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 `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts (last updated v4.6.0) (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`.
     *
     * 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;

    /**
     * @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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @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);
}

// 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: erc721a/contracts/IERC721A.sol


// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;



/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A is IERC721, IERC721Metadata {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     * 
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);
}

// File: erc721a/contracts/ERC721A.sol


// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;







/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721A {
    using Address for address;
    using Strings for uint256;

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr) if (curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownershipOf(tokenId).addr;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner) if(!isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract()) if(!_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

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

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     *   {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

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

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex < end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex < end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

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

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

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

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

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

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

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

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

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

// File: contracts/demions.sol


pragma solidity =0.8.11;




contract Demions is ERC721A, Ownable {
    using Strings for uint256;

    string public baseURI;
    string public uriSuffix = ".json";

    uint256 public cost = 0.036 ether;
    uint256 public maxSupply = 666;

    uint256 public privateMaxMintAmountPerTx = 2;
    uint256 public publicMaxMintAmountPerTx = 10;
    uint256 public nftPerAddressLimit = 10;
    uint256 public RESERVE = 25;
    

    bool public paused = true;
    bool public revealed = false;
    bool public isReserved = false;
    bool public maxSupplyChanged = false;

    bool public onlyWhitelisted = true;
    address private _signerAddress;


    constructor() ERC721A("Demions", "DEMIONS") {
        setBaseURI("ipfs://QmNZ8F3wusm8UZ6u1TLQRGCXeuGZjrpMSNRHzjXebwcqF7/");
    }
    
    
    modifier mintCompliance(uint256 _mintAmount) {
        require(_mintAmount > 0 && _mintAmount <= publicMaxMintAmountPerTx, "Invalid mint amount!");
        require(totalSupply() + _mintAmount <= maxSupply, "Max supply exceeded!");
        require(!paused, "The contract is paused!");
        _;
    }

    function setSignerAddress(address signerAddress) external onlyOwner {
        _signerAddress = signerAddress;
    }

    function presaleMint(uint256 _mintAmount, bytes32 signatureR, bytes32 signatureVS) external payable mintCompliance(_mintAmount) {
        bytes32 hash = keccak256(abi.encode(msg.sender));
        address signerAddress = ECDSA.recover(hash,  signatureR,  signatureVS);
        uint256 ownerMintedCount = _numberMinted(msg.sender);
        
        require(onlyWhitelisted == true, "Current state is not presale!");
        require(msg.value >= cost * _mintAmount, "Insufficient funds!");
        require(_signerAddress == signerAddress, "Invalid signature");
        require(_mintAmount > 0 && _mintAmount <= privateMaxMintAmountPerTx, "Max mints per tx during private sale exceeded!");
        require(ownerMintedCount + _mintAmount <= privateMaxMintAmountPerTx, "Max NFTs per address during private sale exceeded ");
            
            
        _safeMint(msg.sender, _mintAmount);
    }

    function mint(uint256 _mintAmount) external payable mintCompliance(_mintAmount) {
        require(onlyWhitelisted == false, "Public Sale not Active");

        if (msg.sender != owner()) {
            require(msg.value >= cost * _mintAmount, "Insufficient funds!");
            uint256 ownerMintedCount = _numberMinted(msg.sender);
            require(ownerMintedCount + _mintAmount <= nftPerAddressLimit, "Max NFT per address exceeded");
        }

        _safeMint(msg.sender, _mintAmount);
    }

    /** Airdrops, team, giveaways transfer - only for owner**/
    function reserveMint() external onlyOwner {
        require(totalSupply() + RESERVE <= maxSupply, "Mint Amount Denied");
        require(!isReserved, "Tokens have already been reserved.");

        _safeMint(msg.sender, RESERVE);

        isReserved = true;
    }

    /** If public leaves any**/
    function mintForAddress(uint256 _mintAmount, address _receiver) external onlyOwner {
        require(totalSupply() + _mintAmount <= maxSupply, "Mint Amount Denied");

        _safeMint(_receiver, _mintAmount);
    }

    function tokenURI(uint256 _tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
        _exists(_tokenId),
        "ERC721Metadata: URI query for nonexistent token"
        );


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



    function setBaseURI(string memory __baseURI) public onlyOwner {
        baseURI = __baseURI;
    }

    function setRevealed(bool _state) public onlyOwner {
        revealed = _state;
    }

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

    function setPrivateMaxMintAmountPerTx(uint256 _privateMaxMintAmountPerTx) public onlyOwner {
        privateMaxMintAmountPerTx = _privateMaxMintAmountPerTx;
    }

    function setPublicMaxMintAmountPerTx(uint256 _publicMaxMintAmountPerTx) public onlyOwner {
        publicMaxMintAmountPerTx = _publicMaxMintAmountPerTx;
    }
        
    function setMaxNftPerAddressLimit(uint256 _nftPerAddressLimit) public onlyOwner {
        nftPerAddressLimit = _nftPerAddressLimit;
    }

    function setPaused(bool _state) public onlyOwner {
        paused = _state;
    }

    function setOnlyWhitelisted(bool _state) public onlyOwner {
        onlyWhitelisted = _state;
    }


    function setMaxSupply(uint256 _newSupply) public onlyOwner {
        require(!maxSupplyChanged, "Supply has already been changed once.");
        maxSupply = _newSupply;

        maxSupplyChanged = true;
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }

    function _startTokenId() internal view virtual override returns (uint256) {
        return 1;
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","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":[],"name":"RESERVE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"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":"isReserved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupplyChanged","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32","name":"signatureR","type":"bytes32"},{"internalType":"bytes32","name":"signatureVS","type":"bytes32"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"privateMaxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMaxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveMint","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":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"__baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftPerAddressLimit","type":"uint256"}],"name":"setMaxNftPerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_privateMaxMintAmountPerTx","type":"uint256"}],"name":"setPrivateMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicMaxMintAmountPerTx","type":"uint256"}],"name":"setPublicMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"signerAddress","type":"address"}],"name":"setSignerAddress","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":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600a908051906020019062000051929190620003be565b50667fe5cf2bea0000600b5561029a600c556002600d55600a600e55600a600f5560196010556001601160006101000a81548160ff0219169083151502179055506000601160016101000a81548160ff0219169083151502179055506000601160026101000a81548160ff0219169083151502179055506000601160036101000a81548160ff0219169083151502179055506001601160046101000a81548160ff0219169083151502179055503480156200010b57600080fd5b506040518060400160405280600781526020017f44656d696f6e73000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f44454d494f4e5300000000000000000000000000000000000000000000000000815250816002908051906020019062000190929190620003be565b508060039080519060200190620001a9929190620003be565b50620001ba6200021260201b60201c565b6000819055505050620001e2620001d66200021b60201b60201c565b6200022360201b60201c565b6200020c6040518060600160405280603681526020016200552360369139620002e960201b60201c565b62000556565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002f96200021b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200031f6200039460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000378576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200036f90620004cf565b60405180910390fd5b806009908051906020019062000390929190620003be565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003cc9062000520565b90600052602060002090601f016020900481019282620003f057600085556200043c565b82601f106200040b57805160ff19168380011785556200043c565b828001600101855582156200043c579182015b828111156200043b5782518255916020019190600101906200041e565b5b5090506200044b91906200044f565b5090565b5b808211156200046a57600081600090555060010162000450565b5090565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620004b76020836200046e565b9150620004c4826200047f565b602082019050919050565b60006020820190508181036000830152620004ea81620004a8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200053957607f821691505b6020821081141562000550576200054f620004f1565b5b50919050565b614fbd80620005666000396000f3fe6080604052600436106102725760003560e01c80636c0360eb1161014f578063a22cb465116100c1578063e0a808531161007a578063e0a80853146108e8578063e985e9c514610911578063eca467931461094e578063efbd73f414610979578063f2fde38b146109a2578063fb5bc457146109cb57610272565b8063a22cb465146107e7578063b88d4fde14610810578063ba7d2c7614610839578063c87b56dd14610864578063d5712744146108a1578063d5abeb01146108bd57610272565b80638da5cb5b116101135780638da5cb5b146106f45780638f575bee1461071f57806395d89b411461074a5780639c70b512146107755780639d2cc436146107a0578063a0712d68146107cb57610272565b80636c0360eb146106235780636f8b44b01461064e57806370a0823114610677578063715018a6146106b457806371d11812146106cb57610272565b80633ccfd60b116101e85780635503a0e8116101ac5780635503a0e81461051357806355f804b31461053e5780635c975abb1461056757806363331c8d146105925780636352211e146105bb57806369ff20d4146105f857610272565b80633ccfd60b1461045657806342842e0e1461046d57806344a0d68a1461049657806349d3a2c5146104bf57806351830227146104e857610272565b806313faede61161023a57806313faede61461036e57806316c38b3c1461039957806318160ddd146103c257806321c8d676146103ed57806323b872dd146104045780633c9527641461042d57610272565b806301ffc9a714610277578063046dc166146102b457806306fdde03146102dd578063081812fc14610308578063095ea7b314610345575b600080fd5b34801561028357600080fd5b5061029e600480360381019061029991906139b0565b6109f6565b6040516102ab91906139f8565b60405180910390f35b3480156102c057600080fd5b506102db60048036038101906102d69190613a71565b610ad8565b005b3480156102e957600080fd5b506102f2610b98565b6040516102ff9190613b37565b60405180910390f35b34801561031457600080fd5b5061032f600480360381019061032a9190613b8f565b610c2a565b60405161033c9190613bcb565b60405180910390f35b34801561035157600080fd5b5061036c60048036038101906103679190613be6565b610ca6565b005b34801561037a57600080fd5b50610383610dab565b6040516103909190613c35565b60405180910390f35b3480156103a557600080fd5b506103c060048036038101906103bb9190613c7c565b610db1565b005b3480156103ce57600080fd5b506103d7610e4a565b6040516103e49190613c35565b60405180910390f35b3480156103f957600080fd5b50610402610e61565b005b34801561041057600080fd5b5061042b60048036038101906104269190613ca9565b610faf565b005b34801561043957600080fd5b50610454600480360381019061044f9190613c7c565b610fbf565b005b34801561046257600080fd5b5061046b611058565b005b34801561047957600080fd5b50610494600480360381019061048f9190613ca9565b611123565b005b3480156104a257600080fd5b506104bd60048036038101906104b89190613b8f565b611143565b005b3480156104cb57600080fd5b506104e660048036038101906104e19190613b8f565b6111c9565b005b3480156104f457600080fd5b506104fd61124f565b60405161050a91906139f8565b60405180910390f35b34801561051f57600080fd5b50610528611262565b6040516105359190613b37565b60405180910390f35b34801561054a57600080fd5b5061056560048036038101906105609190613e31565b6112f0565b005b34801561057357600080fd5b5061057c611386565b60405161058991906139f8565b60405180910390f35b34801561059e57600080fd5b506105b960048036038101906105b49190613b8f565b611399565b005b3480156105c757600080fd5b506105e260048036038101906105dd9190613b8f565b61141f565b6040516105ef9190613bcb565b60405180910390f35b34801561060457600080fd5b5061060d611435565b60405161061a9190613c35565b60405180910390f35b34801561062f57600080fd5b5061063861143b565b6040516106459190613b37565b60405180910390f35b34801561065a57600080fd5b5061067560048036038101906106709190613b8f565b6114c9565b005b34801561068357600080fd5b5061069e60048036038101906106999190613a71565b6115ba565b6040516106ab9190613c35565b60405180910390f35b3480156106c057600080fd5b506106c961168a565b005b3480156106d757600080fd5b506106f260048036038101906106ed9190613b8f565b611712565b005b34801561070057600080fd5b50610709611798565b6040516107169190613bcb565b60405180910390f35b34801561072b57600080fd5b506107346117c2565b6040516107419190613c35565b60405180910390f35b34801561075657600080fd5b5061075f6117c8565b60405161076c9190613b37565b60405180910390f35b34801561078157600080fd5b5061078a61185a565b60405161079791906139f8565b60405180910390f35b3480156107ac57600080fd5b506107b561186d565b6040516107c29190613c35565b60405180910390f35b6107e560048036038101906107e09190613b8f565b611873565b005b3480156107f357600080fd5b5061080e60048036038101906108099190613e7a565b611ab9565b005b34801561081c57600080fd5b5061083760048036038101906108329190613f5b565b611c31565b005b34801561084557600080fd5b5061084e611ca9565b60405161085b9190613c35565b60405180910390f35b34801561087057600080fd5b5061088b60048036038101906108869190613b8f565b611caf565b6040516108989190613b37565b60405180910390f35b6108bb60048036038101906108b69190614014565b611d59565b005b3480156108c957600080fd5b506108d2612083565b6040516108df9190613c35565b60405180910390f35b3480156108f457600080fd5b5061090f600480360381019061090a9190613c7c565b612089565b005b34801561091d57600080fd5b5061093860048036038101906109339190614067565b612122565b60405161094591906139f8565b60405180910390f35b34801561095a57600080fd5b506109636121b6565b60405161097091906139f8565b60405180910390f35b34801561098557600080fd5b506109a0600480360381019061099b91906140a7565b6121c9565b005b3480156109ae57600080fd5b506109c960048036038101906109c49190613a71565b6122aa565b005b3480156109d757600080fd5b506109e06123a2565b6040516109ed91906139f8565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ac157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ad15750610ad0826123b5565b5b9050919050565b610ae061241f565b73ffffffffffffffffffffffffffffffffffffffff16610afe611798565b73ffffffffffffffffffffffffffffffffffffffff1614610b54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4b90614133565b60405180910390fd5b80601160056101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060028054610ba790614182565b80601f0160208091040260200160405190810160405280929190818152602001828054610bd390614182565b8015610c205780601f10610bf557610100808354040283529160200191610c20565b820191906000526020600020905b815481529060010190602001808311610c0357829003601f168201915b5050505050905090565b6000610c3582612427565b610c6b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cb18261141f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d19576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d3861241f565b73ffffffffffffffffffffffffffffffffffffffff1614610d9b57610d6481610d5f61241f565b612122565b610d9a576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b610da6838383612475565b505050565b600b5481565b610db961241f565b73ffffffffffffffffffffffffffffffffffffffff16610dd7611798565b73ffffffffffffffffffffffffffffffffffffffff1614610e2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2490614133565b60405180910390fd5b80601160006101000a81548160ff02191690831515021790555050565b6000610e54612527565b6001546000540303905090565b610e6961241f565b73ffffffffffffffffffffffffffffffffffffffff16610e87611798565b73ffffffffffffffffffffffffffffffffffffffff1614610edd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed490614133565b60405180910390fd5b600c54601054610eeb610e4a565b610ef591906141e3565b1115610f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2d90614285565b60405180910390fd5b601160029054906101000a900460ff1615610f86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7d90614317565b60405180910390fd5b610f9233601054612530565b6001601160026101000a81548160ff021916908315150217905550565b610fba83838361254e565b505050565b610fc761241f565b73ffffffffffffffffffffffffffffffffffffffff16610fe5611798565b73ffffffffffffffffffffffffffffffffffffffff161461103b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103290614133565b60405180910390fd5b80601160046101000a81548160ff02191690831515021790555050565b61106061241f565b73ffffffffffffffffffffffffffffffffffffffff1661107e611798565b73ffffffffffffffffffffffffffffffffffffffff16146110d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cb90614133565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561111f573d6000803e3d6000fd5b5050565b61113e83838360405180602001604052806000815250611c31565b505050565b61114b61241f565b73ffffffffffffffffffffffffffffffffffffffff16611169611798565b73ffffffffffffffffffffffffffffffffffffffff16146111bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b690614133565b60405180910390fd5b80600b8190555050565b6111d161241f565b73ffffffffffffffffffffffffffffffffffffffff166111ef611798565b73ffffffffffffffffffffffffffffffffffffffff1614611245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123c90614133565b60405180910390fd5b80600e8190555050565b601160019054906101000a900460ff1681565b600a805461126f90614182565b80601f016020809104026020016040519081016040528092919081815260200182805461129b90614182565b80156112e85780601f106112bd576101008083540402835291602001916112e8565b820191906000526020600020905b8154815290600101906020018083116112cb57829003601f168201915b505050505081565b6112f861241f565b73ffffffffffffffffffffffffffffffffffffffff16611316611798565b73ffffffffffffffffffffffffffffffffffffffff161461136c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136390614133565b60405180910390fd5b806009908051906020019061138292919061385e565b5050565b601160009054906101000a900460ff1681565b6113a161241f565b73ffffffffffffffffffffffffffffffffffffffff166113bf611798565b73ffffffffffffffffffffffffffffffffffffffff1614611415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140c90614133565b60405180910390fd5b80600f8190555050565b600061142a82612a04565b600001519050919050565b600d5481565b6009805461144890614182565b80601f016020809104026020016040519081016040528092919081815260200182805461147490614182565b80156114c15780601f10611496576101008083540402835291602001916114c1565b820191906000526020600020905b8154815290600101906020018083116114a457829003601f168201915b505050505081565b6114d161241f565b73ffffffffffffffffffffffffffffffffffffffff166114ef611798565b73ffffffffffffffffffffffffffffffffffffffff1614611545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153c90614133565b60405180910390fd5b601160039054906101000a900460ff1615611595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158c906143a9565b60405180910390fd5b80600c819055506001601160036101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611622576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61169261241f565b73ffffffffffffffffffffffffffffffffffffffff166116b0611798565b73ffffffffffffffffffffffffffffffffffffffff1614611706576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fd90614133565b60405180910390fd5b6117106000612c8f565b565b61171a61241f565b73ffffffffffffffffffffffffffffffffffffffff16611738611798565b73ffffffffffffffffffffffffffffffffffffffff161461178e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178590614133565b60405180910390fd5b80600d8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5481565b6060600380546117d790614182565b80601f016020809104026020016040519081016040528092919081815260200182805461180390614182565b80156118505780601f1061182557610100808354040283529160200191611850565b820191906000526020600020905b81548152906001019060200180831161183357829003601f168201915b5050505050905090565b601160049054906101000a900460ff1681565b60105481565b806000811180156118865750600e548111155b6118c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118bc90614415565b60405180910390fd5b600c54816118d1610e4a565b6118db91906141e3565b111561191c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191390614481565b60405180910390fd5b601160009054906101000a900460ff161561196c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611963906144ed565b60405180910390fd5b60001515601160049054906101000a900460ff161515146119c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b990614559565b60405180910390fd5b6119ca611798565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611aab5781600b54611a0a9190614579565b341015611a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a439061461f565b60405180910390fd5b6000611a5733612d55565b9050600f548382611a6891906141e3565b1115611aa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa09061468b565b60405180910390fd5b505b611ab53383612530565b5050565b611ac161241f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b26576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611b3361241f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611be061241f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c2591906139f8565b60405180910390a35050565b611c3c84848461254e565b611c5b8373ffffffffffffffffffffffffffffffffffffffff16612dbf565b15611ca357611c6c84848484612de2565b611ca2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600f5481565b6060611cba82612427565b611cf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf09061471d565b60405180910390fd5b6000611d03612f33565b90506000815111611d235760405180602001604052806000815250611d51565b80611d2d84612fc5565b600a604051602001611d419392919061480d565b6040516020818303038152906040525b915050919050565b82600081118015611d6c5750600e548111155b611dab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da290614415565b60405180910390fd5b600c5481611db7610e4a565b611dc191906141e3565b1115611e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df990614481565b60405180910390fd5b601160009054906101000a900460ff1615611e52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e49906144ed565b60405180910390fd5b600033604051602001611e659190613bcb565b6040516020818303038152906040528051906020012090506000611e8a828686613126565b90506000611e9733612d55565b905060011515601160049054906101000a900460ff16151514611eef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee69061488a565b60405180910390fd5b86600b54611efd9190614579565b341015611f3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f369061461f565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16601160059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611fcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc6906148f6565b60405180910390fd5b600087118015611fe15750600d548711155b612020576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201790614988565b60405180910390fd5b600d54878261202f91906141e3565b1115612070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206790614a1a565b60405180910390fd5b61207a3388612530565b50505050505050565b600c5481565b61209161241f565b73ffffffffffffffffffffffffffffffffffffffff166120af611798565b73ffffffffffffffffffffffffffffffffffffffff1614612105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fc90614133565b60405180910390fd5b80601160016101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601160039054906101000a900460ff1681565b6121d161241f565b73ffffffffffffffffffffffffffffffffffffffff166121ef611798565b73ffffffffffffffffffffffffffffffffffffffff1614612245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223c90614133565b60405180910390fd5b600c5482612251610e4a565b61225b91906141e3565b111561229c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229390614285565b60405180910390fd5b6122a68183612530565b5050565b6122b261241f565b73ffffffffffffffffffffffffffffffffffffffff166122d0611798565b73ffffffffffffffffffffffffffffffffffffffff1614612326576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231d90614133565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612396576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238d90614aac565b60405180910390fd5b61239f81612c8f565b50565b601160029054906101000a900460ff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600081612432612527565b11158015612441575060005482105b801561246e575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b61254a82826040518060200160405280600081525061314f565b5050565b600061255982612a04565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146125c4576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166125e561241f565b73ffffffffffffffffffffffffffffffffffffffff16148061261457506126138561260e61241f565b612122565b5b80612659575061262261241f565b73ffffffffffffffffffffffffffffffffffffffff1661264184610c2a565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612692576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156126f9576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127068585856001613511565b61271260008487612475565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561299257600054821461299157878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129fd8585856001613517565b5050505050565b612a0c6138e4565b600082905080612a1a612527565b11612c5857600054811015612c57576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612c5557600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612b39578092505050612c8a565b5b600115612c5457818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612c4f578092505050612c8a565b612b3a565b5b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e0861241f565b8786866040518563ffffffff1660e01b8152600401612e2a9493929190614b21565b6020604051808303816000875af1925050508015612e6657506040513d601f19601f82011682018060405250810190612e639190614b82565b60015b612ee0573d8060008114612e96576040519150601f19603f3d011682016040523d82523d6000602084013e612e9b565b606091505b50600081511415612ed8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054612f4290614182565b80601f0160208091040260200160405190810160405280929190818152602001828054612f6e90614182565b8015612fbb5780601f10612f9057610100808354040283529160200191612fbb565b820191906000526020600020905b815481529060010190602001808311612f9e57829003601f168201915b5050505050905090565b6060600082141561300d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613121565b600082905060005b6000821461303f57808061302890614baf565b915050600a826130389190614c27565b9150613015565b60008167ffffffffffffffff81111561305b5761305a613d06565b5b6040519080825280601f01601f19166020018201604052801561308d5781602001600182028036833780820191505090505b5090505b6000851461311a576001826130a69190614c58565b9150600a856130b59190614c8c565b60306130c191906141e3565b60f81b8183815181106130d7576130d6614cbd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131139190614c27565b9450613091565b8093505050505b919050565b600080600061313686868661351d565b915091506131438161357c565b81925050509392505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156131bc576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008314156131f7576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6132046000858386613511565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600084820190506133c58673ffffffffffffffffffffffffffffffffffffffff16612dbf565b1561348a575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461343a6000878480600101955087612de2565b613470576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106133cb57826000541461348557600080fd5b6134f5565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061348b575b81600081905550505061350b6000858386613517565b50505050565b50505050565b50505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c61356091906141e3565b905061356e87828885613751565b935093505050935093915050565b600060048111156135905761358f614cec565b5b8160048111156135a3576135a2614cec565b5b14156135ae5761374e565b600160048111156135c2576135c1614cec565b5b8160048111156135d5576135d4614cec565b5b1415613616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360d90614d67565b60405180910390fd5b6002600481111561362a57613629614cec565b5b81600481111561363d5761363c614cec565b5b141561367e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161367590614dd3565b60405180910390fd5b6003600481111561369257613691614cec565b5b8160048111156136a5576136a4614cec565b5b14156136e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136dd90614e65565b60405180910390fd5b6004808111156136f9576136f8614cec565b5b81600481111561370c5761370b614cec565b5b141561374d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161374490614ef7565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561378c576000600391509150613855565b601b8560ff16141580156137a45750601c8560ff1614155b156137b6576000600491509150613855565b6000600187878787604051600081526020016040526040516137db9493929190614f42565b6020604051602081039080840390855afa1580156137fd573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561384c57600060019250925050613855565b80600092509250505b94509492505050565b82805461386a90614182565b90600052602060002090601f01602090048101928261388c57600085556138d3565b82601f106138a557805160ff19168380011785556138d3565b828001600101855582156138d3579182015b828111156138d25782518255916020019190600101906138b7565b5b5090506138e09190613927565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613940576000816000905550600101613928565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61398d81613958565b811461399857600080fd5b50565b6000813590506139aa81613984565b92915050565b6000602082840312156139c6576139c561394e565b5b60006139d48482850161399b565b91505092915050565b60008115159050919050565b6139f2816139dd565b82525050565b6000602082019050613a0d60008301846139e9565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a3e82613a13565b9050919050565b613a4e81613a33565b8114613a5957600080fd5b50565b600081359050613a6b81613a45565b92915050565b600060208284031215613a8757613a8661394e565b5b6000613a9584828501613a5c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613ad8578082015181840152602081019050613abd565b83811115613ae7576000848401525b50505050565b6000601f19601f8301169050919050565b6000613b0982613a9e565b613b138185613aa9565b9350613b23818560208601613aba565b613b2c81613aed565b840191505092915050565b60006020820190508181036000830152613b518184613afe565b905092915050565b6000819050919050565b613b6c81613b59565b8114613b7757600080fd5b50565b600081359050613b8981613b63565b92915050565b600060208284031215613ba557613ba461394e565b5b6000613bb384828501613b7a565b91505092915050565b613bc581613a33565b82525050565b6000602082019050613be06000830184613bbc565b92915050565b60008060408385031215613bfd57613bfc61394e565b5b6000613c0b85828601613a5c565b9250506020613c1c85828601613b7a565b9150509250929050565b613c2f81613b59565b82525050565b6000602082019050613c4a6000830184613c26565b92915050565b613c59816139dd565b8114613c6457600080fd5b50565b600081359050613c7681613c50565b92915050565b600060208284031215613c9257613c9161394e565b5b6000613ca084828501613c67565b91505092915050565b600080600060608486031215613cc257613cc161394e565b5b6000613cd086828701613a5c565b9350506020613ce186828701613a5c565b9250506040613cf286828701613b7a565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613d3e82613aed565b810181811067ffffffffffffffff82111715613d5d57613d5c613d06565b5b80604052505050565b6000613d70613944565b9050613d7c8282613d35565b919050565b600067ffffffffffffffff821115613d9c57613d9b613d06565b5b613da582613aed565b9050602081019050919050565b82818337600083830152505050565b6000613dd4613dcf84613d81565b613d66565b905082815260208101848484011115613df057613def613d01565b5b613dfb848285613db2565b509392505050565b600082601f830112613e1857613e17613cfc565b5b8135613e28848260208601613dc1565b91505092915050565b600060208284031215613e4757613e4661394e565b5b600082013567ffffffffffffffff811115613e6557613e64613953565b5b613e7184828501613e03565b91505092915050565b60008060408385031215613e9157613e9061394e565b5b6000613e9f85828601613a5c565b9250506020613eb085828601613c67565b9150509250929050565b600067ffffffffffffffff821115613ed557613ed4613d06565b5b613ede82613aed565b9050602081019050919050565b6000613efe613ef984613eba565b613d66565b905082815260208101848484011115613f1a57613f19613d01565b5b613f25848285613db2565b509392505050565b600082601f830112613f4257613f41613cfc565b5b8135613f52848260208601613eeb565b91505092915050565b60008060008060808587031215613f7557613f7461394e565b5b6000613f8387828801613a5c565b9450506020613f9487828801613a5c565b9350506040613fa587828801613b7a565b925050606085013567ffffffffffffffff811115613fc657613fc5613953565b5b613fd287828801613f2d565b91505092959194509250565b6000819050919050565b613ff181613fde565b8114613ffc57600080fd5b50565b60008135905061400e81613fe8565b92915050565b60008060006060848603121561402d5761402c61394e565b5b600061403b86828701613b7a565b935050602061404c86828701613fff565b925050604061405d86828701613fff565b9150509250925092565b6000806040838503121561407e5761407d61394e565b5b600061408c85828601613a5c565b925050602061409d85828601613a5c565b9150509250929050565b600080604083850312156140be576140bd61394e565b5b60006140cc85828601613b7a565b92505060206140dd85828601613a5c565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061411d602083613aa9565b9150614128826140e7565b602082019050919050565b6000602082019050818103600083015261414c81614110565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061419a57607f821691505b602082108114156141ae576141ad614153565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006141ee82613b59565b91506141f983613b59565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561422e5761422d6141b4565b5b828201905092915050565b7f4d696e7420416d6f756e742044656e6965640000000000000000000000000000600082015250565b600061426f601283613aa9565b915061427a82614239565b602082019050919050565b6000602082019050818103600083015261429e81614262565b9050919050565b7f546f6b656e73206861766520616c7265616479206265656e207265736572766560008201527f642e000000000000000000000000000000000000000000000000000000000000602082015250565b6000614301602283613aa9565b915061430c826142a5565b604082019050919050565b60006020820190508181036000830152614330816142f4565b9050919050565b7f537570706c792068617320616c7265616479206265656e206368616e6765642060008201527f6f6e63652e000000000000000000000000000000000000000000000000000000602082015250565b6000614393602583613aa9565b915061439e82614337565b604082019050919050565b600060208201905081810360008301526143c281614386565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b60006143ff601483613aa9565b915061440a826143c9565b602082019050919050565b6000602082019050818103600083015261442e816143f2565b9050919050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b600061446b601483613aa9565b915061447682614435565b602082019050919050565b6000602082019050818103600083015261449a8161445e565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b60006144d7601783613aa9565b91506144e2826144a1565b602082019050919050565b60006020820190508181036000830152614506816144ca565b9050919050565b7f5075626c69632053616c65206e6f742041637469766500000000000000000000600082015250565b6000614543601683613aa9565b915061454e8261450d565b602082019050919050565b6000602082019050818103600083015261457281614536565b9050919050565b600061458482613b59565b915061458f83613b59565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156145c8576145c76141b4565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6000614609601383613aa9565b9150614614826145d3565b602082019050919050565b60006020820190508181036000830152614638816145fc565b9050919050565b7f4d6178204e465420706572206164647265737320657863656564656400000000600082015250565b6000614675601c83613aa9565b91506146808261463f565b602082019050919050565b600060208201905081810360008301526146a481614668565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614707602f83613aa9565b9150614712826146ab565b604082019050919050565b60006020820190508181036000830152614736816146fa565b9050919050565b600081905092915050565b600061475382613a9e565b61475d818561473d565b935061476d818560208601613aba565b80840191505092915050565b60008190508160005260206000209050919050565b6000815461479b81614182565b6147a5818661473d565b945060018216600081146147c057600181146147d157614804565b60ff19831686528186019350614804565b6147da85614779565b60005b838110156147fc578154818901526001820191506020810190506147dd565b838801955050505b50505092915050565b60006148198286614748565b91506148258285614748565b9150614831828461478e565b9150819050949350505050565b7f43757272656e74207374617465206973206e6f742070726573616c6521000000600082015250565b6000614874601d83613aa9565b915061487f8261483e565b602082019050919050565b600060208201905081810360008301526148a381614867565b9050919050565b7f496e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b60006148e0601183613aa9565b91506148eb826148aa565b602082019050919050565b6000602082019050818103600083015261490f816148d3565b9050919050565b7f4d6178206d696e74732070657220747820647572696e6720707269766174652060008201527f73616c6520657863656564656421000000000000000000000000000000000000602082015250565b6000614972602e83613aa9565b915061497d82614916565b604082019050919050565b600060208201905081810360008301526149a181614965565b9050919050565b7f4d6178204e46547320706572206164647265737320647572696e67207072697660008201527f6174652073616c65206578636565646564200000000000000000000000000000602082015250565b6000614a04603283613aa9565b9150614a0f826149a8565b604082019050919050565b60006020820190508181036000830152614a33816149f7565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614a96602683613aa9565b9150614aa182614a3a565b604082019050919050565b60006020820190508181036000830152614ac581614a89565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614af382614acc565b614afd8185614ad7565b9350614b0d818560208601613aba565b614b1681613aed565b840191505092915050565b6000608082019050614b366000830187613bbc565b614b436020830186613bbc565b614b506040830185613c26565b8181036060830152614b628184614ae8565b905095945050505050565b600081519050614b7c81613984565b92915050565b600060208284031215614b9857614b9761394e565b5b6000614ba684828501614b6d565b91505092915050565b6000614bba82613b59565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614bed57614bec6141b4565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614c3282613b59565b9150614c3d83613b59565b925082614c4d57614c4c614bf8565b5b828204905092915050565b6000614c6382613b59565b9150614c6e83613b59565b925082821015614c8157614c806141b4565b5b828203905092915050565b6000614c9782613b59565b9150614ca283613b59565b925082614cb257614cb1614bf8565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000614d51601883613aa9565b9150614d5c82614d1b565b602082019050919050565b60006020820190508181036000830152614d8081614d44565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000614dbd601f83613aa9565b9150614dc882614d87565b602082019050919050565b60006020820190508181036000830152614dec81614db0565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000614e4f602283613aa9565b9150614e5a82614df3565b604082019050919050565b60006020820190508181036000830152614e7e81614e42565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000614ee1602283613aa9565b9150614eec82614e85565b604082019050919050565b60006020820190508181036000830152614f1081614ed4565b9050919050565b614f2081613fde565b82525050565b600060ff82169050919050565b614f3c81614f26565b82525050565b6000608082019050614f576000830187614f17565b614f646020830186614f33565b614f716040830185614f17565b614f7e6060830184614f17565b9594505050505056fea26469706673582212200bf61ab4c501dfeaf360e798c2019e36585350bab8ba7e1ad97558b9a72a9e3664736f6c634300080b0033697066733a2f2f516d4e5a3846337775736d38555a367531544c51524743586575475a6a72704d534e52487a6a58656277637146372f

Deployed Bytecode

0x6080604052600436106102725760003560e01c80636c0360eb1161014f578063a22cb465116100c1578063e0a808531161007a578063e0a80853146108e8578063e985e9c514610911578063eca467931461094e578063efbd73f414610979578063f2fde38b146109a2578063fb5bc457146109cb57610272565b8063a22cb465146107e7578063b88d4fde14610810578063ba7d2c7614610839578063c87b56dd14610864578063d5712744146108a1578063d5abeb01146108bd57610272565b80638da5cb5b116101135780638da5cb5b146106f45780638f575bee1461071f57806395d89b411461074a5780639c70b512146107755780639d2cc436146107a0578063a0712d68146107cb57610272565b80636c0360eb146106235780636f8b44b01461064e57806370a0823114610677578063715018a6146106b457806371d11812146106cb57610272565b80633ccfd60b116101e85780635503a0e8116101ac5780635503a0e81461051357806355f804b31461053e5780635c975abb1461056757806363331c8d146105925780636352211e146105bb57806369ff20d4146105f857610272565b80633ccfd60b1461045657806342842e0e1461046d57806344a0d68a1461049657806349d3a2c5146104bf57806351830227146104e857610272565b806313faede61161023a57806313faede61461036e57806316c38b3c1461039957806318160ddd146103c257806321c8d676146103ed57806323b872dd146104045780633c9527641461042d57610272565b806301ffc9a714610277578063046dc166146102b457806306fdde03146102dd578063081812fc14610308578063095ea7b314610345575b600080fd5b34801561028357600080fd5b5061029e600480360381019061029991906139b0565b6109f6565b6040516102ab91906139f8565b60405180910390f35b3480156102c057600080fd5b506102db60048036038101906102d69190613a71565b610ad8565b005b3480156102e957600080fd5b506102f2610b98565b6040516102ff9190613b37565b60405180910390f35b34801561031457600080fd5b5061032f600480360381019061032a9190613b8f565b610c2a565b60405161033c9190613bcb565b60405180910390f35b34801561035157600080fd5b5061036c60048036038101906103679190613be6565b610ca6565b005b34801561037a57600080fd5b50610383610dab565b6040516103909190613c35565b60405180910390f35b3480156103a557600080fd5b506103c060048036038101906103bb9190613c7c565b610db1565b005b3480156103ce57600080fd5b506103d7610e4a565b6040516103e49190613c35565b60405180910390f35b3480156103f957600080fd5b50610402610e61565b005b34801561041057600080fd5b5061042b60048036038101906104269190613ca9565b610faf565b005b34801561043957600080fd5b50610454600480360381019061044f9190613c7c565b610fbf565b005b34801561046257600080fd5b5061046b611058565b005b34801561047957600080fd5b50610494600480360381019061048f9190613ca9565b611123565b005b3480156104a257600080fd5b506104bd60048036038101906104b89190613b8f565b611143565b005b3480156104cb57600080fd5b506104e660048036038101906104e19190613b8f565b6111c9565b005b3480156104f457600080fd5b506104fd61124f565b60405161050a91906139f8565b60405180910390f35b34801561051f57600080fd5b50610528611262565b6040516105359190613b37565b60405180910390f35b34801561054a57600080fd5b5061056560048036038101906105609190613e31565b6112f0565b005b34801561057357600080fd5b5061057c611386565b60405161058991906139f8565b60405180910390f35b34801561059e57600080fd5b506105b960048036038101906105b49190613b8f565b611399565b005b3480156105c757600080fd5b506105e260048036038101906105dd9190613b8f565b61141f565b6040516105ef9190613bcb565b60405180910390f35b34801561060457600080fd5b5061060d611435565b60405161061a9190613c35565b60405180910390f35b34801561062f57600080fd5b5061063861143b565b6040516106459190613b37565b60405180910390f35b34801561065a57600080fd5b5061067560048036038101906106709190613b8f565b6114c9565b005b34801561068357600080fd5b5061069e60048036038101906106999190613a71565b6115ba565b6040516106ab9190613c35565b60405180910390f35b3480156106c057600080fd5b506106c961168a565b005b3480156106d757600080fd5b506106f260048036038101906106ed9190613b8f565b611712565b005b34801561070057600080fd5b50610709611798565b6040516107169190613bcb565b60405180910390f35b34801561072b57600080fd5b506107346117c2565b6040516107419190613c35565b60405180910390f35b34801561075657600080fd5b5061075f6117c8565b60405161076c9190613b37565b60405180910390f35b34801561078157600080fd5b5061078a61185a565b60405161079791906139f8565b60405180910390f35b3480156107ac57600080fd5b506107b561186d565b6040516107c29190613c35565b60405180910390f35b6107e560048036038101906107e09190613b8f565b611873565b005b3480156107f357600080fd5b5061080e60048036038101906108099190613e7a565b611ab9565b005b34801561081c57600080fd5b5061083760048036038101906108329190613f5b565b611c31565b005b34801561084557600080fd5b5061084e611ca9565b60405161085b9190613c35565b60405180910390f35b34801561087057600080fd5b5061088b60048036038101906108869190613b8f565b611caf565b6040516108989190613b37565b60405180910390f35b6108bb60048036038101906108b69190614014565b611d59565b005b3480156108c957600080fd5b506108d2612083565b6040516108df9190613c35565b60405180910390f35b3480156108f457600080fd5b5061090f600480360381019061090a9190613c7c565b612089565b005b34801561091d57600080fd5b5061093860048036038101906109339190614067565b612122565b60405161094591906139f8565b60405180910390f35b34801561095a57600080fd5b506109636121b6565b60405161097091906139f8565b60405180910390f35b34801561098557600080fd5b506109a0600480360381019061099b91906140a7565b6121c9565b005b3480156109ae57600080fd5b506109c960048036038101906109c49190613a71565b6122aa565b005b3480156109d757600080fd5b506109e06123a2565b6040516109ed91906139f8565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ac157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ad15750610ad0826123b5565b5b9050919050565b610ae061241f565b73ffffffffffffffffffffffffffffffffffffffff16610afe611798565b73ffffffffffffffffffffffffffffffffffffffff1614610b54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4b90614133565b60405180910390fd5b80601160056101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060028054610ba790614182565b80601f0160208091040260200160405190810160405280929190818152602001828054610bd390614182565b8015610c205780601f10610bf557610100808354040283529160200191610c20565b820191906000526020600020905b815481529060010190602001808311610c0357829003601f168201915b5050505050905090565b6000610c3582612427565b610c6b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cb18261141f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d19576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d3861241f565b73ffffffffffffffffffffffffffffffffffffffff1614610d9b57610d6481610d5f61241f565b612122565b610d9a576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b610da6838383612475565b505050565b600b5481565b610db961241f565b73ffffffffffffffffffffffffffffffffffffffff16610dd7611798565b73ffffffffffffffffffffffffffffffffffffffff1614610e2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2490614133565b60405180910390fd5b80601160006101000a81548160ff02191690831515021790555050565b6000610e54612527565b6001546000540303905090565b610e6961241f565b73ffffffffffffffffffffffffffffffffffffffff16610e87611798565b73ffffffffffffffffffffffffffffffffffffffff1614610edd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed490614133565b60405180910390fd5b600c54601054610eeb610e4a565b610ef591906141e3565b1115610f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2d90614285565b60405180910390fd5b601160029054906101000a900460ff1615610f86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7d90614317565b60405180910390fd5b610f9233601054612530565b6001601160026101000a81548160ff021916908315150217905550565b610fba83838361254e565b505050565b610fc761241f565b73ffffffffffffffffffffffffffffffffffffffff16610fe5611798565b73ffffffffffffffffffffffffffffffffffffffff161461103b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103290614133565b60405180910390fd5b80601160046101000a81548160ff02191690831515021790555050565b61106061241f565b73ffffffffffffffffffffffffffffffffffffffff1661107e611798565b73ffffffffffffffffffffffffffffffffffffffff16146110d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cb90614133565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561111f573d6000803e3d6000fd5b5050565b61113e83838360405180602001604052806000815250611c31565b505050565b61114b61241f565b73ffffffffffffffffffffffffffffffffffffffff16611169611798565b73ffffffffffffffffffffffffffffffffffffffff16146111bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b690614133565b60405180910390fd5b80600b8190555050565b6111d161241f565b73ffffffffffffffffffffffffffffffffffffffff166111ef611798565b73ffffffffffffffffffffffffffffffffffffffff1614611245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123c90614133565b60405180910390fd5b80600e8190555050565b601160019054906101000a900460ff1681565b600a805461126f90614182565b80601f016020809104026020016040519081016040528092919081815260200182805461129b90614182565b80156112e85780601f106112bd576101008083540402835291602001916112e8565b820191906000526020600020905b8154815290600101906020018083116112cb57829003601f168201915b505050505081565b6112f861241f565b73ffffffffffffffffffffffffffffffffffffffff16611316611798565b73ffffffffffffffffffffffffffffffffffffffff161461136c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136390614133565b60405180910390fd5b806009908051906020019061138292919061385e565b5050565b601160009054906101000a900460ff1681565b6113a161241f565b73ffffffffffffffffffffffffffffffffffffffff166113bf611798565b73ffffffffffffffffffffffffffffffffffffffff1614611415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140c90614133565b60405180910390fd5b80600f8190555050565b600061142a82612a04565b600001519050919050565b600d5481565b6009805461144890614182565b80601f016020809104026020016040519081016040528092919081815260200182805461147490614182565b80156114c15780601f10611496576101008083540402835291602001916114c1565b820191906000526020600020905b8154815290600101906020018083116114a457829003601f168201915b505050505081565b6114d161241f565b73ffffffffffffffffffffffffffffffffffffffff166114ef611798565b73ffffffffffffffffffffffffffffffffffffffff1614611545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153c90614133565b60405180910390fd5b601160039054906101000a900460ff1615611595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158c906143a9565b60405180910390fd5b80600c819055506001601160036101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611622576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61169261241f565b73ffffffffffffffffffffffffffffffffffffffff166116b0611798565b73ffffffffffffffffffffffffffffffffffffffff1614611706576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fd90614133565b60405180910390fd5b6117106000612c8f565b565b61171a61241f565b73ffffffffffffffffffffffffffffffffffffffff16611738611798565b73ffffffffffffffffffffffffffffffffffffffff161461178e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178590614133565b60405180910390fd5b80600d8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5481565b6060600380546117d790614182565b80601f016020809104026020016040519081016040528092919081815260200182805461180390614182565b80156118505780601f1061182557610100808354040283529160200191611850565b820191906000526020600020905b81548152906001019060200180831161183357829003601f168201915b5050505050905090565b601160049054906101000a900460ff1681565b60105481565b806000811180156118865750600e548111155b6118c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118bc90614415565b60405180910390fd5b600c54816118d1610e4a565b6118db91906141e3565b111561191c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191390614481565b60405180910390fd5b601160009054906101000a900460ff161561196c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611963906144ed565b60405180910390fd5b60001515601160049054906101000a900460ff161515146119c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b990614559565b60405180910390fd5b6119ca611798565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611aab5781600b54611a0a9190614579565b341015611a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a439061461f565b60405180910390fd5b6000611a5733612d55565b9050600f548382611a6891906141e3565b1115611aa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa09061468b565b60405180910390fd5b505b611ab53383612530565b5050565b611ac161241f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b26576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611b3361241f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611be061241f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c2591906139f8565b60405180910390a35050565b611c3c84848461254e565b611c5b8373ffffffffffffffffffffffffffffffffffffffff16612dbf565b15611ca357611c6c84848484612de2565b611ca2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600f5481565b6060611cba82612427565b611cf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf09061471d565b60405180910390fd5b6000611d03612f33565b90506000815111611d235760405180602001604052806000815250611d51565b80611d2d84612fc5565b600a604051602001611d419392919061480d565b6040516020818303038152906040525b915050919050565b82600081118015611d6c5750600e548111155b611dab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da290614415565b60405180910390fd5b600c5481611db7610e4a565b611dc191906141e3565b1115611e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df990614481565b60405180910390fd5b601160009054906101000a900460ff1615611e52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e49906144ed565b60405180910390fd5b600033604051602001611e659190613bcb565b6040516020818303038152906040528051906020012090506000611e8a828686613126565b90506000611e9733612d55565b905060011515601160049054906101000a900460ff16151514611eef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee69061488a565b60405180910390fd5b86600b54611efd9190614579565b341015611f3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f369061461f565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16601160059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611fcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc6906148f6565b60405180910390fd5b600087118015611fe15750600d548711155b612020576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201790614988565b60405180910390fd5b600d54878261202f91906141e3565b1115612070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206790614a1a565b60405180910390fd5b61207a3388612530565b50505050505050565b600c5481565b61209161241f565b73ffffffffffffffffffffffffffffffffffffffff166120af611798565b73ffffffffffffffffffffffffffffffffffffffff1614612105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fc90614133565b60405180910390fd5b80601160016101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601160039054906101000a900460ff1681565b6121d161241f565b73ffffffffffffffffffffffffffffffffffffffff166121ef611798565b73ffffffffffffffffffffffffffffffffffffffff1614612245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223c90614133565b60405180910390fd5b600c5482612251610e4a565b61225b91906141e3565b111561229c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229390614285565b60405180910390fd5b6122a68183612530565b5050565b6122b261241f565b73ffffffffffffffffffffffffffffffffffffffff166122d0611798565b73ffffffffffffffffffffffffffffffffffffffff1614612326576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231d90614133565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612396576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238d90614aac565b60405180910390fd5b61239f81612c8f565b50565b601160029054906101000a900460ff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600081612432612527565b11158015612441575060005482105b801561246e575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b61254a82826040518060200160405280600081525061314f565b5050565b600061255982612a04565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146125c4576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166125e561241f565b73ffffffffffffffffffffffffffffffffffffffff16148061261457506126138561260e61241f565b612122565b5b80612659575061262261241f565b73ffffffffffffffffffffffffffffffffffffffff1661264184610c2a565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612692576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156126f9576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127068585856001613511565b61271260008487612475565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561299257600054821461299157878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129fd8585856001613517565b5050505050565b612a0c6138e4565b600082905080612a1a612527565b11612c5857600054811015612c57576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612c5557600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612b39578092505050612c8a565b5b600115612c5457818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612c4f578092505050612c8a565b612b3a565b5b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e0861241f565b8786866040518563ffffffff1660e01b8152600401612e2a9493929190614b21565b6020604051808303816000875af1925050508015612e6657506040513d601f19601f82011682018060405250810190612e639190614b82565b60015b612ee0573d8060008114612e96576040519150601f19603f3d011682016040523d82523d6000602084013e612e9b565b606091505b50600081511415612ed8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054612f4290614182565b80601f0160208091040260200160405190810160405280929190818152602001828054612f6e90614182565b8015612fbb5780601f10612f9057610100808354040283529160200191612fbb565b820191906000526020600020905b815481529060010190602001808311612f9e57829003601f168201915b5050505050905090565b6060600082141561300d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613121565b600082905060005b6000821461303f57808061302890614baf565b915050600a826130389190614c27565b9150613015565b60008167ffffffffffffffff81111561305b5761305a613d06565b5b6040519080825280601f01601f19166020018201604052801561308d5781602001600182028036833780820191505090505b5090505b6000851461311a576001826130a69190614c58565b9150600a856130b59190614c8c565b60306130c191906141e3565b60f81b8183815181106130d7576130d6614cbd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131139190614c27565b9450613091565b8093505050505b919050565b600080600061313686868661351d565b915091506131438161357c565b81925050509392505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156131bc576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008314156131f7576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6132046000858386613511565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600084820190506133c58673ffffffffffffffffffffffffffffffffffffffff16612dbf565b1561348a575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461343a6000878480600101955087612de2565b613470576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106133cb57826000541461348557600080fd5b6134f5565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061348b575b81600081905550505061350b6000858386613517565b50505050565b50505050565b50505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c61356091906141e3565b905061356e87828885613751565b935093505050935093915050565b600060048111156135905761358f614cec565b5b8160048111156135a3576135a2614cec565b5b14156135ae5761374e565b600160048111156135c2576135c1614cec565b5b8160048111156135d5576135d4614cec565b5b1415613616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360d90614d67565b60405180910390fd5b6002600481111561362a57613629614cec565b5b81600481111561363d5761363c614cec565b5b141561367e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161367590614dd3565b60405180910390fd5b6003600481111561369257613691614cec565b5b8160048111156136a5576136a4614cec565b5b14156136e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136dd90614e65565b60405180910390fd5b6004808111156136f9576136f8614cec565b5b81600481111561370c5761370b614cec565b5b141561374d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161374490614ef7565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561378c576000600391509150613855565b601b8560ff16141580156137a45750601c8560ff1614155b156137b6576000600491509150613855565b6000600187878787604051600081526020016040526040516137db9493929190614f42565b6020604051602081039080840390855afa1580156137fd573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561384c57600060019250925050613855565b80600092509250505b94509492505050565b82805461386a90614182565b90600052602060002090601f01602090048101928261388c57600085556138d3565b82601f106138a557805160ff19168380011785556138d3565b828001600101855582156138d3579182015b828111156138d25782518255916020019190600101906138b7565b5b5090506138e09190613927565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613940576000816000905550600101613928565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61398d81613958565b811461399857600080fd5b50565b6000813590506139aa81613984565b92915050565b6000602082840312156139c6576139c561394e565b5b60006139d48482850161399b565b91505092915050565b60008115159050919050565b6139f2816139dd565b82525050565b6000602082019050613a0d60008301846139e9565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a3e82613a13565b9050919050565b613a4e81613a33565b8114613a5957600080fd5b50565b600081359050613a6b81613a45565b92915050565b600060208284031215613a8757613a8661394e565b5b6000613a9584828501613a5c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613ad8578082015181840152602081019050613abd565b83811115613ae7576000848401525b50505050565b6000601f19601f8301169050919050565b6000613b0982613a9e565b613b138185613aa9565b9350613b23818560208601613aba565b613b2c81613aed565b840191505092915050565b60006020820190508181036000830152613b518184613afe565b905092915050565b6000819050919050565b613b6c81613b59565b8114613b7757600080fd5b50565b600081359050613b8981613b63565b92915050565b600060208284031215613ba557613ba461394e565b5b6000613bb384828501613b7a565b91505092915050565b613bc581613a33565b82525050565b6000602082019050613be06000830184613bbc565b92915050565b60008060408385031215613bfd57613bfc61394e565b5b6000613c0b85828601613a5c565b9250506020613c1c85828601613b7a565b9150509250929050565b613c2f81613b59565b82525050565b6000602082019050613c4a6000830184613c26565b92915050565b613c59816139dd565b8114613c6457600080fd5b50565b600081359050613c7681613c50565b92915050565b600060208284031215613c9257613c9161394e565b5b6000613ca084828501613c67565b91505092915050565b600080600060608486031215613cc257613cc161394e565b5b6000613cd086828701613a5c565b9350506020613ce186828701613a5c565b9250506040613cf286828701613b7a565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613d3e82613aed565b810181811067ffffffffffffffff82111715613d5d57613d5c613d06565b5b80604052505050565b6000613d70613944565b9050613d7c8282613d35565b919050565b600067ffffffffffffffff821115613d9c57613d9b613d06565b5b613da582613aed565b9050602081019050919050565b82818337600083830152505050565b6000613dd4613dcf84613d81565b613d66565b905082815260208101848484011115613df057613def613d01565b5b613dfb848285613db2565b509392505050565b600082601f830112613e1857613e17613cfc565b5b8135613e28848260208601613dc1565b91505092915050565b600060208284031215613e4757613e4661394e565b5b600082013567ffffffffffffffff811115613e6557613e64613953565b5b613e7184828501613e03565b91505092915050565b60008060408385031215613e9157613e9061394e565b5b6000613e9f85828601613a5c565b9250506020613eb085828601613c67565b9150509250929050565b600067ffffffffffffffff821115613ed557613ed4613d06565b5b613ede82613aed565b9050602081019050919050565b6000613efe613ef984613eba565b613d66565b905082815260208101848484011115613f1a57613f19613d01565b5b613f25848285613db2565b509392505050565b600082601f830112613f4257613f41613cfc565b5b8135613f52848260208601613eeb565b91505092915050565b60008060008060808587031215613f7557613f7461394e565b5b6000613f8387828801613a5c565b9450506020613f9487828801613a5c565b9350506040613fa587828801613b7a565b925050606085013567ffffffffffffffff811115613fc657613fc5613953565b5b613fd287828801613f2d565b91505092959194509250565b6000819050919050565b613ff181613fde565b8114613ffc57600080fd5b50565b60008135905061400e81613fe8565b92915050565b60008060006060848603121561402d5761402c61394e565b5b600061403b86828701613b7a565b935050602061404c86828701613fff565b925050604061405d86828701613fff565b9150509250925092565b6000806040838503121561407e5761407d61394e565b5b600061408c85828601613a5c565b925050602061409d85828601613a5c565b9150509250929050565b600080604083850312156140be576140bd61394e565b5b60006140cc85828601613b7a565b92505060206140dd85828601613a5c565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061411d602083613aa9565b9150614128826140e7565b602082019050919050565b6000602082019050818103600083015261414c81614110565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061419a57607f821691505b602082108114156141ae576141ad614153565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006141ee82613b59565b91506141f983613b59565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561422e5761422d6141b4565b5b828201905092915050565b7f4d696e7420416d6f756e742044656e6965640000000000000000000000000000600082015250565b600061426f601283613aa9565b915061427a82614239565b602082019050919050565b6000602082019050818103600083015261429e81614262565b9050919050565b7f546f6b656e73206861766520616c7265616479206265656e207265736572766560008201527f642e000000000000000000000000000000000000000000000000000000000000602082015250565b6000614301602283613aa9565b915061430c826142a5565b604082019050919050565b60006020820190508181036000830152614330816142f4565b9050919050565b7f537570706c792068617320616c7265616479206265656e206368616e6765642060008201527f6f6e63652e000000000000000000000000000000000000000000000000000000602082015250565b6000614393602583613aa9565b915061439e82614337565b604082019050919050565b600060208201905081810360008301526143c281614386565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b60006143ff601483613aa9565b915061440a826143c9565b602082019050919050565b6000602082019050818103600083015261442e816143f2565b9050919050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b600061446b601483613aa9565b915061447682614435565b602082019050919050565b6000602082019050818103600083015261449a8161445e565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b60006144d7601783613aa9565b91506144e2826144a1565b602082019050919050565b60006020820190508181036000830152614506816144ca565b9050919050565b7f5075626c69632053616c65206e6f742041637469766500000000000000000000600082015250565b6000614543601683613aa9565b915061454e8261450d565b602082019050919050565b6000602082019050818103600083015261457281614536565b9050919050565b600061458482613b59565b915061458f83613b59565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156145c8576145c76141b4565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6000614609601383613aa9565b9150614614826145d3565b602082019050919050565b60006020820190508181036000830152614638816145fc565b9050919050565b7f4d6178204e465420706572206164647265737320657863656564656400000000600082015250565b6000614675601c83613aa9565b91506146808261463f565b602082019050919050565b600060208201905081810360008301526146a481614668565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614707602f83613aa9565b9150614712826146ab565b604082019050919050565b60006020820190508181036000830152614736816146fa565b9050919050565b600081905092915050565b600061475382613a9e565b61475d818561473d565b935061476d818560208601613aba565b80840191505092915050565b60008190508160005260206000209050919050565b6000815461479b81614182565b6147a5818661473d565b945060018216600081146147c057600181146147d157614804565b60ff19831686528186019350614804565b6147da85614779565b60005b838110156147fc578154818901526001820191506020810190506147dd565b838801955050505b50505092915050565b60006148198286614748565b91506148258285614748565b9150614831828461478e565b9150819050949350505050565b7f43757272656e74207374617465206973206e6f742070726573616c6521000000600082015250565b6000614874601d83613aa9565b915061487f8261483e565b602082019050919050565b600060208201905081810360008301526148a381614867565b9050919050565b7f496e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b60006148e0601183613aa9565b91506148eb826148aa565b602082019050919050565b6000602082019050818103600083015261490f816148d3565b9050919050565b7f4d6178206d696e74732070657220747820647572696e6720707269766174652060008201527f73616c6520657863656564656421000000000000000000000000000000000000602082015250565b6000614972602e83613aa9565b915061497d82614916565b604082019050919050565b600060208201905081810360008301526149a181614965565b9050919050565b7f4d6178204e46547320706572206164647265737320647572696e67207072697660008201527f6174652073616c65206578636565646564200000000000000000000000000000602082015250565b6000614a04603283613aa9565b9150614a0f826149a8565b604082019050919050565b60006020820190508181036000830152614a33816149f7565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614a96602683613aa9565b9150614aa182614a3a565b604082019050919050565b60006020820190508181036000830152614ac581614a89565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614af382614acc565b614afd8185614ad7565b9350614b0d818560208601613aba565b614b1681613aed565b840191505092915050565b6000608082019050614b366000830187613bbc565b614b436020830186613bbc565b614b506040830185613c26565b8181036060830152614b628184614ae8565b905095945050505050565b600081519050614b7c81613984565b92915050565b600060208284031215614b9857614b9761394e565b5b6000614ba684828501614b6d565b91505092915050565b6000614bba82613b59565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614bed57614bec6141b4565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614c3282613b59565b9150614c3d83613b59565b925082614c4d57614c4c614bf8565b5b828204905092915050565b6000614c6382613b59565b9150614c6e83613b59565b925082821015614c8157614c806141b4565b5b828203905092915050565b6000614c9782613b59565b9150614ca283613b59565b925082614cb257614cb1614bf8565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000614d51601883613aa9565b9150614d5c82614d1b565b602082019050919050565b60006020820190508181036000830152614d8081614d44565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000614dbd601f83613aa9565b9150614dc882614d87565b602082019050919050565b60006020820190508181036000830152614dec81614db0565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000614e4f602283613aa9565b9150614e5a82614df3565b604082019050919050565b60006020820190508181036000830152614e7e81614e42565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000614ee1602283613aa9565b9150614eec82614e85565b604082019050919050565b60006020820190508181036000830152614f1081614ed4565b9050919050565b614f2081613fde565b82525050565b600060ff82169050919050565b614f3c81614f26565b82525050565b6000608082019050614f576000830187614f17565b614f646020830186614f33565b614f716040830185614f17565b614f7e6060830184614f17565b9594505050505056fea26469706673582212200bf61ab4c501dfeaf360e798c2019e36585350bab8ba7e1ad97558b9a72a9e3664736f6c634300080b0033

Deployed Bytecode Sourcemap

56996:5337:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38112:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58105:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41227:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42731:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42293:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57144:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61537:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37352:312;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59725:270;;;;;;;;;;;;;:::i;:::-;;43596:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61628:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62186:140;;;;;;;;;;;;;:::i;:::-;;43837:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60954:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61214:160;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57444:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57102:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60751:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57412:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61390:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41035:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57223:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57074:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61739:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38481:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14297:103;;;;;;;;;;;;;:::i;:::-;;61042:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13646:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57274:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41396:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57561:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57370:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59144:509;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43007:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44093:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57325:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60263:476;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58230:906;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57184:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60859:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43365:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57516:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60036:219;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14555:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57479:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38112:305;38214:4;38266:25;38251:40;;;:11;:40;;;;:105;;;;38323:33;38308:48;;;:11;:48;;;;38251:105;:158;;;;38373:36;38397:11;38373:23;:36::i;:::-;38251:158;38231:178;;38112:305;;;:::o;58105:117::-;13877:12;:10;:12::i;:::-;13866:23;;:7;:5;:7::i;:::-;:23;;;13858:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58201:13:::1;58184:14;;:30;;;;;;;;;;;;;;;;;;58105:117:::0;:::o;41227:100::-;41281:13;41314:5;41307:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41227:100;:::o;42731:204::-;42799:7;42824:16;42832:7;42824;:16::i;:::-;42819:64;;42849:34;;;;;;;;;;;;;;42819:64;42903:15;:24;42919:7;42903:24;;;;;;;;;;;;;;;;;;;;;42896:31;;42731:204;;;:::o;42293:372::-;42366:13;42382:24;42398:7;42382:15;:24::i;:::-;42366:40;;42427:5;42421:11;;:2;:11;;;42417:48;;;42441:24;;;;;;;;;;;;;;42417:48;42498:5;42482:21;;:12;:10;:12::i;:::-;:21;;;42478:139;;42509:37;42526:5;42533:12;:10;:12::i;:::-;42509:16;:37::i;:::-;42505:112;;42570:35;;;;;;;;;;;;;;42505:112;42478:139;42629:28;42638:2;42642:7;42651:5;42629:8;:28::i;:::-;42355:310;42293:372;;:::o;57144:33::-;;;;:::o;61537:83::-;13877:12;:10;:12::i;:::-;13866:23;;:7;:5;:7::i;:::-;:23;;;13858:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61606:6:::1;61597;;:15;;;;;;;;;;;;;;;;;;61537:83:::0;:::o;37352:312::-;37405:7;37630:15;:13;:15::i;:::-;37615:12;;37599:13;;:28;:46;37592:53;;37352:312;:::o;59725:270::-;13877:12;:10;:12::i;:::-;13866:23;;:7;:5;:7::i;:::-;:23;;;13858:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59813:9:::1;;59802:7;;59786:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:36;;59778:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;59865:10;;;;;;;;;;;59864:11;59856:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;59927:30;59937:10;59949:7;;59927:9;:30::i;:::-;59983:4;59970:10;;:17;;;;;;;;;;;;;;;;;;59725:270::o:0;43596:170::-;43730:28;43740:4;43746:2;43750:7;43730:9;:28::i;:::-;43596:170;;;:::o;61628:101::-;13877:12;:10;:12::i;:::-;13866:23;;:7;:5;:7::i;:::-;:23;;;13858:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61715:6:::1;61697:15;;:24;;;;;;;;;;;;;;;;;;61628:101:::0;:::o;62186:140::-;13877:12;:10;:12::i;:::-;13866:23;;:7;:5;:7::i;:::-;:23;;;13858:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62234:12:::1;62249:21;62234:36;;62289:10;62281:28;;:37;62310:7;62281:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;62223:103;62186:140::o:0;43837:185::-;43975:39;43992:4;43998:2;44002:7;43975:39;;;;;;;;;;;;:16;:39::i;:::-;43837:185;;;:::o;60954:80::-;13877:12;:10;:12::i;:::-;13866:23;;:7;:5;:7::i;:::-;:23;;;13858:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61021:5:::1;61014:4;:12;;;;60954:80:::0;:::o;61214:160::-;13877:12;:10;:12::i;:::-;13866:23;;:7;:5;:7::i;:::-;:23;;;13858:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61341:25:::1;61314:24;:52;;;;61214:160:::0;:::o;57444:28::-;;;;;;;;;;;;;:::o;57102:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;60751:100::-;13877:12;:10;:12::i;:::-;13866:23;;:7;:5;:7::i;:::-;:23;;;13858:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60834:9:::1;60824:7;:19;;;;;;;;;;;;:::i;:::-;;60751:100:::0;:::o;57412:25::-;;;;;;;;;;;;;:::o;61390:139::-;13877:12;:10;:12::i;:::-;13866:23;;:7;:5;:7::i;:::-;:23;;;13858:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61502:19:::1;61481:18;:40;;;;61390:139:::0;:::o;41035:125::-;41099:7;41126:21;41139:7;41126:12;:21::i;:::-;:26;;;41119:33;;41035:125;;;:::o;57223:44::-;;;;:::o;57074:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;61739:214::-;13877:12;:10;:12::i;:::-;13866:23;;:7;:5;:7::i;:::-;:23;;;13858:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61818:16:::1;;;;;;;;;;;61817:17;61809:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;61899:10;61887:9;:22;;;;61941:4;61922:16;;:23;;;;;;;;;;;;;;;;;;61739:214:::0;:::o;38481:206::-;38545:7;38586:1;38569:19;;:5;:19;;;38565:60;;;38597:28;;;;;;;;;;;;;;38565:60;38651:12;:19;38664:5;38651:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;38643:36;;38636:43;;38481:206;;;:::o;14297:103::-;13877:12;:10;:12::i;:::-;13866:23;;:7;:5;:7::i;:::-;:23;;;13858:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14362:30:::1;14389:1;14362:18;:30::i;:::-;14297:103::o:0;61042:164::-;13877:12;:10;:12::i;:::-;13866:23;;:7;:5;:7::i;:::-;:23;;;13858:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61172:26:::1;61144:25;:54;;;;61042:164:::0;:::o;13646:87::-;13692:7;13719:6;;;;;;;;;;;13712:13;;13646:87;:::o;57274:44::-;;;;:::o;41396:104::-;41452:13;41485:7;41478:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41396:104;:::o;57561:34::-;;;;;;;;;;;;;:::o;57370:27::-;;;;:::o;59144:509::-;59211:11;57870:1;57856:11;:15;:58;;;;;57890:24;;57875:11;:39;;57856:58;57848:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;57989:9;;57974:11;57958:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;57950:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;58043:6;;;;;;;;;;;58042:7;58034:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;59262:5:::1;59243:24;;:15;;;;;;;;;;;:24;;;59235:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;59325:7;:5;:7::i;:::-;59311:21;;:10;:21;;;59307:292;;59377:11;59370:4;;:18;;;;:::i;:::-;59357:9;:31;;59349:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;59427:24;59454:25;59468:10;59454:13;:25::i;:::-;59427:52;;59536:18;;59521:11;59502:16;:30;;;;:::i;:::-;:52;;59494:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;59334:265;59307:292;59611:34;59621:10;59633:11;59611:9;:34::i;:::-;59144:509:::0;;:::o;43007:287::-;43118:12;:10;:12::i;:::-;43106:24;;:8;:24;;;43102:54;;;43139:17;;;;;;;;;;;;;;43102:54;43214:8;43169:18;:32;43188:12;:10;:12::i;:::-;43169:32;;;;;;;;;;;;;;;:42;43202:8;43169:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;43267:8;43238:48;;43253:12;:10;:12::i;:::-;43238:48;;;43277:8;43238:48;;;;;;:::i;:::-;;;;;;;;43007:287;;:::o;44093:370::-;44260:28;44270:4;44276:2;44280:7;44260:9;:28::i;:::-;44303:15;:2;:13;;;:15::i;:::-;44299:157;;;44324:56;44355:4;44361:2;44365:7;44374:5;44324:30;:56::i;:::-;44320:136;;44404:40;;;;;;;;;;;;;;44320:136;44299:157;44093:370;;;;:::o;57325:38::-;;;;:::o;60263:476::-;60382:13;60431:17;60439:8;60431:7;:17::i;:::-;60413:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;60534:28;60565:10;:8;:10::i;:::-;60534:41;;60624:1;60599:14;60593:28;:32;:138;;;;;;;;;;;;;;;;;60665:14;60681:19;:8;:17;:19::i;:::-;60702:9;60648:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60593:138;60586:145;;;60263:476;;;:::o;58230:906::-;58345:11;57870:1;57856:11;:15;:58;;;;;57890:24;;57875:11;:39;;57856:58;57848:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;57989:9;;57974:11;57958:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;57950:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;58043:6;;;;;;;;;;;58042:7;58034:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;58369:12:::1;58405:10;58394:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;58384:33;;;;;;58369:48;;58428:21;58452:46;58466:4;58473:10;58486:11;58452:13;:46::i;:::-;58428:70;;58509:24;58536:25;58550:10;58536:13;:25::i;:::-;58509:52;;58609:4;58590:23;;:15;;;;;;;;;;;:23;;;58582:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;58686:11;58679:4;;:18;;;;:::i;:::-;58666:9;:31;;58658:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;58758:13;58740:31;;:14;;;;;;;;;;;:31;;;58732:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;58826:1;58812:11;:15;:59;;;;;58846:25;;58831:11;:40;;58812:59;58804:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;58975:25;;58960:11;58941:16;:30;;;;:::i;:::-;:59;;58933:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;59094:34;59104:10;59116:11;59094:9;:34::i;:::-;58358:778;;;58230:906:::0;;;;:::o;57184:30::-;;;;:::o;60859:87::-;13877:12;:10;:12::i;:::-;13866:23;;:7;:5;:7::i;:::-;:23;;;13858:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60932:6:::1;60921:8;;:17;;;;;;;;;;;;;;;;;;60859:87:::0;:::o;43365:164::-;43462:4;43486:18;:25;43505:5;43486:25;;;;;;;;;;;;;;;:35;43512:8;43486:35;;;;;;;;;;;;;;;;;;;;;;;;;43479:42;;43365:164;;;;:::o;57516:36::-;;;;;;;;;;;;;:::o;60036:219::-;13877:12;:10;:12::i;:::-;13866:23;;:7;:5;:7::i;:::-;:23;;;13858:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60169:9:::1;;60154:11;60138:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;60130:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;60214:33;60224:9;60235:11;60214:9;:33::i;:::-;60036:219:::0;;:::o;14555:201::-;13877:12;:10;:12::i;:::-;13866:23;;:7;:5;:7::i;:::-;:23;;;13858:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14664:1:::1;14644:22;;:8;:22;;;;14636:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;14720:28;14739:8;14720:18;:28::i;:::-;14555:201:::0;:::o;57479:30::-;;;;;;;;;;;;;:::o;26453:157::-;26538:4;26577:25;26562:40;;;:11;:40;;;;26555:47;;26453:157;;;:::o;12370:98::-;12423:7;12450:10;12443:17;;12370:98;:::o;44718:174::-;44775:4;44818:7;44799:15;:13;:15::i;:::-;:26;;:53;;;;;44839:13;;44829:7;:23;44799:53;:85;;;;;44857:11;:20;44869:7;44857:20;;;;;;;;;;;:27;;;;;;;;;;;;44856:28;44799:85;44792:92;;44718:174;;;:::o;53940:196::-;54082:2;54055:15;:24;54071:7;54055:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;54120:7;54116:2;54100:28;;54109:5;54100:28;;;;;;;;;;;;53940:196;;;:::o;62077:101::-;62142:7;62169:1;62162:8;;62077:101;:::o;44976:104::-;45045:27;45055:2;45059:8;45045:27;;;;;;;;;;;;:9;:27::i;:::-;44976:104;;:::o;48888:2130::-;49003:35;49041:21;49054:7;49041:12;:21::i;:::-;49003:59;;49101:4;49079:26;;:13;:18;;;:26;;;49075:67;;49114:28;;;;;;;;;;;;;;49075:67;49155:22;49197:4;49181:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;49218:36;49235:4;49241:12;:10;:12::i;:::-;49218:16;:36::i;:::-;49181:73;:126;;;;49295:12;:10;:12::i;:::-;49271:36;;:20;49283:7;49271:11;:20::i;:::-;:36;;;49181:126;49155:153;;49326:17;49321:66;;49352:35;;;;;;;;;;;;;;49321:66;49416:1;49402:16;;:2;:16;;;49398:52;;;49427:23;;;;;;;;;;;;;;49398:52;49463:43;49485:4;49491:2;49495:7;49504:1;49463:21;:43::i;:::-;49571:35;49588:1;49592:7;49601:4;49571:8;:35::i;:::-;49932:1;49902:12;:18;49915:4;49902:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49976:1;49948:12;:16;49961:2;49948:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49994:31;50028:11;:20;50040:7;50028:20;;;;;;;;;;;49994:54;;50079:2;50063:8;:13;;;:18;;;;;;;;;;;;;;;;;;50129:15;50096:8;:23;;;:49;;;;;;;;;;;;;;;;;;50397:19;50429:1;50419:7;:11;50397:33;;50445:31;50479:11;:24;50491:11;50479:24;;;;;;;;;;;50445:58;;50547:1;50522:27;;:8;:13;;;;;;;;;;;;:27;;;50518:384;;;50732:13;;50717:11;:28;50713:174;;50786:4;50770:8;:13;;;:20;;;;;;;;;;;;;;;;;;50839:13;:28;;;50813:8;:23;;;:54;;;;;;;;;;;;;;;;;;50713:174;50518:384;49877:1036;;;50949:7;50945:2;50930:27;;50939:4;50930:27;;;;;;;;;;;;50968:42;50989:4;50995:2;50999:7;51008:1;50968:20;:42::i;:::-;48992:2026;;48888:2130;;;:::o;39862:1111::-;39924:21;;:::i;:::-;39958:12;39973:7;39958:22;;40041:4;40022:15;:13;:15::i;:::-;:23;40018:888;;40058:13;;40051:4;:20;40047:859;;;40092:31;40126:11;:17;40138:4;40126:17;;;;;;;;;;;40092:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40167:9;:16;;;40162:729;;40238:1;40212:28;;:9;:14;;;:28;;;40208:101;;40276:9;40269:16;;;;;;40208:101;40611:261;40618:4;40611:261;;;40651:6;;;;;;;;40696:11;:17;40708:4;40696:17;;;;;;;;;;;40684:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40770:1;40744:28;;:9;:14;;;:28;;;40740:109;;40812:9;40805:16;;;;;;40740:109;40611:261;;;40162:729;40073:833;40047:859;40018:888;40934:31;;;;;;;;;;;;;;39862:1111;;;;:::o;14916:191::-;14990:16;15009:6;;;;;;;;;;;14990:25;;15035:8;15026:6;;:17;;;;;;;;;;;;;;;;;;15090:8;15059:40;;15080:8;15059:40;;;;;;;;;;;;14979:128;14916:191;:::o;38769:137::-;38830:7;38865:12;:19;38878:5;38865:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;38857:41;;38850:48;;38769:137;;;:::o;16347:326::-;16407:4;16664:1;16642:7;:19;;;:23;16635:30;;16347:326;;;:::o;54628:667::-;54791:4;54828:2;54812:36;;;54849:12;:10;:12::i;:::-;54863:4;54869:7;54878:5;54812:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;54808:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55063:1;55046:6;:13;:18;55042:235;;;55092:40;;;;;;;;;;;;;;55042:235;55235:6;55229:13;55220:6;55216:2;55212:15;55205:38;54808:480;54941:45;;;54931:55;;;:6;:55;;;;54924:62;;;54628:667;;;;;;:::o;61961:108::-;62021:13;62054:7;62047:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61961:108;:::o;398:723::-;454:13;684:1;675:5;:10;671:53;;;702:10;;;;;;;;;;;;;;;;;;;;;671:53;734:12;749:5;734:20;;765:14;790:78;805:1;797:4;:9;790:78;;823:8;;;;;:::i;:::-;;;;854:2;846:10;;;;;:::i;:::-;;;790:78;;;878:19;910:6;900:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;878:39;;928:154;944:1;935:5;:10;928:154;;972:1;962:11;;;;;:::i;:::-;;;1039:2;1031:5;:10;;;;:::i;:::-;1018:2;:24;;;;:::i;:::-;1005:39;;988:6;995;988:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1068:2;1059:11;;;;;:::i;:::-;;;928:154;;;1106:6;1092:21;;;;;398:723;;;;:::o;7584:260::-;7695:7;7716:17;7735:18;7757:23;7768:4;7774:1;7777:2;7757:10;:23::i;:::-;7715:65;;;;7791:18;7803:5;7791:11;:18::i;:::-;7827:9;7820:16;;;;7584:260;;;;;:::o;45453:1749::-;45576:20;45599:13;;45576:36;;45641:1;45627:16;;:2;:16;;;45623:48;;;45652:19;;;;;;;;;;;;;;45623:48;45698:1;45686:8;:13;45682:44;;;45708:18;;;;;;;;;;;;;;45682:44;45739:61;45769:1;45773:2;45777:12;45791:8;45739:21;:61::i;:::-;46112:8;46077:12;:16;46090:2;46077:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46176:8;46136:12;:16;46149:2;46136:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46235:2;46202:11;:25;46214:12;46202:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;46302:15;46252:11;:25;46264:12;46252:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;46335:20;46358:12;46335:35;;46385:11;46414:8;46399:12;:23;46385:37;;46443:15;:2;:13;;;:15::i;:::-;46439:631;;;46479:313;46535:12;46531:2;46510:38;;46527:1;46510:38;;;;;;;;;;;;46576:69;46615:1;46619:2;46623:14;;;;;;46639:5;46576:30;:69::i;:::-;46571:174;;46681:40;;;;;;;;;;;;;;46571:174;46787:3;46772:12;:18;46479:313;;46873:12;46856:13;;:29;46852:43;;46887:8;;;46852:43;46439:631;;;46936:119;46992:14;;;;;;46988:2;46967:40;;46984:1;46967:40;;;;;;;;;;;;47050:3;47035:12;:18;46936:119;;46439:631;47100:12;47084:13;:28;;;;46052:1072;;47134:60;47163:1;47167:2;47171:12;47185:8;47134:20;:60::i;:::-;45565:1637;45453:1749;;;:::o;55943:159::-;;;;;:::o;56761:158::-;;;;;:::o;7068:344::-;7182:7;7191:12;7216:9;7241:66;7233:75;;7228:2;:80;7216:92;;7319:7;7358:2;7351:3;7344:2;7336:11;;:18;;7335:25;;;;:::i;:::-;7319:42;;7379:25;7390:4;7396:1;7399;7402;7379:10;:25::i;:::-;7372:32;;;;;;7068:344;;;;;;:::o;2735:643::-;2813:20;2804:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;2800:571;;;2850:7;;2800:571;2911:29;2902:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;2898:473;;;2957:34;;;;;;;;;;:::i;:::-;;;;;;;;2898:473;3022:35;3013:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;3009:362;;;3074:41;;;;;;;;;;:::i;:::-;;;;;;;;3009:362;3146:30;3137:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;3133:238;;;3193:44;;;;;;;;;;:::i;:::-;;;;;;;;3133:238;3268:30;3259:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;3255:116;;;3315:44;;;;;;;;;;:::i;:::-;;;;;;;;3255:116;2735:643;;:::o;8026:1632::-;8157:7;8166:12;9091:66;9086:1;9078:10;;:79;9074:163;;;9190:1;9194:30;9174:51;;;;;;9074:163;9256:2;9251:1;:7;;;;:18;;;;;9267:2;9262:1;:7;;;;9251:18;9247:102;;;9302:1;9306:30;9286:51;;;;;;9247:102;9446:14;9463:24;9473:4;9479:1;9482;9485;9463:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9446:41;;9520:1;9502:20;;:6;:20;;;9498:103;;;9555:1;9559:29;9539:50;;;;;;;9498:103;9621:6;9629:20;9613:37;;;;;8026:1632;;;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:126::-;1555:7;1595:42;1588:5;1584:54;1573:65;;1518:126;;;:::o;1650:96::-;1687:7;1716:24;1734:5;1716:24;:::i;:::-;1705:35;;1650:96;;;:::o;1752:122::-;1825:24;1843:5;1825:24;:::i;:::-;1818:5;1815:35;1805:63;;1864:1;1861;1854:12;1805:63;1752:122;:::o;1880:139::-;1926:5;1964:6;1951:20;1942:29;;1980:33;2007:5;1980:33;:::i;:::-;1880:139;;;;:::o;2025:329::-;2084:6;2133:2;2121:9;2112:7;2108:23;2104:32;2101:119;;;2139:79;;:::i;:::-;2101:119;2259:1;2284:53;2329:7;2320:6;2309:9;2305:22;2284:53;:::i;:::-;2274:63;;2230:117;2025:329;;;;:::o;2360:99::-;2412:6;2446:5;2440:12;2430:22;;2360:99;;;:::o;2465:169::-;2549:11;2583:6;2578:3;2571:19;2623:4;2618:3;2614:14;2599:29;;2465:169;;;;:::o;2640:307::-;2708:1;2718:113;2732:6;2729:1;2726:13;2718:113;;;2817:1;2812:3;2808:11;2802:18;2798:1;2793:3;2789:11;2782:39;2754:2;2751:1;2747:10;2742:15;;2718:113;;;2849:6;2846:1;2843:13;2840:101;;;2929:1;2920:6;2915:3;2911:16;2904:27;2840:101;2689:258;2640:307;;;:::o;2953:102::-;2994:6;3045:2;3041:7;3036:2;3029:5;3025:14;3021:28;3011:38;;2953:102;;;:::o;3061:364::-;3149:3;3177:39;3210:5;3177:39;:::i;:::-;3232:71;3296:6;3291:3;3232:71;:::i;:::-;3225:78;;3312:52;3357:6;3352:3;3345:4;3338:5;3334:16;3312:52;:::i;:::-;3389:29;3411:6;3389:29;:::i;:::-;3384:3;3380:39;3373:46;;3153:272;3061:364;;;;:::o;3431:313::-;3544:4;3582:2;3571:9;3567:18;3559:26;;3631:9;3625:4;3621:20;3617:1;3606:9;3602:17;3595:47;3659:78;3732:4;3723:6;3659:78;:::i;:::-;3651:86;;3431:313;;;;:::o;3750:77::-;3787:7;3816:5;3805:16;;3750:77;;;:::o;3833:122::-;3906:24;3924:5;3906:24;:::i;:::-;3899:5;3896:35;3886:63;;3945:1;3942;3935:12;3886:63;3833:122;:::o;3961:139::-;4007:5;4045:6;4032:20;4023:29;;4061:33;4088:5;4061:33;:::i;:::-;3961:139;;;;:::o;4106:329::-;4165:6;4214:2;4202:9;4193:7;4189:23;4185:32;4182:119;;;4220:79;;:::i;:::-;4182:119;4340:1;4365:53;4410:7;4401:6;4390:9;4386:22;4365:53;:::i;:::-;4355:63;;4311:117;4106:329;;;;:::o;4441:118::-;4528:24;4546:5;4528:24;:::i;:::-;4523:3;4516:37;4441:118;;:::o;4565:222::-;4658:4;4696:2;4685:9;4681:18;4673:26;;4709:71;4777:1;4766:9;4762:17;4753:6;4709:71;:::i;:::-;4565:222;;;;:::o;4793:474::-;4861:6;4869;4918:2;4906:9;4897:7;4893:23;4889:32;4886:119;;;4924:79;;:::i;:::-;4886:119;5044:1;5069:53;5114:7;5105:6;5094:9;5090:22;5069:53;:::i;:::-;5059:63;;5015:117;5171:2;5197:53;5242:7;5233:6;5222:9;5218:22;5197:53;:::i;:::-;5187:63;;5142:118;4793:474;;;;;:::o;5273:118::-;5360:24;5378:5;5360:24;:::i;:::-;5355:3;5348:37;5273:118;;:::o;5397:222::-;5490:4;5528:2;5517:9;5513:18;5505:26;;5541:71;5609:1;5598:9;5594:17;5585:6;5541:71;:::i;:::-;5397:222;;;;:::o;5625:116::-;5695:21;5710:5;5695:21;:::i;:::-;5688:5;5685:32;5675:60;;5731:1;5728;5721:12;5675:60;5625:116;:::o;5747:133::-;5790:5;5828:6;5815:20;5806:29;;5844:30;5868:5;5844:30;:::i;:::-;5747:133;;;;:::o;5886:323::-;5942:6;5991:2;5979:9;5970:7;5966:23;5962:32;5959:119;;;5997:79;;:::i;:::-;5959:119;6117:1;6142:50;6184:7;6175:6;6164:9;6160:22;6142:50;:::i;:::-;6132:60;;6088:114;5886:323;;;;:::o;6215:619::-;6292:6;6300;6308;6357:2;6345:9;6336:7;6332:23;6328:32;6325:119;;;6363:79;;:::i;:::-;6325:119;6483:1;6508:53;6553:7;6544:6;6533:9;6529:22;6508:53;:::i;:::-;6498:63;;6454:117;6610:2;6636:53;6681:7;6672:6;6661:9;6657:22;6636:53;:::i;:::-;6626:63;;6581:118;6738:2;6764:53;6809:7;6800:6;6789:9;6785:22;6764:53;:::i;:::-;6754:63;;6709:118;6215:619;;;;;:::o;6840:117::-;6949:1;6946;6939:12;6963:117;7072:1;7069;7062:12;7086:180;7134:77;7131:1;7124:88;7231:4;7228:1;7221:15;7255:4;7252:1;7245:15;7272:281;7355:27;7377:4;7355:27;:::i;:::-;7347:6;7343:40;7485:6;7473:10;7470:22;7449:18;7437:10;7434:34;7431:62;7428:88;;;7496:18;;:::i;:::-;7428:88;7536:10;7532:2;7525:22;7315:238;7272:281;;:::o;7559:129::-;7593:6;7620:20;;:::i;:::-;7610:30;;7649:33;7677:4;7669:6;7649:33;:::i;:::-;7559:129;;;:::o;7694:308::-;7756:4;7846:18;7838:6;7835:30;7832:56;;;7868:18;;:::i;:::-;7832:56;7906:29;7928:6;7906:29;:::i;:::-;7898:37;;7990:4;7984;7980:15;7972:23;;7694:308;;;:::o;8008:154::-;8092:6;8087:3;8082;8069:30;8154:1;8145:6;8140:3;8136:16;8129:27;8008:154;;;:::o;8168:412::-;8246:5;8271:66;8287:49;8329:6;8287:49;:::i;:::-;8271:66;:::i;:::-;8262:75;;8360:6;8353:5;8346:21;8398:4;8391:5;8387:16;8436:3;8427:6;8422:3;8418:16;8415:25;8412:112;;;8443:79;;:::i;:::-;8412:112;8533:41;8567:6;8562:3;8557;8533:41;:::i;:::-;8252:328;8168:412;;;;;:::o;8600:340::-;8656:5;8705:3;8698:4;8690:6;8686:17;8682:27;8672:122;;8713:79;;:::i;:::-;8672:122;8830:6;8817:20;8855:79;8930:3;8922:6;8915:4;8907:6;8903:17;8855:79;:::i;:::-;8846:88;;8662:278;8600:340;;;;:::o;8946:509::-;9015:6;9064:2;9052:9;9043:7;9039:23;9035:32;9032:119;;;9070:79;;:::i;:::-;9032:119;9218:1;9207:9;9203:17;9190:31;9248:18;9240:6;9237:30;9234:117;;;9270:79;;:::i;:::-;9234:117;9375:63;9430:7;9421:6;9410:9;9406:22;9375:63;:::i;:::-;9365:73;;9161:287;8946:509;;;;:::o;9461:468::-;9526:6;9534;9583:2;9571:9;9562:7;9558:23;9554:32;9551:119;;;9589:79;;:::i;:::-;9551:119;9709:1;9734:53;9779:7;9770:6;9759:9;9755:22;9734:53;:::i;:::-;9724:63;;9680:117;9836:2;9862:50;9904:7;9895:6;9884:9;9880:22;9862:50;:::i;:::-;9852:60;;9807:115;9461:468;;;;;:::o;9935:307::-;9996:4;10086:18;10078:6;10075:30;10072:56;;;10108:18;;:::i;:::-;10072:56;10146:29;10168:6;10146:29;:::i;:::-;10138:37;;10230:4;10224;10220:15;10212:23;;9935:307;;;:::o;10248:410::-;10325:5;10350:65;10366:48;10407:6;10366:48;:::i;:::-;10350:65;:::i;:::-;10341:74;;10438:6;10431:5;10424:21;10476:4;10469:5;10465:16;10514:3;10505:6;10500:3;10496:16;10493:25;10490:112;;;10521:79;;:::i;:::-;10490:112;10611:41;10645:6;10640:3;10635;10611:41;:::i;:::-;10331:327;10248:410;;;;;:::o;10677:338::-;10732:5;10781:3;10774:4;10766:6;10762:17;10758:27;10748:122;;10789:79;;:::i;:::-;10748:122;10906:6;10893:20;10931:78;11005:3;10997:6;10990:4;10982:6;10978:17;10931:78;:::i;:::-;10922:87;;10738:277;10677:338;;;;:::o;11021:943::-;11116:6;11124;11132;11140;11189:3;11177:9;11168:7;11164:23;11160:33;11157:120;;;11196:79;;:::i;:::-;11157:120;11316:1;11341:53;11386:7;11377:6;11366:9;11362:22;11341:53;:::i;:::-;11331:63;;11287:117;11443:2;11469:53;11514:7;11505:6;11494:9;11490:22;11469:53;:::i;:::-;11459:63;;11414:118;11571:2;11597:53;11642:7;11633:6;11622:9;11618:22;11597:53;:::i;:::-;11587:63;;11542:118;11727:2;11716:9;11712:18;11699:32;11758:18;11750:6;11747:30;11744:117;;;11780:79;;:::i;:::-;11744:117;11885:62;11939:7;11930:6;11919:9;11915:22;11885:62;:::i;:::-;11875:72;;11670:287;11021:943;;;;;;;:::o;11970:77::-;12007:7;12036:5;12025:16;;11970:77;;;:::o;12053:122::-;12126:24;12144:5;12126:24;:::i;:::-;12119:5;12116:35;12106:63;;12165:1;12162;12155:12;12106:63;12053:122;:::o;12181:139::-;12227:5;12265:6;12252:20;12243:29;;12281:33;12308:5;12281:33;:::i;:::-;12181:139;;;;:::o;12326:619::-;12403:6;12411;12419;12468:2;12456:9;12447:7;12443:23;12439:32;12436:119;;;12474:79;;:::i;:::-;12436:119;12594:1;12619:53;12664:7;12655:6;12644:9;12640:22;12619:53;:::i;:::-;12609:63;;12565:117;12721:2;12747:53;12792:7;12783:6;12772:9;12768:22;12747:53;:::i;:::-;12737:63;;12692:118;12849:2;12875:53;12920:7;12911:6;12900:9;12896:22;12875:53;:::i;:::-;12865:63;;12820:118;12326:619;;;;;:::o;12951:474::-;13019:6;13027;13076:2;13064:9;13055:7;13051:23;13047:32;13044:119;;;13082:79;;:::i;:::-;13044:119;13202:1;13227:53;13272:7;13263:6;13252:9;13248:22;13227:53;:::i;:::-;13217:63;;13173:117;13329:2;13355:53;13400:7;13391:6;13380:9;13376:22;13355:53;:::i;:::-;13345:63;;13300:118;12951:474;;;;;:::o;13431:::-;13499:6;13507;13556:2;13544:9;13535:7;13531:23;13527:32;13524:119;;;13562:79;;:::i;:::-;13524:119;13682:1;13707:53;13752:7;13743:6;13732:9;13728:22;13707:53;:::i;:::-;13697:63;;13653:117;13809:2;13835:53;13880:7;13871:6;13860:9;13856:22;13835:53;:::i;:::-;13825:63;;13780:118;13431:474;;;;;:::o;13911:182::-;14051:34;14047:1;14039:6;14035:14;14028:58;13911:182;:::o;14099:366::-;14241:3;14262:67;14326:2;14321:3;14262:67;:::i;:::-;14255:74;;14338:93;14427:3;14338:93;:::i;:::-;14456:2;14451:3;14447:12;14440:19;;14099:366;;;:::o;14471:419::-;14637:4;14675:2;14664:9;14660:18;14652:26;;14724:9;14718:4;14714:20;14710:1;14699:9;14695:17;14688:47;14752:131;14878:4;14752:131;:::i;:::-;14744:139;;14471:419;;;:::o;14896:180::-;14944:77;14941:1;14934:88;15041:4;15038:1;15031:15;15065:4;15062:1;15055:15;15082:320;15126:6;15163:1;15157:4;15153:12;15143:22;;15210:1;15204:4;15200:12;15231:18;15221:81;;15287:4;15279:6;15275:17;15265:27;;15221:81;15349:2;15341:6;15338:14;15318:18;15315:38;15312:84;;;15368:18;;:::i;:::-;15312:84;15133:269;15082:320;;;:::o;15408:180::-;15456:77;15453:1;15446:88;15553:4;15550:1;15543:15;15577:4;15574:1;15567:15;15594:305;15634:3;15653:20;15671:1;15653:20;:::i;:::-;15648:25;;15687:20;15705:1;15687:20;:::i;:::-;15682:25;;15841:1;15773:66;15769:74;15766:1;15763:81;15760:107;;;15847:18;;:::i;:::-;15760:107;15891:1;15888;15884:9;15877:16;;15594:305;;;;:::o;15905:168::-;16045:20;16041:1;16033:6;16029:14;16022:44;15905:168;:::o;16079:366::-;16221:3;16242:67;16306:2;16301:3;16242:67;:::i;:::-;16235:74;;16318:93;16407:3;16318:93;:::i;:::-;16436:2;16431:3;16427:12;16420:19;;16079:366;;;:::o;16451:419::-;16617:4;16655:2;16644:9;16640:18;16632:26;;16704:9;16698:4;16694:20;16690:1;16679:9;16675:17;16668:47;16732:131;16858:4;16732:131;:::i;:::-;16724:139;;16451:419;;;:::o;16876:221::-;17016:34;17012:1;17004:6;17000:14;16993:58;17085:4;17080:2;17072:6;17068:15;17061:29;16876:221;:::o;17103:366::-;17245:3;17266:67;17330:2;17325:3;17266:67;:::i;:::-;17259:74;;17342:93;17431:3;17342:93;:::i;:::-;17460:2;17455:3;17451:12;17444:19;;17103:366;;;:::o;17475:419::-;17641:4;17679:2;17668:9;17664:18;17656:26;;17728:9;17722:4;17718:20;17714:1;17703:9;17699:17;17692:47;17756:131;17882:4;17756:131;:::i;:::-;17748:139;;17475:419;;;:::o;17900:224::-;18040:34;18036:1;18028:6;18024:14;18017:58;18109:7;18104:2;18096:6;18092:15;18085:32;17900:224;:::o;18130:366::-;18272:3;18293:67;18357:2;18352:3;18293:67;:::i;:::-;18286:74;;18369:93;18458:3;18369:93;:::i;:::-;18487:2;18482:3;18478:12;18471:19;;18130:366;;;:::o;18502:419::-;18668:4;18706:2;18695:9;18691:18;18683:26;;18755:9;18749:4;18745:20;18741:1;18730:9;18726:17;18719:47;18783:131;18909:4;18783:131;:::i;:::-;18775:139;;18502:419;;;:::o;18927:170::-;19067:22;19063:1;19055:6;19051:14;19044:46;18927:170;:::o;19103:366::-;19245:3;19266:67;19330:2;19325:3;19266:67;:::i;:::-;19259:74;;19342:93;19431:3;19342:93;:::i;:::-;19460:2;19455:3;19451:12;19444:19;;19103:366;;;:::o;19475:419::-;19641:4;19679:2;19668:9;19664:18;19656:26;;19728:9;19722:4;19718:20;19714:1;19703:9;19699:17;19692:47;19756:131;19882:4;19756:131;:::i;:::-;19748:139;;19475:419;;;:::o;19900:170::-;20040:22;20036:1;20028:6;20024:14;20017:46;19900:170;:::o;20076:366::-;20218:3;20239:67;20303:2;20298:3;20239:67;:::i;:::-;20232:74;;20315:93;20404:3;20315:93;:::i;:::-;20433:2;20428:3;20424:12;20417:19;;20076:366;;;:::o;20448:419::-;20614:4;20652:2;20641:9;20637:18;20629:26;;20701:9;20695:4;20691:20;20687:1;20676:9;20672:17;20665:47;20729:131;20855:4;20729:131;:::i;:::-;20721:139;;20448:419;;;:::o;20873:173::-;21013:25;21009:1;21001:6;20997:14;20990:49;20873:173;:::o;21052:366::-;21194:3;21215:67;21279:2;21274:3;21215:67;:::i;:::-;21208:74;;21291:93;21380:3;21291:93;:::i;:::-;21409:2;21404:3;21400:12;21393:19;;21052:366;;;:::o;21424:419::-;21590:4;21628:2;21617:9;21613:18;21605:26;;21677:9;21671:4;21667:20;21663:1;21652:9;21648:17;21641:47;21705:131;21831:4;21705:131;:::i;:::-;21697:139;;21424:419;;;:::o;21849:172::-;21989:24;21985:1;21977:6;21973:14;21966:48;21849:172;:::o;22027:366::-;22169:3;22190:67;22254:2;22249:3;22190:67;:::i;:::-;22183:74;;22266:93;22355:3;22266:93;:::i;:::-;22384:2;22379:3;22375:12;22368:19;;22027:366;;;:::o;22399:419::-;22565:4;22603:2;22592:9;22588:18;22580:26;;22652:9;22646:4;22642:20;22638:1;22627:9;22623:17;22616:47;22680:131;22806:4;22680:131;:::i;:::-;22672:139;;22399:419;;;:::o;22824:348::-;22864:7;22887:20;22905:1;22887:20;:::i;:::-;22882:25;;22921:20;22939:1;22921:20;:::i;:::-;22916:25;;23109:1;23041:66;23037:74;23034:1;23031:81;23026:1;23019:9;23012:17;23008:105;23005:131;;;23116:18;;:::i;:::-;23005:131;23164:1;23161;23157:9;23146:20;;22824:348;;;;:::o;23178:169::-;23318:21;23314:1;23306:6;23302:14;23295:45;23178:169;:::o;23353:366::-;23495:3;23516:67;23580:2;23575:3;23516:67;:::i;:::-;23509:74;;23592:93;23681:3;23592:93;:::i;:::-;23710:2;23705:3;23701:12;23694:19;;23353:366;;;:::o;23725:419::-;23891:4;23929:2;23918:9;23914:18;23906:26;;23978:9;23972:4;23968:20;23964:1;23953:9;23949:17;23942:47;24006:131;24132:4;24006:131;:::i;:::-;23998:139;;23725:419;;;:::o;24150:178::-;24290:30;24286:1;24278:6;24274:14;24267:54;24150:178;:::o;24334:366::-;24476:3;24497:67;24561:2;24556:3;24497:67;:::i;:::-;24490:74;;24573:93;24662:3;24573:93;:::i;:::-;24691:2;24686:3;24682:12;24675:19;;24334:366;;;:::o;24706:419::-;24872:4;24910:2;24899:9;24895:18;24887:26;;24959:9;24953:4;24949:20;24945:1;24934:9;24930:17;24923:47;24987:131;25113:4;24987:131;:::i;:::-;24979:139;;24706:419;;;:::o;25131:234::-;25271:34;25267:1;25259:6;25255:14;25248:58;25340:17;25335:2;25327:6;25323:15;25316:42;25131:234;:::o;25371:366::-;25513:3;25534:67;25598:2;25593:3;25534:67;:::i;:::-;25527:74;;25610:93;25699:3;25610:93;:::i;:::-;25728:2;25723:3;25719:12;25712:19;;25371:366;;;:::o;25743:419::-;25909:4;25947:2;25936:9;25932:18;25924:26;;25996:9;25990:4;25986:20;25982:1;25971:9;25967:17;25960:47;26024:131;26150:4;26024:131;:::i;:::-;26016:139;;25743:419;;;:::o;26168:148::-;26270:11;26307:3;26292:18;;26168:148;;;;:::o;26322:377::-;26428:3;26456:39;26489:5;26456:39;:::i;:::-;26511:89;26593:6;26588:3;26511:89;:::i;:::-;26504:96;;26609:52;26654:6;26649:3;26642:4;26635:5;26631:16;26609:52;:::i;:::-;26686:6;26681:3;26677:16;26670:23;;26432:267;26322:377;;;;:::o;26705:141::-;26754:4;26777:3;26769:11;;26800:3;26797:1;26790:14;26834:4;26831:1;26821:18;26813:26;;26705:141;;;:::o;26876:845::-;26979:3;27016:5;27010:12;27045:36;27071:9;27045:36;:::i;:::-;27097:89;27179:6;27174:3;27097:89;:::i;:::-;27090:96;;27217:1;27206:9;27202:17;27233:1;27228:137;;;;27379:1;27374:341;;;;27195:520;;27228:137;27312:4;27308:9;27297;27293:25;27288:3;27281:38;27348:6;27343:3;27339:16;27332:23;;27228:137;;27374:341;27441:38;27473:5;27441:38;:::i;:::-;27501:1;27515:154;27529:6;27526:1;27523:13;27515:154;;;27603:7;27597:14;27593:1;27588:3;27584:11;27577:35;27653:1;27644:7;27640:15;27629:26;;27551:4;27548:1;27544:12;27539:17;;27515:154;;;27698:6;27693:3;27689:16;27682:23;;27381:334;;27195:520;;26983:738;;26876:845;;;;:::o;27727:589::-;27952:3;27974:95;28065:3;28056:6;27974:95;:::i;:::-;27967:102;;28086:95;28177:3;28168:6;28086:95;:::i;:::-;28079:102;;28198:92;28286:3;28277:6;28198:92;:::i;:::-;28191:99;;28307:3;28300:10;;27727:589;;;;;;:::o;28322:179::-;28462:31;28458:1;28450:6;28446:14;28439:55;28322:179;:::o;28507:366::-;28649:3;28670:67;28734:2;28729:3;28670:67;:::i;:::-;28663:74;;28746:93;28835:3;28746:93;:::i;:::-;28864:2;28859:3;28855:12;28848:19;;28507:366;;;:::o;28879:419::-;29045:4;29083:2;29072:9;29068:18;29060:26;;29132:9;29126:4;29122:20;29118:1;29107:9;29103:17;29096:47;29160:131;29286:4;29160:131;:::i;:::-;29152:139;;28879:419;;;:::o;29304:167::-;29444:19;29440:1;29432:6;29428:14;29421:43;29304:167;:::o;29477:366::-;29619:3;29640:67;29704:2;29699:3;29640:67;:::i;:::-;29633:74;;29716:93;29805:3;29716:93;:::i;:::-;29834:2;29829:3;29825:12;29818:19;;29477:366;;;:::o;29849:419::-;30015:4;30053:2;30042:9;30038:18;30030:26;;30102:9;30096:4;30092:20;30088:1;30077:9;30073:17;30066:47;30130:131;30256:4;30130:131;:::i;:::-;30122:139;;29849:419;;;:::o;30274:233::-;30414:34;30410:1;30402:6;30398:14;30391:58;30483:16;30478:2;30470:6;30466:15;30459:41;30274:233;:::o;30513:366::-;30655:3;30676:67;30740:2;30735:3;30676:67;:::i;:::-;30669:74;;30752:93;30841:3;30752:93;:::i;:::-;30870:2;30865:3;30861:12;30854:19;;30513:366;;;:::o;30885:419::-;31051:4;31089:2;31078:9;31074:18;31066:26;;31138:9;31132:4;31128:20;31124:1;31113:9;31109:17;31102:47;31166:131;31292:4;31166:131;:::i;:::-;31158:139;;30885:419;;;:::o;31310:237::-;31450:34;31446:1;31438:6;31434:14;31427:58;31519:20;31514:2;31506:6;31502:15;31495:45;31310:237;:::o;31553:366::-;31695:3;31716:67;31780:2;31775:3;31716:67;:::i;:::-;31709:74;;31792:93;31881:3;31792:93;:::i;:::-;31910:2;31905:3;31901:12;31894:19;;31553:366;;;:::o;31925:419::-;32091:4;32129:2;32118:9;32114:18;32106:26;;32178:9;32172:4;32168:20;32164:1;32153:9;32149:17;32142:47;32206:131;32332:4;32206:131;:::i;:::-;32198:139;;31925:419;;;:::o;32350:225::-;32490:34;32486:1;32478:6;32474:14;32467:58;32559:8;32554:2;32546:6;32542:15;32535:33;32350:225;:::o;32581:366::-;32723:3;32744:67;32808:2;32803:3;32744:67;:::i;:::-;32737:74;;32820:93;32909:3;32820:93;:::i;:::-;32938:2;32933:3;32929:12;32922:19;;32581:366;;;:::o;32953:419::-;33119:4;33157:2;33146:9;33142:18;33134:26;;33206:9;33200:4;33196:20;33192:1;33181:9;33177:17;33170:47;33234:131;33360:4;33234:131;:::i;:::-;33226:139;;32953:419;;;:::o;33378:98::-;33429:6;33463:5;33457:12;33447:22;;33378:98;;;:::o;33482:168::-;33565:11;33599:6;33594:3;33587:19;33639:4;33634:3;33630:14;33615:29;;33482:168;;;;:::o;33656:360::-;33742:3;33770:38;33802:5;33770:38;:::i;:::-;33824:70;33887:6;33882:3;33824:70;:::i;:::-;33817:77;;33903:52;33948:6;33943:3;33936:4;33929:5;33925:16;33903:52;:::i;:::-;33980:29;34002:6;33980:29;:::i;:::-;33975:3;33971:39;33964:46;;33746:270;33656:360;;;;:::o;34022:640::-;34217:4;34255:3;34244:9;34240:19;34232:27;;34269:71;34337:1;34326:9;34322:17;34313:6;34269:71;:::i;:::-;34350:72;34418:2;34407:9;34403:18;34394:6;34350:72;:::i;:::-;34432;34500:2;34489:9;34485:18;34476:6;34432:72;:::i;:::-;34551:9;34545:4;34541:20;34536:2;34525:9;34521:18;34514:48;34579:76;34650:4;34641:6;34579:76;:::i;:::-;34571:84;;34022:640;;;;;;;:::o;34668:141::-;34724:5;34755:6;34749:13;34740:22;;34771:32;34797:5;34771:32;:::i;:::-;34668:141;;;;:::o;34815:349::-;34884:6;34933:2;34921:9;34912:7;34908:23;34904:32;34901:119;;;34939:79;;:::i;:::-;34901:119;35059:1;35084:63;35139:7;35130:6;35119:9;35115:22;35084:63;:::i;:::-;35074:73;;35030:127;34815:349;;;;:::o;35170:233::-;35209:3;35232:24;35250:5;35232:24;:::i;:::-;35223:33;;35278:66;35271:5;35268:77;35265:103;;;35348:18;;:::i;:::-;35265:103;35395:1;35388:5;35384:13;35377:20;;35170:233;;;:::o;35409:180::-;35457:77;35454:1;35447:88;35554:4;35551:1;35544:15;35578:4;35575:1;35568:15;35595:185;35635:1;35652:20;35670:1;35652:20;:::i;:::-;35647:25;;35686:20;35704:1;35686:20;:::i;:::-;35681:25;;35725:1;35715:35;;35730:18;;:::i;:::-;35715:35;35772:1;35769;35765:9;35760:14;;35595:185;;;;:::o;35786:191::-;35826:4;35846:20;35864:1;35846:20;:::i;:::-;35841:25;;35880:20;35898:1;35880:20;:::i;:::-;35875:25;;35919:1;35916;35913:8;35910:34;;;35924:18;;:::i;:::-;35910:34;35969:1;35966;35962:9;35954:17;;35786:191;;;;:::o;35983:176::-;36015:1;36032:20;36050:1;36032:20;:::i;:::-;36027:25;;36066:20;36084:1;36066:20;:::i;:::-;36061:25;;36105:1;36095:35;;36110:18;;:::i;:::-;36095:35;36151:1;36148;36144:9;36139:14;;35983:176;;;;:::o;36165:180::-;36213:77;36210:1;36203:88;36310:4;36307:1;36300:15;36334:4;36331:1;36324:15;36351:180;36399:77;36396:1;36389:88;36496:4;36493:1;36486:15;36520:4;36517:1;36510:15;36537:174;36677:26;36673:1;36665:6;36661:14;36654:50;36537:174;:::o;36717:366::-;36859:3;36880:67;36944:2;36939:3;36880:67;:::i;:::-;36873:74;;36956:93;37045:3;36956:93;:::i;:::-;37074:2;37069:3;37065:12;37058:19;;36717:366;;;:::o;37089:419::-;37255:4;37293:2;37282:9;37278:18;37270:26;;37342:9;37336:4;37332:20;37328:1;37317:9;37313:17;37306:47;37370:131;37496:4;37370:131;:::i;:::-;37362:139;;37089:419;;;:::o;37514:181::-;37654:33;37650:1;37642:6;37638:14;37631:57;37514:181;:::o;37701:366::-;37843:3;37864:67;37928:2;37923:3;37864:67;:::i;:::-;37857:74;;37940:93;38029:3;37940:93;:::i;:::-;38058:2;38053:3;38049:12;38042:19;;37701:366;;;:::o;38073:419::-;38239:4;38277:2;38266:9;38262:18;38254:26;;38326:9;38320:4;38316:20;38312:1;38301:9;38297:17;38290:47;38354:131;38480:4;38354:131;:::i;:::-;38346:139;;38073:419;;;:::o;38498:221::-;38638:34;38634:1;38626:6;38622:14;38615:58;38707:4;38702:2;38694:6;38690:15;38683:29;38498:221;:::o;38725:366::-;38867:3;38888:67;38952:2;38947:3;38888:67;:::i;:::-;38881:74;;38964:93;39053:3;38964:93;:::i;:::-;39082:2;39077:3;39073:12;39066:19;;38725:366;;;:::o;39097:419::-;39263:4;39301:2;39290:9;39286:18;39278:26;;39350:9;39344:4;39340:20;39336:1;39325:9;39321:17;39314:47;39378:131;39504:4;39378:131;:::i;:::-;39370:139;;39097:419;;;:::o;39522:221::-;39662:34;39658:1;39650:6;39646:14;39639:58;39731:4;39726:2;39718:6;39714:15;39707:29;39522:221;:::o;39749:366::-;39891:3;39912:67;39976:2;39971:3;39912:67;:::i;:::-;39905:74;;39988:93;40077:3;39988:93;:::i;:::-;40106:2;40101:3;40097:12;40090:19;;39749:366;;;:::o;40121:419::-;40287:4;40325:2;40314:9;40310:18;40302:26;;40374:9;40368:4;40364:20;40360:1;40349:9;40345:17;40338:47;40402:131;40528:4;40402:131;:::i;:::-;40394:139;;40121:419;;;:::o;40546:118::-;40633:24;40651:5;40633:24;:::i;:::-;40628:3;40621:37;40546:118;;:::o;40670:86::-;40705:7;40745:4;40738:5;40734:16;40723:27;;40670:86;;;:::o;40762:112::-;40845:22;40861:5;40845:22;:::i;:::-;40840:3;40833:35;40762:112;;:::o;40880:545::-;41053:4;41091:3;41080:9;41076:19;41068:27;;41105:71;41173:1;41162:9;41158:17;41149:6;41105:71;:::i;:::-;41186:68;41250:2;41239:9;41235:18;41226:6;41186:68;:::i;:::-;41264:72;41332:2;41321:9;41317:18;41308:6;41264:72;:::i;:::-;41346;41414:2;41403:9;41399:18;41390:6;41346:72;:::i;:::-;40880:545;;;;;;;:::o

Swarm Source

ipfs://0bf61ab4c501dfeaf360e798c2019e36585350bab8ba7e1ad97558b9a72a9e36
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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