ETH Price: $2,359.66 (+0.83%)

Token

 

Overview

Max Total Supply

117

Holders

102

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0xBBfca0eB87A45B4136909DD4FF8F80a371577a8e
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:
ASUKA

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-03-12
*/

// File: @openzeppelin/contracts/utils/math/Math.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

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


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

pragma solidity ^0.8.0;


/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _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) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @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] = _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.8.0) (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;


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

    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");
        }
    }

    /**
     * @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 the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/cryptography/draft-EIP712.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/draft-EIP712.sol)

pragma solidity ^0.8.0;

// EIP-712 is Final as of 2022-08-11. This file is deprecated.


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

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




contract WhiteList is Ownable, EIP712 {

    bytes32 constant public MINT_CALL_HASH_TYPE = keccak256("mint(address receiver)");

    address public whitelistSigner;

    constructor() EIP712("ASUKAWhiteList", "1") {}

    function setWhitelistSigner(address _address) external onlyOwner {
        whitelistSigner = _address;
    }

    function recoverSigner(address sender, bytes memory signature) public view returns (address) {
        return ECDSA.recover(getDigest(sender), signature);
    }

    function getDigest(address sender) public view returns (bytes32) {
       bytes32 messageDigest = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32",
           ECDSA.toTypedDataHash(_domainSeparatorV4(),
               keccak256(abi.encode(MINT_CALL_HASH_TYPE, sender))
       )));
       return messageDigest;
   }

    modifier isUserWhileList(address sender, bytes memory signature) {
        require(recoverSigner(sender, signature) == whitelistSigner
            ,
            "User is not on whitelist"
        );
        _;
    }

    function getDomainSeparatorV4() external view onlyOwner returns (bytes32) {
        return _domainSeparatorV4();
    }
}
// File: contracts/PreSales.sol

pragma solidity ^0.8.0;


contract PreSales is Ownable {
    uint256 public preSalesStartTime;
    uint256 public preSalesEndTime;

    modifier isPreSalesActive() {
        require(
            isPreSalesActivated(),
            "PreSalesActivation: Sale is not activated"
        );
        _;
    }

    constructor() {
        //23-03-12 11:00:00 EST == 23-03-12 13:00:00 GMT-3 at this site https://www.epochconverter.com/
        preSalesStartTime = 1678636800;
        //23-03-12 12:59:59 EST == 23-03-12 14:59:59 GMT-3 at this site https://www.epochconverter.com/
        preSalesEndTime = 1678643999;
    }

    function isPreSalesActivated() public view returns (bool) {
        return
            preSalesStartTime > 0 &&
            preSalesEndTime > 0 &&
            block.timestamp >= preSalesStartTime &&
            block.timestamp <= preSalesEndTime;
    }

    // 1645365600: start time at 20 Feb 2022 09:00:00 EST in seconds
    // 1645408799: end time at 20 Feb 2022 20:59:59 EST in seconds
    function setPreSalesTime(uint256 _startTime, uint256 _endTime)
        external
        onlyOwner
    {
        require(
            _endTime >= _startTime,
            "PreSalesActivation: End time should be later than start time"
        );
        preSalesStartTime = _startTime;
        preSalesEndTime = _endTime;
    }
}
// File: contracts/PublicSales.sol

pragma solidity ^0.8.0;


contract PublicSales is Ownable {
    uint256 public publicSalesStartTime;

    modifier isPublicSalesActive() {
        require(
            isPublicSalesActivated(),
            "PublicSalesActivation: Sale is not activated"
        );
        _;
    }

    constructor() {
        //23-03-12 13:00:00 EST == 23-03-12 15:00:00 GMT-3 at this site https://www.epochconverter.com/
        publicSalesStartTime = 1678644000;
    }

    function isPublicSalesActivated() public view returns (bool) {
        return
            publicSalesStartTime > 0 && block.timestamp >= publicSalesStartTime;
    }

    // 1644069600: start time at 05 Feb 2022 (2 PM UTC+0) in seconds
    function setPublicSalesTime(uint256 _startTime) external onlyOwner {
        publicSalesStartTime = _startTime;
    }
}
// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.8.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 functionCallWithValue(target, data, 0, "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");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or 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 {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // 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.8.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 or 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 or 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: @openzeppelin/contracts/token/ERC1155/extensions/ERC1155Burnable.sol


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

pragma solidity ^0.8.0;


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

        _burn(account, id, value);
    }

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

        _burnBatch(account, ids, values);
    }
}

// File: contracts/ASUKA.sol


pragma solidity ^0.8.9;









contract ASUKA is ERC1155, Ownable, Pausable, ERC1155Burnable, ERC1155Supply, WhiteList, PreSales, PublicSales {

    //FOR PRODUCTION
    uint256 public TOTAL_MAX_QTY = 777;
    uint256 public constant PRE_SALES_PRICE = 0.07 ether;
    uint256 public constant PUBLIC_SALES_PRICE = 0.099 ether;
    uint256 public constant MAX_QTY_PER_MINTER = 2;
    uint256 public constant MAX_QTY_PER_MINT = 1;
    uint256 public constant MAX_QTY_PER_MINTER_PRE_SALES = 1;

    //FOR TESTS
   /* uint256 public TOTAL_MAX_QTY = 150;
    uint256 public constant PRE_SALES_PRICE = 0.0007 ether;
    uint256 public constant PUBLIC_SALES_PRICE = 0.00099 ether;
    uint256 public constant MAX_QTY_PER_MINTER = 60;
    uint256 public constant MAX_QTY_PER_MINT = 60;
    uint256 public constant MAX_QTY_PER_MINTER_PRE_SALES = 55;*/

    bool public customPrice = false;
    uint256 public custom_price = 0.07 ether;
    bool public customPriceWl = false;
    uint256 public custom_price_wl = 0.099 ether;
    bool public canRenounceOwnership = false;

    bool public burnOpen = false;

    uint256 public salesMintedQty = 0;
    uint256 public giftedQty = 0;
    bool public revealed = false;
    string private notRevealedUri;

    mapping(address => uint256) public publicSalesMinterToTokenQty;
    mapping(address => uint256) public preSalesMinterToTokenQty;

    constructor() ERC1155("ASUKA") {}

    function pre_mint(uint256 _mintQty, bytes memory signature)
        external
        payable
        isPreSalesActive
        isUserWhileList(msg.sender, signature)
    {
        require(
            preSalesMinterToTokenQty[msg.sender] + _mintQty <=
                MAX_QTY_PER_MINTER_PRE_SALES,
            "Exceed max mint per minter"
        );
        require(
           salesMintedQty+_mintQty<=TOTAL_MAX_QTY,
            "Exceed sales max limit"
        );
        require(tx.origin == msg.sender,"CONTRACTS_NOT_ALLOWED_TO_MINT");
        require(msg.value >= _mintQty * getPrice(), "Incorrect ETH");

        preSalesMinterToTokenQty[msg.sender] += _mintQty;
        salesMintedQty += _mintQty;

        _mint(msg.sender, 0, _mintQty, "");
    }

    function mint(uint256 _mintQty)
        external
        payable
        isPublicSalesActive
    {
        require(
           salesMintedQty+_mintQty<=TOTAL_MAX_QTY,
            "Exceed sales max limit"
        );
        require(tx.origin == msg.sender,"CONTRACTS_NOT_ALLOWED_TO_MINT");
        require(
            publicSalesMinterToTokenQty[msg.sender] + _mintQty <=
                MAX_QTY_PER_MINTER,
            "Exceed max mint per minter"
        );
        require(msg.value >= _mintQty * getPrice(), "Incorrect ETH");

        publicSalesMinterToTokenQty[msg.sender] += _mintQty;
        salesMintedQty += _mintQty;

        _mint(msg.sender, 0, _mintQty, "");
    }

    function burnAndGetRare() public{
        require(burnOpen, "Burn is not open!");
        require(this.balanceOf(msg.sender, 0) >= 3, "You need 3 cards to receive a rare one.");
        _burn(msg.sender,0,3);
        _mint(msg.sender, 1, 1, "");
    }

    function gift(address[] calldata receivers) external onlyOwner {
        giftedQty += receivers.length;
        salesMintedQty += receivers.length;
        for (uint256 i = 0; i < receivers.length; i++) {
            _mint(msg.sender, 0, 1, "");
        }
    }

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

    function _beforeTokenTransfer(address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data)
        internal
        whenNotPaused
        override(ERC1155, ERC1155Supply)
    {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
    }
//implemetation
    function getPrice() public view returns (uint256) {
        if (isPublicSalesActivated()) {
            if(customPrice){
                return custom_price;
            }else{
                return PUBLIC_SALES_PRICE;
            }
        }else{
            if(customPriceWl){
                return custom_price_wl;
            }else{
                return PRE_SALES_PRICE;
            }
        }
    }

    function uri(uint256 id)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(exists(id),
        "URI query for nonexistent token"
        );
        
        if(!revealed) {
            return notRevealedUri;
        }

        return bytes(super.uri(id)).length > 0
            ? string(abi.encodePacked(super.uri(id), Strings.toString(id)))
            : "";
    }

    function setURI(string memory newuri) public onlyOwner {
        _setURI(newuri);
    }

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

    function setNotRevealedURI(string memory _notRevealedURI) external onlyOwner {
        notRevealedUri = _notRevealedURI;
    }

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

    function setTotalMaxQty(uint256 _total_max_qty) external onlyOwner {
        TOTAL_MAX_QTY = _total_max_qty;
    }  

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

    function openBurn() public onlyOwner {
        burnOpen = true;
    }

    function closeBurn() public onlyOwner {
        burnOpen = false;
    }

    function setCustomPriceWl(bool isCustomPriceWl, uint256 priceWl) external onlyOwner {
        customPriceWl = isCustomPriceWl;
        custom_price_wl = priceWl;
    }

    function setCustomPrice(bool isCustomPrice, uint256 price) external onlyOwner {
        customPrice = isCustomPrice;
        custom_price = price;
    }

    function setCanRenounceOwnership(bool _state) external  onlyOwner {
        canRenounceOwnership = _state;
    }

    function withdraw() public payable onlyOwner {
        (bool success, ) = payable(msg.sender).call{value: address(this).balance}("");
        require(success);
   }

    function renounceOwnership() override public onlyOwner{
        require(canRenounceOwnership,"Not the time to Renounce Ownership");
        _transferOwnership(address(0));
    }

}

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":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":[],"name":"MAX_QTY_PER_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_QTY_PER_MINTER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_QTY_PER_MINTER_PRE_SALES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_CALL_HASH_TYPE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRE_SALES_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_SALES_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_MAX_QTY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnAndGetRare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canRenounceOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"closeBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"customPrice","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"customPriceWl","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"custom_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"custom_price_wl","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":"sender","type":"address"}],"name":"getDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDomainSeparatorV4","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"receivers","type":"address[]"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"giftedQty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"isPreSalesActivated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSalesActivated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintQty","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"openBurn","outputs":[],"stateMutability":"nonpayable","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":"preSalesEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"preSalesMinterToTokenQty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSalesStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintQty","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"pre_mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"publicSalesMinterToTokenQty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSalesStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"recoverSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"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":[],"name":"salesMintedQty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setCanRenounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isCustomPrice","type":"bool"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setCustomPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isCustomPriceWl","type":"bool"},{"internalType":"uint256","name":"priceWl","type":"uint256"}],"name":"setCustomPriceWl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_endTime","type":"uint256"}],"name":"setPreSalesTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"}],"name":"setPublicSalesTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_total_max_qty","type":"uint256"}],"name":"setTotalMaxQty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newuri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setWhitelistSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

