ETH Price: $3,461.17 (+1.56%)
Gas: 7 Gwei

Token

DAW Specials (DAWS)
 

Overview

Max Total Supply

1,076 DAWS

Holders

339

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
skyblueeyes.eth
0x62af0dfe2d382015c5611a94d8e4946c6710f3ea
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:
DAWSpecials

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-28
*/

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

        return (signer, RecoverError.NoError);
    }

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

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

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

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

// File: contracts/SignatureVerfifer.sol


pragma solidity ^0.8.4;

contract SignatureVerifier {
    using ECDSA for bytes32;

    address private _signer;
    event SignerUpdated(address newSigner);

    constructor() {
    }

    function _setSigner(address _newSigner) internal {
        _signer = _newSigner;
        emit SignerUpdated(_signer);
    }

    function _hash(string calldata _salt, uint256 _tokenId,uint256 _amount, uint256 _price, address _address)
        internal
        view
        returns (bytes32)
    {
        return keccak256(abi.encode(_salt, _tokenId, _amount,_price, address(this), _address));
    }

    function _recover(bytes32 hash, bytes memory token)
        internal
        pure
        returns (address)
    {
        return hash.toEthSignedMessageHash().recover(token);
    }

    function getAddress(
    string calldata _salt, uint256 _tokenId,uint256 _amount, uint256 _price, address _address,bytes calldata _token   ) internal view returns (address) {
        return _recover(_hash(_salt, _tokenId,_amount, _price, _address), _token);
    }

    function verifyTokenForAddress(
        string calldata _salt,
        uint256 tokenId,
        uint256 _amount,
        uint256 price,
        bytes calldata _token,
        address _address
    ) internal view returns (bool) {
        return getAddress(_salt, tokenId, _amount,price, _address, _token) == _signer;
    }
}
// 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/security/Pausable.sol


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

pragma solidity ^0.8.0;


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

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

    bool private _paused;

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/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/ERC1155/IERC1155Receiver.sol


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

pragma solidity ^0.8.0;


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

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

// File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;







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

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

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

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

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

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

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

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

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

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

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

        return batchBalances;
    }

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

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

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

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

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

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

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

        return array;
    }
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

// File: contracts/Smartcontract.sol


pragma solidity ^0.8.4;




