module JWT

def self.gem_version

def self.gem_version
  Gem::Version.new VERSION::STRING
end

def self.openssl_3?

def self.openssl_3?
  return false if OpenSSL::OPENSSL_VERSION.include?('LibreSSL')
  return true if OpenSSL::OPENSSL_VERSION_NUMBER >= 3 * 0x10000000
end

def self.openssl_3_hmac_empty_key_regression?

def self.openssl_3_hmac_empty_key_regression?
  openssl_3? && openssl_version <= ::Gem::Version.new('3.0.0')
end

def self.openssl_version

def self.openssl_version
  @openssl_version ||= ::Gem::Version.new(OpenSSL::VERSION)
end

def self.rbnacl?

def self.rbnacl?
  defined?(::RbNaCl)
end

def self.rbnacl_6_or_greater?

def self.rbnacl_6_or_greater?
  rbnacl? && ::Gem::Version.new(::RbNaCl::VERSION) >= ::Gem::Version.new('6.0.0')
end

def decode(jwt, key = nil, verify = true, options = {}, &keyfinder) # rubocop:disable Style/OptionalBooleanParameter

rubocop:disable Style/OptionalBooleanParameter
def decode(jwt, key = nil, verify = true, options = {}, &keyfinder) # rubocop:disable Style/OptionalBooleanParameter
  Decode.new(jwt, key, verify, configuration.decode.to_h.merge(options), &keyfinder).decode_segments
end

def encode(payload, key, algorithm = 'HS256', header_fields = {})

def encode(payload, key, algorithm = 'HS256', header_fields = {})
  Encode.new(payload: payload,
             key: key,
             algorithm: algorithm,
             headers: header_fields).segments
end