// WARNING: This file is machine generated by fidlgen.

// fidl_experiment = output_index_json

#pragma once

#include <fidl/test.protocollayouts/cpp/markers.h>
#include <fidl/test.protocollayouts/cpp/natural_types.h>
#include <fidl/test.protocollayouts/cpp/wire_types.h>
#ifdef __Fuchsia__
#include <fidl/test.protocollayouts/cpp/natural_messaging.h>
#include <fidl/test.protocollayouts/cpp/wire_messaging.h>

#endif  // __Fuchsia__
#include <fidl/test.protocollayouts.imported/cpp/type_conversions.h>
#include <lib/fidl/cpp/wire_natural_conversions.h>
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wshadow"

namespace fidl {
namespace internal {

template <>
struct WireNaturalConversionTraits<::test_protocollayouts::wire::LocalTablePayload, ::test_protocollayouts::LocalTablePayload> {
  static ::test_protocollayouts::LocalTablePayload ToNatural(::test_protocollayouts::wire::LocalTablePayload src);
  static ::test_protocollayouts::wire::LocalTablePayload ToWire(fidl::AnyArena& arena, ::test_protocollayouts::LocalTablePayload src);
};

template <>
struct NaturalTypeForWireType<::test_protocollayouts::wire::LocalTablePayload> {
  using type = ::test_protocollayouts::LocalTablePayload;
};
template <>
struct WireTypeForNaturalType<::test_protocollayouts::LocalTablePayload> {
  using type = ::test_protocollayouts::wire::LocalTablePayload;
};

template <>
struct WireNaturalConversionTraits<::test_protocollayouts::wire::MainProtocolOneWayAnonRequest, ::test_protocollayouts::MainProtocolOneWayAnonRequest> {
  static ::test_protocollayouts::MainProtocolOneWayAnonRequest ToNatural(::test_protocollayouts::wire::MainProtocolOneWayAnonRequest src);
  static ::test_protocollayouts::wire::MainProtocolOneWayAnonRequest ToWire(fidl::AnyArena& arena, ::test_protocollayouts::MainProtocolOneWayAnonRequest src);
};

template <>
struct NaturalTypeForWireType<::test_protocollayouts::wire::MainProtocolOneWayAnonRequest> {
  using type = ::test_protocollayouts::MainProtocolOneWayAnonRequest;
};
template <>
struct WireTypeForNaturalType<::test_protocollayouts::MainProtocolOneWayAnonRequest> {
  using type = ::test_protocollayouts::wire::MainProtocolOneWayAnonRequest;
};

template <>
struct WireNaturalConversionTraits<::test_protocollayouts::wire::MainProtocolTwoWayAnonResponse, ::test_protocollayouts::MainProtocolTwoWayAnonResponse> {
  static ::test_protocollayouts::MainProtocolTwoWayAnonResponse ToNatural(::test_protocollayouts::wire::MainProtocolTwoWayAnonResponse src);
  static ::test_protocollayouts::wire::MainProtocolTwoWayAnonResponse ToWire(fidl::AnyArena& arena, ::test_protocollayouts::MainProtocolTwoWayAnonResponse src);
};

template <>
struct NaturalTypeForWireType<::test_protocollayouts::wire::MainProtocolTwoWayAnonResponse> {
  using type = ::test_protocollayouts::MainProtocolTwoWayAnonResponse;
};
template <>
struct WireTypeForNaturalType<::test_protocollayouts::MainProtocolTwoWayAnonResponse> {
  using type = ::test_protocollayouts::wire::MainProtocolTwoWayAnonResponse;
};

template <>
struct WireNaturalConversionTraits<::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorRequest, ::test_protocollayouts::MainProtocolTwoWayAnonWithErrorRequest> {
  static ::test_protocollayouts::MainProtocolTwoWayAnonWithErrorRequest ToNatural(::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorRequest src);
  static ::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorRequest ToWire(fidl::AnyArena& arena, ::test_protocollayouts::MainProtocolTwoWayAnonWithErrorRequest src);
};

template <>
struct NaturalTypeForWireType<::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorRequest> {
  using type = ::test_protocollayouts::MainProtocolTwoWayAnonWithErrorRequest;
};
template <>
struct WireTypeForNaturalType<::test_protocollayouts::MainProtocolTwoWayAnonWithErrorRequest> {
  using type = ::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorRequest;
};

template <>
struct WireNaturalConversionTraits<::test_protocollayouts::wire::LocalUnionPayload, ::test_protocollayouts::LocalUnionPayload> {
  static ::test_protocollayouts::LocalUnionPayload ToNatural(::test_protocollayouts::wire::LocalUnionPayload src);
  static ::test_protocollayouts::wire::LocalUnionPayload ToWire(fidl::AnyArena& arena, ::test_protocollayouts::LocalUnionPayload src);
};

template <>
struct WireNaturalConversionTraits<::fidl::WireOptional<::test_protocollayouts::wire::LocalUnionPayload>, std::unique_ptr<::test_protocollayouts::LocalUnionPayload>> {
  static std::unique_ptr<::test_protocollayouts::LocalUnionPayload> ToNatural(::fidl::WireOptional<::test_protocollayouts::wire::LocalUnionPayload> src);
  static ::fidl::WireOptional<::test_protocollayouts::wire::LocalUnionPayload> ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_protocollayouts::LocalUnionPayload> src);
};

template <>
struct NaturalTypeForWireType<::test_protocollayouts::wire::LocalUnionPayload> {
  using type = ::test_protocollayouts::LocalUnionPayload;
};
template <>
struct WireTypeForNaturalType<::test_protocollayouts::LocalUnionPayload> {
  using type = ::test_protocollayouts::wire::LocalUnionPayload;
};

template <>
struct WireNaturalConversionTraits<::test_protocollayouts::wire::MainProtocolTwoWayImportWithErrorResult, ::test_protocollayouts::MainProtocolTwoWayImportWithErrorResult> {
  static ::test_protocollayouts::MainProtocolTwoWayImportWithErrorResult ToNatural(::test_protocollayouts::wire::MainProtocolTwoWayImportWithErrorResult src);
  static ::test_protocollayouts::wire::MainProtocolTwoWayImportWithErrorResult ToWire(fidl::AnyArena& arena, ::test_protocollayouts::MainProtocolTwoWayImportWithErrorResult src);
};

template <>
struct WireNaturalConversionTraits<::fidl::WireOptional<::test_protocollayouts::wire::MainProtocolTwoWayImportWithErrorResult>, std::unique_ptr<::test_protocollayouts::MainProtocolTwoWayImportWithErrorResult>> {
  static std::unique_ptr<::test_protocollayouts::MainProtocolTwoWayImportWithErrorResult> ToNatural(::fidl::WireOptional<::test_protocollayouts::wire::MainProtocolTwoWayImportWithErrorResult> src);
  static ::fidl::WireOptional<::test_protocollayouts::wire::MainProtocolTwoWayImportWithErrorResult> ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_protocollayouts::MainProtocolTwoWayImportWithErrorResult> src);
};

