ETH Price: $2,487.16 (-0.49%)

Token

MOMOM ()
 

Overview

Max Total Supply

285

Holders

95

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
kyakka.eth
0x061b8335e1d2042975C4ED849943334BD07Fb504
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:
MOMOM

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-04-22
*/

// 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/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/Variables.sol


pragma solidity ^0.8.9;


contract Variables is Ownable{

//SET Variables
    bool public customPrice = false;
    uint256 public custom_price = 0.0011 ether;
    bool public canRenounceOwnership = false;

//mint variables
    bool public soldOut = false;
    bool public freeClaimOpen = false;

    bool public burnMomomCommomOpen = false;
    bool public burnMomomUncommomOpen = false;
    bool public burnMomomRareOpen = false;
    bool public burnMomomEpicOpen = false;

    bool public mintOpen = false;
    bool public rewardAllMomomsOpen = false;
    uint256 public maxQtyRewardAllMomom = 2;
    uint256 public qtyRewardedAllMomom = 0;
    uint256 public qtyMinBonusMint1 = 5;
    uint256 public qtyBonusMint1 = 1;
    uint256 public qtyMinBonusMint2 = 10;
    uint256 public qtyBonusMint2 = 2;
    bool public enableTsukiPrice = false;
    uint256 public custom_price_tsuki = 0.0009 ether;
    string public baseTokenURI;

    //Set methods
    function setCustomPriceTsuki(bool enable, uint256 value) public onlyOwner {
        enableTsukiPrice = enable;
        custom_price_tsuki = value;
    }

    function setBonusMint1(uint256 qtyMinBonusMint, uint qtyBonusMint) public onlyOwner {
        qtyMinBonusMint1 = qtyMinBonusMint;
        qtyBonusMint1 = qtyBonusMint;
    }

    function setBonusMint2(uint256 qtyMinBonusMint, uint qtyBonusMint) public onlyOwner {
        qtyMinBonusMint2 = qtyMinBonusMint;
        qtyBonusMint2 = qtyBonusMint;
    }

    function setBurnMomomCommomOpen(bool _state) public onlyOwner {
        burnMomomCommomOpen = _state;
    }

    function setBurnMomomUncommomOpen(bool _state) public onlyOwner {
        burnMomomUncommomOpen = _state;
    }

    function setBurnMomomRareOpen(bool _state) public onlyOwner {
        burnMomomRareOpen = _state;
    }

    function setBurnMomomEpicOpen(bool _state) public onlyOwner {
        burnMomomEpicOpen = _state;
    }

    function setMintOpen(bool _state) public onlyOwner {
        mintOpen = _state;
    }

    function setRewardAllMomomsOpen(bool _state) public onlyOwner {
        rewardAllMomomsOpen = _state;
    }

    function setFreeClaimOpen(bool _state) public onlyOwner {
        freeClaimOpen = _state;
    }  

    function setSoldOut(bool _state) public onlyOwner {
        soldOut = _state;
    }

    function setMaxQtyRewardAllMomom(uint256 maxQtyReward) external onlyOwner {
        maxQtyRewardAllMomom = maxQtyReward;
    }

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

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

}
// File: contracts/BurnTsuki.sol


pragma solidity ^0.8.7;


interface IERC721{
    function ownerOf(uint256 _tokenId) external view returns (address);
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;
    function transferFrom(address _from, address _to, uint256 _tokenId) external payable;
    function setApprovalForAll(address _from, bool state) external;
    function burn(uint256) external payable;
    function getApproved(uint256 tokenId) external view returns (address operator);
    function isApprovedForAll(address owner, address operator) external view returns (bool);
    function balanceOf(address owner) external view returns (uint256);
}


contract BurnTsuki is Ownable {
//for burn
    address public tsukiNftAddress=0x0000000000000000000000000000000000000000;
    address public tsukiBurnAddress=0x0000000000000000000000000000000000000001;

    bool public burnTsuki1Open = false;
    bool public burnTsuki2Open = false;
    bool public burnTsuki3Open = false;
    bool public burnTsuki4Open = false;
    bool public burnTsuki5Open = false;

constructor() {}

    //Set methods
    function setTsukiNftAddress(address _address) public onlyOwner {
        tsukiNftAddress = _address;
    }
        
    function setTsukiBurnAddress(address _address) public onlyOwner {
        tsukiBurnAddress = _address;
    }
    
    function setTsuki1Open(bool _state) public onlyOwner {
        burnTsuki1Open = _state;
    }

    function setTsuki2Open(bool _state) public onlyOwner {
        burnTsuki2Open = _state;
    }

    function setTsuki3Open(bool _state) public onlyOwner {
        burnTsuki3Open = _state;
    }

    function setTsuki4Open(bool _state) public onlyOwner {
        burnTsuki4Open = _state;
    }

    function setTsuki5Open(bool _state) public onlyOwner {
        burnTsuki5Open = _state;
    }

    modifier callerIsUser() {
        require(tx.origin == msg.sender, "Must from real wallet address");
        _;
    }

    function getOwner(uint256 tsukiTokenId) public view returns (address){
         return IERC721(tsukiNftAddress).ownerOf(tsukiTokenId);
    }

    function getBalaceOfTsuki() public view returns (uint256){
         return IERC721(tsukiNftAddress).balanceOf(msg.sender);
    }

    function bT(uint256[] memory tsukiTokenIds)
        public
        callerIsUser
    {
        if(tsukiTokenIds.length==1){
            require(burnTsuki1Open,"Burn 1 tsuki is not opened!");
        }else if(tsukiTokenIds.length==2){
            require(burnTsuki1Open,"Burn 2 tsuki is not opened!");
        }else if(tsukiTokenIds.length==3){
            require(burnTsuki1Open,"Burn 3 tsuki is not opened!");
        }else if(tsukiTokenIds.length==4){
            require(burnTsuki1Open,"Burn 4 tsuki is not opened!");
        }else if(tsukiTokenIds.length==5){
            require(burnTsuki1Open,"Burn 5 tsuki is not opened!");
        }else{
            require(false,"Burn Quant wrong!");
        }
        
        for (uint i = 0; i < tsukiTokenIds.length; i++) {
            address owner = IERC721(tsukiNftAddress).ownerOf(tsukiTokenIds[i]);
            require(msg.sender == owner, "Error: Not ERC721 owner");
            IERC721(tsukiNftAddress).transferFrom(msg.sender,tsukiBurnAddress,tsukiTokenIds[i]);
        }
    }

    function getBurnAddress() public view returns (address){
        return address(this);
    }

    function isApprovedForAllBurn(address owner, address operator) external view returns (bool){
        return IERC721(tsukiNftAddress).isApprovedForAll(owner, operator);
    }
}
// File: contracts/CommitReveal.sol


pragma solidity ^0.8.9;


contract CommitReveal is Ownable {

  uint public maxBlocksAhead = 250;

  //setter
    function setMaxBlocksAhead(uint qtd) public onlyOwner {
        maxBlocksAhead = qtd;
    }

  struct Commit {
    bytes32 commit;
    uint256 block;
    bool revealed;
  }

  mapping (address => Commit) public commits;

  function saveGeneratedHash(bytes32 dataHash) public {
    commits[msg.sender].commit = dataHash;
    commits[msg.sender].block = uint256(block.number);
    commits[msg.sender].revealed = false;
    emit CommitHash(msg.sender,commits[msg.sender].commit,commits[msg.sender].block);
  }
  event CommitHash(address sender, bytes32 dataHash, uint256 block);

  function generateRandom(bytes32 revealHash) public returns (uint){
    //make sure it hasn't been revealeld yet and set it to revealed
    require(commits[msg.sender].revealed==false,"Already revealed");
    commits[msg.sender].revealed=true;
    //require that they can produce the committed hash
    require(getHash(revealHash)==commits[msg.sender].commit,"Revealed hash does not match commit");
    //require that the block number is greater than the original block
    require(uint64(block.number)>commits[msg.sender].block,"Reveal and commit happened on the same block");
    //require that no more than 250 blocks have passed
    require(uint64(block.number)<=commits[msg.sender].block+maxBlocksAhead,"Revealed too late");
    //get the hash of the block that happened after they committed
    bytes32 blockHash = blockhash(commits[msg.sender].block);
    //hash that with their reveal that so miner shouldn't know and mod it with some max number you want
    uint random = uint(keccak256(abi.encodePacked(blockHash,revealHash)));
    /*emit RevealHash(msg.sender,revealHash,random);*/
    return random;
  }

  function blockNumber() public view returns (uint256){
    return uint256(block.number);
  }

  function getHash(bytes32 data) public view returns(bytes32){
    return keccak256(abi.encodePacked(address(this), data));
  }

}
// File: contracts/Random.sol


pragma solidity ^0.8.9;



contract Random is Ownable, CommitReveal {

        // Initializing the state variable
    uint randNonce = 0;

    //setvariables
    uint public lowerLegendary = 9900;
    uint public upperLegendary = 9910;

    uint public lowerEpic = 8000;
    uint public upperEpic = 8200;

    uint public lowerRare = 6000;
    uint public upperRare = 6800;

    uint public lowerUncommom = 3000;
    uint public upperUncommom = 5500;

    uint public qtdCommom = 60;
    uint public qtdUncommom = 30;
    uint public qtdRare = 15;
    uint public qtdEpic = 5;
    uint public qtdLegendary = 1;

//setter
    function setQtdCommom(uint qtd) public onlyOwner {
        qtdCommom = qtd;
    }
    function setQtdUncommom(uint qtd) public onlyOwner {
        qtdUncommom = qtd;
    }
    function setQtdRare(uint qtd) public onlyOwner {
        qtdRare = qtd;
    }
    function setQtdEpic(uint qtd) public onlyOwner {
        qtdEpic = qtd;
    }
    function setQtdLegendary(uint qtd) public onlyOwner {
        qtdLegendary = qtd;
    }

    function setProbLegendary(uint lower, uint upper) public onlyOwner {
        upperLegendary = upper;
        lowerLegendary = lower;
    }

    function setProbEpic(uint lower, uint upper) public onlyOwner {
        upperEpic = upper;
        lowerEpic = lower;
    }

    function setProbRare(uint lower, uint upper) public onlyOwner {
        upperRare = upper;
        lowerRare = lower;
    }

    function setProbUncommom(uint lower, uint upper) public onlyOwner {
        upperUncommom = upper;
        lowerUncommom = lower;
    }

    function validateCommom(uint256[] memory tsukiTokenIds) public view returns (bool) {
        for (uint256 i = 0; i < tsukiTokenIds.length; i++) {
            if(100>tsukiTokenIds[i] || tsukiTokenIds[i]>=(100+qtdCommom)){
                return false;
            }
        }
        return true;
    }

    function validateUncommom(uint256[] memory tsukiTokenIds) public view returns (bool) {
        for (uint256 i = 0; i < tsukiTokenIds.length; i++) {
            if(300>tsukiTokenIds[i] || tsukiTokenIds[i]>=(300+qtdUncommom)){
                return false;
            }
        }
        return true;
    }

    function validateRare(uint256[] memory tsukiTokenIds) public view returns (bool) {
        for (uint256 i = 0; i < tsukiTokenIds.length; i++) {
            if(400>tsukiTokenIds[i] || tsukiTokenIds[i]>=(400+qtdRare)){
                return false;
            }
        }
        return true;
    }

    function validateEpic(uint256[] memory tsukiTokenIds) public view returns (bool) {
        for (uint256 i = 0; i < tsukiTokenIds.length; i++) {
            if(500>tsukiTokenIds[i] || tsukiTokenIds[i]>=(500+qtdEpic)){
                return false;
            }
        }
        return true;
    }

    function getAllMomoms() public view returns (uint[] memory) {
        uint[] memory momoms = new uint[](qtdCommom + qtdUncommom + qtdRare + qtdEpic + qtdLegendary);
        uint256 pos = 0;
        for (uint256 i = 0; i < qtdCommom; i++) {
            momoms[pos] = 100+i;
            pos++; 
        }
         for (uint256 i = 0; i < qtdUncommom; i++) {
            momoms[pos] = 300+i;
            pos++; 
        }
         for (uint256 i = 0; i < qtdRare; i++) {
            momoms[pos] = 400+i;
            pos++; 
        }
         for (uint256 i = 0; i < qtdEpic; i++) {
            momoms[pos] = 500+i;
            pos++; 
        }
         for (uint256 i = 0; i < qtdLegendary; i++) {
            momoms[pos] = 600+i;
            pos++; 
        }
        return momoms;
    }

    function probLegerndary() public view returns (uint) {
        return (upperLegendary - lowerLegendary);
    }

    function probEpic() public view returns (uint) {
        return (upperEpic - lowerEpic);
    }

    function probRare() public view returns (uint) {
        return (upperRare - lowerRare);
    }

    function probUncommom() public view returns (uint) {
        return (upperUncommom - lowerUncommom);
    }

    function probCommom() public view returns (uint) {
        return (10000 - probUncommom() - probRare() - probEpic() - probLegerndary());
    }

     // 1. Generate preimage off-chain and hash preimage
    function hashPreimage(bytes32 _preimage) public pure returns(bytes32) {
        return keccak256(abi.encodePacked(_preimage));
    }

    function random(bytes32 dataHash) public returns (uint) {
        return generateRandom(dataHash);
        /*randNonce++;
        return uint(keccak256(abi.encodePacked(block.timestamp,msg.sender,randNonce)));*/
    } 

    function randomPart(uint _random, uint _multiply) public pure returns (uint) {
        uint ret = _random/_multiply;
        return  ret % 10000;
    } 

    function getCard(uint number) public view returns (uint){
        uint rarity = number % 10000;
        if(lowerLegendary<rarity && rarity<=upperLegendary){
            //legendary 0,1%
            return (number%qtdLegendary)+600;
        }else
        if(lowerEpic<rarity && rarity<=upperEpic){
           //epic 2%
            return (number%qtdEpic)+500;
        }else
        if(lowerRare<rarity && rarity<=upperRare){
            //rare 8%
            return (number%qtdRare)+400;
        }else
        if(lowerUncommom<rarity && rarity<upperUncommom){
            //uncommom 25%
            return (number%qtdUncommom)+300;
        }else{
            //commom 64,5%
            return (number%qtdCommom)+100;
        }
    }

    function getCommom(uint number) public view returns (uint){
        return (number%qtdCommom)+100;
    }

    function getUncommom(uint number) public view returns (uint){
        return (number%qtdUncommom)+300;
    }

    function getRare(uint number) public view returns (uint){
        return (number%qtdRare)+400;
    }

    function getEpic(uint number) public view returns (uint){
        return (number%qtdEpic)+500;
    }

    function getLegendary(uint number) public view returns (uint){
        return (number%qtdLegendary)+600;
    }

}
// 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/MOMOM.sol


pragma solidity ^0.8.9;










contract MOMOM is ERC1155, Ownable, Pausable, ERC1155Burnable, ERC1155Supply, Random, BurnTsuki, Variables {

    //FOR PRODUCTION

    uint256 public constant PUBLIC_SALES_PRICE = 0.003 ether;
    uint256 public constant MAX_QTY_PER_MINT = 12;

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

    constructor() ERC1155("MOMOM") {}

    //Set methods
    function setPhaseTwoState(bool _state) public onlyOwner {
        burnMomomCommomOpen = _state;
        burnMomomUncommomOpen = _state;
        burnMomomRareOpen = _state;
        burnMomomEpicOpen = _state;
    }

    function setPhaseOneState(bool _state) public onlyOwner {
        freeClaimOpen = _state;
        burnTsuki1Open = _state;
        burnTsuki2Open = _state;
        burnTsuki3Open = _state;
        burnTsuki4Open = _state;
        burnTsuki5Open = _state;
    }

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

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

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

    //end of set methods
    function getTokensOwnedByAddress() public view returns (uint[] memory) {
        uint[] memory momoms = getAllMomoms();
        uint[] memory momomsOwned = new uint[](momoms.length);
        for (uint i = 0; i < momoms.length; i++) {
            momomsOwned[i] = balanceOf(msg.sender,momoms[i]);
        }
        return momomsOwned;
    }

    function testGetCards(uint256 _mintQty, bytes32 dataHash) external onlyOwner returns (uint[] memory) {
        uint[] memory cards = new uint[]((_mintQty)+1);
        uint randNumber = random(dataHash);
        for (uint i = 0; i < _mintQty; i++) {
            uint number = randomPart(randNumber, ((i==0)?1:(10000**i)));
            cards[i] = (number*100000)+getCard(number);

        }
        cards[_mintQty] = randNumber;
        return cards;
    }

    function mint(uint256 _mintQty, bytes32 dataHash)
        external
        payable
        returns (uint[] memory) 
    {
        require(mintOpen,"Mint is not opened!");
        require(tx.origin == msg.sender,"CONTRACTS_NOT_ALLOWED_TO_MINT");
        require(_mintQty<=MAX_QTY_PER_MINT,"Max mint per mint is 10.");
        require(msg.value >= _mintQty * getPrice(), "Incorrect ETH");
        uint randNumber = random(dataHash);
        uint bonusMintQty = bonusMint(_mintQty);
        uint[] memory cards = new uint[](_mintQty+bonusMintQty);
        for (uint i = 0; i < (_mintQty+ bonusMintQty); i++) {
            uint number = randomPart(randNumber, ((i==0)?1:(10000**i)));
            cards[i] = getCard(number);
           _mint(msg.sender, cards[i], 1, "");
        }
        return cards;
    }

    function bonusMint(uint256 _mintQty) public view returns (uint) {
        uint bonus = 0;
        if(_mintQty>=qtyMinBonusMint1){
            bonus = bonus+qtyBonusMint1;
        }
        if(_mintQty>=qtyMinBonusMint2){
            bonus = bonus+qtyBonusMint2;
        }
        return bonus;
    }

    function claimMomon(uint256 tsukiTokenId, bytes32 dataHash)
        external
        returns (uint) 
    {
        uint card;
        require(freeClaimOpen,"Free Claim is not opened!");
        require(tx.origin == msg.sender,"CONTRACTS_NOT_ALLOWED_TO_MINT");
        require(tsukiClaimedMomom[tsukiTokenId]==0,"Tsuki already claimed momom!");
        require(msg.sender == getOwner(tsukiTokenId), "Error: Not ERC721 owner");

        tsukiClaimedMomom[tsukiTokenId] += 1;

        uint randNumber = random(dataHash);
        card = getCommom(randNumber);
        _mint(msg.sender, card, 1, "");
        return card;
    }

   function burnTsukiGetMomom(uint256[] memory tsukiTokenIds, bytes32 dataHash)
        external
        returns (uint) 
    {
        uint card;
        uint randNumber = random(dataHash);
        bT(tsukiTokenIds);
        if(tsukiTokenIds.length == 1 ){
            card = getCommom(randNumber);
        }else if(tsukiTokenIds.length == 2 ){
            card = getUncommom(randNumber);
        }else if(tsukiTokenIds.length == 3 ){
            card = getRare(randNumber);
        }else if(tsukiTokenIds.length == 4 ){
            card =  getEpic(randNumber);
        }else if(tsukiTokenIds.length == 5 ){
            card = getLegendary(randNumber);
        }else{
            require(false, "Wrong tsuki qty burn!");
        }
         _mint(msg.sender, card, 1, "");
        return card;
    }

    function burn5MomomsTo1Better(uint256[] memory momomTokenIds, uint rarity, bytes32 dataHash) 
        external
        returns (uint[] memory)
    {
        uint qtdMint = 0;
        if(momomTokenIds.length == 5){
            qtdMint = 1;
        }else if(momomTokenIds.length == 10){
            qtdMint = 2;
        }else if(momomTokenIds.length == 15){
            qtdMint = 3;
        }else{
            require(false, "You need 5, 10 or 15 Momoms to get 1, 2 or 3 more rare.");
        }
        if(rarity==3){
            require(momomTokenIds.length == 5, "You can only burn 5 Epic Momoms to get 1 Legendary.");
        }
        uint[] memory cards = new uint[](qtdMint);
        if(rarity==0){
            require(burnMomomCommomOpen, "Burn Momom is not open!");
            require(validateCommom(momomTokenIds), "You need 5 Commons to receive a Uncommom.");
            for (uint256 i = 0; i < momomTokenIds.length; i++) {
                _burn(msg.sender,momomTokenIds[i],1);
            }
            uint randNumber = random(dataHash);
            for (uint i = 0; i < qtdMint; i++) {
                uint number = randomPart(randNumber, ((i==0)?1:(10000**i)));
                cards[i] = getUncommom(number);
                _mint(msg.sender, cards[i], 1, "");
            }
        }else if(rarity==1){
            require(burnMomomUncommomOpen, "Burn Momom is not open!");
            require(validateUncommom(momomTokenIds), "You need 5 Uncommom to receive a Rare.");
            for (uint256 i = 0; i < momomTokenIds.length; i++) {
                _burn(msg.sender,momomTokenIds[i],1);
            }
            uint randNumber = random(dataHash);
            for (uint i = 0; i < qtdMint; i++) {
                uint number = randomPart(randNumber, ((i==0)?1:(10000**i)));
                cards[i] = getRare(number);
                _mint(msg.sender, cards[i], 1, "");
            }
        }else if(rarity==2){
            require(burnMomomRareOpen, "Burn Momom is not open!");
            require(validateRare(momomTokenIds), "You need 5 Rare to receive a Epic.");
            for (uint256 i = 0; i < momomTokenIds.length; i++) {
                _burn(msg.sender,momomTokenIds[i],1);
            }
             uint randNumber = random(dataHash);
             for (uint i = 0; i < qtdMint; i++) {
                uint number = randomPart(randNumber, ((i==0)?1:(10000**i)));
                cards[i] = getEpic(number);
                _mint(msg.sender, cards[i], 1, "");
            }
        }else if(rarity==3){
            require(burnMomomEpicOpen, "Burn Momom is not open!");
            require(validateEpic(momomTokenIds), "You need 5 Epic to receive a Legendary.");
            for (uint256 i = 0; i < momomTokenIds.length; i++) {
                _burn(msg.sender,momomTokenIds[i],1);
            }
             uint randNumber = random(dataHash);
             cards[0] = getLegendary(randNumber);
            _mint(msg.sender, cards[0], 1, "");
        }else {
            require(false, "Wrong rarity burn!");
        }
        return cards;
    }

    function rewardAllMomoms() external {
        require(rewardAllMomomsOpen, "Reward all Momom is not open!");
        require(qtyRewardedAllMomom < maxQtyRewardAllMomom, "Max reward reached! Wait for another reward!");
        uint[] memory momoms = getAllMomoms();
        for (uint256 i = 0; i < momoms.length; i++) {
            _burn(msg.sender,momoms[i],1);
        }
        //700 is the pin for those who complete de album
         _mint(msg.sender, 700, 1, "");
         qtyRewardedAllMomom++;
    }

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

    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(enableTsukiPrice && getBalaceOfTsuki()>0){
            return custom_price_tsuki;
        }
        if(customPrice){
            return custom_price;
        }else{
            return PUBLIC_SALES_PRICE;
        }
    }

    function uri(uint256 id)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(exists(id),
        "URI query for nonexistent token"
        );
        
        return bytes(super.uri(id)).length > 0
            ? string(abi.encodePacked(super.uri(id), Strings.toString(id)))
            : "";
    }

    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":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"bytes32","name":"dataHash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"}],"name":"CommitHash","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":"PUBLIC_SALES_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tsukiTokenIds","type":"uint256[]"}],"name":"bT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blockNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintQty","type":"uint256"}],"name":"bonusMint","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":[{"internalType":"uint256[]","name":"momomTokenIds","type":"uint256[]"},{"internalType":"uint256","name":"rarity","type":"uint256"},{"internalType":"bytes32","name":"dataHash","type":"bytes32"}],"name":"burn5MomomsTo1Better","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":"burnMomomCommomOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnMomomEpicOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnMomomRareOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnMomomUncommomOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnTsuki1Open","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnTsuki2Open","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnTsuki3Open","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnTsuki4Open","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnTsuki5Open","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tsukiTokenIds","type":"uint256[]"},{"internalType":"bytes32","name":"dataHash","type":"bytes32"}],"name":"burnTsukiGetMomom","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"canRenounceOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tsukiTokenId","type":"uint256"},{"internalType":"bytes32","name":"dataHash","type":"bytes32"}],"name":"claimMomon","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"commits","outputs":[{"internalType":"bytes32","name":"commit","type":"bytes32"},{"internalType":"uint256","name":"block","type":"uint256"},{"internalType":"bool","name":"revealed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"customPrice","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_tsuki","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTsukiPrice","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeClaimOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"revealHash","type":"bytes32"}],"name":"generateRandom","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAllMomoms","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBalaceOfTsuki","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBurnAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"getCard","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"getCommom","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"getEpic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"data","type":"bytes32"}],"name":"getHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"getLegendary","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tsukiTokenId","type":"uint256"}],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"getRare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokensOwnedByAddress","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"getUncommom","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"momomTokenIds","type":"uint256[]"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_preimage","type":"bytes32"}],"name":"hashPreimage","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAllBurn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lowerEpic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lowerLegendary","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lowerRare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lowerUncommom","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBlocksAhead","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxQtyRewardAllMomom","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintQty","type":"uint256"},{"internalType":"bytes32","name":"dataHash","type":"bytes32"}],"name":"mint","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"preSalesMinterToTokenQty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"probCommom","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"probEpic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"probLegerndary","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"probRare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"probUncommom","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"qtdCommom","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"qtdEpic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"qtdLegendary","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"qtdRare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"qtdUncommom","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"qtyBonusMint1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"qtyBonusMint2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"qtyMinBonusMint1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"qtyMinBonusMint2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"qtyRewardedAllMomom","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"dataHash","type":"bytes32"}],"name":"random","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_random","type":"uint256"},{"internalType":"uint256","name":"_multiply","type":"uint256"}],"name":"randomPart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardAllMomoms","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardAllMomomsOpen","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":[{"internalType":"bytes32","name":"dataHash","type":"bytes32"}],"name":"saveGeneratedHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qtyMinBonusMint","type":"uint256"},{"internalType":"uint256","name":"qtyBonusMint","type":"uint256"}],"name":"setBonusMint1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qtyMinBonusMint","type":"uint256"},{"internalType":"uint256","name":"qtyBonusMint","type":"uint256"}],"name":"setBonusMint2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setBurnMomomCommomOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setBurnMomomEpicOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setBurnMomomRareOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setBurnMomomUncommomOpen","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":"enable","type":"bool"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setCustomPriceTsuki","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setFreeClaimOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qtd","type":"uint256"}],"name":"setMaxBlocksAhead","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxQtyReward","type":"uint256"}],"name":"setMaxQtyRewardAllMomom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setMintOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPhaseOneState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPhaseTwoState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"lower","type":"uint256"},{"internalType":"uint256","name":"upper","type":"uint256"}],"name":"setProbEpic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"lower","type":"uint256"},{"internalType":"uint256","name":"upper","type":"uint256"}],"name":"setProbLegendary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"lower","type":"uint256"},{"internalType":"uint256","name":"upper","type":"uint256"}],"name":"setProbRare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"lower","type":"uint256"},{"internalType":"uint256","name":"upper","type":"uint256"}],"name":"setProbUncommom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qtd","type":"uint256"}],"name":"setQtdCommom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qtd","type":"uint256"}],"name":"setQtdEpic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qtd","type":"uint256"}],"name":"setQtdLegendary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qtd","type":"uint256"}],"name":"setQtdRare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qtd","type":"uint256"}],"name":"setQtdUncommom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRewardAllMomomsOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setSoldOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setTsuki1Open","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setTsuki2Open","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setTsuki3Open","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setTsuki4Open","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setTsuki5Open","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setTsukiBurnAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setTsukiNftAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newuri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"soldOut","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"_mintQty","type":"uint256"},{"internalType":"bytes32","name":"dataHash","type":"bytes32"}],"name":"testGetCards","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","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":"tsukiBurnAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tsukiClaimedMomom","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tsukiNftAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"upperEpic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"upperLegendary","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"upperRare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"upperUncommom","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tsukiTokenIds","type":"uint256[]"}],"name":"validateCommom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tsukiTokenIds","type":"uint256[]"}],"name":"validateEpic","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tsukiTokenIds","type":"uint256[]"}],"name":"validateRare","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tsukiTokenIds","type":"uint256[]"}],"name":"validateUncommom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

