ETH Price: $3,170.04 (-7.90%)
Gas: 2 Gwei

Token

SoRekt (SRT)
 

Overview

Max Total Supply

4 SRT

Holders

4

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 SRT
0x35ead16cbd74ab6380ab9ad91266dc407149652f
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:
SoRekt

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-02-23
*/

// SPDX-License-Identifier: MIT

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


// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

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


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

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}

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


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

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// 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/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/token/ERC20/ERC20.sol


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

pragma solidity ^0.8.0;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

// File: @openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol


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

pragma solidity ^0.8.0;



/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        _spendAllowance(account, _msgSender(), amount);
        _burn(account, amount);
    }
}

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.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);
            return returndata;
        }
    }

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

    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/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol)

pragma solidity ^0.8.0;





/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role);
        _;
    }

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

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `_msgSender()` is missing `role`.
     * Overriding this function changes the behavior of the {onlyRole} modifier.
     *
     * Format of the revert message is described in {_checkRole}.
     *
     * _Available since v4.6._
     */
    function _checkRole(bytes32 role) internal view virtual {
        _checkRole(role, _msgSender());
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(account),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleGranted} event.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleRevoked} event.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     *
     * May emit a {RoleRevoked} event.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * May emit a {RoleGranted} event.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleGranted} event.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleRevoked} event.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

// File: contracts/SoRektToken.sol


pragma solidity >=0.7.0 <0.9.0;






//
/**
 * @title IndexxExchange token
 * @notice BEP20 Token with pausable, mintable and burn features
 */