template <>
struct NaturalTypeForWireType<::test_protocollayouts::wire::MainProtocolTwoWayImportWithErrorResult> {
  using type = ::test_protocollayouts::MainProtocolTwoWayImportWithErrorResult;
};
template <>
struct WireTypeForNaturalType<::test_protocollayouts::MainProtocolTwoWayImportWithErrorResult> {
  using type = ::test_protocollayouts::wire::MainProtocolTwoWayImportWithErrorResult;
};

template <>
struct WireNaturalConversionTraits<::test_protocollayouts::wire::MainProtocolTwoWayLocalWithErrorResult, ::test_protocollayouts::MainProtocolTwoWayLocalWithErrorResult> {
  static ::test_protocollayouts::MainProtocolTwoWayLocalWithErrorResult ToNatural(::test_protocollayouts::wire::MainProtocolTwoWayLocalWithErrorResult src);
  static ::test_protocollayouts::wire::MainProtocolTwoWayLocalWithErrorResult ToWire(fidl::AnyArena& arena, ::test_protocollayouts::MainProtocolTwoWayLocalWithErrorResult src);
};

template <>
struct WireNaturalConversionTraits<::fidl::WireOptional<::test_protocollayouts::wire::MainProtocolTwoWayLocalWithErrorResult>, std::unique_ptr<::test_protocollayouts::MainProtocolTwoWayLocalWithErrorResult>> {
  static std::unique_ptr<::test_protocollayouts::MainProtocolTwoWayLocalWithErrorResult> ToNatural(::fidl::WireOptional<::test_protocollayouts::wire::MainProtocolTwoWayLocalWithErrorResult> src);
  static ::fidl::WireOptional<::test_protocollayouts::wire::MainProtocolTwoWayLocalWithErrorResult> ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_protocollayouts::MainProtocolTwoWayLocalWithErrorResult> src);
};