608060405260fa6005908155600060078190556126ac6008556126b6600955611f40600a908155612008600b55611770600c55611a90600d55610bb8600e5561157c600f908155603c601055601e6011819055601291909155601384905560016014819055601580546001600160a01b0319169055601680546001600160d01b031916821790556603e871b540c000601755601880546001600160481b031916905560026019819055601a94909455601b94909455601c93909355601d559055601f805460ff191690556603328b944c4000602055348015620000e157600080fd5b506040805180820190915260058152644d4f4d4f4d60d81b6020820152620001098162000128565b5062000115336200013a565b6003805460ff60a01b19169055620002fd565b600262000136828262000231565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620001b757607f821691505b602082108103620001d857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200022c57600081815260208120601f850160051c81016020861015620002075750805b601f850160051c820191505b81811015620002285782815560010162000213565b5050505b505050565b81516001600160401b038111156200024d576200024d6200018c565b62000265816200025e8454620001a2565b84620001de565b602080601f8311600181146200029d5760008415620002845750858301515b600019600386901b1c1916600185901b17855562000228565b600085815260208120601f198616915b82811015620002ce57888601518255948401946001909101908401620002ad565b5085821015620002ed5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b615f1e806200030d6000396000f3fe6080604052600436106107e55760003560e01c80637b2ca38611610409578063ba5cfc1e1161021e578063d5616b7c1161012e578063eb501ea6116100b6578063f24ca59411610085578063f24ca59414611794578063f2fde38b146117b4578063f5298aca146117d4578063f7002710146117f4578063f8004d311461181457600080fd5b8063eb501ea614611728578063edf4e97a1461173e578063f1ac79d314611754578063f242432a1461177457600080fd5b8063dfd352ca116100fd578063dfd352ca14611667578063e805d32414611688578063e8c545ac146116a9578063e985e9c5146116bf578063e9cdf3a01461170857600080fd5b8063d5616b7c146115f6578063d6eec46a1461160c578063d7c009ce14611627578063d9ef157a1461164757600080fd5b8063c30d72d5116101b1578063c7fa69a911610180578063c7fa69a914611560578063d4811e3b14611581578063d4ce545a146115a1578063d5069924146115c1578063d547cfb7146115e157600080fd5b8063c30d72d5146114eb578063c41a360a1461150b578063c712fc601461152b578063c7ab2ce61461154057600080fd5b8063bde40a01116101ed578063bde40a0114611475578063be66f87114611495578063bf6b2a0d146114b5578063c1e1d0ee146114cb57600080fd5b8063ba5cfc1e14611406578063bcaae26f1461141c578063bcd56d0014611432578063bd85b0391461144857600080fd5b80639188d31211610319578063a43c6536116102ac578063adf36e9a1161027b578063adf36e9a14611384578063ae8506061461139a578063aeea2d45146113ba578063b488f3ef146113d0578063b5eb11d4146113f157600080fd5b8063a43c6536146112f6578063a90b9c7214611317578063a92e7e0714611337578063acf3d8571461135757600080fd5b80639c070274116102e85780639c070274146112765780639dcd50b8146112965780639e2c4f3e146112b6578063a22cb465146112d657600080fd5b80639188d3121461120157806393ffc2f7146112215780639571ab2b1461124157806398d5fdca1461126157600080fd5b8063829b5f7f1161039c578063886d6e431161036b578063886d6e4314611163578063893da6c9146111845780638b96e424146111a35780638da5cb5b146111c35780638e009c00146111e157600080fd5b8063829b5f7f146110f85780638456cb591461111857806385fa62f31461112d5780638708974a1461114d57600080fd5b80637d0091d4116103d85780637d0091d41461107f5780637dccc516146110955780637e1913b0146110b65780638161afcd146110d657600080fd5b80637b2ca38614610fc85780637b43a8e614610fe25780637b9842201461103e5780637bdb326f1461105e57600080fd5b80633cf5040a116105ff57806358963bbd1161050f5780636ae15cc8116104a257806374ba411e1161047157806374ba411e14610f255780637629a21314610f455780637705f9b514610f65578063775b700914610f85578063791eef0714610f9b57600080fd5b80636ae15cc814610eba5780636b20c45414610eda5780636f72fd8314610efa578063715018a614610f1057600080fd5b8063657a20fe116104de578063657a20fe14610e50578063660ee00b14610e7057806367bd44cb14610e85578063689fc11614610e9a57600080fd5b806358963bbd14610df05780635b1e025514610e065780635c975abb14610e1c57806360b0854c14610e3b57600080fd5b80634b2539b8116105925780634f558e79116105615780634f558e7914610d6357806352e4ec3114610d92578063534b959114610da857806357e871e714610dbd57806357f8887b14610dd057600080fd5b80634b2539b814610cee5780634bf2326b14610d0e5780634def4d1a14610d235780634e1273f414610d4357600080fd5b806340a5aae4116105ce57806340a5aae414610c6e57806345383f4014610c8e57806348e39d2c14610cae57806349825cea14610cce57600080fd5b80633cf5040a14610bf95780633dc7ad6514610c195780633f4ba83a14610c395780633fcc46b014610c4e57600080fd5b80631cd0c4c1116106fa5780632eb2c2d61161068d57806338b39d291161065c57806338b39d2914610b93578063394b117e14610ba65780633a4087c714610bbb5780633c99e8a114610bd15780633ccfd60b14610bf157600080fd5b80632eb2c2d614610afb578063321a7a7f14610b1b57806332e94ae414610b5357806333a4d1a114610b7357600080fd5b806327ec9b0a116106c957806327ec9b0a14610a845780632c3b9f5514610aa45780632d577e3614610aba5780632e39a68814610adb57600080fd5b80631cd0c4c114610a0d578063228e1eab14610a2d578063229028a214610a4357806324bbd04914610a6357600080fd5b80630d92a41c1161077d578063154b397b1161074c578063154b397b1461097857806317579e151461098d5780631801fbe5146109ad578063181204c9146109cd57806318510158146109ed57600080fd5b80630d92a41c146108f65780630e89341c1461091657806310406bec14610943578063122be4a31461096357600080fd5b806307aaeae4116107b957806307aaeae41461088f57806309c5663b146108a95780630aec2a0f146108bf5780630b3a921c146108d557600080fd5b8062fdd58e146107ea57806301ffc9a71461081d57806302fe53051461084d578063038133e51461086f575b600080fd5b3480156107f657600080fd5b5061080a610805366004615047565b611834565b6040519081526020015b60405180910390f35b34801561082957600080fd5b5061083d610838366004615089565b6118cd565b6040519015158152602001610814565b34801561085957600080fd5b5061086d610868366004615145565b61191d565b005b34801561087b57600080fd5b5061086d61088a36600461518d565b61193e565b34801561089b57600080fd5b50601f5461083d9060ff1681565b3480156108b557600080fd5b5061080a60055481565b3480156108cb57600080fd5b5061080a60115481565b3480156108e157600080fd5b5060165461083d90600160b01b900460ff1681565b34801561090257600080fd5b5061086d6109113660046151b4565b61194b565b34801561092257600080fd5b5061093661093136600461518d565b611971565b6040516108149190615221565b34801561094f57600080fd5b5061080a61095e36600461518d565b611a2d565b34801561096f57600080fd5b5061080a600c81565b34801561098457600080fd5b5061086d611a49565b34801561099957600080fd5b5061086d6109a8366004615234565b611b90565b6109c06109bb366004615234565b611ba0565b6040516108149190615291565b3480156109d957600080fd5b5061086d6109e83660046151b4565b611dfa565b3480156109f957600080fd5b5061080a610a0836600461518d565b611e25565b348015610a1957600080fd5b5061083d610a28366004615338565b611e41565b348015610a3957600080fd5b5061080a601c5481565b348015610a4f57600080fd5b5061086d610a5e3660046151b4565b611ec7565b348015610a6f57600080fd5b5060185461083d90600160381b900460ff1681565b348015610a9057600080fd5b5061080a610a9f36600461518d565b611eed565b348015610ab057600080fd5b5061080a600e5481565b348015610ac657600080fd5b5060165461083d90600160c01b900460ff1681565b348015610ae757600080fd5b5061086d610af63660046151b4565b6120ef565b348015610b0757600080fd5b5061086d610b1636600461538c565b612167565b348015610b2757600080fd5b50601654610b3b906001600160a01b031681565b6040516001600160a01b039091168152602001610814565b348015610b5f57600080fd5b5061086d610b6e366004615234565b6121b3565b348015610b7f57600080fd5b5061086d610b8e3660046151b4565b6121c3565b348015610b9f57600080fd5b5030610b3b565b348015610bb257600080fd5b5061080a6121e9565b348015610bc757600080fd5b5061080a60175481565b348015610bdd57600080fd5b5061086d610bec3660046151b4565b612200565b61086d612229565b348015610c0557600080fd5b5061080a610c1436600461518d565b612286565b348015610c2557600080fd5b5061086d610c34366004615439565b6122cc565b348015610c4557600080fd5b5061086d6122f6565b348015610c5a57600080fd5b5061086d610c69366004615338565b612308565b348015610c7a57600080fd5b5061086d610c89366004615234565b61272e565b348015610c9a57600080fd5b5061080a610ca9366004615234565b612741565b348015610cba57600080fd5b5061086d610cc936600461518d565b61290d565b348015610cda57600080fd5b5061083d610ce9366004615338565b61291a565b348015610cfa57600080fd5b506109c0610d09366004615456565b612997565b348015610d1a57600080fd5b5061080a613045565b348015610d2f57600080fd5b5061086d610d3e3660046151b4565b6130b2565b348015610d4f57600080fd5b506109c0610d5e3660046154a3565b6130cd565b348015610d6f57600080fd5b5061083d610d7e36600461518d565b600090815260046020526040902054151590565b348015610d9e57600080fd5b5061080a60135481565b348015610db457600080fd5b5061080a6131ee565b348015610dc957600080fd5b504361080a565b348015610ddc57600080fd5b5061086d610deb366004615234565b61323a565b348015610dfc57600080fd5b5061080a600d5481565b348015610e1257600080fd5b5061080a601a5481565b348015610e2857600080fd5b50600354600160a01b900460ff1661083d565b348015610e4757600080fd5b5061080a61324a565b348015610e5c57600080fd5b5061086d610e6b36600461518d565b61325c565b348015610e7c57600080fd5b5061080a613269565b348015610e9157600080fd5b506109c061327b565b348015610ea657600080fd5b5061086d610eb536600461518d565b613328565b348015610ec657600080fd5b5060185461083d9062010000900460ff1681565b348015610ee657600080fd5b5061086d610ef536600461556f565b613335565b348015610f0657600080fd5b5061080a601d5481565b348015610f1c57600080fd5b5061086d61337d565b348015610f3157600080fd5b5061086d610f4036600461518d565b6133ec565b348015610f5157600080fd5b5061083d610f60366004615338565b613454565b348015610f7157600080fd5b5061086d610f803660046155e4565b6134d1565b348015610f9157600080fd5b5061080a60095481565b348015610fa757600080fd5b5061080a610fb6366004615439565b60236020526000908152604090205481565b348015610fd457600080fd5b5060185461083d9060ff1681565b348015610fee57600080fd5b50611021610ffd366004615439565b60066020526000908152604090208054600182015460029092015490919060ff1683565b604080519384526020840192909252151590820152606001610814565b34801561104a57600080fd5b50601554610b3b906001600160a01b031681565b34801561106a57600080fd5b5060165461083d90600160a81b900460ff1681565b34801561108b57600080fd5b5061080a600c5481565b3480156110a157600080fd5b5060185461083d90600160401b900460ff1681565b3480156110c257600080fd5b5061080a6110d1366004615234565b613538565b3480156110e257600080fd5b5060185461083d90640100000000900460ff1681565b34801561110457600080fd5b5061086d6111133660046151b4565b61355b565b34801561112457600080fd5b5061086d613583565b34801561113957600080fd5b5061083d611148366004615338565b613593565b34801561115957600080fd5b5061080a600f5481565b34801561116f57600080fd5b5060185461083d90600160281b900460ff1681565b34801561119057600080fd5b5060185461083d90610100900460ff1681565b3480156111af57600080fd5b5061080a6111be36600461518d565b61360e565b3480156111cf57600080fd5b506003546001600160a01b0316610b3b565b3480156111ed57600080fd5b5061086d6111fc36600461518d565b61362a565b34801561120d57600080fd5b5061080a61121c36600461518d565b613637565b34801561122d57600080fd5b506109c061123c366004615234565b613730565b34801561124d57600080fd5b5061086d61125c3660046151b4565b613833565b34801561126d57600080fd5b5061080a61385b565b34801561128257600080fd5b5061086d611291366004615234565b6138ab565b3480156112a257600080fd5b5061080a6112b136600461518d565b6138bb565b3480156112c257600080fd5b5061080a6112d1366004615663565b6138d6565b3480156112e257600080fd5b5061086d6112f13660046156a7565b6139ac565b34801561130257600080fd5b5060165461083d90600160c81b900460ff1681565b34801561132357600080fd5b5061080a61133236600461518d565b6139b7565b34801561134357600080fd5b5061086d6113523660046151b4565b6139d3565b34801561136357600080fd5b5061080a61137236600461518d565b60226020526000908152604090205481565b34801561139057600080fd5b5061080a60205481565b3480156113a657600080fd5b5061086d6113b53660046151b4565b6139f9565b3480156113c657600080fd5b5061080a60105481565b3480156113dc57600080fd5b5060185461083d906301000000900460ff1681565b3480156113fd57600080fd5b5061080a613a57565b34801561141257600080fd5b5061080a60085481565b34801561142857600080fd5b5061080a601e5481565b34801561143e57600080fd5b5061080a600a5481565b34801561145457600080fd5b5061080a61146336600461518d565b60009081526004602052604090205490565b34801561148157600080fd5b5061080a61149036600461518d565b613a69565b3480156114a157600080fd5b5061086d6114b0366004615439565b613a7e565b3480156114c157600080fd5b5061080a60145481565b3480156114d757600080fd5b5061083d6114e63660046156e0565b613aa8565b3480156114f757600080fd5b5061080a61150636600461518d565b613b1f565b34801561151757600080fd5b50610b3b61152636600461518d565b613b53565b34801561153757600080fd5b506109c0613bc1565b34801561154c57600080fd5b5061086d61155b36600461518d565b613df9565b34801561156c57600080fd5b5060165461083d90600160b81b900460ff1681565b34801561158d57600080fd5b5061086d61159c3660046151b4565b613e06565b3480156115ad57600080fd5b5061080a6115bc36600461518d565b613e2c565b3480156115cd57600080fd5b5061086d6115dc36600461570e565b613e37565b3480156115ed57600080fd5b50610936613e61565b34801561160257600080fd5b5061080a60195481565b34801561161857600080fd5b5061080a660aa87bee53800081565b34801561163357600080fd5b5061086d61164236600461570e565b613eef565b34801561165357600080fd5b5061086d6116623660046151b4565b613f0e565b34801561167357600080fd5b5060165461083d90600160a01b900460ff1681565b34801561169457600080fd5b5060185461083d90600160301b900460ff1681565b3480156116b557600080fd5b5061080a601b5481565b3480156116cb57600080fd5b5061083d6116da3660046156e0565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561171457600080fd5b5061086d611723366004615234565b613f30565b34801561173457600080fd5b5061080a60125481565b34801561174a57600080fd5b5061080a600b5481565b34801561176057600080fd5b5061086d61176f36600461518d565b613f43565b34801561178057600080fd5b5061086d61178f36600461572c565b613f50565b3480156117a057600080fd5b5061086d6117af3660046151b4565b613f95565b3480156117c057600080fd5b5061086d6117cf366004615439565b613fb9565b3480156117e057600080fd5b5061086d6117ef366004615794565b61402f565b34801561180057600080fd5b5061086d61180f3660046151b4565b614072565b34801561182057600080fd5b5061086d61182f3660046151b4565b614098565b60006001600160a01b0383166118a45760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b14806118fe57506001600160e01b031982166303a24d0760e21b145b806118c757506301ffc9a760e01b6001600160e01b03198316146118c7565b6119256140c2565b60216119318282615843565b5061193b8161411c565b50565b6119466140c2565b601255565b6119536140c2565b60168054911515600160a01b0260ff60a01b19909216919091179055565b6000818152600460205260409020546060906119cf5760405162461bcd60e51b815260206004820152601f60248201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00604482015260640161189b565b60006119da83614128565b51116119f557604051806020016040528060008152506118c7565b6119fe82614128565b611a07836141bc565b604051602001611a18929190615902565b60405160208183030381529060405292915050565b600060145482611a3d9190615947565b6118c790610258615971565b601854600160401b900460ff16611aa25760405162461bcd60e51b815260206004820152601d60248201527f52657761726420616c6c204d6f6d6f6d206973206e6f74206f70656e21000000604482015260640161189b565b601954601a5410611b0a5760405162461bcd60e51b815260206004820152602c60248201527f4d617820726577617264207265616368656421205761697420666f7220616e6f60448201526b74686572207265776172642160a01b606482015260840161189b565b6000611b14613bc1565b905060005b8151811015611b5957611b4733838381518110611b3857611b38615984565b6020026020010151600161424e565b80611b518161599a565b915050611b19565b50611b78336102bc60016040518060200160405280600081525061436b565b601a8054906000611b888361599a565b919050555050565b611b986140c2565b600d55600c55565b601854606090600160381b900460ff16611bf25760405162461bcd60e51b81526020600482015260136024820152724d696e74206973206e6f74206f70656e65642160681b604482015260640161189b565b323314611c415760405162461bcd60e51b815260206004820152601d60248201527f434f4e5452414354535f4e4f545f414c4c4f5745445f544f5f4d494e54000000604482015260640161189b565b600c831115611c925760405162461bcd60e51b815260206004820152601860248201527f4d6178206d696e7420706572206d696e742069732031302e0000000000000000604482015260640161189b565b611c9a61385b565b611ca490846159b3565b341015611ce35760405162461bcd60e51b815260206004820152600d60248201526c092dcc6dee4e4cac6e8408aa89609b1b604482015260640161189b565b6000611cee83613e2c565b90506000611cfb85613b1f565b90506000611d098287615971565b6001600160401b03811115611d2057611d206150a6565b604051908082528060200260200182016040528015611d49578160200160208202803683370190505b50905060005b611d598388615971565b811015611df0576000611d7f858315611d78576110d184612710615aae565b6001613538565b9050611d8a81613637565b838381518110611d9c57611d9c615984565b602002602001018181525050611ddd33848481518110611dbe57611dbe615984565b602002602001015160016040518060200160405280600081525061436b565b5080611de88161599a565b915050611d4f565b5095945050505050565b611e026140c2565b60188054911515600160401b0268ff000000000000000019909216919091179055565b600060115482611e359190615947565b6118c79061012c615971565b6000805b8251811015611ebe57828181518110611e6057611e60615984565b602002602001015161012c1180611e9e5750601154611e819061012c615971565b838281518110611e9357611e93615984565b602002602001015110155b15611eac5750600092915050565b80611eb68161599a565b915050611e45565b50600192915050565b611ecf6140c2565b60168054911515600160a81b0260ff60a81b19909216919091179055565b3360009081526006602052604081206002015460ff1615611f435760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e481c995d99585b195960821b604482015260640161189b565b33600090815260066020526040902060028101805460ff1916600117905554611f6b83612286565b14611fc45760405162461bcd60e51b815260206004820152602360248201527f52657665616c6564206861736820646f6573206e6f74206d6174636820636f6d6044820152621b5a5d60ea1b606482015260840161189b565b336000908152600660205260409020600101546001600160401b034316116120435760405162461bcd60e51b815260206004820152602c60248201527f52657665616c20616e6420636f6d6d69742068617070656e6564206f6e20746860448201526b652073616d6520626c6f636b60a01b606482015260840161189b565b600554336000908152600660205260409020600101546120639190615971565b436001600160401b031611156120af5760405162461bcd60e51b815260206004820152601160248201527052657665616c656420746f6f206c61746560781b604482015260640161189b565b5033600090815260066020908152604091829020600101548251904081830152808301939093528151808403830181526060909301909152815191012090565b6120f76140c2565b6018805462ff00001916620100009215159283021790556016805461ffff60a01b1916600160a01b830260ff60a81b191617600160a81b83021761ffff60b01b1916600160b01b830260ff60b81b191617600160b81b83021760ff60c01b1916600160c01b909202919091179055565b6001600160a01b038516331480612183575061218385336116da565b61219f5760405162461bcd60e51b815260040161189b90615aba565b6121ac8585858585614485565b5050505050565b6121bb6140c2565b600f55600e55565b6121cb6140c2565b60168054911515600160b01b0260ff60b01b19909216919091179055565b6000600c54600d546121fb9190615b08565b905090565b6122086140c2565b60188054911515600160301b0266ff00000000000019909216919091179055565b6122316140c2565b604051600090339047908381818185875af1925050503d8060008114612273576040519150601f19603f3d011682016040523d82523d6000602084013e612278565b606091505b505090508061193b57600080fd5b6040516bffffffffffffffffffffffff193060601b166020820152603481018290526000906054015b604051602081830303815290604052805190602001209050919050565b6122d46140c2565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b6122fe6140c2565b61230661462f565b565b3233146123575760405162461bcd60e51b815260206004820152601d60248201527f4d7573742066726f6d207265616c2077616c6c65742061646472657373000000604482015260640161189b565b80516001036123be57601654600160a01b900460ff166123b95760405162461bcd60e51b815260206004820152601b60248201527f4275726e2031207473756b69206973206e6f74206f70656e6564210000000000604482015260640161189b565b612582565b805160020361242057601654600160a01b900460ff166123b95760405162461bcd60e51b815260206004820152601b60248201527f4275726e2032207473756b69206973206e6f74206f70656e6564210000000000604482015260640161189b565b805160030361248257601654600160a01b900460ff166123b95760405162461bcd60e51b815260206004820152601b60248201527f4275726e2033207473756b69206973206e6f74206f70656e6564210000000000604482015260640161189b565b80516004036124e457601654600160a01b900460ff166123b95760405162461bcd60e51b815260206004820152601b60248201527f4275726e2034207473756b69206973206e6f74206f70656e6564210000000000604482015260640161189b565b805160050361254657601654600160a01b900460ff166123b95760405162461bcd60e51b815260206004820152601b60248201527f4275726e2035207473756b69206973206e6f74206f70656e6564210000000000604482015260640161189b565b60405162461bcd60e51b81526020600482015260116024820152704275726e205175616e742077726f6e672160781b604482015260640161189b565b60005b815181101561272a5760155482516000916001600160a01b031690636352211e908590859081106125b8576125b8615984565b60200260200101516040518263ffffffff1660e01b81526004016125de91815260200190565b602060405180830381865afa1580156125fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061261f9190615b1b565b9050336001600160a01b038216146126735760405162461bcd60e51b815260206004820152601760248201527622b93937b91d102737ba1022a9219b99189037bbb732b960491b604482015260640161189b565b60155460165484516001600160a01b03928316926323b872dd9233929116908790879081106126a4576126a4615984565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b1580156126fe57600080fd5b505af1158015612712573d6000803e3d6000fd5b505050505080806127229061599a565b915050612585565b5050565b6127366140c2565b601b91909155601c55565b601854600090819062010000900460ff1661279e5760405162461bcd60e51b815260206004820152601960248201527f4672656520436c61696d206973206e6f74206f70656e65642100000000000000604482015260640161189b565b3233146127ed5760405162461bcd60e51b815260206004820152601d60248201527f434f4e5452414354535f4e4f545f414c4c4f5745445f544f5f4d494e54000000604482015260640161189b565b600084815260226020526040902054156128495760405162461bcd60e51b815260206004820152601c60248201527f5473756b6920616c726561647920636c61696d6564206d6f6d6f6d2100000000604482015260640161189b565b61285284613b53565b6001600160a01b0316336001600160a01b0316146128ac5760405162461bcd60e51b815260206004820152601760248201527622b93937b91d102737ba1022a9219b99189037bbb732b960491b604482015260640161189b565b60008481526022602052604081208054600192906128cb908490615971565b90915550600090506128dc84613e2c565b90506128e7816138bb565b9150612905338360016040518060200160405280600081525061436b565b509392505050565b6129156140c2565b601055565b6000805b8251811015611ebe5782818151811061293957612939615984565b60200260200101516101f41180612977575060135461295a906101f4615971565b83828151811061296c5761296c615984565b602002602001015110155b156129855750600092915050565b8061298f8161599a565b91505061291e565b6060600084516005036129ac57506001612a3c565b8451600a036129bd57506002612a3c565b8451600f036129ce57506003612a3c565b60405162461bcd60e51b815260206004820152603760248201527f596f75206e65656420352c203130206f72203135204d6f6d6f6d7320746f206760448201527f657420312c2032206f722033206d6f726520726172652e000000000000000000606482015260840161189b565b83600303612ab1578451600514612ab15760405162461bcd60e51b815260206004820152603360248201527f596f752063616e206f6e6c79206275726e20352045706963204d6f6d6f6d73206044820152723a379033b2ba1018902632b3b2b73230b93c9760691b606482015260840161189b565b6000816001600160401b03811115612acb57612acb6150a6565b604051908082528060200260200182016040528015612af4578160200160208202803683370190505b50905084600003612c4d576018546301000000900460ff16612b285760405162461bcd60e51b815260040161189b90615b38565b612b3186613593565b612b8f5760405162461bcd60e51b815260206004820152602960248201527f596f75206e656564203520436f6d6d6f6e7320746f20726563656976652061206044820152682ab731b7b6b6b7b69760b91b606482015260840161189b565b60005b8651811015612bc357612bb133888381518110611b3857611b38615984565b80612bbb8161599a565b915050612b92565b506000612bcf85613e2c565b905060005b83811015612c46576000612bf4838315611d78576110d184612710615aae565b9050612bff81611e25565b848381518110612c1157612c11615984565b602002602001018181525050612c3333858481518110611dbe57611dbe615984565b5080612c3e8161599a565b915050612bd4565b505061303c565b84600103612d9a57601854640100000000900460ff16612c7f5760405162461bcd60e51b815260040161189b90615b38565b612c8886611e41565b612ce35760405162461bcd60e51b815260206004820152602660248201527f596f75206e656564203520556e636f6d6d6f6d20746f20726563656976652061604482015265102930b9329760d11b606482015260840161189b565b60005b8651811015612d1757612d0533888381518110611b3857611b38615984565b80612d0f8161599a565b915050612ce6565b506000612d2385613e2c565b905060005b83811015612c46576000612d48838315611d78576110d184612710615aae565b9050612d53816139b7565b848381518110612d6557612d65615984565b602002602001018181525050612d8733858481518110611dbe57611dbe615984565b5080612d928161599a565b915050612d28565b84600203612ee257601854600160281b900460ff16612dcb5760405162461bcd60e51b815260040161189b90615b38565b612dd486613454565b612e2b5760405162461bcd60e51b815260206004820152602260248201527f596f75206e6565642035205261726520746f2072656365697665206120457069604482015261319760f11b606482015260840161189b565b60005b8651811015612e5f57612e4d33888381518110611b3857611b38615984565b80612e578161599a565b915050612e2e565b506000612e6b85613e2c565b905060005b83811015612c46576000612e90838315611d78576110d184612710615aae565b9050612e9b8161360e565b848381518110612ead57612ead615984565b602002602001018181525050612ecf33858481518110611dbe57611dbe615984565b5080612eda8161599a565b915050612e70565b84600303612fff57601854600160301b900460ff16612f135760405162461bcd60e51b815260040161189b90615b38565b612f1c8661291a565b612f785760405162461bcd60e51b815260206004820152602760248201527f596f75206e6565642035204570696320746f20726563656976652061204c656760448201526632b73230b93c9760c91b606482015260840161189b565b60005b8651811015612fac57612f9a33888381518110611b3857611b38615984565b80612fa48161599a565b915050612f7b565b506000612fb885613e2c565b9050612fc381611a2d565b82600081518110612fd657612fd6615984565b602002602001018181525050612ff93383600081518110611dbe57611dbe615984565b5061303c565b60405162461bcd60e51b815260206004820152601260248201527157726f6e6720726172697479206275726e2160701b604482015260640161189b565b95945050505050565b6015546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561308e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121fb9190615b6f565b6130ba6140c2565b6018805460ff1916911515919091179055565b606081518351146131325760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b606482015260840161189b565b600083516001600160401b0381111561314d5761314d6150a6565b604051908082528060200260200182016040528015613176578160200160208202803683370190505b50905060005b8451811015612905576131c185828151811061319a5761319a615984565b60200260200101518583815181106131b4576131b4615984565b6020026020010151611834565b8282815181106131d3576131d3615984565b60209081029190910101526131e78161599a565b905061317c565b60006131f8613a57565b613200613269565b6132086121e9565b61321061324a565b61321c90612710615b08565b6132269190615b08565b6132309190615b08565b6121fb9190615b08565b6132426140c2565b600b55600a55565b6000600e54600f546121fb9190615b08565b6132646140c2565b601155565b6000600a54600b546121fb9190615b08565b60606000613287613bc1565b9050600081516001600160401b038111156132a4576132a46150a6565b6040519080825280602002602001820160405280156132cd578160200160208202803683370190505b50905060005b8251811015613321576132f2338483815181106131b4576131b4615984565b82828151811061330457613304615984565b6020908102919091010152806133198161599a565b9150506132d3565b5092915050565b6133306140c2565b600555565b6001600160a01b038316331480613351575061335183336116da565b61336d5760405162461bcd60e51b815260040161189b90615aba565b613378838383614684565b505050565b6133856140c2565b60185460ff166133e25760405162461bcd60e51b815260206004820152602260248201527f4e6f74207468652074696d6520746f2052656e6f756e6365204f776e65727368604482015261069760f41b606482015260840161189b565b6123066000614820565b3360008181526006602090815260409182902084815543600182018190556002909101805460ff19169055825193845290830184905282820152517f19fad381b1712620715f03d76aa899a2fb46b402f67a49a4c13ff09a23a177249181900360600190a150565b6000805b8251811015611ebe5782818151811061347357613473615984565b602002602001015161019011806134b1575060125461349490610190615971565b8382815181106134a6576134a6615984565b602002602001015110155b156134bf5750600092915050565b806134c98161599a565b915050613458565b6134d96140c2565b60005b82811015613532576135208484838181106134f9576134f9615984565b905060200201602081019061350e9190615439565b838381518110611dbe57611dbe615984565b8061352a8161599a565b9150506134dc565b50505050565b6000806135458385615b88565b905061355361271082615947565b949350505050565b6135636140c2565b60188054911515600160281b0265ff000000000019909216919091179055565b61358b6140c2565b612306614872565b6000805b8251811015611ebe578281815181106135b2576135b2615984565b6020026020010151606411806135ee57506010546135d1906064615971565b8382815181106135e3576135e3615984565b602002602001015110155b156135fc5750600092915050565b806136068161599a565b915050613597565b60006013548261361e9190615947565b6118c7906101f4615971565b6136326140c2565b601355565b60008061364661271084615947565b90508060085410801561365b57506009548111155b156136805760145461366d9084615947565b61367990610258615971565b9392505050565b80600a541080156136935750600b548111155b156136b1576013546136a59084615947565b613679906101f4615971565b80600c541080156136c45750600d548111155b156136e2576012546136d69084615947565b61367990610190615971565b80600e541080156136f45750600f5481105b15613712576011546137069084615947565b6136799061012c615971565b60105461371f9084615947565b613679906064615971565b50919050565b606061373a6140c2565b6000613747846001615971565b6001600160401b0381111561375e5761375e6150a6565b604051908082528060200260200182016040528015613787578160200160208202803683370190505b509050600061379584613e2c565b905060005b8581101561380c5760006137ba838315611d78576110d184612710615aae565b90506137c581613637565b6137d282620186a06159b3565b6137dc9190615971565b8483815181106137ee576137ee615984565b602090810291909101015250806138048161599a565b91505061379a565b508082868151811061382057613820615984565b6020908102919091010152509392505050565b61383b6140c2565b601880549115156401000000000264ff0000000019909216919091179055565b601f5460009060ff16801561387757506000613875613045565b115b15613883575060205490565b601654600160c81b900460ff161561389c575060175490565b50660aa87bee53800090565b90565b6138b36140c2565b600955600855565b6000601054826138cb9190615947565b6118c7906064615971565b60008060006138e484613e2c565b90506138ef85612308565b845160010361390857613901816138bb565b9150613990565b845160020361391a5761390181611e25565b845160030361392c57613901816139b7565b845160040361393e576139018161360e565b84516005036139505761390181611a2d565b60405162461bcd60e51b815260206004820152601560248201527457726f6e67207473756b6920717479206275726e2160581b604482015260640161189b565b612905338360016040518060200160405280600081525061436b565b61272a3383836148b5565b6000601254826139c79190615947565b6118c790610190615971565b6139db6140c2565b60168054911515600160c01b0260ff60c01b19909216919091179055565b613a016140c2565b6018805464ffff0000001916630100000092151592830264ff0000000019161764010000000083021766ffff00000000001916600160281b830266ff000000000000191617600160301b92909202919091179055565b60006008546009546121fb9190615b08565b6000816040516020016122af91815260200190565b613a866140c2565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b60155460405163e985e9c560e01b81526001600160a01b0384811660048301528381166024830152600092169063e985e9c590604401602060405180830381865afa158015613afb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136799190615b9c565b601b5460009081908310613b3d57601c54613b3a9082615971565b90505b601d5483106118c757601e546136799082615971565b6015546040516331a9108f60e11b8152600481018390526000916001600160a01b031690636352211e90602401602060405180830381865afa158015613b9d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c79190615b1b565b60606000601454601354601254601154601054613bde9190615971565b613be89190615971565b613bf29190615971565b613bfc9190615971565b6001600160401b03811115613c1357613c136150a6565b604051908082528060200260200182016040528015613c3c578160200160208202803683370190505b5090506000805b601054811015613c9557613c58816064615971565b838381518110613c6a57613c6a615984565b602090810291909101015281613c7f8161599a565b9250508080613c8d9061599a565b915050613c43565b5060005b601154811015613cec57613caf8161012c615971565b838381518110613cc157613cc1615984565b602090810291909101015281613cd68161599a565b9250508080613ce49061599a565b915050613c99565b5060005b601254811015613d4357613d0681610190615971565b838381518110613d1857613d18615984565b602090810291909101015281613d2d8161599a565b9250508080613d3b9061599a565b915050613cf0565b5060005b601354811015613d9a57613d5d816101f4615971565b838381518110613d6f57613d6f615984565b602090810291909101015281613d848161599a565b9250508080613d929061599a565b915050613d47565b5060005b601454811015613df157613db481610258615971565b838381518110613dc657613dc6615984565b602090810291909101015281613ddb8161599a565b9250508080613de99061599a565b915050613d9e565b509092915050565b613e016140c2565b601955565b613e0e6140c2565b60168054911515600160b81b0260ff60b81b19909216919091179055565b60006118c782611eed565b613e3f6140c2565b60168054921515600160c81b0260ff60c81b1990931692909217909155601755565b60218054613e6e906157c9565b80601f0160208091040260200160405190810160405280929190818152602001828054613e9a906157c9565b8015613ee75780601f10613ebc57610100808354040283529160200191613ee7565b820191906000526020600020905b815481529060010190602001808311613eca57829003601f168201915b505050505081565b613ef76140c2565b601f805460ff191692151592909217909155602055565b613f166140c2565b601880549115156101000261ff0019909216919091179055565b613f386140c2565b601d91909155601e55565b613f4b6140c2565b601455565b6001600160a01b038516331480613f6c5750613f6c85336116da565b613f885760405162461bcd60e51b815260040161189b90615aba565b6121ac8585858585614995565b613f9d6140c2565b60188054911515620100000262ff000019909216919091179055565b613fc16140c2565b6001600160a01b0381166140265760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161189b565b61193b81614820565b6001600160a01b03831633148061404b575061404b83336116da565b6140675760405162461bcd60e51b815260040161189b90615aba565b61337883838361424e565b61407a6140c2565b6018805491151563010000000263ff00000019909216919091179055565b6140a06140c2565b60188054911515600160381b0267ff0000000000000019909216919091179055565b6003546001600160a01b031633146123065760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161189b565b600261272a8282615843565b606060028054614137906157c9565b80601f0160208091040260200160405190810160405280929190818152602001828054614163906157c9565b80156141b05780601f10614185576101008083540402835291602001916141b0565b820191906000526020600020905b81548152906001019060200180831161419357829003601f168201915b50505050509050919050565b606060006141c983614acd565b60010190506000816001600160401b038111156141e8576141e86150a6565b6040519080825280601f01601f191660200182016040528015614212576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461421c57509392505050565b6001600160a01b0383166142745760405162461bcd60e51b815260040161189b90615bb9565b33600061428084614ba5565b9050600061428d84614ba5565b90506142ad83876000858560405180602001604052806000815250614bf0565b6000858152602081815260408083206001600160a01b038a168452909152902054848110156142ee5760405162461bcd60e51b815260040161189b90615bfc565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46040805160208101909152600090525b50505050505050565b6001600160a01b0384166143cb5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161189b565b3360006143d785614ba5565b905060006143e485614ba5565b90506143f583600089858589614bf0565b6000868152602081815260408083206001600160a01b038b16845290915281208054879290614425908490615971565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461436283600089898989614c06565b81518351146144a65760405162461bcd60e51b815260040161189b90615c40565b6001600160a01b0384166144cc5760405162461bcd60e51b815260040161189b90615c88565b336144db818787878787614bf0565b60005b84518110156145c15760008582815181106144fb576144fb615984565b60200260200101519050600085838151811061451957614519615984565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156145695760405162461bcd60e51b815260040161189b90615ccd565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906145a6908490615971565b92505081905550505050806145ba9061599a565b90506144de565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051614611929190615d17565b60405180910390a4614627818787878787614d61565b505050505050565b614637614e1c565b6003805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b0383166146aa5760405162461bcd60e51b815260040161189b90615bb9565b80518251146146cb5760405162461bcd60e51b815260040161189b90615c40565b60003390506146ee81856000868660405180602001604052806000815250614bf0565b60005b83518110156147b357600084828151811061470e5761470e615984565b60200260200101519050600084838151811061472c5761472c615984565b602090810291909101810151600084815280835260408082206001600160a01b038c16835290935291909120549091508181101561477c5760405162461bcd60e51b815260040161189b90615bfc565b6000928352602083815260408085206001600160a01b038b16865290915290922091039055806147ab8161599a565b9150506146f1565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051614804929190615d17565b60405180910390a4604080516020810190915260009052613532565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61487a614e6c565b6003805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586146673390565b816001600160a01b0316836001600160a01b0316036149285760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b606482015260840161189b565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0384166149bb5760405162461bcd60e51b815260040161189b90615c88565b3360006149c785614ba5565b905060006149d485614ba5565b90506149e4838989858589614bf0565b6000868152602081815260408083206001600160a01b038c16845290915290205485811015614a255760405162461bcd60e51b815260040161189b90615ccd565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290614a62908490615971565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4614ac2848a8a8a8a8a614c06565b505050505050505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310614b0c5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310614b38576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310614b5657662386f26fc10000830492506010015b6305f5e1008310614b6e576305f5e100830492506008015b6127108310614b8257612710830492506004015b60648310614b94576064830492506002015b600a83106118c75760010192915050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110614bdf57614bdf615984565b602090810291909101015292915050565b614bf8614e6c565b614627868686868686614eb9565b6001600160a01b0384163b156146275760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190614c4a9089908990889088908890600401615d3c565b6020604051808303816000875af1925050508015614c85575060408051601f3d908101601f19168201909252614c8291810190615d81565b60015b614d3157614c91615d9e565b806308c379a003614cca5750614ca5615db9565b80614cb05750614ccc565b8060405162461bcd60e51b815260040161189b9190615221565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606482015260840161189b565b6001600160e01b0319811663f23a6e6160e01b146143625760405162461bcd60e51b815260040161189b90615e42565b6001600160a01b0384163b156146275760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190614da59089908990889088908890600401615e8a565b6020604051808303816000875af1925050508015614de0575060408051601f3d908101601f19168201909252614ddd91810190615d81565b60015b614dec57614c91615d9e565b6001600160e01b0319811663bc197c8160e01b146143625760405162461bcd60e51b815260040161189b90615e42565b600354600160a01b900460ff166123065760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640161189b565b600354600160a01b900460ff16156123065760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161189b565b6001600160a01b038516614f405760005b8351811015614f3e57828181518110614ee557614ee5615984565b602002602001015160046000868481518110614f0357614f03615984565b602002602001015181526020019081526020016000206000828254614f289190615971565b90915550614f3790508161599a565b9050614eca565b505b6001600160a01b0384166146275760005b8351811015614362576000848281518110614f6e57614f6e615984565b602002602001015190506000848381518110614f8c57614f8c615984565b602002602001015190506000600460008481526020019081526020016000205490508181101561500f5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b606482015260840161189b565b6000928352600460205260409092209103905561502b8161599a565b9050614f51565b6001600160a01b038116811461193b57600080fd5b6000806040838503121561505a57600080fd5b823561506581615032565b946020939093013593505050565b6001600160e01b03198116811461193b57600080fd5b60006020828403121561509b57600080fd5b813561367981615073565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b03811182821017156150e1576150e16150a6565b6040525050565b60006001600160401b03831115615101576151016150a6565b604051615118601f8501601f1916602001826150bc565b80915083815284848401111561512d57600080fd5b83836020830137600060208583010152509392505050565b60006020828403121561515757600080fd5b81356001600160401b0381111561516d57600080fd5b8201601f8101841361517e57600080fd5b613553848235602084016150e8565b60006020828403121561519f57600080fd5b5035919050565b801515811461193b57600080fd5b6000602082840312156151c657600080fd5b8135613679816151a6565b60005b838110156151ec5781810151838201526020016151d4565b50506000910152565b6000815180845261520d8160208601602086016151d1565b601f01601f19169290920160200192915050565b60208152600061367960208301846151f5565b6000806040838503121561524757600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b838110156152865781518752958201959082019060010161526a565b509495945050505050565b6020815260006136796020830184615256565b60006001600160401b038211156152bd576152bd6150a6565b5060051b60200190565b600082601f8301126152d857600080fd5b813560206152e5826152a4565b6040516152f282826150bc565b83815260059390931b850182019282810191508684111561531257600080fd5b8286015b8481101561532d5780358352918301918301615316565b509695505050505050565b60006020828403121561534a57600080fd5b81356001600160401b0381111561536057600080fd5b613553848285016152c7565b600082601f83011261537d57600080fd5b613679838335602085016150e8565b600080600080600060a086880312156153a457600080fd5b85356153af81615032565b945060208601356153bf81615032565b935060408601356001600160401b03808211156153db57600080fd5b6153e789838a016152c7565b945060608801359150808211156153fd57600080fd5b61540989838a016152c7565b9350608088013591508082111561541f57600080fd5b5061542c8882890161536c565b9150509295509295909350565b60006020828403121561544b57600080fd5b813561367981615032565b60008060006060848603121561546b57600080fd5b83356001600160401b0381111561548157600080fd5b61548d868287016152c7565b9660208601359650604090950135949350505050565b600080604083850312156154b657600080fd5b82356001600160401b03808211156154cd57600080fd5b818501915085601f8301126154e157600080fd5b813560206154ee826152a4565b6040516154fb82826150bc565b83815260059390931b850182019282810191508984111561551b57600080fd5b948201945b8386101561554257853561553381615032565b82529482019490820190615520565b9650508601359250508082111561555857600080fd5b50615565858286016152c7565b9150509250929050565b60008060006060848603121561558457600080fd5b833561558f81615032565b925060208401356001600160401b03808211156155ab57600080fd5b6155b7878388016152c7565b935060408601359150808211156155cd57600080fd5b506155da868287016152c7565b9150509250925092565b6000806000604084860312156155f957600080fd5b83356001600160401b038082111561561057600080fd5b818601915086601f83011261562457600080fd5b81358181111561563357600080fd5b8760208260051b850101111561564857600080fd5b6020928301955093509085013590808211156155cd57600080fd5b6000806040838503121561567657600080fd5b82356001600160401b0381111561568c57600080fd5b615698858286016152c7565b95602094909401359450505050565b600080604083850312156156ba57600080fd5b82356156c581615032565b915060208301356156d5816151a6565b809150509250929050565b600080604083850312156156f357600080fd5b82356156fe81615032565b915060208301356156d581615032565b6000806040838503121561572157600080fd5b8235615065816151a6565b600080600080600060a0868803121561574457600080fd5b853561574f81615032565b9450602086013561575f81615032565b9350604086013592506060860135915060808601356001600160401b0381111561578857600080fd5b61542c8882890161536c565b6000806000606084860312156157a957600080fd5b83356157b481615032565b95602085013595506040909401359392505050565b600181811c908216806157dd57607f821691505b60208210810361372a57634e487b7160e01b600052602260045260246000fd5b601f82111561337857600081815260208120601f850160051c810160208610156158245750805b601f850160051c820191505b8181101561462757828155600101615830565b81516001600160401b0381111561585c5761585c6150a6565b6158708161586a84546157c9565b846157fd565b602080601f8311600181146158a5576000841561588d5750858301515b600019600386901b1c1916600185901b178555614627565b600085815260208120601f198616915b828110156158d4578886015182559484019460019091019084016158b5565b50858210156158f25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600083516159148184602088016151d1565b8351908301906159288183602088016151d1565b01949350505050565b634e487b7160e01b600052601260045260246000fd5b60008261595657615956615931565b500690565b634e487b7160e01b600052601160045260246000fd5b808201808211156118c7576118c761595b565b634e487b7160e01b600052603260045260246000fd5b6000600182016159ac576159ac61595b565b5060010190565b80820281158282048414176118c7576118c761595b565b600181815b80851115615a055781600019048211156159eb576159eb61595b565b808516156159f857918102915b93841c93908002906159cf565b509250929050565b600082615a1c575060016118c7565b81615a29575060006118c7565b8160018114615a3f5760028114615a4957615a65565b60019150506118c7565b60ff841115615a5a57615a5a61595b565b50506001821b6118c7565b5060208310610133831016604e8410600b8410161715615a88575081810a6118c7565b615a9283836159ca565b8060001904821115615aa657615aa661595b565b029392505050565b60006136798383615a0d565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b818103818111156118c7576118c761595b565b600060208284031215615b2d57600080fd5b815161367981615032565b60208082526017908201527f4275726e204d6f6d6f6d206973206e6f74206f70656e21000000000000000000604082015260600190565b600060208284031215615b8157600080fd5b5051919050565b600082615b9757615b97615931565b500490565b600060208284031215615bae57600080fd5b8151613679816151a6565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b604081526000615d2a6040830185615256565b828103602084015261303c8185615256565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090615d76908301846151f5565b979650505050505050565b600060208284031215615d9357600080fd5b815161367981615073565b600060033d11156138a85760046000803e5060005160e01c90565b600060443d1015615dc75790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715615df657505050505090565b8285019150815181811115615e0e5750505050505090565b843d8701016020828501011115615e285750505050505090565b615e37602082860101876150bc565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a060408201819052600090615eb690830186615256565b8281036060840152615ec88186615256565b90508281036080840152615edc81856151f5565b9897505050505050505056fea2646970667358221220bc880ca4f81a287e32893b5cbb770f6924d6f78bdbea3d59c5f64434745a976b64736f6c63430008120033