610140604052610309600955600a805460ff1990811690915566f8b0a10e470000600b55600c80548216905567015fb7f9b8c38000600d55600e805461ffff191690556000600f8190556010556011805490911690553480156200006257600080fd5b506040518060400160405280600e81526020016d1054d552d055da1a5d19531a5cdd60921b815250604051806040016040528060018152602001603160f81b815250604051806040016040528060058152602001644153554b4160d81b815250620000d3816200019b60201b60201c565b50620000df33620001ad565b6003805460ff60a01b19169055815160208084019190912082518383012060e08290526101008190524660a0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81880181905281830187905260608201869052608082019490945230818401528151808203909301835260c00190528051940193909320919290916080523060c05261012052505063640df700600655505063640e131f60075563640e132060085562000370565b6002620001a98282620002a4565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200022a57607f821691505b6020821081036200024b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200029f57600081815260208120601f850160051c810160208610156200027a5750805b601f850160051c820191505b818110156200029b5782815560010162000286565b5050505b505050565b81516001600160401b03811115620002c057620002c0620001ff565b620002d881620002d1845462000215565b8462000251565b602080601f831160018114620003105760008415620002f75750858301515b600019600386901b1c1916600185901b1785556200029b565b600085815260208120601f198616915b82811015620003415788860151825594840194600190910190840162000320565b5085821015620003605787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516101005161012051613c7e620003c06000396000611c9c01526000611ceb01526000611cc601526000611c2001526000611c4a01526000611c740152613c7e6000f3fe6080604052600436106103c25760003560e01c80638456cb59116101f2578063c688387f1161010d578063e6c3819c116100a0578063f242432a1161006f578063f242432a14610ac2578063f2c4ce1e14610ae2578063f2fde38b14610b02578063f5298aca14610b2257600080fd5b8063e6c3819c14610a23578063e985e9c514610a39578063ed39039b14610a82578063ef81b4d414610aa257600080fd5b8063d6eec46a116100dc578063d6eec46a146109b1578063dee816e6146109cd578063e0a80853146109e3578063e53e3a0414610a0357600080fd5b8063c688387f1461091d578063d1ca131f14610951578063d338143814610971578063d50699241461099157600080fd5b8063a78a673f11610185578063b7329d2b11610154578063b7329d2b146108a5578063bd34fc57146108ba578063bd85b039146108d0578063c642c933146108fd57600080fd5b8063a78a673f1461084f578063ac501c4114610865578063ae4384f11461087a578063b3e3a8bb1461088f57600080fd5b806398d5fdca116101c157806398d5fdca146107ed578063a0712d6814610802578063a22cb46514610815578063a43c65361461083557600080fd5b80638456cb59146107665780638da5cb5b1461077b5780638f7be8f2146107ad57806392aaa08a146107da57600080fd5b8063477dfefb116102e257806360869d9b1161027557806373a62b5a1161024457806373a62b5a146106ea578063791eef07146107045780637b2ca3861461073157806382afe5501461074b57600080fd5b806360869d9b14610680578063646d951c146106a05780636b20c454146106b5578063715018a6146106d557600080fd5b80634f558e79116102b15780634f558e791461060257806351830227146106315780635c975abb1461064b5780635dcb46fb1461066a57600080fd5b8063477dfefb146105765780634be0424f146105955780634def4d1a146105b55780634e1273f4146105d557600080fd5b8063167877581161035a578063397d0c0c11610329578063397d0c0c1461052d5780633a4087c7146105435780633ccfd60b146105595780633f4ba83a1461056157600080fd5b8063167877581461048e5780631f7fdffa146104d857806329cbec1a146104f85780632eb2c2d61461050d57600080fd5b80630f34f1c6116103965780630f34f1c614610479578063122be4a31461048e57806313c65a6e146104a3578063163e1e61146104b857600080fd5b8062fdd58e146103c757806301ffc9a7146103fa57806302fe53051461042a5780630e89341c1461044c575b600080fd5b3480156103d357600080fd5b506103e76103e2366004612ece565b610b42565b6040519081526020015b60405180910390f35b34801561040657600080fd5b5061041a610415366004612f0e565b610bdb565b60405190151581526020016103f1565b34801561043657600080fd5b5061044a610445366004612fca565b610c2b565b005b34801561045857600080fd5b5061046c61046736600461301a565b610c3f565b6040516103f19190613083565b34801561048557600080fd5b5061044a610d97565b34801561049a57600080fd5b506103e7600181565b3480156104af57600080fd5b506103e7610dac565b3480156104c457600080fd5b5061044a6104d3366004613096565b610dc4565b3480156104e457600080fd5b5061044a6104f33660046131be565b610e40565b34801561050457600080fd5b5061044a610e5a565b34801561051957600080fd5b5061044a610528366004613256565b610e73565b34801561053957600080fd5b506103e760065481565b34801561054f57600080fd5b506103e7600b5481565b61044a610ebf565b34801561056d57600080fd5b5061044a610f1c565b34801561058257600080fd5b50600e5461041a90610100900460ff1681565b3480156105a157600080fd5b5061044a6105b036600461301a565b610f2e565b3480156105c157600080fd5b5061044a6105d036600461330f565b610f3b565b3480156105e157600080fd5b506105f56105f036600461332a565b610f56565b6040516103f1919061342f565b34801561060e57600080fd5b5061041a61061d36600461301a565b600090815260046020526040902054151590565b34801561063d57600080fd5b5060115461041a9060ff1681565b34801561065757600080fd5b50600354600160a01b900460ff1661041a565b34801561067657600080fd5b506103e7600d5481565b34801561068c57600080fd5b5061044a61069b36600461301a565b61107f565b3480156106ac57600080fd5b5061044a61108c565b3480156106c157600080fd5b5061044a6106d0366004613442565b6111c5565b3480156106e157600080fd5b5061044a611208565b3480156106f657600080fd5b50600c5461041a9060ff1681565b34801561071057600080fd5b506103e761071f3660046134b5565b60146020526000908152604090205481565b34801561073d57600080fd5b50600e5461041a9060ff1681565b34801561075757600080fd5b506103e766f8b0a10e47000081565b34801561077257600080fd5b5061044a611277565b34801561078757600080fd5b506003546001600160a01b03165b6040516001600160a01b0390911681526020016103f1565b3480156107b957600080fd5b506103e76107c83660046134b5565b60136020526000908152604090205481565b61044a6107e83660046134d0565b611287565b3480156107f957600080fd5b506103e761151c565b61044a61081036600461301a565b611568565b34801561082157600080fd5b5061044a61083036600461350c565b611790565b34801561084157600080fd5b50600a5461041a9060ff1681565b34801561085b57600080fd5b506103e760075481565b34801561087157600080fd5b506103e7600281565b34801561088657600080fd5b5061041a61179f565b34801561089b57600080fd5b506103e7600f5481565b3480156108b157600080fd5b5061041a6117b7565b3480156108c657600080fd5b506103e760105481565b3480156108dc57600080fd5b506103e76108eb36600461301a565b60009081526004602052604090205490565b34801561090957600080fd5b5061044a61091836600461353f565b6117eb565b34801561092957600080fd5b506103e77ff59780ff8f4ba89ed09d6c9fc5aec79093994c7234326cb09aafc9bf724f074181565b34801561095d57600080fd5b506103e761096c3660046134b5565b61180a565b34801561097d57600080fd5b5061044a61098c3660046134b5565b6118f2565b34801561099d57600080fd5b5061044a6109ac36600461353f565b61191c565b3480156109bd57600080fd5b506103e767015fb7f9b8c3800081565b3480156109d957600080fd5b506103e760095481565b3480156109ef57600080fd5b5061044a6109fe36600461330f565b61193b565b348015610a0f57600080fd5b50610795610a1e36600461355b565b611956565b348015610a2f57600080fd5b506103e760085481565b348015610a4557600080fd5b5061041a610a54366004613592565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b348015610a8e57600080fd5b5061044a610a9d3660046135bc565b611971565b348015610aae57600080fd5b50600554610795906001600160a01b031681565b348015610ace57600080fd5b5061044a610add3660046135de565b6119fa565b348015610aee57600080fd5b5061044a610afd366004612fca565b611a3f565b348015610b0e57600080fd5b5061044a610b1d3660046134b5565b611a53565b348015610b2e57600080fd5b5061044a610b3d366004613642565b611ac9565b60006001600160a01b038316610bb25760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b1480610c0c57506001600160e01b031982166303a24d0760e21b145b80610bd557506301ffc9a760e01b6001600160e01b0319831614610bd5565b610c33611b0c565b610c3c81611b66565b50565b600081815260046020526040902054606090610c9d5760405162461bcd60e51b815260206004820152601f60248201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e006044820152606401610ba9565b60115460ff16610d395760128054610cb490613675565b80601f0160208091040260200160405190810160405280929190818152602001828054610ce090613675565b8015610d2d5780601f10610d0257610100808354040283529160200191610d2d565b820191906000526020600020905b815481529060010190602001808311610d1057829003601f168201915b50505050509050919050565b6000610d4483611b72565b5111610d5f5760405180602001604052806000815250610bd5565b610d6882611b72565b610d7183611b81565b604051602001610d829291906136af565b60405160208183030381529060405292915050565b610d9f611b0c565b600e805461ff0019169055565b6000610db6611b0c565b610dbe611c13565b90505b90565b610dcc611b0c565b8181905060106000828254610de191906136f4565b9091555050600f8054829190600090610dfb9084906136f4565b90915550600090505b81811015610e3b57610e29336000600160405180602001604052806000815250611d3b565b80610e3381613707565b915050610e04565b505050565b610e48611b0c565b610e5484848484611e24565b50505050565b610e62611b0c565b600e805461ff001916610100179055565b6001600160a01b038516331480610e8f5750610e8f8533610a54565b610eab5760405162461bcd60e51b8152600401610ba990613720565b610eb88585858585611f7e565b5050505050565b610ec7611b0c565b604051600090339047908381818185875af1925050503d8060008114610f09576040519150601f19603f3d011682016040523d82523d6000602084013e610f0e565b606091505b5050905080610c3c57600080fd5b610f24611b0c565b610f2c612128565b565b610f36611b0c565b600955565b610f43611b0c565b600e805460ff1916911515919091179055565b60608151835114610fbb5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610ba9565b600083516001600160401b03811115610fd657610fd6612f2b565b604051908082528060200260200182016040528015610fff578160200160208202803683370190505b50905060005b84518110156110775761104a8582815181106110235761102361376e565b602002602001015185838151811061103d5761103d61376e565b6020026020010151610b42565b82828151811061105c5761105c61376e565b602090810291909101015261107081613707565b9050611005565b509392505050565b611087611b0c565b600855565b600e54610100900460ff166110d75760405162461bcd60e51b81526020600482015260116024820152704275726e206973206e6f74206f70656e2160781b6044820152606401610ba9565b604051627eeac760e11b815233600482015260006024820152600390309062fdd58e90604401602060405180830381865afa15801561111a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113e9190613784565b101561119c5760405162461bcd60e51b815260206004820152602760248201527f596f75206e656564203320636172647320746f2072656365697665206120726160448201526639329037b7329760c91b6064820152608401610ba9565b6111a9336000600361217d565b610f2c3360018060405180602001604052806000815250611d3b565b6001600160a01b0383163314806111e157506111e18333610a54565b6111fd5760405162461bcd60e51b8152600401610ba990613720565b610e3b838383612295565b611210611b0c565b600e5460ff1661126d5760405162461bcd60e51b815260206004820152602260248201527f4e6f74207468652074696d6520746f2052656e6f756e6365204f776e65727368604482015261069760f41b6064820152608401610ba9565b610f2c6000612431565b61127f611b0c565b610f2c612483565b61128f6117b7565b6112ed5760405162461bcd60e51b815260206004820152602960248201527f50726553616c657341637469766174696f6e3a2053616c65206973206e6f74206044820152681858dd1a5d985d195960ba1b6064820152608401610ba9565b600554339082906001600160a01b03166113078383611956565b6001600160a01b03161461135d5760405162461bcd60e51b815260206004820152601860248201527f55736572206973206e6f74206f6e2077686974656c69737400000000000000006044820152606401610ba9565b3360009081526014602052604090205460019061137b9086906136f4565b11156113c95760405162461bcd60e51b815260206004820152601a60248201527f457863656564206d6178206d696e7420706572206d696e7465720000000000006044820152606401610ba9565b60095484600f546113da91906136f4565b11156114215760405162461bcd60e51b8152602060048201526016602482015275115e18d95959081cd85b195cc81b585e081b1a5b5a5d60521b6044820152606401610ba9565b3233146114705760405162461bcd60e51b815260206004820152601d60248201527f434f4e5452414354535f4e4f545f414c4c4f5745445f544f5f4d494e540000006044820152606401610ba9565b61147861151c565b611482908561379d565b3410156114c15760405162461bcd60e51b815260206004820152600d60248201526c092dcc6dee4e4cac6e8408aa89609b1b6044820152606401610ba9565b33600090815260146020526040812080548692906114e09084906136f4565b9250508190555083600f60008282546114f991906136f4565b92505081905550610e543360008660405180602001604052806000815250611d3b565b600061152661179f565b1561154a57600a5460ff161561153d5750600b5490565b5067015fb7f9b8c3800090565b600c5460ff161561155c5750600d5490565b5066f8b0a10e47000090565b61157061179f565b6115d15760405162461bcd60e51b815260206004820152602c60248201527f5075626c696353616c657341637469766174696f6e3a2053616c65206973206e60448201526b1bdd081858dd1a5d985d195960a21b6064820152608401610ba9565b60095481600f546115e291906136f4565b11156116295760405162461bcd60e51b8152602060048201526016602482015275115e18d95959081cd85b195cc81b585e081b1a5b5a5d60521b6044820152606401610ba9565b3233146116785760405162461bcd60e51b815260206004820152601d60248201527f434f4e5452414354535f4e4f545f414c4c4f5745445f544f5f4d494e540000006044820152606401610ba9565b336000908152601360205260409020546002906116969083906136f4565b11156116e45760405162461bcd60e51b815260206004820152601a60248201527f457863656564206d6178206d696e7420706572206d696e7465720000000000006044820152606401610ba9565b6116ec61151c565b6116f6908261379d565b3410156117355760405162461bcd60e51b815260206004820152600d60248201526c092dcc6dee4e4cac6e8408aa89609b1b6044820152606401610ba9565b33600090815260136020526040812080548392906117549084906136f4565b9250508190555080600f600082825461176d91906136f4565b92505081905550610c3c3360008360405180602001604052806000815250611d3b565b61179b3383836124c6565b5050565b600080600854118015610dbe57505060085442101590565b6000806006541180156117cc57506000600754115b80156117da57506006544210155b8015610dbe57505060075442111590565b6117f3611b0c565b600c805460ff191692151592909217909155600d55565b60008061189f611818611c13565b604080517ff59780ff8f4ba89ed09d6c9fc5aec79093994c7234326cb09aafc9bf724f07416020808301919091526001600160a01b0388168284015282518083038401815260608301845280519082012061190160f01b6080840152608283019490945260a2808301949094528251808303909401845260c2909101909152815191012090565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c810191909152605c0160408051601f1981840301815291905280516020909101209392505050565b6118fa611b0c565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b611924611b0c565b600a805460ff191692151592909217909155600b55565b611943611b0c565b6011805460ff1916911515919091179055565b600061196a6119648461180a565b836125a6565b9392505050565b611979611b0c565b818110156119ef5760405162461bcd60e51b815260206004820152603c60248201527f50726553616c657341637469766174696f6e3a20456e642074696d652073686f60448201527f756c64206265206c61746572207468616e2073746172742074696d65000000006064820152608401610ba9565b600691909155600755565b6001600160a01b038516331480611a165750611a168533610a54565b611a325760405162461bcd60e51b8152600401610ba990613720565b610eb885858585856125c2565b611a47611b0c565b601261179b82826137fa565b611a5b611b0c565b6001600160a01b038116611ac05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ba9565b610c3c81612431565b6001600160a01b038316331480611ae55750611ae58333610a54565b611b015760405162461bcd60e51b8152600401610ba990613720565b610e3b83838361217d565b6003546001600160a01b03163314610f2c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ba9565b600261179b82826137fa565b606060028054610cb490613675565b60606000611b8e836126fa565b60010190506000816001600160401b03811115611bad57611bad612f2b565b6040519080825280601f01601f191660200182016040528015611bd7576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611be157509392505050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015611c6c57507f000000000000000000000000000000000000000000000000000000000000000046145b15611c9657507f000000000000000000000000000000000000000000000000000000000000000090565b604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c09092019092528051910120610dbe565b6001600160a01b038416611d615760405162461bcd60e51b8152600401610ba9906138b9565b336000611d6d856127d2565b90506000611d7a856127d2565b9050611d8b8360008985858961281d565b6000868152602081815260408083206001600160a01b038b16845290915281208054879290611dbb9084906136f4565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611e1b83600089898989612833565b50505050505050565b6001600160a01b038416611e4a5760405162461bcd60e51b8152600401610ba9906138b9565b8151835114611e6b5760405162461bcd60e51b8152600401610ba9906138fa565b33611e7b8160008787878761281d565b60005b8451811015611f1657838181518110611e9957611e9961376e565b6020026020010151600080878481518110611eb657611eb661376e565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b031681526020019081526020016000206000828254611efe91906136f4565b90915550819050611f0e81613707565b915050611e7e565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611f67929190613942565b60405180910390a4610eb88160008787878761298e565b8151835114611f9f5760405162461bcd60e51b8152600401610ba9906138fa565b6001600160a01b038416611fc55760405162461bcd60e51b8152600401610ba990613970565b33611fd481878787878761281d565b60005b84518110156120ba576000858281518110611ff457611ff461376e565b6020026020010151905060008583815181106120125761201261376e565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156120625760405162461bcd60e51b8152600401610ba9906139b5565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b1682528120805484929061209f9084906136f4565b92505081905550505050806120b390613707565b9050611fd7565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161210a929190613942565b60405180910390a461212081878787878761298e565b505050505050565b612130612a49565b6003805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b0383166121a35760405162461bcd60e51b8152600401610ba9906139ff565b3360006121af846127d2565b905060006121bc846127d2565b90506121dc8387600085856040518060200160405280600081525061281d565b6000858152602081815260408083206001600160a01b038a1684529091529020548481101561221d5760405162461bcd60e51b8152600401610ba990613a42565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4604080516020810190915260009052611e1b565b6001600160a01b0383166122bb5760405162461bcd60e51b8152600401610ba9906139ff565b80518251146122dc5760405162461bcd60e51b8152600401610ba9906138fa565b60003390506122ff8185600086866040518060200160405280600081525061281d565b60005b83518110156123c457600084828151811061231f5761231f61376e565b60200260200101519050600084838151811061233d5761233d61376e565b602090810291909101810151600084815280835260408082206001600160a01b038c16835290935291909120549091508181101561238d5760405162461bcd60e51b8152600401610ba990613a42565b6000928352602083815260408085206001600160a01b038b16865290915290922091039055806123bc81613707565b915050612302565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051612415929190613942565b60405180910390a4604080516020810190915260009052610e54565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61248b612a99565b6003805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586121603390565b816001600160a01b0316836001600160a01b0316036125395760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610ba9565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60008060006125b58585612ae6565b9150915061107781612b2b565b6001600160a01b0384166125e85760405162461bcd60e51b8152600401610ba990613970565b3360006125f4856127d2565b90506000612601856127d2565b905061261183898985858961281d565b6000868152602081815260408083206001600160a01b038c168452909152902054858110156126525760405162461bcd60e51b8152600401610ba9906139b5565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a1682528120805488929061268f9084906136f4565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46126ef848a8a8a8a8a612833565b505050505050505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106127395772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310612765576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061278357662386f26fc10000830492506010015b6305f5e100831061279b576305f5e100830492506008015b61271083106127af57612710830492506004015b606483106127c1576064830492506002015b600a8310610bd55760010192915050565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061280c5761280c61376e565b602090810291909101015292915050565b612825612a99565b612120868686868686612c75565b6001600160a01b0384163b156121205760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906128779089908990889088908890600401613a86565b6020604051808303816000875af19250505080156128b2575060408051601f3d908101601f191682019092526128af91810190613acb565b60015b61295e576128be613ae8565b806308c379a0036128f757506128d2613b03565b806128dd57506128f9565b8060405162461bcd60e51b8152600401610ba99190613083565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610ba9565b6001600160e01b0319811663f23a6e6160e01b14611e1b5760405162461bcd60e51b8152600401610ba990613b8c565b6001600160a01b0384163b156121205760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906129d29089908990889088908890600401613bd4565b6020604051808303816000875af1925050508015612a0d575060408051601f3d908101601f19168201909252612a0a91810190613acb565b60015b612a19576128be613ae8565b6001600160e01b0319811663bc197c8160e01b14611e1b5760405162461bcd60e51b8152600401610ba990613b8c565b600354600160a01b900460ff16610f2c5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610ba9565b600354600160a01b900460ff1615610f2c5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610ba9565b6000808251604103612b1c5760208301516040840151606085015160001a612b1087828585612dee565b94509450505050612b24565b506000905060025b9250929050565b6000816004811115612b3f57612b3f613c32565b03612b475750565b6001816004811115612b5b57612b5b613c32565b03612ba85760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610ba9565b6002816004811115612bbc57612bbc613c32565b03612c095760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610ba9565b6003816004811115612c1d57612c1d613c32565b03610c3c5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610ba9565b6001600160a01b038516612cfc5760005b8351811015612cfa57828181518110612ca157612ca161376e565b602002602001015160046000868481518110612cbf57612cbf61376e565b602002602001015181526020019081526020016000206000828254612ce491906136f4565b90915550612cf3905081613707565b9050612c86565b505b6001600160a01b0384166121205760005b8351811015611e1b576000848281518110612d2a57612d2a61376e565b602002602001015190506000848381518110612d4857612d4861376e565b6020026020010151905060006004600084815260200190815260200160002054905081811015612dcb5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b6064820152608401610ba9565b60009283526004602052604090922091039055612de781613707565b9050612d0d565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612e255750600090506003612ea9565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612e79573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612ea257600060019250925050612ea9565b9150600090505b94509492505050565b80356001600160a01b0381168114612ec957600080fd5b919050565b60008060408385031215612ee157600080fd5b612eea83612eb2565b946020939093013593505050565b6001600160e01b031981168114610c3c57600080fd5b600060208284031215612f2057600080fd5b813561196a81612ef8565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b0381118282101715612f6657612f66612f2b565b6040525050565b60006001600160401b03831115612f8657612f86612f2b565b604051612f9d601f8501601f191660200182612f41565b809150838152848484011115612fb257600080fd5b83836020830137600060208583010152509392505050565b600060208284031215612fdc57600080fd5b81356001600160401b03811115612ff257600080fd5b8201601f8101841361300357600080fd5b61301284823560208401612f6d565b949350505050565b60006020828403121561302c57600080fd5b5035919050565b60005b8381101561304e578181015183820152602001613036565b50506000910152565b6000815180845261306f816020860160208601613033565b601f01601f19169290920160200192915050565b60208152600061196a6020830184613057565b600080602083850312156130a957600080fd5b82356001600160401b03808211156130c057600080fd5b818501915085601f8301126130d457600080fd5b8135818111156130e357600080fd5b8660208260051b85010111156130f857600080fd5b60209290920196919550909350505050565b60006001600160401b0382111561312357613123612f2b565b5060051b60200190565b600082601f83011261313e57600080fd5b8135602061314b8261310a565b6040516131588282612f41565b83815260059390931b850182019282810191508684111561317857600080fd5b8286015b84811015613193578035835291830191830161317c565b509695505050505050565b600082601f8301126131af57600080fd5b61196a83833560208501612f6d565b600080600080608085870312156131d457600080fd5b6131dd85612eb2565b935060208501356001600160401b03808211156131f957600080fd5b6132058883890161312d565b9450604087013591508082111561321b57600080fd5b6132278883890161312d565b9350606087013591508082111561323d57600080fd5b5061324a8782880161319e565b91505092959194509250565b600080600080600060a0868803121561326e57600080fd5b61327786612eb2565b945061328560208701612eb2565b935060408601356001600160401b03808211156132a157600080fd5b6132ad89838a0161312d565b945060608801359150808211156132c357600080fd5b6132cf89838a0161312d565b935060808801359150808211156132e557600080fd5b506132f28882890161319e565b9150509295509295909350565b80358015158114612ec957600080fd5b60006020828403121561332157600080fd5b61196a826132ff565b6000806040838503121561333d57600080fd5b82356001600160401b038082111561335457600080fd5b818501915085601f83011261336857600080fd5b813560206133758261310a565b6040516133828282612f41565b83815260059390931b85018201928281019150898411156133a257600080fd5b948201945b838610156133c7576133b886612eb2565b825294820194908201906133a7565b965050860135925050808211156133dd57600080fd5b506133ea8582860161312d565b9150509250929050565b600081518084526020808501945080840160005b8381101561342457815187529582019590820190600101613408565b509495945050505050565b60208152600061196a60208301846133f4565b60008060006060848603121561345757600080fd5b61346084612eb2565b925060208401356001600160401b038082111561347c57600080fd5b6134888783880161312d565b9350604086013591508082111561349e57600080fd5b506134ab8682870161312d565b9150509250925092565b6000602082840312156134c757600080fd5b61196a82612eb2565b600080604083850312156134e357600080fd5b8235915060208301356001600160401b0381111561350057600080fd5b6133ea8582860161319e565b6000806040838503121561351f57600080fd5b61352883612eb2565b9150613536602084016132ff565b90509250929050565b6000806040838503121561355257600080fd5b612eea836132ff565b6000806040838503121561356e57600080fd5b61357783612eb2565b915060208301356001600160401b0381111561350057600080fd5b600080604083850312156135a557600080fd5b6135ae83612eb2565b915061353660208401612eb2565b600080604083850312156135cf57600080fd5b50508035926020909101359150565b600080600080600060a086880312156135f657600080fd5b6135ff86612eb2565b945061360d60208701612eb2565b9350604086013592506060860135915060808601356001600160401b0381111561363657600080fd5b6132f28882890161319e565b60008060006060848603121561365757600080fd5b61366084612eb2565b95602085013595506040909401359392505050565b600181811c9082168061368957607f821691505b6020821081036136a957634e487b7160e01b600052602260045260246000fd5b50919050565b600083516136c1818460208801613033565b8351908301906136d5818360208801613033565b01949350505050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610bd557610bd56136de565b600060018201613719576137196136de565b5060010190565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561379657600080fd5b5051919050565b8082028115828204841417610bd557610bd56136de565b601f821115610e3b57600081815260208120601f850160051c810160208610156137db5750805b601f850160051c820191505b81811015612120578281556001016137e7565b81516001600160401b0381111561381357613813612f2b565b613827816138218454613675565b846137b4565b602080601f83116001811461385c57600084156138445750858301515b600019600386901b1c1916600185901b178555612120565b600085815260208120601f198616915b8281101561388b5788860151825594840194600190910190840161386c565b50858210156138a95787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60408152600061395560408301856133f4565b828103602084015261396781856133f4565b95945050505050565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090613ac090830184613057565b979650505050505050565b600060208284031215613add57600080fd5b815161196a81612ef8565b600060033d1115610dc15760046000803e5060005160e01c90565b600060443d1015613b115790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715613b4057505050505090565b8285019150815181811115613b585750505050505090565b843d8701016020828501011115613b725750505050505090565b613b8160208286010187612f41565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a060408201819052600090613c00908301866133f4565b8281036060840152613c1281866133f4565b90508281036080840152613c268185613057565b98975050505050505050565b634e487b7160e01b600052602160045260246000fdfea26469706673582212209c073c913f6f3c283ce53a80d21a610107888510bbfd359f15c9b1480388157864736f6c63430008120033