template <>
struct NaturalTypeForWireType<::test_protocollayouts::wire::MainProtocolTwoWayLocalWithErrorResult> {
  using type = ::test_protocollayouts::MainProtocolTwoWayLocalWithErrorResult;
};
template <>
struct WireTypeForNaturalType<::test_protocollayouts::MainProtocolTwoWayLocalWithErrorResult> {
  using type = ::test_protocollayouts::wire::MainProtocolTwoWayLocalWithErrorResult;
};

template <>
struct WireNaturalConversionTraits<::test_protocollayouts::wire::MainProtocolTwoWayAnonRequest, ::test_protocollayouts::MainProtocolTwoWayAnonRequest> {
  static ::test_protocollayouts::MainProtocolTwoWayAnonRequest ToNatural(::test_protocollayouts::wire::MainProtocolTwoWayAnonRequest src);
  static ::test_protocollayouts::wire::MainProtocolTwoWayAnonRequest ToWire(fidl::AnyArena& arena, ::test_protocollayouts::MainProtocolTwoWayAnonRequest src);
};

template <>
struct WireNaturalConversionTraits<::fidl::WireOptional<::test_protocollayouts::wire::MainProtocolTwoWayAnonRequest>, std::unique_ptr<::test_protocollayouts::MainProtocolTwoWayAnonRequest>> {
  static std::unique_ptr<::test_protocollayouts::MainProtocolTwoWayAnonRequest> ToNatural(::fidl::WireOptional<::test_protocollayouts::wire::MainProtocolTwoWayAnonRequest> src);
  static ::fidl::WireOptional<::test_protocollayouts::wire::MainProtocolTwoWayAnonRequest> ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_protocollayouts::MainProtocolTwoWayAnonRequest> src);
};

template <>
struct NaturalTypeForWireType<::test_protocollayouts::wire::MainProtocolTwoWayAnonRequest> {
  using type = ::test_protocollayouts::MainProtocolTwoWayAnonRequest;
};
template <>
struct WireTypeForNaturalType<::test_protocollayouts::MainProtocolTwoWayAnonRequest> {
  using type = ::test_protocollayouts::wire::MainProtocolTwoWayAnonRequest;
};

template <>
struct WireNaturalConversionTraits<::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResponse, ::test_protocollayouts::MainProtocolTwoWayAnonWithErrorResponse> {
  static ::test_protocollayouts::MainProtocolTwoWayAnonWithErrorResponse ToNatural(::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResponse src);
  static ::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResponse ToWire(fidl::AnyArena& arena, ::test_protocollayouts::MainProtocolTwoWayAnonWithErrorResponse src);
};

template <>
struct WireNaturalConversionTraits<::fidl::WireOptional<::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResponse>, std::unique_ptr<::test_protocollayouts::MainProtocolTwoWayAnonWithErrorResponse>> {
  static std::unique_ptr<::test_protocollayouts::MainProtocolTwoWayAnonWithErrorResponse> ToNatural(::fidl::WireOptional<::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResponse> src);
  static ::fidl::WireOptional<::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResponse> ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_protocollayouts::MainProtocolTwoWayAnonWithErrorResponse> src);
};

template <>
struct NaturalTypeForWireType<::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResponse> {
  using type = ::test_protocollayouts::MainProtocolTwoWayAnonWithErrorResponse;
};
template <>
struct WireTypeForNaturalType<::test_protocollayouts::MainProtocolTwoWayAnonWithErrorResponse> {
  using type = ::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResponse;
};