Deployed Bytecode

0x6080604052600436106107e55760003560e01c80637b2ca38611610409578063ba5cfc1e1161021e578063d5616b7c1161012e578063eb501ea6116100b6578063f24ca59411610085578063f24ca59414611794578063f2fde38b146117b4578063f5298aca146117d4578063f7002710146117f4578063f8004d311461181457600080fd5b8063eb501ea614611728578063edf4e97a1461173e578063f1ac79d314611754578063f242432a1461177457600080fd5b8063dfd352ca116100fd578063dfd352ca14611667578063e805d32414611688578063e8c545ac146116a9578063e985e9c5146116bf578063e9cdf3a01461170857600080fd5b8063d5616b7c146115f6578063d6eec46a1461160c578063d7c009ce14611627578063d9ef157a1461164757600080fd5b8063c30d72d5116101b1578063c7fa69a911610180578063c7fa69a914611560578063d4811e3b14611581578063d4ce545a146115a1578063d5069924146115c1578063d547cfb7146115e157600080fd5b8063c30d72d5146114eb578063c41a360a1461150b578063c712fc601461152b578063c7ab2ce61461154057600080fd5b8063bde40a01116101ed578063bde40a0114611475578063be66f87114611495578063bf6b2a0d146114b5578063c1e1d0ee146114cb57600080fd5b8063ba5cfc1e14611406578063bcaae26f1461141c578063bcd56d0014611432578063bd85b0391461144857600080fd5b80639188d31211610319578063a43c6536116102ac578063adf36e9a1161027b578063adf36e9a14611384578063ae8506061461139a578063aeea2d45146113ba578063b488f3ef146113d0578063b5eb11d4146113f157600080fd5b8063a43c6536146112f6578063a90b9c7214611317578063a92e7e0714611337578063acf3d8571461135757600080fd5b80639c070274116102e85780639c070274146112765780639dcd50b8146112965780639e2c4f3e146112b6578063a22cb465146112d657600080fd5b80639188d3121461120157806393ffc2f7146112215780639571ab2b1461124157806398d5fdca1461126157600080fd5b8063829b5f7f1161039c578063886d6e431161036b578063886d6e4314611163578063893da6c9146111845780638b96e424146111a35780638da5cb5b146111c35780638e009c00146111e157600080fd5b8063829b5f7f146110f85780638456cb591461111857806385fa62f31461112d5780638708974a1461114d57600080fd5b80637d0091d4116103d85780637d0091d41461107f5780637dccc516146110955780637e1913b0146110b65780638161afcd146110d657600080fd5b80637b2ca38614610fc85780637b43a8e614610fe25780637b9842201461103e5780637bdb326f1461105e57600080fd5b80633cf5040a116105ff57806358963bbd1161050f5780636ae15cc8116104a257806374ba411e1161047157806374ba411e14610f255780637629a21314610f455780637705f9b514610f65578063775b700914610f85578063791eef0714610f9b57600080fd5b80636ae15cc814610eba5780636b20c45414610eda5780636f72fd8314610efa578063715018a614610f1057600080fd5b8063657a20fe116104de578063657a20fe14610e50578063660ee00b14610e7057806367bd44cb14610e85578063689fc11614610e9a57600080fd5b806358963bbd14610df05780635b1e025514610e065780635c975abb14610e1c57806360b0854c14610e3b57600080fd5b80634b2539b8116105925780634f558e79116105615780634f558e7914610d6357806352e4ec3114610d92578063534b959114610da857806357e871e714610dbd57806357f8887b14610dd057600080fd5b80634b2539b814610cee5780634bf2326b14610d0e5780634def4d1a14610d235780634e1273f414610d4357600080fd5b806340a5aae4116105ce57806340a5aae414610c6e57806345383f4014610c8e57806348e39d2c14610cae57806349825cea14610cce57600080fd5b80633cf5040a14610bf95780633dc7ad6514610c195780633f4ba83a14610c395780633fcc46b014610c4e57600080fd5b80631cd0c4c1116106fa5780632eb2c2d61161068d57806338b39d291161065c57806338b39d2914610b93578063394b117e14610ba65780633a4087c714610bbb5780633c99e8a114610bd15780633ccfd60b14610bf157600080fd5b80632eb2c2d614610afb578063321a7a7f14610b1b57806332e94ae414610b5357806333a4d1a114610b7357600080fd5b806327ec9b0a116106c957806327ec9b0a14610a845780632c3b9f5514610aa45780632d577e3614610aba5780632e39a68814610adb57600080fd5b80631cd0c4c114610a0d578063228e1eab14610a2d578063229028a214610a4357806324bbd04914610a6357600080fd5b80630d92a41c1161077d578063154b397b1161074c578063154b397b1461097857806317579e151461098d5780631801fbe5146109ad578063181204c9146109cd57806318510158146109ed57600080fd5b80630d92a41c146108f65780630e89341c1461091657806310406bec14610943578063122be4a31461096357600080fd5b806307aaeae4116107b957806307aaeae41461088f57806309c5663b146108a95780630aec2a0f146108bf5780630b3a921c146108d557600080fd5b8062fdd58e146107ea57806301ffc9a71461081d57806302fe53051461084d578063038133e51461086f575b600080fd5b3480156107f657600080fd5b5061080a610805366004615047565b611834565b6040519081526020015b60405180910390f35b34801561082957600080fd5b5061083d610838366004615089565b6118cd565b6040519015158152602001610814565b34801561085957600080fd5b5061086d610868366004615145565b61191d565b005b34801561087b57600080fd5b5061086d61088a36600461518d565b61193e565b34801561089b57600080fd5b50601f5461083d9060ff1681565b3480156108b557600080fd5b5061080a60055481565b3480156108cb57600080fd5b5061080a60115481565b3480156108e157600080fd5b5060165461083d90600160b01b900460ff1681565b34801561090257600080fd5b5061086d6109113660046151b4565b61194b565b34801561092257600080fd5b5061093661093136600461518d565b611971565b6040516108149190615221565b34801561094f57600080fd5b5061080a61095e36600461518d565b611a2d565b34801561096f57600080fd5b5061080a600c81565b34801561098457600080fd5b5061086d611a49565b34801561099957600080fd5b5061086d6109a8366004615234565b611b90565b6109c06109bb366004615234565b611ba0565b6040516108149190615291565b3480156109d957600080fd5b5061086d6109e83660046151b4565b611dfa565b3480156109f957600080fd5b5061080a610a0836600461518d565b611e25565b348015610a1957600080fd5b5061083d610a28366004615338565b611e41565b348015610a3957600080fd5b5061080a601c5481565b348015610a4f57600080fd5b5061086d610a5e3660046151b4565b611ec7565b348015610a6f57600080fd5b5060185461083d90600160381b900460ff1681565b348015610a9057600080fd5b5061080a610a9f36600461518d565b611eed565b348015610ab057600080fd5b5061080a600e5481565b348015610ac657600080fd5b5060165461083d90600160c01b900460ff1681565b348015610ae757600080fd5b5061086d610af63660046151b4565b6120ef565b348015610b0757600080fd5b5061086d610b1636600461538c565b612167565b348015610b2757600080fd5b50601654610b3b906001600160a01b031681565b6040516001600160a01b039091168152602001610814565b348015610b5f57600080fd5b5061086d610b6e366004615234565b6121b3565b348015610b7f57600080fd5b5061086d610b8e3660046151b4565b6121c3565b348015610b9f57600080fd5b5030610b3b565b348015610bb257600080fd5b5061080a6121e9565b348015610bc757600080fd5b5061080a60175481565b348015610bdd57600080fd5b5061086d610bec3660046151b4565b612200565b61086d612229565b348015610c0557600080fd5b5061080a610c1436600461518d565b612286565b348015610c2557600080fd5b5061086d610c34366004615439565b6122cc565b348015610c4557600080fd5b5061086d6122f6565b348015610c5a57600080fd5b5061086d610c69366004615338565b612308565b348015610c7a57600080fd5b5061086d610c89366004615234565b61272e565b348015610c9a57600080fd5b5061080a610ca9366004615234565b612741565b348015610cba57600080fd5b5061086d610cc936600461518d565b61290d565b348015610cda57600080fd5b5061083d610ce9366004615338565b61291a565b348015610cfa57600080fd5b506109c0610d09366004615456565b612997565b348015610d1a57600080fd5b5061080a613045565b348015610d2f57600080fd5b5061086d610d3e3660046151b4565b6130b2565b348015610d4f57600080fd5b506109c0610d5e3660046154a3565b6130cd565b348015610d6f57600080fd5b5061083d610d7e36600461518d565b600090815260046020526040902054151590565b348015610d9e57600080fd5b5061080a60135481565b348015610db457600080fd5b5061080a6131ee565b348015610dc957600080fd5b504361080a565b348015610ddc57600080fd5b5061086d610deb366004615234565b61323a565b348015610dfc57600080fd5b5061080a600d5481565b348015610e1257600080fd5b5061080a601a5481565b348015610e2857600080fd5b50600354600160a01b900460ff1661083d565b348015610e4757600080fd5b5061080a61324a565b348015610e5c57600080fd5b5061086d610e6b36600461518d565b61325c565b348015610e7c57600080fd5b5061080a613269565b348015610e9157600080fd5b506109c061327b565b348015610ea657600080fd5b5061086d610eb536600461518d565b613328565b348015610ec657600080fd5b5060185461083d9062010000900460ff1681565b348015610ee657600080fd5b5061086d610ef536600461556f565b613335565b348015610f0657600080fd5b5061080a601d5481565b348015610f1c57600080fd5b5061086d61337d565b348015610f3157600080fd5b5061086d610f4036600461518d565b6133ec565b348015610f5157600080fd5b5061083d610f60366004615338565b613454565b348015610f7157600080fd5b5061086d610f803660046155e4565b6134d1565b348015610f9157600080fd5b5061080a60095481565b348015610fa757600080fd5b5061080a610fb6366004615439565b60236020526000908152604090205481565b348015610fd457600080fd5b5060185461083d9060ff1681565b348015610fee57600080fd5b50611021610ffd366004615439565b60066020526000908152604090208054600182015460029092015490919060ff1683565b604080519384526020840192909252151590820152606001610814565b34801561104a57600080fd5b50601554610b3b906001600160a01b031681565b34801561106a57600080fd5b5060165461083d90600160a81b900460ff1681565b34801561108b57600080fd5b5061080a600c5481565b3480156110a157600080fd5b5060185461083d90600160401b900460ff1681565b3480156110c257600080fd5b5061080a6110d1366004615234565b613538565b3480156110e257600080fd5b5060185461083d90640100000000900460ff1681565b34801561110457600080fd5b5061086d6111133660046151b4565b61355b565b34801561112457600080fd5b5061086d613583565b34801561113957600080fd5b5061083d611148366004615338565b613593565b34801561115957600080fd5b5061080a600f5481565b34801561116f57600080fd5b5060185461083d90600160281b900460ff1681565b34801561119057600080fd5b5060185461083d90610100900460ff1681565b3480156111af57600080fd5b5061080a6111be36600461518d565b61360e565b3480156111cf57600080fd5b506003546001600160a01b0316610b3b565b3480156111ed57600080fd5b5061086d6111fc36600461518d565b61362a565b34801561120d57600080fd5b5061080a61121c36600461518d565b613637565b34801561122d57600080fd5b506109c061123c366004615234565b613730565b34801561124d57600080fd5b5061086d61125c3660046151b4565b613833565b34801561126d57600080fd5b5061080a61385b565b34801561128257600080fd5b5061086d611291366004615234565b6138ab565b3480156112a257600080fd5b5061080a6112b136600461518d565b6138bb565b3480156112c257600080fd5b5061080a6112d1366004615663565b6138d6565b3480156112e257600080fd5b5061086d6112f13660046156a7565b6139ac565b34801561130257600080fd5b5060165461083d90600160c81b900460ff1681565b34801561132357600080fd5b5061080a61133236600461518d565b6139b7565b34801561134357600080fd5b5061086d6113523660046151b4565b6139d3565b34801561136357600080fd5b5061080a61137236600461518d565b60226020526000908152604090205481565b34801561139057600080fd5b5061080a60205481565b3480156113a657600080fd5b5061086d6113b53660046151b4565b6139f9565b3480156113c657600080fd5b5061080a60105481565b3480156113dc57600080fd5b5060185461083d906301000000900460ff1681565b3480156113fd57600080fd5b5061080a613a57565b34801561141257600080fd5b5061080a60085481565b34801561142857600080fd5b5061080a601e5481565b34801561143e57600080fd5b5061080a600a5481565b34801561145457600080fd5b5061080a61146336600461518d565b60009081526004602052604090205490565b34801561148157600080fd5b5061080a61149036600461518d565b613a69565b3480156114a157600080fd5b5061086d6114b0366004615439565b613a7e565b3480156114c157600080fd5b5061080a60145481565b3480156114d757600080fd5b5061083d6114e63660046156e0565b613aa8565b3480156114f757600080fd5b5061080a61150636600461518d565b613b1f565b34801561151757600080fd5b50610b3b61152636600461518d565b613b53565b34801561153757600080fd5b506109c0613bc1565b34801561154c57600080fd5b5061086d61155b36600461518d565b613df9565b34801561156c57600080fd5b5060165461083d90600160b81b900460ff1681565b34801561158d57600080fd5b5061086d61159c3660046151b4565b613e06565b3480156115ad57600080fd5b5061080a6115bc36600461518d565b613e2c565b3480156115cd57600080fd5b5061086d6115dc36600461570e565b613e37565b3480156115ed57600080fd5b50610936613e61565b34801561160257600080fd5b5061080a60195481565b34801561161857600080fd5b5061080a660aa87bee53800081565b34801561163357600080fd5b5061086d61164236600461570e565b613eef565b34801561165357600080fd5b5061086d6116623660046151b4565b613f0e565b34801561167357600080fd5b5060165461083d90600160a01b900460ff1681565b34801561169457600080fd5b5060185461083d90600160301b900460ff1681565b3480156116b557600080fd5b5061080a601b5481565b3480156116cb57600080fd5b5061083d6116da3660046156e0565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561171457600080fd5b5061086d611723366004615234565b613f30565b34801561173457600080fd5b5061080a60125481565b34801561174a57600080fd5b5061080a600b5481565b34801561176057600080fd5b5061086d61176f36600461518d565b613f43565b34801561178057600080fd5b5061086d61178f36600461572c565b613f50565b3480156117a057600080fd5b5061086d6117af3660046151b4565b613f95565b3480156117c057600080fd5b5061086d6117cf366004615439565b613fb9565b3480156117e057600080fd5b5061086d6117ef366004615794565b61402f565b34801561180057600080fd5b5061086d61180f3660046151b4565b614072565b34801561182057600080fd5b5061086d61182f3660046151b4565b614098565b60006001600160a01b0383166118a45760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b14806118fe57506001600160e01b031982166303a24d0760e21b145b806118c757506301ffc9a760e01b6001600160e01b03198316146118c7565b6119256140c2565b60216119318282615843565b5061193b8161411c565b50565b6119466140c2565b601255565b6119536140c2565b60168054911515600160a01b0260ff60a01b19909216919091179055565b6000818152600460205260409020546060906119cf5760405162461bcd60e51b815260206004820152601f60248201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00604482015260640161189b565b60006119da83614128565b51116119f557604051806020016040528060008152506118c7565b6119fe82614128565b611a07836141bc565b604051602001611a18929190615902565b60405160208183030381529060405292915050565b600060145482611a3d9190615947565b6118c790610258615971565b601854600160401b900460ff16611aa25760405162461bcd60e51b815260206004820152601d60248201527f52657761726420616c6c204d6f6d6f6d206973206e6f74206f70656e21000000604482015260640161189b565b601954601a5410611b0a5760405162461bcd60e51b815260206004820152602c60248201527f4d617820726577617264207265616368656421205761697420666f7220616e6f60448201526b74686572207265776172642160a01b606482015260840161189b565b6000611b14613bc1565b905060005b8151811015611b5957611b4733838381518110611b3857611b38615984565b6020026020010151600161424e565b80611b518161599a565b915050611b19565b50611b78336102bc60016040518060200160405280600081525061436b565b601a8054906000611b888361599a565b919050555050565b611b986140c2565b600d55600c55565b601854606090600160381b900460ff16611bf25760405162461bcd60e51b81526020600482015260136024820152724d696e74206973206e6f74206f70656e65642160681b604482015260640161189b565b323314611c415760405162461bcd60e51b815260206004820152601d60248201527f434f4e5452414354535f4e4f545f414c4c4f5745445f544f5f4d494e54000000604482015260640161189b565b600c831115611c925760405162461bcd60e51b815260206004820152601860248201527f4d6178206d696e7420706572206d696e742069732031302e0000000000000000604482015260640161189b565b611c9a61385b565b611ca490846159b3565b341015611ce35760405162461bcd60e51b815260206004820152600d60248201526c092dcc6dee4e4cac6e8408aa89609b1b604482015260640161189b565b6000611cee83613e2c565b90506000611cfb85613b1f565b90506000611d098287615971565b6001600160401b03811115611d2057611d206150a6565b604051908082528060200260200182016040528015611d49578160200160208202803683370190505b50905060005b611d598388615971565b811015611df0576000611d7f858315611d78576110d184612710615aae565b6001613538565b9050611d8a81613637565b838381518110611d9c57611d9c615984565b602002602001018181525050611ddd33848481518110611dbe57611dbe615984565b602002602001015160016040518060200160405280600081525061436b565b5080611de88161599a565b915050611d4f565b5095945050505050565b611e026140c2565b60188054911515600160401b0268ff000000000000000019909216919091179055565b600060115482611e359190615947565b6118c79061012c615971565b6000805b8251811015611ebe57828181518110611e6057611e60615984565b602002602001015161012c1180611e9e5750601154611e819061012c615971565b838281518110611e9357611e93615984565b602002602001015110155b15611eac5750600092915050565b80611eb68161599a565b915050611e45565b50600192915050565b611ecf6140c2565b60168054911515600160a81b0260ff60a81b19909216919091179055565b3360009081526006602052604081206002015460ff1615611f435760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e481c995d99585b195960821b604482015260640161189b565b33600090815260066020526040902060028101805460ff1916600117905554611f6b83612286565b14611fc45760405162461bcd60e51b815260206004820152602360248201527f52657665616c6564206861736820646f6573206e6f74206d6174636820636f6d6044820152621b5a5d60ea1b606482015260840161189b565b336000908152600660205260409020600101546001600160401b034316116120435760405162461bcd60e51b815260206004820152602c60248201527f52657665616c20616e6420636f6d6d69742068617070656e6564206f6e20746860448201526b652073616d6520626c6f636b60a01b606482015260840161189b565b600554336000908152600660205260409020600101546120639190615971565b436001600160401b031611156120af5760405162461bcd60e51b815260206004820152601160248201527052657665616c656420746f6f206c61746560781b604482015260640161189b565b5033600090815260066020908152604091829020600101548251904081830152808301939093528151808403830181526060909301909152815191012090565b6120f76140c2565b6018805462ff00001916620100009215159283021790556016805461ffff60a01b1916600160a01b830260ff60a81b191617600160a81b83021761ffff60b01b1916600160b01b830260ff60b81b191617600160b81b83021760ff60c01b1916600160c01b909202919091179055565b6001600160a01b038516331480612183575061218385336116da565b61219f5760405162461bcd60e51b815260040161189b90615aba565b6121ac8585858585614485565b5050505050565b6121bb6140c2565b600f55600e55565b6121cb6140c2565b60168054911515600160b01b0260ff60b01b19909216919091179055565b6000600c54600d546121fb9190615b08565b905090565b6122086140c2565b60188054911515600160301b0266ff00000000000019909216919091179055565b6122316140c2565b604051600090339047908381818185875af1925050503d8060008114612273576040519150601f19603f3d011682016040523d82523d6000602084013e612278565b606091505b505090508061193b57600080fd5b6040516bffffffffffffffffffffffff193060601b166020820152603481018290526000906054015b604051602081830303815290604052805190602001209050919050565b6122d46140c2565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b6122fe6140c2565b61230661462f565b565b3233146123575760405162461bcd60e51b815260206004820152601d60248201527f4d7573742066726f6d207265616c2077616c6c65742061646472657373000000604482015260640161189b565b80516001036123be57601654600160a01b900460ff166123b95760405162461bcd60e51b815260206004820152601b60248201527f4275726e2031207473756b69206973206e6f74206f70656e6564210000000000604482015260640161189b565b612582565b805160020361242057601654600160a01b900460ff166123b95760405162461bcd60e51b815260206004820152601b60248201527f4275726e2032207473756b69206973206e6f74206f70656e6564210000000000604482015260640161189b565b805160030361248257601654600160a01b900460ff166123b95760405162461bcd60e51b815260206004820152601b60248201527f4275726e2033207473756b69206973206e6f74206f70656e6564210000000000604482015260640161189b565b80516004036124e457601654600160a01b900460ff166123b95760405162461bcd60e51b815260206004820152601b60248201527f4275726e2034207473756b69206973206e6f74206f70656e6564210000000000604482015260640161189b565b805160050361254657601654600160a01b900460ff166123b95760405162461bcd60e51b815260206004820152601b60248201527f4275726e2035207473756b69206973206e6f74206f70656e6564210000000000604482015260640161189b565b60405162461bcd60e51b81526020600482015260116024820152704275726e205175616e742077726f6e672160781b604482015260640161189b565b60005b815181101561272a5760155482516000916001600160a01b031690636352211e908590859081106125b8576125b8615984565b60200260200101516040518263ffffffff1660e01b81526004016125de91815260200190565b602060405180830381865afa1580156125fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061261f9190615b1b565b9050336001600160a01b038216146126735760405162461bcd60e51b815260206004820152601760248201527622b93937b91d102737ba1022a9219b99189037bbb732b960491b604482015260640161189b565b60155460165484516001600160a01b03928316926323b872dd9233929116908790879081106126a4576126a4615984565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b1580156126fe57600080fd5b505af1158015612712573d6000803e3d6000fd5b505050505080806127229061599a565b915050612585565b5050565b6127366140c2565b601b91909155601c55565b601854600090819062010000900460ff1661279e5760405162461bcd60e51b815260206004820152601960248201527f4672656520436c61696d206973206e6f74206f70656e65642100000000000000604482015260640161189b565b3233146127ed5760405162461bcd60e51b815260206004820152601d60248201527f434f4e5452414354535f4e4f545f414c4c4f5745445f544f5f4d494e54000000604482015260640161189b565b600084815260226020526040902054156128495760405162461bcd60e51b815260206004820152601c60248201527f5473756b6920616c726561647920636c61696d6564206d6f6d6f6d2100000000604482015260640161189b565b61285284613b53565b6001600160a01b0316336001600160a01b0316146128ac5760405162461bcd60e51b815260206004820152601760248201527622b93937b91d102737ba1022a9219b99189037bbb732b960491b604482015260640161189b565b60008481526022602052604081208054600192906128cb908490615971565b90915550600090506128dc84613e2c565b90506128e7816138bb565b9150612905338360016040518060200160405280600081525061436b565b509392505050565b6129156140c2565b601055565b6000805b8251811015611ebe5782818151811061293957612939615984565b60200260200101516101f41180612977575060135461295a906101f4615971565b83828151811061296c5761296c615984565b602002602001015110155b156129855750600092915050565b8061298f8161599a565b91505061291e565b6060600084516005036129ac57506001612a3c565b8451600a036129bd57506002612a3c565b8451600f036129ce57506003612a3c565b60405162461bcd60e51b815260206004820152603760248201527f596f75206e65656420352c203130206f72203135204d6f6d6f6d7320746f206760448201527f657420312c2032206f722033206d6f726520726172652e000000000000000000606482015260840161189b565b83600303612ab1578451600514612ab15760405162461bcd60e51b815260206004820152603360248201527f596f752063616e206f6e6c79206275726e20352045706963204d6f6d6f6d73206044820152723a379033b2ba1018902632b3b2b73230b93c9760691b606482015260840161189b565b6000816001600160401b03811115612acb57612acb6150a6565b604051908082528060200260200182016040528015612af4578160200160208202803683370190505b50905084600003612c4d576018546301000000900460ff16612b285760405162461bcd60e51b815260040161189b90615b38565b612b3186613593565b612b8f5760405162461bcd60e51b815260206004820152602960248201527f596f75206e656564203520436f6d6d6f6e7320746f20726563656976652061206044820152682ab731b7b6b6b7b69760b91b606482015260840161189b565b60005b8651811015612bc357612bb133888381518110611b3857611b38615984565b80612bbb8161599a565b915050612b92565b506000612bcf85613e2c565b905060005b83811015612c46576000612bf4838315611d78576110d184612710615aae565b9050612bff81611e25565b848381518110612c1157612c11615984565b602002602001018181525050612c3333858481518110611dbe57611dbe615984565b5080612c3e8161599a565b915050612bd4565b505061303c565b84600103612d9a57601854640100000000900460ff16612c7f5760405162461bcd60e51b815260040161189b90615b38565b612c8886611e41565b612ce35760405162461bcd60e51b815260206004820152602660248201527f596f75206e656564203520556e636f6d6d6f6d20746f20726563656976652061604482015265102930b9329760d11b606482015260840161189b565b60005b8651811015612d1757612d0533888381518110611b3857611b38615984565b80612d0f8161599a565b915050612ce6565b506000612d2385613e2c565b905060005b83811015612c46576000612d48838315611d78576110d184612710615aae565b9050612d53816139b7565b848381518110612d6557612d65615984565b602002602001018181525050612d8733858481518110611dbe57611dbe615984565b5080612d928161599a565b915050612d28565b84600203612ee257601854600160281b900460ff16612dcb5760405162461bcd60e51b815260040161189b90615b38565b612dd486613454565b612e2b5760405162461bcd60e51b815260206004820152602260248201527f596f75206e6565642035205261726520746f2072656365697665206120457069604482015261319760f11b606482015260840161189b565b60005b8651811015612e5f57612e4d33888381518110611b3857611b38615984565b80612e578161599a565b915050612e2e565b506000612e6b85613e2c565b905060005b83811015612c46576000612e90838315611d78576110d184612710615aae565b9050612e9b8161360e565b848381518110612ead57612ead615984565b602002602001018181525050612ecf33858481518110611dbe57611dbe615984565b5080612eda8161599a565b915050612e70565b84600303612fff57601854600160301b900460ff16612f135760405162461bcd60e51b815260040161189b90615b38565b612f1c8661291a565b612f785760405162461bcd60e51b815260206004820152602760248201527f596f75206e6565642035204570696320746f20726563656976652061204c656760448201526632b73230b93c9760c91b606482015260840161189b565b60005b8651811015612fac57612f9a33888381518110611b3857611b38615984565b80612fa48161599a565b915050612f7b565b506000612fb885613e2c565b9050612fc381611a2d565b82600081518110612fd657612fd6615984565b602002602001018181525050612ff93383600081518110611dbe57611dbe615984565b5061303c565b60405162461bcd60e51b815260206004820152601260248201527157726f6e6720726172697479206275726e2160701b604482015260640161189b565b95945050505050565b6015546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561308e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121fb9190615b6f565b6130ba6140c2565b6018805460ff1916911515919091179055565b606081518351146131325760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b606482015260840161189b565b600083516001600160401b0381111561314d5761314d6150a6565b604051908082528060200260200182016040528015613176578160200160208202803683370190505b50905060005b8451811015612905576131c185828151811061319a5761319a615984565b60200260200101518583815181106131b4576131b4615984565b6020026020010151611834565b8282815181106131d3576131d3615984565b60209081029190910101526131e78161599a565b905061317c565b60006131f8613a57565b613200613269565b6132086121e9565b61321061324a565b61321c90612710615b08565b6132269190615b08565b6132309190615b08565b6121fb9190615b08565b6132426140c2565b600b55600a55565b6000600e54600f546121fb9190615b08565b6132646140c2565b601155565b6000600a54600b546121fb9190615b08565b60606000613287613bc1565b9050600081516001600160401b038111156132a4576132a46150a6565b6040519080825280602002602001820160405280156132cd578160200160208202803683370190505b50905060005b8251811015613321576132f2338483815181106131b4576131b4615984565b82828151811061330457613304615984565b6020908102919091010152806133198161599a565b9150506132d3565b5092915050565b6133306140c2565b600555565b6001600160a01b038316331480613351575061335183336116da565b61336d5760405162461bcd60e51b815260040161189b90615aba565b613378838383614684565b505050565b6133856140c2565b60185460ff166133e25760405162461bcd60e51b815260206004820152602260248201527f4e6f74207468652074696d6520746f2052656e6f756e6365204f776e65727368604482015261069760f41b606482015260840161189b565b6123066000614820565b3360008181526006602090815260409182902084815543600182018190556002909101805460ff19169055825193845290830184905282820152517f19fad381b1712620715f03d76aa899a2fb46b402f67a49a4c13ff09a23a177249181900360600190a150565b6000805b8251811015611ebe5782818151811061347357613473615984565b602002602001015161019011806134b1575060125461349490610190615971565b8382815181106134a6576134a6615984565b602002602001015110155b156134bf5750600092915050565b806134c98161599a565b915050613458565b6134d96140c2565b60005b82811015613532576135208484838181106134f9576134f9615984565b905060200201602081019061350e9190615439565b838381518110611dbe57611dbe615984565b8061352a8161599a565b9150506134dc565b50505050565b6000806135458385615b88565b905061355361271082615947565b949350505050565b6135636140c2565b60188054911515600160281b0265ff000000000019909216919091179055565b61358b6140c2565b612306614872565b6000805b8251811015611ebe578281815181106135b2576135b2615984565b6020026020010151606411806135ee57506010546135d1906064615971565b8382815181106135e3576135e3615984565b602002602001015110155b156135fc5750600092915050565b806136068161599a565b915050613597565b60006013548261361e9190615947565b6118c7906101f4615971565b6136326140c2565b601355565b60008061364661271084615947565b90508060085410801561365b57506009548111155b156136805760145461366d9084615947565b61367990610258615971565b9392505050565b80600a541080156136935750600b548111155b156136b1576013546136a59084615947565b613679906101f4615971565b80600c541080156136c45750600d548111155b156136e2576012546136d69084615947565b61367990610190615971565b80600e541080156136f45750600f5481105b15613712576011546137069084615947565b6136799061012c615971565b60105461371f9084615947565b613679906064615971565b50919050565b606061373a6140c2565b6000613747846001615971565b6001600160401b0381111561375e5761375e6150a6565b604051908082528060200260200182016040528015613787578160200160208202803683370190505b509050600061379584613e2c565b905060005b8581101561380c5760006137ba838315611d78576110d184612710615aae565b90506137c581613637565b6137d282620186a06159b3565b6137dc9190615971565b8483815181106137ee576137ee615984565b602090810291909101015250806138048161599a565b91505061379a565b508082868151811061382057613820615984565b6020908102919091010152509392505050565b61383b6140c2565b601880549115156401000000000264ff0000000019909216919091179055565b601f5460009060ff16801561387757506000613875613045565b115b15613883575060205490565b601654600160c81b900460ff161561389c575060175490565b50660aa87bee53800090565b90565b6138b36140c2565b600955600855565b6000601054826138cb9190615947565b6118c7906064615971565b60008060006138e484613e2c565b90506138ef85612308565b845160010361390857613901816138bb565b9150613990565b845160020361391a5761390181611e25565b845160030361392c57613901816139b7565b845160040361393e576139018161360e565b84516005036139505761390181611a2d565b60405162461bcd60e51b815260206004820152601560248201527457726f6e67207473756b6920717479206275726e2160581b604482015260640161189b565b612905338360016040518060200160405280600081525061436b565b61272a3383836148b5565b6000601254826139c79190615947565b6118c790610190615971565b6139db6140c2565b60168054911515600160c01b0260ff60c01b19909216919091179055565b613a016140c2565b6018805464ffff0000001916630100000092151592830264ff0000000019161764010000000083021766ffff00000000001916600160281b830266ff000000000000191617600160301b92909202919091179055565b60006008546009546121fb9190615b08565b6000816040516020016122af91815260200190565b613a866140c2565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b60155460405163e985e9c560e01b81526001600160a01b0384811660048301528381166024830152600092169063e985e9c590604401602060405180830381865afa158015613afb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136799190615b9c565b601b5460009081908310613b3d57601c54613b3a9082615971565b90505b601d5483106118c757601e546136799082615971565b6015546040516331a9108f60e11b8152600481018390526000916001600160a01b031690636352211e90602401602060405180830381865afa158015613b9d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c79190615b1b565b60606000601454601354601254601154601054613bde9190615971565b613be89190615971565b613bf29190615971565b613bfc9190615971565b6001600160401b03811115613c1357613c136150a6565b604051908082528060200260200182016040528015613c3c578160200160208202803683370190505b5090506000805b601054811015613c9557613c58816064615971565b838381518110613c6a57613c6a615984565b602090810291909101015281613c7f8161599a565b9250508080613c8d9061599a565b915050613c43565b5060005b601154811015613cec57613caf8161012c615971565b838381518110613cc157613cc1615984565b602090810291909101015281613cd68161599a565b9250508080613ce49061599a565b915050613c99565b5060005b601254811015613d4357613d0681610190615971565b838381518110613d1857613d18615984565b602090810291909101015281613d2d8161599a565b9250508080613d3b9061599a565b915050613cf0565b5060005b601354811015613d9a57613d5d816101f4615971565b838381518110613d6f57613d6f615984565b602090810291909101015281613d848161599a565b9250508080613d929061599a565b915050613d47565b5060005b601454811015613df157613db481610258615971565b838381518110613dc657613dc6615984565b602090810291909101015281613ddb8161599a565b9250508080613de99061599a565b915050613d9e565b509092915050565b613e016140c2565b601955565b613e0e6140c2565b60168054911515600160b81b0260ff60b81b19909216919091179055565b60006118c782611eed565b613e3f6140c2565b60168054921515600160c81b0260ff60c81b1990931692909217909155601755565b60218054613e6e906157c9565b80601f0160208091040260200160405190810160405280929190818152602001828054613e9a906157c9565b8015613ee75780601f10613ebc57610100808354040283529160200191613ee7565b820191906000526020600020905b815481529060010190602001808311613eca57829003601f168201915b505050505081565b613ef76140c2565b601f805460ff191692151592909217909155602055565b613f166140c2565b601880549115156101000261ff0019909216919091179055565b613f386140c2565b601d91909155601e55565b613f4b6140c2565b601455565b6001600160a01b038516331480613f6c5750613f6c85336116da565b613f885760405162461bcd60e51b815260040161189b90615aba565b6121ac8585858585614995565b613f9d6140c2565b60188054911515620100000262ff000019909216919091179055565b613fc16140c2565b6001600160a01b0381166140265760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161189b565b61193b81614820565b6001600160a01b03831633148061404b575061404b83336116da565b6140675760405162461bcd60e51b815260040161189b90615aba565b61337883838361424e565b61407a6140c2565b6018805491151563010000000263ff00000019909216919091179055565b6140a06140c2565b60188054911515600160381b0267ff0000000000000019909216919091179055565b6003546001600160a01b031633146123065760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161189b565b600261272a8282615843565b606060028054614137906157c9565b80601f0160208091040260200160405190810160405280929190818152602001828054614163906157c9565b80156141b05780601f10614185576101008083540402835291602001916141b0565b820191906000526020600020905b81548152906001019060200180831161419357829003601f168201915b50505050509050919050565b606060006141c983614acd565b60010190506000816001600160401b038111156141e8576141e86150a6565b6040519080825280601f01601f191660200182016040528015614212576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461421c57509392505050565b6001600160a01b0383166142745760405162461bcd60e51b815260040161189b90615bb9565b33600061428084614ba5565b9050600061428d84614ba5565b90506142ad83876000858560405180602001604052806000815250614bf0565b6000858152602081815260408083206001600160a01b038a168452909152902054848110156142ee5760405162461bcd60e51b815260040161189b90615bfc565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46040805160208101909152600090525b50505050505050565b6001600160a01b0384166143cb5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161189b565b3360006143d785614ba5565b905060006143e485614ba5565b90506143f583600089858589614bf0565b6000868152602081815260408083206001600160a01b038b16845290915281208054879290614425908490615971565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461436283600089898989614c06565b81518351146144a65760405162461bcd60e51b815260040161189b90615c40565b6001600160a01b0384166144cc5760405162461bcd60e51b815260040161189b90615c88565b336144db818787878787614bf0565b60005b84518110156145c15760008582815181106144fb576144fb615984565b60200260200101519050600085838151811061451957614519615984565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156145695760405162461bcd60e51b815260040161189b90615ccd565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906145a6908490615971565b92505081905550505050806145ba9061599a565b90506144de565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051614611929190615d17565b60405180910390a4614627818787878787614d61565b505050505050565b614637614e1c565b6003805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b0383166146aa5760405162461bcd60e51b815260040161189b90615bb9565b80518251146146cb5760405162461bcd60e51b815260040161189b90615c40565b60003390506146ee81856000868660405180602001604052806000815250614bf0565b60005b83518110156147b357600084828151811061470e5761470e615984565b60200260200101519050600084838151811061472c5761472c615984565b602090810291909101810151600084815280835260408082206001600160a01b038c16835290935291909120549091508181101561477c5760405162461bcd60e51b815260040161189b90615bfc565b6000928352602083815260408085206001600160a01b038b16865290915290922091039055806147ab8161599a565b9150506146f1565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051614804929190615d17565b60405180910390a4604080516020810190915260009052613532565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61487a614e6c565b6003805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586146673390565b816001600160a01b0316836001600160a01b0316036149285760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b606482015260840161189b565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0384166149bb5760405162461bcd60e51b815260040161189b90615c88565b3360006149c785614ba5565b905060006149d485614ba5565b90506149e4838989858589614bf0565b6000868152602081815260408083206001600160a01b038c16845290915290205485811015614a255760405162461bcd60e51b815260040161189b90615ccd565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290614a62908490615971565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4614ac2848a8a8a8a8a614c06565b505050505050505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310614b0c5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310614b38576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310614b5657662386f26fc10000830492506010015b6305f5e1008310614b6e576305f5e100830492506008015b6127108310614b8257612710830492506004015b60648310614b94576064830492506002015b600a83106118c75760010192915050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110614bdf57614bdf615984565b602090810291909101015292915050565b614bf8614e6c565b614627868686868686614eb9565b6001600160a01b0384163b156146275760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190614c4a9089908990889088908890600401615d3c565b6020604051808303816000875af1925050508015614c85575060408051601f3d908101601f19168201909252614c8291810190615d81565b60015b614d3157614c91615d9e565b806308c379a003614cca5750614ca5615db9565b80614cb05750614ccc565b8060405162461bcd60e51b815260040161189b9190615221565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606482015260840161189b565b6001600160e01b0319811663f23a6e6160e01b146143625760405162461bcd60e51b815260040161189b90615e42565b6001600160a01b0384163b156146275760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190614da59089908990889088908890600401615e8a565b6020604051808303816000875af1925050508015614de0575060408051601f3d908101601f19168201909252614ddd91810190615d81565b60015b614dec57614c91615d9e565b6001600160e01b0319811663bc197c8160e01b146143625760405162461bcd60e51b815260040161189b90615e42565b600354600160a01b900460ff166123065760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640161189b565b600354600160a01b900460ff16156123065760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161189b565b6001600160a01b038516614f405760005b8351811015614f3e57828181518110614ee557614ee5615984565b602002602001015160046000868481518110614f0357614f03615984565b602002602001015181526020019081526020016000206000828254614f289190615971565b90915550614f3790508161599a565b9050614eca565b505b6001600160a01b0384166146275760005b8351811015614362576000848281518110614f6e57614f6e615984565b602002602001015190506000848381518110614f8c57614f8c615984565b602002602001015190506000600460008481526020019081526020016000205490508181101561500f5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b606482015260840161189b565b6000928352600460205260409092209103905561502b8161599a565b9050614f51565b6001600160a01b038116811461193b57600080fd5b6000806040838503121561505a57600080fd5b823561506581615032565b946020939093013593505050565b6001600160e01b03198116811461193b57600080fd5b60006020828403121561509b57600080fd5b813561367981615073565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b03811182821017156150e1576150e16150a6565b6040525050565b60006001600160401b03831115615101576151016150a6565b604051615118601f8501601f1916602001826150bc565b80915083815284848401111561512d57600080fd5b83836020830137600060208583010152509392505050565b60006020828403121561515757600080fd5b81356001600160401b0381111561516d57600080fd5b8201601f8101841361517e57600080fd5b613553848235602084016150e8565b60006020828403121561519f57600080fd5b5035919050565b801515811461193b57600080fd5b6000602082840312156151c657600080fd5b8135613679816151a6565b60005b838110156151ec5781810151838201526020016151d4565b50506000910152565b6000815180845261520d8160208601602086016151d1565b601f01601f19169290920160200192915050565b60208152600061367960208301846151f5565b6000806040838503121561524757600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b838110156152865781518752958201959082019060010161526a565b509495945050505050565b6020815260006136796020830184615256565b60006001600160401b038211156152bd576152bd6150a6565b5060051b60200190565b600082601f8301126152d857600080fd5b813560206152e5826152a4565b6040516152f282826150bc565b83815260059390931b850182019282810191508684111561531257600080fd5b8286015b8481101561532d5780358352918301918301615316565b509695505050505050565b60006020828403121561534a57600080fd5b81356001600160401b0381111561536057600080fd5b613553848285016152c7565b600082601f83011261537d57600080fd5b613679838335602085016150e8565b600080600080600060a086880312156153a457600080fd5b85356153af81615032565b945060208601356153bf81615032565b935060408601356001600160401b03808211156153db57600080fd5b6153e789838a016152c7565b945060608801359150808211156153fd57600080fd5b61540989838a016152c7565b9350608088013591508082111561541f57600080fd5b5061542c8882890161536c565b9150509295509295909350565b60006020828403121561544b57600080fd5b813561367981615032565b60008060006060848603121561546b57600080fd5b83356001600160401b0381111561548157600080fd5b61548d868287016152c7565b9660208601359650604090950135949350505050565b600080604083850312156154b657600080fd5b82356001600160401b03808211156154cd57600080fd5b818501915085601f8301126154e157600080fd5b813560206154ee826152a4565b6040516154fb82826150bc565b83815260059390931b850182019282810191508984111561551b57600080fd5b948201945b8386101561554257853561553381615032565b82529482019490820190615520565b9650508601359250508082111561555857600080fd5b50615565858286016152c7565b9150509250929050565b60008060006060848603121561558457600080fd5b833561558f81615032565b925060208401356001600160401b03808211156155ab57600080fd5b6155b7878388016152c7565b935060408601359150808211156155cd57600080fd5b506155da868287016152c7565b9150509250925092565b6000806000604084860312156155f957600080fd5b83356001600160401b038082111561561057600080fd5b818601915086601f83011261562457600080fd5b81358181111561563357600080fd5b8760208260051b850101111561564857600080fd5b6020928301955093509085013590808211156155cd57600080fd5b6000806040838503121561567657600080fd5b82356001600160401b0381111561568c57600080fd5b615698858286016152c7565b95602094909401359450505050565b600080604083850312156156ba57600080fd5b82356156c581615032565b915060208301356156d5816151a6565b809150509250929050565b600080604083850312156156f357600080fd5b82356156fe81615032565b915060208301356156d581615032565b6000806040838503121561572157600080fd5b8235615065816151a6565b600080600080600060a0868803121561574457600080fd5b853561574f81615032565b9450602086013561575f81615032565b9350604086013592506060860135915060808601356001600160401b0381111561578857600080fd5b61542c8882890161536c565b6000806000606084860312156157a957600080fd5b83356157b481615032565b95602085013595506040909401359392505050565b600181811c908216806157dd57607f821691505b60208210810361372a57634e487b7160e01b600052602260045260246000fd5b601f82111561337857600081815260208120601f850160051c810160208610156158245750805b601f850160051c820191505b8181101561462757828155600101615830565b81516001600160401b0381111561585c5761585c6150a6565b6158708161586a84546157c9565b846157fd565b602080601f8311600181146158a5576000841561588d5750858301515b600019600386901b1c1916600185901b178555614627565b600085815260208120601f198616915b828110156158d4578886015182559484019460019091019084016158b5565b50858210156158f25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600083516159148184602088016151d1565b8351908301906159288183602088016151d1565b01949350505050565b634e487b7160e01b600052601260045260246000fd5b60008261595657615956615931565b500690565b634e487b7160e01b600052601160045260246000fd5b808201808211156118c7576118c761595b565b634e487b7160e01b600052603260045260246000fd5b6000600182016159ac576159ac61595b565b5060010190565b80820281158282048414176118c7576118c761595b565b600181815b80851115615a055781600019048211156159eb576159eb61595b565b808516156159f857918102915b93841c93908002906159cf565b509250929050565b600082615a1c575060016118c7565b81615a29575060006118c7565b8160018114615a3f5760028114615a4957615a65565b60019150506118c7565b60ff841115615a5a57615a5a61595b565b50506001821b6118c7565b5060208310610133831016604e8410600b8410161715615a88575081810a6118c7565b615a9283836159ca565b8060001904821115615aa657615aa661595b565b029392505050565b60006136798383615a0d565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b818103818111156118c7576118c761595b565b600060208284031215615b2d57600080fd5b815161367981615032565b60208082526017908201527f4275726e204d6f6d6f6d206973206e6f74206f70656e21000000000000000000604082015260600190565b600060208284031215615b8157600080fd5b5051919050565b600082615b9757615b97615931565b500490565b600060208284031215615bae57600080fd5b8151613679816151a6565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b604081526000615d2a6040830185615256565b828103602084015261303c8185615256565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090615d76908301846151f5565b979650505050505050565b600060208284031215615d9357600080fd5b815161367981615073565b600060033d11156138a85760046000803e5060005160e01c90565b600060443d1015615dc75790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715615df657505050505090565b8285019150815181811115615e0e5750505050505090565b843d8701016020828501011115615e285750505050505090565b615e37602082860101876150bc565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a060408201819052600090615eb690830186615256565b8281036060840152615ec88186615256565b90508281036080840152615edc81856151f5565b9897505050505050505056fea2646970667358221220bc880ca4f81a287e32893b5cbb770f6924d6f78bdbea3d59c5f64434745a976b64736f6c63430008120033