contract DAWSpecials is ERC1155Supply, Ownable,SignatureVerifier,Pausable {
    using Strings for uint256;
    mapping (address=>mapping(uint256=>bool)) private _minted;
    mapping (uint256=>uint256) public maxSupplies;
    string private uriSuffix;
    string public name = "DAW Specials";
    string public symbol = "DAWS";
    constructor() ERC1155("") {}
    function setURI(string memory newuri) public onlyOwner {
        _setURI(newuri);
    }
    function airdrop(address[] memory addresses,uint256 id) public onlyOwner{
        for(uint256 index =0; index < addresses.length; index++){
            _mint(addresses[index],id,1,"");
        }
    }
    function setSigner(address addr) external onlyOwner{
        _setSigner(addr);
    }
    function mint(uint256 tokenId, uint256 amount,uint256 price,string calldata salt, bytes calldata token)public payable whenNotPaused{
        require((totalSupply(tokenId) + amount <=maxSupplies[tokenId]) ||
        maxSupplies[tokenId] ==0 //eg no max supply
        ,"Out of stock");
        require(verifyTokenForAddress(salt, tokenId, amount,price, token, msg.sender), "Unauthorized");
        require(msg.value == price*amount);
        require(!_minted[msg.sender][tokenId],"Already minted");
        _mint(msg.sender,tokenId,amount,"");
        _minted[msg.sender][tokenId] = true;
    }
    function withdraw (address addr)public onlyOwner{
        payable(addr).transfer(address(this).balance);
    }
    function uri(uint256 _tokenId) public view override (ERC1155) returns(string memory) {
        return string(abi.encodePacked(super.uri(_tokenId), _tokenId.toString(),uriSuffix));
    }
    function setUriSuffix(string memory _uriSuffix) public onlyOwner {
        uriSuffix = _uriSuffix;
    }
    function setTotalSupply(uint256[] memory _tokenIds, uint256[]memory _supplies)public onlyOwner{
        require(_tokenIds.length == _supplies.length,"Invalid args");
        for (uint256 index = 0; index<_tokenIds.length; index++){
            maxSupplies[_tokenIds[index]] = _supplies[index];
        }
    }
    function pause() public  onlyOwner{
        _pause();
    }
    function unpause() public  onlyOwner{
        _unpause();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newSigner","type":"address"}],"name":"SignerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"maxSupplies","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"string","name":"salt","type":"string"},{"internalType":"bytes","name":"token","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_supplies","type":"uint256[]"}],"name":"setTotalSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newuri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","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":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280600c81526020017f444157205370656369616c7300000000000000000000000000000000000000008152506009908051906020019062000051929190620001fb565b506040518060400160405280600481526020017f4441575300000000000000000000000000000000000000000000000000000000815250600a90805190602001906200009f929190620001fb565b50348015620000ad57600080fd5b5060405180602001604052806000815250620000cf816200011160201b60201c565b50620000f0620000e46200012d60201b60201c565b6200013560201b60201c565b6000600560146101000a81548160ff02191690831515021790555062000310565b806002908051906020019062000129929190620001fb565b5050565b600033905090565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200020990620002ab565b90600052602060002090601f0160209004810192826200022d576000855562000279565b82601f106200024857805160ff191683800117855562000279565b8280016001018555821562000279579182015b82811115620002785782518255916020019190600101906200025b565b5b5090506200028891906200028c565b5090565b5b80821115620002a75760008160009055506001016200028d565b5090565b60006002820490506001821680620002c457607f821691505b60208210811415620002db57620002da620002e1565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614bcd80620003206000396000f3fe6080604052600436106101805760003560e01c8063715018a6116100d1578063a22cb4651161008a578063e051eaa611610064578063e051eaa614610569578063e985e9c514610585578063f242432a146105c2578063f2fde38b146105eb57610180565b8063a22cb465146104da578063bd85b03914610503578063c204642c1461054057610180565b8063715018a6146103f05780638456cb591461040757806387962dcc1461041e5780638da5cb5b1461045b57806395d89b41146104865780639dca31d2146104b157610180565b80632eb2c2d61161013e5780634f558e79116101185780634f558e791461033657806351cff8d9146103735780635c975abb1461039c5780636c19e783146103c757610180565b80632eb2c2d6146102b95780633f4ba83a146102e25780634e1273f4146102f957610180565b8062fdd58e1461018557806301ffc9a7146101c257806302fe5305146101ff57806306fdde03146102285780630e89341c1461025357806316ba10e014610290575b600080fd5b34801561019157600080fd5b506101ac60048036038101906101a791906130d5565b610614565b6040516101b99190613ec4565b60405180910390f35b3480156101ce57600080fd5b506101e960048036038101906101e49190613261565b6106dd565b6040516101f69190613af8565b60405180910390f35b34801561020b57600080fd5b50610226600480360381019061022191906132bb565b6107bf565b005b34801561023457600080fd5b5061023d6107d3565b60405161024a9190613bc2565b60405180910390f35b34801561025f57600080fd5b5061027a60048036038101906102759190613304565b610861565b6040516102879190613bc2565b60405180910390f35b34801561029c57600080fd5b506102b760048036038101906102b291906132bb565b61089f565b005b3480156102c557600080fd5b506102e060048036038101906102db9190612f2f565b6108c1565b005b3480156102ee57600080fd5b506102f7610962565b005b34801561030557600080fd5b50610320600480360381019061031b9190613115565b610974565b60405161032d9190613a9f565b60405180910390f35b34801561034257600080fd5b5061035d60048036038101906103589190613304565b610a8d565b60405161036a9190613af8565b60405180910390f35b34801561037f57600080fd5b5061039a60048036038101906103959190612ec2565b610aa1565b005b3480156103a857600080fd5b506103b1610af3565b6040516103be9190613af8565b60405180910390f35b3480156103d357600080fd5b506103ee60048036038101906103e99190612ec2565b610b0a565b005b3480156103fc57600080fd5b50610405610b1e565b005b34801561041357600080fd5b5061041c610b32565b005b34801561042a57600080fd5b5061044560048036038101906104409190613304565b610b44565b6040516104529190613ec4565b60405180910390f35b34801561046757600080fd5b50610470610b5c565b60405161047d91906139c2565b60405180910390f35b34801561049257600080fd5b5061049b610b86565b6040516104a89190613bc2565b60405180910390f35b3480156104bd57600080fd5b506104d860048036038101906104d391906131e9565b610c14565b005b3480156104e657600080fd5b5061050160048036038101906104fc9190613095565b610cd0565b005b34801561050f57600080fd5b5061052a60048036038101906105259190613304565b610ce6565b6040516105379190613ec4565b60405180910390f35b34801561054c57600080fd5b506105676004803603810190610562919061318d565b610d03565b005b610583600480360381019061057e9190613331565b610d65565b005b34801561059157600080fd5b506105ac60048036038101906105a79190612eef565b610f85565b6040516105b99190613af8565b60405180910390f35b3480156105ce57600080fd5b506105e960048036038101906105e49190612ffe565b611019565b005b3480156105f757600080fd5b50610612600480360381019061060d9190612ec2565b6110ba565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067c90613d04565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107a857507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107b857506107b78261113e565b5b9050919050565b6107c76111a8565b6107d081611226565b50565b600980546107e09061425a565b80601f016020809104026020016040519081016040528092919081815260200182805461080c9061425a565b80156108595780601f1061082e57610100808354040283529160200191610859565b820191906000526020600020905b81548152906001019060200180831161083c57829003601f168201915b505050505081565b606061086c82611240565b610875836112d4565b60086040516020016108899392919061396b565b6040516020818303038152906040529050919050565b6108a76111a8565b80600890805190602001906108bd929190612aee565b5050565b6108c9611435565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061090f575061090e85610909611435565b610f85565b5b61094e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094590613c24565b60405180910390fd5b61095b858585858561143d565b5050505050565b61096a6111a8565b61097261175f565b565b606081518351146109ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b190613e64565b60405180910390fd5b6000835167ffffffffffffffff8111156109d7576109d661442c565b5b604051908082528060200260200182016040528015610a055781602001602082028036833780820191505090505b50905060005b8451811015610a8257610a52858281518110610a2a57610a296143fd565b5b6020026020010151858381518110610a4557610a446143fd565b5b6020026020010151610614565b828281518110610a6557610a646143fd565b5b60200260200101818152505080610a7b906142bd565b9050610a0b565b508091505092915050565b600080610a9983610ce6565b119050919050565b610aa96111a8565b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610aef573d6000803e3d6000fd5b5050565b6000600560149054906101000a900460ff16905090565b610b126111a8565b610b1b816117c2565b50565b610b266111a8565b610b30600061185f565b565b610b3a6111a8565b610b42611925565b565b60076020528060005260406000206000915090505481565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600a8054610b939061425a565b80601f0160208091040260200160405190810160405280929190818152602001828054610bbf9061425a565b8015610c0c5780601f10610be157610100808354040283529160200191610c0c565b820191906000526020600020905b815481529060010190602001808311610bef57829003601f168201915b505050505081565b610c1c6111a8565b8051825114610c60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5790613da4565b60405180910390fd5b60005b8251811015610ccb57818181518110610c7f57610c7e6143fd565b5b602002602001015160076000858481518110610c9e57610c9d6143fd565b5b60200260200101518152602001908152602001600020819055508080610cc3906142bd565b915050610c63565b505050565b610ce2610cdb611435565b8383611988565b5050565b600060036000838152602001908152602001600020549050919050565b610d0b6111a8565b60005b8251811015610d6057610d4d838281518110610d2d57610d2c6143fd565b5b602002602001015183600160405180602001604052806000815250611af5565b8080610d58906142bd565b915050610d0e565b505050565b610d6d611ca6565b600760008881526020019081526020016000205486610d8b89610ce6565b610d959190614078565b111580610db5575060006007600089815260200190815260200160002054145b610df4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610deb90613d44565b60405180910390fd5b610e048484898989878733611cf0565b610e43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3a90613cc4565b60405180910390fd5b8585610e4f91906140ff565b3414610e5a57600080fd5b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600088815260200190815260200160002060009054906101000a900460ff1615610ef8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eef90613c64565b60405180910390fd5b610f1333888860405180602001604052806000815250611af5565b6001600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600089815260200190815260200160002060006101000a81548160ff02191690831515021790555050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611021611435565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611067575061106685611061611435565b610f85565b5b6110a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109d90613c24565b60405180910390fd5b6110b38585858585611d60565b5050505050565b6110c26111a8565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611132576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112990613ce4565b60405180910390fd5b61113b8161185f565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6111b0611435565b73ffffffffffffffffffffffffffffffffffffffff166111ce610b5c565b73ffffffffffffffffffffffffffffffffffffffff1614611224576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121b90613e04565b60405180910390fd5b565b806002908051906020019061123c929190612aee565b5050565b60606002805461124f9061425a565b80601f016020809104026020016040519081016040528092919081815260200182805461127b9061425a565b80156112c85780601f1061129d576101008083540402835291602001916112c8565b820191906000526020600020905b8154815290600101906020018083116112ab57829003601f168201915b50505050509050919050565b6060600082141561131c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611430565b600082905060005b6000821461134e578080611337906142bd565b915050600a8261134791906140ce565b9150611324565b60008167ffffffffffffffff81111561136a5761136961442c565b5b6040519080825280601f01601f19166020018201604052801561139c5781602001600182028036833780820191505090505b5090505b60008514611429576001826113b59190614159565b9150600a856113c49190614310565b60306113d09190614078565b60f81b8183815181106113e6576113e56143fd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561142291906140ce565b94506113a0565b8093505050505b919050565b600033905090565b8151835114611481576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147890613e84565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156114f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e890613d84565b60405180910390fd5b60006114fb611435565b905061150b818787878787611ffc565b60005b84518110156116bc57600085828151811061152c5761152b6143fd565b5b60200260200101519050600085838151811061154b5761154a6143fd565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156115ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e390613de4565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116a19190614078565b92505081905550505050806116b5906142bd565b905061150e565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611733929190613ac1565b60405180910390a46117498187878787876121ce565b6117578187878787876121d6565b505050505050565b6117676123bd565b6000600560146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6117ab611435565b6040516117b891906139c2565b60405180910390a1565b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f5553331329228fbd4123164423717a4a7539f6dfa1c3279a923b98fd681a6c73600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660405161185491906139c2565b60405180910390a150565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61192d611ca6565b6001600560146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611971611435565b60405161197e91906139c2565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156119f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ee90613e44565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ae89190613af8565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611b65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5c90613ea4565b60405180910390fd5b6000611b6f611435565b90506000611b7c85612406565b90506000611b8985612406565b9050611b9a83600089858589611ffc565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bf99190614078565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051611c77929190613edf565b60405180910390a4611c8e836000898585896121ce565b611c9d83600089898989612480565b50505050505050565b611cae610af3565b15611cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce590613d64565b60405180910390fd5b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611d3b8a8a8a8a8a888b8b612667565b73ffffffffffffffffffffffffffffffffffffffff1614905098975050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611dd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc790613d84565b60405180910390fd5b6000611dda611435565b90506000611de785612406565b90506000611df485612406565b9050611e04838989858589611ffc565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015611e9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9290613de4565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f509190614078565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051611fcd929190613edf565b60405180910390a4611fe3848a8a86868a6121ce565b611ff1848a8a8a8a8a612480565b505050505050505050565b61200a8686868686866126d2565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156120bc5760005b83518110156120ba5782818151811061205e5761205d6143fd565b5b60200260200101516003600086848151811061207d5761207c6143fd565b5b6020026020010151815260200190815260200160002060008282546120a29190614078565b92505081905550806120b3906142bd565b9050612042565b505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156121c65760005b83518110156121c4576000848281518110612112576121116143fd565b5b602002602001015190506000848381518110612131576121306143fd565b5b6020026020010151905060006003600084815260200190815260200160002054905081811015612196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218d90613e24565b60405180910390fd5b8181036003600085815260200190815260200160002081905550505050806121bd906142bd565b90506120f4565b505b505050505050565b505050505050565b6121f58473ffffffffffffffffffffffffffffffffffffffff166126da565b156123b5578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b815260040161223b9594939291906139dd565b602060405180830381600087803b15801561225557600080fd5b505af192505050801561228657506040513d601f19601f82011682018060405250810190612283919061328e565b60015b61232c5761229261445b565b806308c379a014156122ef57506122a7614aa5565b806122b257506122f1565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e69190613bc2565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232390613c04565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146123b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123aa90613c44565b60405180910390fd5b505b505050505050565b6123c5610af3565b612404576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fb90613c84565b60405180910390fd5b565b60606000600167ffffffffffffffff8111156124255761242461442c565b5b6040519080825280602002602001820160405280156124535781602001602082028036833780820191505090505b509050828160008151811061246b5761246a6143fd565b5b60200260200101818152505080915050919050565b61249f8473ffffffffffffffffffffffffffffffffffffffff166126da565b1561265f578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016124e5959493929190613a45565b602060405180830381600087803b1580156124ff57600080fd5b505af192505050801561253057506040513d601f19601f8201168201806040525081019061252d919061328e565b60015b6125d65761253c61445b565b806308c379a014156125995750612551614aa5565b8061255c575061259b565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125909190613bc2565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125cd90613c04565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461265d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265490613c44565b60405180910390fd5b505b505050505050565b60006126c461267a8a8a8a8a8a8a6126fd565b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061273e565b905098975050505050505050565b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008686868686308760405160200161271c9796959493929190613b58565b6040516020818303038152906040528051906020012090509695505050505050565b600061275b8261274d85612763565b61279390919063ffffffff16565b905092915050565b600081604051602001612776919061399c565b604051602081830303815290604052805190602001209050919050565b60008060006127a285856127ba565b915091506127af8161280c565b819250505092915050565b6000806041835114156127fc5760008060006020860151925060408601519150606086015160001a90506127f0878285856129e1565b94509450505050612805565b60006002915091505b9250929050565b600060048111156128205761281f61439f565b5b8160048111156128335761283261439f565b5b141561283e576129de565b600160048111156128525761285161439f565b5b8160048111156128655761286461439f565b5b14156128a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289d90613be4565b60405180910390fd5b600260048111156128ba576128b961439f565b5b8160048111156128cd576128cc61439f565b5b141561290e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290590613ca4565b60405180910390fd5b600360048111156129225761292161439f565b5b8160048111156129355761293461439f565b5b1415612976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296d90613d24565b60405180910390fd5b6004808111156129895761298861439f565b5b81600481111561299c5761299b61439f565b5b14156129dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d490613dc4565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612a1c576000600391509150612ae5565b601b8560ff1614158015612a345750601c8560ff1614155b15612a46576000600491509150612ae5565b600060018787878760405160008152602001604052604051612a6b9493929190613b13565b6020604051602081039080840390855afa158015612a8d573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612adc57600060019250925050612ae5565b80600092509250505b94509492505050565b828054612afa9061425a565b90600052602060002090601f016020900481019282612b1c5760008555612b63565b82601f10612b3557805160ff1916838001178555612b63565b82800160010185558215612b63579182015b82811115612b62578251825591602001919060010190612b47565b5b509050612b709190612b74565b5090565b5b80821115612b8d576000816000905550600101612b75565b5090565b6000612ba4612b9f84613f2d565b613f08565b90508083825260208201905082856020860282011115612bc757612bc6614487565b5b60005b85811015612bf75781612bdd8882612cf5565b845260208401935060208301925050600181019050612bca565b5050509392505050565b6000612c14612c0f84613f59565b613f08565b90508083825260208201905082856020860282011115612c3757612c36614487565b5b60005b85811015612c675781612c4d8882612ead565b845260208401935060208301925050600181019050612c3a565b5050509392505050565b6000612c84612c7f84613f85565b613f08565b905082815260208101848484011115612ca057612c9f61448c565b5b612cab848285614218565b509392505050565b6000612cc6612cc184613fb6565b613f08565b905082815260208101848484011115612ce257612ce161448c565b5b612ced848285614218565b509392505050565b600081359050612d0481614b3b565b92915050565b600082601f830112612d1f57612d1e614482565b5b8135612d2f848260208601612b91565b91505092915050565b600082601f830112612d4d57612d4c614482565b5b8135612d5d848260208601612c01565b91505092915050565b600081359050612d7581614b52565b92915050565b600081359050612d8a81614b69565b92915050565b600081519050612d9f81614b69565b92915050565b60008083601f840112612dbb57612dba614482565b5b8235905067ffffffffffffffff811115612dd857612dd761447d565b5b602083019150836001820283011115612df457612df3614487565b5b9250929050565b600082601f830112612e1057612e0f614482565b5b8135612e20848260208601612c71565b91505092915050565b60008083601f840112612e3f57612e3e614482565b5b8235905067ffffffffffffffff811115612e5c57612e5b61447d565b5b602083019150836001820283011115612e7857612e77614487565b5b9250929050565b600082601f830112612e9457612e93614482565b5b8135612ea4848260208601612cb3565b91505092915050565b600081359050612ebc81614b80565b92915050565b600060208284031215612ed857612ed7614496565b5b6000612ee684828501612cf5565b91505092915050565b60008060408385031215612f0657612f05614496565b5b6000612f1485828601612cf5565b9250506020612f2585828601612cf5565b9150509250929050565b600080600080600060a08688031215612f4b57612f4a614496565b5b6000612f5988828901612cf5565b9550506020612f6a88828901612cf5565b945050604086013567ffffffffffffffff811115612f8b57612f8a614491565b5b612f9788828901612d38565b935050606086013567ffffffffffffffff811115612fb857612fb7614491565b5b612fc488828901612d38565b925050608086013567ffffffffffffffff811115612fe557612fe4614491565b5b612ff188828901612dfb565b9150509295509295909350565b600080600080600060a0868803121561301a57613019614496565b5b600061302888828901612cf5565b955050602061303988828901612cf5565b945050604061304a88828901612ead565b935050606061305b88828901612ead565b925050608086013567ffffffffffffffff81111561307c5761307b614491565b5b61308888828901612dfb565b9150509295509295909350565b600080604083850312156130ac576130ab614496565b5b60006130ba85828601612cf5565b92505060206130cb85828601612d66565b9150509250929050565b600080604083850312156130ec576130eb614496565b5b60006130fa85828601612cf5565b925050602061310b85828601612ead565b9150509250929050565b6000806040838503121561312c5761312b614496565b5b600083013567ffffffffffffffff81111561314a57613149614491565b5b61315685828601612d0a565b925050602083013567ffffffffffffffff81111561317757613176614491565b5b61318385828601612d38565b9150509250929050565b600080604083850312156131a4576131a3614496565b5b600083013567ffffffffffffffff8111156131c2576131c1614491565b5b6131ce85828601612d0a565b92505060206131df85828601612ead565b9150509250929050565b60008060408385031215613200576131ff614496565b5b600083013567ffffffffffffffff81111561321e5761321d614491565b5b61322a85828601612d38565b925050602083013567ffffffffffffffff81111561324b5761324a614491565b5b61325785828601612d38565b9150509250929050565b60006020828403121561327757613276614496565b5b600061328584828501612d7b565b91505092915050565b6000602082840312156132a4576132a3614496565b5b60006132b284828501612d90565b91505092915050565b6000602082840312156132d1576132d0614496565b5b600082013567ffffffffffffffff8111156132ef576132ee614491565b5b6132fb84828501612e7f565b91505092915050565b60006020828403121561331a57613319614496565b5b600061332884828501612ead565b91505092915050565b600080600080600080600060a0888a0312156133505761334f614496565b5b600061335e8a828b01612ead565b975050602061336f8a828b01612ead565b96505060406133808a828b01612ead565b955050606088013567ffffffffffffffff8111156133a1576133a0614491565b5b6133ad8a828b01612e29565b9450945050608088013567ffffffffffffffff8111156133d0576133cf614491565b5b6133dc8a828b01612da5565b925092505092959891949750929550565b60006133f9838361393e565b60208301905092915050565b61340e8161418d565b82525050565b600061341f8261400c565b613429818561403a565b935061343483613fe7565b8060005b8381101561346557815161344c88826133ed565b97506134578361402d565b925050600181019050613438565b5085935050505092915050565b61347b8161419f565b82525050565b61348a816141ab565b82525050565b6134a161349c826141ab565b614306565b82525050565b60006134b282614017565b6134bc818561404b565b93506134cc818560208601614227565b6134d58161449b565b840191505092915050565b60006134ec838561405c565b93506134f9838584614218565b6135028361449b565b840190509392505050565b600061351882614022565b613522818561405c565b9350613532818560208601614227565b61353b8161449b565b840191505092915050565b600061355182614022565b61355b818561406d565b935061356b818560208601614227565b80840191505092915050565b600081546135848161425a565b61358e818661406d565b945060018216600081146135a957600181146135ba576135ed565b60ff198316865281860193506135ed565b6135c385613ff7565b60005b838110156135e5578154818901526001820191506020810190506135c6565b838801955050505b50505092915050565b600061360360188361405c565b915061360e826144b9565b602082019050919050565b600061362660348361405c565b9150613631826144e2565b604082019050919050565b6000613649602f8361405c565b915061365482614531565b604082019050919050565b600061366c60288361405c565b915061367782614580565b604082019050919050565b600061368f600e8361405c565b915061369a826145cf565b602082019050919050565b60006136b260148361405c565b91506136bd826145f8565b602082019050919050565b60006136d5601f8361405c565b91506136e082614621565b602082019050919050565b60006136f8601c8361406d565b91506137038261464a565b601c82019050919050565b600061371b600c8361405c565b915061372682614673565b602082019050919050565b600061373e60268361405c565b91506137498261469c565b604082019050919050565b6000613761602a8361405c565b915061376c826146eb565b604082019050919050565b600061378460228361405c565b915061378f8261473a565b604082019050919050565b60006137a7600c8361405c565b91506137b282614789565b602082019050919050565b60006137ca60108361405c565b91506137d5826147b2565b602082019050919050565b60006137ed60258361405c565b91506137f8826147db565b604082019050919050565b6000613810600c8361405c565b915061381b8261482a565b602082019050919050565b600061383360228361405c565b915061383e82614853565b604082019050919050565b6000613856602a8361405c565b9150613861826148a2565b604082019050919050565b600061387960208361405c565b9150613884826148f1565b602082019050919050565b600061389c60288361405c565b91506138a78261491a565b604082019050919050565b60006138bf60298361405c565b91506138ca82614969565b604082019050919050565b60006138e260298361405c565b91506138ed826149b8565b604082019050919050565b600061390560288361405c565b915061391082614a07565b604082019050919050565b600061392860218361405c565b915061393382614a56565b604082019050919050565b61394781614201565b82525050565b61395681614201565b82525050565b6139658161420b565b82525050565b60006139778286613546565b91506139838285613546565b915061398f8284613577565b9150819050949350505050565b60006139a7826136eb565b91506139b38284613490565b60208201915081905092915050565b60006020820190506139d76000830184613405565b92915050565b600060a0820190506139f26000830188613405565b6139ff6020830187613405565b8181036040830152613a118186613414565b90508181036060830152613a258185613414565b90508181036080830152613a3981846134a7565b90509695505050505050565b600060a082019050613a5a6000830188613405565b613a676020830187613405565b613a74604083018661394d565b613a81606083018561394d565b8181036080830152613a9381846134a7565b90509695505050505050565b60006020820190508181036000830152613ab98184613414565b905092915050565b60006040820190508181036000830152613adb8185613414565b90508181036020830152613aef8184613414565b90509392505050565b6000602082019050613b0d6000830184613472565b92915050565b6000608082019050613b286000830187613481565b613b35602083018661395c565b613b426040830185613481565b613b4f6060830184613481565b95945050505050565b600060c0820190508181036000830152613b7381898b6134e0565b9050613b82602083018861394d565b613b8f604083018761394d565b613b9c606083018661394d565b613ba96080830185613405565b613bb660a0830184613405565b98975050505050505050565b60006020820190508181036000830152613bdc818461350d565b905092915050565b60006020820190508181036000830152613bfd816135f6565b9050919050565b60006020820190508181036000830152613c1d81613619565b9050919050565b60006020820190508181036000830152613c3d8161363c565b9050919050565b60006020820190508181036000830152613c5d8161365f565b9050919050565b60006020820190508181036000830152613c7d81613682565b9050919050565b60006020820190508181036000830152613c9d816136a5565b9050919050565b60006020820190508181036000830152613cbd816136c8565b9050919050565b60006020820190508181036000830152613cdd8161370e565b9050919050565b60006020820190508181036000830152613cfd81613731565b9050919050565b60006020820190508181036000830152613d1d81613754565b9050919050565b60006020820190508181036000830152613d3d81613777565b9050919050565b60006020820190508181036000830152613d5d8161379a565b9050919050565b60006020820190508181036000830152613d7d816137bd565b9050919050565b60006020820190508181036000830152613d9d816137e0565b9050919050565b60006020820190508181036000830152613dbd81613803565b9050919050565b60006020820190508181036000830152613ddd81613826565b9050919050565b60006020820190508181036000830152613dfd81613849565b9050919050565b60006020820190508181036000830152613e1d8161386c565b9050919050565b60006020820190508181036000830152613e3d8161388f565b9050919050565b60006020820190508181036000830152613e5d816138b2565b9050919050565b60006020820190508181036000830152613e7d816138d5565b9050919050565b60006020820190508181036000830152613e9d816138f8565b9050919050565b60006020820190508181036000830152613ebd8161391b565b9050919050565b6000602082019050613ed9600083018461394d565b92915050565b6000604082019050613ef4600083018561394d565b613f01602083018461394d565b9392505050565b6000613f12613f23565b9050613f1e828261428c565b919050565b6000604051905090565b600067ffffffffffffffff821115613f4857613f4761442c565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613f7457613f7361442c565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613fa057613f9f61442c565b5b613fa98261449b565b9050602081019050919050565b600067ffffffffffffffff821115613fd157613fd061442c565b5b613fda8261449b565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061408382614201565b915061408e83614201565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156140c3576140c2614341565b5b828201905092915050565b60006140d982614201565b91506140e483614201565b9250826140f4576140f3614370565b5b828204905092915050565b600061410a82614201565b915061411583614201565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561414e5761414d614341565b5b828202905092915050565b600061416482614201565b915061416f83614201565b92508282101561418257614181614341565b5b828203905092915050565b6000614198826141e1565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561424557808201518184015260208101905061422a565b83811115614254576000848401525b50505050565b6000600282049050600182168061427257607f821691505b60208210811415614286576142856143ce565b5b50919050565b6142958261449b565b810181811067ffffffffffffffff821117156142b4576142b361442c565b5b80604052505050565b60006142c882614201565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156142fb576142fa614341565b5b600182019050919050565b6000819050919050565b600061431b82614201565b915061432683614201565b92508261433657614335614370565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d111561447a5760046000803e6144776000516144ac565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206e6f7220617070726f7665640000000000000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f416c7265616479206d696e746564000000000000000000000000000000000000600082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f556e617574686f72697a65640000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f7574206f662073746f636b0000000000000000000000000000000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c696420617267730000000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243313135353a206275726e20616d6f756e74206578636565647320746f7460008201527f616c537570706c79000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600060443d1015614ab557614b38565b614abd613f23565b60043d036004823e80513d602482011167ffffffffffffffff82111715614ae5575050614b38565b808201805167ffffffffffffffff811115614b035750505050614b38565b80602083010160043d038501811115614b20575050505050614b38565b614b2f8260200185018661428c565b82955050505050505b90565b614b448161418d565b8114614b4f57600080fd5b50565b614b5b8161419f565b8114614b6657600080fd5b50565b614b72816141b5565b8114614b7d57600080fd5b50565b614b8981614201565b8114614b9457600080fd5b5056fea2646970667358221220478098ce84616e5cd0105a9134e89c89c686bf2e4f7a9e10346aecfc5806e86464736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101805760003560e01c8063715018a6116100d1578063a22cb4651161008a578063e051eaa611610064578063e051eaa614610569578063e985e9c514610585578063f242432a146105c2578063f2fde38b146105eb57610180565b8063a22cb465146104da578063bd85b03914610503578063c204642c1461054057610180565b8063715018a6146103f05780638456cb591461040757806387962dcc1461041e5780638da5cb5b1461045b57806395d89b41146104865780639dca31d2146104b157610180565b80632eb2c2d61161013e5780634f558e79116101185780634f558e791461033657806351cff8d9146103735780635c975abb1461039c5780636c19e783146103c757610180565b80632eb2c2d6146102b95780633f4ba83a146102e25780634e1273f4146102f957610180565b8062fdd58e1461018557806301ffc9a7146101c257806302fe5305146101ff57806306fdde03146102285780630e89341c1461025357806316ba10e014610290575b600080fd5b34801561019157600080fd5b506101ac60048036038101906101a791906130d5565b610614565b6040516101b99190613ec4565b60405180910390f35b3480156101ce57600080fd5b506101e960048036038101906101e49190613261565b6106dd565b6040516101f69190613af8565b60405180910390f35b34801561020b57600080fd5b50610226600480360381019061022191906132bb565b6107bf565b005b34801561023457600080fd5b5061023d6107d3565b60405161024a9190613bc2565b60405180910390f35b34801561025f57600080fd5b5061027a60048036038101906102759190613304565b610861565b6040516102879190613bc2565b60405180910390f35b34801561029c57600080fd5b506102b760048036038101906102b291906132bb565b61089f565b005b3480156102c557600080fd5b506102e060048036038101906102db9190612f2f565b6108c1565b005b3480156102ee57600080fd5b506102f7610962565b005b34801561030557600080fd5b50610320600480360381019061031b9190613115565b610974565b60405161032d9190613a9f565b60405180910390f35b34801561034257600080fd5b5061035d60048036038101906103589190613304565b610a8d565b60405161036a9190613af8565b60405180910390f35b34801561037f57600080fd5b5061039a60048036038101906103959190612ec2565b610aa1565b005b3480156103a857600080fd5b506103b1610af3565b6040516103be9190613af8565b60405180910390f35b3480156103d357600080fd5b506103ee60048036038101906103e99190612ec2565b610b0a565b005b3480156103fc57600080fd5b50610405610b1e565b005b34801561041357600080fd5b5061041c610b32565b005b34801561042a57600080fd5b5061044560048036038101906104409190613304565b610b44565b6040516104529190613ec4565b60405180910390f35b34801561046757600080fd5b50610470610b5c565b60405161047d91906139c2565b60405180910390f35b34801561049257600080fd5b5061049b610b86565b6040516104a89190613bc2565b60405180910390f35b3480156104bd57600080fd5b506104d860048036038101906104d391906131e9565b610c14565b005b3480156104e657600080fd5b5061050160048036038101906104fc9190613095565b610cd0565b005b34801561050f57600080fd5b5061052a60048036038101906105259190613304565b610ce6565b6040516105379190613ec4565b60405180910390f35b34801561054c57600080fd5b506105676004803603810190610562919061318d565b610d03565b005b610583600480360381019061057e9190613331565b610d65565b005b34801561059157600080fd5b506105ac60048036038101906105a79190612eef565b610f85565b6040516105b99190613af8565b60405180910390f35b3480156105ce57600080fd5b506105e960048036038101906105e49190612ffe565b611019565b005b3480156105f757600080fd5b50610612600480360381019061060d9190612ec2565b6110ba565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067c90613d04565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107a857507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107b857506107b78261113e565b5b9050919050565b6107c76111a8565b6107d081611226565b50565b600980546107e09061425a565b80601f016020809104026020016040519081016040528092919081815260200182805461080c9061425a565b80156108595780601f1061082e57610100808354040283529160200191610859565b820191906000526020600020905b81548152906001019060200180831161083c57829003601f168201915b505050505081565b606061086c82611240565b610875836112d4565b60086040516020016108899392919061396b565b6040516020818303038152906040529050919050565b6108a76111a8565b80600890805190602001906108bd929190612aee565b5050565b6108c9611435565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061090f575061090e85610909611435565b610f85565b5b61094e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094590613c24565b60405180910390fd5b61095b858585858561143d565b5050505050565b61096a6111a8565b61097261175f565b565b606081518351146109ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b190613e64565b60405180910390fd5b6000835167ffffffffffffffff8111156109d7576109d661442c565b5b604051908082528060200260200182016040528015610a055781602001602082028036833780820191505090505b50905060005b8451811015610a8257610a52858281518110610a2a57610a296143fd565b5b6020026020010151858381518110610a4557610a446143fd565b5b6020026020010151610614565b828281518110610a6557610a646143fd565b5b60200260200101818152505080610a7b906142bd565b9050610a0b565b508091505092915050565b600080610a9983610ce6565b119050919050565b610aa96111a8565b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610aef573d6000803e3d6000fd5b5050565b6000600560149054906101000a900460ff16905090565b610b126111a8565b610b1b816117c2565b50565b610b266111a8565b610b30600061185f565b565b610b3a6111a8565b610b42611925565b565b60076020528060005260406000206000915090505481565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600a8054610b939061425a565b80601f0160208091040260200160405190810160405280929190818152602001828054610bbf9061425a565b8015610c0c5780601f10610be157610100808354040283529160200191610c0c565b820191906000526020600020905b815481529060010190602001808311610bef57829003601f168201915b505050505081565b610c1c6111a8565b8051825114610c60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5790613da4565b60405180910390fd5b60005b8251811015610ccb57818181518110610c7f57610c7e6143fd565b5b602002602001015160076000858481518110610c9e57610c9d6143fd565b5b60200260200101518152602001908152602001600020819055508080610cc3906142bd565b915050610c63565b505050565b610ce2610cdb611435565b8383611988565b5050565b600060036000838152602001908152602001600020549050919050565b610d0b6111a8565b60005b8251811015610d6057610d4d838281518110610d2d57610d2c6143fd565b5b602002602001015183600160405180602001604052806000815250611af5565b8080610d58906142bd565b915050610d0e565b505050565b610d6d611ca6565b600760008881526020019081526020016000205486610d8b89610ce6565b610d959190614078565b111580610db5575060006007600089815260200190815260200160002054145b610df4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610deb90613d44565b60405180910390fd5b610e048484898989878733611cf0565b610e43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3a90613cc4565b60405180910390fd5b8585610e4f91906140ff565b3414610e5a57600080fd5b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600088815260200190815260200160002060009054906101000a900460ff1615610ef8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eef90613c64565b60405180910390fd5b610f1333888860405180602001604052806000815250611af5565b6001600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600089815260200190815260200160002060006101000a81548160ff02191690831515021790555050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611021611435565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611067575061106685611061611435565b610f85565b5b6110a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109d90613c24565b60405180910390fd5b6110b38585858585611d60565b5050505050565b6110c26111a8565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611132576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112990613ce4565b60405180910390fd5b61113b8161185f565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6111b0611435565b73ffffffffffffffffffffffffffffffffffffffff166111ce610b5c565b73ffffffffffffffffffffffffffffffffffffffff1614611224576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121b90613e04565b60405180910390fd5b565b806002908051906020019061123c929190612aee565b5050565b60606002805461124f9061425a565b80601f016020809104026020016040519081016040528092919081815260200182805461127b9061425a565b80156112c85780601f1061129d576101008083540402835291602001916112c8565b820191906000526020600020905b8154815290600101906020018083116112ab57829003601f168201915b50505050509050919050565b6060600082141561131c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611430565b600082905060005b6000821461134e578080611337906142bd565b915050600a8261134791906140ce565b9150611324565b60008167ffffffffffffffff81111561136a5761136961442c565b5b6040519080825280601f01601f19166020018201604052801561139c5781602001600182028036833780820191505090505b5090505b60008514611429576001826113b59190614159565b9150600a856113c49190614310565b60306113d09190614078565b60f81b8183815181106113e6576113e56143fd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561142291906140ce565b94506113a0565b8093505050505b919050565b600033905090565b8151835114611481576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147890613e84565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156114f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e890613d84565b60405180910390fd5b60006114fb611435565b905061150b818787878787611ffc565b60005b84518110156116bc57600085828151811061152c5761152b6143fd565b5b60200260200101519050600085838151811061154b5761154a6143fd565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156115ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e390613de4565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116a19190614078565b92505081905550505050806116b5906142bd565b905061150e565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611733929190613ac1565b60405180910390a46117498187878787876121ce565b6117578187878787876121d6565b505050505050565b6117676123bd565b6000600560146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6117ab611435565b6040516117b891906139c2565b60405180910390a1565b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f5553331329228fbd4123164423717a4a7539f6dfa1c3279a923b98fd681a6c73600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660405161185491906139c2565b60405180910390a150565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61192d611ca6565b6001600560146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611971611435565b60405161197e91906139c2565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156119f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ee90613e44565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ae89190613af8565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611b65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5c90613ea4565b60405180910390fd5b6000611b6f611435565b90506000611b7c85612406565b90506000611b8985612406565b9050611b9a83600089858589611ffc565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bf99190614078565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051611c77929190613edf565b60405180910390a4611c8e836000898585896121ce565b611c9d83600089898989612480565b50505050505050565b611cae610af3565b15611cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce590613d64565b60405180910390fd5b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611d3b8a8a8a8a8a888b8b612667565b73ffffffffffffffffffffffffffffffffffffffff1614905098975050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611dd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc790613d84565b60405180910390fd5b6000611dda611435565b90506000611de785612406565b90506000611df485612406565b9050611e04838989858589611ffc565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015611e9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9290613de4565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f509190614078565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051611fcd929190613edf565b60405180910390a4611fe3848a8a86868a6121ce565b611ff1848a8a8a8a8a612480565b505050505050505050565b61200a8686868686866126d2565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156120bc5760005b83518110156120ba5782818151811061205e5761205d6143fd565b5b60200260200101516003600086848151811061207d5761207c6143fd565b5b6020026020010151815260200190815260200160002060008282546120a29190614078565b92505081905550806120b3906142bd565b9050612042565b505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156121c65760005b83518110156121c4576000848281518110612112576121116143fd565b5b602002602001015190506000848381518110612131576121306143fd565b5b6020026020010151905060006003600084815260200190815260200160002054905081811015612196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218d90613e24565b60405180910390fd5b8181036003600085815260200190815260200160002081905550505050806121bd906142bd565b90506120f4565b505b505050505050565b505050505050565b6121f58473ffffffffffffffffffffffffffffffffffffffff166126da565b156123b5578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b815260040161223b9594939291906139dd565b602060405180830381600087803b15801561225557600080fd5b505af192505050801561228657506040513d601f19601f82011682018060405250810190612283919061328e565b60015b61232c5761229261445b565b806308c379a014156122ef57506122a7614aa5565b806122b257506122f1565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e69190613bc2565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232390613c04565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146123b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123aa90613c44565b60405180910390fd5b505b505050505050565b6123c5610af3565b612404576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fb90613c84565b60405180910390fd5b565b60606000600167ffffffffffffffff8111156124255761242461442c565b5b6040519080825280602002602001820160405280156124535781602001602082028036833780820191505090505b509050828160008151811061246b5761246a6143fd565b5b60200260200101818152505080915050919050565b61249f8473ffffffffffffffffffffffffffffffffffffffff166126da565b1561265f578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016124e5959493929190613a45565b602060405180830381600087803b1580156124ff57600080fd5b505af192505050801561253057506040513d601f19601f8201168201806040525081019061252d919061328e565b60015b6125d65761253c61445b565b806308c379a014156125995750612551614aa5565b8061255c575061259b565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125909190613bc2565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125cd90613c04565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461265d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265490613c44565b60405180910390fd5b505b505050505050565b60006126c461267a8a8a8a8a8a8a6126fd565b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061273e565b905098975050505050505050565b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008686868686308760405160200161271c9796959493929190613b58565b6040516020818303038152906040528051906020012090509695505050505050565b600061275b8261274d85612763565b61279390919063ffffffff16565b905092915050565b600081604051602001612776919061399c565b604051602081830303815290604052805190602001209050919050565b60008060006127a285856127ba565b915091506127af8161280c565b819250505092915050565b6000806041835114156127fc5760008060006020860151925060408601519150606086015160001a90506127f0878285856129e1565b94509450505050612805565b60006002915091505b9250929050565b600060048111156128205761281f61439f565b5b8160048111156128335761283261439f565b5b141561283e576129de565b600160048111156128525761285161439f565b5b8160048111156128655761286461439f565b5b14156128a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289d90613be4565b60405180910390fd5b600260048111156128ba576128b961439f565b5b8160048111156128cd576128cc61439f565b5b141561290e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290590613ca4565b60405180910390fd5b600360048111156129225761292161439f565b5b8160048111156129355761293461439f565b5b1415612976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296d90613d24565b60405180910390fd5b6004808111156129895761298861439f565b5b81600481111561299c5761299b61439f565b5b14156129dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d490613dc4565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612a1c576000600391509150612ae5565b601b8560ff1614158015612a345750601c8560ff1614155b15612a46576000600491509150612ae5565b600060018787878760405160008152602001604052604051612a6b9493929190613b13565b6020604051602081039080840390855afa158015612a8d573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612adc57600060019250925050612ae5565b80600092509250505b94509492505050565b828054612afa9061425a565b90600052602060002090601f016020900481019282612b1c5760008555612b63565b82601f10612b3557805160ff1916838001178555612b63565b82800160010185558215612b63579182015b82811115612b62578251825591602001919060010190612b47565b5b509050612b709190612b74565b5090565b5b80821115612b8d576000816000905550600101612b75565b5090565b6000612ba4612b9f84613f2d565b613f08565b90508083825260208201905082856020860282011115612bc757612bc6614487565b5b60005b85811015612bf75781612bdd8882612cf5565b845260208401935060208301925050600181019050612bca565b5050509392505050565b6000612c14612c0f84613f59565b613f08565b90508083825260208201905082856020860282011115612c3757612c36614487565b5b60005b85811015612c675781612c4d8882612ead565b845260208401935060208301925050600181019050612c3a565b5050509392505050565b6000612c84612c7f84613f85565b613f08565b905082815260208101848484011115612ca057612c9f61448c565b5b612cab848285614218565b509392505050565b6000612cc6612cc184613fb6565b613f08565b905082815260208101848484011115612ce257612ce161448c565b5b612ced848285614218565b509392505050565b600081359050612d0481614b3b565b92915050565b600082601f830112612d1f57612d1e614482565b5b8135612d2f848260208601612b91565b91505092915050565b600082601f830112612d4d57612d4c614482565b5b8135612d5d848260208601612c01565b91505092915050565b600081359050612d7581614b52565b92915050565b600081359050612d8a81614b69565b92915050565b600081519050612d9f81614b69565b92915050565b60008083601f840112612dbb57612dba614482565b5b8235905067ffffffffffffffff811115612dd857612dd761447d565b5b602083019150836001820283011115612df457612df3614487565b5b9250929050565b600082601f830112612e1057612e0f614482565b5b8135612e20848260208601612c71565b91505092915050565b60008083601f840112612e3f57612e3e614482565b5b8235905067ffffffffffffffff811115612e5c57612e5b61447d565b5b602083019150836001820283011115612e7857612e77614487565b5b9250929050565b600082601f830112612e9457612e93614482565b5b8135612ea4848260208601612cb3565b91505092915050565b600081359050612ebc81614b80565b92915050565b600060208284031215612ed857612ed7614496565b5b6000612ee684828501612cf5565b91505092915050565b60008060408385031215612f0657612f05614496565b5b6000612f1485828601612cf5565b9250506020612f2585828601612cf5565b9150509250929050565b600080600080600060a08688031215612f4b57612f4a614496565b5b6000612f5988828901612cf5565b9550506020612f6a88828901612cf5565b945050604086013567ffffffffffffffff811115612f8b57612f8a614491565b5b612f9788828901612d38565b935050606086013567ffffffffffffffff811115612fb857612fb7614491565b5b612fc488828901612d38565b925050608086013567ffffffffffffffff811115612fe557612fe4614491565b5b612ff188828901612dfb565b9150509295509295909350565b600080600080600060a0868803121561301a57613019614496565b5b600061302888828901612cf5565b955050602061303988828901612cf5565b945050604061304a88828901612ead565b935050606061305b88828901612ead565b925050608086013567ffffffffffffffff81111561307c5761307b614491565b5b61308888828901612dfb565b9150509295509295909350565b600080604083850312156130ac576130ab614496565b5b60006130ba85828601612cf5565b92505060206130cb85828601612d66565b9150509250929050565b600080604083850312156130ec576130eb614496565b5b60006130fa85828601612cf5565b925050602061310b85828601612ead565b9150509250929050565b6000806040838503121561312c5761312b614496565b5b600083013567ffffffffffffffff81111561314a57613149614491565b5b61315685828601612d0a565b925050602083013567ffffffffffffffff81111561317757613176614491565b5b61318385828601612d38565b9150509250929050565b600080604083850312156131a4576131a3614496565b5b600083013567ffffffffffffffff8111156131c2576131c1614491565b5b6131ce85828601612d0a565b92505060206131df85828601612ead565b9150509250929050565b60008060408385031215613200576131ff614496565b5b600083013567ffffffffffffffff81111561321e5761321d614491565b5b61322a85828601612d38565b925050602083013567ffffffffffffffff81111561324b5761324a614491565b5b61325785828601612d38565b9150509250929050565b60006020828403121561327757613276614496565b5b600061328584828501612d7b565b91505092915050565b6000602082840312156132a4576132a3614496565b5b60006132b284828501612d90565b91505092915050565b6000602082840312156132d1576132d0614496565b5b600082013567ffffffffffffffff8111156132ef576132ee614491565b5b6132fb84828501612e7f565b91505092915050565b60006020828403121561331a57613319614496565b5b600061332884828501612ead565b91505092915050565b600080600080600080600060a0888a0312156133505761334f614496565b5b600061335e8a828b01612ead565b975050602061336f8a828b01612ead565b96505060406133808a828b01612ead565b955050606088013567ffffffffffffffff8111156133a1576133a0614491565b5b6133ad8a828b01612e29565b9450945050608088013567ffffffffffffffff8111156133d0576133cf614491565b5b6133dc8a828b01612da5565b925092505092959891949750929550565b60006133f9838361393e565b60208301905092915050565b61340e8161418d565b82525050565b600061341f8261400c565b613429818561403a565b935061343483613fe7565b8060005b8381101561346557815161344c88826133ed565b97506134578361402d565b925050600181019050613438565b5085935050505092915050565b61347b8161419f565b82525050565b61348a816141ab565b82525050565b6134a161349c826141ab565b614306565b82525050565b60006134b282614017565b6134bc818561404b565b93506134cc818560208601614227565b6134d58161449b565b840191505092915050565b60006134ec838561405c565b93506134f9838584614218565b6135028361449b565b840190509392505050565b600061351882614022565b613522818561405c565b9350613532818560208601614227565b61353b8161449b565b840191505092915050565b600061355182614022565b61355b818561406d565b935061356b818560208601614227565b80840191505092915050565b600081546135848161425a565b61358e818661406d565b945060018216600081146135a957600181146135ba576135ed565b60ff198316865281860193506135ed565b6135c385613ff7565b60005b838110156135e5578154818901526001820191506020810190506135c6565b838801955050505b50505092915050565b600061360360188361405c565b915061360e826144b9565b602082019050919050565b600061362660348361405c565b9150613631826144e2565b604082019050919050565b6000613649602f8361405c565b915061365482614531565b604082019050919050565b600061366c60288361405c565b915061367782614580565b604082019050919050565b600061368f600e8361405c565b915061369a826145cf565b602082019050919050565b60006136b260148361405c565b91506136bd826145f8565b602082019050919050565b60006136d5601f8361405c565b91506136e082614621565b602082019050919050565b60006136f8601c8361406d565b91506137038261464a565b601c82019050919050565b600061371b600c8361405c565b915061372682614673565b602082019050919050565b600061373e60268361405c565b91506137498261469c565b604082019050919050565b6000613761602a8361405c565b915061376c826146eb565b604082019050919050565b600061378460228361405c565b915061378f8261473a565b604082019050919050565b60006137a7600c8361405c565b91506137b282614789565b602082019050919050565b60006137ca60108361405c565b91506137d5826147b2565b602082019050919050565b60006137ed60258361405c565b91506137f8826147db565b604082019050919050565b6000613810600c8361405c565b915061381b8261482a565b602082019050919050565b600061383360228361405c565b915061383e82614853565b604082019050919050565b6000613856602a8361405c565b9150613861826148a2565b604082019050919050565b600061387960208361405c565b9150613884826148f1565b602082019050919050565b600061389c60288361405c565b91506138a78261491a565b604082019050919050565b60006138bf60298361405c565b91506138ca82614969565b604082019050919050565b60006138e260298361405c565b91506138ed826149b8565b604082019050919050565b600061390560288361405c565b915061391082614a07565b604082019050919050565b600061392860218361405c565b915061393382614a56565b604082019050919050565b61394781614201565b82525050565b61395681614201565b82525050565b6139658161420b565b82525050565b60006139778286613546565b91506139838285613546565b915061398f8284613577565b9150819050949350505050565b60006139a7826136eb565b91506139b38284613490565b60208201915081905092915050565b60006020820190506139d76000830184613405565b92915050565b600060a0820190506139f26000830188613405565b6139ff6020830187613405565b8181036040830152613a118186613414565b90508181036060830152613a258185613414565b90508181036080830152613a3981846134a7565b90509695505050505050565b600060a082019050613a5a6000830188613405565b613a676020830187613405565b613a74604083018661394d565b613a81606083018561394d565b8181036080830152613a9381846134a7565b90509695505050505050565b60006020820190508181036000830152613ab98184613414565b905092915050565b60006040820190508181036000830152613adb8185613414565b90508181036020830152613aef8184613414565b90509392505050565b6000602082019050613b0d6000830184613472565b92915050565b6000608082019050613b286000830187613481565b613b35602083018661395c565b613b426040830185613481565b613b4f6060830184613481565b95945050505050565b600060c0820190508181036000830152613b7381898b6134e0565b9050613b82602083018861394d565b613b8f604083018761394d565b613b9c606083018661394d565b613ba96080830185613405565b613bb660a0830184613405565b98975050505050505050565b60006020820190508181036000830152613bdc818461350d565b905092915050565b60006020820190508181036000830152613bfd816135f6565b9050919050565b60006020820190508181036000830152613c1d81613619565b9050919050565b60006020820190508181036000830152613c3d8161363c565b9050919050565b60006020820190508181036000830152613c5d8161365f565b9050919050565b60006020820190508181036000830152613c7d81613682565b9050919050565b60006020820190508181036000830152613c9d816136a5565b9050919050565b60006020820190508181036000830152613cbd816136c8565b9050919050565b60006020820190508181036000830152613cdd8161370e565b9050919050565b60006020820190508181036000830152613cfd81613731565b9050919050565b60006020820190508181036000830152613d1d81613754565b9050919050565b60006020820190508181036000830152613d3d81613777565b9050919050565b60006020820190508181036000830152613d5d8161379a565b9050919050565b60006020820190508181036000830152613d7d816137bd565b9050919050565b60006020820190508181036000830152613d9d816137e0565b9050919050565b60006020820190508181036000830152613dbd81613803565b9050919050565b60006020820190508181036000830152613ddd81613826565b9050919050565b60006020820190508181036000830152613dfd81613849565b9050919050565b60006020820190508181036000830152613e1d8161386c565b9050919050565b60006020820190508181036000830152613e3d8161388f565b9050919050565b60006020820190508181036000830152613e5d816138b2565b9050919050565b60006020820190508181036000830152613e7d816138d5565b9050919050565b60006020820190508181036000830152613e9d816138f8565b9050919050565b60006020820190508181036000830152613ebd8161391b565b9050919050565b6000602082019050613ed9600083018461394d565b92915050565b6000604082019050613ef4600083018561394d565b613f01602083018461394d565b9392505050565b6000613f12613f23565b9050613f1e828261428c565b919050565b6000604051905090565b600067ffffffffffffffff821115613f4857613f4761442c565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613f7457613f7361442c565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613fa057613f9f61442c565b5b613fa98261449b565b9050602081019050919050565b600067ffffffffffffffff821115613fd157613fd061442c565b5b613fda8261449b565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061408382614201565b915061408e83614201565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156140c3576140c2614341565b5b828201905092915050565b60006140d982614201565b91506140e483614201565b9250826140f4576140f3614370565b5b828204905092915050565b600061410a82614201565b915061411583614201565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561414e5761414d614341565b5b828202905092915050565b600061416482614201565b915061416f83614201565b92508282101561418257614181614341565b5b828203905092915050565b6000614198826141e1565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561424557808201518184015260208101905061422a565b83811115614254576000848401525b50505050565b6000600282049050600182168061427257607f821691505b60208210811415614286576142856143ce565b5b50919050565b6142958261449b565b810181811067ffffffffffffffff821117156142b4576142b361442c565b5b80604052505050565b60006142c882614201565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156142fb576142fa614341565b5b600182019050919050565b6000819050919050565b600061431b82614201565b915061432683614201565b92508261433657614335614370565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d111561447a5760046000803e6144776000516144ac565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206e6f7220617070726f7665640000000000000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f416c7265616479206d696e746564000000000000000000000000000000000000600082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f556e617574686f72697a65640000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f7574206f662073746f636b0000000000000000000000000000000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c696420617267730000000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243313135353a206275726e20616d6f756e74206578636565647320746f7460008201527f616c537570706c79000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600060443d1015614ab557614b38565b614abd613f23565b60043d036004823e80513d602482011167ffffffffffffffff82111715614ae5575050614b38565b808201805167ffffffffffffffff811115614b035750505050614b38565b80602083010160043d038501811115614b20575050505050614b38565b614b2f8260200185018661428c565b82955050505050505b90565b614b448161418d565b8114614b4f57600080fd5b50565b614b5b8161419f565b8114614b6657600080fd5b50565b614b72816141b5565b8114614b7d57600080fd5b50565b614b8981614201565b8114614b9457600080fd5b5056fea2646970667358221220478098ce84616e5cd0105a9134e89c89c686bf2e4f7a9e10346aecfc5806e86464736f6c63430008070033

Deployed Bytecode Sourcemap

56903:2255:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39215:230;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38238:310;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57275:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57163:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58398:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58591:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41159:439;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59090:65;;;;;;;;;;;;;:::i;:::-;;39611:524;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55693:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58280:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15502:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57580;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18367:103;;;;;;;;;;;;;:::i;:::-;;59023:61;;;;;;;;;;;;;:::i;:::-;;57080:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17719:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57205:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58703:314;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40208:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55482:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57370:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57672:602;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40435:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40675:407;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18625:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39215:230;39301:7;39348:1;39329:21;;:7;:21;;;;39321:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;39415:9;:13;39425:2;39415:13;;;;;;;;;;;:22;39429:7;39415:22;;;;;;;;;;;;;;;;39408:29;;39215:230;;;;:::o;38238:310::-;38340:4;38392:26;38377:41;;;:11;:41;;;;:110;;;;38450:37;38435:52;;;:11;:52;;;;38377:110;:163;;;;38504:36;38528:11;38504:23;:36::i;:::-;38377:163;38357:183;;38238:310;;;:::o;57275:89::-;17605:13;:11;:13::i;:::-;57341:15:::1;57349:6;57341:7;:15::i;:::-;57275:89:::0;:::o;57163:35::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58398:187::-;58468:13;58525:19;58535:8;58525:9;:19::i;:::-;58546;:8;:17;:19::i;:::-;58566:9;58508:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58494:83;;58398:187;;;:::o;58591:106::-;17605:13;:11;:13::i;:::-;58679:10:::1;58667:9;:22;;;;;;;;;;;;:::i;:::-;;58591:106:::0;:::o;41159:439::-;41400:12;:10;:12::i;:::-;41392:20;;:4;:20;;;:60;;;;41416:36;41433:4;41439:12;:10;:12::i;:::-;41416:16;:36::i;:::-;41392:60;41370:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;41538:52;41561:4;41567:2;41571:3;41576:7;41585:4;41538:22;:52::i;:::-;41159:439;;;;;:::o;59090:65::-;17605:13;:11;:13::i;:::-;59137:10:::1;:8;:10::i;:::-;59090:65::o:0;39611:524::-;39767:16;39828:3;:10;39809:8;:15;:29;39801:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;39897:30;39944:8;:15;39930:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39897:63;;39978:9;39973:122;39997:8;:15;39993:1;:19;39973:122;;;40053:30;40063:8;40072:1;40063:11;;;;;;;;:::i;:::-;;;;;;;;40076:3;40080:1;40076:6;;;;;;;;:::i;:::-;;;;;;;;40053:9;:30::i;:::-;40034:13;40048:1;40034:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;40014:3;;;;:::i;:::-;;;39973:122;;;;40114:13;40107:20;;;39611:524;;;;:::o;55693:122::-;55750:4;55806:1;55774:29;55800:2;55774:25;:29::i;:::-;:33;55767:40;;55693:122;;;:::o;58280:112::-;17605:13;:11;:13::i;:::-;58347:4:::1;58339:22;;:45;58362:21;58339:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;58280:112:::0;:::o;15502:86::-;15549:4;15573:7;;;;;;;;;;;15566:14;;15502:86;:::o;57580:::-;17605:13;:11;:13::i;:::-;57642:16:::1;57653:4;57642:10;:16::i;:::-;57580:86:::0;:::o;18367:103::-;17605:13;:11;:13::i;:::-;18432:30:::1;18459:1;18432:18;:30::i;:::-;18367:103::o:0;59023:61::-;17605:13;:11;:13::i;:::-;59068:8:::1;:6;:8::i;:::-;59023:61::o:0;57080:45::-;;;;;;;;;;;;;;;;;:::o;17719:87::-;17765:7;17792:6;;;;;;;;;;;17785:13;;17719:87;:::o;57205:29::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58703:314::-;17605:13;:11;:13::i;:::-;58836:9:::1;:16;58816:9;:16;:36;58808:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;58884:13;58879:131;58909:9;:16;58903:5;:22;58879:131;;;58982:9;58992:5;58982:16;;;;;;;;:::i;:::-;;;;;;;;58950:11;:29;58962:9;58972:5;58962:16;;;;;;;;:::i;:::-;;;;;;;;58950:29;;;;;;;;;;;:48;;;;58927:7;;;;;:::i;:::-;;;;58879:131;;;;58703:314:::0;;:::o;40208:155::-;40303:52;40322:12;:10;:12::i;:::-;40336:8;40346;40303:18;:52::i;:::-;40208:155;;:::o;55482:113::-;55544:7;55571:12;:16;55584:2;55571:16;;;;;;;;;;;;55564:23;;55482:113;;;:::o;57370:204::-;17605:13;:11;:13::i;:::-;57457::::1;57453:114;57483:9;:16;57475:5;:24;57453:114;;;57524:31;57530:9;57540:5;57530:16;;;;;;;;:::i;:::-;;;;;;;;57547:2;57550:1;57524:31;;;;;;;;;;;::::0;:5:::1;:31::i;:::-;57501:7;;;;;:::i;:::-;;;;57453:114;;;;57370:204:::0;;:::o;57672:602::-;15107:19;:17;:19::i;:::-;57855:11:::1;:20;57867:7;57855:20;;;;;;;;;;;;57846:6;57823:20;57835:7;57823:11;:20::i;:::-;:29;;;;:::i;:::-;:52;;57822:91;;;;57912:1;57889:11;:20;57901:7;57889:20;;;;;;;;;;;;:24;57822:91;57814:144;;;;;;;;;;;;:::i;:::-;;;;;;;;;57977:69;57999:4;;58005:7;58014:6;58021:5;58028;;58035:10;57977:21;:69::i;:::-;57969:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;58101:6;58095:5;:12;;;;:::i;:::-;58082:9;:25;58074:34;;;::::0;::::1;;58128:7;:19;58136:10;58128:19;;;;;;;;;;;;;;;:28;58148:7;58128:28;;;;;;;;;;;;;;;;;;;;;58127:29;58119:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;58185:35;58191:10;58202:7;58210:6;58185:35;;;;;;;;;;;::::0;:5:::1;:35::i;:::-;58262:4;58231:7;:19;58239:10;58231:19;;;;;;;;;;;;;;;:28;58251:7;58231:28;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;57672:602:::0;;;;;;;:::o;40435:168::-;40534:4;40558:18;:27;40577:7;40558:27;;;;;;;;;;;;;;;:37;40586:8;40558:37;;;;;;;;;;;;;;;;;;;;;;;;;40551:44;;40435:168;;;;:::o;40675:407::-;40891:12;:10;:12::i;:::-;40883:20;;:4;:20;;;:60;;;;40907:36;40924:4;40930:12;:10;:12::i;:::-;40907:16;:36::i;:::-;40883:60;40861:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;41029:45;41047:4;41053:2;41057;41061:6;41069:4;41029:17;:45::i;:::-;40675:407;;;;;:::o;18625:201::-;17605:13;:11;:13::i;:::-;18734:1:::1;18714:22;;:8;:22;;;;18706:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;18790:28;18809:8;18790:18;:28::i;:::-;18625:201:::0;:::o;29519:157::-;29604:4;29643:25;29628:40;;;:11;:40;;;;29621:47;;29519:157;;;:::o;17884:132::-;17959:12;:10;:12::i;:::-;17948:23;;:7;:5;:7::i;:::-;:23;;;17940:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17884:132::o;45384:88::-;45458:6;45451:4;:13;;;;;;;;;;;;:::i;:::-;;45384:88;:::o;38959:105::-;39019:13;39052:4;39045:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38959:105;;;:::o;430:723::-;486:13;716:1;707:5;:10;703:53;;;734:10;;;;;;;;;;;;;;;;;;;;;703:53;766:12;781:5;766:20;;797:14;822:78;837:1;829:4;:9;822:78;;855:8;;;;;:::i;:::-;;;;886:2;878:10;;;;;:::i;:::-;;;822:78;;;910:19;942:6;932:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;910:39;;960:154;976:1;967:5;:10;960:154;;1004:1;994:11;;;;;:::i;:::-;;;1071:2;1063:5;:10;;;;:::i;:::-;1050:2;:24;;;;:::i;:::-;1037:39;;1020:6;1027;1020:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1100:2;1091:11;;;;;:::i;:::-;;;960:154;;;1138:6;1124:21;;;;;430:723;;;;:::o;13615:98::-;13668:7;13695:10;13688:17;;13615:98;:::o;43394:1146::-;43621:7;:14;43607:3;:10;:28;43599:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;43713:1;43699:16;;:2;:16;;;;43691:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;43770:16;43789:12;:10;:12::i;:::-;43770:31;;43814:60;43835:8;43845:4;43851:2;43855:3;43860:7;43869:4;43814:20;:60::i;:::-;43892:9;43887:421;43911:3;:10;43907:1;:14;43887:421;;;43943:10;43956:3;43960:1;43956:6;;;;;;;;:::i;:::-;;;;;;;;43943:19;;43977:14;43994:7;44002:1;43994:10;;;;;;;;:::i;:::-;;;;;;;;43977:27;;44021:19;44043:9;:13;44053:2;44043:13;;;;;;;;;;;:19;44057:4;44043:19;;;;;;;;;;;;;;;;44021:41;;44100:6;44085:11;:21;;44077:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;44233:6;44219:11;:20;44197:9;:13;44207:2;44197:13;;;;;;;;;;;:19;44211:4;44197:19;;;;;;;;;;;;;;;:42;;;;44290:6;44269:9;:13;44279:2;44269:13;;;;;;;;;;;:17;44283:2;44269:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;43928:380;;;43923:3;;;;:::i;:::-;;;43887:421;;;;44355:2;44325:47;;44349:4;44325:47;;44339:8;44325:47;;;44359:3;44364:7;44325:47;;;;;;;:::i;:::-;;;;;;;;44385:59;44405:8;44415:4;44421:2;44425:3;44430:7;44439:4;44385:19;:59::i;:::-;44457:75;44493:8;44503:4;44509:2;44513:3;44518:7;44527:4;44457:35;:75::i;:::-;43588:952;43394:1146;;;;;:::o;16357:120::-;15366:16;:14;:16::i;:::-;16426:5:::1;16416:7;;:15;;;;;;;;;;;;;;;;;;16447:22;16456:12;:10;:12::i;:::-;16447:22;;;;;;:::i;:::-;;;;;;;;16357:120::o:0;11716:126::-;11786:10;11776:7;;:20;;;;;;;;;;;;;;;;;;11812:22;11826:7;;;;;;;;;;;11812:22;;;;;;:::i;:::-;;;;;;;;11716:126;:::o;18986:191::-;19060:16;19079:6;;;;;;;;;;;19060:25;;19105:8;19096:6;;:17;;;;;;;;;;;;;;;;;;19160:8;19129:40;;19150:8;19129:40;;;;;;;;;;;;19049:128;18986:191;:::o;16098:118::-;15107:19;:17;:19::i;:::-;16168:4:::1;16158:7;;:14;;;;;;;;;;;;;;;;;;16188:20;16195:12;:10;:12::i;:::-;16188:20;;;;;;:::i;:::-;;;;;;;;16098:118::o:0;50271:331::-;50426:8;50417:17;;:5;:17;;;;50409:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;50529:8;50491:18;:25;50510:5;50491:25;;;;;;;;;;;;;;;:35;50517:8;50491:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;50575:8;50553:41;;50568:5;50553:41;;;50585:8;50553:41;;;;;;:::i;:::-;;;;;;;;50271:331;;;:::o;45858:729::-;46025:1;46011:16;;:2;:16;;;;46003:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;46078:16;46097:12;:10;:12::i;:::-;46078:31;;46120:20;46143:21;46161:2;46143:17;:21::i;:::-;46120:44;;46175:24;46202:25;46220:6;46202:17;:25::i;:::-;46175:52;;46240:66;46261:8;46279:1;46283:2;46287:3;46292:7;46301:4;46240:20;:66::i;:::-;46340:6;46319:9;:13;46329:2;46319:13;;;;;;;;;;;:17;46333:2;46319:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;46399:2;46362:52;;46395:1;46362:52;;46377:8;46362:52;;;46403:2;46407:6;46362:52;;;;;;;:::i;:::-;;;;;;;;46427:65;46447:8;46465:1;46469:2;46473:3;46478:7;46487:4;46427:19;:65::i;:::-;46505:74;46536:8;46554:1;46558:2;46562;46566:6;46574:4;46505:30;:74::i;:::-;45992:595;;;45858:729;;;;:::o;15661:108::-;15732:8;:6;:8::i;:::-;15731:9;15723:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;15661:108::o;12601:330::-;12829:4;12916:7;;;;;;;;;;;12853:70;;:59;12864:5;;12871:7;12880;12888:5;12895:8;12905:6;;12853:10;:59::i;:::-;:70;;;12846:77;;12601:330;;;;;;;;;;:::o;42062:974::-;42264:1;42250:16;;:2;:16;;;;42242:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;42321:16;42340:12;:10;:12::i;:::-;42321:31;;42363:20;42386:21;42404:2;42386:17;:21::i;:::-;42363:44;;42418:24;42445:25;42463:6;42445:17;:25::i;:::-;42418:52;;42483:60;42504:8;42514:4;42520:2;42524:3;42529:7;42538:4;42483:20;:60::i;:::-;42556:19;42578:9;:13;42588:2;42578:13;;;;;;;;;;;:19;42592:4;42578:19;;;;;;;;;;;;;;;;42556:41;;42631:6;42616:11;:21;;42608:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;42756:6;42742:11;:20;42720:9;:13;42730:2;42720:13;;;;;;;;;;;:19;42734:4;42720:19;;;;;;;;;;;;;;;:42;;;;42805:6;42784:9;:13;42794:2;42784:13;;;;;;;;;;;:17;42798:2;42784:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;42860:2;42829:46;;42854:4;42829:46;;42844:8;42829:46;;;42864:2;42868:6;42829:46;;;;;;;:::i;:::-;;;;;;;;42888:59;42908:8;42918:4;42924:2;42928:3;42933:7;42942:4;42888:19;:59::i;:::-;42960:68;42991:8;43001:4;43007:2;43011;43015:6;43023:4;42960:30;:68::i;:::-;42231:805;;;;42062:974;;;;;:::o;55890:931::-;56129:66;56156:8;56166:4;56172:2;56176:3;56181:7;56190:4;56129:26;:66::i;:::-;56228:1;56212:18;;:4;:18;;;56208:160;;;56252:9;56247:110;56271:3;:10;56267:1;:14;56247:110;;;56331:7;56339:1;56331:10;;;;;;;;:::i;:::-;;;;;;;;56307:12;:20;56320:3;56324:1;56320:6;;;;;;;;:::i;:::-;;;;;;;;56307:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;56283:3;;;;:::i;:::-;;;56247:110;;;;56208:160;56398:1;56384:16;;:2;:16;;;56380:434;;;56422:9;56417:386;56441:3;:10;56437:1;:14;56417:386;;;56477:10;56490:3;56494:1;56490:6;;;;;;;;:::i;:::-;;;;;;;;56477:19;;56515:14;56532:7;56540:1;56532:10;;;;;;;;:::i;:::-;;;;;;;;56515:27;;56561:14;56578:12;:16;56591:2;56578:16;;;;;;;;;;;;56561:33;;56631:6;56621;:16;;56613:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;56762:6;56753;:15;56734:12;:16;56747:2;56734:16;;;;;;;;;;;:34;;;;56458:345;;;56453:3;;;;:::i;:::-;;;56417:386;;;;56380:434;55890:931;;;;;;:::o;52736:220::-;;;;;;;:::o;53716:813::-;53956:15;:2;:13;;;:15::i;:::-;53952:570;;;54009:2;53992:43;;;54036:8;54046:4;54052:3;54057:7;54066:4;53992:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;53988:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;54384:6;54377:14;;;;;;;;;;;:::i;:::-;;;;;;;;53988:523;;;54433:62;;;;;;;;;;:::i;:::-;;;;;;;;53988:523;54165:48;;;54153:60;;;:8;:60;;;;54149:159;;54238:50;;;;;;;;;;:::i;:::-;;;;;;;;54149:159;54072:251;53952:570;53716:813;;;;;;:::o;15846:108::-;15913:8;:6;:8::i;:::-;15905:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;15846:108::o;54537:198::-;54603:16;54632:22;54671:1;54657:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54632:41;;54695:7;54684:5;54690:1;54684:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;54722:5;54715:12;;;54537:198;;;:::o;52964:744::-;53179:15;:2;:13;;;:15::i;:::-;53175:526;;;53232:2;53215:38;;;53254:8;53264:4;53270:2;53274:6;53282:4;53215:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;53211:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;53563:6;53556:14;;;;;;;;;;;:::i;:::-;;;;;;;;53211:479;;;53612:62;;;;;;;;;;:::i;:::-;;;;;;;;53211:479;53349:43;;;53337:55;;;:8;:55;;;;53333:154;;53417:50;;;;;;;;;;:::i;:::-;;;;;;;;53333:154;53288:214;53175:526;52964:744;;;;;;:::o;12327:266::-;12492:7;12519:66;12528:48;12534:5;;12541:8;12550:7;12559:6;12567:8;12528:5;:48::i;:::-;12578:6;;12519:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:8;:66::i;:::-;12512:73;;12327:266;;;;;;;;;;:::o;51560:221::-;;;;;;;:::o;20417:326::-;20477:4;20734:1;20712:7;:19;;;:23;20705:30;;20417:326;;;:::o;11850:275::-;12006:7;12059:5;;12066:8;12076:7;12084:6;12100:4;12107:8;12048:68;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;12038:79;;;;;;12031:86;;11850:275;;;;;;;;:::o;12133:186::-;12235:7;12267:44;12305:5;12267:29;:4;:27;:29::i;:::-;:37;;:44;;;;:::i;:::-;12260:51;;12133:186;;;;:::o;10155:269::-;10224:7;10410:4;10357:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;10347:69;;;;;;10340:76;;10155:269;;;:::o;6353:231::-;6431:7;6452:17;6471:18;6493:27;6504:4;6510:9;6493:10;:27::i;:::-;6451:69;;;;6531:18;6543:5;6531:11;:18::i;:::-;6567:9;6560:16;;;;6353:231;;;;:::o;4804:747::-;4885:7;4894:12;4943:2;4923:9;:16;:22;4919:625;;;4962:9;4986;5010:7;5267:4;5256:9;5252:20;5246:27;5241:32;;5317:4;5306:9;5302:20;5296:27;5291:32;;5375:4;5364:9;5360:20;5354:27;5351:1;5346:36;5341:41;;5418:25;5429:4;5435:1;5438;5441;5418:10;:25::i;:::-;5411:32;;;;;;;;;4919:625;5492:1;5496:35;5476:56;;;;4804:747;;;;;;:::o;3075:643::-;3153:20;3144:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;3140:571;;;3190:7;;3140:571;3251:29;3242:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;3238:473;;;3297:34;;;;;;;;;;:::i;:::-;;;;;;;;3238:473;3362:35;3353:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;3349:362;;;3414:41;;;;;;;;;;:::i;:::-;;;;;;;;3349:362;3486:30;3477:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;3473:238;;;3533:44;;;;;;;;;;:::i;:::-;;;;;;;;3473:238;3608:30;3599:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;3595:116;;;3655:44;;;;;;;;;;:::i;:::-;;;;;;;;3595:116;3075:643;;:::o;7805:1632::-;7936:7;7945:12;8870:66;8865:1;8857:10;;:79;8853:163;;;8969:1;8973:30;8953:51;;;;;;8853:163;9035:2;9030:1;:7;;;;:18;;;;;9046:2;9041:1;:7;;;;9030:18;9026:102;;;9081:1;9085:30;9065:51;;;;;;9026:102;9225:14;9242:24;9252:4;9258:1;9261;9264;9242:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9225:41;;9299:1;9281:20;;:6;:20;;;9277:103;;;9334:1;9338:29;9318:50;;;;;;;9277:103;9400:6;9408:20;9392:37;;;;;7805:1632;;;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:412::-;1991:5;2016:66;2032:49;2074:6;2032:49;:::i;:::-;2016:66;:::i;:::-;2007:75;;2105:6;2098:5;2091:21;2143:4;2136:5;2132:16;2181:3;2172:6;2167:3;2163:16;2160:25;2157:112;;;2188:79;;:::i;:::-;2157:112;2278:41;2312:6;2307:3;2302;2278:41;:::i;:::-;1997:328;1913:412;;;;;:::o;2331:139::-;2377:5;2415:6;2402:20;2393:29;;2431:33;2458:5;2431:33;:::i;:::-;2331:139;;;;:::o;2493:370::-;2564:5;2613:3;2606:4;2598:6;2594:17;2590:27;2580:122;;2621:79;;:::i;:::-;2580:122;2738:6;2725:20;2763:94;2853:3;2845:6;2838:4;2830:6;2826:17;2763:94;:::i;:::-;2754:103;;2570:293;2493:370;;;;:::o;2886:::-;2957:5;3006:3;2999:4;2991:6;2987:17;2983:27;2973:122;;3014:79;;:::i;:::-;2973:122;3131:6;3118:20;3156:94;3246:3;3238:6;3231:4;3223:6;3219:17;3156:94;:::i;:::-;3147:103;;2963:293;2886:370;;;;:::o;3262:133::-;3305:5;3343:6;3330:20;3321:29;;3359:30;3383:5;3359:30;:::i;:::-;3262:133;;;;:::o;3401:137::-;3446:5;3484:6;3471:20;3462:29;;3500:32;3526:5;3500:32;:::i;:::-;3401:137;;;;:::o;3544:141::-;3600:5;3631:6;3625:13;3616:22;;3647:32;3673:5;3647:32;:::i;:::-;3544:141;;;;:::o;3704:552::-;3761:8;3771:6;3821:3;3814:4;3806:6;3802:17;3798:27;3788:122;;3829:79;;:::i;:::-;3788:122;3942:6;3929:20;3919:30;;3972:18;3964:6;3961:30;3958:117;;;3994:79;;:::i;:::-;3958:117;4108:4;4100:6;4096:17;4084:29;;4162:3;4154:4;4146:6;4142:17;4132:8;4128:32;4125:41;4122:128;;;4169:79;;:::i;:::-;4122:128;3704:552;;;;;:::o;4275:338::-;4330:5;4379:3;4372:4;4364:6;4360:17;4356:27;4346:122;;4387:79;;:::i;:::-;4346:122;4504:6;4491:20;4529:78;4603:3;4595:6;4588:4;4580:6;4576:17;4529:78;:::i;:::-;4520:87;;4336:277;4275:338;;;;:::o;4633:553::-;4691:8;4701:6;4751:3;4744:4;4736:6;4732:17;4728:27;4718:122;;4759:79;;:::i;:::-;4718:122;4872:6;4859:20;4849:30;;4902:18;4894:6;4891:30;4888:117;;;4924:79;;:::i;:::-;4888:117;5038:4;5030:6;5026:17;5014:29;;5092:3;5084:4;5076:6;5072:17;5062:8;5058:32;5055:41;5052:128;;;5099:79;;:::i;:::-;5052:128;4633:553;;;;;:::o;5206:340::-;5262:5;5311:3;5304:4;5296:6;5292:17;5288:27;5278:122;;5319:79;;:::i;:::-;5278:122;5436:6;5423:20;5461:79;5536:3;5528:6;5521:4;5513:6;5509:17;5461:79;:::i;:::-;5452:88;;5268:278;5206:340;;;;:::o;5552:139::-;5598:5;5636:6;5623:20;5614:29;;5652:33;5679:5;5652:33;:::i;:::-;5552:139;;;;:::o;5697:329::-;5756:6;5805:2;5793:9;5784:7;5780:23;5776:32;5773:119;;;5811:79;;:::i;:::-;5773:119;5931:1;5956:53;6001:7;5992:6;5981:9;5977:22;5956:53;:::i;:::-;5946:63;;5902:117;5697:329;;;;:::o;6032:474::-;6100:6;6108;6157:2;6145:9;6136:7;6132:23;6128:32;6125:119;;;6163:79;;:::i;:::-;6125:119;6283:1;6308:53;6353:7;6344:6;6333:9;6329:22;6308:53;:::i;:::-;6298:63;;6254:117;6410:2;6436:53;6481:7;6472:6;6461:9;6457:22;6436:53;:::i;:::-;6426:63;;6381:118;6032:474;;;;;:::o;6512:1509::-;6666:6;6674;6682;6690;6698;6747:3;6735:9;6726:7;6722:23;6718:33;6715:120;;;6754:79;;:::i;:::-;6715:120;6874:1;6899:53;6944:7;6935:6;6924:9;6920:22;6899:53;:::i;:::-;6889:63;;6845:117;7001:2;7027:53;7072:7;7063:6;7052:9;7048:22;7027:53;:::i;:::-;7017:63;;6972:118;7157:2;7146:9;7142:18;7129:32;7188:18;7180:6;7177:30;7174:117;;;7210:79;;:::i;:::-;7174:117;7315:78;7385:7;7376:6;7365:9;7361:22;7315:78;:::i;:::-;7305:88;;7100:303;7470:2;7459:9;7455:18;7442:32;7501:18;7493:6;7490:30;7487:117;;;7523:79;;:::i;:::-;7487:117;7628:78;7698:7;7689:6;7678:9;7674:22;7628:78;:::i;:::-;7618:88;;7413:303;7783:3;7772:9;7768:19;7755:33;7815:18;7807:6;7804:30;7801:117;;;7837:79;;:::i;:::-;7801:117;7942:62;7996:7;7987:6;7976:9;7972:22;7942:62;:::i;:::-;7932:72;;7726:288;6512:1509;;;;;;;;:::o;8027:1089::-;8131:6;8139;8147;8155;8163;8212:3;8200:9;8191:7;8187:23;8183:33;8180:120;;;8219:79;;:::i;:::-;8180:120;8339:1;8364:53;8409:7;8400:6;8389:9;8385:22;8364:53;:::i;:::-;8354:63;;8310:117;8466:2;8492:53;8537:7;8528:6;8517:9;8513:22;8492:53;:::i;:::-;8482:63;;8437:118;8594:2;8620:53;8665:7;8656:6;8645:9;8641:22;8620:53;:::i;:::-;8610:63;;8565:118;8722:2;8748:53;8793:7;8784:6;8773:9;8769:22;8748:53;:::i;:::-;8738:63;;8693:118;8878:3;8867:9;8863:19;8850:33;8910:18;8902:6;8899:30;8896:117;;;8932:79;;:::i;:::-;8896:117;9037:62;9091:7;9082:6;9071:9;9067:22;9037:62;:::i;:::-;9027:72;;8821:288;8027:1089;;;;;;;;:::o;9122:468::-;9187:6;9195;9244:2;9232:9;9223:7;9219:23;9215:32;9212:119;;;9250:79;;:::i;:::-;9212:119;9370:1;9395:53;9440:7;9431:6;9420:9;9416:22;9395:53;:::i;:::-;9385:63;;9341:117;9497:2;9523:50;9565:7;9556:6;9545:9;9541:22;9523:50;:::i;:::-;9513:60;;9468:115;9122:468;;;;;:::o;9596:474::-;9664:6;9672;9721:2;9709:9;9700:7;9696:23;9692:32;9689:119;;;9727:79;;:::i;:::-;9689:119;9847:1;9872:53;9917:7;9908:6;9897:9;9893:22;9872:53;:::i;:::-;9862:63;;9818:117;9974:2;10000:53;10045:7;10036:6;10025:9;10021:22;10000:53;:::i;:::-;9990:63;;9945:118;9596:474;;;;;:::o;10076:894::-;10194:6;10202;10251:2;10239:9;10230:7;10226:23;10222:32;10219:119;;;10257:79;;:::i;:::-;10219:119;10405:1;10394:9;10390:17;10377:31;10435:18;10427:6;10424:30;10421:117;;;10457:79;;:::i;:::-;10421:117;10562:78;10632:7;10623:6;10612:9;10608:22;10562:78;:::i;:::-;10552:88;;10348:302;10717:2;10706:9;10702:18;10689:32;10748:18;10740:6;10737:30;10734:117;;;10770:79;;:::i;:::-;10734:117;10875:78;10945:7;10936:6;10925:9;10921:22;10875:78;:::i;:::-;10865:88;;10660:303;10076:894;;;;;:::o;10976:684::-;11069:6;11077;11126:2;11114:9;11105:7;11101:23;11097:32;11094:119;;;11132:79;;:::i;:::-;11094:119;11280:1;11269:9;11265:17;11252:31;11310:18;11302:6;11299:30;11296:117;;;11332:79;;:::i;:::-;11296:117;11437:78;11507:7;11498:6;11487:9;11483:22;11437:78;:::i;:::-;11427:88;;11223:302;11564:2;11590:53;11635:7;11626:6;11615:9;11611:22;11590:53;:::i;:::-;11580:63;;11535:118;10976:684;;;;;:::o;11666:894::-;11784:6;11792;11841:2;11829:9;11820:7;11816:23;11812:32;11809:119;;;11847:79;;:::i;:::-;11809:119;11995:1;11984:9;11980:17;11967:31;12025:18;12017:6;12014:30;12011:117;;;12047:79;;:::i;:::-;12011:117;12152:78;12222:7;12213:6;12202:9;12198:22;12152:78;:::i;:::-;12142:88;;11938:302;12307:2;12296:9;12292:18;12279:32;12338:18;12330:6;12327:30;12324:117;;;12360:79;;:::i;:::-;12324:117;12465:78;12535:7;12526:6;12515:9;12511:22;12465:78;:::i;:::-;12455:88;;12250:303;11666:894;;;;;:::o;12566:327::-;12624:6;12673:2;12661:9;12652:7;12648:23;12644:32;12641:119;;;12679:79;;:::i;:::-;12641:119;12799:1;12824:52;12868:7;12859:6;12848:9;12844:22;12824:52;:::i;:::-;12814:62;;12770:116;12566:327;;;;:::o;12899:349::-;12968:6;13017:2;13005:9;12996:7;12992:23;12988:32;12985:119;;;13023:79;;:::i;:::-;12985:119;13143:1;13168:63;13223:7;13214:6;13203:9;13199:22;13168:63;:::i;:::-;13158:73;;13114:127;12899:349;;;;:::o;13254:509::-;13323:6;13372:2;13360:9;13351:7;13347:23;13343:32;13340:119;;;13378:79;;:::i;:::-;13340:119;13526:1;13515:9;13511:17;13498:31;13556:18;13548:6;13545:30;13542:117;;;13578:79;;:::i;:::-;13542:117;13683:63;13738:7;13729:6;13718:9;13714:22;13683:63;:::i;:::-;13673:73;;13469:287;13254:509;;;;:::o;13769:329::-;13828:6;13877:2;13865:9;13856:7;13852:23;13848:32;13845:119;;;13883:79;;:::i;:::-;13845:119;14003:1;14028:53;14073:7;14064:6;14053:9;14049:22;14028:53;:::i;:::-;14018:63;;13974:117;13769:329;;;;:::o;14104:1309::-;14222:6;14230;14238;14246;14254;14262;14270;14319:3;14307:9;14298:7;14294:23;14290:33;14287:120;;;14326:79;;:::i;:::-;14287:120;14446:1;14471:53;14516:7;14507:6;14496:9;14492:22;14471:53;:::i;:::-;14461:63;;14417:117;14573:2;14599:53;14644:7;14635:6;14624:9;14620:22;14599:53;:::i;:::-;14589:63;;14544:118;14701:2;14727:53;14772:7;14763:6;14752:9;14748:22;14727:53;:::i;:::-;14717:63;;14672:118;14857:2;14846:9;14842:18;14829:32;14888:18;14880:6;14877:30;14874:117;;;14910:79;;:::i;:::-;14874:117;15023:65;15080:7;15071:6;15060:9;15056:22;15023:65;:::i;:::-;15005:83;;;;14800:298;15165:3;15154:9;15150:19;15137:33;15197:18;15189:6;15186:30;15183:117;;;15219:79;;:::i;:::-;15183:117;15332:64;15388:7;15379:6;15368:9;15364:22;15332:64;:::i;:::-;15314:82;;;;15108:298;14104:1309;;;;;;;;;;:::o;15419:179::-;15488:10;15509:46;15551:3;15543:6;15509:46;:::i;:::-;15587:4;15582:3;15578:14;15564:28;;15419:179;;;;:::o;15604:118::-;15691:24;15709:5;15691:24;:::i;:::-;15686:3;15679:37;15604:118;;:::o;15758:732::-;15877:3;15906:54;15954:5;15906:54;:::i;:::-;15976:86;16055:6;16050:3;15976:86;:::i;:::-;15969:93;;16086:56;16136:5;16086:56;:::i;:::-;16165:7;16196:1;16181:284;16206:6;16203:1;16200:13;16181:284;;;16282:6;16276:13;16309:63;16368:3;16353:13;16309:63;:::i;:::-;16302:70;;16395:60;16448:6;16395:60;:::i;:::-;16385:70;;16241:224;16228:1;16225;16221:9;16216:14;;16181:284;;;16185:14;16481:3;16474:10;;15882:608;;;15758:732;;;;:::o;16496:109::-;16577:21;16592:5;16577:21;:::i;:::-;16572:3;16565:34;16496:109;;:::o;16611:118::-;16698:24;16716:5;16698:24;:::i;:::-;16693:3;16686:37;16611:118;;:::o;16735:157::-;16840:45;16860:24;16878:5;16860:24;:::i;:::-;16840:45;:::i;:::-;16835:3;16828:58;16735:157;;:::o;16898:360::-;16984:3;17012:38;17044:5;17012:38;:::i;:::-;17066:70;17129:6;17124:3;17066:70;:::i;:::-;17059:77;;17145:52;17190:6;17185:3;17178:4;17171:5;17167:16;17145:52;:::i;:::-;17222:29;17244:6;17222:29;:::i;:::-;17217:3;17213:39;17206:46;;16988:270;16898:360;;;;:::o;17288:304::-;17386:3;17407:71;17471:6;17466:3;17407:71;:::i;:::-;17400:78;;17488:43;17524:6;17519:3;17512:5;17488:43;:::i;:::-;17556:29;17578:6;17556:29;:::i;:::-;17551:3;17547:39;17540:46;;17288:304;;;;;:::o;17598:364::-;17686:3;17714:39;17747:5;17714:39;:::i;:::-;17769:71;17833:6;17828:3;17769:71;:::i;:::-;17762:78;;17849:52;17894:6;17889:3;17882:4;17875:5;17871:16;17849:52;:::i;:::-;17926:29;17948:6;17926:29;:::i;:::-;17921:3;17917:39;17910:46;;17690:272;17598:364;;;;:::o;17968:377::-;18074:3;18102:39;18135:5;18102:39;:::i;:::-;18157:89;18239:6;18234:3;18157:89;:::i;:::-;18150:96;;18255:52;18300:6;18295:3;18288:4;18281:5;18277:16;18255:52;:::i;:::-;18332:6;18327:3;18323:16;18316:23;;18078:267;17968:377;;;;:::o;18375:845::-;18478:3;18515:5;18509:12;18544:36;18570:9;18544:36;:::i;:::-;18596:89;18678:6;18673:3;18596:89;:::i;:::-;18589:96;;18716:1;18705:9;18701:17;18732:1;18727:137;;;;18878:1;18873:341;;;;18694:520;;18727:137;18811:4;18807:9;18796;18792:25;18787:3;18780:38;18847:6;18842:3;18838:16;18831:23;;18727:137;;18873:341;18940:38;18972:5;18940:38;:::i;:::-;19000:1;19014:154;19028:6;19025:1;19022:13;19014:154;;;19102:7;19096:14;19092:1;19087:3;19083:11;19076:35;19152:1;19143:7;19139:15;19128:26;;19050:4;19047:1;19043:12;19038:17;;19014:154;;;19197:6;19192:3;19188:16;19181:23;;18880:334;;18694:520;;18482:738;;18375:845;;;;:::o;19226:366::-;19368:3;19389:67;19453:2;19448:3;19389:67;:::i;:::-;19382:74;;19465:93;19554:3;19465:93;:::i;:::-;19583:2;19578:3;19574:12;19567:19;;19226:366;;;:::o;19598:::-;19740:3;19761:67;19825:2;19820:3;19761:67;:::i;:::-;19754:74;;19837:93;19926:3;19837:93;:::i;:::-;19955:2;19950:3;19946:12;19939:19;;19598:366;;;:::o;19970:::-;20112:3;20133:67;20197:2;20192:3;20133:67;:::i;:::-;20126:74;;20209:93;20298:3;20209:93;:::i;:::-;20327:2;20322:3;20318:12;20311:19;;19970:366;;;:::o;20342:::-;20484:3;20505:67;20569:2;20564:3;20505:67;:::i;:::-;20498:74;;20581:93;20670:3;20581:93;:::i;:::-;20699:2;20694:3;20690:12;20683:19;;20342:366;;;:::o;20714:::-;20856:3;20877:67;20941:2;20936:3;20877:67;:::i;:::-;20870:74;;20953:93;21042:3;20953:93;:::i;:::-;21071:2;21066:3;21062:12;21055:19;;20714:366;;;:::o;21086:::-;21228:3;21249:67;21313:2;21308:3;21249:67;:::i;:::-;21242:74;;21325:93;21414:3;21325:93;:::i;:::-;21443:2;21438:3;21434:12;21427:19;;21086:366;;;:::o;21458:::-;21600:3;21621:67;21685:2;21680:3;21621:67;:::i;:::-;21614:74;;21697:93;21786:3;21697:93;:::i;:::-;21815:2;21810:3;21806:12;21799:19;;21458:366;;;:::o;21830:402::-;21990:3;22011:85;22093:2;22088:3;22011:85;:::i;:::-;22004:92;;22105:93;22194:3;22105:93;:::i;:::-;22223:2;22218:3;22214:12;22207:19;;21830:402;;;:::o;22238:366::-;22380:3;22401:67;22465:2;22460:3;22401:67;:::i;:::-;22394:74;;22477:93;22566:3;22477:93;:::i;:::-;22595:2;22590:3;22586:12;22579:19;;22238:366;;;:::o;22610:::-;22752:3;22773:67;22837:2;22832:3;22773:67;:::i;:::-;22766:74;;22849:93;22938:3;22849:93;:::i;:::-;22967:2;22962:3;22958:12;22951:19;;22610:366;;;:::o;22982:::-;23124:3;23145:67;23209:2;23204:3;23145:67;:::i;:::-;23138:74;;23221:93;23310:3;23221:93;:::i;:::-;23339:2;23334:3;23330:12;23323:19;;22982:366;;;:::o;23354:::-;23496:3;23517:67;23581:2;23576:3;23517:67;:::i;:::-;23510:74;;23593:93;23682:3;23593:93;:::i;:::-;23711:2;23706:3;23702:12;23695:19;;23354:366;;;:::o;23726:::-;23868:3;23889:67;23953:2;23948:3;23889:67;:::i;:::-;23882:74;;23965:93;24054:3;23965:93;:::i;:::-;24083:2;24078:3;24074:12;24067:19;;23726:366;;;:::o;24098:::-;24240:3;24261:67;24325:2;24320:3;24261:67;:::i;:::-;24254:74;;24337:93;24426:3;24337:93;:::i;:::-;24455:2;24450:3;24446:12;24439:19;;24098:366;;;:::o;24470:::-;24612:3;24633:67;24697:2;24692:3;24633:67;:::i;:::-;24626:74;;24709:93;24798:3;24709:93;:::i;:::-;24827:2;24822:3;24818:12;24811:19;;24470:366;;;:::o;24842:::-;24984:3;25005:67;25069:2;25064:3;25005:67;:::i;:::-;24998:74;;25081:93;25170:3;25081:93;:::i;:::-;25199:2;25194:3;25190:12;25183:19;;24842:366;;;:::o;25214:::-;25356:3;25377:67;25441:2;25436:3;25377:67;:::i;:::-;25370:74;;25453:93;25542:3;25453:93;:::i;:::-;25571:2;25566:3;25562:12;25555:19;;25214:366;;;:::o;25586:::-;25728:3;25749:67;25813:2;25808:3;25749:67;:::i;:::-;25742:74;;25825:93;25914:3;25825:93;:::i;:::-;25943:2;25938:3;25934:12;25927:19;;25586:366;;;:::o;25958:::-;26100:3;26121:67;26185:2;26180:3;26121:67;:::i;:::-;26114:74;;26197:93;26286:3;26197:93;:::i;:::-;26315:2;26310:3;26306:12;26299:19;;25958:366;;;:::o;26330:::-;26472:3;26493:67;26557:2;26552:3;26493:67;:::i;:::-;26486:74;;26569:93;26658:3;26569:93;:::i;:::-;26687:2;26682:3;26678:12;26671:19;;26330:366;;;:::o;26702:::-;26844:3;26865:67;26929:2;26924:3;26865:67;:::i;:::-;26858:74;;26941:93;27030:3;26941:93;:::i;:::-;27059:2;27054:3;27050:12;27043:19;;26702:366;;;:::o;27074:::-;27216:3;27237:67;27301:2;27296:3;27237:67;:::i;:::-;27230:74;;27313:93;27402:3;27313:93;:::i;:::-;27431:2;27426:3;27422:12;27415:19;;27074:366;;;:::o;27446:::-;27588:3;27609:67;27673:2;27668:3;27609:67;:::i;:::-;27602:74;;27685:93;27774:3;27685:93;:::i;:::-;27803:2;27798:3;27794:12;27787:19;;27446:366;;;:::o;27818:::-;27960:3;27981:67;28045:2;28040:3;27981:67;:::i;:::-;27974:74;;28057:93;28146:3;28057:93;:::i;:::-;28175:2;28170:3;28166:12;28159:19;;27818:366;;;:::o;28190:108::-;28267:24;28285:5;28267:24;:::i;:::-;28262:3;28255:37;28190:108;;:::o;28304:118::-;28391:24;28409:5;28391:24;:::i;:::-;28386:3;28379:37;28304:118;;:::o;28428:112::-;28511:22;28527:5;28511:22;:::i;:::-;28506:3;28499:35;28428:112;;:::o;28546:589::-;28771:3;28793:95;28884:3;28875:6;28793:95;:::i;:::-;28786:102;;28905:95;28996:3;28987:6;28905:95;:::i;:::-;28898:102;;29017:92;29105:3;29096:6;29017:92;:::i;:::-;29010:99;;29126:3;29119:10;;28546:589;;;;;;:::o;29141:522::-;29354:3;29376:148;29520:3;29376:148;:::i;:::-;29369:155;;29534:75;29605:3;29596:6;29534:75;:::i;:::-;29634:2;29629:3;29625:12;29618:19;;29654:3;29647:10;;29141:522;;;;:::o;29669:222::-;29762:4;29800:2;29789:9;29785:18;29777:26;;29813:71;29881:1;29870:9;29866:17;29857:6;29813:71;:::i;:::-;29669:222;;;;:::o;29897:1053::-;30220:4;30258:3;30247:9;30243:19;30235:27;;30272:71;30340:1;30329:9;30325:17;30316:6;30272:71;:::i;:::-;30353:72;30421:2;30410:9;30406:18;30397:6;30353:72;:::i;:::-;30472:9;30466:4;30462:20;30457:2;30446:9;30442:18;30435:48;30500:108;30603:4;30594:6;30500:108;:::i;:::-;30492:116;;30655:9;30649:4;30645:20;30640:2;30629:9;30625:18;30618:48;30683:108;30786:4;30777:6;30683:108;:::i;:::-;30675:116;;30839:9;30833:4;30829:20;30823:3;30812:9;30808:19;30801:49;30867:76;30938:4;30929:6;30867:76;:::i;:::-;30859:84;;29897:1053;;;;;;;;:::o;30956:751::-;31179:4;31217:3;31206:9;31202:19;31194:27;;31231:71;31299:1;31288:9;31284:17;31275:6;31231:71;:::i;:::-;31312:72;31380:2;31369:9;31365:18;31356:6;31312:72;:::i;:::-;31394;31462:2;31451:9;31447:18;31438:6;31394:72;:::i;:::-;31476;31544:2;31533:9;31529:18;31520:6;31476:72;:::i;:::-;31596:9;31590:4;31586:20;31580:3;31569:9;31565:19;31558:49;31624:76;31695:4;31686:6;31624:76;:::i;:::-;31616:84;;30956:751;;;;;;;;:::o;31713:373::-;31856:4;31894:2;31883:9;31879:18;31871:26;;31943:9;31937:4;31933:20;31929:1;31918:9;31914:17;31907:47;31971:108;32074:4;32065:6;31971:108;:::i;:::-;31963:116;;31713:373;;;;:::o;32092:634::-;32313:4;32351:2;32340:9;32336:18;32328:26;;32400:9;32394:4;32390:20;32386:1;32375:9;32371:17;32364:47;32428:108;32531:4;32522:6;32428:108;:::i;:::-;32420:116;;32583:9;32577:4;32573:20;32568:2;32557:9;32553:18;32546:48;32611:108;32714:4;32705:6;32611:108;:::i;:::-;32603:116;;32092:634;;;;;:::o;32732:210::-;32819:4;32857:2;32846:9;32842:18;32834:26;;32870:65;32932:1;32921:9;32917:17;32908:6;32870:65;:::i;:::-;32732:210;;;;:::o;32948:545::-;33121:4;33159:3;33148:9;33144:19;33136:27;;33173:71;33241:1;33230:9;33226:17;33217:6;33173:71;:::i;:::-;33254:68;33318:2;33307:9;33303:18;33294:6;33254:68;:::i;:::-;33332:72;33400:2;33389:9;33385:18;33376:6;33332:72;:::i;:::-;33414;33482:2;33471:9;33467:18;33458:6;33414:72;:::i;:::-;32948:545;;;;;;;:::o;33499:886::-;33762:4;33800:3;33789:9;33785:19;33777:27;;33850:9;33844:4;33840:20;33836:1;33825:9;33821:17;33814:47;33878:88;33961:4;33952:6;33944;33878:88;:::i;:::-;33870:96;;33976:72;34044:2;34033:9;34029:18;34020:6;33976:72;:::i;:::-;34058;34126:2;34115:9;34111:18;34102:6;34058:72;:::i;:::-;34140;34208:2;34197:9;34193:18;34184:6;34140:72;:::i;:::-;34222:73;34290:3;34279:9;34275:19;34266:6;34222:73;:::i;:::-;34305;34373:3;34362:9;34358:19;34349:6;34305:73;:::i;:::-;33499:886;;;;;;;;;;:::o;34391:313::-;34504:4;34542:2;34531:9;34527:18;34519:26;;34591:9;34585:4;34581:20;34577:1;34566:9;34562:17;34555:47;34619:78;34692:4;34683:6;34619:78;:::i;:::-;34611:86;;34391:313;;;;:::o;34710:419::-;34876:4;34914:2;34903:9;34899:18;34891:26;;34963:9;34957:4;34953:20;34949:1;34938:9;34934:17;34927:47;34991:131;35117:4;34991:131;:::i;:::-;34983:139;;34710:419;;;:::o;35135:::-;35301:4;35339:2;35328:9;35324:18;35316:26;;35388:9;35382:4;35378:20;35374:1;35363:9;35359:17;35352:47;35416:131;35542:4;35416:131;:::i;:::-;35408:139;;35135:419;;;:::o;35560:::-;35726:4;35764:2;35753:9;35749:18;35741:26;;35813:9;35807:4;35803:20;35799:1;35788:9;35784:17;35777:47;35841:131;35967:4;35841:131;:::i;:::-;35833:139;;35560:419;;;:::o;35985:::-;36151:4;36189:2;36178:9;36174:18;36166:26;;36238:9;36232:4;36228:20;36224:1;36213:9;36209:17;36202:47;36266:131;36392:4;36266:131;:::i;:::-;36258:139;;35985:419;;;:::o;36410:::-;36576:4;36614:2;36603:9;36599:18;36591:26;;36663:9;36657:4;36653:20;36649:1;36638:9;36634:17;36627:47;36691:131;36817:4;36691:131;:::i;:::-;36683:139;;36410:419;;;:::o;36835:::-;37001:4;37039:2;37028:9;37024:18;37016:26;;37088:9;37082:4;37078:20;37074:1;37063:9;37059:17;37052:47;37116:131;37242:4;37116:131;:::i;:::-;37108:139;;36835:419;;;:::o;37260:::-;37426:4;37464:2;37453:9;37449:18;37441:26;;37513:9;37507:4;37503:20;37499:1;37488:9;37484:17;37477:47;37541:131;37667:4;37541:131;:::i;:::-;37533:139;;37260:419;;;:::o;37685:::-;37851:4;37889:2;37878:9;37874:18;37866:26;;37938:9;37932:4;37928:20;37924:1;37913:9;37909:17;37902:47;37966:131;38092:4;37966:131;:::i;:::-;37958:139;;37685:419;;;:::o;38110:::-;38276:4;38314:2;38303:9;38299:18;38291:26;;38363:9;38357:4;38353:20;38349:1;38338:9;38334:17;38327:47;38391:131;38517:4;38391:131;:::i;:::-;38383:139;;38110:419;;;:::o;38535:::-;38701:4;38739:2;38728:9;38724:18;38716:26;;38788:9;38782:4;38778:20;38774:1;38763:9;38759:17;38752:47;38816:131;38942:4;38816:131;:::i;:::-;38808:139;;38535:419;;;:::o;38960:::-;39126:4;39164:2;39153:9;39149:18;39141:26;;39213:9;39207:4;39203:20;39199:1;39188:9;39184:17;39177:47;39241:131;39367:4;39241:131;:::i;:::-;39233:139;;38960:419;;;:::o;39385:::-;39551:4;39589:2;39578:9;39574:18;39566:26;;39638:9;39632:4;39628:20;39624:1;39613:9;39609:17;39602:47;39666:131;39792:4;39666:131;:::i;:::-;39658:139;;39385:419;;;:::o;39810:::-;39976:4;40014:2;40003:9;39999:18;39991:26;;40063:9;40057:4;40053:20;40049:1;40038:9;40034:17;40027:47;40091:131;40217:4;40091:131;:::i;:::-;40083:139;;39810:419;;;:::o;40235:::-;40401:4;40439:2;40428:9;40424:18;40416:26;;40488:9;40482:4;40478:20;40474:1;40463:9;40459:17;40452:47;40516:131;40642:4;40516:131;:::i;:::-;40508:139;;40235:419;;;:::o;40660:::-;40826:4;40864:2;40853:9;40849:18;40841:26;;40913:9;40907:4;40903:20;40899:1;40888:9;40884:17;40877:47;40941:131;41067:4;40941:131;:::i;:::-;40933:139;;40660:419;;;:::o;41085:::-;41251:4;41289:2;41278:9;41274:18;41266:26;;41338:9;41332:4;41328:20;41324:1;41313:9;41309:17;41302:47;41366:131;41492:4;41366:131;:::i;:::-;41358:139;;41085:419;;;:::o;41510:::-;41676:4;41714:2;41703:9;41699:18;41691:26;;41763:9;41757:4;41753:20;41749:1;41738:9;41734:17;41727:47;41791:131;41917:4;41791:131;:::i;:::-;41783:139;;41510:419;;;:::o;41935:::-;42101:4;42139:2;42128:9;42124:18;42116:26;;42188:9;42182:4;42178:20;42174:1;42163:9;42159:17;42152:47;42216:131;42342:4;42216:131;:::i;:::-;42208:139;;41935:419;;;:::o;42360:::-;42526:4;42564:2;42553:9;42549:18;42541:26;;42613:9;42607:4;42603:20;42599:1;42588:9;42584:17;42577:47;42641:131;42767:4;42641:131;:::i;:::-;42633:139;;42360:419;;;:::o;42785:::-;42951:4;42989:2;42978:9;42974:18;42966:26;;43038:9;43032:4;43028:20;43024:1;43013:9;43009:17;43002:47;43066:131;43192:4;43066:131;:::i;:::-;43058:139;;42785:419;;;:::o;43210:::-;43376:4;43414:2;43403:9;43399:18;43391:26;;43463:9;43457:4;43453:20;43449:1;43438:9;43434:17;43427:47;43491:131;43617:4;43491:131;:::i;:::-;43483:139;;43210:419;;;:::o;43635:::-;43801:4;43839:2;43828:9;43824:18;43816:26;;43888:9;43882:4;43878:20;43874:1;43863:9;43859:17;43852:47;43916:131;44042:4;43916:131;:::i;:::-;43908:139;;43635:419;;;:::o;44060:::-;44226:4;44264:2;44253:9;44249:18;44241:26;;44313:9;44307:4;44303:20;44299:1;44288:9;44284:17;44277:47;44341:131;44467:4;44341:131;:::i;:::-;44333:139;;44060:419;;;:::o;44485:222::-;44578:4;44616:2;44605:9;44601:18;44593:26;;44629:71;44697:1;44686:9;44682:17;44673:6;44629:71;:::i;:::-;44485:222;;;;:::o;44713:332::-;44834:4;44872:2;44861:9;44857:18;44849:26;;44885:71;44953:1;44942:9;44938:17;44929:6;44885:71;:::i;:::-;44966:72;45034:2;45023:9;45019:18;45010:6;44966:72;:::i;:::-;44713:332;;;;;:::o;45051:129::-;45085:6;45112:20;;:::i;:::-;45102:30;;45141:33;45169:4;45161:6;45141:33;:::i;:::-;45051:129;;;:::o;45186:75::-;45219:6;45252:2;45246:9;45236:19;;45186:75;:::o;45267:311::-;45344:4;45434:18;45426:6;45423:30;45420:56;;;45456:18;;:::i;:::-;45420:56;45506:4;45498:6;45494:17;45486:25;;45566:4;45560;45556:15;45548:23;;45267:311;;;:::o;45584:::-;45661:4;45751:18;45743:6;45740:30;45737:56;;;45773:18;;:::i;:::-;45737:56;45823:4;45815:6;45811:17;45803:25;;45883:4;45877;45873:15;45865:23;;45584:311;;;:::o;45901:307::-;45962:4;46052:18;46044:6;46041:30;46038:56;;;46074:18;;:::i;:::-;46038:56;46112:29;46134:6;46112:29;:::i;:::-;46104:37;;46196:4;46190;46186:15;46178:23;;45901:307;;;:::o;46214:308::-;46276:4;46366:18;46358:6;46355:30;46352:56;;;46388:18;;:::i;:::-;46352:56;46426:29;46448:6;46426:29;:::i;:::-;46418:37;;46510:4;46504;46500:15;46492:23;;46214:308;;;:::o;46528:132::-;46595:4;46618:3;46610:11;;46648:4;46643:3;46639:14;46631:22;;46528:132;;;:::o;46666:141::-;46715:4;46738:3;46730:11;;46761:3;46758:1;46751:14;46795:4;46792:1;46782:18;46774:26;;46666:141;;;:::o;46813:114::-;46880:6;46914:5;46908:12;46898:22;;46813:114;;;:::o;46933:98::-;46984:6;47018:5;47012:12;47002:22;;46933:98;;;:::o;47037:99::-;47089:6;47123:5;47117:12;47107:22;;47037:99;;;:::o;47142:113::-;47212:4;47244;47239:3;47235:14;47227:22;;47142:113;;;:::o;47261:184::-;47360:11;47394:6;47389:3;47382:19;47434:4;47429:3;47425:14;47410:29;;47261:184;;;;:::o;47451:168::-;47534:11;47568:6;47563:3;47556:19;47608:4;47603:3;47599:14;47584:29;;47451:168;;;;:::o;47625:169::-;47709:11;47743:6;47738:3;47731:19;47783:4;47778:3;47774:14;47759:29;;47625:169;;;;:::o;47800:148::-;47902:11;47939:3;47924:18;;47800:148;;;;:::o;47954:305::-;47994:3;48013:20;48031:1;48013:20;:::i;:::-;48008:25;;48047:20;48065:1;48047:20;:::i;:::-;48042:25;;48201:1;48133:66;48129:74;48126:1;48123:81;48120:107;;;48207:18;;:::i;:::-;48120:107;48251:1;48248;48244:9;48237:16;;47954:305;;;;:::o;48265:185::-;48305:1;48322:20;48340:1;48322:20;:::i;:::-;48317:25;;48356:20;48374:1;48356:20;:::i;:::-;48351:25;;48395:1;48385:35;;48400:18;;:::i;:::-;48385:35;48442:1;48439;48435:9;48430:14;;48265:185;;;;:::o;48456:348::-;48496:7;48519:20;48537:1;48519:20;:::i;:::-;48514:25;;48553:20;48571:1;48553:20;:::i;:::-;48548:25;;48741:1;48673:66;48669:74;48666:1;48663:81;48658:1;48651:9;48644:17;48640:105;48637:131;;;48748:18;;:::i;:::-;48637:131;48796:1;48793;48789:9;48778:20;;48456:348;;;;:::o;48810:191::-;48850:4;48870:20;48888:1;48870:20;:::i;:::-;48865:25;;48904:20;48922:1;48904:20;:::i;:::-;48899:25;;48943:1;48940;48937:8;48934:34;;;48948:18;;:::i;:::-;48934:34;48993:1;48990;48986:9;48978:17;;48810:191;;;;:::o;49007:96::-;49044:7;49073:24;49091:5;49073:24;:::i;:::-;49062:35;;49007:96;;;:::o;49109:90::-;49143:7;49186:5;49179:13;49172:21;49161:32;;49109:90;;;:::o;49205:77::-;49242:7;49271:5;49260:16;;49205:77;;;:::o;49288:149::-;49324:7;49364:66;49357:5;49353:78;49342:89;;49288:149;;;:::o;49443:126::-;49480:7;49520:42;49513:5;49509:54;49498:65;;49443:126;;;:::o;49575:77::-;49612:7;49641:5;49630:16;;49575:77;;;:::o;49658:86::-;49693:7;49733:4;49726:5;49722:16;49711:27;;49658:86;;;:::o;49750:154::-;49834:6;49829:3;49824;49811:30;49896:1;49887:6;49882:3;49878:16;49871:27;49750:154;;;:::o;49910:307::-;49978:1;49988:113;50002:6;49999:1;49996:13;49988:113;;;50087:1;50082:3;50078:11;50072:18;50068:1;50063:3;50059:11;50052:39;50024:2;50021:1;50017:10;50012:15;;49988:113;;;50119:6;50116:1;50113:13;50110:101;;;50199:1;50190:6;50185:3;50181:16;50174:27;50110:101;49959:258;49910:307;;;:::o;50223:320::-;50267:6;50304:1;50298:4;50294:12;50284:22;;50351:1;50345:4;50341:12;50372:18;50362:81;;50428:4;50420:6;50416:17;50406:27;;50362:81;50490:2;50482:6;50479:14;50459:18;50456:38;50453:84;;;50509:18;;:::i;:::-;50453:84;50274:269;50223:320;;;:::o;50549:281::-;50632:27;50654:4;50632:27;:::i;:::-;50624:6;50620:40;50762:6;50750:10;50747:22;50726:18;50714:10;50711:34;50708:62;50705:88;;;50773:18;;:::i;:::-;50705:88;50813:10;50809:2;50802:22;50592:238;50549:281;;:::o;50836:233::-;50875:3;50898:24;50916:5;50898:24;:::i;:::-;50889:33;;50944:66;50937:5;50934:77;50931:103;;;51014:18;;:::i;:::-;50931:103;51061:1;51054:5;51050:13;51043:20;;50836:233;;;:::o;51075:79::-;51114:7;51143:5;51132:16;;51075:79;;;:::o;51160:176::-;51192:1;51209:20;51227:1;51209:20;:::i;:::-;51204:25;;51243:20;51261:1;51243:20;:::i;:::-;51238:25;;51282:1;51272:35;;51287:18;;:::i;:::-;51272:35;51328:1;51325;51321:9;51316:14;;51160:176;;;;:::o;51342:180::-;51390:77;51387:1;51380:88;51487:4;51484:1;51477:15;51511:4;51508:1;51501:15;51528:180;51576:77;51573:1;51566:88;51673:4;51670:1;51663:15;51697:4;51694:1;51687:15;51714:180;51762:77;51759:1;51752:88;51859:4;51856:1;51849:15;51883:4;51880:1;51873:15;51900:180;51948:77;51945:1;51938:88;52045:4;52042:1;52035:15;52069:4;52066:1;52059:15;52086:180;52134:77;52131:1;52124:88;52231:4;52228:1;52221:15;52255:4;52252:1;52245:15;52272:180;52320:77;52317:1;52310:88;52417:4;52414:1;52407:15;52441:4;52438:1;52431:15;52458:183;52493:3;52531:1;52513:16;52510:23;52507:128;;;52569:1;52566;52563;52548:23;52591:34;52622:1;52616:8;52591:34;:::i;:::-;52584:41;;52507:128;52458:183;:::o;52647:117::-;52756:1;52753;52746:12;52770:117;52879:1;52876;52869:12;52893:117;53002:1;52999;52992:12;53016:117;53125:1;53122;53115:12;53139:117;53248:1;53245;53238:12;53262:117;53371:1;53368;53361:12;53385:102;53426:6;53477:2;53473:7;53468:2;53461:5;53457:14;53453:28;53443:38;;53385:102;;;:::o;53493:106::-;53537:8;53586:5;53581:3;53577:15;53556:36;;53493:106;;;:::o;53605:174::-;53745:26;53741:1;53733:6;53729:14;53722:50;53605:174;:::o;53785:239::-;53925:34;53921:1;53913:6;53909:14;53902:58;53994:22;53989:2;53981:6;53977:15;53970:47;53785:239;:::o;54030:234::-;54170:34;54166:1;54158:6;54154:14;54147:58;54239:17;54234:2;54226:6;54222:15;54215:42;54030:234;:::o;54270:227::-;54410:34;54406:1;54398:6;54394:14;54387:58;54479:10;54474:2;54466:6;54462:15;54455:35;54270:227;:::o;54503:164::-;54643:16;54639:1;54631:6;54627:14;54620:40;54503:164;:::o;54673:170::-;54813:22;54809:1;54801:6;54797:14;54790:46;54673:170;:::o;54849:181::-;54989:33;54985:1;54977:6;54973:14;54966:57;54849:181;:::o;55036:214::-;55176:66;55172:1;55164:6;55160:14;55153:90;55036:214;:::o;55256:162::-;55396:14;55392:1;55384:6;55380:14;55373:38;55256:162;:::o;55424:225::-;55564:34;55560:1;55552:6;55548:14;55541:58;55633:8;55628:2;55620:6;55616:15;55609:33;55424:225;:::o;55655:229::-;55795:34;55791:1;55783:6;55779:14;55772:58;55864:12;55859:2;55851:6;55847:15;55840:37;55655:229;:::o;55890:221::-;56030:34;56026:1;56018:6;56014:14;56007:58;56099:4;56094:2;56086:6;56082:15;56075:29;55890:221;:::o;56117:162::-;56257:14;56253:1;56245:6;56241:14;56234:38;56117:162;:::o;56285:166::-;56425:18;56421:1;56413:6;56409:14;56402:42;56285:166;:::o;56457:224::-;56597:34;56593:1;56585:6;56581:14;56574:58;56666:7;56661:2;56653:6;56649:15;56642:32;56457:224;:::o;56687:162::-;56827:14;56823:1;56815:6;56811:14;56804:38;56687:162;:::o;56855:221::-;56995:34;56991:1;56983:6;56979:14;56972:58;57064:4;57059:2;57051:6;57047:15;57040:29;56855:221;:::o;57082:229::-;57222:34;57218:1;57210:6;57206:14;57199:58;57291:12;57286:2;57278:6;57274:15;57267:37;57082:229;:::o;57317:182::-;57457:34;57453:1;57445:6;57441:14;57434:58;57317:182;:::o;57505:227::-;57645:34;57641:1;57633:6;57629:14;57622:58;57714:10;57709:2;57701:6;57697:15;57690:35;57505:227;:::o;57738:228::-;57878:34;57874:1;57866:6;57862:14;57855:58;57947:11;57942:2;57934:6;57930:15;57923:36;57738:228;:::o;57972:::-;58112:34;58108:1;58100:6;58096:14;58089:58;58181:11;58176:2;58168:6;58164:15;58157:36;57972:228;:::o;58206:227::-;58346:34;58342:1;58334:6;58330:14;58323:58;58415:10;58410:2;58402:6;58398:15;58391:35;58206:227;:::o;58439:220::-;58579:34;58575:1;58567:6;58563:14;58556:58;58648:3;58643:2;58635:6;58631:15;58624:28;58439:220;:::o;58665:711::-;58704:3;58742:4;58724:16;58721:26;58718:39;;;58750:5;;58718:39;58779:20;;:::i;:::-;58854:1;58836:16;58832:24;58829:1;58823:4;58808:49;58887:4;58881:11;58986:16;58979:4;58971:6;58967:17;58964:39;58931:18;58923:6;58920:30;58904:113;58901:146;;;59032:5;;;;58901:146;59078:6;59072:4;59068:17;59114:3;59108:10;59141:18;59133:6;59130:30;59127:43;;;59163:5;;;;;;59127:43;59211:6;59204:4;59199:3;59195:14;59191:27;59270:1;59252:16;59248:24;59242:4;59238:35;59233:3;59230:44;59227:57;;;59277:5;;;;;;;59227:57;59294;59342:6;59336:4;59332:17;59324:6;59320:30;59314:4;59294:57;:::i;:::-;59367:3;59360:10;;58708:668;;;;;58665:711;;:::o;59382:122::-;59455:24;59473:5;59455:24;:::i;:::-;59448:5;59445:35;59435:63;;59494:1;59491;59484:12;59435:63;59382:122;:::o;59510:116::-;59580:21;59595:5;59580:21;:::i;:::-;59573:5;59570:32;59560:60;;59616:1;59613;59606:12;59560:60;59510:116;:::o;59632:120::-;59704:23;59721:5;59704:23;:::i;:::-;59697:5;59694:34;59684:62;;59742:1;59739;59732:12;59684:62;59632:120;:::o;59758:122::-;59831:24;59849:5;59831:24;:::i;:::-;59824:5;59821:35;59811:63;;59870:1;59867;59860:12;59811:63;59758:122;:::o

Swarm Source

ipfs://478098ce84616e5cd0105a9134e89c89c686bf2e4f7a9e10346aecfc5806e864
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.