template <>
struct WireNaturalConversionTraits<::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResult, ::test_protocollayouts::MainProtocolTwoWayAnonWithErrorResult> {
  static ::test_protocollayouts::MainProtocolTwoWayAnonWithErrorResult ToNatural(::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResult src);
  static ::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResult ToWire(fidl::AnyArena& arena, ::test_protocollayouts::MainProtocolTwoWayAnonWithErrorResult src);
};

template <>
struct WireNaturalConversionTraits<::fidl::WireOptional<::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResult>, std::unique_ptr<::test_protocollayouts::MainProtocolTwoWayAnonWithErrorResult>> {
  static std::unique_ptr<::test_protocollayouts::MainProtocolTwoWayAnonWithErrorResult> ToNatural(::fidl::WireOptional<::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResult> src);
  static ::fidl::WireOptional<::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResult> ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_protocollayouts::MainProtocolTwoWayAnonWithErrorResult> src);
};

template <>
struct NaturalTypeForWireType<::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResult> {
  using type = ::test_protocollayouts::MainProtocolTwoWayAnonWithErrorResult;
};
template <>
struct WireTypeForNaturalType<::test_protocollayouts::MainProtocolTwoWayAnonWithErrorResult> {
  using type = ::test_protocollayouts::wire::MainProtocolTwoWayAnonWithErrorResult;
};

template <>
struct WireNaturalConversionTraits<::test_protocollayouts::wire::MainProtocolOnAnonRequest, ::test_protocollayouts::MainProtocolOnAnonRequest> {
  static ::test_protocollayouts::MainProtocolOnAnonRequest ToNatural(::test_protocollayouts::wire::MainProtocolOnAnonRequest src);
  static ::test_protocollayouts::wire::MainProtocolOnAnonRequest ToWire(fidl::AnyArena& arena, ::test_protocollayouts::MainProtocolOnAnonRequest src);
};

template <>
struct WireNaturalConversionTraits<::fidl::WireOptional<::test_protocollayouts::wire::MainProtocolOnAnonRequest>, std::unique_ptr<::test_protocollayouts::MainProtocolOnAnonRequest>> {
  static std::unique_ptr<::test_protocollayouts::MainProtocolOnAnonRequest> ToNatural(::fidl::WireOptional<::test_protocollayouts::wire::MainProtocolOnAnonRequest> src);
  static ::fidl::WireOptional<::test_protocollayouts::wire::MainProtocolOnAnonRequest> ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_protocollayouts::MainProtocolOnAnonRequest> src);
};

template <>
struct NaturalTypeForWireType<::test_protocollayouts::wire::MainProtocolOnAnonRequest> {
  using type = ::test_protocollayouts::MainProtocolOnAnonRequest;
};
template <>
struct WireTypeForNaturalType<::test_protocollayouts::MainProtocolOnAnonRequest> {
  using type = ::test_protocollayouts::wire::MainProtocolOnAnonRequest;
};

#ifdef __Fuchsia__

template <>
struct WireNaturalConversionTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>, ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>> {
  static ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayAnonComposed> ToNatural(::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposed> src);
  static ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposed> ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayAnonComposed> src);
};

template <>
struct NaturalTypeForWireType<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>> {
  using type = ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>;
};
template <>
struct WireTypeForNaturalType<::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>> {
  using type = ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposed>;
};

template <>
struct WireNaturalConversionTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>, ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>> {
  static ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError> ToNatural(::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError> src);
  static ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError> ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError> src);
};

template <>
struct NaturalTypeForWireType<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>> {
  using type = ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>;
};
template <>
struct WireTypeForNaturalType<::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>> {
  using type = ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonComposedWithError>;
};

template <>
struct WireNaturalConversionTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>, ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>> {
  static ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayNamedComposed> ToNatural(::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposed> src);
  static ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposed> ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayNamedComposed> src);
};