Deployed Bytecode Sourcemap

84929:9976:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66094:230;;;;;;;;;;-1:-1:-1;66094:230:0;;;;;:::i;:::-;;:::i;:::-;;;616:25:1;;;604:2;589:18;66094:230:0;;;;;;;;65117:310;;;;;;;;;;-1:-1:-1;65117:310:0;;;;;:::i;:::-;;:::i;:::-;;;1203:14:1;;1196:22;1178:41;;1166:2;1151:18;65117:310:0;1038:187:1;85874:121:0;;;;;;;;;;-1:-1:-1;85874:121:0;;;;;:::i;:::-;;:::i;:::-;;39758:79;;;;;;;;;;-1:-1:-1;39758:79:0;;;;;:::i;:::-;;:::i;31079:36::-;;;;;;;;;;-1:-1:-1;31079:36:0;;;;;;;;36866:32;;;;;;;;;;;;;;;;39433:28;;;;;;;;;;;;;;;;34071:34;;;;;;;;;;-1:-1:-1;34071:34:0;;;;-1:-1:-1;;;34071:34:0;;;;;;34481:95;;;;;;;;;;-1:-1:-1;34481:95:0;;;;;:::i;:::-;;:::i;94165:374::-;;;;;;;;;;-1:-1:-1;94165:374:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;45069:112::-;;;;;;;;;;-1:-1:-1;45069:112:0;;;;;:::i;:::-;;:::i;85132:45::-;;;;;;;;;;;;85175:2;85132:45;;92766:516;;;;;;;;;;;;;:::i;40308:126::-;;;;;;;;;;-1:-1:-1;40308:126:0;;;;;:::i;:::-;;:::i;86997:822::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;32321:109::-;;;;;;;;;;-1:-1:-1;32321:109:0;;;;;:::i;:::-;;:::i;44731:110::-;;;;;;;;;;-1:-1:-1;44731:110:0;;;;;:::i;:::-;;:::i;40904:312::-;;;;;;;;;;-1:-1:-1;40904:312:0;;;;;:::i;:::-;;:::i;30958:32::-;;;;;;;;;;;;;;;;34584:95;;;;;;;;;;-1:-1:-1;34584:95:0;;;;;:::i;:::-;;:::i;30744:28::-;;;;;;;;;;-1:-1:-1;30744:28:0;;;;-1:-1:-1;;;30744:28:0;;;;;;37518:1130;;;;;;;;;;-1:-1:-1;37518:1130:0;;;;;:::i;:::-;;:::i;39320:32::-;;;;;;;;;;;;;;;;34153:34;;;;;;;;;;-1:-1:-1;34153:34:0;;;;-1:-1:-1;;;34153:34:0;;;;;;85599:267;;;;;;;;;;-1:-1:-1;85599:267:0;;;;;:::i;:::-;;:::i;68037:438::-;;;;;;;;;;-1:-1:-1;68037:438:0;;;;;:::i;:::-;;:::i;33906:74::-;;;;;;;;;;-1:-1:-1;33906:74:0;;;;-1:-1:-1;;;;;33906:74:0;;;;;;-1:-1:-1;;;;;7989:32:1;;;7971:51;;7959:2;7944:18;33906:74:0;7825:203:1;40442:138:0;;;;;;;;;;-1:-1:-1;40442:138:0;;;;;:::i;:::-;;:::i;34687:95::-;;;;;;;;;;-1:-1:-1;34687:95:0;;;;;:::i;:::-;;:::i;36474:94::-;;;;;;;;;;-1:-1:-1;36555:4:0;36474:94;;42892:96;;;;;;;;;;;;;:::i;30368:42::-;;;;;;;;;;;;;;;;32113:105;;;;;;;;;;-1:-1:-1;32113:105:0;;;;;:::i;:::-;;:::i;94547:165::-;;;:::i;38753:127::-;;;;;;;;;;-1:-1:-1;38753:127:0;;;;;:::i;:::-;;:::i;34359:110::-;;;;;;;;;;-1:-1:-1;34359:110:0;;;;;:::i;:::-;;:::i;86072:65::-;;;;;;;;;;;;;:::i;35412:1054::-;;;;;;;;;;-1:-1:-1;35412:1054:0;;;;;:::i;:::-;;:::i;31394:176::-;;;;;;;;;;-1:-1:-1;31394:176:0;;;;;:::i;:::-;;:::i;88143:638::-;;;;;;;;;;-1:-1:-1;88143:638:0;;;;;:::i;:::-;;:::i;39576:83::-;;;;;;;;;;-1:-1:-1;39576:83:0;;;;;:::i;:::-;;:::i;41536:304::-;;;;;;;;;;-1:-1:-1;41536:304:0;;;;;:::i;:::-;;:::i;89613:3145::-;;;;;;;;;;-1:-1:-1;89613:3145:0;;;;;:::i;:::-;;:::i;35274:130::-;;;;;;;;;;;;;:::i;32937:114::-;;;;;;;;;;-1:-1:-1;32937:114:0;;;;;:::i;:::-;;:::i;66490:524::-;;;;;;;;;;-1:-1:-1;66490:524:0;;;;;:::i;:::-;;:::i;82570:122::-;;;;;;;;;;-1:-1:-1;82570:122:0;;;;;:::i;:::-;82627:4;82448:16;;;:12;:16;;;;;;-1:-1:-1;;;82570:122:0;39499:23;;;;;;;;;;;;;;;;43112:144;;;;;;;;;;;;;:::i;38654:93::-;;;;;;;;;;-1:-1:-1;38728:12:0;38654:93;;40174:126;;;;;;;;;;-1:-1:-1;40174:126:0;;;;;:::i;:::-;;:::i;39283:28::-;;;;;;;;;;;;;;;;30871:38;;;;;;;;;;;;;;;;26526:86;;;;;;;;;;-1:-1:-1;26597:7:0;;-1:-1:-1;;;26597:7:0;;;;26526:86;;42996:108;;;;;;;;;;;;;:::i;39665:87::-;;;;;;;;;;-1:-1:-1;39665:87:0;;;;;:::i;:::-;;:::i;42788:96::-;;;;;;;;;;;;;:::i;86171:346::-;;;;;;;;;;;;;:::i;36919:93::-;;;;;;;;;;-1:-1:-1;36919:93:0;;;;;:::i;:::-;;:::i;30518:33::-;;;;;;;;;;-1:-1:-1;30518:33:0;;;;;;;;;;;84485:358;;;;;;;;;;-1:-1:-1;84485:358:0;;;;;:::i;:::-;;:::i;30997:36::-;;;;;;;;;;;;;;;;94720:180;;;;;;;;;;;;;:::i;37154:288::-;;;;;;;;;;-1:-1:-1;37154:288:0;;;;;:::i;:::-;;:::i;41224:304::-;;;;;;;;;;-1:-1:-1;41224:304:0;;;;;:::i;:::-;;:::i;93290:231::-;;;;;;;;;;-1:-1:-1;93290:231:0;;;;;:::i;:::-;;:::i;39134:33::-;;;;;;;;;;;;;;;;85245:59;;;;;;;;;;-1:-1:-1;85245:59:0;;;;;:::i;:::-;;;;;;;;;;;;;;30417:40;;;;;;;;;;-1:-1:-1;30417:40:0;;;;;;;;37105:42;;;;;;;;;;-1:-1:-1;37105:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12021:25:1;;;12077:2;12062:18;;12055:34;;;;12132:14;12125:22;12105:18;;;12098:50;12009:2;11994:18;37105:42:0;11825:329:1;33826:73:0;;;;;;;;;;-1:-1:-1;33826:73:0;;;;-1:-1:-1;;;;;33826:73:0;;;34030:34;;;;;;;;;;-1:-1:-1;34030:34:0;;;;-1:-1:-1;;;34030:34:0;;;;;;39248:28;;;;;;;;;;;;;;;;30779:39;;;;;;;;;;-1:-1:-1;30779:39:0;;;;-1:-1:-1;;;30779:39:0;;;;;;43694:154;;;;;;;;;;-1:-1:-1;43694:154:0;;;;;:::i;:::-;;:::i;30606:41::-;;;;;;;;;;-1:-1:-1;30606:41:0;;;;;;;;;;;32000:105;;;;;;;;;;-1:-1:-1;32000:105:0;;;;;:::i;:::-;;:::i;86003:61::-;;;;;;;;;;;;;:::i;40588:308::-;;;;;;;;;;-1:-1:-1;40588:308:0;;;;;:::i;:::-;;:::i;39359:32::-;;;;;;;;;;;;;;;;30654:37;;;;;;;;;;-1:-1:-1;30654:37:0;;;;-1:-1:-1;;;30654:37:0;;;;;;30484:27;;;;;;;;;;-1:-1:-1;30484:27:0;;;;;;;;;;;44959:102;;;;;;;;;;-1:-1:-1;44959:102:0;;;;;:::i;:::-;;:::i;28743:87::-;;;;;;;;;;-1:-1:-1;28816:6:0;;-1:-1:-1;;;;;28816:6:0;28743:87;;39843:79;;;;;;;;;;-1:-1:-1;39843:79:0;;;;;:::i;:::-;;:::i;43857:752::-;;;;;;;;;;-1:-1:-1;43857:752:0;;;;;:::i;:::-;;:::i;86525:464::-;;;;;;;;;;-1:-1:-1;86525:464:0;;;;;:::i;:::-;;:::i;31879:113::-;;;;;;;;;;-1:-1:-1;31879:113:0;;;;;:::i;:::-;;:::i;93866:291::-;;;;;;;;;;;;;:::i;40025:141::-;;;;;;;;;;-1:-1:-1;40025:141:0;;;;;:::i;:::-;;:::i;44617:106::-;;;;;;;;;;-1:-1:-1;44617:106:0;;;;;:::i;:::-;;:::i;88788:817::-;;;;;;;;;;-1:-1:-1;88788:817:0;;;;;:::i;:::-;;:::i;67087:155::-;;;;;;;;;;-1:-1:-1;67087:155:0;;;;;:::i;:::-;;:::i;30330:31::-;;;;;;;;;;-1:-1:-1;30330:31:0;;;;-1:-1:-1;;;30330:31:0;;;;;;44849:102;;;;;;;;;;-1:-1:-1;44849:102:0;;;;;:::i;:::-;;:::i;34893:95::-;;;;;;;;;;-1:-1:-1;34893:95:0;;;;;:::i;:::-;;:::i;85186:52::-;;;;;;;;;;-1:-1:-1;85186:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;31122:48;;;;;;;;;;;;;;;;85373:218;;;;;;;;;;-1:-1:-1;85373:218:0;;;;;:::i;:::-;;:::i;39400:26::-;;;;;;;;;;;;;;;;30560:39;;;;;;;;;;-1:-1:-1;30560:39:0;;;;;;;;;;;42668:112;;;;;;;;;;;;;:::i;39094:33::-;;;;;;;;;;;;;;;;31040:32;;;;;;;;;;;;;;;;39176:28;;;;;;;;;;;;;;;;82359:113;;;;;;;;;;-1:-1:-1;82359:113:0;;;;;:::i;:::-;82421:7;82448:16;;;:12;:16;;;;;;;82359:113;43322:134;;;;;;;;;;-1:-1:-1;43322:134:0;;;;;:::i;:::-;;:::i;34235:108::-;;;;;;;;;;-1:-1:-1;34235:108:0;;;;;:::i;:::-;;:::i;39529:28::-;;;;;;;;;;;;;;;;36576:175;;;;;;;;;;-1:-1:-1;36576:175:0;;;;;:::i;:::-;;:::i;87827:308::-;;;;;;;;;;-1:-1:-1;87827:308:0;;;;;:::i;:::-;;:::i;35124:142::-;;;;;;;;;;-1:-1:-1;35124:142:0;;;;;:::i;:::-;;:::i;41848:812::-;;;;;;;;;;;;;:::i;32638:128::-;;;;;;;;;;-1:-1:-1;32638:128:0;;;;;:::i;:::-;;:::i;34112:34::-;;;;;;;;;;-1:-1:-1;34112:34:0;;;;-1:-1:-1;;;34112:34:0;;;;;;34790:95;;;;;;;;;;-1:-1:-1;34790:95:0;;;;;:::i;:::-;;:::i;43464:221::-;;;;;;;;;;-1:-1:-1;43464:221:0;;;;;:::i;:::-;;:::i;32774:155::-;;;;;;;;;;-1:-1:-1;32774:155:0;;;;;:::i;:::-;;:::i;31177:26::-;;;;;;;;;;;;;:::i;30825:39::-;;;;;;;;;;;;;;;;85069:56;;;;;;;;;;;;85114:11;85069:56;;31231:155;;;;;;;;;;-1:-1:-1;31231:155:0;;;;;:::i;:::-;;:::i;32545:85::-;;;;;;;;;;-1:-1:-1;32545:85:0;;;;;:::i;:::-;;:::i;33989:34::-;;;;;;;;;;-1:-1:-1;33989:34:0;;;;-1:-1:-1;;;33989:34:0;;;;;;30698:37;;;;;;;;;;-1:-1:-1;30698:37:0;;;;-1:-1:-1;;;30698:37:0;;;;;;30916:35;;;;;;;;;;;;;;;;67314:168;;;;;;;;;;-1:-1:-1;67314:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;67437:27:0;;;67413:4;67437:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;67314:168;31578:176;;;;;;;;;;-1:-1:-1;31578:176:0;;;;;:::i;:::-;;:::i;39468:24::-;;;;;;;;;;;;;;;;39211:28;;;;;;;;;;;;;;;;39928:89;;;;;;;;;;-1:-1:-1;39928:89:0;;;;;:::i;:::-;;:::i;67554:406::-;;;;;;;;;;-1:-1:-1;67554:406:0;;;;;:::i;:::-;;:::i;32438:97::-;;;;;;;;;;-1:-1:-1;32438:97:0;;;;;:::i;:::-;;:::i;29649:201::-;;;;;;;;;;-1:-1:-1;29649:201:0;;;;;:::i;:::-;;:::i;84151:326::-;;;;;;;;;;-1:-1:-1;84151:326:0;;;;;:::i;:::-;;:::i;31762:109::-;;;;;;;;;;-1:-1:-1;31762:109:0;;;;;:::i;:::-;;:::i;32226:87::-;;;;;;;;;;-1:-1:-1;32226:87:0;;;;;:::i;:::-;;:::i;66094:230::-;66180:7;-1:-1:-1;;;;;66208:21:0;;66200:76;;;;-1:-1:-1;;;66200:76:0;;15003:2:1;66200:76:0;;;14985:21:1;15042:2;15022:18;;;15015:30;15081:34;15061:18;;;15054:62;-1:-1:-1;;;15132:18:1;;;15125:40;15182:19;;66200:76:0;;;;;;;;;-1:-1:-1;66294:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;66294:22:0;;;;;;;;;;66094:230;;;;;:::o;65117:310::-;65219:4;-1:-1:-1;;;;;;65256:41:0;;-1:-1:-1;;;65256:41:0;;:110;;-1:-1:-1;;;;;;;65314:52:0;;-1:-1:-1;;;65314:52:0;65256:110;:163;;;-1:-1:-1;;;;;;;;;;56507:40:0;;;65383:36;56398:157;85874:121;28629:13;:11;:13::i;:::-;85940:12:::1;:21;85955:6:::0;85940:12;:21:::1;:::i;:::-;;85972:15;85980:6;85972:7;:15::i;:::-;85874:121:::0;:::o;39758:79::-;28629:13;:11;:13::i;:::-;39816:7:::1;:13:::0;39758:79::o;34481:95::-;28629:13;:11;:13::i;:::-;34545:14:::1;:23:::0;;;::::1;;-1:-1:-1::0;;;34545:23:0::1;-1:-1:-1::0;;;;34545:23:0;;::::1;::::0;;;::::1;::::0;;34481:95::o;94165:374::-;82627:4;82448:16;;;:12;:16;;;;;;94273:13;;94304:73;;;;-1:-1:-1;;;94304:73:0;;18003:2:1;94304:73:0;;;17985:21:1;18042:2;18022:18;;;18015:30;18081:33;18061:18;;;18054:61;18132:18;;94304:73:0;17801:355:1;94304:73:0;94435:1;94411:13;94421:2;94411:9;:13::i;:::-;94405:27;:31;:126;;;;;;;;;;;;;;;;;94476:13;94486:2;94476:9;:13::i;:::-;94491:20;94508:2;94491:16;:20::i;:::-;94459:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;94398:133;94165:374;-1:-1:-1;;94165:374:0:o;45069:112::-;45125:4;45156:12;;45149:6;:19;;;;:::i;:::-;45148:25;;45170:3;45148:25;:::i;92766:516::-;92821:19;;-1:-1:-1;;;92821:19:0;;;;92813:61;;;;-1:-1:-1;;;92813:61:0;;19375:2:1;92813:61:0;;;19357:21:1;19414:2;19394:18;;;19387:30;19453:31;19433:18;;;19426:59;19502:18;;92813:61:0;19173:353:1;92813:61:0;92915:20;;92893:19;;:42;92885:99;;;;-1:-1:-1;;;92885:99:0;;19733:2:1;92885:99:0;;;19715:21:1;19772:2;19752:18;;;19745:30;19811:34;19791:18;;;19784:62;-1:-1:-1;;;19862:18:1;;;19855:42;19914:19;;92885:99:0;19531:408:1;92885:99:0;92995:20;93018:14;:12;:14::i;:::-;92995:37;;93048:9;93043:100;93067:6;:13;93063:1;:17;93043:100;;;93102:29;93108:10;93119:6;93126:1;93119:9;;;;;;;;:::i;:::-;;;;;;;93129:1;93102:5;:29::i;:::-;93082:3;;;;:::i;:::-;;;;93043:100;;;;93212:29;93218:10;93230:3;93235:1;93212:29;;;;;;;;;;;;:5;:29::i;:::-;93253:19;:21;;;:19;:21;;;:::i;:::-;;;;;;92802:480;92766:516::o;40308:126::-;28629:13;:11;:13::i;:::-;40381:9:::1;:17:::0;40409:9:::1;:17:::0;40308:126::o;86997:822::-;87140:8;;87100:13;;-1:-1:-1;;;87140:8:0;;;;87132:39;;;;-1:-1:-1;;;87132:39:0;;20418:2:1;87132:39:0;;;20400:21:1;20457:2;20437:18;;;20430:30;-1:-1:-1;;;20476:18:1;;;20469:49;20535:18;;87132:39:0;20216:343:1;87132:39:0;87190:9;87203:10;87190:23;87182:64;;;;-1:-1:-1;;;87182:64:0;;20766:2:1;87182:64:0;;;20748:21:1;20805:2;20785:18;;;20778:30;20844:31;20824:18;;;20817:59;20893:18;;87182:64:0;20564:353:1;87182:64:0;85175:2;87265:8;:26;;87257:62;;;;-1:-1:-1;;;87257:62:0;;21124:2:1;87257:62:0;;;21106:21:1;21163:2;21143:18;;;21136:30;21202:26;21182:18;;;21175:54;21246:18;;87257:62:0;20922:348:1;87257:62:0;87362:10;:8;:10::i;:::-;87351:21;;:8;:21;:::i;:::-;87338:9;:34;;87330:60;;;;-1:-1:-1;;;87330:60:0;;21650:2:1;87330:60:0;;;21632:21:1;21689:2;21669:18;;;21662:30;-1:-1:-1;;;21708:18:1;;;21701:43;21761:18;;87330:60:0;21448:337:1;87330:60:0;87401:15;87419:16;87426:8;87419:6;:16::i;:::-;87401:34;;87446:17;87466:19;87476:8;87466:9;:19::i;:::-;87446:39;-1:-1:-1;87496:19:0;87529:21;87446:39;87529:8;:21;:::i;:::-;-1:-1:-1;;;;;87518:33:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;87518:33:0;;87496:55;;87567:6;87562:227;87584:22;87594:12;87584:8;:22;:::i;:::-;87579:1;:28;87562:227;;;87629:11;87643:45;87654:10;87668:4;;87667:19;;87677:8;87684:1;87677:5;:8;:::i;87667:19::-;87674:1;87643:10;:45::i;:::-;87629:59;;87714:15;87722:6;87714:7;:15::i;:::-;87703:5;87709:1;87703:8;;;;;;;;:::i;:::-;;;;;;:26;;;;;87743:34;87749:10;87761:5;87767:1;87761:8;;;;;;;;:::i;:::-;;;;;;;87771:1;87743:34;;;;;;;;;;;;:5;:34::i;:::-;-1:-1:-1;87609:3:0;;;;:::i;:::-;;;;87562:227;;;-1:-1:-1;87806:5:0;86997:822;-1:-1:-1;;;;;86997:822:0:o;32321:109::-;28629:13;:11;:13::i;:::-;32394:19:::1;:28:::0;;;::::1;;-1:-1:-1::0;;;32394:28:0::1;-1:-1:-1::0;;32394:28:0;;::::1;::::0;;;::::1;::::0;;32321:109::o;44731:110::-;44786:4;44817:11;;44810:6;:18;;;;:::i;:::-;44809:24;;44830:3;44809:24;:::i;40904:312::-;40983:4;;41000:187;41024:13;:20;41020:1;:24;41000:187;;;41073:13;41087:1;41073:16;;;;;;;;:::i;:::-;;;;;;;41069:3;:20;:59;;;-1:-1:-1;41116:11:0;;41112:15;;:3;:15;:::i;:::-;41093:13;41107:1;41093:16;;;;;;;;:::i;:::-;;;;;;;:35;;41069:59;41066:110;;;-1:-1:-1;41155:5:0;;40904:312;-1:-1:-1;;40904:312:0:o;41066:110::-;41046:3;;;;:::i;:::-;;;;41000:187;;;-1:-1:-1;41204:4:0;;40904:312;-1:-1:-1;;40904:312:0:o;34584:95::-;28629:13;:11;:13::i;:::-;34648:14:::1;:23:::0;;;::::1;;-1:-1:-1::0;;;34648:23:0::1;-1:-1:-1::0;;;;34648:23:0;;::::1;::::0;;;::::1;::::0;;34584:95::o;37518:1130::-;37675:10;37578:4;37667:19;;;:7;:19;;;;;:28;;;;;:35;37659:63;;;;-1:-1:-1;;;37659:63:0;;23366:2:1;37659:63:0;;;23348:21:1;23405:2;23385:18;;;23378:30;-1:-1:-1;;;23424:18:1;;;23417:46;23480:18;;37659:63:0;23164:340:1;37659:63:0;37737:10;37729:19;;;;:7;:19;;;;;:28;;;:33;;-1:-1:-1;;37729:33:0;37758:4;37729:33;;;37854:26;37833:19;37841:10;37833:7;:19::i;:::-;:47;37825:94;;;;-1:-1:-1;;;37825:94:0;;23711:2:1;37825:94:0;;;23693:21:1;23750:2;23730:18;;;23723:30;23789:34;23769:18;;;23762:62;-1:-1:-1;;;23840:18:1;;;23833:33;23883:19;;37825:94:0;23509:399:1;37825:94:0;38035:10;38027:19;;;;:7;:19;;;;;:25;;;-1:-1:-1;;;;;38013:12:0;38006:46;;37998:102;;;;-1:-1:-1;;;37998:102:0;;24115:2:1;37998:102:0;;;24097:21:1;24154:2;24134:18;;;24127:30;24193:34;24173:18;;;24166:62;-1:-1:-1;;;24244:18:1;;;24237:42;24296:19;;37998:102:0;23913:408:1;37998:102:0;38219:14;;38201:10;38193:19;;;;:7;:19;;;;;:25;;;:40;;38219:14;38193:40;:::i;:::-;38178:12;-1:-1:-1;;;;;38171:62:0;;;38163:91;;;;-1:-1:-1;;;38163:91:0;;24528:2:1;38163:91:0;;;24510:21:1;24567:2;24547:18;;;24540:30;-1:-1:-1;;;24586:18:1;;;24579:47;24643:18;;38163:91:0;24326:341:1;38163:91:0;-1:-1:-1;38367:10:0;38329:17;38359:19;;;:7;:19;;;;;;;;;:25;;;38526:38;;38349:36;;38526:38;;;24829:19:1;24864:12;;;24857:28;;;;38526:38:0;;;;;;;;;24901:12:1;;;;38526:38:0;;;38516:49;;;;;;37518:1130::o;85599:267::-;28629:13;:11;:13::i;:::-;85666::::1;:22:::0;;-1:-1:-1;;85666:22:0::1;::::0;;::::1;;::::0;;::::1;;::::0;;85699:14:::1;:23:::0;;-1:-1:-1;;;;85733:23:0;-1:-1:-1;;;85699:23:0;::::1;-1:-1:-1::0;;;;85733:23:0;;-1:-1:-1;;;85733:23:0;::::1;;-1:-1:-1::0;;;;85801:23:0;-1:-1:-1;;;85767:23:0;::::1;-1:-1:-1::0;;;;85801:23:0;;-1:-1:-1;;;85801:23:0;::::1;;-1:-1:-1::0;;;;85835:23:0::1;-1:-1:-1::0;;;85835:23:0;;::::1;::::0;;;::::1;::::0;;85599:267::o;68037:438::-;-1:-1:-1;;;;;68270:20:0;;24719:10;68270:20;;:60;;-1:-1:-1;68294:36:0;68311:4;24719:10;67314:168;:::i;68294:36::-;68248:156;;;;-1:-1:-1;;;68248:156:0;;;;;;;:::i;:::-;68415:52;68438:4;68444:2;68448:3;68453:7;68462:4;68415:22;:52::i;:::-;68037:438;;;;;:::o;40442:138::-;28629:13;:11;:13::i;:::-;40519::::1;:21:::0;40551:13:::1;:21:::0;40442:138::o;34687:95::-;28629:13;:11;:13::i;:::-;34751:14:::1;:23:::0;;;::::1;;-1:-1:-1::0;;;34751:23:0::1;-1:-1:-1::0;;;;34751:23:0;;::::1;::::0;;;::::1;::::0;;34687:95::o;42892:96::-;42933:4;42970:9;;42958;;:21;;;;:::i;:::-;42950:30;;42892:96;:::o;32113:105::-;28629:13;:11;:13::i;:::-;32184:17:::1;:26:::0;;;::::1;;-1:-1:-1::0;;;32184:26:0::1;-1:-1:-1::0;;32184:26:0;;::::1;::::0;;;::::1;::::0;;32113:105::o;94547:165::-;28629:13;:11;:13::i;:::-;94622:58:::1;::::0;94604:12:::1;::::0;94630:10:::1;::::0;94654:21:::1;::::0;94604:12;94622:58;94604:12;94622:58;94654:21;94630:10;94622:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;94603:77;;;94699:7;94691:16;;;::::0;::::1;38753:127:::0;38836:37;;-1:-1:-1;;38861:4:0;25859:2:1;25855:15;25851:53;38836:37:0;;;25839:66:1;25921:12;;;25914:28;;;38804:7:0;;25958:12:1;;38836:37:0;;;;;;;;;;;;;38826:48;;;;;;38819:55;;38753:127;;;:::o;34359:110::-;28629:13;:11;:13::i;:::-;34434:16:::1;:27:::0;;-1:-1:-1;;;;;;34434:27:0::1;-1:-1:-1::0;;;;;34434:27:0;;;::::1;::::0;;;::::1;::::0;;34359:110::o;86072:65::-;28629:13;:11;:13::i;:::-;86119:10:::1;:8;:10::i;:::-;86072:65::o:0;35412:1054::-;35039:9;35052:10;35039:23;35031:65;;;;-1:-1:-1;;;35031:65:0;;26183:2:1;35031:65:0;;;26165:21:1;26222:2;26202:18;;;26195:30;26261:31;26241:18;;;26234:59;26310:18;;35031:65:0;25981:353:1;35031:65:0;35513:13:::1;:20;35535:1;35513:23:::0;35510:620:::1;;35560:14;::::0;-1:-1:-1;;;35560:14:0;::::1;;;35552:53;;;::::0;-1:-1:-1;;;35552:53:0;;26541:2:1;35552:53:0::1;::::0;::::1;26523:21:1::0;26580:2;26560:18;;;26553:30;26619:29;26599:18;;;26592:57;26666:18;;35552:53:0::1;26339:351:1::0;35552:53:0::1;35510:620;;;35625:13;:20;35647:1;35625:23:::0;35622:508:::1;;35672:14;::::0;-1:-1:-1;;;35672:14:0;::::1;;;35664:53;;;::::0;-1:-1:-1;;;35664:53:0;;26897:2:1;35664:53:0::1;::::0;::::1;26879:21:1::0;26936:2;26916:18;;;26909:30;26975:29;26955:18;;;26948:57;27022:18;;35664:53:0::1;26695:351:1::0;35622:508:0::1;35737:13;:20;35759:1;35737:23:::0;35734:396:::1;;35784:14;::::0;-1:-1:-1;;;35784:14:0;::::1;;;35776:53;;;::::0;-1:-1:-1;;;35776:53:0;;27253:2:1;35776:53:0::1;::::0;::::1;27235:21:1::0;27292:2;27272:18;;;27265:30;27331:29;27311:18;;;27304:57;27378:18;;35776:53:0::1;27051:351:1::0;35734:396:0::1;35849:13;:20;35871:1;35849:23:::0;35846:284:::1;;35896:14;::::0;-1:-1:-1;;;35896:14:0;::::1;;;35888:53;;;::::0;-1:-1:-1;;;35888:53:0;;27609:2:1;35888:53:0::1;::::0;::::1;27591:21:1::0;27648:2;27628:18;;;27621:30;27687:29;27667:18;;;27660:57;27734:18;;35888:53:0::1;27407:351:1::0;35846:284:0::1;35961:13;:20;35983:1;35961:23:::0;35958:172:::1;;36008:14;::::0;-1:-1:-1;;;36008:14:0;::::1;;;36000:53;;;::::0;-1:-1:-1;;;36000:53:0;;27965:2:1;36000:53:0::1;::::0;::::1;27947:21:1::0;28004:2;27984:18;;;27977:30;28043:29;28023:18;;;28016:57;28090:18;;36000:53:0::1;27763:351:1::0;35958:172:0::1;36084:34;::::0;-1:-1:-1;;;36084:34:0;;28321:2:1;36084:34:0::1;::::0;::::1;28303:21:1::0;28360:2;28340:18;;;28333:30;-1:-1:-1;;;28379:18:1;;;28372:47;28436:18;;36084:34:0::1;28119:341:1::0;36084:34:0::1;36155:6;36150:309;36171:13;:20;36167:1;:24;36150:309;;;36237:15;::::0;36262:16;;36213:13:::1;::::0;-1:-1:-1;;;;;36237:15:0::1;::::0;36229:32:::1;::::0;36262:13;;36276:1;;36262:16;::::1;;;;;:::i;:::-;;;;;;;36229:50;;;;;;;;;;;;;616:25:1::0;;604:2;589:18;;470:177;36229:50:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36213:66:::0;-1:-1:-1;36302:10:0::1;-1:-1:-1::0;;;;;36302:19:0;::::1;;36294:55;;;::::0;-1:-1:-1;;;36294:55:0;;28923:2:1;36294:55:0::1;::::0;::::1;28905:21:1::0;28962:2;28942:18;;;28935:30;-1:-1:-1;;;28981:18:1;;;28974:53;29044:18;;36294:55:0::1;28721:347:1::0;36294:55:0::1;36372:15;::::0;36413:16:::1;::::0;36430;;-1:-1:-1;;;;;36372:15:0;;::::1;::::0;36364:37:::1;::::0;36402:10:::1;::::0;36413:16;::::1;::::0;36430:13;;36444:1;;36430:16;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;36364:83:::1;::::0;-1:-1:-1;;;;;;36364:83:0::1;::::0;;;;;;-1:-1:-1;;;;;29331:15:1;;;36364:83:0::1;::::0;::::1;29313:34:1::0;29383:15;;;;29363:18;;;29356:43;29415:18;;;29408:34;29248:18;;36364:83:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;36198:261;36193:3;;;;;:::i;:::-;;;;36150:309;;;;35412:1054:::0;:::o;31394:176::-;28629:13;:11;:13::i;:::-;31489:16:::1;:34:::0;;;;31534:13:::1;:28:::0;31394:176::o;88143:638::-;88290:13;;88239:4;;;;88290:13;;;;;88282:50;;;;-1:-1:-1;;;88282:50:0;;29655:2:1;88282:50:0;;;29637:21:1;29694:2;29674:18;;;29667:30;29733:27;29713:18;;;29706:55;29778:18;;88282:50:0;29453:349:1;88282:50:0;88351:9;88364:10;88351:23;88343:64;;;;-1:-1:-1;;;88343:64:0;;20766:2:1;88343:64:0;;;20748:21:1;20805:2;20785:18;;;20778:30;20844:31;20824:18;;;20817:59;20893:18;;88343:64:0;20564:353:1;88343:64:0;88426:31;;;;:17;:31;;;;;;:34;88418:74;;;;-1:-1:-1;;;88418:74:0;;30009:2:1;88418:74:0;;;29991:21:1;30048:2;30028:18;;;30021:30;30087;30067:18;;;30060:58;30135:18;;88418:74:0;29807:352:1;88418:74:0;88525:22;88534:12;88525:8;:22::i;:::-;-1:-1:-1;;;;;88511:36:0;:10;-1:-1:-1;;;;;88511:36:0;;88503:72;;;;-1:-1:-1;;;88503:72:0;;28923:2:1;88503:72:0;;;28905:21:1;28962:2;28942:18;;;28935:30;-1:-1:-1;;;28981:18:1;;;28974:53;29044:18;;88503:72:0;28721:347:1;88503:72:0;88588:31;;;;:17;:31;;;;;:36;;88623:1;;88588:31;:36;;88623:1;;88588:36;:::i;:::-;;;;-1:-1:-1;88637:15:0;;-1:-1:-1;88655:16:0;88662:8;88655:6;:16::i;:::-;88637:34;;88689:21;88699:10;88689:9;:21::i;:::-;88682:28;;88721:30;88727:10;88739:4;88745:1;88721:30;;;;;;;;;;;;:5;:30::i;:::-;-1:-1:-1;88769:4:0;88143:638;-1:-1:-1;;;88143:638:0:o;39576:83::-;28629:13;:11;:13::i;:::-;39636:9:::1;:15:::0;39576:83::o;41536:304::-;41611:4;;41628:183;41652:13;:20;41648:1;:24;41628:183;;;41701:13;41715:1;41701:16;;;;;;;;:::i;:::-;;;;;;;41697:3;:20;:55;;;-1:-1:-1;41744:7:0;;41740:11;;:3;:11;:::i;:::-;41721:13;41735:1;41721:16;;;;;;;;:::i;:::-;;;;;;;:31;;41697:55;41694:106;;;-1:-1:-1;41779:5:0;;41536:304;-1:-1:-1;;41536:304:0:o;41694:106::-;41674:3;;;;:::i;:::-;;;;41628:183;;89613:3145;89743:13;89774:12;89804:13;:20;89828:1;89804:25;89801:317;;-1:-1:-1;89855:1:0;89801:317;;;89876:13;:20;89900:2;89876:26;89873:245;;-1:-1:-1;89928:1:0;89873:245;;;89949:13;:20;89973:2;89949:26;89946:172;;-1:-1:-1;90001:1:0;89946:172;;;90033:73;;-1:-1:-1;;;90033:73:0;;30366:2:1;90033:73:0;;;30348:21:1;30405:2;30385:18;;;30378:30;30444:34;30424:18;;;30417:62;30515:25;30495:18;;;30488:53;30558:19;;90033:73:0;30164:419:1;90033:73:0;90131:6;90139:1;90131:9;90128:129;;90164:13;:20;90188:1;90164:25;90156:89;;;;-1:-1:-1;;;90156:89:0;;30790:2:1;90156:89:0;;;30772:21:1;30829:2;30809:18;;;30802:30;30868:34;30848:18;;;30841:62;-1:-1:-1;;;30919:18:1;;;30912:49;30978:19;;90156:89:0;30588:415:1;90156:89:0;90267:19;90300:7;-1:-1:-1;;;;;90289:19:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;90289:19:0;;90267:41;;90322:6;90330:1;90322:9;90319:2409;;90355:19;;;;;;;90347:55;;;;-1:-1:-1;;;90347:55:0;;;;;;;:::i;:::-;90425:29;90440:13;90425:14;:29::i;:::-;90417:83;;;;-1:-1:-1;;;90417:83:0;;31562:2:1;90417:83:0;;;31544:21:1;31601:2;31581:18;;;31574:30;31640:34;31620:18;;;31613:62;-1:-1:-1;;;31691:18:1;;;31684:39;31740:19;;90417:83:0;31360:405:1;90417:83:0;90520:9;90515:122;90539:13;:20;90535:1;:24;90515:122;;;90585:36;90591:10;90602:13;90616:1;90602:16;;;;;;;;:::i;90585:36::-;90561:3;;;;:::i;:::-;;;;90515:122;;;;90651:15;90669:16;90676:8;90669:6;:16::i;:::-;90651:34;;90705:6;90700:231;90721:7;90717:1;:11;90700:231;;;90754:11;90768:45;90779:10;90793:4;;90792:19;;90802:8;90809:1;90802:5;:8;:::i;90768:45::-;90754:59;;90843:19;90855:6;90843:11;:19::i;:::-;90832:5;90838:1;90832:8;;;;;;;;:::i;:::-;;;;;;:30;;;;;90881:34;90887:10;90899:5;90905:1;90899:8;;;;;;;;:::i;90881:34::-;-1:-1:-1;90730:3:0;;;;:::i;:::-;;;;90700:231;;;;90332:610;90319:2409;;;90950:6;90958:1;90950:9;90947:1781;;90983:21;;;;;;;90975:57;;;;-1:-1:-1;;;90975:57:0;;;;;;;:::i;:::-;91055:31;91072:13;91055:16;:31::i;:::-;91047:82;;;;-1:-1:-1;;;91047:82:0;;31972:2:1;91047:82:0;;;31954:21:1;32011:2;31991:18;;;31984:30;32050:34;32030:18;;;32023:62;-1:-1:-1;;;32101:18:1;;;32094:36;32147:19;;91047:82:0;31770:402:1;91047:82:0;91149:9;91144:122;91168:13;:20;91164:1;:24;91144:122;;;91214:36;91220:10;91231:13;91245:1;91231:16;;;;;;;;:::i;91214:36::-;91190:3;;;;:::i;:::-;;;;91144:122;;;;91280:15;91298:16;91305:8;91298:6;:16::i;:::-;91280:34;;91334:6;91329:227;91350:7;91346:1;:11;91329:227;;;91383:11;91397:45;91408:10;91422:4;;91421:19;;91431:8;91438:1;91431:5;:8;:::i;91397:45::-;91383:59;;91472:15;91480:6;91472:7;:15::i;:::-;91461:5;91467:1;91461:8;;;;;;;;:::i;:::-;;;;;;:26;;;;;91506:34;91512:10;91524:5;91530:1;91524:8;;;;;;;;:::i;91506:34::-;-1:-1:-1;91359:3:0;;;;:::i;:::-;;;;91329:227;;90947:1781;91575:6;91583:1;91575:9;91572:1156;;91608:17;;-1:-1:-1;;;91608:17:0;;;;91600:53;;;;-1:-1:-1;;;91600:53:0;;;;;;;:::i;:::-;91676:27;91689:13;91676:12;:27::i;:::-;91668:74;;;;-1:-1:-1;;;91668:74:0;;32379:2:1;91668:74:0;;;32361:21:1;32418:2;32398:18;;;32391:30;32457:34;32437:18;;;32430:62;-1:-1:-1;;;32508:18:1;;;32501:32;32550:19;;91668:74:0;32177:398:1;91668:74:0;91762:9;91757:122;91781:13;:20;91777:1;:24;91757:122;;;91827:36;91833:10;91844:13;91858:1;91844:16;;;;;;;;:::i;91827:36::-;91803:3;;;;:::i;:::-;;;;91757:122;;;;91894:15;91912:16;91919:8;91912:6;:16::i;:::-;91894:34;;91949:6;91944:227;91965:7;91961:1;:11;91944:227;;;91998:11;92012:45;92023:10;92037:4;;92036:19;;92046:8;92053:1;92046:5;:8;:::i;92012:45::-;91998:59;;92087:15;92095:6;92087:7;:15::i;:::-;92076:5;92082:1;92076:8;;;;;;;;:::i;:::-;;;;;;:26;;;;;92121:34;92127:10;92139:5;92145:1;92139:8;;;;;;;;:::i;92121:34::-;-1:-1:-1;91974:3:0;;;;:::i;:::-;;;;91944:227;;91572:1156;92190:6;92198:1;92190:9;92187:541;;92223:17;;-1:-1:-1;;;92223:17:0;;;;92215:53;;;;-1:-1:-1;;;92215:53:0;;;;;;;:::i;:::-;92291:27;92304:13;92291:12;:27::i;:::-;92283:79;;;;-1:-1:-1;;;92283:79:0;;32782:2:1;92283:79:0;;;32764:21:1;32821:2;32801:18;;;32794:30;32860:34;32840:18;;;32833:62;-1:-1:-1;;;32911:18:1;;;32904:37;32958:19;;92283:79:0;32580:403:1;92283:79:0;92382:9;92377:122;92401:13;:20;92397:1;:24;92377:122;;;92447:36;92453:10;92464:13;92478:1;92464:16;;;;;;;;:::i;92447:36::-;92423:3;;;;:::i;:::-;;;;92377:122;;;;92514:15;92532:16;92539:8;92532:6;:16::i;:::-;92514:34;;92575:24;92588:10;92575:12;:24::i;:::-;92564:5;92570:1;92564:8;;;;;;;;:::i;:::-;;;;;;:35;;;;;92614:34;92620:10;92632:5;92638:1;92632:8;;;;;;;;:::i;92614:34::-;92200:460;92187:541;;;92680:36;;-1:-1:-1;;;92680:36:0;;33190:2:1;92680:36:0;;;33172:21:1;33229:2;33209:18;;;33202:30;-1:-1:-1;;;33248:18:1;;;33241:48;33306:18;;92680:36:0;32988:342:1;92680:36:0;92745:5;89613:3145;-1:-1:-1;;;;;89613:3145:0:o;35274:130::-;35358:15;;35350:46;;-1:-1:-1;;;35350:46:0;;35385:10;35350:46;;;7971:51:1;35323:7:0;;-1:-1:-1;;;;;35358:15:0;;35350:34;;7944:18:1;;35350:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32937:114::-;28629:13;:11;:13::i;:::-;33014:20:::1;:29:::0;;-1:-1:-1;;33014:29:0::1;::::0;::::1;;::::0;;;::::1;::::0;;32937:114::o;66490:524::-;66646:16;66707:3;:10;66688:8;:15;:29;66680:83;;;;-1:-1:-1;;;66680:83:0;;33726:2:1;66680:83:0;;;33708:21:1;33765:2;33745:18;;;33738:30;33804:34;33784:18;;;33777:62;-1:-1:-1;;;33855:18:1;;;33848:39;33904:19;;66680:83:0;33524:405:1;66680:83:0;66776:30;66823:8;:15;-1:-1:-1;;;;;66809:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66809:30:0;;66776:63;;66857:9;66852:122;66876:8;:15;66872:1;:19;66852:122;;;66932:30;66942:8;66951:1;66942:11;;;;;;;;:::i;:::-;;;;;;;66955:3;66959:1;66955:6;;;;;;;;:::i;:::-;;;;;;;66932:9;:30::i;:::-;66913:13;66927:1;66913:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;66893:3;;;:::i;:::-;;;66852:122;;43112:144;43155:4;43231:16;:14;:16::i;:::-;43218:10;:8;:10::i;:::-;43205;:8;:10::i;:::-;43188:14;:12;:14::i;:::-;43180:22;;:5;:22;:::i;:::-;:35;;;;:::i;:::-;:48;;;;:::i;:::-;:67;;;;:::i;40174:126::-;28629:13;:11;:13::i;:::-;40247:9:::1;:17:::0;40275:9:::1;:17:::0;40174:126::o;42996:108::-;43041:4;43082:13;;43066;;:29;;;;:::i;39665:87::-;28629:13;:11;:13::i;:::-;39727:11:::1;:17:::0;39665:87::o;42788:96::-;42829:4;42866:9;;42854;;:21;;;;:::i;86171:346::-;86227:13;86253:20;86276:14;:12;:14::i;:::-;86253:37;;86301:25;86340:6;:13;-1:-1:-1;;;;;86329:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;86329:25:0;;86301:53;;86370:6;86365:116;86386:6;:13;86382:1;:17;86365:116;;;86438:31;86448:10;86459:6;86466:1;86459:9;;;;;;;;:::i;86438:31::-;86421:11;86433:1;86421:14;;;;;;;;:::i;:::-;;;;;;;;;;:48;86401:3;;;;:::i;:::-;;;;86365:116;;;-1:-1:-1;86498:11:0;86171:346;-1:-1:-1;;86171:346:0:o;36919:93::-;28629:13;:11;:13::i;:::-;36984:14:::1;:20:::0;36919:93::o;84485:358::-;-1:-1:-1;;;;;84650:23:0;;24719:10;84650:23;;:66;;-1:-1:-1;84677:39:0;84694:7;24719:10;67314:168;:::i;84677:39::-;84628:162;;;;-1:-1:-1;;;84628:162:0;;;;;;;:::i;:::-;84803:32;84814:7;84823:3;84828:6;84803:10;:32::i;:::-;84485:358;;;:::o;94720:180::-;28629:13;:11;:13::i;:::-;94793:20:::1;::::0;::::1;;94785:66;;;::::0;-1:-1:-1;;;94785:66:0;;34136:2:1;94785:66:0::1;::::0;::::1;34118:21:1::0;34175:2;34155:18;;;34148:30;34214:34;34194:18;;;34187:62;-1:-1:-1;;;34265:18:1;;;34258:32;34307:19;;94785:66:0::1;33934:398:1::0;94785:66:0::1;94862:30;94889:1;94862:18;:30::i;37154:288::-:0;37221:10;37213:19;;;;:7;:19;;;;;;;;;:37;;;37293:12;37257:25;;;:49;;;37313:28;;;;:36;;-1:-1:-1;;37313:36:0;;;37361:75;;34539:51:1;;;34606:18;;;34599:34;;;34649:18;;;34642:34;37361:75:0;;;;;;34527:2:1;37361:75:0;;;37154:288;:::o;41224:304::-;41299:4;;41316:183;41340:13;:20;41336:1;:24;41316:183;;;41389:13;41403:1;41389:16;;;;;;;;:::i;:::-;;;;;;;41385:3;:20;:55;;;-1:-1:-1;41432:7:0;;41428:11;;:3;:11;:::i;:::-;41409:13;41423:1;41409:16;;;;;;;;:::i;:::-;;;;;;;:31;;41385:55;41382:106;;;-1:-1:-1;41467:5:0;;41224:304;-1:-1:-1;;41224:304:0:o;41382:106::-;41362:3;;;;:::i;:::-;;;;41316:183;;93290:231;28629:13;:11;:13::i;:::-;93401:9:::1;93396:118;93416:20:::0;;::::1;93396:118;;;93458:44;93464:9;;93474:1;93464:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;93478:13;93492:1;93478:16;;;;;;;;:::i;93458:44::-;93438:3:::0;::::1;::::0;::::1;:::i;:::-;;;;93396:118;;;;93290:231:::0;;;:::o;43694:154::-;43765:4;;43793:17;43801:9;43793:7;:17;:::i;:::-;43782:28;-1:-1:-1;43829:11:0;43835:5;43782:28;43829:11;:::i;:::-;43821:19;43694:154;-1:-1:-1;;;;43694:154:0:o;32000:105::-;28629:13;:11;:13::i;:::-;32071:17:::1;:26:::0;;;::::1;;-1:-1:-1::0;;;32071:26:0::1;-1:-1:-1::0;;32071:26:0;;::::1;::::0;;;::::1;::::0;;32000:105::o;86003:61::-;28629:13;:11;:13::i;:::-;86048:8:::1;:6;:8::i;40588:308::-:0;40665:4;;40682:185;40706:13;:20;40702:1;:24;40682:185;;;40755:13;40769:1;40755:16;;;;;;;;:::i;:::-;;;;;;;40751:3;:20;:57;;;-1:-1:-1;40798:9:0;;40794:13;;:3;:13;:::i;:::-;40775;40789:1;40775:16;;;;;;;;:::i;:::-;;;;;;;:33;;40751:57;40748:108;;;-1:-1:-1;40835:5:0;;40588:308;-1:-1:-1;;40588:308:0:o;40748:108::-;40728:3;;;;:::i;:::-;;;;40682:185;;44959:102;45010:4;45041:7;;45034:6;:14;;;;:::i;:::-;45033:20;;45050:3;45033:20;:::i;39843:79::-;28629:13;:11;:13::i;:::-;39901:7:::1;:13:::0;39843:79::o;43857:752::-;43908:4;;43938:14;43947:5;43938:6;:14;:::i;:::-;43924:28;;43981:6;43966:14;;:21;:47;;;;;43999:14;;43991:6;:22;;43966:47;43963:639;;;44074:12;;44067:19;;:6;:19;:::i;:::-;44066:25;;44088:3;44066:25;:::i;:::-;44059:32;43857:752;-1:-1:-1;;;43857:752:0:o;43963:639::-;44130:6;44120:9;;:16;:37;;;;;44148:9;;44140:6;:17;;44120:37;44117:485;;;44210:7;;44203:14;;:6;:14;:::i;:::-;44202:20;;44219:3;44202:20;:::i;44117:485::-;44261:6;44251:9;;:16;:37;;;;;44279:9;;44271:6;:17;;44251:37;44248:354;;;44342:7;;44335:14;;:6;:14;:::i;:::-;44334:20;;44351:3;44334:20;:::i;44248:354::-;44397:6;44383:13;;:20;:44;;;;;44414:13;;44407:6;:20;44383:44;44380:222;;;44486:11;;44479:18;;:6;:18;:::i;:::-;44478:24;;44499:3;44478:24;:::i;44380:222::-;44576:9;;44569:16;;:6;:16;:::i;:::-;44568:22;;44587:3;44568:22;:::i;44380:222::-;43913:696;43857:752;;;:::o;86525:464::-;86611:13;28629;:11;:13::i;:::-;86637:19:::1;86670:12;86671:8:::0;86681:1:::1;86670:12;:::i;:::-;-1:-1:-1::0;;;;;86659:24:0::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;86659:24:0::1;;86637:46;;86694:15;86712:16;86719:8;86712:6;:16::i;:::-;86694:34;;86744:6;86739:181;86760:8;86756:1;:12;86739:181;;;86790:11;86804:45;86815:10:::0;86829:4;;86828:19:::1;;86838:8;86845:1:::0;86838:5:::1;:8;:::i;86804:45::-;86790:59;;86891:15;86899:6;86891:7;:15::i;:::-;86876:13;:6:::0;86883::::1;86876:13;:::i;:::-;86875:31;;;;:::i;:::-;86864:5;86870:1;86864:8;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:42;-1:-1:-1;86770:3:0;::::1;::::0;::::1;:::i;:::-;;;;86739:181;;;;86948:10;86930:5;86936:8;86930:15;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:28;-1:-1:-1;86976:5:0;86525:464;-1:-1:-1;;;86525:464:0:o;31879:113::-;28629:13;:11;:13::i;:::-;31954:21:::1;:30:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;31954:30:0;;::::1;::::0;;;::::1;::::0;;31879:113::o;93866:291::-;93930:16;;93907:7;;93930:16;;:40;;;;;93969:1;93950:18;:16;:18::i;:::-;:20;93930:40;93927:96;;;-1:-1:-1;93993:18:0;;;93866:291::o;93927:96::-;94036:11;;-1:-1:-1;;;94036:11:0;;;;94033:117;;;-1:-1:-1;94070:12:0;;;93866:291::o;94033:117::-;-1:-1:-1;85114:11:0;;93866:291::o;94033:117::-;93866:291;:::o;40025:141::-;28629:13;:11;:13::i;:::-;40103:14:::1;:22:::0;40136:14:::1;:22:::0;40025:141::o;44617:106::-;44670:4;44701:9;;44694:6;:16;;;;:::i;:::-;44693:22;;44712:3;44693:22;:::i;88788:817::-;88901:4;88924:9;88944:15;88962:16;88969:8;88962:6;:16::i;:::-;88944:34;;88989:17;88992:13;88989:2;:17::i;:::-;89020:13;:20;89044:1;89020:25;89017:517;;89069:21;89079:10;89069:9;:21::i;:::-;89062:28;;89017:517;;;89110:13;:20;89134:1;89110:25;89107:427;;89159:23;89171:10;89159:11;:23::i;89107:427::-;89202:13;:20;89226:1;89202:25;89199:335;;89251:19;89259:10;89251:7;:19::i;89199:335::-;89290:13;:20;89314:1;89290:25;89287:247;;89340:19;89348:10;89340:7;:19::i;89287:247::-;89379:13;:20;89403:1;89379:25;89376:158;;89428:24;89441:10;89428:12;:24::i;89376:158::-;89483:39;;-1:-1:-1;;;89483:39:0;;35014:2:1;89483:39:0;;;34996:21:1;35053:2;35033:18;;;35026:30;-1:-1:-1;;;35072:18:1;;;35065:51;35133:18;;89483:39:0;34812:345:1;89483:39:0;89545:30;89551:10;89563:4;89569:1;89545:30;;;;;;;;;;;;:5;:30::i;67087:155::-;67182:52;24719:10;67215:8;67225;67182:18;:52::i;44849:102::-;44900:4;44931:7;;44924:6;:14;;;;:::i;:::-;44923:20;;44940:3;44923:20;:::i;34893:95::-;28629:13;:11;:13::i;:::-;34957:14:::1;:23:::0;;;::::1;;-1:-1:-1::0;;;34957:23:0::1;-1:-1:-1::0;;;;34957:23:0;;::::1;::::0;;;::::1;::::0;;34893:95::o;85373:218::-;28629:13;:11;:13::i;:::-;85440:19:::1;:28:::0;;-1:-1:-1;;85479:30:0;85440:28;;::::1;;::::0;;::::1;-1:-1:-1::0;;85479:30:0;;;;::::1;;-1:-1:-1::0;;85557:26:0;-1:-1:-1;;;85520:26:0;::::1;-1:-1:-1::0;;85557:26:0;;-1:-1:-1;;;85557:26:0;;;::::1;::::0;;;::::1;::::0;;85373:218::o;42668:112::-;42715:4;42757:14;;42740;;:31;;;;:::i;43322:134::-;43383:7;43437:9;43420:27;;;;;;35291:19:1;;35335:2;35326:12;;35162:182;34235:108:0;28629:13;:11;:13::i;:::-;34309:15:::1;:26:::0;;-1:-1:-1;;;;;;34309:26:0::1;-1:-1:-1::0;;;;;34309:26:0;;;::::1;::::0;;;::::1;::::0;;34235:108::o;36576:175::-;36693:15;;36685:58;;-1:-1:-1;;;36685:58:0;;-1:-1:-1;;;;;35579:15:1;;;36685:58:0;;;35561:34:1;35631:15;;;35611:18;;;35604:43;36662:4:0;;36693:15;;36685:41;;35496:18:1;;36685:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;87827:308::-;87940:16;;87885:4;;;;87930:26;;87927:84;;87986:13;;87980:19;;:5;:19;:::i;:::-;87972:27;;87927:84;88034:16;;88024:8;:26;88021:84;;88080:13;;88074:19;;:5;:19;:::i;35124:142::-;35220:15;;35212:46;;-1:-1:-1;;;35212:46:0;;;;;616:25:1;;;35185:7:0;;-1:-1:-1;;;;;35220:15:0;;35212:32;;589:18:1;;35212:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;41848:812::-;41893:13;41919:20;41999:12;;41989:7;;41979;;41965:11;;41953:9;;:23;;;;:::i;:::-;:33;;;;:::i;:::-;:43;;;;:::i;:::-;:58;;;;:::i;:::-;-1:-1:-1;;;;;41942:70:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41942:70:0;;41919:93;;42023:11;42054:9;42049:107;42073:9;;42069:1;:13;42049:107;;;42118:5;42122:1;42118:3;:5;:::i;:::-;42104:6;42111:3;42104:11;;;;;;;;:::i;:::-;;;;;;;;;;:19;42138:5;;;;:::i;:::-;;;;42084:3;;;;;:::i;:::-;;;;42049:107;;;;42172:9;42167:109;42191:11;;42187:1;:15;42167:109;;;42238:5;42242:1;42238:3;:5;:::i;:::-;42224:6;42231:3;42224:11;;;;;;;;:::i;:::-;;;;;;;;;;:19;42258:5;;;;:::i;:::-;;;;42204:3;;;;;:::i;:::-;;;;42167:109;;;;42292:9;42287:105;42311:7;;42307:1;:11;42287:105;;;42354:5;42358:1;42354:3;:5;:::i;:::-;42340:6;42347:3;42340:11;;;;;;;;:::i;:::-;;;;;;;;;;:19;42374:5;;;;:::i;:::-;;;;42320:3;;;;;:::i;:::-;;;;42287:105;;;;42408:9;42403:105;42427:7;;42423:1;:11;42403:105;;;42470:5;42474:1;42470:3;:5;:::i;:::-;42456:6;42463:3;42456:11;;;;;;;;:::i;:::-;;;;;;;;;;:19;42490:5;;;;:::i;:::-;;;;42436:3;;;;;:::i;:::-;;;;42403:105;;;;42524:9;42519:110;42543:12;;42539:1;:16;42519:110;;;42591:5;42595:1;42591:3;:5;:::i;:::-;42577:6;42584:3;42577:11;;;;;;;;:::i;:::-;;;;;;;;;;:19;42611:5;;;;:::i;:::-;;;;42557:3;;;;;:::i;:::-;;;;42519:110;;;-1:-1:-1;42646:6:0;;41848:812;-1:-1:-1;;41848:812:0:o;32638:128::-;28629:13;:11;:13::i;:::-;32723:20:::1;:35:::0;32638:128::o;34790:95::-;28629:13;:11;:13::i;:::-;34854:14:::1;:23:::0;;;::::1;;-1:-1:-1::0;;;34854:23:0::1;-1:-1:-1::0;;;;34854:23:0;;::::1;::::0;;;::::1;::::0;;34790:95::o;43464:221::-;43514:4;43538:24;43553:8;43538:14;:24::i;32774:155::-;28629:13;:11;:13::i;:::-;32863:11:::1;:27:::0;;;::::1;;-1:-1:-1::0;;;32863:27:0::1;-1:-1:-1::0;;;;32863:27:0;;::::1;::::0;;;::::1;::::0;;;32901:12:::1;:20:::0;32774:155::o;31177:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31231:155::-;28629:13;:11;:13::i;:::-;31316:16:::1;:25:::0;;-1:-1:-1;;31316:25:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;31352:18:::1;:26:::0;31231:155::o;32545:85::-;28629:13;:11;:13::i;:::-;32606:7:::1;:16:::0;;;::::1;;;;-1:-1:-1::0;;32606:16:0;;::::1;::::0;;;::::1;::::0;;32545:85::o;31578:176::-;28629:13;:11;:13::i;:::-;31673:16:::1;:34:::0;;;;31718:13:::1;:28:::0;31578:176::o;39928:89::-;28629:13;:11;:13::i;:::-;39991:12:::1;:18:::0;39928:89::o;67554:406::-;-1:-1:-1;;;;;67762:20:0;;24719:10;67762:20;;:60;;-1:-1:-1;67786:36:0;67803:4;24719:10;67314:168;:::i;67786:36::-;67740:156;;;;-1:-1:-1;;;67740:156:0;;;;;;;:::i;:::-;67907:45;67925:4;67931:2;67935;67939:6;67947:4;67907:17;:45::i;32438:97::-;28629:13;:11;:13::i;:::-;32505::::1;:22:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;32505:22:0;;::::1;::::0;;;::::1;::::0;;32438:97::o;29649:201::-;28629:13;:11;:13::i;:::-;-1:-1:-1;;;;;29738:22:0;::::1;29730:73;;;::::0;-1:-1:-1;;;29730:73:0;;36110:2:1;29730:73:0::1;::::0;::::1;36092:21:1::0;36149:2;36129:18;;;36122:30;36188:34;36168:18;;;36161:62;-1:-1:-1;;;36239:18:1;;;36232:36;36285:19;;29730:73:0::1;35908:402:1::0;29730:73:0::1;29814:28;29833:8;29814:18;:28::i;84151:326::-:0;-1:-1:-1;;;;;84291:23:0;;24719:10;84291:23;;:66;;-1:-1:-1;84318:39:0;84335:7;24719:10;67314:168;:::i;84318:39::-;84269:162;;;;-1:-1:-1;;;84269:162:0;;;;;;;:::i;:::-;84444:25;84450:7;84459:2;84463:5;84444;:25::i;31762:109::-;28629:13;:11;:13::i;:::-;31835:19:::1;:28:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;31835:28:0;;::::1;::::0;;;::::1;::::0;;31762:109::o;32226:87::-;28629:13;:11;:13::i;:::-;32288:8:::1;:17:::0;;;::::1;;-1:-1:-1::0;;;32288:17:0::1;-1:-1:-1::0;;32288:17:0;;::::1;::::0;;;::::1;::::0;;32226:87::o;28908:132::-;28816:6;;-1:-1:-1;;;;;28816:6:0;24719:10;28972:23;28964:68;;;;-1:-1:-1;;;28964:68:0;;36517:2:1;28964:68:0;;;36499:21:1;;;36536:18;;;36529:30;36595:34;36575:18;;;36568:62;36647:18;;28964:68:0;36315:356:1;72261:88:0;72328:4;:13;72335:6;72328:4;:13;:::i;65838:105::-;65898:13;65931:4;65924:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65838:105;;;:::o;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;74978:808::-;-1:-1:-1;;;;;75105:18:0;;75097:66;;;;-1:-1:-1;;;75097:66:0;;;;;;;:::i;:::-;24719:10;75176:16;75241:21;75259:2;75241:17;:21::i;:::-;75218:44;;75273:24;75300:25;75318:6;75300:17;:25::i;:::-;75273:52;;75338:66;75359:8;75369:4;75383:1;75387:3;75392:7;75338:66;;;;;;;;;;;;:20;:66::i;:::-;75417:19;75439:13;;;;;;;;;;;-1:-1:-1;;;;;75439:19:0;;;;;;;;;;75477:21;;;;75469:70;;;;-1:-1:-1;;;75469:70:0;;;;;;;:::i;:::-;75575:9;:13;;;;;;;;;;;-1:-1:-1;;;;;75575:19:0;;;;;;;;;;;;75597:20;;;75575:42;;75646:54;;37659:25:1;;;37700:18;;;37693:34;;;75575:19:0;;75646:54;;;;;;37632:18:1;75646:54:0;;;;;;;75713:65;;;;;;;;;75757:1;75713:65;;;75086:700;;;;74978:808;;;:::o;72735:729::-;-1:-1:-1;;;;;72888:16:0;;72880:62;;;;-1:-1:-1;;;72880:62:0;;37940:2:1;72880:62:0;;;37922:21:1;37979:2;37959:18;;;37952:30;38018:34;37998:18;;;37991:62;-1:-1:-1;;;38069:18:1;;;38062:31;38110:19;;72880:62:0;37738:397:1;72880:62:0;24719:10;72955:16;73020:21;73038:2;73020:17;:21::i;:::-;72997:44;;73052:24;73079:25;73097:6;73079:17;:25::i;:::-;73052:52;;73117:66;73138:8;73156:1;73160:2;73164:3;73169:7;73178:4;73117:20;:66::i;:::-;73196:9;:13;;;;;;;;;;;-1:-1:-1;;;;;73196:17:0;;;;;;;;;:27;;73217:6;;73196:9;:27;;73217:6;;73196:27;:::i;:::-;;;;-1:-1:-1;;73239:52:0;;;37659:25:1;;;37715:2;37700:18;;37693:34;;;-1:-1:-1;;;;;73239:52:0;;;;73272:1;;73239:52;;;;;;37632:18:1;73239:52:0;;;;;;;73382:74;73413:8;73431:1;73435:2;73439;73443:6;73451:4;73382:30;:74::i;70271:1146::-;70498:7;:14;70484:3;:10;:28;70476:81;;;;-1:-1:-1;;;70476:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;70576:16:0;;70568:66;;;;-1:-1:-1;;;70568:66:0;;;;;;;:::i;:::-;24719:10;70691:60;24719:10;70722:4;70728:2;70732:3;70737:7;70746:4;70691:20;:60::i;:::-;70769:9;70764:421;70788:3;:10;70784:1;:14;70764:421;;;70820:10;70833:3;70837:1;70833:6;;;;;;;;:::i;:::-;;;;;;;70820:19;;70854:14;70871:7;70879:1;70871:10;;;;;;;;:::i;:::-;;;;;;;;;;;;70898:19;70920:13;;;;;;;;;;-1:-1:-1;;;;;70920:19:0;;;;;;;;;;;;70871:10;;-1:-1:-1;70962:21:0;;;;70954:76;;;;-1:-1:-1;;;70954:76:0;;;;;;;:::i;:::-;71074:9;:13;;;;;;;;;;;-1:-1:-1;;;;;71074:19:0;;;;;;;;;;71096:20;;;71074:42;;71146:17;;;;;;;:27;;71096:20;;71074:9;71146:27;;71096:20;;71146:27;:::i;:::-;;;;;;;;70805:380;;;70800:3;;;;:::i;:::-;;;70764:421;;;;71232:2;-1:-1:-1;;;;;71202:47:0;71226:4;-1:-1:-1;;;;;71202:47:0;71216:8;-1:-1:-1;;;;;71202:47:0;;71236:3;71241:7;71202:47;;;;;;;:::i;:::-;;;;;;;;71334:75;71370:8;71380:4;71386:2;71390:3;71395:7;71404:4;71334:35;:75::i;:::-;70465:952;70271:1146;;;;;:::o;27381:120::-;26390:16;:14;:16::i;:::-;27440:7:::1;:15:::0;;-1:-1:-1;;;;27440:15:0::1;::::0;;27471:22:::1;24719:10:::0;27480:12:::1;27471:22;::::0;-1:-1:-1;;;;;7989:32:1;;;7971:51;;7959:2;7944:18;27471:22:0::1;;;;;;;27381:120::o:0;76036:969::-;-1:-1:-1;;;;;76188:18:0;;76180:66;;;;-1:-1:-1;;;76180:66:0;;;;;;;:::i;:::-;76279:7;:14;76265:3;:10;:28;76257:81;;;;-1:-1:-1;;;76257:81:0;;;;;;;:::i;:::-;76351:16;24719:10;76351:31;;76395:66;76416:8;76426:4;76440:1;76444:3;76449:7;76395:66;;;;;;;;;;;;:20;:66::i;:::-;76479:9;76474:373;76498:3;:10;76494:1;:14;76474:373;;;76530:10;76543:3;76547:1;76543:6;;;;;;;;:::i;:::-;;;;;;;76530:19;;76564:14;76581:7;76589:1;76581:10;;;;;;;;:::i;:::-;;;;;;;;;;;;76608:19;76630:13;;;;;;;;;;-1:-1:-1;;;;;76630:19:0;;;;;;;;;;;;76581:10;;-1:-1:-1;76672:21:0;;;;76664:70;;;;-1:-1:-1;;;76664:70:0;;;;;;;:::i;:::-;76778:9;:13;;;;;;;;;;;-1:-1:-1;;;;;76778:19:0;;;;;;;;;;76800:20;;76778:42;;76510:3;;;;:::i;:::-;;;;76474:373;;;;76902:1;-1:-1:-1;;;;;76864:55:0;76888:4;-1:-1:-1;;;;;76864:55:0;76878:8;-1:-1:-1;;;;;76864:55:0;;76906:3;76911:7;76864:55;;;;;;;:::i;:::-;;;;;;;;76932:65;;;;;;;;;76976:1;76932:65;;;70271:1146;30010:191;30103:6;;;-1:-1:-1;;;;;30120:17:0;;;-1:-1:-1;;;;;;30120:17:0;;;;;;;30153:40;;30103:6;;;30120:17;30103:6;;30153:40;;30084:16;;30153:40;30073:128;30010:191;:::o;27122:118::-;26131:19;:17;:19::i;:::-;27182:7:::1;:14:::0;;-1:-1:-1;;;;27182:14:0::1;-1:-1:-1::0;;;27182:14:0::1;::::0;;27212:20:::1;27219:12;24719:10:::0;;24639:98;77148:331;77303:8;-1:-1:-1;;;;;77294:17:0;:5;-1:-1:-1;;;;;77294:17:0;;77286:71;;;;-1:-1:-1;;;77286:71:0;;40038:2:1;77286:71:0;;;40020:21:1;40077:2;40057:18;;;40050:30;40116:34;40096:18;;;40089:62;-1:-1:-1;;;40167:18:1;;;40160:39;40216:19;;77286:71:0;39836:405:1;77286:71:0;-1:-1:-1;;;;;77368:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;77368:46:0;;;;;;;;;;77430:41;;1178::1;;;77430::0;;1151:18:1;77430:41:0;;;;;;;77148:331;;;:::o;68939:974::-;-1:-1:-1;;;;;69127:16:0;;69119:66;;;;-1:-1:-1;;;69119:66:0;;;;;;;:::i;:::-;24719:10;69198:16;69263:21;69281:2;69263:17;:21::i;:::-;69240:44;;69295:24;69322:25;69340:6;69322:17;:25::i;:::-;69295:52;;69360:60;69381:8;69391:4;69397:2;69401:3;69406:7;69415:4;69360:20;:60::i;:::-;69433:19;69455:13;;;;;;;;;;;-1:-1:-1;;;;;69455:19:0;;;;;;;;;;69493:21;;;;69485:76;;;;-1:-1:-1;;;69485:76:0;;;;;;;:::i;:::-;69597:9;:13;;;;;;;;;;;-1:-1:-1;;;;;69597:19:0;;;;;;;;;;69619:20;;;69597:42;;69661:17;;;;;;;:27;;69619:20;;69597:9;69661:27;;69619:20;;69661:27;:::i;:::-;;;;-1:-1:-1;;69706:46:0;;;37659:25:1;;;37715:2;37700:18;;37693:34;;;-1:-1:-1;;;;;69706:46:0;;;;;;;;;;;;;;37632:18:1;69706:46:0;;;;;;;69837:68;69868:8;69878:4;69884:2;69888;69892:6;69900:4;69837:30;:68::i;:::-;69108:805;;;;68939: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;81414:198::-;81534:16;;;81548:1;81534:16;;;;;;;;;81480;;81509:22;;81534:16;;;;;;;;;;;;-1:-1:-1;81534:16:0;81509:41;;81572:7;81561:5;81567:1;81561:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;81599:5;81414:198;-1:-1:-1;;81414:198:0:o;93529:314::-;26131:19;:17;:19::i;:::-;93769:66:::1;93796:8;93806:4;93812:2;93816:3;93821:7;93830:4;93769:26;:66::i;79841:744::-:0;-1:-1:-1;;;;;80056:13:0;;46716:19;:23;80052:526;;80092:72;;-1:-1:-1;;;80092:72:0;;-1:-1:-1;;;;;80092:38:0;;;;;:72;;80131:8;;80141:4;;80147:2;;80151:6;;80159:4;;80092:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;80092:72:0;;;;;;;;-1:-1:-1;;80092:72:0;;;;;;;;;;;;:::i;:::-;;;80088:479;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;80440:6;80433:14;;-1:-1:-1;;;80433:14:0;;;;;;;;:::i;80088:479::-;;;80489:62;;-1:-1:-1;;;80489:62:0;;42128:2:1;80489:62:0;;;42110:21:1;42167:2;42147:18;;;42140:30;42206:34;42186:18;;;42179:62;-1:-1:-1;;;42257:18:1;;;42250:50;42317:19;;80489:62:0;41926:416:1;80088:479:0;-1:-1:-1;;;;;;80214:55:0;;-1:-1:-1;;;80214:55:0;80210:154;;80294:50;;-1:-1:-1;;;80294:50:0;;;;;;;:::i;80593:813::-;-1:-1:-1;;;;;80833:13:0;;46716:19;:23;80829:570;;80869:79;;-1:-1:-1;;;80869:79:0;;-1:-1:-1;;;;;80869:43:0;;;;;:79;;80913:8;;80923:4;;80929:3;;80934:7;;80943:4;;80869:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;80869:79:0;;;;;;;;-1:-1:-1;;80869:79:0;;;;;;;;;;;;:::i;:::-;;;80865:523;;;;:::i;:::-;-1:-1:-1;;;;;;81030:60:0;;-1:-1:-1;;;81030:60:0;81026:159;;81115:50;;-1:-1:-1;;;81115:50:0;;;;;;;:::i;26870:108::-;26597:7;;-1:-1:-1;;;26597:7:0;;;;26929:41;;;;-1:-1:-1;;;26929:41:0;;43790:2:1;26929:41:0;;;43772:21:1;43829:2;43809:18;;;43802:30;-1:-1:-1;;;43848:18:1;;;43841:50;43908:18;;26929:41:0;43588:344:1;26685:108:0;26597:7;;-1:-1:-1;;;26597:7:0;;;;26755:9;26747:38;;;;-1:-1:-1;;;26747:38:0;;44139:2:1;26747:38:0;;;44121:21:1;44178:2;44158:18;;;44151:30;-1:-1:-1;;;44197:18:1;;;44190:46;44253:18;;26747:38:0;43937:340:1;82767:931:0;-1:-1:-1;;;;;83089:18:0;;83085:160;;83129:9;83124:110;83148:3;:10;83144:1;:14;83124:110;;;83208:7;83216:1;83208:10;;;;;;;;:::i;:::-;;;;;;;83184:12;:20;83197:3;83201:1;83197:6;;;;;;;;:::i;:::-;;;;;;;83184:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;83160:3:0;;-1:-1:-1;83160:3:0;;:::i;:::-;;;83124:110;;;;83085:160;-1:-1:-1;;;;;83261:16:0;;83257:434;;83299:9;83294:386;83318:3;:10;83314:1;:14;83294:386;;;83354:10;83367:3;83371:1;83367:6;;;;;;;;:::i;:::-;;;;;;;83354:19;;83392:14;83409:7;83417:1;83409:10;;;;;;;;:::i;:::-;;;;;;;83392:27;;83438:14;83455:12;:16;83468:2;83455:16;;;;;;;;;;;;83438:33;;83508:6;83498;:16;;83490:69;;;;-1:-1:-1;;;83490:69:0;;44484:2:1;83490:69:0;;;44466:21:1;44523:2;44503:18;;;44496:30;44562:34;44542:18;;;44535:62;-1:-1:-1;;;44613:18:1;;;44606:38;44661:19;;83490:69:0;44282:404:1;83490:69:0;83611:16;;;;:12;:16;;;;;;83630:15;;83611:34;;83330:3;;;:::i;:::-;;;83294:386;;14:131:1;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:315;218:6;226;279:2;267:9;258:7;254:23;250:32;247:52;;;295:1;292;285:12;247:52;334:9;321:23;353:31;378:5;353:31;:::i;:::-;403:5;455:2;440:18;;;;427:32;;-1:-1:-1;;;150:315:1:o;652:131::-;-1:-1:-1;;;;;;726:32:1;;716:43;;706:71;;773:1;770;763:12;788:245;846:6;899:2;887:9;878:7;874:23;870:32;867:52;;;915:1;912;905:12;867:52;954:9;941:23;973:30;997:5;973:30;:::i;1230:127::-;1291:10;1286:3;1282:20;1279:1;1272:31;1322:4;1319:1;1312:15;1346:4;1343:1;1336:15;1362:249;1472:2;1453:13;;-1:-1:-1;;1449:27:1;1437:40;;-1:-1:-1;;;;;1492:34:1;;1528:22;;;1489:62;1486:88;;;1554:18;;:::i;:::-;1590:2;1583:22;-1:-1:-1;;1362:249:1:o;1616:469::-;1681:5;-1:-1:-1;;;;;1707:6:1;1704:30;1701:56;;;1737:18;;:::i;:::-;1786:2;1780:9;1798:69;1855:2;1834:15;;-1:-1:-1;;1830:29:1;1861:4;1826:40;1780:9;1798:69;:::i;:::-;1885:6;1876:15;;1915:6;1907;1900:22;1955:3;1946:6;1941:3;1937:16;1934:25;1931:45;;;1972:1;1969;1962:12;1931:45;2022:6;2017:3;2010:4;2002:6;1998:17;1985:44;2077:1;2070:4;2061:6;2053;2049:19;2045:30;2038:41;;1616:469;;;;;:::o;2090:451::-;2159:6;2212:2;2200:9;2191:7;2187:23;2183:32;2180:52;;;2228:1;2225;2218:12;2180:52;2268:9;2255:23;-1:-1:-1;;;;;2293:6:1;2290:30;2287:50;;;2333:1;2330;2323:12;2287:50;2356:22;;2409:4;2401:13;;2397:27;-1:-1:-1;2387:55:1;;2438:1;2435;2428:12;2387:55;2461:74;2527:7;2522:2;2509:16;2504:2;2500;2496:11;2461:74;:::i;2546:180::-;2605:6;2658:2;2646:9;2637:7;2633:23;2629:32;2626:52;;;2674:1;2671;2664:12;2626:52;-1:-1:-1;2697:23:1;;2546:180;-1:-1:-1;2546:180:1:o;2731:118::-;2817:5;2810:13;2803:21;2796:5;2793:32;2783:60;;2839:1;2836;2829:12;2854:241;2910:6;2963:2;2951:9;2942:7;2938:23;2934:32;2931:52;;;2979:1;2976;2969:12;2931:52;3018:9;3005:23;3037:28;3059:5;3037:28;:::i;3100:250::-;3185:1;3195:113;3209:6;3206:1;3203:13;3195:113;;;3285:11;;;3279:18;3266:11;;;3259:39;3231:2;3224:10;3195:113;;;-1:-1:-1;;3342:1:1;3324:16;;3317:27;3100:250::o;3355:271::-;3397:3;3435:5;3429:12;3462:6;3457:3;3450:19;3478:76;3547:6;3540:4;3535:3;3531:14;3524:4;3517:5;3513:16;3478:76;:::i;:::-;3608:2;3587:15;-1:-1:-1;;3583:29:1;3574:39;;;;3615:4;3570:50;;3355:271;-1:-1:-1;;3355:271:1:o;3631:220::-;3780:2;3769:9;3762:21;3743:4;3800:45;3841:2;3830:9;3826:18;3818:6;3800:45;:::i;3856:248::-;3924:6;3932;3985:2;3973:9;3964:7;3960:23;3956:32;3953:52;;;4001:1;3998;3991:12;3953:52;-1:-1:-1;;4024:23:1;;;4094:2;4079:18;;;4066:32;;-1:-1:-1;3856:248:1:o;4362:435::-;4415:3;4453:5;4447:12;4480:6;4475:3;4468:19;4506:4;4535:2;4530:3;4526:12;4519:19;;4572:2;4565:5;4561:14;4593:1;4603:169;4617:6;4614:1;4611:13;4603:169;;;4678:13;;4666:26;;4712:12;;;;4747:15;;;;4639:1;4632:9;4603:169;;;-1:-1:-1;4788:3:1;;4362:435;-1:-1:-1;;;;;4362:435:1:o;4802:261::-;4981:2;4970:9;4963:21;4944:4;5001:56;5053:2;5042:9;5038:18;5030:6;5001:56;:::i;5068:183::-;5128:4;-1:-1:-1;;;;;5153:6:1;5150:30;5147:56;;;5183:18;;:::i;:::-;-1:-1:-1;5228:1:1;5224:14;5240:4;5220:25;;5068:183::o;5256:724::-;5310:5;5363:3;5356:4;5348:6;5344:17;5340:27;5330:55;;5381:1;5378;5371:12;5330:55;5417:6;5404:20;5443:4;5466:43;5506:2;5466:43;:::i;:::-;5538:2;5532:9;5550:31;5578:2;5570:6;5550:31;:::i;:::-;5616:18;;;5708:1;5704:10;;;;5692:23;;5688:32;;;5650:15;;;;-1:-1:-1;5732:15:1;;;5729:35;;;5760:1;5757;5750:12;5729:35;5796:2;5788:6;5784:15;5808:142;5824:6;5819:3;5816:15;5808:142;;;5890:17;;5878:30;;5928:12;;;;5841;;5808:142;;;-1:-1:-1;5968:6:1;5256:724;-1:-1:-1;;;;;;5256:724:1:o;5985:348::-;6069:6;6122:2;6110:9;6101:7;6097:23;6093:32;6090:52;;;6138:1;6135;6128:12;6090:52;6178:9;6165:23;-1:-1:-1;;;;;6203:6:1;6200:30;6197:50;;;6243:1;6240;6233:12;6197:50;6266:61;6319:7;6310:6;6299:9;6295:22;6266:61;:::i;6523:221::-;6565:5;6618:3;6611:4;6603:6;6599:17;6595:27;6585:55;;6636:1;6633;6626:12;6585:55;6658:80;6734:3;6725:6;6712:20;6705:4;6697:6;6693:17;6658:80;:::i;6749:1071::-;6903:6;6911;6919;6927;6935;6988:3;6976:9;6967:7;6963:23;6959:33;6956:53;;;7005:1;7002;6995:12;6956:53;7044:9;7031:23;7063:31;7088:5;7063:31;:::i;:::-;7113:5;-1:-1:-1;7170:2:1;7155:18;;7142:32;7183:33;7142:32;7183:33;:::i;:::-;7235:7;-1:-1:-1;7293:2:1;7278:18;;7265:32;-1:-1:-1;;;;;7346:14:1;;;7343:34;;;7373:1;7370;7363:12;7343:34;7396:61;7449:7;7440:6;7429:9;7425:22;7396:61;:::i;:::-;7386:71;;7510:2;7499:9;7495:18;7482:32;7466:48;;7539:2;7529:8;7526:16;7523:36;;;7555:1;7552;7545:12;7523:36;7578:63;7633:7;7622:8;7611:9;7607:24;7578:63;:::i;:::-;7568:73;;7694:3;7683:9;7679:19;7666:33;7650:49;;7724:2;7714:8;7711:16;7708:36;;;7740:1;7737;7730:12;7708:36;;7763:51;7806:7;7795:8;7784:9;7780:24;7763:51;:::i;:::-;7753:61;;;6749:1071;;;;;;;;:::o;8215:247::-;8274:6;8327:2;8315:9;8306:7;8302:23;8298:32;8295:52;;;8343:1;8340;8333:12;8295:52;8382:9;8369:23;8401:31;8426:5;8401:31;:::i;8467:484::-;8569:6;8577;8585;8638:2;8626:9;8617:7;8613:23;8609:32;8606:52;;;8654:1;8651;8644:12;8606:52;8694:9;8681:23;-1:-1:-1;;;;;8719:6:1;8716:30;8713:50;;;8759:1;8756;8749:12;8713:50;8782:61;8835:7;8826:6;8815:9;8811:22;8782:61;:::i;:::-;8772:71;8890:2;8875:18;;8862:32;;-1:-1:-1;8941:2:1;8926:18;;;8913:32;;8467:484;-1:-1:-1;;;;8467:484:1:o;8956:1277::-;9074:6;9082;9135:2;9123:9;9114:7;9110:23;9106:32;9103:52;;;9151:1;9148;9141:12;9103:52;9191:9;9178:23;-1:-1:-1;;;;;9261:2:1;9253:6;9250:14;9247:34;;;9277:1;9274;9267:12;9247:34;9315:6;9304:9;9300:22;9290:32;;9360:7;9353:4;9349:2;9345:13;9341:27;9331:55;;9382:1;9379;9372:12;9331:55;9418:2;9405:16;9440:4;9463:43;9503:2;9463:43;:::i;:::-;9535:2;9529:9;9547:31;9575:2;9567:6;9547:31;:::i;:::-;9613:18;;;9701:1;9697:10;;;;9689:19;;9685:28;;;9647:15;;;;-1:-1:-1;9725:19:1;;;9722:39;;;9757:1;9754;9747:12;9722:39;9781:11;;;;9801:217;9817:6;9812:3;9809:15;9801:217;;;9897:3;9884:17;9914:31;9939:5;9914:31;:::i;:::-;9958:18;;9834:12;;;;9996;;;;9801:217;;;10037:6;-1:-1:-1;;10081:18:1;;10068:32;;-1:-1:-1;;10112:16:1;;;10109:36;;;10141:1;10138;10131:12;10109:36;;10164:63;10219:7;10208:8;10197:9;10193:24;10164:63;:::i;:::-;10154:73;;;8956:1277;;;;;:::o;10238:730::-;10365:6;10373;10381;10434:2;10422:9;10413:7;10409:23;10405:32;10402:52;;;10450:1;10447;10440:12;10402:52;10489:9;10476:23;10508:31;10533:5;10508:31;:::i;:::-;10558:5;-1:-1:-1;10614:2:1;10599:18;;10586:32;-1:-1:-1;;;;;10667:14:1;;;10664:34;;;10694:1;10691;10684:12;10664:34;10717:61;10770:7;10761:6;10750:9;10746:22;10717:61;:::i;:::-;10707:71;;10831:2;10820:9;10816:18;10803:32;10787:48;;10860:2;10850:8;10847:16;10844:36;;;10876:1;10873;10866:12;10844:36;;10899:63;10954:7;10943:8;10932:9;10928:24;10899:63;:::i;:::-;10889:73;;;10238:730;;;;;:::o;10973:847::-;11093:6;11101;11109;11162:2;11150:9;11141:7;11137:23;11133:32;11130:52;;;11178:1;11175;11168:12;11130:52;11218:9;11205:23;-1:-1:-1;;;;;11288:2:1;11280:6;11277:14;11274:34;;;11304:1;11301;11294:12;11274:34;11342:6;11331:9;11327:22;11317:32;;11387:7;11380:4;11376:2;11372:13;11368:27;11358:55;;11409:1;11406;11399:12;11358:55;11449:2;11436:16;11475:2;11467:6;11464:14;11461:34;;;11491:1;11488;11481:12;11461:34;11546:7;11539:4;11529:6;11526:1;11522:14;11518:2;11514:23;11510:34;11507:47;11504:67;;;11567:1;11564;11557:12;11504:67;11598:4;11590:13;;;;-1:-1:-1;11622:6:1;-1:-1:-1;11666:20:1;;;11653:34;;11699:16;;;11696:36;;;11728:1;11725;11718:12;12159:416;12252:6;12260;12313:2;12301:9;12292:7;12288:23;12284:32;12281:52;;;12329:1;12326;12319:12;12281:52;12369:9;12356:23;-1:-1:-1;;;;;12394:6:1;12391:30;12388:50;;;12434:1;12431;12424:12;12388:50;12457:61;12510:7;12501:6;12490:9;12486:22;12457:61;:::i;:::-;12447:71;12565:2;12550:18;;;;12537:32;;-1:-1:-1;;;;12159:416:1:o;12580:382::-;12645:6;12653;12706:2;12694:9;12685:7;12681:23;12677:32;12674:52;;;12722:1;12719;12712:12;12674:52;12761:9;12748:23;12780:31;12805:5;12780:31;:::i;:::-;12830:5;-1:-1:-1;12887:2:1;12872:18;;12859:32;12900:30;12859:32;12900:30;:::i;:::-;12949:7;12939:17;;;12580:382;;;;;:::o;12967:388::-;13035:6;13043;13096:2;13084:9;13075:7;13071:23;13067:32;13064:52;;;13112:1;13109;13102:12;13064:52;13151:9;13138:23;13170:31;13195:5;13170:31;:::i;:::-;13220:5;-1:-1:-1;13277:2:1;13262:18;;13249:32;13290:33;13249:32;13290:33;:::i;13360:309::-;13425:6;13433;13486:2;13474:9;13465:7;13461:23;13457:32;13454:52;;;13502:1;13499;13492:12;13454:52;13541:9;13528:23;13560:28;13582:5;13560:28;:::i;13674:734::-;13778:6;13786;13794;13802;13810;13863:3;13851:9;13842:7;13838:23;13834:33;13831:53;;;13880:1;13877;13870:12;13831:53;13919:9;13906:23;13938:31;13963:5;13938:31;:::i;:::-;13988:5;-1:-1:-1;14045:2:1;14030:18;;14017:32;14058:33;14017:32;14058:33;:::i;:::-;14110:7;-1:-1:-1;14164:2:1;14149:18;;14136:32;;-1:-1:-1;14215:2:1;14200:18;;14187:32;;-1:-1:-1;14270:3:1;14255:19;;14242:33;-1:-1:-1;;;;;14287:30:1;;14284:50;;;14330:1;14327;14320:12;14284:50;14353:49;14394:7;14385:6;14374:9;14370:22;14353:49;:::i;14413:383::-;14490:6;14498;14506;14559:2;14547:9;14538:7;14534:23;14530:32;14527:52;;;14575:1;14572;14565:12;14527:52;14614:9;14601:23;14633:31;14658:5;14633:31;:::i;:::-;14683:5;14735:2;14720:18;;14707:32;;-1:-1:-1;14786:2:1;14771:18;;;14758:32;;14413:383;-1:-1:-1;;;14413:383:1:o;15212:380::-;15291:1;15287:12;;;;15334;;;15355:61;;15409:4;15401:6;15397:17;15387:27;;15355:61;15462:2;15454:6;15451:14;15431:18;15428:38;15425:161;;15508:10;15503:3;15499:20;15496:1;15489:31;15543:4;15540:1;15533:15;15571:4;15568:1;15561:15;15723:545;15825:2;15820:3;15817:11;15814:448;;;15861:1;15886:5;15882:2;15875:17;15931:4;15927:2;15917:19;16001:2;15989:10;15985:19;15982:1;15978:27;15972:4;15968:38;16037:4;16025:10;16022:20;16019:47;;;-1:-1:-1;16060:4:1;16019:47;16115:2;16110:3;16106:12;16103:1;16099:20;16093:4;16089:31;16079:41;;16170:82;16188:2;16181:5;16178:13;16170:82;;;16233:17;;;16214:1;16203:13;16170:82;;16444:1352;16570:3;16564:10;-1:-1:-1;;;;;16589:6:1;16586:30;16583:56;;;16619:18;;:::i;:::-;16648:97;16738:6;16698:38;16730:4;16724:11;16698:38;:::i;:::-;16692:4;16648:97;:::i;:::-;16800:4;;16864:2;16853:14;;16881:1;16876:663;;;;17583:1;17600:6;17597:89;;;-1:-1:-1;17652:19:1;;;17646:26;17597:89;-1:-1:-1;;16401:1:1;16397:11;;;16393:24;16389:29;16379:40;16425:1;16421:11;;;16376:57;17699:81;;16846:944;;16876:663;15670:1;15663:14;;;15707:4;15694:18;;-1:-1:-1;;16912:20:1;;;17030:236;17044:7;17041:1;17038:14;17030:236;;;17133:19;;;17127:26;17112:42;;17225:27;;;;17193:1;17181:14;;;;17060:19;;17030:236;;;17034:3;17294:6;17285:7;17282:19;17279:201;;;17355:19;;;17349:26;-1:-1:-1;;17438:1:1;17434:14;;;17450:3;17430:24;17426:37;17422:42;17407:58;17392:74;;17279:201;-1:-1:-1;;;;;17526:1:1;17510:14;;;17506:22;17493:36;;-1:-1:-1;16444:1352:1:o;18161:496::-;18340:3;18378:6;18372:13;18394:66;18453:6;18448:3;18441:4;18433:6;18429:17;18394:66;:::i;:::-;18523:13;;18482:16;;;;18545:70;18523:13;18482:16;18592:4;18580:17;;18545:70;:::i;:::-;18631:20;;18161:496;-1:-1:-1;;;;18161:496:1:o;18662:127::-;18723:10;18718:3;18714:20;18711:1;18704:31;18754:4;18751:1;18744:15;18778:4;18775:1;18768:15;18794:112;18826:1;18852;18842:35;;18857:18;;:::i;:::-;-1:-1:-1;18891:9:1;;18794:112::o;18911:127::-;18972:10;18967:3;18963:20;18960:1;18953:31;19003:4;19000:1;18993:15;19027:4;19024:1;19017:15;19043:125;19108:9;;;19129:10;;;19126:36;;;19142:18;;:::i;19944:127::-;20005:10;20000:3;19996:20;19993:1;19986:31;20036:4;20033:1;20026:15;20060:4;20057:1;20050:15;20076:135;20115:3;20136:17;;;20133:43;;20156:18;;:::i;:::-;-1:-1:-1;20203:1:1;20192:13;;20076:135::o;21275:168::-;21348:9;;;21379;;21396:15;;;21390:22;;21376:37;21366:71;;21417:18;;:::i;21790:422::-;21879:1;21922:5;21879:1;21936:270;21957:7;21947:8;21944:21;21936:270;;;22016:4;22012:1;22008:6;22004:17;21998:4;21995:27;21992:53;;;22025:18;;:::i;:::-;22075:7;22065:8;22061:22;22058:55;;;22095:16;;;;22058:55;22174:22;;;;22134:15;;;;21936:270;;;21940:3;21790:422;;;;;:::o;22217:806::-;22266:5;22296:8;22286:80;;-1:-1:-1;22337:1:1;22351:5;;22286:80;22385:4;22375:76;;-1:-1:-1;22422:1:1;22436:5;;22375:76;22467:4;22485:1;22480:59;;;;22553:1;22548:130;;;;22460:218;;22480:59;22510:1;22501:10;;22524:5;;;22548:130;22585:3;22575:8;22572:17;22569:43;;;22592:18;;:::i;:::-;-1:-1:-1;;22648:1:1;22634:16;;22663:5;;22460:218;;22762:2;22752:8;22749:16;22743:3;22737:4;22734:13;22730:36;22724:2;22714:8;22711:16;22706:2;22700:4;22697:12;22693:35;22690:77;22687:159;;;-1:-1:-1;22799:19:1;;;22831:5;;22687:159;22878:34;22903:8;22897:4;22878:34;:::i;:::-;22948:6;22944:1;22940:6;22936:19;22927:7;22924:32;22921:58;;;22959:18;;:::i;:::-;22997:20;;22217:806;-1:-1:-1;;;22217:806:1:o;23028:131::-;23088:5;23117:36;23144:8;23138:4;23117:36;:::i;24924:410::-;25126:2;25108:21;;;25165:2;25145:18;;;25138:30;25204:34;25199:2;25184:18;;25177:62;-1:-1:-1;;;25270:2:1;25255:18;;25248:44;25324:3;25309:19;;24924:410::o;25339:128::-;25406:9;;;25427:11;;;25424:37;;;25441:18;;:::i;28465:251::-;28535:6;28588:2;28576:9;28567:7;28563:23;28559:32;28556:52;;;28604:1;28601;28594:12;28556:52;28636:9;28630:16;28655:31;28680:5;28655:31;:::i;31008:347::-;31210:2;31192:21;;;31249:2;31229:18;;;31222:30;31288:25;31283:2;31268:18;;31261:53;31346:2;31331:18;;31008:347::o;33335:184::-;33405:6;33458:2;33446:9;33437:7;33433:23;33429:32;33426:52;;;33474:1;33471;33464:12;33426:52;-1:-1:-1;33497:16:1;;33335:184;-1:-1:-1;33335:184:1:o;34687:120::-;34727:1;34753;34743:35;;34758:18;;:::i;:::-;-1:-1:-1;34792:9:1;;34687:120::o;35658:245::-;35725:6;35778:2;35766:9;35757:7;35753:23;35749:32;35746:52;;;35794:1;35791;35784:12;35746:52;35826:9;35820:16;35845:28;35867:5;35845:28;:::i;36676:399::-;36878:2;36860:21;;;36917:2;36897:18;;;36890:30;36956:34;36951:2;36936:18;;36929:62;-1:-1:-1;;;37022:2:1;37007:18;;37000:33;37065:3;37050:19;;36676:399::o;37080:400::-;37282:2;37264:21;;;37321:2;37301:18;;;37294:30;37360:34;37355:2;37340:18;;37333:62;-1:-1:-1;;;37426:2:1;37411:18;;37404:34;37470:3;37455:19;;37080:400::o;38140:404::-;38342:2;38324:21;;;38381:2;38361:18;;;38354:30;38420:34;38415:2;38400:18;;38393:62;-1:-1:-1;;;38486:2:1;38471:18;;38464:38;38534:3;38519:19;;38140:404::o;38549:401::-;38751:2;38733:21;;;38790:2;38770:18;;;38763:30;38829:34;38824:2;38809:18;;38802:62;-1:-1:-1;;;38895:2:1;38880:18;;38873:35;38940:3;38925:19;;38549:401::o;38955:406::-;39157:2;39139:21;;;39196:2;39176:18;;;39169:30;39235:34;39230:2;39215:18;;39208:62;-1:-1:-1;;;39301:2:1;39286:18;;39279:40;39351:3;39336:19;;38955:406::o;39366:465::-;39623:2;39612:9;39605:21;39586:4;39649:56;39701:2;39690:9;39686:18;39678:6;39649:56;:::i;:::-;39753:9;39745:6;39741:22;39736:2;39725:9;39721:18;39714:50;39781:44;39818:6;39810;39781:44;:::i;40246:561::-;-1:-1:-1;;;;;40543:15:1;;;40525:34;;40595:15;;40590:2;40575:18;;40568:43;40642:2;40627:18;;40620:34;;;40685:2;40670:18;;40663:34;;;40505:3;40728;40713:19;;40706:32;;;40468:4;;40755:46;;40781:19;;40773:6;40755:46;:::i;:::-;40747:54;40246:561;-1:-1:-1;;;;;;;40246:561:1:o;40812:249::-;40881:6;40934:2;40922:9;40913:7;40909:23;40905:32;40902:52;;;40950:1;40947;40940:12;40902:52;40982:9;40976:16;41001:30;41025:5;41001:30;:::i;41066:179::-;41101:3;41143:1;41125:16;41122:23;41119:120;;;41189:1;41186;41183;41168:23;-1:-1:-1;41226:1:1;41220:8;41215:3;41211:18;41066:179;:::o;41250:671::-;41289:3;41331:4;41313:16;41310:26;41307:39;;;41250:671;:::o;41307:39::-;41373:2;41367:9;-1:-1:-1;;41438:16:1;41434:25;;41431:1;41367:9;41410:50;41489:4;41483:11;41513:16;-1:-1:-1;;;;;41619:2:1;41612:4;41604:6;41600:17;41597:25;41592:2;41584:6;41581:14;41578:45;41575:58;;;41626:5;;;;;41250:671;:::o;41575:58::-;41663:6;41657:4;41653:17;41642:28;;41699:3;41693:10;41726:2;41718:6;41715:14;41712:27;;;41732:5;;;;;;41250:671;:::o;41712:27::-;41816:2;41797:16;41791:4;41787:27;41783:36;41776:4;41767:6;41762:3;41758:16;41754:27;41751:69;41748:82;;;41823:5;;;;;;41250:671;:::o;41748:82::-;41839:57;41890:4;41881:6;41873;41869:19;41865:30;41859:4;41839:57;:::i;:::-;-1:-1:-1;41912:3:1;;41250:671;-1:-1:-1;;;;;41250:671:1:o;42347:404::-;42549:2;42531:21;;;42588:2;42568:18;;;42561:30;42627:34;42622:2;42607:18;;42600:62;-1:-1:-1;;;42693:2:1;42678:18;;42671:38;42741:3;42726:19;;42347:404::o;42756:827::-;-1:-1:-1;;;;;43153:15:1;;;43135:34;;43205:15;;43200:2;43185:18;;43178:43;43115:3;43252:2;43237:18;;43230:31;;;43078:4;;43284:57;;43321:19;;43313:6;43284:57;:::i;:::-;43389:9;43381:6;43377:22;43372:2;43361:9;43357:18;43350:50;43423:44;43460:6;43452;43423:44;:::i;:::-;43409:58;;43516:9;43508:6;43504:22;43498:3;43487:9;43483:19;43476:51;43544:33;43570:6;43562;43544:33;:::i;:::-;43536:41;42756:827;-1:-1:-1;;;;;;;;42756:827:1:o

Swarm Source

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