Deployed Bytecode

0x6080604052600436106103c25760003560e01c80638456cb59116101f2578063c688387f1161010d578063e6c3819c116100a0578063f242432a1161006f578063f242432a14610ac2578063f2c4ce1e14610ae2578063f2fde38b14610b02578063f5298aca14610b2257600080fd5b8063e6c3819c14610a23578063e985e9c514610a39578063ed39039b14610a82578063ef81b4d414610aa257600080fd5b8063d6eec46a116100dc578063d6eec46a146109b1578063dee816e6146109cd578063e0a80853146109e3578063e53e3a0414610a0357600080fd5b8063c688387f1461091d578063d1ca131f14610951578063d338143814610971578063d50699241461099157600080fd5b8063a78a673f11610185578063b7329d2b11610154578063b7329d2b146108a5578063bd34fc57146108ba578063bd85b039146108d0578063c642c933146108fd57600080fd5b8063a78a673f1461084f578063ac501c4114610865578063ae4384f11461087a578063b3e3a8bb1461088f57600080fd5b806398d5fdca116101c157806398d5fdca146107ed578063a0712d6814610802578063a22cb46514610815578063a43c65361461083557600080fd5b80638456cb59146107665780638da5cb5b1461077b5780638f7be8f2146107ad57806392aaa08a146107da57600080fd5b8063477dfefb116102e257806360869d9b1161027557806373a62b5a1161024457806373a62b5a146106ea578063791eef07146107045780637b2ca3861461073157806382afe5501461074b57600080fd5b806360869d9b14610680578063646d951c146106a05780636b20c454146106b5578063715018a6146106d557600080fd5b80634f558e79116102b15780634f558e791461060257806351830227146106315780635c975abb1461064b5780635dcb46fb1461066a57600080fd5b8063477dfefb146105765780634be0424f146105955780634def4d1a146105b55780634e1273f4146105d557600080fd5b8063167877581161035a578063397d0c0c11610329578063397d0c0c1461052d5780633a4087c7146105435780633ccfd60b146105595780633f4ba83a1461056157600080fd5b8063167877581461048e5780631f7fdffa146104d857806329cbec1a146104f85780632eb2c2d61461050d57600080fd5b80630f34f1c6116103965780630f34f1c614610479578063122be4a31461048e57806313c65a6e146104a3578063163e1e61146104b857600080fd5b8062fdd58e146103c757806301ffc9a7146103fa57806302fe53051461042a5780630e89341c1461044c575b600080fd5b3480156103d357600080fd5b506103e76103e2366004612ece565b610b42565b6040519081526020015b60405180910390f35b34801561040657600080fd5b5061041a610415366004612f0e565b610bdb565b60405190151581526020016103f1565b34801561043657600080fd5b5061044a610445366004612fca565b610c2b565b005b34801561045857600080fd5b5061046c61046736600461301a565b610c3f565b6040516103f19190613083565b34801561048557600080fd5b5061044a610d97565b34801561049a57600080fd5b506103e7600181565b3480156104af57600080fd5b506103e7610dac565b3480156104c457600080fd5b5061044a6104d3366004613096565b610dc4565b3480156104e457600080fd5b5061044a6104f33660046131be565b610e40565b34801561050457600080fd5b5061044a610e5a565b34801561051957600080fd5b5061044a610528366004613256565b610e73565b34801561053957600080fd5b506103e760065481565b34801561054f57600080fd5b506103e7600b5481565b61044a610ebf565b34801561056d57600080fd5b5061044a610f1c565b34801561058257600080fd5b50600e5461041a90610100900460ff1681565b3480156105a157600080fd5b5061044a6105b036600461301a565b610f2e565b3480156105c157600080fd5b5061044a6105d036600461330f565b610f3b565b3480156105e157600080fd5b506105f56105f036600461332a565b610f56565b6040516103f1919061342f565b34801561060e57600080fd5b5061041a61061d36600461301a565b600090815260046020526040902054151590565b34801561063d57600080fd5b5060115461041a9060ff1681565b34801561065757600080fd5b50600354600160a01b900460ff1661041a565b34801561067657600080fd5b506103e7600d5481565b34801561068c57600080fd5b5061044a61069b36600461301a565b61107f565b3480156106ac57600080fd5b5061044a61108c565b3480156106c157600080fd5b5061044a6106d0366004613442565b6111c5565b3480156106e157600080fd5b5061044a611208565b3480156106f657600080fd5b50600c5461041a9060ff1681565b34801561071057600080fd5b506103e761071f3660046134b5565b60146020526000908152604090205481565b34801561073d57600080fd5b50600e5461041a9060ff1681565b34801561075757600080fd5b506103e766f8b0a10e47000081565b34801561077257600080fd5b5061044a611277565b34801561078757600080fd5b506003546001600160a01b03165b6040516001600160a01b0390911681526020016103f1565b3480156107b957600080fd5b506103e76107c83660046134b5565b60136020526000908152604090205481565b61044a6107e83660046134d0565b611287565b3480156107f957600080fd5b506103e761151c565b61044a61081036600461301a565b611568565b34801561082157600080fd5b5061044a61083036600461350c565b611790565b34801561084157600080fd5b50600a5461041a9060ff1681565b34801561085b57600080fd5b506103e760075481565b34801561087157600080fd5b506103e7600281565b34801561088657600080fd5b5061041a61179f565b34801561089b57600080fd5b506103e7600f5481565b3480156108b157600080fd5b5061041a6117b7565b3480156108c657600080fd5b506103e760105481565b3480156108dc57600080fd5b506103e76108eb36600461301a565b60009081526004602052604090205490565b34801561090957600080fd5b5061044a61091836600461353f565b6117eb565b34801561092957600080fd5b506103e77ff59780ff8f4ba89ed09d6c9fc5aec79093994c7234326cb09aafc9bf724f074181565b34801561095d57600080fd5b506103e761096c3660046134b5565b61180a565b34801561097d57600080fd5b5061044a61098c3660046134b5565b6118f2565b34801561099d57600080fd5b5061044a6109ac36600461353f565b61191c565b3480156109bd57600080fd5b506103e767015fb7f9b8c3800081565b3480156109d957600080fd5b506103e760095481565b3480156109ef57600080fd5b5061044a6109fe36600461330f565b61193b565b348015610a0f57600080fd5b50610795610a1e36600461355b565b611956565b348015610a2f57600080fd5b506103e760085481565b348015610a4557600080fd5b5061041a610a54366004613592565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b348015610a8e57600080fd5b5061044a610a9d3660046135bc565b611971565b348015610aae57600080fd5b50600554610795906001600160a01b031681565b348015610ace57600080fd5b5061044a610add3660046135de565b6119fa565b348015610aee57600080fd5b5061044a610afd366004612fca565b611a3f565b348015610b0e57600080fd5b5061044a610b1d3660046134b5565b611a53565b348015610b2e57600080fd5b5061044a610b3d366004613642565b611ac9565b60006001600160a01b038316610bb25760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b1480610c0c57506001600160e01b031982166303a24d0760e21b145b80610bd557506301ffc9a760e01b6001600160e01b0319831614610bd5565b610c33611b0c565b610c3c81611b66565b50565b600081815260046020526040902054606090610c9d5760405162461bcd60e51b815260206004820152601f60248201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e006044820152606401610ba9565b60115460ff16610d395760128054610cb490613675565b80601f0160208091040260200160405190810160405280929190818152602001828054610ce090613675565b8015610d2d5780601f10610d0257610100808354040283529160200191610d2d565b820191906000526020600020905b815481529060010190602001808311610d1057829003601f168201915b50505050509050919050565b6000610d4483611b72565b5111610d5f5760405180602001604052806000815250610bd5565b610d6882611b72565b610d7183611b81565b604051602001610d829291906136af565b60405160208183030381529060405292915050565b610d9f611b0c565b600e805461ff0019169055565b6000610db6611b0c565b610dbe611c13565b90505b90565b610dcc611b0c565b8181905060106000828254610de191906136f4565b9091555050600f8054829190600090610dfb9084906136f4565b90915550600090505b81811015610e3b57610e29336000600160405180602001604052806000815250611d3b565b80610e3381613707565b915050610e04565b505050565b610e48611b0c565b610e5484848484611e24565b50505050565b610e62611b0c565b600e805461ff001916610100179055565b6001600160a01b038516331480610e8f5750610e8f8533610a54565b610eab5760405162461bcd60e51b8152600401610ba990613720565b610eb88585858585611f7e565b5050505050565b610ec7611b0c565b604051600090339047908381818185875af1925050503d8060008114610f09576040519150601f19603f3d011682016040523d82523d6000602084013e610f0e565b606091505b5050905080610c3c57600080fd5b610f24611b0c565b610f2c612128565b565b610f36611b0c565b600955565b610f43611b0c565b600e805460ff1916911515919091179055565b60608151835114610fbb5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610ba9565b600083516001600160401b03811115610fd657610fd6612f2b565b604051908082528060200260200182016040528015610fff578160200160208202803683370190505b50905060005b84518110156110775761104a8582815181106110235761102361376e565b602002602001015185838151811061103d5761103d61376e565b6020026020010151610b42565b82828151811061105c5761105c61376e565b602090810291909101015261107081613707565b9050611005565b509392505050565b611087611b0c565b600855565b600e54610100900460ff166110d75760405162461bcd60e51b81526020600482015260116024820152704275726e206973206e6f74206f70656e2160781b6044820152606401610ba9565b604051627eeac760e11b815233600482015260006024820152600390309062fdd58e90604401602060405180830381865afa15801561111a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113e9190613784565b101561119c5760405162461bcd60e51b815260206004820152602760248201527f596f75206e656564203320636172647320746f2072656365697665206120726160448201526639329037b7329760c91b6064820152608401610ba9565b6111a9336000600361217d565b610f2c3360018060405180602001604052806000815250611d3b565b6001600160a01b0383163314806111e157506111e18333610a54565b6111fd5760405162461bcd60e51b8152600401610ba990613720565b610e3b838383612295565b611210611b0c565b600e5460ff1661126d5760405162461bcd60e51b815260206004820152602260248201527f4e6f74207468652074696d6520746f2052656e6f756e6365204f776e65727368604482015261069760f41b6064820152608401610ba9565b610f2c6000612431565b61127f611b0c565b610f2c612483565b61128f6117b7565b6112ed5760405162461bcd60e51b815260206004820152602960248201527f50726553616c657341637469766174696f6e3a2053616c65206973206e6f74206044820152681858dd1a5d985d195960ba1b6064820152608401610ba9565b600554339082906001600160a01b03166113078383611956565b6001600160a01b03161461135d5760405162461bcd60e51b815260206004820152601860248201527f55736572206973206e6f74206f6e2077686974656c69737400000000000000006044820152606401610ba9565b3360009081526014602052604090205460019061137b9086906136f4565b11156113c95760405162461bcd60e51b815260206004820152601a60248201527f457863656564206d6178206d696e7420706572206d696e7465720000000000006044820152606401610ba9565b60095484600f546113da91906136f4565b11156114215760405162461bcd60e51b8152602060048201526016602482015275115e18d95959081cd85b195cc81b585e081b1a5b5a5d60521b6044820152606401610ba9565b3233146114705760405162461bcd60e51b815260206004820152601d60248201527f434f4e5452414354535f4e4f545f414c4c4f5745445f544f5f4d494e540000006044820152606401610ba9565b61147861151c565b611482908561379d565b3410156114c15760405162461bcd60e51b815260206004820152600d60248201526c092dcc6dee4e4cac6e8408aa89609b1b6044820152606401610ba9565b33600090815260146020526040812080548692906114e09084906136f4565b9250508190555083600f60008282546114f991906136f4565b92505081905550610e543360008660405180602001604052806000815250611d3b565b600061152661179f565b1561154a57600a5460ff161561153d5750600b5490565b5067015fb7f9b8c3800090565b600c5460ff161561155c5750600d5490565b5066f8b0a10e47000090565b61157061179f565b6115d15760405162461bcd60e51b815260206004820152602c60248201527f5075626c696353616c657341637469766174696f6e3a2053616c65206973206e60448201526b1bdd081858dd1a5d985d195960a21b6064820152608401610ba9565b60095481600f546115e291906136f4565b11156116295760405162461bcd60e51b8152602060048201526016602482015275115e18d95959081cd85b195cc81b585e081b1a5b5a5d60521b6044820152606401610ba9565b3233146116785760405162461bcd60e51b815260206004820152601d60248201527f434f4e5452414354535f4e4f545f414c4c4f5745445f544f5f4d494e540000006044820152606401610ba9565b336000908152601360205260409020546002906116969083906136f4565b11156116e45760405162461bcd60e51b815260206004820152601a60248201527f457863656564206d6178206d696e7420706572206d696e7465720000000000006044820152606401610ba9565b6116ec61151c565b6116f6908261379d565b3410156117355760405162461bcd60e51b815260206004820152600d60248201526c092dcc6dee4e4cac6e8408aa89609b1b6044820152606401610ba9565b33600090815260136020526040812080548392906117549084906136f4565b9250508190555080600f600082825461176d91906136f4565b92505081905550610c3c3360008360405180602001604052806000815250611d3b565b61179b3383836124c6565b5050565b600080600854118015610dbe57505060085442101590565b6000806006541180156117cc57506000600754115b80156117da57506006544210155b8015610dbe57505060075442111590565b6117f3611b0c565b600c805460ff191692151592909217909155600d55565b60008061189f611818611c13565b604080517ff59780ff8f4ba89ed09d6c9fc5aec79093994c7234326cb09aafc9bf724f07416020808301919091526001600160a01b0388168284015282518083038401815260608301845280519082012061190160f01b6080840152608283019490945260a2808301949094528251808303909401845260c2909101909152815191012090565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c810191909152605c0160408051601f1981840301815291905280516020909101209392505050565b6118fa611b0c565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b611924611b0c565b600a805460ff191692151592909217909155600b55565b611943611b0c565b6011805460ff1916911515919091179055565b600061196a6119648461180a565b836125a6565b9392505050565b611979611b0c565b818110156119ef5760405162461bcd60e51b815260206004820152603c60248201527f50726553616c657341637469766174696f6e3a20456e642074696d652073686f60448201527f756c64206265206c61746572207468616e2073746172742074696d65000000006064820152608401610ba9565b600691909155600755565b6001600160a01b038516331480611a165750611a168533610a54565b611a325760405162461bcd60e51b8152600401610ba990613720565b610eb885858585856125c2565b611a47611b0c565b601261179b82826137fa565b611a5b611b0c565b6001600160a01b038116611ac05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ba9565b610c3c81612431565b6001600160a01b038316331480611ae55750611ae58333610a54565b611b015760405162461bcd60e51b8152600401610ba990613720565b610e3b83838361217d565b6003546001600160a01b03163314610f2c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ba9565b600261179b82826137fa565b606060028054610cb490613675565b60606000611b8e836126fa565b60010190506000816001600160401b03811115611bad57611bad612f2b565b6040519080825280601f01601f191660200182016040528015611bd7576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611be157509392505050565b6000306001600160a01b037f00000000000000000000000070a507620b3d73703f1d17ca7c63f94fb2251c4a16148015611c6c57507f000000000000000000000000000000000000000000000000000000000000000146145b15611c9657507f0cd185dec571d632e7e44fe2a9186cb30d422cdd35e5756286d9c52c2fd3bca890565b604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527f101d66eb65df49ea93a7f76147a645f7c80a8311affdc668f3b79eb5d6469e29828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301524660808301523060a0808401919091528351808403909101815260c09092019092528051910120610dbe565b6001600160a01b038416611d615760405162461bcd60e51b8152600401610ba9906138b9565b336000611d6d856127d2565b90506000611d7a856127d2565b9050611d8b8360008985858961281d565b6000868152602081815260408083206001600160a01b038b16845290915281208054879290611dbb9084906136f4565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611e1b83600089898989612833565b50505050505050565b6001600160a01b038416611e4a5760405162461bcd60e51b8152600401610ba9906138b9565b8151835114611e6b5760405162461bcd60e51b8152600401610ba9906138fa565b33611e7b8160008787878761281d565b60005b8451811015611f1657838181518110611e9957611e9961376e565b6020026020010151600080878481518110611eb657611eb661376e565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b031681526020019081526020016000206000828254611efe91906136f4565b90915550819050611f0e81613707565b915050611e7e565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611f67929190613942565b60405180910390a4610eb88160008787878761298e565b8151835114611f9f5760405162461bcd60e51b8152600401610ba9906138fa565b6001600160a01b038416611fc55760405162461bcd60e51b8152600401610ba990613970565b33611fd481878787878761281d565b60005b84518110156120ba576000858281518110611ff457611ff461376e565b6020026020010151905060008583815181106120125761201261376e565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156120625760405162461bcd60e51b8152600401610ba9906139b5565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b1682528120805484929061209f9084906136f4565b92505081905550505050806120b390613707565b9050611fd7565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161210a929190613942565b60405180910390a461212081878787878761298e565b505050505050565b612130612a49565b6003805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b0383166121a35760405162461bcd60e51b8152600401610ba9906139ff565b3360006121af846127d2565b905060006121bc846127d2565b90506121dc8387600085856040518060200160405280600081525061281d565b6000858152602081815260408083206001600160a01b038a1684529091529020548481101561221d5760405162461bcd60e51b8152600401610ba990613a42565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4604080516020810190915260009052611e1b565b6001600160a01b0383166122bb5760405162461bcd60e51b8152600401610ba9906139ff565b80518251146122dc5760405162461bcd60e51b8152600401610ba9906138fa565b60003390506122ff8185600086866040518060200160405280600081525061281d565b60005b83518110156123c457600084828151811061231f5761231f61376e565b60200260200101519050600084838151811061233d5761233d61376e565b602090810291909101810151600084815280835260408082206001600160a01b038c16835290935291909120549091508181101561238d5760405162461bcd60e51b8152600401610ba990613a42565b6000928352602083815260408085206001600160a01b038b16865290915290922091039055806123bc81613707565b915050612302565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051612415929190613942565b60405180910390a4604080516020810190915260009052610e54565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61248b612a99565b6003805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586121603390565b816001600160a01b0316836001600160a01b0316036125395760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610ba9565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60008060006125b58585612ae6565b9150915061107781612b2b565b6001600160a01b0384166125e85760405162461bcd60e51b8152600401610ba990613970565b3360006125f4856127d2565b90506000612601856127d2565b905061261183898985858961281d565b6000868152602081815260408083206001600160a01b038c168452909152902054858110156126525760405162461bcd60e51b8152600401610ba9906139b5565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a1682528120805488929061268f9084906136f4565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46126ef848a8a8a8a8a612833565b505050505050505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106127395772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310612765576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061278357662386f26fc10000830492506010015b6305f5e100831061279b576305f5e100830492506008015b61271083106127af57612710830492506004015b606483106127c1576064830492506002015b600a8310610bd55760010192915050565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061280c5761280c61376e565b602090810291909101015292915050565b612825612a99565b612120868686868686612c75565b6001600160a01b0384163b156121205760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906128779089908990889088908890600401613a86565b6020604051808303816000875af19250505080156128b2575060408051601f3d908101601f191682019092526128af91810190613acb565b60015b61295e576128be613ae8565b806308c379a0036128f757506128d2613b03565b806128dd57506128f9565b8060405162461bcd60e51b8152600401610ba99190613083565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610ba9565b6001600160e01b0319811663f23a6e6160e01b14611e1b5760405162461bcd60e51b8152600401610ba990613b8c565b6001600160a01b0384163b156121205760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906129d29089908990889088908890600401613bd4565b6020604051808303816000875af1925050508015612a0d575060408051601f3d908101601f19168201909252612a0a91810190613acb565b60015b612a19576128be613ae8565b6001600160e01b0319811663bc197c8160e01b14611e1b5760405162461bcd60e51b8152600401610ba990613b8c565b600354600160a01b900460ff16610f2c5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610ba9565b600354600160a01b900460ff1615610f2c5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610ba9565b6000808251604103612b1c5760208301516040840151606085015160001a612b1087828585612dee565b94509450505050612b24565b506000905060025b9250929050565b6000816004811115612b3f57612b3f613c32565b03612b475750565b6001816004811115612b5b57612b5b613c32565b03612ba85760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610ba9565b6002816004811115612bbc57612bbc613c32565b03612c095760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610ba9565b6003816004811115612c1d57612c1d613c32565b03610c3c5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610ba9565b6001600160a01b038516612cfc5760005b8351811015612cfa57828181518110612ca157612ca161376e565b602002602001015160046000868481518110612cbf57612cbf61376e565b602002602001015181526020019081526020016000206000828254612ce491906136f4565b90915550612cf3905081613707565b9050612c86565b505b6001600160a01b0384166121205760005b8351811015611e1b576000848281518110612d2a57612d2a61376e565b602002602001015190506000848381518110612d4857612d4861376e565b6020026020010151905060006004600084815260200190815260200160002054905081811015612dcb5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b6064820152608401610ba9565b60009283526004602052604090922091039055612de781613707565b9050612d0d565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612e255750600090506003612ea9565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612e79573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612ea257600060019250925050612ea9565b9150600090505b94509492505050565b80356001600160a01b0381168114612ec957600080fd5b919050565b60008060408385031215612ee157600080fd5b612eea83612eb2565b946020939093013593505050565b6001600160e01b031981168114610c3c57600080fd5b600060208284031215612f2057600080fd5b813561196a81612ef8565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b0381118282101715612f6657612f66612f2b565b6040525050565b60006001600160401b03831115612f8657612f86612f2b565b604051612f9d601f8501601f191660200182612f41565b809150838152848484011115612fb257600080fd5b83836020830137600060208583010152509392505050565b600060208284031215612fdc57600080fd5b81356001600160401b03811115612ff257600080fd5b8201601f8101841361300357600080fd5b61301284823560208401612f6d565b949350505050565b60006020828403121561302c57600080fd5b5035919050565b60005b8381101561304e578181015183820152602001613036565b50506000910152565b6000815180845261306f816020860160208601613033565b601f01601f19169290920160200192915050565b60208152600061196a6020830184613057565b600080602083850312156130a957600080fd5b82356001600160401b03808211156130c057600080fd5b818501915085601f8301126130d457600080fd5b8135818111156130e357600080fd5b8660208260051b85010111156130f857600080fd5b60209290920196919550909350505050565b60006001600160401b0382111561312357613123612f2b565b5060051b60200190565b600082601f83011261313e57600080fd5b8135602061314b8261310a565b6040516131588282612f41565b83815260059390931b850182019282810191508684111561317857600080fd5b8286015b84811015613193578035835291830191830161317c565b509695505050505050565b600082601f8301126131af57600080fd5b61196a83833560208501612f6d565b600080600080608085870312156131d457600080fd5b6131dd85612eb2565b935060208501356001600160401b03808211156131f957600080fd5b6132058883890161312d565b9450604087013591508082111561321b57600080fd5b6132278883890161312d565b9350606087013591508082111561323d57600080fd5b5061324a8782880161319e565b91505092959194509250565b600080600080600060a0868803121561326e57600080fd5b61327786612eb2565b945061328560208701612eb2565b935060408601356001600160401b03808211156132a157600080fd5b6132ad89838a0161312d565b945060608801359150808211156132c357600080fd5b6132cf89838a0161312d565b935060808801359150808211156132e557600080fd5b506132f28882890161319e565b9150509295509295909350565b80358015158114612ec957600080fd5b60006020828403121561332157600080fd5b61196a826132ff565b6000806040838503121561333d57600080fd5b82356001600160401b038082111561335457600080fd5b818501915085601f83011261336857600080fd5b813560206133758261310a565b6040516133828282612f41565b83815260059390931b85018201928281019150898411156133a257600080fd5b948201945b838610156133c7576133b886612eb2565b825294820194908201906133a7565b965050860135925050808211156133dd57600080fd5b506133ea8582860161312d565b9150509250929050565b600081518084526020808501945080840160005b8381101561342457815187529582019590820190600101613408565b509495945050505050565b60208152600061196a60208301846133f4565b60008060006060848603121561345757600080fd5b61346084612eb2565b925060208401356001600160401b038082111561347c57600080fd5b6134888783880161312d565b9350604086013591508082111561349e57600080fd5b506134ab8682870161312d565b9150509250925092565b6000602082840312156134c757600080fd5b61196a82612eb2565b600080604083850312156134e357600080fd5b8235915060208301356001600160401b0381111561350057600080fd5b6133ea8582860161319e565b6000806040838503121561351f57600080fd5b61352883612eb2565b9150613536602084016132ff565b90509250929050565b6000806040838503121561355257600080fd5b612eea836132ff565b6000806040838503121561356e57600080fd5b61357783612eb2565b915060208301356001600160401b0381111561350057600080fd5b600080604083850312156135a557600080fd5b6135ae83612eb2565b915061353660208401612eb2565b600080604083850312156135cf57600080fd5b50508035926020909101359150565b600080600080600060a086880312156135f657600080fd5b6135ff86612eb2565b945061360d60208701612eb2565b9350604086013592506060860135915060808601356001600160401b0381111561363657600080fd5b6132f28882890161319e565b60008060006060848603121561365757600080fd5b61366084612eb2565b95602085013595506040909401359392505050565b600181811c9082168061368957607f821691505b6020821081036136a957634e487b7160e01b600052602260045260246000fd5b50919050565b600083516136c1818460208801613033565b8351908301906136d5818360208801613033565b01949350505050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610bd557610bd56136de565b600060018201613719576137196136de565b5060010190565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561379657600080fd5b5051919050565b8082028115828204841417610bd557610bd56136de565b601f821115610e3b57600081815260208120601f850160051c810160208610156137db5750805b601f850160051c820191505b81811015612120578281556001016137e7565b81516001600160401b0381111561381357613813612f2b565b613827816138218454613675565b846137b4565b602080601f83116001811461385c57600084156138445750858301515b600019600386901b1c1916600185901b178555612120565b600085815260208120601f198616915b8281101561388b5788860151825594840194600190910190840161386c565b50858210156138a95787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60408152600061395560408301856133f4565b828103602084015261396781856133f4565b95945050505050565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090613ac090830184613057565b979650505050505050565b600060208284031215613add57600080fd5b815161196a81612ef8565b600060033d1115610dc15760046000803e5060005160e01c90565b600060443d1015613b115790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715613b4057505050505090565b8285019150815181811115613b585750505050505090565b843d8701016020828501011115613b725750505050505090565b613b8160208286010187612f41565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a060408201819052600090613c00908301866133f4565b8281036060840152613c1281866133f4565b90508281036080840152613c268185613057565b98975050505050505050565b634e487b7160e01b600052602160045260246000fdfea26469706673582212209c073c913f6f3c283ce53a80d21a610107888510bbfd359f15c9b1480388157864736f6c63430008120033