template <>
struct NaturalTypeForWireType<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>> {
  using type = ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>;
};
template <>
struct WireTypeForNaturalType<::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>> {
  using type = ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposed>;
};

template <>
struct WireNaturalConversionTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>, ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>> {
  static ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError> ToNatural(::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError> src);
  static ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError> ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError> src);
};

template <>
struct NaturalTypeForWireType<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>> {
  using type = ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>;
};
template <>
struct WireTypeForNaturalType<::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>> {
  using type = ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayNamedComposedWithError>;
};

template <>
struct WireNaturalConversionTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImport>, ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayImport>> {
  static ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayImport> ToNatural(::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImport> src);
  static ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImport> ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayImport> src);
};

template <>
struct NaturalTypeForWireType<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImport>> {
  using type = ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayImport>;
};
template <>
struct WireTypeForNaturalType<::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayImport>> {
  using type = ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImport>;
};

template <>
struct WireNaturalConversionTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImportWithError>, ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayImportWithError>> {
  static ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayImportWithError> ToNatural(::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImportWithError> src);
  static ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImportWithError> ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayImportWithError> src);
};

template <>
struct NaturalTypeForWireType<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImportWithError>> {
  using type = ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayImportWithError>;
};
template <>
struct WireTypeForNaturalType<::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayImportWithError>> {
  using type = ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayImportWithError>;
};

template <>
struct WireNaturalConversionTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>, ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayLocal>> {
  static ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayLocal> ToNatural(::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal> src);
  static ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal> ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayLocal> src);
};

template <>
struct NaturalTypeForWireType<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>> {
  using type = ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayLocal>;
};
template <>
struct WireTypeForNaturalType<::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayLocal>> {
  using type = ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocal>;
};

template <>
struct WireNaturalConversionTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>, ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>> {
  static ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayLocalWithError> ToNatural(::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocalWithError> src);
  static ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocalWithError> ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayLocalWithError> src);
};

template <>
struct NaturalTypeForWireType<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>> {
  using type = ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>;
};
template <>
struct WireTypeForNaturalType<::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>> {
  using type = ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayLocalWithError>;
};

template <>
struct WireNaturalConversionTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>, ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayAnon>> {
  static ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayAnon> ToNatural(::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon> src);
  static ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon> ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayAnon> src);
};

template <>
struct NaturalTypeForWireType<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>> {
  using type = ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayAnon>;
};
template <>
struct WireTypeForNaturalType<::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayAnon>> {
  using type = ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnon>;
};

template <>
struct WireNaturalConversionTraits<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>, ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>> {
  static ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayAnonWithError> ToNatural(::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonWithError> src);
  static ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonWithError> ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayAnonWithError> src);
};

template <>
struct NaturalTypeForWireType<::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>> {
  using type = ::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>;
};
template <>
struct WireTypeForNaturalType<::fidl::Response<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>> {
  using type = ::fidl::WireResponse<::test_protocollayouts::MainProtocol::TwoWayAnonWithError>;
};

template <>
struct WireNaturalConversionTraits<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>, ::fidl::Response<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>> {
  static ::fidl::Response<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError> ToNatural(::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError> src);
  static ::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError> ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError> src);
};

template <>
struct NaturalTypeForWireType<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>> {
  using type = ::fidl::Response<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>;
};
template <>
struct WireTypeForNaturalType<::fidl::Response<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>> {
  using type = ::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayNoError>;
};

template <>
struct WireNaturalConversionTraits<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>, ::fidl::Response<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>> {
  static ::fidl::Response<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError> ToNatural(::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError> src);
  static ::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError> ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError> src);
};

template <>
struct NaturalTypeForWireType<::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>> {
  using type = ::fidl::Response<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>;
};
template <>
struct WireTypeForNaturalType<::fidl::Response<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>> {
  using type = ::fidl::WireResponse<::test_protocollayouts::OpenProtocol::StrictTwoWayWithError>;
};

#endif  // __Fuchsia__
#pragma clang diagnostic pop

}  // namespace internal
}  // namespace fidl