contract SoRektToken is ERC20, ERC20Burnable, Pausable, AccessControl {
    using SafeMath for uint256;

    bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");
    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
    address public feeAdmin;
    bool public feeActive = false;
 
    /**
     * @dev Constructor assigning Token name, symbol and minter, pauser and admin role to msg.sender
     */
    constructor() ERC20("SoRekt", "SRT") {
        _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _grantRole(PAUSER_ROLE, msg.sender);
        _grantRole(MINTER_ROLE, msg.sender);
        feeAdmin = msg.sender;
    }

    /**
     * @dev Function to change Fee admin address
     * @param _newFeeAdmin The address of new fee admin
     */
    function changeFeeAdmin(address _newFeeAdmin) external onlyRole(MINTER_ROLE){
        feeAdmin = _newFeeAdmin;
    }

    /**
     * @dev Function to change Fee active status
     * @param status new status for fee charging
     */
    function changeFeeStatus(bool status) external onlyRole(MINTER_ROLE){
        feeActive = status;
    }

    /**
     * @dev Function to pause token transfer
     */
    function pause() public onlyRole(PAUSER_ROLE) {
        _pause();
    }

    /**
     * @dev Function to unpause token transfer
     */
    function unpause() public onlyRole(PAUSER_ROLE) {
        _unpause();
    }

    /**
     * @dev Function to mint tokens
     * @param to The address that will receive the minted tokens.
     * @param amount The amount of tokens to mint.
     */
    function mint(address to, uint256 amount) public onlyRole(MINTER_ROLE) {
        _mint(to, amount);
    }

    /**
     * @dev Function to halt token transfers in case of extreme events and emergencies
     * @param to The address that will send the tokens.
     * @param from The address that will receive the tokens.
     * @param amount The amount of tokens to mint.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal override whenNotPaused {
        super._beforeTokenTransfer(from, to, amount);
    }

    function transfer(address to, uint256 amount)
        public
        override
        returns (bool)
    {
        address owner = _msgSender();

        if ( feeActive == true && amount > 20000 * 10**18) {
            uint256 fee;
            if (amount > 40000 * 10**18) {
                if (amount > 80000 * 10**18) {
                    fee = amount.mul(15).div(1000);
                } else {
                    fee = amount.div(100);
                }
            } else {
                fee = amount.mul(5).div(1000);
            }
            _transfer(owner, feeAdmin, fee);
            amount = amount.sub(fee);
        }

        _transfer(owner, to, amount);
        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);

        if (feeActive == true && amount > 20000 * 10**18) {
            uint256 fee;
            if (amount > 40000 * 10**18) {
                if (amount > 80000 * 10**18) {
                    fee = amount.mul(15).div(1000);
                } else {
                    fee = amount.div(100);
                }
            } else {
                fee = amount.mul(5).div(1000);
            }
            _transfer(from, feeAdmin, fee);
            amount = amount.sub(fee);
        }
        _transfer(from, to, amount);

        return true;
    }


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


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: address zero is not a valid owner");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _ownerOf(tokenId);
        require(owner != address(0), "ERC721: invalid token ID");
        return owner;
    }

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

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

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

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not token owner or approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");
        _safeTransfer(from, to, tokenId, data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist
     */
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _owners[tokenId];
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _ownerOf(tokenId) != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId, 1);

        // Check that tokenId was not minted by `_beforeTokenTransfer` hook
        require(!_exists(tokenId), "ERC721: token already minted");

        unchecked {
            // Will not overflow unless all 2**256 token ids are minted to the same owner.
            // Given that tokens are minted one by one, it is impossible in practice that
            // this ever happens. Might change if we allow batch minting.
            // The ERC fails to describe this case.
            _balances[to] += 1;
        }

        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId, 1);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     * This is an internal function that does not check if the sender is authorized to operate on the token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId, 1);

        // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
        owner = ERC721.ownerOf(tokenId);

        // Clear approvals
        delete _tokenApprovals[tokenId];

        unchecked {
            // Cannot overflow, as that would require more tokens to be burned/transferred
            // out than the owner initially received through minting and transferring in.
            _balances[owner] -= 1;
        }
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId, 1);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId, 1);

        // Check that tokenId was not transferred by `_beforeTokenTransfer` hook
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");

        // Clear approvals from the previous owner
        delete _tokenApprovals[tokenId];

        unchecked {
            // `_balances[from]` cannot overflow for the same reason as described in `_burn`:
            // `from`'s balance is the number of token held, which is at least one before the current
            // transfer.
            // `_balances[to]` could overflow in the conditions described in `_mint`. That would require
            // all 2**256 token ids to be minted, which in practice is impossible.
            _balances[from] -= 1;
            _balances[to] += 1;
        }
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId, 1);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits an {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @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, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.
     * - When `from` is zero, the tokens will be minted for `to`.
     * - When `to` is zero, ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256, /* firstTokenId */
        uint256 batchSize
    ) internal virtual {
        if (batchSize > 1) {
            if (from != address(0)) {
                _balances[from] -= batchSize;
            }
            if (to != address(0)) {
                _balances[to] += batchSize;
            }
        }
    }

    /**
     * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.
     * - When `from` is zero, the tokens were minted for `to`.
     * - When `to` is zero, ``from``'s tokens were burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual {}
}

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


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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File: contracts/SoRekt.sol



pragma solidity >=0.7.0 <0.9.0;
// import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
// import "@openzeppelin/contracts/utils/math/SafeMath.sol";
// import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
// import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";






contract SoRekt is ERC721, Ownable {
    using Strings for uint256;
    using Counters for Counters.Counter;

    Counters.Counter private supply;

    string public uriPrefix = "";
    string public uriSuffix = ".json";
    string public hiddenMetadataUri;
    uint256 public cost = 0.000 ether;
    uint256 public tokenCost = 0.000 ether;
    uint256 public maxSupply = 10000;
    uint256 public maxMintAmountPerTx = 2;
    uint256 public nftPerAdressLimit = 2;
    uint256 public airDropPerAdressLimit = 2;
    uint256 public sorektAirDrop = 0;
    bool public paused = true;
    bool public revealed = true;
    bool public onlyWhitelisted = false;

    address[] public whitelistedAddresses;
    mapping(address => uint256) public addressMintedBalance;
    address tokenAddress = 0x02082bE81e0b8BE7D7bdAa75A2706B20EdCD9BF9;
    address sorektAddress = 0x43885f74eBBF498667FF9adC5427b844D6ddDF32;

    constructor() ERC721("SoRekt", "SRT") {
        setHiddenMetadataUri(
            "ipfs://QmNik8Us5gCnqgcUx9URgTS9AMCw2FuRzHKWuGcibDawcv/hidden.json"
        );
        uriPrefix = "ipfs://QmSZVy4Pv2i6rvbddVLBGSAW2C7LU7A6ApvPpfXuuhTdML/";
         //_mintLoop(msg.sender, 100);
        // you have to initialize with IERC20
        //sorektAddress = IERC20(token);
    }

    modifier mintCompliance(uint256 _mintAmount) {
        require(
            _mintAmount > 0 && _mintAmount <= maxMintAmountPerTx,
            "Invalid mint amount!"
        );
        require(
            supply.current() + _mintAmount <= maxSupply,
            "Max supply exceeded!"
        );
        uint256 ownerMintedCount = addressMintedBalance[msg.sender];
        require(
            ownerMintedCount + _mintAmount <= nftPerAdressLimit,
            "Over Wallet Limit"
        );
        _;
    }

    function totalSupply() public view returns (uint256) {
        return supply.current();
    }

    function mint(uint256 _mintAmount)
        public
        payable
        mintCompliance(_mintAmount)
    {
        require(!paused, "The contract is paused!");
        require(msg.value >= cost * _mintAmount, "Insufficient funds!");
        if (msg.sender != owner()) {
            if (onlyWhitelisted == true) {
                require(isWhitelisted(msg.sender), "User is not whitelisted");
            }
        }
        _mintLoop(msg.sender, _mintAmount);
        SoRektToken(sorektAddress).mint(msg.sender, sorektAirDrop);
    }

    function mintWithINEX(uint256 _mintAmount)
        public
        payable
        mintCompliance(_mintAmount)
    {
        address sender = _msgSender();
        require(!paused, "The contract is paused!");
        require(
            _mintAmount * tokenCost >= GetAllowance(),
            "Please approve tokens before minting"
        );
        IERC20(tokenAddress).transferFrom(
            sender,
            address(this),
            _mintAmount * tokenCost
        );
        _mintLoop(sender, _mintAmount);
        SoRektToken(sorektAddress).mint(msg.sender, sorektAirDrop);
    }

    function GetAllowance() public view returns (uint256) {
        return IERC20(tokenAddress).allowance(msg.sender, address(this));
    }

    function mintForAddress(uint256 _mintAmount, address _receiver)
        public
        mintCompliance(_mintAmount)
        onlyOwner
    {
        _mintLoop(_receiver, _mintAmount);
    }

    function mintForAddressCompany(uint256 _mintAmount, address _receiver)
        public
        onlyOwner
    {
        _mintLoop(_receiver, _mintAmount);
    }

    function isWhitelisted(address _user) public view returns (bool) {
        for (uint256 i = 0; i < whitelistedAddresses.length; i++) {
            if (whitelistedAddresses[i] == _user) {
                return true;
            }
        }
        return false;
    }

    function walletOfOwner(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
        uint256 currentTokenId = 1;
        uint256 ownedTokenIndex = 0;

        while (
            ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply
        ) {
            address currentTokenOwner = ownerOf(currentTokenId);

            if (currentTokenOwner == _owner) {
                ownedTokenIds[ownedTokenIndex] = currentTokenId;

                ownedTokenIndex++;
            }

            currentTokenId++;
        }

        return ownedTokenIds;
    }

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

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

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

    function awardItem(address tokenHolder) public onlyOwner returns (bool) {
        _mintLoop(tokenHolder, airDropPerAdressLimit);
        return true;
    }

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

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

    function setTokenAddress(address _tokenAddress) public onlyOwner {
        tokenAddress = _tokenAddress;
    }

    function setTokenCost(uint256 _tokenCost) public onlyOwner {
        tokenCost = _tokenCost;
    }

    function sorektAirDropCount(uint256 _tokenCount) public onlyOwner {
        sorektAirDrop = _tokenCount;
    }

    function setNftPerAddressLimit(uint256 _limit) public onlyOwner {
        nftPerAdressLimit = _limit;
    }

    function setairdropPerAddressLimit(uint256 _limit) public onlyOwner {
        airDropPerAdressLimit = _limit;
    }

    function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx)
        public
        onlyOwner
    {
        maxMintAmountPerTx = _maxMintAmountPerTx;
    }

    function setHiddenMetadataUri(string memory _hiddenMetadataUri)
        public
        onlyOwner
    {
        hiddenMetadataUri = _hiddenMetadataUri;
    }

    function setUriPrefix(string memory _uriPrefix) public onlyOwner {
        uriPrefix = _uriPrefix;
    }

    function setUriSuffix(string memory _uriSuffix) public onlyOwner {
        uriSuffix = _uriSuffix;
    }

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

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

    function withdraw() public onlyOwner {
        // =============================================================================
        (bool os, ) = payable(owner()).call{value: address(this).balance}("");
        require(os);
        // =============================================================================
    }

    function withdrawToken(uint256 _amount) external onlyOwner {
        IERC20 tokenContract = IERC20(tokenAddress);
        // needs to execute `approve()` on the token contract to allow itself the transfer
        tokenContract.approve(address(this), _amount);
        tokenContract.transferFrom(address(this), owner(), _amount);
    }

    function _mintLoop(address _receiver, uint256 _mintAmount) internal {
        for (uint256 i = 0; i < _mintAmount; i++) {
            addressMintedBalance[msg.sender]++;
            supply.increment();
            _safeMint(_receiver, supply.current());
        }
    }

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

    function whitelistUsers(address[] calldata _users) public onlyOwner {
        delete whitelistedAddresses;
        whitelistedAddresses = _users;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"GetAllowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"airDropPerAdressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenHolder","type":"address"}],"name":"awardItem","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddressCompany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintWithINEX","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAdressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setNftPerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"setTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenCost","type":"uint256"}],"name":"setTokenCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setairdropPerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sorektAirDrop","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenCount","type":"uint256"}],"name":"sorektAirDropCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"whitelistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelistedAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250600890805190602001906200002b9291906200047e565b506040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060099080519060200190620000799291906200047e565b506000600b556000600c55612710600d556002600e556002600f55600260105560006011556001601260006101000a81548160ff0219169083151502179055506001601260016101000a81548160ff0219169083151502179055506000601260026101000a81548160ff0219169083151502179055507302082be81e0b8be7d7bdaa75a2706b20edcd9bf9601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507343885f74ebbf498667ff9adc5427b844d6dddf32601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620001a657600080fd5b506040518060400160405280600681526020017f536f52656b7400000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f535254000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200022b9291906200047e565b508060019080519060200190620002449291906200047e565b505050620002676200025b620002c960201b60201c565b620002d160201b60201c565b6200029160405180608001604052806041815260200162005843604191396200039760201b60201c565b604051806060016040528060368152602001620058846036913960089080519060200190620002c29291906200047e565b5062000616565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003a7620003c360201b60201c565b80600a9080519060200190620003bf9291906200047e565b5050565b620003d3620002c960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003f96200045460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000452576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004499062000555565b60405180910390fd5b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200048c9062000588565b90600052602060002090601f016020900481019282620004b05760008555620004fc565b82601f10620004cb57805160ff1916838001178555620004fc565b82800160010185558215620004fc579182015b82811115620004fb578251825591602001919060010190620004de565b5b5090506200050b91906200050f565b5090565b5b808211156200052a57600081600090555060010162000510565b5090565b60006200053d60208362000577565b91506200054a82620005ed565b602082019050919050565b6000602082019050818103600083015262000570816200052e565b9050919050565b600082825260208201905092915050565b60006002820490506001821680620005a157607f821691505b60208210811415620005b857620005b7620005be565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b61521d80620006266000396000f3fe60806040526004361061036b5760003560e01c806370a08231116101c6578063b88d4fde116100f7578063e0a8085311610095578063edec5f271161006f578063edec5f2714610c72578063efbd73f414610c9b578063f2fb212014610cc4578063f2fde38b14610d015761036b565b8063e0a8085314610bf0578063e985e9c514610c19578063ed759c4614610c565761036b565b8063c87b56dd116100d1578063c87b56dd14610b36578063d0eb26b014610b73578063d16c89b114610b9c578063d5abeb0114610bc55761036b565b8063b88d4fde14610aa7578063ba4e5c4914610ad0578063bb9e354714610b0d5761036b565b806394354fd011610164578063a0712d681161013e578063a0712d6814610a0e578063a22cb46514610a2a578063a45ba8e714610a53578063b071401b14610a7e5761036b565b806394354fd01461098d57806395d89b41146109b85780639c70b512146109e35761036b565b80637ec4a659116101a05780637ec4a659146108e55780638bfae83b1461090e5780638da5cb5b14610937578063912221d5146109625761036b565b806370a0823114610868578063715018a6146108a557806375604153146108bc5761036b565b80633ccfd60b116102a0578063518302271161023e5780635c975abb116102185780635c975abb146107aa57806362b99ad4146107d557806363427fde146108005780636352211e1461082b5761036b565b8063518302271461072957806353edc614146107545780635503a0e81461077f5761036b565b8063438b63001161027a578063438b63001461067157806344a0d68a146106ae5780634fdd43cb146106d757806350baa622146107005761036b565b80633ccfd60b14610606578063424c414d1461061d57806342842e0e146106485761036b565b806318160ddd1161030d57806323b872dd116102e757806323b872dd1461054e57806326a4e8d2146105775780633af32abf146105a05780633c952764146105dd5761036b565b806318160ddd146104bb57806318cae269146104e6578063207b94db146105235761036b565b8063095ea7b311610349578063095ea7b31461041557806313faede61461043e57806316ba10e01461046957806316c38b3c146104925761036b565b806301ffc9a71461037057806306fdde03146103ad578063081812fc146103d8575b600080fd5b34801561037c57600080fd5b5061039760048036038101906103929190613e61565b610d2a565b6040516103a491906145b0565b60405180910390f35b3480156103b957600080fd5b506103c2610e0c565b6040516103cf91906145cb565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa9190613ef4565b610e9e565b60405161040c919061449e565b60405180910390f35b34801561042157600080fd5b5061043c60048036038101906104379190613d8e565b610ee4565b005b34801561044a57600080fd5b50610453610ffc565b604051610460919061488d565b60405180910390f35b34801561047557600080fd5b50610490600480360381019061048b9190613eb3565b611002565b005b34801561049e57600080fd5b506104b960048036038101906104b49190613e0f565b611024565b005b3480156104c757600080fd5b506104d0611049565b6040516104dd919061488d565b60405180910390f35b3480156104f257600080fd5b5061050d60048036038101906105089190613c23565b61105a565b60405161051a919061488d565b60405180910390f35b34801561052f57600080fd5b50610538611072565b604051610545919061488d565b60405180910390f35b34801561055a57600080fd5b5061057560048036038101906105709190613c88565b611078565b005b34801561058357600080fd5b5061059e60048036038101906105999190613c23565b6110d8565b005b3480156105ac57600080fd5b506105c760048036038101906105c29190613c23565b611124565b6040516105d491906145b0565b60405180910390f35b3480156105e957600080fd5b5061060460048036038101906105ff9190613e0f565b6111f9565b005b34801561061257600080fd5b5061061b61121e565b005b34801561062957600080fd5b506106326112a6565b60405161063f919061488d565b60405180910390f35b34801561065457600080fd5b5061066f600480360381019061066a9190613c88565b6112ac565b005b34801561067d57600080fd5b5061069860048036038101906106939190613c23565b6112cc565b6040516106a5919061458e565b60405180910390f35b3480156106ba57600080fd5b506106d560048036038101906106d09190613ef4565b611423565b005b3480156106e357600080fd5b506106fe60048036038101906106f99190613eb3565b611435565b005b34801561070c57600080fd5b5061072760048036038101906107229190613ef4565b611457565b005b34801561073557600080fd5b5061073e6115af565b60405161074b91906145b0565b60405180910390f35b34801561076057600080fd5b506107696115c2565b604051610776919061488d565b60405180910390f35b34801561078b57600080fd5b50610794611676565b6040516107a191906145cb565b60405180910390f35b3480156107b657600080fd5b506107bf611704565b6040516107cc91906145b0565b60405180910390f35b3480156107e157600080fd5b506107ea611717565b6040516107f791906145cb565b60405180910390f35b34801561080c57600080fd5b506108156117a5565b604051610822919061488d565b60405180910390f35b34801561083757600080fd5b50610852600480360381019061084d9190613ef4565b6117ab565b60405161085f919061449e565b60405180910390f35b34801561087457600080fd5b5061088f600480360381019061088a9190613c23565b611832565b60405161089c919061488d565b60405180910390f35b3480156108b157600080fd5b506108ba6118ea565b005b3480156108c857600080fd5b506108e360048036038101906108de9190613ef4565b6118fe565b005b3480156108f157600080fd5b5061090c60048036038101906109079190613eb3565b611910565b005b34801561091a57600080fd5b5061093560048036038101906109309190613ef4565b611932565b005b34801561094357600080fd5b5061094c611944565b604051610959919061449e565b60405180910390f35b34801561096e57600080fd5b5061097761196e565b604051610984919061488d565b60405180910390f35b34801561099957600080fd5b506109a2611974565b6040516109af919061488d565b60405180910390f35b3480156109c457600080fd5b506109cd61197a565b6040516109da91906145cb565b60405180910390f35b3480156109ef57600080fd5b506109f8611a0c565b604051610a0591906145b0565b60405180910390f35b610a286004803603810190610a239190613ef4565b611a1f565b005b348015610a3657600080fd5b50610a516004803603810190610a4c9190613d52565b611d3e565b005b348015610a5f57600080fd5b50610a68611d54565b604051610a7591906145cb565b60405180910390f35b348015610a8a57600080fd5b50610aa56004803603810190610aa09190613ef4565b611de2565b005b348015610ab357600080fd5b50610ace6004803603810190610ac99190613cd7565b611df4565b005b348015610adc57600080fd5b50610af76004803603810190610af29190613ef4565b611e56565b604051610b04919061449e565b60405180910390f35b348015610b1957600080fd5b50610b346004803603810190610b2f9190613ef4565b611e95565b005b348015610b4257600080fd5b50610b5d6004803603810190610b589190613ef4565b611ea7565b604051610b6a91906145cb565b60405180910390f35b348015610b7f57600080fd5b50610b9a6004803603810190610b959190613ef4565b612000565b005b348015610ba857600080fd5b50610bc36004803603810190610bbe9190613f46565b612012565b005b348015610bd157600080fd5b50610bda612028565b604051610be7919061488d565b60405180910390f35b348015610bfc57600080fd5b50610c176004803603810190610c129190613e0f565b61202e565b005b348015610c2557600080fd5b50610c406004803603810190610c3b9190613c4c565b612053565b604051610c4d91906145b0565b60405180910390f35b610c706004803603810190610c6b9190613ef4565b6120e7565b005b348015610c7e57600080fd5b50610c996004803603810190610c949190613dca565b612439565b005b348015610ca757600080fd5b50610cc26004803603810190610cbd9190613f46565b612465565b005b348015610cd057600080fd5b50610ceb6004803603810190610ce69190613c23565b6125bc565b604051610cf891906145b0565b60405180910390f35b348015610d0d57600080fd5b50610d286004803603810190610d239190613c23565b6125db565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610df557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e055750610e048261265f565b5b9050919050565b606060008054610e1b90614b65565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4790614b65565b8015610e945780601f10610e6957610100808354040283529160200191610e94565b820191906000526020600020905b815481529060010190602001808311610e7757829003601f168201915b5050505050905090565b6000610ea9826126c9565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610eef826117ab565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f57906147ed565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610f7f612714565b73ffffffffffffffffffffffffffffffffffffffff161480610fae5750610fad81610fa8612714565b612053565b5b610fed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe49061482d565b60405180910390fd5b610ff7838361271c565b505050565b600b5481565b61100a6127d5565b8060099080519060200190611020929190613912565b5050565b61102c6127d5565b80601260006101000a81548160ff02191690831515021790555050565b60006110556007612853565b905090565b60146020528060005260406000206000915090505481565b600f5481565b611089611083612714565b82612861565b6110c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bf906145ed565b60405180910390fd5b6110d38383836128f6565b505050565b6110e06127d5565b80601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600090505b6013805490508110156111ee578273ffffffffffffffffffffffffffffffffffffffff166013828154811061118a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156111db5760019150506111f4565b80806111e690614bc8565b91505061112c565b50600090505b919050565b6112016127d5565b80601260026101000a81548160ff02191690831515021790555050565b6112266127d5565b6000611230611944565b73ffffffffffffffffffffffffffffffffffffffff164760405161125390614489565b60006040518083038185875af1925050503d8060008114611290576040519150601f19603f3d011682016040523d82523d6000602084013e611295565b606091505b50509050806112a357600080fd5b50565b60105481565b6112c783838360405180602001604052806000815250611df4565b505050565b606060006112d983611832565b905060008167ffffffffffffffff81111561131d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561134b5781602001602082028036833780820191505090505b50905060006001905060005b83811080156113685750600d548211155b15611417576000611378836117ab565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561140357828483815181106113e8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505081806113ff90614bc8565b9250505b828061140e90614bc8565b93505050611357565b82945050505050919050565b61142b6127d5565b80600b8190555050565b61143d6127d5565b80600a9080519060200190611453929190613912565b5050565b61145f6127d5565b6000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663095ea7b330846040518363ffffffff1660e01b81526004016114c1929190614565565b602060405180830381600087803b1580156114db57600080fd5b505af11580156114ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115139190613e38565b508073ffffffffffffffffffffffffffffffffffffffff166323b872dd30611539611944565b856040518463ffffffff1660e01b8152600401611558939291906144e2565b602060405180830381600087803b15801561157257600080fd5b505af1158015611586573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115aa9190613e38565b505050565b601260019054906101000a900460ff1681565b6000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b81526004016116219291906144b9565b60206040518083038186803b15801561163957600080fd5b505afa15801561164d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116719190613f1d565b905090565b6009805461168390614b65565b80601f01602080910402602001604051908101604052809291908181526020018280546116af90614b65565b80156116fc5780601f106116d1576101008083540402835291602001916116fc565b820191906000526020600020905b8154815290600101906020018083116116df57829003601f168201915b505050505081565b601260009054906101000a900460ff1681565b6008805461172490614b65565b80601f016020809104026020016040519081016040528092919081815260200182805461175090614b65565b801561179d5780601f106117725761010080835404028352916020019161179d565b820191906000526020600020905b81548152906001019060200180831161178057829003601f168201915b505050505081565b60115481565b6000806117b783612bf0565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611829576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611820906147cd565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189a9061470d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6118f26127d5565b6118fc6000612c2d565b565b6119066127d5565b8060118190555050565b6119186127d5565b806008908051906020019061192e929190613912565b5050565b61193a6127d5565b8060108190555050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600c5481565b600e5481565b60606001805461198990614b65565b80601f01602080910402602001604051908101604052809291908181526020018280546119b590614b65565b8015611a025780601f106119d757610100808354040283529160200191611a02565b820191906000526020600020905b8154815290600101906020018083116119e557829003601f168201915b5050505050905090565b601260029054906101000a900460ff1681565b80600081118015611a325750600e548111155b611a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a689061468d565b60405180910390fd5b600d5481611a7f6007612853565b611a8991906149cb565b1115611aca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac19061480d565b60405180910390fd5b6000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600f548282611b1d91906149cb565b1115611b5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b559061478d565b60405180910390fd5b601260009054906101000a900460ff1615611bae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba59061476d565b60405180910390fd5b82600b54611bbc9190614a21565b341015611bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf59061484d565b60405180910390fd5b611c06611944565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c9e5760011515601260029054906101000a900460ff1615151415611c9d57611c5d33611124565b611c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c93906146ed565b60405180910390fd5b5b5b611ca83384612cf3565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f19336011546040518363ffffffff1660e01b8152600401611d07929190614565565b600060405180830381600087803b158015611d2157600080fd5b505af1158015611d35573d6000803e3d6000fd5b50505050505050565b611d50611d49612714565b8383612d88565b5050565b600a8054611d6190614b65565b80601f0160208091040260200160405190810160405280929190818152602001828054611d8d90614b65565b8015611dda5780601f10611daf57610100808354040283529160200191611dda565b820191906000526020600020905b815481529060010190602001808311611dbd57829003601f168201915b505050505081565b611dea6127d5565b80600e8190555050565b611e05611dff612714565b83612861565b611e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3b906145ed565b60405180910390fd5b611e5084848484612ef5565b50505050565b60138181548110611e6657600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611e9d6127d5565b80600c8190555050565b6060611eb282612f51565b611ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee8906147ad565b60405180910390fd5b60001515601260019054906101000a900460ff1615151415611f9f57600a8054611f1a90614b65565b80601f0160208091040260200160405190810160405280929190818152602001828054611f4690614b65565b8015611f935780601f10611f6857610100808354040283529160200191611f93565b820191906000526020600020905b815481529060010190602001808311611f7657829003601f168201915b50505050509050611ffb565b6000611fa9612f92565b90506000815111611fc95760405180602001604052806000815250611ff7565b80611fd384613024565b6009604051602001611fe793929190614458565b6040516020818303038152906040525b9150505b919050565b6120086127d5565b80600f8190555050565b61201a6127d5565b6120248183612cf3565b5050565b600d5481565b6120366127d5565b80601260016101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b806000811180156120fa5750600e548111155b612139576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121309061468d565b60405180910390fd5b600d54816121476007612853565b61215191906149cb565b1115612192576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121899061480d565b60405180910390fd5b6000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600f5482826121e591906149cb565b1115612226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221d9061478d565b60405180910390fd5b6000612230612714565b9050601260009054906101000a900460ff1615612282576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122799061476d565b60405180910390fd5b61228a6115c2565b600c54856122989190614a21565b10156122d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d09061486d565b60405180910390fd5b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8230600c54886123279190614a21565b6040518463ffffffff1660e01b8152600401612345939291906144e2565b602060405180830381600087803b15801561235f57600080fd5b505af1158015612373573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123979190613e38565b506123a28185612cf3565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f19336011546040518363ffffffff1660e01b8152600401612401929190614565565b600060405180830381600087803b15801561241b57600080fd5b505af115801561242f573d6000803e3d6000fd5b5050505050505050565b6124416127d5565b6013600061244f9190613998565b8181601391906124609291906139b9565b505050565b816000811180156124785750600e548111155b6124b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ae9061468d565b60405180910390fd5b600d54816124c56007612853565b6124cf91906149cb565b1115612510576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125079061480d565b60405180910390fd5b6000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600f54828261256391906149cb565b11156125a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259b9061478d565b60405180910390fd5b6125ac6127d5565b6125b68385612cf3565b50505050565b60006125c66127d5565b6125d282601054612cf3565b60019050919050565b6125e36127d5565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612653576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264a9061462d565b60405180910390fd5b61265c81612c2d565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6126d281612f51565b612711576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612708906147cd565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661278f836117ab565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6127dd612714565b73ffffffffffffffffffffffffffffffffffffffff166127fb611944565b73ffffffffffffffffffffffffffffffffffffffff1614612851576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128489061474d565b60405180910390fd5b565b600081600001549050919050565b60008061286d836117ab565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806128af57506128ae8185612053565b5b806128ed57508373ffffffffffffffffffffffffffffffffffffffff166128d584610e9e565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612916826117ab565b73ffffffffffffffffffffffffffffffffffffffff161461296c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129639061464d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d3906146ad565b60405180910390fd5b6129e98383836001613148565b8273ffffffffffffffffffffffffffffffffffffffff16612a09826117ab565b73ffffffffffffffffffffffffffffffffffffffff1614612a5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a569061464d565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612beb838383600161326e565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60005b81811015612d8357601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190612d4e90614bc8565b9190505550612d5d6007613274565b612d7083612d6b6007612853565b61328a565b8080612d7b90614bc8565b915050612cf6565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612df7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dee906146cd565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612ee891906145b0565b60405180910390a3505050565b612f008484846128f6565b612f0c848484846132a8565b612f4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f429061460d565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff16612f7383612bf0565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b606060088054612fa190614b65565b80601f0160208091040260200160405190810160405280929190818152602001828054612fcd90614b65565b801561301a5780601f10612fef5761010080835404028352916020019161301a565b820191906000526020600020905b815481529060010190602001808311612ffd57829003601f168201915b5050505050905090565b6060600060016130338461343f565b01905060008167ffffffffffffffff811115613078577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156130aa5781602001600182028036833780820191505090505b509050600082602001820190505b60011561313d578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581613127577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b04945060008514156131385761313d565b6130b8565b819350505050919050565b600181111561326857600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146131dc5780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131d49190614a7b565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146132675780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461325f91906149cb565b925050819055505b5b50505050565b50505050565b6001816000016000828254019250508190555050565b6132a4828260405180602001604052806000815250613676565b5050565b60006132c98473ffffffffffffffffffffffffffffffffffffffff166136d1565b15613432578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026132f2612714565b8786866040518563ffffffff1660e01b81526004016133149493929190614519565b602060405180830381600087803b15801561332e57600080fd5b505af192505050801561335f57506040513d601f19601f8201168201806040525081019061335c9190613e8a565b60015b6133e2573d806000811461338f576040519150601f19603f3d011682016040523d82523d6000602084013e613394565b606091505b506000815114156133da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133d19061460d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613437565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106134c3577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816134b9577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613526576d04ee2d6d415b85acef8100000000838161351c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506020810190505b662386f26fc10000831061357b57662386f26fc100008381613571577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506010810190505b6305f5e10083106135ca576305f5e10083816135c0577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506008810190505b612710831061361557612710838161360b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506004810190505b6064831061365e5760648381613654577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506002810190505b600a831061366d576001810190505b80915050919050565b61368083836136f4565b61368d60008484846132a8565b6136cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136c39061460d565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613764576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161375b9061472d565b60405180910390fd5b61376d81612f51565b156137ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137a49061466d565b60405180910390fd5b6137bb600083836001613148565b6137c481612f51565b15613804576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137fb9061466d565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461390e60008383600161326e565b5050565b82805461391e90614b65565b90600052602060002090601f0160209004810192826139405760008555613987565b82601f1061395957805160ff1916838001178555613987565b82800160010185558215613987579182015b8281111561398657825182559160200191906001019061396b565b5b5090506139949190613a59565b5090565b50805460008255906000526020600020908101906139b69190613a59565b50565b828054828255906000526020600020908101928215613a48579160200282015b82811115613a4757823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906139d9565b5b509050613a559190613a59565b5090565b5b80821115613a72576000816000905550600101613a5a565b5090565b6000613a89613a84846148cd565b6148a8565b905082815260208101848484011115613aa157600080fd5b613aac848285614b23565b509392505050565b6000613ac7613ac2846148fe565b6148a8565b905082815260208101848484011115613adf57600080fd5b613aea848285614b23565b509392505050565b600081359050613b018161518b565b92915050565b60008083601f840112613b1957600080fd5b8235905067ffffffffffffffff811115613b3257600080fd5b602083019150836020820283011115613b4a57600080fd5b9250929050565b600081359050613b60816151a2565b92915050565b600081519050613b75816151a2565b92915050565b600081359050613b8a816151b9565b92915050565b600081519050613b9f816151b9565b92915050565b600082601f830112613bb657600080fd5b8135613bc6848260208601613a76565b91505092915050565b600082601f830112613be057600080fd5b8135613bf0848260208601613ab4565b91505092915050565b600081359050613c08816151d0565b92915050565b600081519050613c1d816151d0565b92915050565b600060208284031215613c3557600080fd5b6000613c4384828501613af2565b91505092915050565b60008060408385031215613c5f57600080fd5b6000613c6d85828601613af2565b9250506020613c7e85828601613af2565b9150509250929050565b600080600060608486031215613c9d57600080fd5b6000613cab86828701613af2565b9350506020613cbc86828701613af2565b9250506040613ccd86828701613bf9565b9150509250925092565b60008060008060808587031215613ced57600080fd5b6000613cfb87828801613af2565b9450506020613d0c87828801613af2565b9350506040613d1d87828801613bf9565b925050606085013567ffffffffffffffff811115613d3a57600080fd5b613d4687828801613ba5565b91505092959194509250565b60008060408385031215613d6557600080fd5b6000613d7385828601613af2565b9250506020613d8485828601613b51565b9150509250929050565b60008060408385031215613da157600080fd5b6000613daf85828601613af2565b9250506020613dc085828601613bf9565b9150509250929050565b60008060208385031215613ddd57600080fd5b600083013567ffffffffffffffff811115613df757600080fd5b613e0385828601613b07565b92509250509250929050565b600060208284031215613e2157600080fd5b6000613e2f84828501613b51565b91505092915050565b600060208284031215613e4a57600080fd5b6000613e5884828501613b66565b91505092915050565b600060208284031215613e7357600080fd5b6000613e8184828501613b7b565b91505092915050565b600060208284031215613e9c57600080fd5b6000613eaa84828501613b90565b91505092915050565b600060208284031215613ec557600080fd5b600082013567ffffffffffffffff811115613edf57600080fd5b613eeb84828501613bcf565b91505092915050565b600060208284031215613f0657600080fd5b6000613f1484828501613bf9565b91505092915050565b600060208284031215613f2f57600080fd5b6000613f3d84828501613c0e565b91505092915050565b60008060408385031215613f5957600080fd5b6000613f6785828601613bf9565b9250506020613f7885828601613af2565b9150509250929050565b6000613f8e838361443a565b60208301905092915050565b613fa381614aaf565b82525050565b6000613fb482614954565b613fbe8185614982565b9350613fc98361492f565b8060005b83811015613ffa578151613fe18882613f82565b9750613fec83614975565b925050600181019050613fcd565b5085935050505092915050565b61401081614ac1565b82525050565b60006140218261495f565b61402b8185614993565b935061403b818560208601614b32565b61404481614c9e565b840191505092915050565b600061405a8261496a565b61406481856149af565b9350614074818560208601614b32565b61407d81614c9e565b840191505092915050565b60006140938261496a565b61409d81856149c0565b93506140ad818560208601614b32565b80840191505092915050565b600081546140c681614b65565b6140d081866149c0565b945060018216600081146140eb57600181146140fc5761412f565b60ff1983168652818601935061412f565b6141058561493f565b60005b8381101561412757815481890152600182019150602081019050614108565b838801955050505b50505092915050565b6000614145602d836149af565b915061415082614caf565b604082019050919050565b60006141686032836149af565b915061417382614cfe565b604082019050919050565b600061418b6026836149af565b915061419682614d4d565b604082019050919050565b60006141ae6025836149af565b91506141b982614d9c565b604082019050919050565b60006141d1601c836149af565b91506141dc82614deb565b602082019050919050565b60006141f46014836149af565b91506141ff82614e14565b602082019050919050565b60006142176024836149af565b915061422282614e3d565b604082019050919050565b600061423a6019836149af565b915061424582614e8c565b602082019050919050565b600061425d6017836149af565b915061426882614eb5565b602082019050919050565b60006142806029836149af565b915061428b82614ede565b604082019050919050565b60006142a36020836149af565b91506142ae82614f2d565b602082019050919050565b60006142c66020836149af565b91506142d182614f56565b602082019050919050565b60006142e96017836149af565b91506142f482614f7f565b602082019050919050565b600061430c6011836149af565b915061431782614fa8565b602082019050919050565b600061432f602f836149af565b915061433a82614fd1565b604082019050919050565b60006143526018836149af565b915061435d82615020565b602082019050919050565b60006143756021836149af565b915061438082615049565b604082019050919050565b60006143986000836149a4565b91506143a382615098565b600082019050919050565b60006143bb6014836149af565b91506143c68261509b565b602082019050919050565b60006143de603d836149af565b91506143e9826150c4565b604082019050919050565b60006144016013836149af565b915061440c82615113565b602082019050919050565b60006144246024836149af565b915061442f8261513c565b604082019050919050565b61444381614b19565b82525050565b61445281614b19565b82525050565b60006144648286614088565b91506144708285614088565b915061447c82846140b9565b9150819050949350505050565b60006144948261438b565b9150819050919050565b60006020820190506144b36000830184613f9a565b92915050565b60006040820190506144ce6000830185613f9a565b6144db6020830184613f9a565b9392505050565b60006060820190506144f76000830186613f9a565b6145046020830185613f9a565b6145116040830184614449565b949350505050565b600060808201905061452e6000830187613f9a565b61453b6020830186613f9a565b6145486040830185614449565b818103606083015261455a8184614016565b905095945050505050565b600060408201905061457a6000830185613f9a565b6145876020830184614449565b9392505050565b600060208201905081810360008301526145a88184613fa9565b905092915050565b60006020820190506145c56000830184614007565b92915050565b600060208201905081810360008301526145e5818461404f565b905092915050565b6000602082019050818103600083015261460681614138565b9050919050565b600060208201905081810360008301526146268161415b565b9050919050565b600060208201905081810360008301526146468161417e565b9050919050565b60006020820190508181036000830152614666816141a1565b9050919050565b60006020820190508181036000830152614686816141c4565b9050919050565b600060208201905081810360008301526146a6816141e7565b9050919050565b600060208201905081810360008301526146c68161420a565b9050919050565b600060208201905081810360008301526146e68161422d565b9050919050565b6000602082019050818103600083015261470681614250565b9050919050565b6000602082019050818103600083015261472681614273565b9050919050565b6000602082019050818103600083015261474681614296565b9050919050565b60006020820190508181036000830152614766816142b9565b9050919050565b60006020820190508181036000830152614786816142dc565b9050919050565b600060208201905081810360008301526147a6816142ff565b9050919050565b600060208201905081810360008301526147c681614322565b9050919050565b600060208201905081810360008301526147e681614345565b9050919050565b6000602082019050818103600083015261480681614368565b9050919050565b60006020820190508181036000830152614826816143ae565b9050919050565b60006020820190508181036000830152614846816143d1565b9050919050565b60006020820190508181036000830152614866816143f4565b9050919050565b6000602082019050818103600083015261488681614417565b9050919050565b60006020820190506148a26000830184614449565b92915050565b60006148b26148c3565b90506148be8282614b97565b919050565b6000604051905090565b600067ffffffffffffffff8211156148e8576148e7614c6f565b5b6148f182614c9e565b9050602081019050919050565b600067ffffffffffffffff82111561491957614918614c6f565b5b61492282614c9e565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006149d682614b19565b91506149e183614b19565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614a1657614a15614c11565b5b828201905092915050565b6000614a2c82614b19565b9150614a3783614b19565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a7057614a6f614c11565b5b828202905092915050565b6000614a8682614b19565b9150614a9183614b19565b925082821015614aa457614aa3614c11565b5b828203905092915050565b6000614aba82614af9565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614b50578082015181840152602081019050614b35565b83811115614b5f576000848401525b50505050565b60006002820490506001821680614b7d57607f821691505b60208210811415614b9157614b90614c40565b5b50919050565b614ba082614c9e565b810181811067ffffffffffffffff82111715614bbf57614bbe614c6f565b5b80604052505050565b6000614bd382614b19565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c0657614c05614c11565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f55736572206973206e6f742077686974656c6973746564000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f4f7665722057616c6c6574204c696d6974000000000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b7f506c6561736520617070726f766520746f6b656e73206265666f7265206d696e60008201527f74696e6700000000000000000000000000000000000000000000000000000000602082015250565b61519481614aaf565b811461519f57600080fd5b50565b6151ab81614ac1565b81146151b657600080fd5b50565b6151c281614acd565b81146151cd57600080fd5b50565b6151d981614b19565b81146151e457600080fd5b5056fea264697066735822122067fbf00be92f881f7f2160514667ecb8d96adedf07fc0dab33881831e13d14e064736f6c63430008040033697066733a2f2f516d4e696b3855733567436e716763557839555267545339414d4377324675527a484b57754763696244617763762f68696464656e2e6a736f6e697066733a2f2f516d535a56793450763269367276626464564c42475341573243374c553741364170765070665875756854644d4c2f

Deployed Bytecode

0x60806040526004361061036b5760003560e01c806370a08231116101c6578063b88d4fde116100f7578063e0a8085311610095578063edec5f271161006f578063edec5f2714610c72578063efbd73f414610c9b578063f2fb212014610cc4578063f2fde38b14610d015761036b565b8063e0a8085314610bf0578063e985e9c514610c19578063ed759c4614610c565761036b565b8063c87b56dd116100d1578063c87b56dd14610b36578063d0eb26b014610b73578063d16c89b114610b9c578063d5abeb0114610bc55761036b565b8063b88d4fde14610aa7578063ba4e5c4914610ad0578063bb9e354714610b0d5761036b565b806394354fd011610164578063a0712d681161013e578063a0712d6814610a0e578063a22cb46514610a2a578063a45ba8e714610a53578063b071401b14610a7e5761036b565b806394354fd01461098d57806395d89b41146109b85780639c70b512146109e35761036b565b80637ec4a659116101a05780637ec4a659146108e55780638bfae83b1461090e5780638da5cb5b14610937578063912221d5146109625761036b565b806370a0823114610868578063715018a6146108a557806375604153146108bc5761036b565b80633ccfd60b116102a0578063518302271161023e5780635c975abb116102185780635c975abb146107aa57806362b99ad4146107d557806363427fde146108005780636352211e1461082b5761036b565b8063518302271461072957806353edc614146107545780635503a0e81461077f5761036b565b8063438b63001161027a578063438b63001461067157806344a0d68a146106ae5780634fdd43cb146106d757806350baa622146107005761036b565b80633ccfd60b14610606578063424c414d1461061d57806342842e0e146106485761036b565b806318160ddd1161030d57806323b872dd116102e757806323b872dd1461054e57806326a4e8d2146105775780633af32abf146105a05780633c952764146105dd5761036b565b806318160ddd146104bb57806318cae269146104e6578063207b94db146105235761036b565b8063095ea7b311610349578063095ea7b31461041557806313faede61461043e57806316ba10e01461046957806316c38b3c146104925761036b565b806301ffc9a71461037057806306fdde03146103ad578063081812fc146103d8575b600080fd5b34801561037c57600080fd5b5061039760048036038101906103929190613e61565b610d2a565b6040516103a491906145b0565b60405180910390f35b3480156103b957600080fd5b506103c2610e0c565b6040516103cf91906145cb565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa9190613ef4565b610e9e565b60405161040c919061449e565b60405180910390f35b34801561042157600080fd5b5061043c60048036038101906104379190613d8e565b610ee4565b005b34801561044a57600080fd5b50610453610ffc565b604051610460919061488d565b60405180910390f35b34801561047557600080fd5b50610490600480360381019061048b9190613eb3565b611002565b005b34801561049e57600080fd5b506104b960048036038101906104b49190613e0f565b611024565b005b3480156104c757600080fd5b506104d0611049565b6040516104dd919061488d565b60405180910390f35b3480156104f257600080fd5b5061050d60048036038101906105089190613c23565b61105a565b60405161051a919061488d565b60405180910390f35b34801561052f57600080fd5b50610538611072565b604051610545919061488d565b60405180910390f35b34801561055a57600080fd5b5061057560048036038101906105709190613c88565b611078565b005b34801561058357600080fd5b5061059e60048036038101906105999190613c23565b6110d8565b005b3480156105ac57600080fd5b506105c760048036038101906105c29190613c23565b611124565b6040516105d491906145b0565b60405180910390f35b3480156105e957600080fd5b5061060460048036038101906105ff9190613e0f565b6111f9565b005b34801561061257600080fd5b5061061b61121e565b005b34801561062957600080fd5b506106326112a6565b60405161063f919061488d565b60405180910390f35b34801561065457600080fd5b5061066f600480360381019061066a9190613c88565b6112ac565b005b34801561067d57600080fd5b5061069860048036038101906106939190613c23565b6112cc565b6040516106a5919061458e565b60405180910390f35b3480156106ba57600080fd5b506106d560048036038101906106d09190613ef4565b611423565b005b3480156106e357600080fd5b506106fe60048036038101906106f99190613eb3565b611435565b005b34801561070c57600080fd5b5061072760048036038101906107229190613ef4565b611457565b005b34801561073557600080fd5b5061073e6115af565b60405161074b91906145b0565b60405180910390f35b34801561076057600080fd5b506107696115c2565b604051610776919061488d565b60405180910390f35b34801561078b57600080fd5b50610794611676565b6040516107a191906145cb565b60405180910390f35b3480156107b657600080fd5b506107bf611704565b6040516107cc91906145b0565b60405180910390f35b3480156107e157600080fd5b506107ea611717565b6040516107f791906145cb565b60405180910390f35b34801561080c57600080fd5b506108156117a5565b604051610822919061488d565b60405180910390f35b34801561083757600080fd5b50610852600480360381019061084d9190613ef4565b6117ab565b60405161085f919061449e565b60405180910390f35b34801561087457600080fd5b5061088f600480360381019061088a9190613c23565b611832565b60405161089c919061488d565b60405180910390f35b3480156108b157600080fd5b506108ba6118ea565b005b3480156108c857600080fd5b506108e360048036038101906108de9190613ef4565b6118fe565b005b3480156108f157600080fd5b5061090c60048036038101906109079190613eb3565b611910565b005b34801561091a57600080fd5b5061093560048036038101906109309190613ef4565b611932565b005b34801561094357600080fd5b5061094c611944565b604051610959919061449e565b60405180910390f35b34801561096e57600080fd5b5061097761196e565b604051610984919061488d565b60405180910390f35b34801561099957600080fd5b506109a2611974565b6040516109af919061488d565b60405180910390f35b3480156109c457600080fd5b506109cd61197a565b6040516109da91906145cb565b60405180910390f35b3480156109ef57600080fd5b506109f8611a0c565b604051610a0591906145b0565b60405180910390f35b610a286004803603810190610a239190613ef4565b611a1f565b005b348015610a3657600080fd5b50610a516004803603810190610a4c9190613d52565b611d3e565b005b348015610a5f57600080fd5b50610a68611d54565b604051610a7591906145cb565b60405180910390f35b348015610a8a57600080fd5b50610aa56004803603810190610aa09190613ef4565b611de2565b005b348015610ab357600080fd5b50610ace6004803603810190610ac99190613cd7565b611df4565b005b348015610adc57600080fd5b50610af76004803603810190610af29190613ef4565b611e56565b604051610b04919061449e565b60405180910390f35b348015610b1957600080fd5b50610b346004803603810190610b2f9190613ef4565b611e95565b005b348015610b4257600080fd5b50610b5d6004803603810190610b589190613ef4565b611ea7565b604051610b6a91906145cb565b60405180910390f35b348015610b7f57600080fd5b50610b9a6004803603810190610b959190613ef4565b612000565b005b348015610ba857600080fd5b50610bc36004803603810190610bbe9190613f46565b612012565b005b348015610bd157600080fd5b50610bda612028565b604051610be7919061488d565b60405180910390f35b348015610bfc57600080fd5b50610c176004803603810190610c129190613e0f565b61202e565b005b348015610c2557600080fd5b50610c406004803603810190610c3b9190613c4c565b612053565b604051610c4d91906145b0565b60405180910390f35b610c706004803603810190610c6b9190613ef4565b6120e7565b005b348015610c7e57600080fd5b50610c996004803603810190610c949190613dca565b612439565b005b348015610ca757600080fd5b50610cc26004803603810190610cbd9190613f46565b612465565b005b348015610cd057600080fd5b50610ceb6004803603810190610ce69190613c23565b6125bc565b604051610cf891906145b0565b60405180910390f35b348015610d0d57600080fd5b50610d286004803603810190610d239190613c23565b6125db565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610df557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e055750610e048261265f565b5b9050919050565b606060008054610e1b90614b65565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4790614b65565b8015610e945780601f10610e6957610100808354040283529160200191610e94565b820191906000526020600020905b815481529060010190602001808311610e7757829003601f168201915b5050505050905090565b6000610ea9826126c9565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610eef826117ab565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f57906147ed565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610f7f612714565b73ffffffffffffffffffffffffffffffffffffffff161480610fae5750610fad81610fa8612714565b612053565b5b610fed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe49061482d565b60405180910390fd5b610ff7838361271c565b505050565b600b5481565b61100a6127d5565b8060099080519060200190611020929190613912565b5050565b61102c6127d5565b80601260006101000a81548160ff02191690831515021790555050565b60006110556007612853565b905090565b60146020528060005260406000206000915090505481565b600f5481565b611089611083612714565b82612861565b6110c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bf906145ed565b60405180910390fd5b6110d38383836128f6565b505050565b6110e06127d5565b80601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600090505b6013805490508110156111ee578273ffffffffffffffffffffffffffffffffffffffff166013828154811061118a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156111db5760019150506111f4565b80806111e690614bc8565b91505061112c565b50600090505b919050565b6112016127d5565b80601260026101000a81548160ff02191690831515021790555050565b6112266127d5565b6000611230611944565b73ffffffffffffffffffffffffffffffffffffffff164760405161125390614489565b60006040518083038185875af1925050503d8060008114611290576040519150601f19603f3d011682016040523d82523d6000602084013e611295565b606091505b50509050806112a357600080fd5b50565b60105481565b6112c783838360405180602001604052806000815250611df4565b505050565b606060006112d983611832565b905060008167ffffffffffffffff81111561131d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561134b5781602001602082028036833780820191505090505b50905060006001905060005b83811080156113685750600d548211155b15611417576000611378836117ab565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561140357828483815181106113e8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505081806113ff90614bc8565b9250505b828061140e90614bc8565b93505050611357565b82945050505050919050565b61142b6127d5565b80600b8190555050565b61143d6127d5565b80600a9080519060200190611453929190613912565b5050565b61145f6127d5565b6000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663095ea7b330846040518363ffffffff1660e01b81526004016114c1929190614565565b602060405180830381600087803b1580156114db57600080fd5b505af11580156114ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115139190613e38565b508073ffffffffffffffffffffffffffffffffffffffff166323b872dd30611539611944565b856040518463ffffffff1660e01b8152600401611558939291906144e2565b602060405180830381600087803b15801561157257600080fd5b505af1158015611586573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115aa9190613e38565b505050565b601260019054906101000a900460ff1681565b6000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b81526004016116219291906144b9565b60206040518083038186803b15801561163957600080fd5b505afa15801561164d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116719190613f1d565b905090565b6009805461168390614b65565b80601f01602080910402602001604051908101604052809291908181526020018280546116af90614b65565b80156116fc5780601f106116d1576101008083540402835291602001916116fc565b820191906000526020600020905b8154815290600101906020018083116116df57829003601f168201915b505050505081565b601260009054906101000a900460ff1681565b6008805461172490614b65565b80601f016020809104026020016040519081016040528092919081815260200182805461175090614b65565b801561179d5780601f106117725761010080835404028352916020019161179d565b820191906000526020600020905b81548152906001019060200180831161178057829003601f168201915b505050505081565b60115481565b6000806117b783612bf0565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611829576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611820906147cd565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189a9061470d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6118f26127d5565b6118fc6000612c2d565b565b6119066127d5565b8060118190555050565b6119186127d5565b806008908051906020019061192e929190613912565b5050565b61193a6127d5565b8060108190555050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600c5481565b600e5481565b60606001805461198990614b65565b80601f01602080910402602001604051908101604052809291908181526020018280546119b590614b65565b8015611a025780601f106119d757610100808354040283529160200191611a02565b820191906000526020600020905b8154815290600101906020018083116119e557829003601f168201915b5050505050905090565b601260029054906101000a900460ff1681565b80600081118015611a325750600e548111155b611a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a689061468d565b60405180910390fd5b600d5481611a7f6007612853565b611a8991906149cb565b1115611aca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac19061480d565b60405180910390fd5b6000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600f548282611b1d91906149cb565b1115611b5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b559061478d565b60405180910390fd5b601260009054906101000a900460ff1615611bae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba59061476d565b60405180910390fd5b82600b54611bbc9190614a21565b341015611bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf59061484d565b60405180910390fd5b611c06611944565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c9e5760011515601260029054906101000a900460ff1615151415611c9d57611c5d33611124565b611c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c93906146ed565b60405180910390fd5b5b5b611ca83384612cf3565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f19336011546040518363ffffffff1660e01b8152600401611d07929190614565565b600060405180830381600087803b158015611d2157600080fd5b505af1158015611d35573d6000803e3d6000fd5b50505050505050565b611d50611d49612714565b8383612d88565b5050565b600a8054611d6190614b65565b80601f0160208091040260200160405190810160405280929190818152602001828054611d8d90614b65565b8015611dda5780601f10611daf57610100808354040283529160200191611dda565b820191906000526020600020905b815481529060010190602001808311611dbd57829003601f168201915b505050505081565b611dea6127d5565b80600e8190555050565b611e05611dff612714565b83612861565b611e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3b906145ed565b60405180910390fd5b611e5084848484612ef5565b50505050565b60138181548110611e6657600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611e9d6127d5565b80600c8190555050565b6060611eb282612f51565b611ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee8906147ad565b60405180910390fd5b60001515601260019054906101000a900460ff1615151415611f9f57600a8054611f1a90614b65565b80601f0160208091040260200160405190810160405280929190818152602001828054611f4690614b65565b8015611f935780601f10611f6857610100808354040283529160200191611f93565b820191906000526020600020905b815481529060010190602001808311611f7657829003601f168201915b50505050509050611ffb565b6000611fa9612f92565b90506000815111611fc95760405180602001604052806000815250611ff7565b80611fd384613024565b6009604051602001611fe793929190614458565b6040516020818303038152906040525b9150505b919050565b6120086127d5565b80600f8190555050565b61201a6127d5565b6120248183612cf3565b5050565b600d5481565b6120366127d5565b80601260016101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b806000811180156120fa5750600e548111155b612139576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121309061468d565b60405180910390fd5b600d54816121476007612853565b61215191906149cb565b1115612192576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121899061480d565b60405180910390fd5b6000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600f5482826121e591906149cb565b1115612226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221d9061478d565b60405180910390fd5b6000612230612714565b9050601260009054906101000a900460ff1615612282576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122799061476d565b60405180910390fd5b61228a6115c2565b600c54856122989190614a21565b10156122d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d09061486d565b60405180910390fd5b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8230600c54886123279190614a21565b6040518463ffffffff1660e01b8152600401612345939291906144e2565b602060405180830381600087803b15801561235f57600080fd5b505af1158015612373573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123979190613e38565b506123a28185612cf3565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f19336011546040518363ffffffff1660e01b8152600401612401929190614565565b600060405180830381600087803b15801561241b57600080fd5b505af115801561242f573d6000803e3d6000fd5b5050505050505050565b6124416127d5565b6013600061244f9190613998565b8181601391906124609291906139b9565b505050565b816000811180156124785750600e548111155b6124b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ae9061468d565b60405180910390fd5b600d54816124c56007612853565b6124cf91906149cb565b1115612510576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125079061480d565b60405180910390fd5b6000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600f54828261256391906149cb565b11156125a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259b9061478d565b60405180910390fd5b6125ac6127d5565b6125b68385612cf3565b50505050565b60006125c66127d5565b6125d282601054612cf3565b60019050919050565b6125e36127d5565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612653576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264a9061462d565b60405180910390fd5b61265c81612c2d565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6126d281612f51565b612711576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612708906147cd565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661278f836117ab565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6127dd612714565b73ffffffffffffffffffffffffffffffffffffffff166127fb611944565b73ffffffffffffffffffffffffffffffffffffffff1614612851576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128489061474d565b60405180910390fd5b565b600081600001549050919050565b60008061286d836117ab565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806128af57506128ae8185612053565b5b806128ed57508373ffffffffffffffffffffffffffffffffffffffff166128d584610e9e565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612916826117ab565b73ffffffffffffffffffffffffffffffffffffffff161461296c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129639061464d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d3906146ad565b60405180910390fd5b6129e98383836001613148565b8273ffffffffffffffffffffffffffffffffffffffff16612a09826117ab565b73ffffffffffffffffffffffffffffffffffffffff1614612a5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a569061464d565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612beb838383600161326e565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60005b81811015612d8357601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190612d4e90614bc8565b9190505550612d5d6007613274565b612d7083612d6b6007612853565b61328a565b8080612d7b90614bc8565b915050612cf6565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612df7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dee906146cd565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612ee891906145b0565b60405180910390a3505050565b612f008484846128f6565b612f0c848484846132a8565b612f4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f429061460d565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff16612f7383612bf0565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b606060088054612fa190614b65565b80601f0160208091040260200160405190810160405280929190818152602001828054612fcd90614b65565b801561301a5780601f10612fef5761010080835404028352916020019161301a565b820191906000526020600020905b815481529060010190602001808311612ffd57829003601f168201915b5050505050905090565b6060600060016130338461343f565b01905060008167ffffffffffffffff811115613078577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156130aa5781602001600182028036833780820191505090505b509050600082602001820190505b60011561313d578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581613127577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b04945060008514156131385761313d565b6130b8565b819350505050919050565b600181111561326857600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146131dc5780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131d49190614a7b565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146132675780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461325f91906149cb565b925050819055505b5b50505050565b50505050565b6001816000016000828254019250508190555050565b6132a4828260405180602001604052806000815250613676565b5050565b60006132c98473ffffffffffffffffffffffffffffffffffffffff166136d1565b15613432578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026132f2612714565b8786866040518563ffffffff1660e01b81526004016133149493929190614519565b602060405180830381600087803b15801561332e57600080fd5b505af192505050801561335f57506040513d601f19601f8201168201806040525081019061335c9190613e8a565b60015b6133e2573d806000811461338f576040519150601f19603f3d011682016040523d82523d6000602084013e613394565b606091505b506000815114156133da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133d19061460d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613437565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106134c3577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816134b9577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613526576d04ee2d6d415b85acef8100000000838161351c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506020810190505b662386f26fc10000831061357b57662386f26fc100008381613571577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506010810190505b6305f5e10083106135ca576305f5e10083816135c0577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506008810190505b612710831061361557612710838161360b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506004810190505b6064831061365e5760648381613654577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b0492506002810190505b600a831061366d576001810190505b80915050919050565b61368083836136f4565b61368d60008484846132a8565b6136cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136c39061460d565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613764576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161375b9061472d565b60405180910390fd5b61376d81612f51565b156137ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137a49061466d565b60405180910390fd5b6137bb600083836001613148565b6137c481612f51565b15613804576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137fb9061466d565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461390e60008383600161326e565b5050565b82805461391e90614b65565b90600052602060002090601f0160209004810192826139405760008555613987565b82601f1061395957805160ff1916838001178555613987565b82800160010185558215613987579182015b8281111561398657825182559160200191906001019061396b565b5b5090506139949190613a59565b5090565b50805460008255906000526020600020908101906139b69190613a59565b50565b828054828255906000526020600020908101928215613a48579160200282015b82811115613a4757823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906139d9565b5b509050613a559190613a59565b5090565b5b80821115613a72576000816000905550600101613a5a565b5090565b6000613a89613a84846148cd565b6148a8565b905082815260208101848484011115613aa157600080fd5b613aac848285614b23565b509392505050565b6000613ac7613ac2846148fe565b6148a8565b905082815260208101848484011115613adf57600080fd5b613aea848285614b23565b509392505050565b600081359050613b018161518b565b92915050565b60008083601f840112613b1957600080fd5b8235905067ffffffffffffffff811115613b3257600080fd5b602083019150836020820283011115613b4a57600080fd5b9250929050565b600081359050613b60816151a2565b92915050565b600081519050613b75816151a2565b92915050565b600081359050613b8a816151b9565b92915050565b600081519050613b9f816151b9565b92915050565b600082601f830112613bb657600080fd5b8135613bc6848260208601613a76565b91505092915050565b600082601f830112613be057600080fd5b8135613bf0848260208601613ab4565b91505092915050565b600081359050613c08816151d0565b92915050565b600081519050613c1d816151d0565b92915050565b600060208284031215613c3557600080fd5b6000613c4384828501613af2565b91505092915050565b60008060408385031215613c5f57600080fd5b6000613c6d85828601613af2565b9250506020613c7e85828601613af2565b9150509250929050565b600080600060608486031215613c9d57600080fd5b6000613cab86828701613af2565b9350506020613cbc86828701613af2565b9250506040613ccd86828701613bf9565b9150509250925092565b60008060008060808587031215613ced57600080fd5b6000613cfb87828801613af2565b9450506020613d0c87828801613af2565b9350506040613d1d87828801613bf9565b925050606085013567ffffffffffffffff811115613d3a57600080fd5b613d4687828801613ba5565b91505092959194509250565b60008060408385031215613d6557600080fd5b6000613d7385828601613af2565b9250506020613d8485828601613b51565b9150509250929050565b60008060408385031215613da157600080fd5b6000613daf85828601613af2565b9250506020613dc085828601613bf9565b9150509250929050565b60008060208385031215613ddd57600080fd5b600083013567ffffffffffffffff811115613df757600080fd5b613e0385828601613b07565b92509250509250929050565b600060208284031215613e2157600080fd5b6000613e2f84828501613b51565b91505092915050565b600060208284031215613e4a57600080fd5b6000613e5884828501613b66565b91505092915050565b600060208284031215613e7357600080fd5b6000613e8184828501613b7b565b91505092915050565b600060208284031215613e9c57600080fd5b6000613eaa84828501613b90565b91505092915050565b600060208284031215613ec557600080fd5b600082013567ffffffffffffffff811115613edf57600080fd5b613eeb84828501613bcf565b91505092915050565b600060208284031215613f0657600080fd5b6000613f1484828501613bf9565b91505092915050565b600060208284031215613f2f57600080fd5b6000613f3d84828501613c0e565b91505092915050565b60008060408385031215613f5957600080fd5b6000613f6785828601613bf9565b9250506020613f7885828601613af2565b9150509250929050565b6000613f8e838361443a565b60208301905092915050565b613fa381614aaf565b82525050565b6000613fb482614954565b613fbe8185614982565b9350613fc98361492f565b8060005b83811015613ffa578151613fe18882613f82565b9750613fec83614975565b925050600181019050613fcd565b5085935050505092915050565b61401081614ac1565b82525050565b60006140218261495f565b61402b8185614993565b935061403b818560208601614b32565b61404481614c9e565b840191505092915050565b600061405a8261496a565b61406481856149af565b9350614074818560208601614b32565b61407d81614c9e565b840191505092915050565b60006140938261496a565b61409d81856149c0565b93506140ad818560208601614b32565b80840191505092915050565b600081546140c681614b65565b6140d081866149c0565b945060018216600081146140eb57600181146140fc5761412f565b60ff1983168652818601935061412f565b6141058561493f565b60005b8381101561412757815481890152600182019150602081019050614108565b838801955050505b50505092915050565b6000614145602d836149af565b915061415082614caf565b604082019050919050565b60006141686032836149af565b915061417382614cfe565b604082019050919050565b600061418b6026836149af565b915061419682614d4d565b604082019050919050565b60006141ae6025836149af565b91506141b982614d9c565b604082019050919050565b60006141d1601c836149af565b91506141dc82614deb565b602082019050919050565b60006141f46014836149af565b91506141ff82614e14565b602082019050919050565b60006142176024836149af565b915061422282614e3d565b604082019050919050565b600061423a6019836149af565b915061424582614e8c565b602082019050919050565b600061425d6017836149af565b915061426882614eb5565b602082019050919050565b60006142806029836149af565b915061428b82614ede565b604082019050919050565b60006142a36020836149af565b91506142ae82614f2d565b602082019050919050565b60006142c66020836149af565b91506142d182614f56565b602082019050919050565b60006142e96017836149af565b91506142f482614f7f565b602082019050919050565b600061430c6011836149af565b915061431782614fa8565b602082019050919050565b600061432f602f836149af565b915061433a82614fd1565b604082019050919050565b60006143526018836149af565b915061435d82615020565b602082019050919050565b60006143756021836149af565b915061438082615049565b604082019050919050565b60006143986000836149a4565b91506143a382615098565b600082019050919050565b60006143bb6014836149af565b91506143c68261509b565b602082019050919050565b60006143de603d836149af565b91506143e9826150c4565b604082019050919050565b60006144016013836149af565b915061440c82615113565b602082019050919050565b60006144246024836149af565b915061442f8261513c565b604082019050919050565b61444381614b19565b82525050565b61445281614b19565b82525050565b60006144648286614088565b91506144708285614088565b915061447c82846140b9565b9150819050949350505050565b60006144948261438b565b9150819050919050565b60006020820190506144b36000830184613f9a565b92915050565b60006040820190506144ce6000830185613f9a565b6144db6020830184613f9a565b9392505050565b60006060820190506144f76000830186613f9a565b6145046020830185613f9a565b6145116040830184614449565b949350505050565b600060808201905061452e6000830187613f9a565b61453b6020830186613f9a565b6145486040830185614449565b818103606083015261455a8184614016565b905095945050505050565b600060408201905061457a6000830185613f9a565b6145876020830184614449565b9392505050565b600060208201905081810360008301526145a88184613fa9565b905092915050565b60006020820190506145c56000830184614007565b92915050565b600060208201905081810360008301526145e5818461404f565b905092915050565b6000602082019050818103600083015261460681614138565b9050919050565b600060208201905081810360008301526146268161415b565b9050919050565b600060208201905081810360008301526146468161417e565b9050919050565b60006020820190508181036000830152614666816141a1565b9050919050565b60006020820190508181036000830152614686816141c4565b9050919050565b600060208201905081810360008301526146a6816141e7565b9050919050565b600060208201905081810360008301526146c68161420a565b9050919050565b600060208201905081810360008301526146e68161422d565b9050919050565b6000602082019050818103600083015261470681614250565b9050919050565b6000602082019050818103600083015261472681614273565b9050919050565b6000602082019050818103600083015261474681614296565b9050919050565b60006020820190508181036000830152614766816142b9565b9050919050565b60006020820190508181036000830152614786816142dc565b9050919050565b600060208201905081810360008301526147a6816142ff565b9050919050565b600060208201905081810360008301526147c681614322565b9050919050565b600060208201905081810360008301526147e681614345565b9050919050565b6000602082019050818103600083015261480681614368565b9050919050565b60006020820190508181036000830152614826816143ae565b9050919050565b60006020820190508181036000830152614846816143d1565b9050919050565b60006020820190508181036000830152614866816143f4565b9050919050565b6000602082019050818103600083015261488681614417565b9050919050565b60006020820190506148a26000830184614449565b92915050565b60006148b26148c3565b90506148be8282614b97565b919050565b6000604051905090565b600067ffffffffffffffff8211156148e8576148e7614c6f565b5b6148f182614c9e565b9050602081019050919050565b600067ffffffffffffffff82111561491957614918614c6f565b5b61492282614c9e565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006149d682614b19565b91506149e183614b19565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614a1657614a15614c11565b5b828201905092915050565b6000614a2c82614b19565b9150614a3783614b19565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a7057614a6f614c11565b5b828202905092915050565b6000614a8682614b19565b9150614a9183614b19565b925082821015614aa457614aa3614c11565b5b828203905092915050565b6000614aba82614af9565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614b50578082015181840152602081019050614b35565b83811115614b5f576000848401525b50505050565b60006002820490506001821680614b7d57607f821691505b60208210811415614b9157614b90614c40565b5b50919050565b614ba082614c9e565b810181811067ffffffffffffffff82111715614bbf57614bbe614c6f565b5b80604052505050565b6000614bd382614b19565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c0657614c05614c11565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f55736572206973206e6f742077686974656c6973746564000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f4f7665722057616c6c6574204c696d6974000000000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b7f506c6561736520617070726f766520746f6b656e73206265666f7265206d696e60008201527f74696e6700000000000000000000000000000000000000000000000000000000602082015250565b61519481614aaf565b811461519f57600080fd5b50565b6151ab81614ac1565b81146151b657600080fd5b50565b6151c281614acd565b81146151cd57600080fd5b50565b6151d981614b19565b81146151e457600080fd5b5056fea264697066735822122067fbf00be92f881f7f2160514667ecb8d96adedf07fc0dab33881831e13d14e064736f6c63430008040033

Deployed Bytecode Sourcemap

99328:8351:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81688:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82616:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84128:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83646:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;99599:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;106125:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;106348:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;101174:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100050:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;99767:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84828:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;105085:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;102968:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;106239:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;106439:327;;;;;;;;;;;;;:::i;:::-;;99810:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85234:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;103250:743;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;104997:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;105842:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;106774:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;99928:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;102451:137;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;99521:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;99896:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;99486:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;99857:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82326:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82057:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48857:103;;;;;;;;;;;;;:::i;:::-;;105313:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;106011:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;105550:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48209:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;99639:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;99723:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82785:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;99962:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;101277:548;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84371:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;99561:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;105675:159;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85490:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100006:37;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;105205:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;104001:727;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;105433:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;102797:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;99684:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;104902:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84597:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;101833:610;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;107522:154;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;102596:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;104736:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49115:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81688:305;81790:4;81842:25;81827:40;;;:11;:40;;;;:105;;;;81899:33;81884:48;;;:11;:48;;;;81827:105;:158;;;;81949:36;81973:11;81949:23;:36::i;:::-;81827:158;81807:178;;81688:305;;;:::o;82616:100::-;82670:13;82703:5;82696:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82616:100;:::o;84128:171::-;84204:7;84224:23;84239:7;84224:14;:23::i;:::-;84267:15;:24;84283:7;84267:24;;;;;;;;;;;;;;;;;;;;;84260:31;;84128:171;;;:::o;83646:416::-;83727:13;83743:23;83758:7;83743:14;:23::i;:::-;83727:39;;83791:5;83785:11;;:2;:11;;;;83777:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;83885:5;83869:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;83894:37;83911:5;83918:12;:10;:12::i;:::-;83894:16;:37::i;:::-;83869:62;83847:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;84033:21;84042:2;84046:7;84033:8;:21::i;:::-;83646:416;;;:::o;99599:33::-;;;;:::o;106125:106::-;48095:13;:11;:13::i;:::-;106213:10:::1;106201:9;:22;;;;;;;;;;;;:::i;:::-;;106125:106:::0;:::o;106348:83::-;48095:13;:11;:13::i;:::-;106417:6:::1;106408;;:15;;;;;;;;;;;;;;;;;;106348:83:::0;:::o;101174:95::-;101218:7;101245:16;:6;:14;:16::i;:::-;101238:23;;101174:95;:::o;100050:55::-;;;;;;;;;;;;;;;;;:::o;99767:36::-;;;;:::o;84828:335::-;85023:41;85042:12;:10;:12::i;:::-;85056:7;85023:18;:41::i;:::-;85015:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;85127:28;85137:4;85143:2;85147:7;85127:9;:28::i;:::-;84828:335;;;:::o;105085:112::-;48095:13;:11;:13::i;:::-;105176::::1;105161:12;;:28;;;;;;;;;;;;;;;;;;105085:112:::0;:::o;102968:274::-;103027:4;103049:9;103061:1;103049:13;;103044:168;103068:20;:27;;;;103064:1;:31;103044:168;;;103148:5;103121:32;;:20;103142:1;103121:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:32;;;103117:84;;;103181:4;103174:11;;;;;103117:84;103097:3;;;;;:::i;:::-;;;;103044:168;;;;103229:5;103222:12;;102968:274;;;;:::o;106239:101::-;48095:13;:11;:13::i;:::-;106326:6:::1;106308:15;;:24;;;;;;;;;;;;;;;;;;106239:101:::0;:::o;106439:327::-;48095:13;:11;:13::i;:::-;106578:7:::1;106599;:5;:7::i;:::-;106591:21;;106620;106591:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;106577:69;;;106665:2;106657:11;;;::::0;::::1;;48119:1;106439:327::o:0;99810:40::-;;;;:::o;85234:185::-;85372:39;85389:4;85395:2;85399:7;85372:39;;;;;;;;;;;;:16;:39::i;:::-;85234:185;;;:::o;103250:743::-;103337:16;103371:23;103397:17;103407:6;103397:9;:17::i;:::-;103371:43;;103425:30;103472:15;103458:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;103425:63;;103499:22;103524:1;103499:26;;103536:23;103576:377;103615:15;103597;:33;:64;;;;;103652:9;;103634:14;:27;;103597:64;103576:377;;;103688:25;103716:23;103724:14;103716:7;:23::i;:::-;103688:51;;103781:6;103760:27;;:17;:27;;;103756:153;;;103841:14;103808:13;103822:15;103808:30;;;;;;;;;;;;;;;;;;;;;:47;;;;;103876:17;;;;;:::i;:::-;;;;103756:153;103925:16;;;;;:::i;:::-;;;;103576:377;;;;103972:13;103965:20;;;;;;103250:743;;;:::o;104997:80::-;48095:13;:11;:13::i;:::-;105064:5:::1;105057:4;:12;;;;104997:80:::0;:::o;105842:161::-;48095:13;:11;:13::i;:::-;105977:18:::1;105957:17;:38;;;;;;;;;;;;:::i;:::-;;105842:161:::0;:::o;106774:339::-;48095:13;:11;:13::i;:::-;106844:20:::1;106874:12;;;;;;;;;;;106844:43;;106990:13;:21;;;107020:4;107027:7;106990:45;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;107046:13;:26;;;107081:4;107088:7;:5;:7::i;:::-;107097;107046:59;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;48119:1;106774:339:::0;:::o;99928:27::-;;;;;;;;;;;;;:::o;102451:137::-;102496:7;102530:12;;;;;;;;;;;102523:30;;;102554:10;102574:4;102523:57;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;102516:64;;102451:137;:::o;99521:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;99896:25::-;;;;;;;;;;;;;:::o;99486:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;99857:32::-;;;;:::o;82326:223::-;82398:7;82418:13;82434:17;82443:7;82434:8;:17::i;:::-;82418:33;;82487:1;82470:19;;:5;:19;;;;82462:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;82536:5;82529:12;;;82326:223;;;:::o;82057:207::-;82129:7;82174:1;82157:19;;:5;:19;;;;82149:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;82240:9;:16;82250:5;82240:16;;;;;;;;;;;;;;;;82233:23;;82057:207;;;:::o;48857:103::-;48095:13;:11;:13::i;:::-;48922:30:::1;48949:1;48922:18;:30::i;:::-;48857:103::o:0;105313:112::-;48095:13;:11;:13::i;:::-;105406:11:::1;105390:13;:27;;;;105313:112:::0;:::o;106011:106::-;48095:13;:11;:13::i;:::-;106099:10:::1;106087:9;:22;;;;;;;;;;;;:::i;:::-;;106011:106:::0;:::o;105550:117::-;48095:13;:11;:13::i;:::-;105653:6:::1;105629:21;:30;;;;105550:117:::0;:::o;48209:87::-;48255:7;48282:6;;;;;;;;;;;48275:13;;48209:87;:::o;99639:38::-;;;;:::o;99723:37::-;;;;:::o;82785:104::-;82841:13;82874:7;82867:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82785:104;:::o;99962:35::-;;;;;;;;;;;;;:::o;101277:548::-;101369:11;100737:1;100723:11;:15;:52;;;;;100757:18;;100742:11;:33;;100723:52;100701:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;100890:9;;100875:11;100856:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;100834:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;100958:24;100985:20;:32;101006:10;100985:32;;;;;;;;;;;;;;;;100958:59;;101084:17;;101069:11;101050:16;:30;;;;:::i;:::-;:51;;101028:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;101407:6:::1;;;;;;;;;;;101406:7;101398:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;101480:11;101473:4;;:18;;;;:::i;:::-;101460:9;:31;;101452:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;101544:7;:5;:7::i;:::-;101530:21;;:10;:21;;;101526:178;;101591:4;101572:23;;:15;;;;;;;;;;;:23;;;101568:125;;;101624:25;101638:10;101624:13;:25::i;:::-;101616:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;101568:125;101526:178;101714:34;101724:10;101736:11;101714:9;:34::i;:::-;101771:13;;;;;;;;;;;101759:31;;;101791:10;101803:13;;101759:58;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;101277:548:::0;;;:::o;84371:155::-;84466:52;84485:12;:10;:12::i;:::-;84499:8;84509;84466:18;:52::i;:::-;84371:155;;:::o;99561:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;105675:159::-;48095:13;:11;:13::i;:::-;105807:19:::1;105786:18;:40;;;;105675:159:::0;:::o;85490:322::-;85664:41;85683:12;:10;:12::i;:::-;85697:7;85664:18;:41::i;:::-;85656:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;85766:38;85780:4;85786:2;85790:7;85799:4;85766:13;:38::i;:::-;85490:322;;;;:::o;100006:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;105205:100::-;48095:13;:11;:13::i;:::-;105287:10:::1;105275:9;:22;;;;105205:100:::0;:::o;104001:727::-;104120:13;104173:17;104181:8;104173:7;:17::i;:::-;104151:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;104294:5;104282:17;;:8;;;;;;;;;;;:17;;;104278:74;;;104323:17;104316:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;104278:74;104364:28;104395:10;:8;:10::i;:::-;104364:41;;104467:1;104442:14;104436:28;:32;:284;;;;;;;;;;;;;;;;;104560:14;104601:19;:8;:17;:19::i;:::-;104647:9;104517:162;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;104436:284;104416:304;;;104001:727;;;;:::o;105433:109::-;48095:13;:11;:13::i;:::-;105528:6:::1;105508:17;:26;;;;105433:109:::0;:::o;102797:163::-;48095:13;:11;:13::i;:::-;102919:33:::1;102929:9;102940:11;102919:9;:33::i;:::-;102797:163:::0;;:::o;99684:32::-;;;;:::o;104902:87::-;48095:13;:11;:13::i;:::-;104975:6:::1;104964:8;;:17;;;;;;;;;;;;;;;;;;104902:87:::0;:::o;84597:164::-;84694:4;84718:18;:25;84737:5;84718:25;;;;;;;;;;;;;;;:35;84744:8;84718:35;;;;;;;;;;;;;;;;;;;;;;;;;84711:42;;84597:164;;;;:::o;101833:610::-;101933:11;100737:1;100723:11;:15;:52;;;;;100757:18;;100742:11;:33;;100723:52;100701:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;100890:9;;100875:11;100856:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;100834:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;100958:24;100985:20;:32;101006:10;100985:32;;;;;;;;;;;;;;;;100958:59;;101084:17;;101069:11;101050:16;:30;;;;:::i;:::-;:51;;101028:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;101962:14:::1;101979:12;:10;:12::i;:::-;101962:29;;102011:6;;;;;;;;;;;102010:7;102002:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;102105:14;:12;:14::i;:::-;102092:9;;102078:11;:23;;;;:::i;:::-;:41;;102056:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;102201:12;;;;;;;;;;;102194:33;;;102242:6;102271:4;102305:9;;102291:11;:23;;;;:::i;:::-;102194:131;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;102336:30;102346:6;102354:11;102336:9;:30::i;:::-;102389:13;;;;;;;;;;;102377:31;;;102409:10;102421:13;;102377:58;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;101157:1;101833:610:::0;;;:::o;107522:154::-;48095:13;:11;:13::i;:::-;107608:20:::1;;107601:27;;;;:::i;:::-;107662:6;;107639:20;:29;;;;;;;:::i;:::-;;107522:154:::0;;:::o;102596:193::-;102700:11;100737:1;100723:11;:15;:52;;;;;100757:18;;100742:11;:33;;100723:52;100701:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;100890:9;;100875:11;100856:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;100834:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;100958:24;100985:20;:32;101006:10;100985:32;;;;;;;;;;;;;;;;100958:59;;101084:17;;101069:11;101050:16;:30;;;;:::i;:::-;:51;;101028:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;48095:13:::1;:11;:13::i;:::-;102748:33:::2;102758:9;102769:11;102748:9;:33::i;:::-;102596:193:::0;;;;:::o;104736:158::-;104802:4;48095:13;:11;:13::i;:::-;104819:45:::1;104829:11;104842:21;;104819:9;:45::i;:::-;104882:4;104875:11;;104736:158:::0;;;:::o;49115:201::-;48095:13;:11;:13::i;:::-;49224:1:::1;49204:22;;:8;:22;;;;49196:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;49280:28;49299:8;49280:18;:28::i;:::-;49115:201:::0;:::o;62002:157::-;62087:4;62126:25;62111:40;;;:11;:40;;;;62104:47;;62002:157;;;:::o;93947:135::-;94029:16;94037:7;94029;:16::i;:::-;94021:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;93947:135;:::o;29609:98::-;29662:7;29689:10;29682:17;;29609:98;:::o;93226:174::-;93328:2;93301:15;:24;93317:7;93301:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;93384:7;93380:2;93346:46;;93355:23;93370:7;93355:14;:23::i;:::-;93346:46;;;;;;;;;;;;93226:174;;:::o;48374:132::-;48449:12;:10;:12::i;:::-;48438:23;;:7;:5;:7::i;:::-;:23;;;48430:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48374:132::o;98400:114::-;98465:7;98492;:14;;;98485:21;;98400:114;;;:::o;87845:264::-;87938:4;87955:13;87971:23;87986:7;87971:14;:23::i;:::-;87955:39;;88024:5;88013:16;;:7;:16;;;:52;;;;88033:32;88050:5;88057:7;88033:16;:32::i;:::-;88013:52;:87;;;;88093:7;88069:31;;:20;88081:7;88069:11;:20::i;:::-;:31;;;88013:87;88005:96;;;87845:264;;;;:::o;91844:1263::-;92003:4;91976:31;;:23;91991:7;91976:14;:23::i;:::-;:31;;;91968:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;92082:1;92068:16;;:2;:16;;;;92060:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;92138:42;92159:4;92165:2;92169:7;92178:1;92138:20;:42::i;:::-;92310:4;92283:31;;:23;92298:7;92283:14;:23::i;:::-;:31;;;92275:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;92428:15;:24;92444:7;92428:24;;;;;;;;;;;;92421:31;;;;;;;;;;;92923:1;92904:9;:15;92914:4;92904:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;92956:1;92939:9;:13;92949:2;92939:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;92998:2;92979:7;:16;92987:7;92979:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;93037:7;93033:2;93018:27;;93027:4;93018:27;;;;;;;;;;;;93058:41;93078:4;93084:2;93088:7;93097:1;93058:19;:41::i;:::-;91844:1263;;;:::o;87120:117::-;87186:7;87213;:16;87221:7;87213:16;;;;;;;;;;;;;;;;;;;;;87206:23;;87120:117;;;:::o;49476:191::-;49550:16;49569:6;;;;;;;;;;;49550:25;;49595:8;49586:6;;:17;;;;;;;;;;;;;;;;;;49650:8;49619:40;;49640:8;49619:40;;;;;;;;;;;;49476:191;;:::o;107121:275::-;107205:9;107200:189;107224:11;107220:1;:15;107200:189;;;107257:20;:32;107278:10;107257:32;;;;;;;;;;;;;;;;:34;;;;;;;;;:::i;:::-;;;;;;107306:18;:6;:16;:18::i;:::-;107339:38;107349:9;107360:16;:6;:14;:16::i;:::-;107339:9;:38::i;:::-;107237:3;;;;;:::i;:::-;;;;107200:189;;;;107121:275;;:::o;93543:315::-;93698:8;93689:17;;:5;:17;;;;93681:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;93785:8;93747:18;:25;93766:5;93747:25;;;;;;;;;;;;;;;:35;93773:8;93747:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;93831:8;93809:41;;93824:5;93809:41;;;93841:8;93809:41;;;;;;:::i;:::-;;;;;;;;93543:315;;;:::o;86693:313::-;86849:28;86859:4;86865:2;86869:7;86849:9;:28::i;:::-;86896:47;86919:4;86925:2;86929:7;86938:4;86896:22;:47::i;:::-;86888:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;86693:313;;;;:::o;87550:128::-;87615:4;87668:1;87639:31;;:17;87648:7;87639:8;:17::i;:::-;:31;;;;87632:38;;87550:128;;;:::o;107404:110::-;107464:13;107497:9;107490:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;107404:110;:::o;27036:716::-;27092:13;27143:14;27180:1;27160:17;27171:5;27160:10;:17::i;:::-;:21;27143:38;;27196:20;27230:6;27219:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27196:41;;27252:11;27381:6;27377:2;27373:15;27365:6;27361:28;27354:35;;27418:288;27425:4;27418:288;;;27450:5;;;;;;;;27592:8;27587:2;27580:5;27576:14;27571:30;27566:3;27558:44;27648:2;27639:11;;;;;;;;;;;;;;;;;27682:1;27673:5;:10;27669:21;;;27685:5;;27669:21;27418:288;;;27727:6;27720:13;;;;;27036:716;;;:::o;96231:410::-;96421:1;96409:9;:13;96405:229;;;96459:1;96443:18;;:4;:18;;;96439:87;;96501:9;96482;:15;96492:4;96482:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;96439:87;96558:1;96544:16;;:2;:16;;;96540:83;;96598:9;96581;:13;96591:2;96581:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;96540:83;96405:229;96231:410;;;;:::o;97363:158::-;;;;;:::o;98522:127::-;98629:1;98611:7;:14;;;:19;;;;;;;;;;;98522:127;:::o;88451:110::-;88527:26;88537:2;88541:7;88527:26;;;;;;;;;;;;:9;:26::i;:::-;88451:110;;:::o;94646:853::-;94800:4;94821:15;:2;:13;;;:15::i;:::-;94817:675;;;94873:2;94857:36;;;94894:12;:10;:12::i;:::-;94908:4;94914:7;94923:4;94857:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;94853:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;95115:1;95098:6;:13;:18;95094:328;;;95141:60;;;;;;;;;;:::i;:::-;;;;;;;;95094:328;95372:6;95366:13;95357:6;95353:2;95349:15;95342:38;94853:584;94989:41;;;94979:51;;;:6;:51;;;;94972:58;;;;;94817:675;95476:4;95469:11;;94646:853;;;;;;;:::o;23902:922::-;23955:7;23975:14;23992:1;23975:18;;24042:6;24033:5;:15;24029:102;;24078:6;24069:15;;;;;;;;;;;;;;;;;24113:2;24103:12;;;;24029:102;24158:6;24149:5;:15;24145:102;;24194:6;24185:15;;;;;;;;;;;;;;;;;24229:2;24219:12;;;;24145:102;24274:6;24265:5;:15;24261:102;;24310:6;24301:15;;;;;;;;;;;;;;;;;24345:2;24335:12;;;;24261:102;24390:5;24381;:14;24377:99;;24425:5;24416:14;;;;;;;;;;;;;;;;;24459:1;24449:11;;;;24377:99;24503:5;24494;:14;24490:99;;24538:5;24529:14;;;;;;;;;;;;;;;;;24572:1;24562:11;;;;24490:99;24616:5;24607;:14;24603:99;;24651:5;24642:14;;;;;;;;;;;;;;;;;24685:1;24675:11;;;;24603:99;24729:5;24720;:14;24716:66;;24765:1;24755:11;;;;24716:66;24810:6;24803:13;;;23902:922;;;:::o;88788:319::-;88917:18;88923:2;88927:7;88917:5;:18::i;:::-;88968:53;88999:1;89003:2;89007:7;89016:4;88968:22;:53::i;:::-;88946:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;88788:319;;;:::o;50907:326::-;50967:4;51224:1;51202:7;:19;;;:23;51195:30;;50907:326;;;:::o;89443:942::-;89537:1;89523:16;;:2;:16;;;;89515:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;89596:16;89604:7;89596;:16::i;:::-;89595:17;89587:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;89658:48;89687:1;89691:2;89695:7;89704:1;89658:20;:48::i;:::-;89805:16;89813:7;89805;:16::i;:::-;89804:17;89796:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;90220:1;90203:9;:13;90213:2;90203:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;90264:2;90245:7;:16;90253:7;90245:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;90309:7;90305:2;90284:33;;90301:1;90284:33;;;;;;;;;;;;90330:47;90358:1;90362:2;90366:7;90375:1;90330:19;:47::i;:::-;89443:942;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;869:367::-;942:8;952:6;1002:3;995:4;987:6;983:17;979:27;969:2;;1020:1;1017;1010:12;969:2;1056:6;1043:20;1033:30;;1086:18;1078:6;1075:30;1072:2;;;1118:1;1115;1108:12;1072:2;1155:4;1147:6;1143:17;1131:29;;1209:3;1201:4;1193:6;1189:17;1179:8;1175:32;1172:41;1169:2;;;1226:1;1223;1216:12;1169:2;959:277;;;;;:::o;1242:133::-;1285:5;1323:6;1310:20;1301:29;;1339:30;1363:5;1339:30;:::i;:::-;1291:84;;;;:::o;1381:137::-;1435:5;1466:6;1460:13;1451:22;;1482:30;1506:5;1482:30;:::i;:::-;1441:77;;;;:::o;1524:137::-;1569:5;1607:6;1594:20;1585:29;;1623:32;1649:5;1623:32;:::i;:::-;1575:86;;;;:::o;1667:141::-;1723:5;1754:6;1748:13;1739:22;;1770:32;1796:5;1770:32;:::i;:::-;1729:79;;;;:::o;1827:271::-;1882:5;1931:3;1924:4;1916:6;1912:17;1908:27;1898:2;;1949:1;1946;1939:12;1898:2;1989:6;1976:20;2014:78;2088:3;2080:6;2073:4;2065:6;2061:17;2014:78;:::i;:::-;2005:87;;1888:210;;;;;:::o;2118:273::-;2174:5;2223:3;2216:4;2208:6;2204:17;2200:27;2190:2;;2241:1;2238;2231:12;2190:2;2281:6;2268:20;2306:79;2381:3;2373:6;2366:4;2358:6;2354:17;2306:79;:::i;:::-;2297:88;;2180:211;;;;;:::o;2397:139::-;2443:5;2481:6;2468:20;2459:29;;2497:33;2524:5;2497:33;:::i;:::-;2449:87;;;;:::o;2542:143::-;2599:5;2630:6;2624:13;2615:22;;2646:33;2673:5;2646:33;:::i;:::-;2605:80;;;;:::o;2691:262::-;2750:6;2799:2;2787:9;2778:7;2774:23;2770:32;2767:2;;;2815:1;2812;2805:12;2767:2;2858:1;2883:53;2928:7;2919:6;2908:9;2904:22;2883:53;:::i;:::-;2873:63;;2829:117;2757:196;;;;:::o;2959:407::-;3027:6;3035;3084:2;3072:9;3063:7;3059:23;3055:32;3052:2;;;3100:1;3097;3090:12;3052:2;3143:1;3168:53;3213:7;3204:6;3193:9;3189:22;3168:53;:::i;:::-;3158:63;;3114:117;3270:2;3296:53;3341:7;3332:6;3321:9;3317:22;3296:53;:::i;:::-;3286:63;;3241:118;3042:324;;;;;:::o;3372:552::-;3449:6;3457;3465;3514:2;3502:9;3493:7;3489:23;3485:32;3482:2;;;3530:1;3527;3520:12;3482:2;3573:1;3598:53;3643:7;3634:6;3623:9;3619:22;3598:53;:::i;:::-;3588:63;;3544:117;3700:2;3726:53;3771:7;3762:6;3751:9;3747:22;3726:53;:::i;:::-;3716:63;;3671:118;3828:2;3854:53;3899:7;3890:6;3879:9;3875:22;3854:53;:::i;:::-;3844:63;;3799:118;3472:452;;;;;:::o;3930:809::-;4025:6;4033;4041;4049;4098:3;4086:9;4077:7;4073:23;4069:33;4066:2;;;4115:1;4112;4105:12;4066:2;4158:1;4183:53;4228:7;4219:6;4208:9;4204:22;4183:53;:::i;:::-;4173:63;;4129:117;4285:2;4311:53;4356:7;4347:6;4336:9;4332:22;4311:53;:::i;:::-;4301:63;;4256:118;4413:2;4439:53;4484:7;4475:6;4464:9;4460:22;4439:53;:::i;:::-;4429:63;;4384:118;4569:2;4558:9;4554:18;4541:32;4600:18;4592:6;4589:30;4586:2;;;4632:1;4629;4622:12;4586:2;4660:62;4714:7;4705:6;4694:9;4690:22;4660:62;:::i;:::-;4650:72;;4512:220;4056:683;;;;;;;:::o;4745:401::-;4810:6;4818;4867:2;4855:9;4846:7;4842:23;4838:32;4835:2;;;4883:1;4880;4873:12;4835:2;4926:1;4951:53;4996:7;4987:6;4976:9;4972:22;4951:53;:::i;:::-;4941:63;;4897:117;5053:2;5079:50;5121:7;5112:6;5101:9;5097:22;5079:50;:::i;:::-;5069:60;;5024:115;4825:321;;;;;:::o;5152:407::-;5220:6;5228;5277:2;5265:9;5256:7;5252:23;5248:32;5245:2;;;5293:1;5290;5283:12;5245:2;5336:1;5361:53;5406:7;5397:6;5386:9;5382:22;5361:53;:::i;:::-;5351:63;;5307:117;5463:2;5489:53;5534:7;5525:6;5514:9;5510:22;5489:53;:::i;:::-;5479:63;;5434:118;5235:324;;;;;:::o;5565:425::-;5651:6;5659;5708:2;5696:9;5687:7;5683:23;5679:32;5676:2;;;5724:1;5721;5714:12;5676:2;5795:1;5784:9;5780:17;5767:31;5825:18;5817:6;5814:30;5811:2;;;5857:1;5854;5847:12;5811:2;5893:80;5965:7;5956:6;5945:9;5941:22;5893:80;:::i;:::-;5875:98;;;;5738:245;5666:324;;;;;:::o;5996:256::-;6052:6;6101:2;6089:9;6080:7;6076:23;6072:32;6069:2;;;6117:1;6114;6107:12;6069:2;6160:1;6185:50;6227:7;6218:6;6207:9;6203:22;6185:50;:::i;:::-;6175:60;;6131:114;6059:193;;;;:::o;6258:278::-;6325:6;6374:2;6362:9;6353:7;6349:23;6345:32;6342:2;;;6390:1;6387;6380:12;6342:2;6433:1;6458:61;6511:7;6502:6;6491:9;6487:22;6458:61;:::i;:::-;6448:71;;6404:125;6332:204;;;;:::o;6542:260::-;6600:6;6649:2;6637:9;6628:7;6624:23;6620:32;6617:2;;;6665:1;6662;6655:12;6617:2;6708:1;6733:52;6777:7;6768:6;6757:9;6753:22;6733:52;:::i;:::-;6723:62;;6679:116;6607:195;;;;:::o;6808:282::-;6877:6;6926:2;6914:9;6905:7;6901:23;6897:32;6894:2;;;6942:1;6939;6932:12;6894:2;6985:1;7010:63;7065:7;7056:6;7045:9;7041:22;7010:63;:::i;:::-;7000:73;;6956:127;6884:206;;;;:::o;7096:375::-;7165:6;7214:2;7202:9;7193:7;7189:23;7185:32;7182:2;;;7230:1;7227;7220:12;7182:2;7301:1;7290:9;7286:17;7273:31;7331:18;7323:6;7320:30;7317:2;;;7363:1;7360;7353:12;7317:2;7391:63;7446:7;7437:6;7426:9;7422:22;7391:63;:::i;:::-;7381:73;;7244:220;7172:299;;;;:::o;7477:262::-;7536:6;7585:2;7573:9;7564:7;7560:23;7556:32;7553:2;;;7601:1;7598;7591:12;7553:2;7644:1;7669:53;7714:7;7705:6;7694:9;7690:22;7669:53;:::i;:::-;7659:63;;7615:117;7543:196;;;;:::o;7745:284::-;7815:6;7864:2;7852:9;7843:7;7839:23;7835:32;7832:2;;;7880:1;7877;7870:12;7832:2;7923:1;7948:64;8004:7;7995:6;7984:9;7980:22;7948:64;:::i;:::-;7938:74;;7894:128;7822:207;;;;:::o;8035:407::-;8103:6;8111;8160:2;8148:9;8139:7;8135:23;8131:32;8128:2;;;8176:1;8173;8166:12;8128:2;8219:1;8244:53;8289:7;8280:6;8269:9;8265:22;8244:53;:::i;:::-;8234:63;;8190:117;8346:2;8372:53;8417:7;8408:6;8397:9;8393:22;8372:53;:::i;:::-;8362:63;;8317:118;8118:324;;;;;:::o;8448:179::-;8517:10;8538:46;8580:3;8572:6;8538:46;:::i;:::-;8616:4;8611:3;8607:14;8593:28;;8528:99;;;;:::o;8633:118::-;8720:24;8738:5;8720:24;:::i;:::-;8715:3;8708:37;8698:53;;:::o;8787:732::-;8906:3;8935:54;8983:5;8935:54;:::i;:::-;9005:86;9084:6;9079:3;9005:86;:::i;:::-;8998:93;;9115:56;9165:5;9115:56;:::i;:::-;9194:7;9225:1;9210:284;9235:6;9232:1;9229:13;9210:284;;;9311:6;9305:13;9338:63;9397:3;9382:13;9338:63;:::i;:::-;9331:70;;9424:60;9477:6;9424:60;:::i;:::-;9414:70;;9270:224;9257:1;9254;9250:9;9245:14;;9210:284;;;9214:14;9510:3;9503:10;;8911:608;;;;;;;:::o;9525:109::-;9606:21;9621:5;9606:21;:::i;:::-;9601:3;9594:34;9584:50;;:::o;9640:360::-;9726:3;9754:38;9786:5;9754:38;:::i;:::-;9808:70;9871:6;9866:3;9808:70;:::i;:::-;9801:77;;9887:52;9932:6;9927:3;9920:4;9913:5;9909:16;9887:52;:::i;:::-;9964:29;9986:6;9964:29;:::i;:::-;9959:3;9955:39;9948:46;;9730:270;;;;;:::o;10006:364::-;10094:3;10122:39;10155:5;10122:39;:::i;:::-;10177:71;10241:6;10236:3;10177:71;:::i;:::-;10170:78;;10257:52;10302:6;10297:3;10290:4;10283:5;10279:16;10257:52;:::i;:::-;10334:29;10356:6;10334:29;:::i;:::-;10329:3;10325:39;10318:46;;10098:272;;;;;:::o;10376:377::-;10482:3;10510:39;10543:5;10510:39;:::i;:::-;10565:89;10647:6;10642:3;10565:89;:::i;:::-;10558:96;;10663:52;10708:6;10703:3;10696:4;10689:5;10685:16;10663:52;:::i;:::-;10740:6;10735:3;10731:16;10724:23;;10486:267;;;;;:::o;10783:845::-;10886:3;10923:5;10917:12;10952:36;10978:9;10952:36;:::i;:::-;11004:89;11086:6;11081:3;11004:89;:::i;:::-;10997:96;;11124:1;11113:9;11109:17;11140:1;11135:137;;;;11286:1;11281:341;;;;11102:520;;11135:137;11219:4;11215:9;11204;11200:25;11195:3;11188:38;11255:6;11250:3;11246:16;11239:23;;11135:137;;11281:341;11348:38;11380:5;11348:38;:::i;:::-;11408:1;11422:154;11436:6;11433:1;11430:13;11422:154;;;11510:7;11504:14;11500:1;11495:3;11491:11;11484:35;11560:1;11551:7;11547:15;11536:26;;11458:4;11455:1;11451:12;11446:17;;11422:154;;;11605:6;11600:3;11596:16;11589:23;;11288:334;;11102:520;;10890:738;;;;;;:::o;11634:366::-;11776:3;11797:67;11861:2;11856:3;11797:67;:::i;:::-;11790:74;;11873:93;11962:3;11873:93;:::i;:::-;11991:2;11986:3;11982:12;11975:19;;11780:220;;;:::o;12006:366::-;12148:3;12169:67;12233:2;12228:3;12169:67;:::i;:::-;12162:74;;12245:93;12334:3;12245:93;:::i;:::-;12363:2;12358:3;12354:12;12347:19;;12152:220;;;:::o;12378:366::-;12520:3;12541:67;12605:2;12600:3;12541:67;:::i;:::-;12534:74;;12617:93;12706:3;12617:93;:::i;:::-;12735:2;12730:3;12726:12;12719:19;;12524:220;;;:::o;12750:366::-;12892:3;12913:67;12977:2;12972:3;12913:67;:::i;:::-;12906:74;;12989:93;13078:3;12989:93;:::i;:::-;13107:2;13102:3;13098:12;13091:19;;12896:220;;;:::o;13122:366::-;13264:3;13285:67;13349:2;13344:3;13285:67;:::i;:::-;13278:74;;13361:93;13450:3;13361:93;:::i;:::-;13479:2;13474:3;13470:12;13463:19;;13268:220;;;:::o;13494:366::-;13636:3;13657:67;13721:2;13716:3;13657:67;:::i;:::-;13650:74;;13733:93;13822:3;13733:93;:::i;:::-;13851:2;13846:3;13842:12;13835:19;;13640:220;;;:::o;13866:366::-;14008:3;14029:67;14093:2;14088:3;14029:67;:::i;:::-;14022:74;;14105:93;14194:3;14105:93;:::i;:::-;14223:2;14218:3;14214:12;14207:19;;14012:220;;;:::o;14238:366::-;14380:3;14401:67;14465:2;14460:3;14401:67;:::i;:::-;14394:74;;14477:93;14566:3;14477:93;:::i;:::-;14595:2;14590:3;14586:12;14579:19;;14384:220;;;:::o;14610:366::-;14752:3;14773:67;14837:2;14832:3;14773:67;:::i;:::-;14766:74;;14849:93;14938:3;14849:93;:::i;:::-;14967:2;14962:3;14958:12;14951:19;;14756:220;;;:::o;14982:366::-;15124:3;15145:67;15209:2;15204:3;15145:67;:::i;:::-;15138:74;;15221:93;15310:3;15221:93;:::i;:::-;15339:2;15334:3;15330:12;15323:19;;15128:220;;;:::o;15354:366::-;15496:3;15517:67;15581:2;15576:3;15517:67;:::i;:::-;15510:74;;15593:93;15682:3;15593:93;:::i;:::-;15711:2;15706:3;15702:12;15695:19;;15500:220;;;:::o;15726:366::-;15868:3;15889:67;15953:2;15948:3;15889:67;:::i;:::-;15882:74;;15965:93;16054:3;15965:93;:::i;:::-;16083:2;16078:3;16074:12;16067:19;;15872:220;;;:::o;16098:366::-;16240:3;16261:67;16325:2;16320:3;16261:67;:::i;:::-;16254:74;;16337:93;16426:3;16337:93;:::i;:::-;16455:2;16450:3;16446:12;16439:19;;16244:220;;;:::o;16470:366::-;16612:3;16633:67;16697:2;16692:3;16633:67;:::i;:::-;16626:74;;16709:93;16798:3;16709:93;:::i;:::-;16827:2;16822:3;16818:12;16811:19;;16616:220;;;:::o;16842:366::-;16984:3;17005:67;17069:2;17064:3;17005:67;:::i;:::-;16998:74;;17081:93;17170:3;17081:93;:::i;:::-;17199:2;17194:3;17190:12;17183:19;;16988:220;;;:::o;17214:366::-;17356:3;17377:67;17441:2;17436:3;17377:67;:::i;:::-;17370:74;;17453:93;17542:3;17453:93;:::i;:::-;17571:2;17566:3;17562:12;17555:19;;17360:220;;;:::o;17586:366::-;17728:3;17749:67;17813:2;17808:3;17749:67;:::i;:::-;17742:74;;17825:93;17914:3;17825:93;:::i;:::-;17943:2;17938:3;17934:12;17927:19;;17732:220;;;:::o;17958:398::-;18117:3;18138:83;18219:1;18214:3;18138:83;:::i;:::-;18131:90;;18230:93;18319:3;18230:93;:::i;:::-;18348:1;18343:3;18339:11;18332:18;;18121:235;;;:::o;18362:366::-;18504:3;18525:67;18589:2;18584:3;18525:67;:::i;:::-;18518:74;;18601:93;18690:3;18601:93;:::i;:::-;18719:2;18714:3;18710:12;18703:19;;18508:220;;;:::o;18734:366::-;18876:3;18897:67;18961:2;18956:3;18897:67;:::i;:::-;18890:74;;18973:93;19062:3;18973:93;:::i;:::-;19091:2;19086:3;19082:12;19075:19;;18880:220;;;:::o;19106:366::-;19248:3;19269:67;19333:2;19328:3;19269:67;:::i;:::-;19262:74;;19345:93;19434:3;19345:93;:::i;:::-;19463:2;19458:3;19454:12;19447:19;;19252:220;;;:::o;19478:366::-;19620:3;19641:67;19705:2;19700:3;19641:67;:::i;:::-;19634:74;;19717:93;19806:3;19717:93;:::i;:::-;19835:2;19830:3;19826:12;19819:19;;19624:220;;;:::o;19850:108::-;19927:24;19945:5;19927:24;:::i;:::-;19922:3;19915:37;19905:53;;:::o;19964:118::-;20051:24;20069:5;20051:24;:::i;:::-;20046:3;20039:37;20029:53;;:::o;20088:589::-;20313:3;20335:95;20426:3;20417:6;20335:95;:::i;:::-;20328:102;;20447:95;20538:3;20529:6;20447:95;:::i;:::-;20440:102;;20559:92;20647:3;20638:6;20559:92;:::i;:::-;20552:99;;20668:3;20661:10;;20317:360;;;;;;:::o;20683:379::-;20867:3;20889:147;21032:3;20889:147;:::i;:::-;20882:154;;21053:3;21046:10;;20871:191;;;:::o;21068:222::-;21161:4;21199:2;21188:9;21184:18;21176:26;;21212:71;21280:1;21269:9;21265:17;21256:6;21212:71;:::i;:::-;21166:124;;;;:::o;21296:332::-;21417:4;21455:2;21444:9;21440:18;21432:26;;21468:71;21536:1;21525:9;21521:17;21512:6;21468:71;:::i;:::-;21549:72;21617:2;21606:9;21602:18;21593:6;21549:72;:::i;:::-;21422:206;;;;;:::o;21634:442::-;21783:4;21821:2;21810:9;21806:18;21798:26;;21834:71;21902:1;21891:9;21887:17;21878:6;21834:71;:::i;:::-;21915:72;21983:2;21972:9;21968:18;21959:6;21915:72;:::i;:::-;21997;22065:2;22054:9;22050:18;22041:6;21997:72;:::i;:::-;21788:288;;;;;;:::o;22082:640::-;22277:4;22315:3;22304:9;22300:19;22292:27;;22329:71;22397:1;22386:9;22382:17;22373:6;22329:71;:::i;:::-;22410:72;22478:2;22467:9;22463:18;22454:6;22410:72;:::i;:::-;22492;22560:2;22549:9;22545:18;22536:6;22492:72;:::i;:::-;22611:9;22605:4;22601:20;22596:2;22585:9;22581:18;22574:48;22639:76;22710:4;22701:6;22639:76;:::i;:::-;22631:84;;22282:440;;;;;;;:::o;22728:332::-;22849:4;22887:2;22876:9;22872:18;22864:26;;22900:71;22968:1;22957:9;22953:17;22944:6;22900:71;:::i;:::-;22981:72;23049:2;23038:9;23034:18;23025:6;22981:72;:::i;:::-;22854:206;;;;;:::o;23066:373::-;23209:4;23247:2;23236:9;23232:18;23224:26;;23296:9;23290:4;23286:20;23282:1;23271:9;23267:17;23260:47;23324:108;23427:4;23418:6;23324:108;:::i;:::-;23316:116;;23214:225;;;;:::o;23445:210::-;23532:4;23570:2;23559:9;23555:18;23547:26;;23583:65;23645:1;23634:9;23630:17;23621:6;23583:65;:::i;:::-;23537:118;;;;:::o;23661:313::-;23774:4;23812:2;23801:9;23797:18;23789:26;;23861:9;23855:4;23851:20;23847:1;23836:9;23832:17;23825:47;23889:78;23962:4;23953:6;23889:78;:::i;:::-;23881:86;;23779:195;;;;:::o;23980:419::-;24146:4;24184:2;24173:9;24169:18;24161:26;;24233:9;24227:4;24223:20;24219:1;24208:9;24204:17;24197:47;24261:131;24387:4;24261:131;:::i;:::-;24253:139;;24151:248;;;:::o;24405:419::-;24571:4;24609:2;24598:9;24594:18;24586:26;;24658:9;24652:4;24648:20;24644:1;24633:9;24629:17;24622:47;24686:131;24812:4;24686:131;:::i;:::-;24678:139;;24576:248;;;:::o;24830:419::-;24996:4;25034:2;25023:9;25019:18;25011:26;;25083:9;25077:4;25073:20;25069:1;25058:9;25054:17;25047:47;25111:131;25237:4;25111:131;:::i;:::-;25103:139;;25001:248;;;:::o;25255:419::-;25421:4;25459:2;25448:9;25444:18;25436:26;;25508:9;25502:4;25498:20;25494:1;25483:9;25479:17;25472:47;25536:131;25662:4;25536:131;:::i;:::-;25528:139;;25426:248;;;:::o;25680:419::-;25846:4;25884:2;25873:9;25869:18;25861:26;;25933:9;25927:4;25923:20;25919:1;25908:9;25904:17;25897:47;25961:131;26087:4;25961:131;:::i;:::-;25953:139;;25851:248;;;:::o;26105:419::-;26271:4;26309:2;26298:9;26294:18;26286:26;;26358:9;26352:4;26348:20;26344:1;26333:9;26329:17;26322:47;26386:131;26512:4;26386:131;:::i;:::-;26378:139;;26276:248;;;:::o;26530:419::-;26696:4;26734:2;26723:9;26719:18;26711:26;;26783:9;26777:4;26773:20;26769:1;26758:9;26754:17;26747:47;26811:131;26937:4;26811:131;:::i;:::-;26803:139;;26701:248;;;:::o;26955:419::-;27121:4;27159:2;27148:9;27144:18;27136:26;;27208:9;27202:4;27198:20;27194:1;27183:9;27179:17;27172:47;27236:131;27362:4;27236:131;:::i;:::-;27228:139;;27126:248;;;:::o;27380:419::-;27546:4;27584:2;27573:9;27569:18;27561:26;;27633:9;27627:4;27623:20;27619:1;27608:9;27604:17;27597:47;27661:131;27787:4;27661:131;:::i;:::-;27653:139;;27551:248;;;:::o;27805:419::-;27971:4;28009:2;27998:9;27994:18;27986:26;;28058:9;28052:4;28048:20;28044:1;28033:9;28029:17;28022:47;28086:131;28212:4;28086:131;:::i;:::-;28078:139;;27976:248;;;:::o;28230:419::-;28396:4;28434:2;28423:9;28419:18;28411:26;;28483:9;28477:4;28473:20;28469:1;28458:9;28454:17;28447:47;28511:131;28637:4;28511:131;:::i;:::-;28503:139;;28401:248;;;:::o;28655:419::-;28821:4;28859:2;28848:9;28844:18;28836:26;;28908:9;28902:4;28898:20;28894:1;28883:9;28879:17;28872:47;28936:131;29062:4;28936:131;:::i;:::-;28928:139;;28826:248;;;:::o;29080:419::-;29246:4;29284:2;29273:9;29269:18;29261:26;;29333:9;29327:4;29323:20;29319:1;29308:9;29304:17;29297:47;29361:131;29487:4;29361:131;:::i;:::-;29353:139;;29251:248;;;:::o;29505:419::-;29671:4;29709:2;29698:9;29694:18;29686:26;;29758:9;29752:4;29748:20;29744:1;29733:9;29729:17;29722:47;29786:131;29912:4;29786:131;:::i;:::-;29778:139;;29676:248;;;:::o;29930:419::-;30096:4;30134:2;30123:9;30119:18;30111:26;;30183:9;30177:4;30173:20;30169:1;30158:9;30154:17;30147:47;30211:131;30337:4;30211:131;:::i;:::-;30203:139;;30101:248;;;:::o;30355:419::-;30521:4;30559:2;30548:9;30544:18;30536:26;;30608:9;30602:4;30598:20;30594:1;30583:9;30579:17;30572:47;30636:131;30762:4;30636:131;:::i;:::-;30628:139;;30526:248;;;:::o;30780:419::-;30946:4;30984:2;30973:9;30969:18;30961:26;;31033:9;31027:4;31023:20;31019:1;31008:9;31004:17;30997:47;31061:131;31187:4;31061:131;:::i;:::-;31053:139;;30951:248;;;:::o;31205:419::-;31371:4;31409:2;31398:9;31394:18;31386:26;;31458:9;31452:4;31448:20;31444:1;31433:9;31429:17;31422:47;31486:131;31612:4;31486:131;:::i;:::-;31478:139;;31376:248;;;:::o;31630:419::-;31796:4;31834:2;31823:9;31819:18;31811:26;;31883:9;31877:4;31873:20;31869:1;31858:9;31854:17;31847:47;31911:131;32037:4;31911:131;:::i;:::-;31903:139;;31801:248;;;:::o;32055:419::-;32221:4;32259:2;32248:9;32244:18;32236:26;;32308:9;32302:4;32298:20;32294:1;32283:9;32279:17;32272:47;32336:131;32462:4;32336:131;:::i;:::-;32328:139;;32226:248;;;:::o;32480:419::-;32646:4;32684:2;32673:9;32669:18;32661:26;;32733:9;32727:4;32723:20;32719:1;32708:9;32704:17;32697:47;32761:131;32887:4;32761:131;:::i;:::-;32753:139;;32651:248;;;:::o;32905:222::-;32998:4;33036:2;33025:9;33021:18;33013:26;;33049:71;33117:1;33106:9;33102:17;33093:6;33049:71;:::i;:::-;33003:124;;;;:::o;33133:129::-;33167:6;33194:20;;:::i;:::-;33184:30;;33223:33;33251:4;33243:6;33223:33;:::i;:::-;33174:88;;;:::o;33268:75::-;33301:6;33334:2;33328:9;33318:19;;33308:35;:::o;33349:307::-;33410:4;33500:18;33492:6;33489:30;33486:2;;;33522:18;;:::i;:::-;33486:2;33560:29;33582:6;33560:29;:::i;:::-;33552:37;;33644:4;33638;33634:15;33626:23;;33415:241;;;:::o;33662:308::-;33724:4;33814:18;33806:6;33803:30;33800:2;;;33836:18;;:::i;:::-;33800:2;33874:29;33896:6;33874:29;:::i;:::-;33866:37;;33958:4;33952;33948:15;33940:23;;33729:241;;;:::o;33976:132::-;34043:4;34066:3;34058:11;;34096:4;34091:3;34087:14;34079:22;;34048:60;;;:::o;34114:141::-;34163:4;34186:3;34178:11;;34209:3;34206:1;34199:14;34243:4;34240:1;34230:18;34222:26;;34168:87;;;:::o;34261:114::-;34328:6;34362:5;34356:12;34346:22;;34335:40;;;:::o;34381:98::-;34432:6;34466:5;34460:12;34450:22;;34439:40;;;:::o;34485:99::-;34537:6;34571:5;34565:12;34555:22;;34544:40;;;:::o;34590:113::-;34660:4;34692;34687:3;34683:14;34675:22;;34665:38;;;:::o;34709:184::-;34808:11;34842:6;34837:3;34830:19;34882:4;34877:3;34873:14;34858:29;;34820:73;;;;:::o;34899:168::-;34982:11;35016:6;35011:3;35004:19;35056:4;35051:3;35047:14;35032:29;;34994:73;;;;:::o;35073:147::-;35174:11;35211:3;35196:18;;35186:34;;;;:::o;35226:169::-;35310:11;35344:6;35339:3;35332:19;35384:4;35379:3;35375:14;35360:29;;35322:73;;;;:::o;35401:148::-;35503:11;35540:3;35525:18;;35515:34;;;;:::o;35555:305::-;35595:3;35614:20;35632:1;35614:20;:::i;:::-;35609:25;;35648:20;35666:1;35648:20;:::i;:::-;35643:25;;35802:1;35734:66;35730:74;35727:1;35724:81;35721:2;;;35808:18;;:::i;:::-;35721:2;35852:1;35849;35845:9;35838:16;;35599:261;;;;:::o;35866:348::-;35906:7;35929:20;35947:1;35929:20;:::i;:::-;35924:25;;35963:20;35981:1;35963:20;:::i;:::-;35958:25;;36151:1;36083:66;36079:74;36076:1;36073:81;36068:1;36061:9;36054:17;36050:105;36047:2;;;36158:18;;:::i;:::-;36047:2;36206:1;36203;36199:9;36188:20;;35914:300;;;;:::o;36220:191::-;36260:4;36280:20;36298:1;36280:20;:::i;:::-;36275:25;;36314:20;36332:1;36314:20;:::i;:::-;36309:25;;36353:1;36350;36347:8;36344:2;;;36358:18;;:::i;:::-;36344:2;36403:1;36400;36396:9;36388:17;;36265:146;;;;:::o;36417:96::-;36454:7;36483:24;36501:5;36483:24;:::i;:::-;36472:35;;36462:51;;;:::o;36519:90::-;36553:7;36596:5;36589:13;36582:21;36571:32;;36561:48;;;:::o;36615:149::-;36651:7;36691:66;36684:5;36680:78;36669:89;;36659:105;;;:::o;36770:126::-;36807:7;36847:42;36840:5;36836:54;36825:65;;36815:81;;;:::o;36902:77::-;36939:7;36968:5;36957:16;;36947:32;;;:::o;36985:154::-;37069:6;37064:3;37059;37046:30;37131:1;37122:6;37117:3;37113:16;37106:27;37036:103;;;:::o;37145:307::-;37213:1;37223:113;37237:6;37234:1;37231:13;37223:113;;;37322:1;37317:3;37313:11;37307:18;37303:1;37298:3;37294:11;37287:39;37259:2;37256:1;37252:10;37247:15;;37223:113;;;37354:6;37351:1;37348:13;37345:2;;;37434:1;37425:6;37420:3;37416:16;37409:27;37345:2;37194:258;;;;:::o;37458:320::-;37502:6;37539:1;37533:4;37529:12;37519:22;;37586:1;37580:4;37576:12;37607:18;37597:2;;37663:4;37655:6;37651:17;37641:27;;37597:2;37725;37717:6;37714:14;37694:18;37691:38;37688:2;;;37744:18;;:::i;:::-;37688:2;37509:269;;;;:::o;37784:281::-;37867:27;37889:4;37867:27;:::i;:::-;37859:6;37855:40;37997:6;37985:10;37982:22;37961:18;37949:10;37946:34;37943:62;37940:2;;;38008:18;;:::i;:::-;37940:2;38048:10;38044:2;38037:22;37827:238;;;:::o;38071:233::-;38110:3;38133:24;38151:5;38133:24;:::i;:::-;38124:33;;38179:66;38172:5;38169:77;38166:2;;;38249:18;;:::i;:::-;38166:2;38296:1;38289:5;38285:13;38278:20;;38114:190;;;:::o;38310:180::-;38358:77;38355:1;38348:88;38455:4;38452:1;38445:15;38479:4;38476:1;38469:15;38496:180;38544:77;38541:1;38534:88;38641:4;38638:1;38631:15;38665:4;38662:1;38655:15;38682:180;38730:77;38727:1;38720:88;38827:4;38824:1;38817:15;38851:4;38848:1;38841:15;38868:102;38909:6;38960:2;38956:7;38951:2;38944:5;38940:14;38936:28;38926:38;;38916:54;;;:::o;38976:232::-;39116:34;39112:1;39104:6;39100:14;39093:58;39185:15;39180:2;39172:6;39168:15;39161:40;39082:126;:::o;39214:237::-;39354:34;39350:1;39342:6;39338:14;39331:58;39423:20;39418:2;39410:6;39406:15;39399:45;39320:131;:::o;39457:225::-;39597:34;39593:1;39585:6;39581:14;39574:58;39666:8;39661:2;39653:6;39649:15;39642:33;39563:119;:::o;39688:224::-;39828:34;39824:1;39816:6;39812:14;39805:58;39897:7;39892:2;39884:6;39880:15;39873:32;39794:118;:::o;39918:178::-;40058:30;40054:1;40046:6;40042:14;40035:54;40024:72;:::o;40102:170::-;40242:22;40238:1;40230:6;40226:14;40219:46;40208:64;:::o;40278:223::-;40418:34;40414:1;40406:6;40402:14;40395:58;40487:6;40482:2;40474:6;40470:15;40463:31;40384:117;:::o;40507:175::-;40647:27;40643:1;40635:6;40631:14;40624:51;40613:69;:::o;40688:173::-;40828:25;40824:1;40816:6;40812:14;40805:49;40794:67;:::o;40867:228::-;41007:34;41003:1;40995:6;40991:14;40984:58;41076:11;41071:2;41063:6;41059:15;41052:36;40973:122;:::o;41101:182::-;41241:34;41237:1;41229:6;41225:14;41218:58;41207:76;:::o;41289:182::-;41429:34;41425:1;41417:6;41413:14;41406:58;41395:76;:::o;41477:173::-;41617:25;41613:1;41605:6;41601:14;41594:49;41583:67;:::o;41656:167::-;41796:19;41792:1;41784:6;41780:14;41773:43;41762:61;:::o;41829:234::-;41969:34;41965:1;41957:6;41953:14;41946:58;42038:17;42033:2;42025:6;42021:15;42014:42;41935:128;:::o;42069:174::-;42209:26;42205:1;42197:6;42193:14;42186:50;42175:68;:::o;42249:220::-;42389:34;42385:1;42377:6;42373:14;42366:58;42458:3;42453:2;42445:6;42441:15;42434:28;42355:114;:::o;42475:::-;42581:8;:::o;42595:170::-;42735:22;42731:1;42723:6;42719:14;42712:46;42701:64;:::o;42771:248::-;42911:34;42907:1;42899:6;42895:14;42888:58;42980:31;42975:2;42967:6;42963:15;42956:56;42877:142;:::o;43025:169::-;43165:21;43161:1;43153:6;43149:14;43142:45;43131:63;:::o;43200:223::-;43340:34;43336:1;43328:6;43324:14;43317:58;43409:6;43404:2;43396:6;43392:15;43385:31;43306:117;:::o;43429:122::-;43502:24;43520:5;43502:24;:::i;:::-;43495:5;43492:35;43482:2;;43541:1;43538;43531:12;43482:2;43472:79;:::o;43557:116::-;43627:21;43642:5;43627:21;:::i;:::-;43620:5;43617:32;43607:2;;43663:1;43660;43653:12;43607:2;43597:76;:::o;43679:120::-;43751:23;43768:5;43751:23;:::i;:::-;43744:5;43741:34;43731:2;;43789:1;43786;43779:12;43731:2;43721:78;:::o;43805:122::-;43878:24;43896:5;43878:24;:::i;:::-;43871:5;43868:35;43858:2;;43917:1;43914;43907:12;43858:2;43848:79;:::o

Swarm Source

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