Deployed Bytecode Sourcemap

78459:6456:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59626:230;;;;;;;;;;-1:-1:-1;59626:230:0;;;;;:::i;:::-;;:::i;:::-;;;597:25:1;;;585:2;570:18;59626:230:0;;;;;;;;58649:310;;;;;;;;;;-1:-1:-1;58649:310:0;;;;;:::i;:::-;;:::i;:::-;;;1184:14:1;;1177:22;1159:41;;1147:2;1132:18;58649:310:0;1019:187:1;83333:89:0;;;;;;;;;;-1:-1:-1;83333:89:0;;;;;:::i;:::-;;:::i;:::-;;82877:448;;;;;;;;;;-1:-1:-1;82877:448:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;84011:73::-;;;;;;;;;;;;;:::i;78817:44::-;;;;;;;;;;;;78860:1;78817:44;;36289:120;;;;;;;;;;;;;:::i;81636:267::-;;;;;;;;;;-1:-1:-1;81636:267:0;;;;;:::i;:::-;;:::i;81911:191::-;;;;;;;;;;-1:-1:-1;81911:191:0;;;;;:::i;:::-;;:::i;83932:71::-;;;;;;;;;;;;;:::i;61569:438::-;;;;;;;;;;-1:-1:-1;61569:438:0;;;;;:::i;:::-;;:::i;36514:32::-;;;;;;;;;;;;;;;;79331:40;;;;;;;;;;;;;;;;84555:167;;;:::i;83859:65::-;;;;;;;;;;;;;:::i;79518:28::-;;;;;;;;;;-1:-1:-1;79518:28:0;;;;;;;;;;;83733:116;;;;;;;;;;-1:-1:-1;83733:116:0;;;;;:::i;:::-;;:::i;84433:114::-;;;;;;;;;;-1:-1:-1;84433:114:0;;;;;:::i;:::-;;:::i;60022:524::-;;;;;;;;;;-1:-1:-1;60022:524:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;76102:122::-;;;;;;;;;;-1:-1:-1;76102:122:0;;;;;:::i;:::-;76159:4;75980:16;;;:12;:16;;;;;;-1:-1:-1;;;76102:122:0;79630:28;;;;;;;;;;-1:-1:-1;79630:28:0;;;;;;;;31418:86;;;;;;;;;;-1:-1:-1;31489:7:0;;-1:-1:-1;;;31489:7:0;;;;31418:86;;79418:44;;;;;;;;;;;;;;;;38596:119;;;;;;;;;;-1:-1:-1;38596:119:0;;;;;:::i;:::-;;:::i;81372:256::-;;;;;;;;;;;;;:::i;78017:358::-;;;;;;;;;;-1:-1:-1;78017:358:0;;;;;:::i;:::-;;:::i;84730:180::-;;;;;;;;;;;;;:::i;79378:33::-;;;;;;;;;;-1:-1:-1;79378:33:0;;;;;;;;79772:59;;;;;;;;;;-1:-1:-1;79772:59:0;;;;;:::i;:::-;;;;;;;;;;;;;;79469:40;;;;;;;;;;-1:-1:-1;79469:40:0;;;;;;;;78642:52;;;;;;;;;;;;78684:10;78642:52;;83430:61;;;;;;;;;;;;;:::i;33635:87::-;;;;;;;;;;-1:-1:-1;33708:6:0;;-1:-1:-1;;;;;33708:6:0;33635:87;;;-1:-1:-1;;;;;10532:32:1;;;10514:51;;10502:2;10487:18;33635:87:0;10368:203:1;79703:62:0;;;;;;;;;;-1:-1:-1;79703:62:0;;;;;:::i;:::-;;;;;;;;;;;;;;79881:776;;;;;;:::i;:::-;;:::i;82447:422::-;;;;;;;;;;;;;:::i;80665:699::-;;;;;;:::i;:::-;;:::i;60619:155::-;;;;;;;;;;-1:-1:-1;60619:155:0;;;;;:::i;:::-;;:::i;79293:31::-;;;;;;;;;;-1:-1:-1;79293:31:0;;;;;;;;36553:30;;;;;;;;;;;;;;;;78764:46;;;;;;;;;;;;78809:1;78764:46;;38351:167;;;;;;;;;;;;;:::i;79555:33::-;;;;;;;;;;;;;;;;37091:258;;;;;;;;;;;;;:::i;79595:28::-;;;;;;;;;;;;;;;;75891:113;;;;;;;;;;-1:-1:-1;75891:113:0;;;;;:::i;:::-;75953:7;75980:16;;;:12;:16;;;;;;;75891:113;84092:170;;;;;;;;;;-1:-1:-1;84092:170:0;;;;;:::i;:::-;;:::i;35248:81::-;;;;;;;;;;;;35294:35;35248:81;;35719:333;;;;;;;;;;-1:-1:-1;35719:333:0;;;;;:::i;:::-;;:::i;35431:110::-;;;;;;;;;;-1:-1:-1;35431:110:0;;;;;:::i;:::-;;:::i;84270:155::-;;;;;;;;;;-1:-1:-1;84270:155:0;;;;;:::i;:::-;;:::i;78701:56::-;;;;;;;;;;;;78746:11;78701:56;;78601:34;;;;;;;;;;;;;;;;83635:89;;;;;;;;;;-1:-1:-1;83635:89:0;;;;;:::i;:::-;;:::i;35549:162::-;;;;;;;;;;-1:-1:-1;35549:162:0;;;;;:::i;:::-;;:::i;37940:35::-;;;;;;;;;;;;;;;;60846:168;;;;;;;;;;-1:-1:-1;60846:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;60969:27:0;;;60945:4;60969:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;60846:168;37495:334;;;;;;;;;;-1:-1:-1;37495:334:0;;;;;:::i;:::-;;:::i;35338:30::-;;;;;;;;;;-1:-1:-1;35338:30:0;;;;-1:-1:-1;;;;;35338:30:0;;;61086:406;;;;;;;;;;-1:-1:-1;61086:406:0;;;;;:::i;:::-;;:::i;83499:128::-;;;;;;;;;;-1:-1:-1;83499:128:0;;;;;:::i;:::-;;:::i;34541:201::-;;;;;;;;;;-1:-1:-1;34541:201:0;;;;;:::i;:::-;;:::i;77683:326::-;;;;;;;;;;-1:-1:-1;77683:326:0;;;;;:::i;:::-;;:::i;59626:230::-;59712:7;-1:-1:-1;;;;;59740:21:0;;59732:76;;;;-1:-1:-1;;;59732:76:0;;13538:2:1;59732:76:0;;;13520:21:1;13577:2;13557:18;;;13550:30;13616:34;13596:18;;;13589:62;-1:-1:-1;;;13667:18:1;;;13660:40;13717:19;;59732:76:0;;;;;;;;;-1:-1:-1;59826:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;59826:22:0;;;;;;;;;;59626:230;;;;;:::o;58649:310::-;58751:4;-1:-1:-1;;;;;;58788:41:0;;-1:-1:-1;;;58788:41:0;;:110;;-1:-1:-1;;;;;;;58846:52:0;;-1:-1:-1;;;58846:52:0;58788:110;:163;;;-1:-1:-1;;;;;;;;;;50039:40:0;;;58915:36;49930:157;83333:89;33521:13;:11;:13::i;:::-;83399:15:::1;83407:6;83399:7;:15::i;:::-;83333:89:::0;:::o;82877:448::-;76159:4;75980:16;;;:12;:16;;;;;;82985:13;;83016:73;;;;-1:-1:-1;;;83016:73:0;;13949:2:1;83016:73:0;;;13931:21:1;13988:2;13968:18;;;13961:30;14027:33;14007:18;;;14000:61;14078:18;;83016:73:0;13747:355:1;83016:73:0;83114:8;;;;83110:62;;83146:14;83139:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82877:448;;;:::o;83110:62::-;83221:1;83197:13;83207:2;83197:9;:13::i;:::-;83191:27;:31;:126;;;;;;;;;;;;;;;;;83262:13;83272:2;83262:9;:13::i;:::-;83277:20;83294:2;83277:16;:20::i;:::-;83245:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;83184:133;82877:448;-1:-1:-1;;82877:448:0:o;84011:73::-;33521:13;:11;:13::i;:::-;84060:8:::1;:16:::0;;-1:-1:-1;;84060:16:0::1;::::0;;84011:73::o;36289:120::-;36354:7;33521:13;:11;:13::i;:::-;36381:20:::1;:18;:20::i;:::-;36374:27;;33545:1;36289:120:::0;:::o;81636:267::-;33521:13;:11;:13::i;:::-;81723:9:::1;;:16;;81710:9;;:29;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;81750:14:0::1;:34:::0;;81768:9;;81750:14;::::1;::::0;:34:::1;::::0;81768:9;;81750:34:::1;:::i;:::-;::::0;;;-1:-1:-1;81800:9:0::1;::::0;-1:-1:-1;81795:101:0::1;81815:20:::0;;::::1;81795:101;;;81857:27;81863:10;81875:1;81878;81857:27;;;;;;;;;;;::::0;:5:::1;:27::i;:::-;81837:3:::0;::::1;::::0;::::1;:::i;:::-;;;;81795:101;;;;81636:267:::0;;:::o;81911:191::-;33521:13;:11;:13::i;:::-;82060:34:::1;82071:2;82075:3;82080:7;82089:4;82060:10;:34::i;:::-;81911:191:::0;;;;:::o;83932:71::-;33521:13;:11;:13::i;:::-;83980:8:::1;:15:::0;;-1:-1:-1;;83980:15:0::1;;;::::0;;83932:71::o;61569:438::-;-1:-1:-1;;;;;61802:20:0;;29611:10;61802:20;;:60;;-1:-1:-1;61826:36:0;61843:4;29611:10;60846:168;:::i;61826:36::-;61780:156;;;;-1:-1:-1;;;61780:156:0;;;;;;;:::i;:::-;61947:52;61970:4;61976:2;61980:3;61985:7;61994:4;61947:22;:52::i;:::-;61569:438;;;;;:::o;84555:167::-;33521:13;:11;:13::i;:::-;84630:58:::1;::::0;84612:12:::1;::::0;84638:10:::1;::::0;84662:21:::1;::::0;84612:12;84630:58;84612:12;84630:58;84662:21;84638:10;84630:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84611:77;;;84707:7;84699:16;;;::::0;::::1;83859:65:::0;33521:13;:11;:13::i;:::-;83906:10:::1;:8;:10::i;:::-;83859:65::o:0;83733:116::-;33521:13;:11;:13::i;:::-;83811::::1;:30:::0;83733:116::o;84433:114::-;33521:13;:11;:13::i;:::-;84510:20:::1;:29:::0;;-1:-1:-1;;84510:29:0::1;::::0;::::1;;::::0;;;::::1;::::0;;84433:114::o;60022:524::-;60178:16;60239:3;:10;60220:8;:15;:29;60212:83;;;;-1:-1:-1;;;60212:83:0;;16222:2:1;60212:83:0;;;16204:21:1;16261:2;16241:18;;;16234:30;16300:34;16280:18;;;16273:62;-1:-1:-1;;;16351:18:1;;;16344:39;16400:19;;60212:83:0;16020:405:1;60212:83:0;60308:30;60355:8;:15;-1:-1:-1;;;;;60341:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60341:30:0;;60308:63;;60389:9;60384:122;60408:8;:15;60404:1;:19;60384:122;;;60464:30;60474:8;60483:1;60474:11;;;;;;;;:::i;:::-;;;;;;;60487:3;60491:1;60487:6;;;;;;;;:::i;:::-;;;;;;;60464:9;:30::i;:::-;60445:13;60459:1;60445:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;60425:3;;;:::i;:::-;;;60384:122;;;-1:-1:-1;60525:13:0;60022:524;-1:-1:-1;;;60022:524:0:o;38596:119::-;33521:13;:11;:13::i;:::-;38674:20:::1;:33:::0;38596:119::o;81372:256::-;81423:8;;;;;;;81415:38;;;;-1:-1:-1;;;81415:38:0;;16764:2:1;81415:38:0;;;16746:21:1;16803:2;16783:18;;;16776:30;-1:-1:-1;;;16822:18:1;;;16815:47;16879:18;;81415:38:0;16562:341:1;81415:38:0;81472:29;;-1:-1:-1;;;81472:29:0;;81487:10;81472:29;;;17090:51:1;81499:1:0;17157:18:1;;;17150:34;81505:1:0;;81472:4;;:14;;17063:18:1;;81472:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:34;;81464:86;;;;-1:-1:-1;;;81464:86:0;;17586:2:1;81464:86:0;;;17568:21:1;17625:2;17605:18;;;17598:30;17664:34;17644:18;;;17637:62;-1:-1:-1;;;17715:18:1;;;17708:37;17762:19;;81464:86:0;17384:403:1;81464:86:0;81561:21;81567:10;81578:1;81580;81561:5;:21::i;:::-;81593:27;81599:10;81611:1;81614;81593:27;;;;;;;;;;;;:5;:27::i;78017:358::-;-1:-1:-1;;;;;78182:23:0;;29611:10;78182:23;;:66;;-1:-1:-1;78209:39:0;78226:7;29611:10;60846:168;:::i;78209:39::-;78160:162;;;;-1:-1:-1;;;78160:162:0;;;;;;;:::i;:::-;78335:32;78346:7;78355:3;78360:6;78335:10;:32::i;84730:180::-;33521:13;:11;:13::i;:::-;84803:20:::1;::::0;::::1;;84795:66;;;::::0;-1:-1:-1;;;84795:66:0;;17994:2:1;84795:66:0::1;::::0;::::1;17976:21:1::0;18033:2;18013:18;;;18006:30;18072:34;18052:18;;;18045:62;-1:-1:-1;;;18123:18:1;;;18116:32;18165:19;;84795:66:0::1;17792:398:1::0;84795:66:0::1;84872:30;84899:1;84872:18;:30::i;83430:61::-:0;33521:13;:11;:13::i;:::-;83475:8:::1;:6;:8::i;79881:776::-:0;36653:21;:19;:21::i;:::-;36631:112;;;;-1:-1:-1;;;36631:112:0;;18397:2:1;36631:112:0;;;18379:21:1;18436:2;18416:18;;;18409:30;18475:34;18455:18;;;18448:62;-1:-1:-1;;;18526:18:1;;;18519:39;18575:19;;36631:112:0;18195:405:1;36631:112:0;36180:15:::1;::::0;80027:10:::1;::::0;80039:9;;-1:-1:-1;;;;;36180:15:0::1;36144:32;80027:10:::0;80039:9;36144:13:::1;:32::i;:::-;-1:-1:-1::0;;;;;36144:51:0::1;;36136:125;;;::::0;-1:-1:-1;;;36136:125:0;;18807:2:1;36136:125:0::1;::::0;::::1;18789:21:1::0;18846:2;18826:18;;;18819:30;18885:26;18865:18;;;18858:54;18929:18;;36136:125:0::1;18605:348:1::0;36136:125:0::1;80113:10:::2;80088:36;::::0;;;:24:::2;:36;::::0;;;;;78923:1:::2;::::0;80088:47:::2;::::0;80127:8;;80088:47:::2;:::i;:::-;:96;;80066:172;;;::::0;-1:-1:-1;;;80066:172:0;;19160:2:1;80066:172:0::2;::::0;::::2;19142:21:1::0;19199:2;19179:18;;;19172:30;19238:28;19218:18;;;19211:56;19284:18;;80066:172:0::2;18958:350:1::0;80066:172:0::2;80295:13;;80285:8;80270:14;;:23;;;;:::i;:::-;:38;;80249:109;;;::::0;-1:-1:-1;;;80249:109:0;;19515:2:1;80249:109:0::2;::::0;::::2;19497:21:1::0;19554:2;19534:18;;;19527:30;-1:-1:-1;;;19573:18:1;;;19566:52;19635:18;;80249:109:0::2;19313:346:1::0;80249:109:0::2;80377:9;80390:10;80377:23;80369:64;;;::::0;-1:-1:-1;;;80369:64:0;;19866:2:1;80369:64:0::2;::::0;::::2;19848:21:1::0;19905:2;19885:18;;;19878:30;19944:31;19924:18;;;19917:59;19993:18;;80369:64:0::2;19664:353:1::0;80369:64:0::2;80476:10;:8;:10::i;:::-;80465:21;::::0;:8;:21:::2;:::i;:::-;80452:9;:34;;80444:60;;;::::0;-1:-1:-1;;;80444:60:0;;20397:2:1;80444:60:0::2;::::0;::::2;20379:21:1::0;20436:2;20416:18;;;20409:30;-1:-1:-1;;;20455:18:1;;;20448:43;20508:18;;80444:60:0::2;20195:337:1::0;80444:60:0::2;80542:10;80517:36;::::0;;;:24:::2;:36;::::0;;;;:48;;80557:8;;80517:36;:48:::2;::::0;80557:8;;80517:48:::2;:::i;:::-;;;;;;;;80594:8;80576:14;;:26;;;;;;;:::i;:::-;;;;;;;;80615:34;80621:10;80633:1;80636:8;80615:34;;;;;;;;;;;::::0;:5:::2;:34::i;82447:422::-:0;82488:7;82512:24;:22;:24::i;:::-;82508:354;;;82556:11;;;;82553:133;;;-1:-1:-1;82594:12:0;;;82447:422::o;82553:133::-;-1:-1:-1;78746:11:0;;82447:422::o;82508:354::-;82719:13;;;;82716:135;;;-1:-1:-1;82759:15:0;;;82447:422::o;82716:135::-;-1:-1:-1;78684:10:0;;82447:422::o;80665:699::-;38048:24;:22;:24::i;:::-;38026:118;;;;-1:-1:-1;;;38026:118:0;;20739:2:1;38026:118:0;;;20721:21:1;20778:2;20758:18;;;20751:30;20817:34;20797:18;;;20790:62;-1:-1:-1;;;20868:18:1;;;20861:42;20920:19;;38026:118:0;20537:408:1;38026:118:0;80823:13:::1;;80813:8;80798:14;;:23;;;;:::i;:::-;:38;;80777:109;;;::::0;-1:-1:-1;;;80777:109:0;;19515:2:1;80777:109:0::1;::::0;::::1;19497:21:1::0;19554:2;19534:18;;;19527:30;-1:-1:-1;;;19573:18:1;;;19566:52;19635:18;;80777:109:0::1;19313:346:1::0;80777:109:0::1;80905:9;80918:10;80905:23;80897:64;;;::::0;-1:-1:-1;;;80897:64:0;;19866:2:1;80897:64:0::1;::::0;::::1;19848:21:1::0;19905:2;19885:18;;;19878:30;19944:31;19924:18;;;19917:59;19993:18;;80897:64:0::1;19664:353:1::0;80897:64:0::1;81022:10;80994:39;::::0;;;:27:::1;:39;::::0;;;;;78809:1:::1;::::0;80994:50:::1;::::0;81036:8;;80994:50:::1;:::i;:::-;:89;;80972:165;;;::::0;-1:-1:-1;;;80972:165:0;;19160:2:1;80972:165:0::1;::::0;::::1;19142:21:1::0;19199:2;19179:18;;;19172:30;19238:28;19218:18;;;19211:56;19284:18;;80972:165:0::1;18958:350:1::0;80972:165:0::1;81180:10;:8;:10::i;:::-;81169:21;::::0;:8;:21:::1;:::i;:::-;81156:9;:34;;81148:60;;;::::0;-1:-1:-1;;;81148:60:0;;20397:2:1;81148:60:0::1;::::0;::::1;20379:21:1::0;20436:2;20416:18;;;20409:30;-1:-1:-1;;;20455:18:1;;;20448:43;20508:18;;81148:60:0::1;20195:337:1::0;81148:60:0::1;81249:10;81221:39;::::0;;;:27:::1;:39;::::0;;;;:51;;81264:8;;81221:39;:51:::1;::::0;81264:8;;81221:51:::1;:::i;:::-;;;;;;;;81301:8;81283:14;;:26;;;;;;;:::i;:::-;;;;;;;;81322:34;81328:10;81340:1;81343:8;81322:34;;;;;;;;;;;::::0;:5:::1;:34::i;60619:155::-:0;60714:52;29611:10;60747:8;60757;60714:18;:52::i;:::-;60619:155;;:::o;38351:167::-;38406:4;38466:1;38443:20;;:24;:67;;;;-1:-1:-1;;38490:20:0;;38471:15;:39;;;38351:167::o;37091:258::-;37143:4;37200:1;37180:17;;:21;:57;;;;;37236:1;37218:15;;:19;37180:57;:110;;;;;37273:17;;37254:15;:36;;37180:110;:161;;;;-1:-1:-1;;37326:15:0;;37307;:34;;;37091:258::o;84092:170::-;33521:13;:11;:13::i;:::-;84187::::1;:31:::0;;-1:-1:-1;;84187:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;84229:15:::1;:25:::0;84092:170::o;35719:333::-;35775:7;35794:21;35893:120;35915:20;:18;:20::i;:::-;35963:39;;;35294:35;35963:39;;;;21124:25:1;;;;-1:-1:-1;;;;;21185:32:1;;21165:18;;;21158:60;35963:39:0;;;;;;;;;21097:18:1;;;35963:39:0;;35953:50;;;;;;-1:-1:-1;;;23887:57:0;;;28975:27:1;29018:11;;;29011:27;;;;29054:12;;;;29047:28;;;;23887:57:0;;;;;;;;;;29091:12:1;;;;23887:57:0;;;23877:68;;;;;;23757:196;35893:120;35828:186;;21471:66:1;35828:186:0;;;21459:79:1;21554:12;;;21547:28;;;;21591:12;;35828:186:0;;;-1:-1:-1;;35828:186:0;;;;;;;;;35818:197;;35828:186;35818:197;;;;;35719:333;-1:-1:-1;;;35719:333:0:o;35431:110::-;33521:13;:11;:13::i;:::-;35507:15:::1;:26:::0;;-1:-1:-1;;;;;;35507:26:0::1;-1:-1:-1::0;;;;;35507:26:0;;;::::1;::::0;;;::::1;::::0;;35431:110::o;84270:155::-;33521:13;:11;:13::i;:::-;84359:11:::1;:27:::0;;-1:-1:-1;;84359:27:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;84397:12:::1;:20:::0;84270:155::o;83635:89::-;33521:13;:11;:13::i;:::-;83699:8:::1;:17:::0;;-1:-1:-1;;83699:17:0::1;::::0;::::1;;::::0;;;::::1;::::0;;83635:89::o;35549:162::-;35633:7;35660:43;35674:17;35684:6;35674:9;:17::i;:::-;35693:9;35660:13;:43::i;:::-;35653:50;35549:162;-1:-1:-1;;;35549:162:0:o;37495:334::-;33521:13;:11;:13::i;:::-;37645:10:::1;37633:8;:22;;37611:132;;;::::0;-1:-1:-1;;;37611:132:0;;21816:2:1;37611:132:0::1;::::0;::::1;21798:21:1::0;21855:2;21835:18;;;21828:30;21894:34;21874:18;;;21867:62;21965:30;21945:18;;;21938:58;22013:19;;37611:132:0::1;21614:424:1::0;37611:132:0::1;37754:17;:30:::0;;;;37795:15:::1;:26:::0;37495:334::o;61086:406::-;-1:-1:-1;;;;;61294:20:0;;29611:10;61294:20;;:60;;-1:-1:-1;61318:36:0;61335:4;29611:10;60846:168;:::i;61318:36::-;61272:156;;;;-1:-1:-1;;;61272:156:0;;;;;;;:::i;:::-;61439:45;61457:4;61463:2;61467;61471:6;61479:4;61439:17;:45::i;83499:128::-;33521:13;:11;:13::i;:::-;83587:14:::1;:32;83604:15:::0;83587:14;:32:::1;:::i;34541:201::-:0;33521:13;:11;:13::i;:::-;-1:-1:-1;;;;;34630:22:0;::::1;34622:73;;;::::0;-1:-1:-1;;;34622:73:0;;24449:2:1;34622:73:0::1;::::0;::::1;24431:21:1::0;24488:2;24468:18;;;24461:30;24527:34;24507:18;;;24500:62;-1:-1:-1;;;24578:18:1;;;24571:36;24624:19;;34622:73:0::1;24247:402:1::0;34622:73:0::1;34706:28;34725:8;34706:18;:28::i;77683:326::-:0;-1:-1:-1;;;;;77823:23:0;;29611:10;77823:23;;:66;;-1:-1:-1;77850:39:0;77867:7;29611:10;60846:168;:::i;77850:39::-;77801:162;;;;-1:-1:-1;;;77801:162:0;;;;;;;:::i;:::-;77976:25;77982:7;77991:2;77995:5;77976;:25::i;33800:132::-;33708:6;;-1:-1:-1;;;;;33708:6:0;29611:10;33864:23;33856:68;;;;-1:-1:-1;;;33856:68:0;;24856:2:1;33856:68:0;;;24838:21:1;;;24875:18;;;24868:30;24934:34;24914:18;;;24907:62;24986:18;;33856:68:0;24654:356:1;65793:88:0;65860:4;:13;65867:6;65860:4;:13;:::i;59370:105::-;59430:13;59463:4;59456:11;;;;;:::i;13305:716::-;13361:13;13412:14;13429:17;13440:5;13429:10;:17::i;:::-;13449:1;13429:21;13412:38;;13465:20;13499:6;-1:-1:-1;;;;;13488:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13488:18:0;-1:-1:-1;13465:41:0;-1:-1:-1;13630:28:0;;;13646:2;13630:28;13687:288;-1:-1:-1;;13719:5:0;-1:-1:-1;;;13856:2:0;13845:14;;13840:30;13719:5;13827:44;13917:2;13908:11;;;-1:-1:-1;13938:21:0;13687:288;13938:21;-1:-1:-1;13996:6:0;13305:716;-1:-1:-1;;;13305:716:0:o;27193:314::-;27246:7;27278:4;-1:-1:-1;;;;;27287:12:0;27270:29;;:66;;;;;27320:16;27303:13;:33;27270:66;27266:234;;;-1:-1:-1;27360:24:0;;27193:314::o;27266:234::-;27696:73;;;27446:10;27696:73;;;;29373:25:1;;;;27458:12:0;29414:18:1;;;29407:34;27472:15:0;29457:18:1;;;29450:34;27740:13:0;29500:18:1;;;29493:34;27763:4:0;29543:19:1;;;;29536:61;;;;27696:73:0;;;;;;;;;;29345:19:1;;;;27696:73:0;;;27686:84;;;;;27424:64;27515:263;66267:729;-1:-1:-1;;;;;66420:16:0;;66412:62;;;;-1:-1:-1;;;66412:62:0;;;;;;;:::i;:::-;29611:10;66487:16;66552:21;66570:2;66552:17;:21::i;:::-;66529:44;;66584:24;66611:25;66629:6;66611:17;:25::i;:::-;66584:52;;66649:66;66670:8;66688:1;66692:2;66696:3;66701:7;66710:4;66649:20;:66::i;:::-;66728:9;:13;;;;;;;;;;;-1:-1:-1;;;;;66728:17:0;;;;;;;;;:27;;66749:6;;66728:9;:27;;66749:6;;66728:27;:::i;:::-;;;;-1:-1:-1;;66771:52:0;;;25723:25:1;;;25779:2;25764:18;;25757:34;;;-1:-1:-1;;;;;66771:52:0;;;;66804:1;;66771:52;;;;;;25696:18:1;66771:52:0;;;;;;;66914:74;66945:8;66963:1;66967:2;66971;66975:6;66983:4;66914:30;:74::i;:::-;66401:595;;;66267:729;;;;:::o;67399:813::-;-1:-1:-1;;;;;67577:16:0;;67569:62;;;;-1:-1:-1;;;67569:62:0;;;;;;;:::i;:::-;67664:7;:14;67650:3;:10;:28;67642:81;;;;-1:-1:-1;;;67642:81:0;;;;;;;:::i;:::-;29611:10;67780:66;29611:10;67736:16;67823:2;67827:3;67832:7;67841:4;67780:20;:66::i;:::-;67864:9;67859:103;67883:3;:10;67879:1;:14;67859:103;;;67940:7;67948:1;67940:10;;;;;;;;:::i;:::-;;;;;;;67915:9;:17;67925:3;67929:1;67925:6;;;;;;;;:::i;:::-;;;;;;;67915:17;;;;;;;;;;;:21;67933:2;-1:-1:-1;;;;;67915:21:0;-1:-1:-1;;;;;67915:21:0;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;67895:3:0;;-1:-1:-1;67895:3:0;;;:::i;:::-;;;;67859:103;;;;68015:2;-1:-1:-1;;;;;67979:53:0;68011:1;-1:-1:-1;;;;;67979:53:0;67993:8;-1:-1:-1;;;;;67979:53:0;;68019:3;68024:7;67979:53;;;;;;;:::i;:::-;;;;;;;;68123:81;68159:8;68177:1;68181:2;68185:3;68190:7;68199:4;68123:35;:81::i;63803:1146::-;64030:7;:14;64016:3;:10;:28;64008:81;;;;-1:-1:-1;;;64008:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;64108:16:0;;64100:66;;;;-1:-1:-1;;;64100:66:0;;;;;;;:::i;:::-;29611:10;64223:60;29611:10;64254:4;64260:2;64264:3;64269:7;64278:4;64223:20;:60::i;:::-;64301:9;64296:421;64320:3;:10;64316:1;:14;64296:421;;;64352:10;64365:3;64369:1;64365:6;;;;;;;;:::i;:::-;;;;;;;64352:19;;64386:14;64403:7;64411:1;64403:10;;;;;;;;:::i;:::-;;;;;;;;;;;;64430:19;64452:13;;;;;;;;;;-1:-1:-1;;;;;64452:19:0;;;;;;;;;;;;64403:10;;-1:-1:-1;64494:21:0;;;;64486:76;;;;-1:-1:-1;;;64486:76:0;;;;;;;:::i;:::-;64606:9;:13;;;;;;;;;;;-1:-1:-1;;;;;64606:19:0;;;;;;;;;;64628:20;;;64606:42;;64678:17;;;;;;;:27;;64628:20;;64606:9;64678:27;;64628:20;;64678:27;:::i;:::-;;;;;;;;64337:380;;;64332:3;;;;:::i;:::-;;;64296:421;;;;64764:2;-1:-1:-1;;;;;64734:47:0;64758:4;-1:-1:-1;;;;;64734:47:0;64748:8;-1:-1:-1;;;;;64734:47:0;;64768:3;64773:7;64734:47;;;;;;;:::i;:::-;;;;;;;;64866:75;64902:8;64912:4;64918:2;64922:3;64927:7;64936:4;64866:35;:75::i;:::-;63997:952;63803:1146;;;;;:::o;32273:120::-;31282:16;:14;:16::i;:::-;32332:7:::1;:15:::0;;-1:-1:-1;;;;32332:15:0::1;::::0;;32363:22:::1;29611:10:::0;32372:12:::1;32363:22;::::0;-1:-1:-1;;;;;10532:32:1;;;10514:51;;10502:2;10487:18;32363:22:0::1;;;;;;;32273:120::o:0;68510:808::-;-1:-1:-1;;;;;68637:18:0;;68629:66;;;;-1:-1:-1;;;68629:66:0;;;;;;;:::i;:::-;29611:10;68708:16;68773:21;68791:2;68773:17;:21::i;:::-;68750:44;;68805:24;68832:25;68850:6;68832:17;:25::i;:::-;68805:52;;68870:66;68891:8;68901:4;68915:1;68919:3;68924:7;68870:66;;;;;;;;;;;;:20;:66::i;:::-;68949:19;68971:13;;;;;;;;;;;-1:-1:-1;;;;;68971:19:0;;;;;;;;;;69009:21;;;;69001:70;;;;-1:-1:-1;;;69001:70:0;;;;;;;:::i;:::-;69107:9;:13;;;;;;;;;;;-1:-1:-1;;;;;69107:19:0;;;;;;;;;;;;69129:20;;;69107:42;;69178:54;;25723:25:1;;;25764:18;;;25757:34;;;69107:19:0;;69178:54;;;;;;25696:18:1;69178:54:0;;;;;;;69245:65;;;;;;;;;69289:1;69245:65;;;63803:1146;69568:969;-1:-1:-1;;;;;69720:18:0;;69712:66;;;;-1:-1:-1;;;69712:66:0;;;;;;;:::i;:::-;69811:7;:14;69797:3;:10;:28;69789:81;;;;-1:-1:-1;;;69789:81:0;;;;;;;:::i;:::-;69883:16;29611:10;69883:31;;69927:66;69948:8;69958:4;69972:1;69976:3;69981:7;69927:66;;;;;;;;;;;;:20;:66::i;:::-;70011:9;70006:373;70030:3;:10;70026:1;:14;70006:373;;;70062:10;70075:3;70079:1;70075:6;;;;;;;;:::i;:::-;;;;;;;70062:19;;70096:14;70113:7;70121:1;70113:10;;;;;;;;:::i;:::-;;;;;;;;;;;;70140:19;70162:13;;;;;;;;;;-1:-1:-1;;;;;70162:19:0;;;;;;;;;;;;70113:10;;-1:-1:-1;70204:21:0;;;;70196:70;;;;-1:-1:-1;;;70196:70:0;;;;;;;:::i;:::-;70310:9;:13;;;;;;;;;;;-1:-1:-1;;;;;70310:19:0;;;;;;;;;;70332:20;;70310:42;;70042:3;;;;:::i;:::-;;;;70006:373;;;;70434:1;-1:-1:-1;;;;;70396:55:0;70420:4;-1:-1:-1;;;;;70396:55:0;70410:8;-1:-1:-1;;;;;70396:55:0;;70438:3;70443:7;70396:55;;;;;;;:::i;:::-;;;;;;;;70464:65;;;;;;;;;70508:1;70464:65;;;63803:1146;34902:191;34995:6;;;-1:-1:-1;;;;;35012:17:0;;;-1:-1:-1;;;;;;35012:17:0;;;;;;;35045:40;;34995:6;;;35012:17;34995:6;;35045:40;;34976:16;;35045:40;34965:128;34902:191;:::o;32014:118::-;31023:19;:17;:19::i;:::-;32074:7:::1;:14:::0;;-1:-1:-1;;;;32074:14:0::1;-1:-1:-1::0;;;32074:14:0::1;::::0;;32104:20:::1;32111:12;29611:10:::0;;29531:98;70680:331;70835:8;-1:-1:-1;;;;;70826:17:0;:5;-1:-1:-1;;;;;70826:17:0;;70818:71;;;;-1:-1:-1;;;70818:71:0;;28509:2:1;70818:71:0;;;28491:21:1;28548:2;28528:18;;;28521:30;28587:34;28567:18;;;28560:62;-1:-1:-1;;;28638:18:1;;;28631:39;28687:19;;70818:71:0;28307:405:1;70818:71:0;-1:-1:-1;;;;;70900:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;70900:46:0;;;;;;;;;;70962:41;;1159::1;;;70962::0;;1132:18:1;70962:41:0;;;;;;;70680:331;;;:::o;18955:231::-;19033:7;19054:17;19073:18;19095:27;19106:4;19112:9;19095:10;:27::i;:::-;19053:69;;;;19133:18;19145:5;19133:11;:18::i;62471:974::-;-1:-1:-1;;;;;62659:16:0;;62651:66;;;;-1:-1:-1;;;62651:66:0;;;;;;;:::i;:::-;29611:10;62730:16;62795:21;62813:2;62795:17;:21::i;:::-;62772:44;;62827:24;62854:25;62872:6;62854:17;:25::i;:::-;62827:52;;62892:60;62913:8;62923:4;62929:2;62933:3;62938:7;62947:4;62892:20;:60::i;:::-;62965:19;62987:13;;;;;;;;;;;-1:-1:-1;;;;;62987:19:0;;;;;;;;;;63025:21;;;;63017:76;;;;-1:-1:-1;;;63017:76:0;;;;;;;:::i;:::-;63129:9;:13;;;;;;;;;;;-1:-1:-1;;;;;63129:19:0;;;;;;;;;;63151:20;;;63129:42;;63193:17;;;;;;;:27;;63151:20;;63129:9;63193:27;;63151:20;;63193:27;:::i;:::-;;;;-1:-1:-1;;63238:46:0;;;25723:25:1;;;25779:2;25764:18;;25757:34;;;-1:-1:-1;;;;;63238:46:0;;;;;;;;;;;;;;25696:18:1;63238:46:0;;;;;;;63369:68;63400:8;63410:4;63416:2;63420;63424:6;63432:4;63369:30;:68::i;:::-;62640:805;;;;62471:974;;;;;:::o;10171:922::-;10224:7;;-1:-1:-1;;;10302:15:0;;10298:102;;-1:-1:-1;;;10338:15:0;;;-1:-1:-1;10382:2:0;10372:12;10298:102;10427:6;10418:5;:15;10414:102;;10463:6;10454:15;;;-1:-1:-1;10498:2:0;10488:12;10414:102;10543:6;10534:5;:15;10530:102;;10579:6;10570:15;;;-1:-1:-1;10614:2:0;10604:12;10530:102;10659:5;10650;:14;10646:99;;10694:5;10685:14;;;-1:-1:-1;10728:1:0;10718:11;10646:99;10772:5;10763;:14;10759:99;;10807:5;10798:14;;;-1:-1:-1;10841:1:0;10831:11;10759:99;10885:5;10876;:14;10872:99;;10920:5;10911:14;;;-1:-1:-1;10954:1:0;10944:11;10872:99;10998:5;10989;:14;10985:66;;11034:1;11024:11;11079:6;10171:922;-1:-1:-1;;10171:922:0:o;74946:198::-;75066:16;;;75080:1;75066:16;;;;;;;;;75012;;75041:22;;75066:16;;;;;;;;;;;;-1:-1:-1;75066:16:0;75041:41;;75104:7;75093:5;75099:1;75093:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;75131:5;74946:198;-1:-1:-1;;74946:198:0:o;82110:314::-;31023:19;:17;:19::i;:::-;82350:66:::1;82377:8;82387:4;82393:2;82397:3;82402:7;82411:4;82350:26;:66::i;73373:744::-:0;-1:-1:-1;;;;;73588:13:0;;40248:19;:23;73584:526;;73624:72;;-1:-1:-1;;;73624:72:0;;-1:-1:-1;;;;;73624:38:0;;;;;:72;;73663:8;;73673:4;;73679:2;;73683:6;;73691:4;;73624:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;73624:72:0;;;;;;;;-1:-1:-1;;73624:72:0;;;;;;;;;;;;:::i;:::-;;;73620:479;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;73972:6;73965:14;;-1:-1:-1;;;73965:14:0;;;;;;;;:::i;73620:479::-;;;74021:62;;-1:-1:-1;;;74021:62:0;;31490:2:1;74021:62:0;;;31472:21:1;31529:2;31509:18;;;31502:30;31568:34;31548:18;;;31541:62;-1:-1:-1;;;31619:18:1;;;31612:50;31679:19;;74021:62:0;31288:416:1;73620:479:0;-1:-1:-1;;;;;;73746:55:0;;-1:-1:-1;;;73746:55:0;73742:154;;73826:50;;-1:-1:-1;;;73826:50:0;;;;;;;:::i;74125:813::-;-1:-1:-1;;;;;74365:13:0;;40248:19;:23;74361:570;;74401:79;;-1:-1:-1;;;74401:79:0;;-1:-1:-1;;;;;74401:43:0;;;;;:79;;74445:8;;74455:4;;74461:3;;74466:7;;74475:4;;74401:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;74401:79:0;;;;;;;;-1:-1:-1;;74401:79:0;;;;;;;;;;;;:::i;:::-;;;74397:523;;;;:::i;:::-;-1:-1:-1;;;;;;74562:60:0;;-1:-1:-1;;;74562:60:0;74558:159;;74647:50;;-1:-1:-1;;;74647:50:0;;;;;;;:::i;31762:108::-;31489:7;;-1:-1:-1;;;31489:7:0;;;;31821:41;;;;-1:-1:-1;;;31821:41:0;;33152:2:1;31821:41:0;;;33134:21:1;33191:2;33171:18;;;33164:30;-1:-1:-1;;;33210:18:1;;;33203:50;33270:18;;31821:41:0;32950:344:1;31577:108:0;31489:7;;-1:-1:-1;;;31489:7:0;;;;31647:9;31639:38;;;;-1:-1:-1;;;31639:38:0;;33501:2:1;31639:38:0;;;33483:21:1;33540:2;33520:18;;;33513:30;-1:-1:-1;;;33559:18:1;;;33552:46;33615:18;;31639:38:0;33299:340:1;17406:747:0;17487:7;17496:12;17525:9;:16;17545:2;17525:22;17521:625;;17869:4;17854:20;;17848:27;17919:4;17904:20;;17898:27;17977:4;17962:20;;17956:27;17564:9;17948:36;18020:25;18031:4;17948:36;17848:27;17898;18020:10;:25::i;:::-;18013:32;;;;;;;;;17521:625;-1:-1:-1;18094:1:0;;-1:-1:-1;18098:35:0;17521:625;17406:747;;;;;:::o;15799:521::-;15877:20;15868:5;:29;;;;;;;;:::i;:::-;;15864:449;;15799:521;:::o;15864:449::-;15975:29;15966:5;:38;;;;;;;;:::i;:::-;;15962:351;;16021:34;;-1:-1:-1;;;16021:34:0;;33978:2:1;16021:34:0;;;33960:21:1;34017:2;33997:18;;;33990:30;34056:26;34036:18;;;34029:54;34100:18;;16021:34:0;33776:348:1;15962:351:0;16086:35;16077:5;:44;;;;;;;;:::i;:::-;;16073:240;;16138:41;;-1:-1:-1;;;16138:41:0;;34331:2:1;16138:41:0;;;34313:21:1;34370:2;34350:18;;;34343:30;34409:33;34389:18;;;34382:61;34460:18;;16138:41:0;34129:355:1;16073:240:0;16210:30;16201:5;:39;;;;;;;;:::i;:::-;;16197:116;;16257:44;;-1:-1:-1;;;16257:44:0;;34691:2:1;16257:44:0;;;34673:21:1;34730:2;34710:18;;;34703:30;34769:34;34749:18;;;34742:62;-1:-1:-1;;;34820:18:1;;;34813:32;34862:19;;16257:44:0;34489:398:1;76299:931:0;-1:-1:-1;;;;;76621:18:0;;76617:160;;76661:9;76656:110;76680:3;:10;76676:1;:14;76656:110;;;76740:7;76748:1;76740:10;;;;;;;;:::i;:::-;;;;;;;76716:12;:20;76729:3;76733:1;76729:6;;;;;;;;:::i;:::-;;;;;;;76716:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;76692:3:0;;-1:-1:-1;76692:3:0;;:::i;:::-;;;76656:110;;;;76617:160;-1:-1:-1;;;;;76793:16:0;;76789:434;;76831:9;76826:386;76850:3;:10;76846:1;:14;76826:386;;;76886:10;76899:3;76903:1;76899:6;;;;;;;;:::i;:::-;;;;;;;76886:19;;76924:14;76941:7;76949:1;76941:10;;;;;;;;:::i;:::-;;;;;;;76924:27;;76970:14;76987:12;:16;77000:2;76987:16;;;;;;;;;;;;76970:33;;77040:6;77030;:16;;77022:69;;;;-1:-1:-1;;;77022:69:0;;35094:2:1;77022:69:0;;;35076:21:1;35133:2;35113:18;;;35106:30;35172:34;35152:18;;;35145:62;-1:-1:-1;;;35223:18:1;;;35216:38;35271:19;;77022:69:0;34892:404:1;77022:69:0;77143:16;;;;:12;:16;;;;;;77162:15;;77143:34;;76862:3;;;:::i;:::-;;;76826:386;;20407:1520;20538:7;;21472:66;21459:79;;21455:163;;;-1:-1:-1;21571:1:0;;-1:-1:-1;21575:30:0;21555:51;;21455:163;21732:24;;;21715:14;21732:24;;;;;;;;;35528:25:1;;;35601:4;35589:17;;35569:18;;;35562:45;;;;35623:18;;;35616:34;;;35666:18;;;35659:34;;;21732:24:0;;35500:19:1;;21732:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;21732:24:0;;-1:-1:-1;;21732:24:0;;;-1:-1:-1;;;;;;;21771:20:0;;21767:103;;21824:1;21828:29;21808:50;;;;;;;21767:103;21890:6;-1:-1:-1;21898:20:0;;-1:-1:-1;20407:1520:0;;;;;;;;:::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:254::-;260:6;268;321:2;309:9;300:7;296:23;292:32;289:52;;;337:1;334;327:12;289:52;360:29;379:9;360:29;:::i;:::-;350:39;436:2;421:18;;;;408:32;;-1:-1:-1;;;192:254:1:o;633:131::-;-1:-1:-1;;;;;;707:32:1;;697:43;;687:71;;754:1;751;744:12;769:245;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;935:9;922:23;954:30;978:5;954:30;:::i;1211:127::-;1272:10;1267:3;1263:20;1260:1;1253:31;1303:4;1300:1;1293:15;1327:4;1324:1;1317:15;1343:249;1453:2;1434:13;;-1:-1:-1;;1430:27:1;1418:40;;-1:-1:-1;;;;;1473:34:1;;1509:22;;;1470:62;1467:88;;;1535:18;;:::i;:::-;1571:2;1564:22;-1:-1:-1;;1343:249:1:o;1597:469::-;1662:5;-1:-1:-1;;;;;1688:6:1;1685:30;1682:56;;;1718:18;;:::i;:::-;1767:2;1761:9;1779:69;1836:2;1815:15;;-1:-1:-1;;1811:29:1;1842:4;1807:40;1761:9;1779:69;:::i;:::-;1866:6;1857:15;;1896:6;1888;1881:22;1936:3;1927:6;1922:3;1918:16;1915:25;1912:45;;;1953:1;1950;1943:12;1912:45;2003:6;1998:3;1991:4;1983:6;1979:17;1966:44;2058:1;2051:4;2042:6;2034;2030:19;2026:30;2019:41;;1597:469;;;;;:::o;2071:451::-;2140:6;2193:2;2181:9;2172:7;2168:23;2164:32;2161:52;;;2209:1;2206;2199:12;2161:52;2249:9;2236:23;-1:-1:-1;;;;;2274:6:1;2271:30;2268:50;;;2314:1;2311;2304:12;2268:50;2337:22;;2390:4;2382:13;;2378:27;-1:-1:-1;2368:55:1;;2419:1;2416;2409:12;2368:55;2442:74;2508:7;2503:2;2490:16;2485:2;2481;2477:11;2442:74;:::i;:::-;2432:84;2071:451;-1:-1:-1;;;;2071:451:1:o;2527:180::-;2586:6;2639:2;2627:9;2618:7;2614:23;2610:32;2607:52;;;2655:1;2652;2645:12;2607:52;-1:-1:-1;2678:23:1;;2527:180;-1:-1:-1;2527:180:1:o;2712:250::-;2797:1;2807:113;2821:6;2818:1;2815:13;2807:113;;;2897:11;;;2891:18;2878:11;;;2871:39;2843:2;2836:10;2807:113;;;-1:-1:-1;;2954:1:1;2936:16;;2929:27;2712:250::o;2967:271::-;3009:3;3047:5;3041:12;3074:6;3069:3;3062:19;3090:76;3159:6;3152:4;3147:3;3143:14;3136:4;3129:5;3125:16;3090:76;:::i;:::-;3220:2;3199:15;-1:-1:-1;;3195:29:1;3186:39;;;;3227:4;3182:50;;2967:271;-1:-1:-1;;2967:271:1:o;3243:220::-;3392:2;3381:9;3374:21;3355:4;3412:45;3453:2;3442:9;3438:18;3430:6;3412:45;:::i;3650:615::-;3736:6;3744;3797:2;3785:9;3776:7;3772:23;3768:32;3765:52;;;3813:1;3810;3803:12;3765:52;3853:9;3840:23;-1:-1:-1;;;;;3923:2:1;3915:6;3912:14;3909:34;;;3939:1;3936;3929:12;3909:34;3977:6;3966:9;3962:22;3952:32;;4022:7;4015:4;4011:2;4007:13;4003:27;3993:55;;4044:1;4041;4034:12;3993:55;4084:2;4071:16;4110:2;4102:6;4099:14;4096:34;;;4126:1;4123;4116:12;4096:34;4179:7;4174:2;4164:6;4161:1;4157:14;4153:2;4149:23;4145:32;4142:45;4139:65;;;4200:1;4197;4190:12;4139:65;4231:2;4223:11;;;;;4253:6;;-1:-1:-1;3650:615:1;;-1:-1:-1;;;;3650:615:1:o;4270:183::-;4330:4;-1:-1:-1;;;;;4355:6:1;4352:30;4349:56;;;4385:18;;:::i;:::-;-1:-1:-1;4430:1:1;4426:14;4442:4;4422:25;;4270:183::o;4458:724::-;4512:5;4565:3;4558:4;4550:6;4546:17;4542:27;4532:55;;4583:1;4580;4573:12;4532:55;4619:6;4606:20;4645:4;4668:43;4708:2;4668:43;:::i;:::-;4740:2;4734:9;4752:31;4780:2;4772:6;4752:31;:::i;:::-;4818:18;;;4910:1;4906:10;;;;4894:23;;4890:32;;;4852:15;;;;-1:-1:-1;4934:15:1;;;4931:35;;;4962:1;4959;4952:12;4931:35;4998:2;4990:6;4986:15;5010:142;5026:6;5021:3;5018:15;5010:142;;;5092:17;;5080:30;;5130:12;;;;5043;;5010:142;;;-1:-1:-1;5170:6:1;4458:724;-1:-1:-1;;;;;;4458:724:1:o;5187:221::-;5229:5;5282:3;5275:4;5267:6;5263:17;5259:27;5249:55;;5300:1;5297;5290:12;5249:55;5322:80;5398:3;5389:6;5376:20;5369:4;5361:6;5357:17;5322:80;:::i;5413:868::-;5558:6;5566;5574;5582;5635:3;5623:9;5614:7;5610:23;5606:33;5603:53;;;5652:1;5649;5642:12;5603:53;5675:29;5694:9;5675:29;:::i;:::-;5665:39;;5755:2;5744:9;5740:18;5727:32;-1:-1:-1;;;;;5819:2:1;5811:6;5808:14;5805:34;;;5835:1;5832;5825:12;5805:34;5858:61;5911:7;5902:6;5891:9;5887:22;5858:61;:::i;:::-;5848:71;;5972:2;5961:9;5957:18;5944:32;5928:48;;6001:2;5991:8;5988:16;5985:36;;;6017:1;6014;6007:12;5985:36;6040:63;6095:7;6084:8;6073:9;6069:24;6040:63;:::i;:::-;6030:73;;6156:2;6145:9;6141:18;6128:32;6112:48;;6185:2;6175:8;6172:16;6169:36;;;6201:1;6198;6191:12;6169:36;;6224:51;6267:7;6256:8;6245:9;6241:24;6224:51;:::i;:::-;6214:61;;;5413:868;;;;;;;:::o;6286:943::-;6440:6;6448;6456;6464;6472;6525:3;6513:9;6504:7;6500:23;6496:33;6493:53;;;6542:1;6539;6532:12;6493:53;6565:29;6584:9;6565:29;:::i;:::-;6555:39;;6613:38;6647:2;6636:9;6632:18;6613:38;:::i;:::-;6603:48;;6702:2;6691:9;6687:18;6674:32;-1:-1:-1;;;;;6766:2:1;6758:6;6755:14;6752:34;;;6782:1;6779;6772:12;6752:34;6805:61;6858:7;6849:6;6838:9;6834:22;6805:61;:::i;:::-;6795:71;;6919:2;6908:9;6904:18;6891:32;6875:48;;6948:2;6938:8;6935:16;6932:36;;;6964:1;6961;6954:12;6932:36;6987:63;7042:7;7031:8;7020:9;7016:24;6987:63;:::i;:::-;6977:73;;7103:3;7092:9;7088:19;7075:33;7059:49;;7133:2;7123:8;7120:16;7117:36;;;7149:1;7146;7139:12;7117:36;;7172:51;7215:7;7204:8;7193:9;7189:24;7172:51;:::i;:::-;7162:61;;;6286:943;;;;;;;;:::o;7234:160::-;7299:20;;7355:13;;7348:21;7338:32;;7328:60;;7384:1;7381;7374:12;7399:180;7455:6;7508:2;7496:9;7487:7;7483:23;7479:32;7476:52;;;7524:1;7521;7514:12;7476:52;7547:26;7563:9;7547:26;:::i;7584:1208::-;7702:6;7710;7763:2;7751:9;7742:7;7738:23;7734:32;7731:52;;;7779:1;7776;7769:12;7731:52;7819:9;7806:23;-1:-1:-1;;;;;7889:2:1;7881:6;7878:14;7875:34;;;7905:1;7902;7895:12;7875:34;7943:6;7932:9;7928:22;7918:32;;7988:7;7981:4;7977:2;7973:13;7969:27;7959:55;;8010:1;8007;8000:12;7959:55;8046:2;8033:16;8068:4;8091:43;8131:2;8091:43;:::i;:::-;8163:2;8157:9;8175:31;8203:2;8195:6;8175:31;:::i;:::-;8241:18;;;8329:1;8325:10;;;;8317:19;;8313:28;;;8275:15;;;;-1:-1:-1;8353:19:1;;;8350:39;;;8385:1;8382;8375:12;8350:39;8409:11;;;;8429:148;8445:6;8440:3;8437:15;8429:148;;;8511:23;8530:3;8511:23;:::i;:::-;8499:36;;8462:12;;;;8555;;;;8429:148;;;8596:6;-1:-1:-1;;8640:18:1;;8627:32;;-1:-1:-1;;8671:16:1;;;8668:36;;;8700:1;8697;8690:12;8668:36;;8723:63;8778:7;8767:8;8756:9;8752:24;8723:63;:::i;:::-;8713:73;;;7584:1208;;;;;:::o;8797:435::-;8850:3;8888:5;8882:12;8915:6;8910:3;8903:19;8941:4;8970:2;8965:3;8961:12;8954:19;;9007:2;9000:5;8996:14;9028:1;9038:169;9052:6;9049:1;9046:13;9038:169;;;9113:13;;9101:26;;9147:12;;;;9182:15;;;;9074:1;9067:9;9038:169;;;-1:-1:-1;9223:3:1;;8797:435;-1:-1:-1;;;;;8797:435:1:o;9237:261::-;9416:2;9405:9;9398:21;9379:4;9436:56;9488:2;9477:9;9473:18;9465:6;9436:56;:::i;9503:669::-;9630:6;9638;9646;9699:2;9687:9;9678:7;9674:23;9670:32;9667:52;;;9715:1;9712;9705:12;9667:52;9738:29;9757:9;9738:29;:::i;:::-;9728:39;;9818:2;9807:9;9803:18;9790:32;-1:-1:-1;;;;;9882:2:1;9874:6;9871:14;9868:34;;;9898:1;9895;9888:12;9868:34;9921:61;9974:7;9965:6;9954:9;9950:22;9921:61;:::i;:::-;9911:71;;10035:2;10024:9;10020:18;10007:32;9991:48;;10064:2;10054:8;10051:16;10048:36;;;10080:1;10077;10070:12;10048:36;;10103:63;10158:7;10147:8;10136:9;10132:24;10103:63;:::i;:::-;10093:73;;;9503:669;;;;;:::o;10177:186::-;10236:6;10289:2;10277:9;10268:7;10264:23;10260:32;10257:52;;;10305:1;10302;10295:12;10257:52;10328:29;10347:9;10328:29;:::i;10576:388::-;10653:6;10661;10714:2;10702:9;10693:7;10689:23;10685:32;10682:52;;;10730:1;10727;10720:12;10682:52;10766:9;10753:23;10743:33;;10827:2;10816:9;10812:18;10799:32;-1:-1:-1;;;;;10846:6:1;10843:30;10840:50;;;10886:1;10883;10876:12;10840:50;10909:49;10950:7;10941:6;10930:9;10926:22;10909:49;:::i;10969:254::-;11034:6;11042;11095:2;11083:9;11074:7;11070:23;11066:32;11063:52;;;11111:1;11108;11101:12;11063:52;11134:29;11153:9;11134:29;:::i;:::-;11124:39;;11182:35;11213:2;11202:9;11198:18;11182:35;:::i;:::-;11172:45;;10969:254;;;;;:::o;11228:248::-;11293:6;11301;11354:2;11342:9;11333:7;11329:23;11325:32;11322:52;;;11370:1;11367;11360:12;11322:52;11393:26;11409:9;11393:26;:::i;11481:394::-;11558:6;11566;11619:2;11607:9;11598:7;11594:23;11590:32;11587:52;;;11635:1;11632;11625:12;11587:52;11658:29;11677:9;11658:29;:::i;:::-;11648:39;;11738:2;11727:9;11723:18;11710:32;-1:-1:-1;;;;;11757:6:1;11754:30;11751:50;;;11797:1;11794;11787:12;11880:260;11948:6;11956;12009:2;11997:9;11988:7;11984:23;11980:32;11977:52;;;12025:1;12022;12015:12;11977:52;12048:29;12067:9;12048:29;:::i;:::-;12038:39;;12096:38;12130:2;12119:9;12115:18;12096:38;:::i;12145:248::-;12213:6;12221;12274:2;12262:9;12253:7;12249:23;12245:32;12242:52;;;12290:1;12287;12280:12;12242:52;-1:-1:-1;;12313:23:1;;;12383:2;12368:18;;;12355:32;;-1:-1:-1;12145:248:1:o;12398:606::-;12502:6;12510;12518;12526;12534;12587:3;12575:9;12566:7;12562:23;12558:33;12555:53;;;12604:1;12601;12594:12;12555:53;12627:29;12646:9;12627:29;:::i;:::-;12617:39;;12675:38;12709:2;12698:9;12694:18;12675:38;:::i;:::-;12665:48;;12760:2;12749:9;12745:18;12732:32;12722:42;;12811:2;12800:9;12796:18;12783:32;12773:42;;12866:3;12855:9;12851:19;12838:33;-1:-1:-1;;;;;12886:6:1;12883:30;12880:50;;;12926:1;12923;12916:12;12880:50;12949:49;12990:7;12981:6;12970:9;12966:22;12949:49;:::i;13009:322::-;13086:6;13094;13102;13155:2;13143:9;13134:7;13130:23;13126:32;13123:52;;;13171:1;13168;13161:12;13123:52;13194:29;13213:9;13194:29;:::i;:::-;13184:39;13270:2;13255:18;;13242:32;;-1:-1:-1;13321:2:1;13306:18;;;13293:32;;13009:322;-1:-1:-1;;;13009:322:1:o;14107:380::-;14186:1;14182:12;;;;14229;;;14250:61;;14304:4;14296:6;14292:17;14282:27;;14250:61;14357:2;14349:6;14346:14;14326:18;14323:38;14320:161;;14403:10;14398:3;14394:20;14391:1;14384:31;14438:4;14435:1;14428:15;14466:4;14463:1;14456:15;14320:161;;14107:380;;;:::o;14492:496::-;14671:3;14709:6;14703:13;14725:66;14784:6;14779:3;14772:4;14764:6;14760:17;14725:66;:::i;:::-;14854:13;;14813:16;;;;14876:70;14854:13;14813:16;14923:4;14911:17;;14876:70;:::i;:::-;14962:20;;14492:496;-1:-1:-1;;;;14492:496:1:o;14993:127::-;15054:10;15049:3;15045:20;15042:1;15035:31;15085:4;15082:1;15075:15;15109:4;15106:1;15099:15;15125:125;15190:9;;;15211:10;;;15208:36;;;15224:18;;:::i;15255:135::-;15294:3;15315:17;;;15312:43;;15335:18;;:::i;:::-;-1:-1:-1;15382:1:1;15371:13;;15255:135::o;15395:410::-;15597:2;15579:21;;;15636:2;15616:18;;;15609:30;15675:34;15670:2;15655:18;;15648:62;-1:-1:-1;;;15741:2:1;15726:18;;15719:44;15795:3;15780:19;;15395:410::o;16430:127::-;16491:10;16486:3;16482:20;16479:1;16472:31;16522:4;16519:1;16512:15;16546:4;16543:1;16536:15;17195:184;17265:6;17318:2;17306:9;17297:7;17293:23;17289:32;17286:52;;;17334:1;17331;17324:12;17286:52;-1:-1:-1;17357:16:1;;17195:184;-1:-1:-1;17195:184:1:o;20022:168::-;20095:9;;;20126;;20143:15;;;20137:22;;20123:37;20113:71;;20164:18;;:::i;22169:545::-;22271:2;22266:3;22263:11;22260:448;;;22307:1;22332:5;22328:2;22321:17;22377:4;22373:2;22363:19;22447:2;22435:10;22431:19;22428:1;22424:27;22418:4;22414:38;22483:4;22471:10;22468:20;22465:47;;;-1:-1:-1;22506:4:1;22465:47;22561:2;22556:3;22552:12;22549:1;22545:20;22539:4;22535:31;22525:41;;22616:82;22634:2;22627:5;22624:13;22616:82;;;22679:17;;;22660:1;22649:13;22616:82;;22890:1352;23016:3;23010:10;-1:-1:-1;;;;;23035:6:1;23032:30;23029:56;;;23065:18;;:::i;:::-;23094:97;23184:6;23144:38;23176:4;23170:11;23144:38;:::i;:::-;23138:4;23094:97;:::i;:::-;23246:4;;23310:2;23299:14;;23327:1;23322:663;;;;24029:1;24046:6;24043:89;;;-1:-1:-1;24098:19:1;;;24092:26;24043:89;-1:-1:-1;;22847:1:1;22843:11;;;22839:24;22835:29;22825:40;22871:1;22867:11;;;22822:57;24145:81;;23292:944;;23322:663;22116:1;22109:14;;;22153:4;22140:18;;-1:-1:-1;;23358:20:1;;;23476:236;23490:7;23487:1;23484:14;23476:236;;;23579:19;;;23573:26;23558:42;;23671:27;;;;23639:1;23627:14;;;;23506:19;;23476:236;;;23480:3;23740:6;23731:7;23728:19;23725:201;;;23801:19;;;23795:26;-1:-1:-1;;23884:1:1;23880:14;;;23896:3;23876:24;23872:37;23868:42;23853:58;23838:74;;23725:201;-1:-1:-1;;;;;23972:1:1;23956:14;;;23952:22;23939:36;;-1:-1:-1;22890:1352:1:o;25147:397::-;25349:2;25331:21;;;25388:2;25368:18;;;25361:30;25427:34;25422:2;25407:18;;25400:62;-1:-1:-1;;;25493:2:1;25478:18;;25471:31;25534:3;25519:19;;25147:397::o;25802:404::-;26004:2;25986:21;;;26043:2;26023:18;;;26016:30;26082:34;26077:2;26062:18;;26055:62;-1:-1:-1;;;26148:2:1;26133:18;;26126:38;26196:3;26181:19;;25802:404::o;26211:465::-;26468:2;26457:9;26450:21;26431:4;26494:56;26546:2;26535:9;26531:18;26523:6;26494:56;:::i;:::-;26598:9;26590:6;26586:22;26581:2;26570:9;26566:18;26559:50;26626:44;26663:6;26655;26626:44;:::i;:::-;26618:52;26211:465;-1:-1:-1;;;;;26211:465:1:o;26681:401::-;26883:2;26865:21;;;26922:2;26902:18;;;26895:30;26961:34;26956:2;26941:18;;26934:62;-1:-1:-1;;;27027:2:1;27012:18;;27005:35;27072:3;27057:19;;26681:401::o;27087:406::-;27289:2;27271:21;;;27328:2;27308:18;;;27301:30;27367:34;27362:2;27347:18;;27340:62;-1:-1:-1;;;27433:2:1;27418:18;;27411:40;27483:3;27468:19;;27087:406::o;27498:399::-;27700:2;27682:21;;;27739:2;27719:18;;;27712:30;27778:34;27773:2;27758:18;;27751:62;-1:-1:-1;;;27844:2:1;27829:18;;27822:33;27887:3;27872:19;;27498:399::o;27902:400::-;28104:2;28086:21;;;28143:2;28123:18;;;28116:30;28182:34;28177:2;28162:18;;28155:62;-1:-1:-1;;;28248:2:1;28233:18;;28226:34;28292:3;28277:19;;27902:400::o;29608:561::-;-1:-1:-1;;;;;29905:15:1;;;29887:34;;29957:15;;29952:2;29937:18;;29930:43;30004:2;29989:18;;29982:34;;;30047:2;30032:18;;30025:34;;;29867:3;30090;30075:19;;30068:32;;;29830:4;;30117:46;;30143:19;;30135:6;30117:46;:::i;:::-;30109:54;29608:561;-1:-1:-1;;;;;;;29608:561:1:o;30174:249::-;30243:6;30296:2;30284:9;30275:7;30271:23;30267:32;30264:52;;;30312:1;30309;30302:12;30264:52;30344:9;30338:16;30363:30;30387:5;30363:30;:::i;30428:179::-;30463:3;30505:1;30487:16;30484:23;30481:120;;;30551:1;30548;30545;30530:23;-1:-1:-1;30588:1:1;30582:8;30577:3;30573:18;30428:179;:::o;30612:671::-;30651:3;30693:4;30675:16;30672:26;30669:39;;;30612:671;:::o;30669:39::-;30735:2;30729:9;-1:-1:-1;;30800:16:1;30796:25;;30793:1;30729:9;30772:50;30851:4;30845:11;30875:16;-1:-1:-1;;;;;30981:2:1;30974:4;30966:6;30962:17;30959:25;30954:2;30946:6;30943:14;30940:45;30937:58;;;30988:5;;;;;30612:671;:::o;30937:58::-;31025:6;31019:4;31015:17;31004:28;;31061:3;31055:10;31088:2;31080:6;31077:14;31074:27;;;31094:5;;;;;;30612:671;:::o;31074:27::-;31178:2;31159:16;31153:4;31149:27;31145:36;31138:4;31129:6;31124:3;31120:16;31116:27;31113:69;31110:82;;;31185:5;;;;;;30612:671;:::o;31110:82::-;31201:57;31252:4;31243:6;31235;31231:19;31227:30;31221:4;31201:57;:::i;:::-;-1:-1:-1;31274:3:1;;30612:671;-1:-1:-1;;;;;30612:671:1:o;31709:404::-;31911:2;31893:21;;;31950:2;31930:18;;;31923:30;31989:34;31984:2;31969:18;;31962:62;-1:-1:-1;;;32055:2:1;32040:18;;32033:38;32103:3;32088:19;;31709:404::o;32118:827::-;-1:-1:-1;;;;;32515:15:1;;;32497:34;;32567:15;;32562:2;32547:18;;32540:43;32477:3;32614:2;32599:18;;32592:31;;;32440:4;;32646:57;;32683:19;;32675:6;32646:57;:::i;:::-;32751:9;32743:6;32739:22;32734:2;32723:9;32719:18;32712:50;32785:44;32822:6;32814;32785:44;:::i;:::-;32771:58;;32878:9;32870:6;32866:22;32860:3;32849:9;32845:19;32838:51;32906:33;32932:6;32924;32906:33;:::i;:::-;32898:41;32118:827;-1:-1:-1;;;;;;;;32118:827:1:o;33644:127::-;33705:10;33700:3;33696:20;33693:1;33686:31;33736:4;33733:1;33726:15;33760:4;33757:1;33750:15

Swarm Source

ipfs://9c073c913f6f3c283ce53a80d21a610107888510bbfd359f15c9b14803881578
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.