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

#pragma once

#include <fidl/test.bindingsdenylist/cpp/markers.h>
#include <fidl/test.bindingsdenylist/cpp/wire_types.h>
#include <lib/fidl/llcpp/wire_messaging.h>

#ifdef __Fuchsia__

#include <lib/fidl/llcpp/client.h>
#include <lib/fidl/llcpp/connect_service.h>
#include <lib/fidl/llcpp/server.h>
#include <lib/fidl/llcpp/service_handler_interface.h>
#include <lib/fidl/llcpp/sync_call.h>

#endif  // __Fuchsia__

#include <fidl/test.dependent/cpp/wire_messaging.h>

namespace test_bindingsdenylist {
class Allowed;

class OnlyLibfuzzerAndDeps;

class OnlyCppAndDeps;

class ImportsSameNameContext;

class DenyEachBinding;

}  // namespace test_bindingsdenylist
#ifdef __Fuchsia__

template <>
struct ::fidl::internal::ProtocolDetails<::test_bindingsdenylist::Allowed> {};
#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireServerDispatcher<::test_bindingsdenylist::Allowed>
    final {
  WireServerDispatcher() = delete;
  static ::fidl::DispatchResult TryDispatch(
      ::fidl::WireServer<::test_bindingsdenylist::Allowed>* impl,
      ::fidl::IncomingMessage& msg,
      internal::IncomingTransportContext transport_context,
      ::fidl::Transaction* txn);
  static void Dispatch(
      ::fidl::WireServer<::test_bindingsdenylist::Allowed>* impl,
      ::fidl::IncomingMessage&& msg,
      internal::IncomingTransportContext transport_context,
      ::fidl::Transaction* txn);

 private:
  static const ::fidl::internal::MethodEntry entries_[];
  static const ::fidl::internal::MethodEntry* entries_end_;
};
#endif  // __Fuchsia__

namespace fidl {

#ifdef __Fuchsia__
}  // namespace fidl
template <>
class ::fidl::internal::WireEventHandlerInterface<
    ::test_bindingsdenylist::Allowed> {
 public:
  WireEventHandlerInterface() = default;
  virtual ~WireEventHandlerInterface() = default;
};

template <>
class ::fidl::WireAsyncEventHandler<::test_bindingsdenylist::Allowed>
    : public ::fidl::internal::WireEventHandlerInterface<
          ::test_bindingsdenylist::Allowed>,
      public ::fidl::internal::AsyncEventHandler {
 public:
  WireAsyncEventHandler() = default;
};

template <>
class ::fidl::WireSyncEventHandler<::test_bindingsdenylist::Allowed>
    : public ::fidl::internal::WireEventHandlerInterface<
          ::test_bindingsdenylist::Allowed> {
 public:
  WireSyncEventHandler() = default;

  // Handle all possible events defined in this protocol.
  // Blocks to consume exactly one message from the channel, then call the
  // corresponding virtual method.
  ::fidl::Status HandleOneEvent(
      ::fidl::UnownedClientEnd<::test_bindingsdenylist::Allowed> client_end);

 private:
  [[maybe_unused]] bool got_transitional_ = false;
};

template <>
class ::fidl::internal::WireEventDispatcher<::test_bindingsdenylist::Allowed>
    final
    : public ::fidl::internal::IncomingEventDispatcher<
          ::fidl::WireAsyncEventHandler<::test_bindingsdenylist::Allowed>> {
 public:
  explicit WireEventDispatcher(
      ::fidl::WireAsyncEventHandler<::test_bindingsdenylist::Allowed>*
          event_handler)
      : IncomingEventDispatcher(event_handler) {}

 private:
  std::optional<::fidl::UnbindInfo> DispatchEvent(
      ::fidl::IncomingMessage& msg,
      ::fidl::internal::IncomingTransportContext transport_context) override;
};

// Methods to make a sync FIDL call directly on an unowned handle or a
// const reference to a |fidl::ClientEnd<::test_bindingsdenylist::Allowed>|,
// avoiding setting up a client.
template <>
class ::fidl::internal::WireSyncClientImpl<::test_bindingsdenylist::Allowed>
    final : public ::fidl::internal::SyncEndpointManagedVeneer<
                ::fidl::internal::WireSyncClientImpl<
                    ::test_bindingsdenylist::Allowed>> {
 public:
 private:
  ::fidl::UnownedClientEnd<::test_bindingsdenylist::Allowed> _client_end()
      const {
    return ::fidl::UnownedClientEnd<::test_bindingsdenylist::Allowed>(
        _transport().get<::fidl::internal::ChannelTransport>());
  }
};

template <>
class ::fidl::internal::WireSyncBufferClientImpl<
    ::test_bindingsdenylist::Allowed>
    final : public ::fidl::internal::SyncEndpointBufferVeneer<
                ::fidl::internal::WireSyncBufferClientImpl<
                    ::test_bindingsdenylist::Allowed>> {
 public:
 private:
  ::fidl::UnownedClientEnd<::test_bindingsdenylist::Allowed> _client_end()
      const {
    return ::fidl::UnownedClientEnd<::test_bindingsdenylist::Allowed>(
        _transport().get<::fidl::internal::ChannelTransport>());
  }
};

// Pure-virtual interface to be implemented by a server.
// This interface uses typed channels (i.e. |fidl::ClientEnd<SomeProtocol>|
// and |fidl::ServerEnd<SomeProtocol>|).
template <>
class ::fidl::WireServer<::test_bindingsdenylist::Allowed>
    : public ::fidl::internal::IncomingMessageDispatcher {
 public:
  WireServer() = default;
  virtual ~WireServer() = default;

  // The FIDL protocol type that is implemented by this server.
  using _EnclosingProtocol = ::test_bindingsdenylist::Allowed;

 private:
  void dispatch_message(
      ::fidl::IncomingMessage&& msg, ::fidl::Transaction* txn,
      ::fidl::internal::IncomingTransportContext transport_context) final;
};
namespace fidl {
#endif  // __Fuchsia__

}  // namespace fidl
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
        LibfuzzerNeedsNonemptyProtocol>
    final {
  static constexpr uint64_t value = 2342407566057198902lu;
};

namespace test_bindingsdenylist {}  // namespace test_bindingsdenylist
#ifdef __Fuchsia__

template <>
struct ::fidl::internal::ProtocolDetails<
    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps> {};
#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireServerDispatcher<
    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps>
    final {
  WireServerDispatcher() = delete;
  static ::fidl::DispatchResult TryDispatch(
      ::fidl::WireServer<::test_bindingsdenylist::OnlyLibfuzzerAndDeps>* impl,
      ::fidl::IncomingMessage& msg,
      internal::IncomingTransportContext transport_context,
      ::fidl::Transaction* txn);
  static void Dispatch(
      ::fidl::WireServer<::test_bindingsdenylist::OnlyLibfuzzerAndDeps>* impl,
      ::fidl::IncomingMessage&& msg,
      internal::IncomingTransportContext transport_context,
      ::fidl::Transaction* txn);

 private:
  static const ::fidl::internal::MethodEntry entries_[];
  static const ::fidl::internal::MethodEntry* entries_end_;
};
#endif  // __Fuchsia__

template <>
struct ::fidl::WireRequest<::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                               LibfuzzerNeedsNonemptyProtocol>
    final {
  WireRequest() = default;
};

template <>
struct ::fidl::internal::TransactionalRequest<
    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
        LibfuzzerNeedsNonemptyProtocol>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  TransactionalRequest() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireResponse<::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                                LibfuzzerNeedsNonemptyProtocol>
    final {
  WireResponse() = default;
};

template <>
struct ::fidl::internal::TransactionalResponse<
    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
        LibfuzzerNeedsNonemptyProtocol>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  TransactionalResponse() { _InitHeader(); }

 private:
  void _InitHeader();
};

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireMethodTypes<
    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
        LibfuzzerNeedsNonemptyProtocol> {
  using Completer = fidl::Completer<::fidl::internal::WireCompleterBase<
      ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
          LibfuzzerNeedsNonemptyProtocol>>;

  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
          LibfuzzerNeedsNonemptyProtocol,
      ::fidl::unstable::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                  LibfuzzerNeedsNonemptyProtocol>,
          ::fidl::internal::ChannelTransport>>;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
          LibfuzzerNeedsNonemptyProtocol,
      ::fidl::unstable::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                  LibfuzzerNeedsNonemptyProtocol>,
          ::fidl::internal::ChannelTransport>>;
};

#endif  // __Fuchsia__

namespace fidl {

template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<
    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
        LibfuzzerNeedsNonemptyProtocol>> : public std::true_type {};
template <>
struct IsFidlType<
    ::fidl::WireRequest<::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                            LibfuzzerNeedsNonemptyProtocol>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<
    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
        LibfuzzerNeedsNonemptyProtocol>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireRequest<::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                            LibfuzzerNeedsNonemptyProtocol>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<
    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
        LibfuzzerNeedsNonemptyProtocol>> {
  static constexpr const fidl_type_t* kType = nullptr;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(0 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(0 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(sizeof(::fidl::internal::TransactionalRequest<
                     ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                         LibfuzzerNeedsNonemptyProtocol>) ==
              TypeTraits<::fidl::internal::TransactionalRequest<
                  ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                      LibfuzzerNeedsNonemptyProtocol>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<
                           ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                               LibfuzzerNeedsNonemptyProtocol>,
                       header) == 0);

template <>
struct TypeTraits<
    ::fidl::WireRequest<::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                            LibfuzzerNeedsNonemptyProtocol>> {
  static constexpr const fidl_type_t* kType = nullptr;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 0;
  static constexpr uint32_t kPrimarySizeV1 = 0;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

template <>
struct IsFidlType<::fidl::internal::TransactionalResponse<
    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
        LibfuzzerNeedsNonemptyProtocol>> : public std::true_type {};
template <>
struct IsFidlType<
    ::fidl::WireResponse<::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                             LibfuzzerNeedsNonemptyProtocol>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalResponse<
    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
        LibfuzzerNeedsNonemptyProtocol>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireResponse<::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                             LibfuzzerNeedsNonemptyProtocol>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalResponse<
    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
        LibfuzzerNeedsNonemptyProtocol>> {
  static constexpr const fidl_type_t* kType = nullptr;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(0 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(0 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(sizeof(::fidl::internal::TransactionalResponse<
                     ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                         LibfuzzerNeedsNonemptyProtocol>) ==
              TypeTraits<::fidl::internal::TransactionalResponse<
                  ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                      LibfuzzerNeedsNonemptyProtocol>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalResponse<
                           ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                               LibfuzzerNeedsNonemptyProtocol>,
                       header) == 0);

template <>
struct TypeTraits<
    ::fidl::WireResponse<::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                             LibfuzzerNeedsNonemptyProtocol>> {
  static constexpr const fidl_type_t* kType = nullptr;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 0;
  static constexpr uint32_t kPrimarySizeV1 = 0;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
#ifdef __Fuchsia__
}  // namespace fidl

template <>
struct ::fidl::internal::IncomingMessageStorage<
    ::fidl::internal::TransactionalResponse<
        ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
            LibfuzzerNeedsNonemptyProtocol>>
    final : public ::fidl::internal::ChannelMessageStorageBase<
                ::fidl::internal::IncomingMessageStorage<
                    ::fidl::internal::TransactionalResponse<
                        ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                            LibfuzzerNeedsNonemptyProtocol>>> {
  static constexpr uint32_t kNumHandles = fidl::internal::ClampedHandleCount<
      ::fidl::WireResponse<::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                               LibfuzzerNeedsNonemptyProtocol>,
      fidl::MessageDirection::kReceiving>();

  ::fidl::internal::InlineMessageBuffer<16> bytes_;
  ::std::array<zx_handle_t, kNumHandles> handles_;
  ::std::array<fidl_channel_handle_metadata_t, kNumHandles> handle_metadata_;
};
template <>
class [[nodiscard]] ::fidl::WireResult<
    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
        LibfuzzerNeedsNonemptyProtocol>
    final : public ::fidl::Status {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_bindingsdenylist::OnlyLibfuzzerAndDeps>
          client,
      ::fidl::internal::TransactionalRequest<
          ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
              LibfuzzerNeedsNonemptyProtocol>* request);
  WireResult(
      ::fidl::UnownedClientEnd<::test_bindingsdenylist::OnlyLibfuzzerAndDeps>
          client,
      ::fidl::internal::TransactionalRequest<
          ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
              LibfuzzerNeedsNonemptyProtocol>* request,
      zx_time_t _deadline);
  explicit WireResult(const ::fidl::Status& result) : ::fidl::Status(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult* operator=(WireResult&&) = delete;
  WireResult* operator=(const WireResult&) = delete;
  ~WireResult() = default;

 private:
  ::fidl::internal::InlineMessageBuffer<16> bytes_;
};
template <>
class [[nodiscard]] ::fidl::WireUnownedResult<
    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
        LibfuzzerNeedsNonemptyProtocol>
    final : public ::fidl::Status {
 public:
  explicit WireUnownedResult(
      ::fidl::UnownedClientEnd<::test_bindingsdenylist::OnlyLibfuzzerAndDeps>
          client_end,
      ::fidl::internal::AnyBufferAllocator& allocator,
      ::fidl::internal::TransactionalRequest<
          ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
              LibfuzzerNeedsNonemptyProtocol>* request);
  explicit WireUnownedResult(::fidl::internal::TransactionalResponse<
                             ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                                 LibfuzzerNeedsNonemptyProtocol>* response)
      : bytes_(reinterpret_cast<uint8_t*>(response)) {}
  explicit WireUnownedResult(const ::fidl::Status& result)
      : ::fidl::Status(result) {}
  explicit WireUnownedResult(
      ::fidl::unstable::DecodedMessage<::fidl::internal::TransactionalResponse<
          ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
              LibfuzzerNeedsNonemptyProtocol>>&& decoded,
      ::fidl::internal::IncomingTransportContext context)
      : ::fidl::Status(decoded) {
    if (decoded.ok()) {
      bytes_ = reinterpret_cast<uint8_t*>(decoded.PrimaryObject());
    } else {
      bytes_ = nullptr;
    }
    decoded.ReleasePrimaryObject();
  }
  WireUnownedResult(WireUnownedResult&&) = delete;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult* operator=(WireUnownedResult&&) = delete;
  WireUnownedResult* operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;

 private:
  uint8_t* bytes_;
};
template <>
class ::fidl::internal::WireEventHandlerInterface<
    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps> {
 public:
  WireEventHandlerInterface() = default;
  virtual ~WireEventHandlerInterface() = default;
};

template <>
class ::fidl::WireAsyncEventHandler<
    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps>
    : public ::fidl::internal::WireEventHandlerInterface<
          ::test_bindingsdenylist::OnlyLibfuzzerAndDeps>,
      public ::fidl::internal::AsyncEventHandler {
 public:
  WireAsyncEventHandler() = default;
};

template <>
class ::fidl::WireSyncEventHandler<
    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps>
    : public ::fidl::internal::WireEventHandlerInterface<
          ::test_bindingsdenylist::OnlyLibfuzzerAndDeps> {
 public:
  WireSyncEventHandler() = default;

  // Handle all possible events defined in this protocol.
  // Blocks to consume exactly one message from the channel, then call the
  // corresponding virtual method.
  ::fidl::Status HandleOneEvent(
      ::fidl::UnownedClientEnd<::test_bindingsdenylist::OnlyLibfuzzerAndDeps>
          client_end);

 private:
  [[maybe_unused]] bool got_transitional_ = false;
};

template <>
class ::fidl::internal::WireEventDispatcher<
    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps>
    final : public ::fidl::internal::IncomingEventDispatcher<
                ::fidl::WireAsyncEventHandler<
                    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps>> {
 public:
  explicit WireEventDispatcher(
      ::fidl::WireAsyncEventHandler<
          ::test_bindingsdenylist::OnlyLibfuzzerAndDeps>* event_handler)
      : IncomingEventDispatcher(event_handler) {}

 private:
  std::optional<::fidl::UnbindInfo> DispatchEvent(
      ::fidl::IncomingMessage& msg,
      ::fidl::internal::IncomingTransportContext transport_context) override;
};

// Methods to make a sync FIDL call directly on an unowned handle or a
// const reference to a
// |fidl::ClientEnd<::test_bindingsdenylist::OnlyLibfuzzerAndDeps>|, avoiding
// setting up a client.
template <>
class ::fidl::internal::WireSyncClientImpl<
    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps>
    final : public ::fidl::internal::SyncEndpointManagedVeneer<
                ::fidl::internal::WireSyncClientImpl<
                    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps>> {
 public:
  // Allocates 32 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                         LibfuzzerNeedsNonemptyProtocol>
  LibfuzzerNeedsNonemptyProtocol() {
    ::fidl::internal::TransactionalRequest<
        ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
            LibfuzzerNeedsNonemptyProtocol>
        _request{};
    return ::fidl::WireResult<::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                                  LibfuzzerNeedsNonemptyProtocol>(_client_end(),
                                                                  &_request);
  }

 private:
  ::fidl::UnownedClientEnd<::test_bindingsdenylist::OnlyLibfuzzerAndDeps>
  _client_end() const {
    return ::fidl::UnownedClientEnd<
        ::test_bindingsdenylist::OnlyLibfuzzerAndDeps>(
        _transport().get<::fidl::internal::ChannelTransport>());
  }
};

template <>
class ::fidl::internal::WireSyncBufferClientImpl<
    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps>
    final : public ::fidl::internal::SyncEndpointBufferVeneer<
                ::fidl::internal::WireSyncBufferClientImpl<
                    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps>> {
 public:
  // Caller provides the backing storage for FIDL message via an argument to
  // `.buffer()`.
  ::fidl::WireUnownedResult<::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                                LibfuzzerNeedsNonemptyProtocol>
  LibfuzzerNeedsNonemptyProtocol() {
    ::fidl::internal::TransactionalRequest<
        ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
            LibfuzzerNeedsNonemptyProtocol>
        _request{};
    return ::fidl::WireUnownedResult<
        ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
            LibfuzzerNeedsNonemptyProtocol>(_client_end(), _allocator(),
                                            &_request);
  }

 private:
  ::fidl::UnownedClientEnd<::test_bindingsdenylist::OnlyLibfuzzerAndDeps>
  _client_end() const {
    return ::fidl::UnownedClientEnd<
        ::test_bindingsdenylist::OnlyLibfuzzerAndDeps>(
        _transport().get<::fidl::internal::ChannelTransport>());
  }
};

template <>
class ::fidl::internal::WireCompleterImpl<
    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
        LibfuzzerNeedsNonemptyProtocol>
    : public ::fidl::internal::CompleterImplBase<
          ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
              LibfuzzerNeedsNonemptyProtocol> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply();
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<
    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
        LibfuzzerNeedsNonemptyProtocol>
    : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply();
};

template <>
class ::fidl::internal::WireCompleterBase<
    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
        LibfuzzerNeedsNonemptyProtocol>
    : public ::fidl::CompleterBase,
      public ::fidl::internal::WireCompleterImpl<
          ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
              LibfuzzerNeedsNonemptyProtocol> {
 public:
  WireCompleterBase(::fidl::Transaction* transaction, bool owned,
                    bool expects_reply)
      : CompleterBase(transaction, owned, expects_reply),
        WireCompleterImpl(this) {}
  WireCompleterBase(WireCompleterBase&& other) noexcept
      : CompleterBase(std::move(other)), WireCompleterImpl(this) {}
  WireCompleterBase& operator=(WireCompleterBase&& other) noexcept {
    CompleterBase::operator=(std::move(other));
    WireCompleterImpl::_set_core(this);
    return *this;
  }
};

// Pure-virtual interface to be implemented by a server.
// This interface uses typed channels (i.e. |fidl::ClientEnd<SomeProtocol>|
// and |fidl::ServerEnd<SomeProtocol>|).
template <>
class ::fidl::WireServer<::test_bindingsdenylist::OnlyLibfuzzerAndDeps>
    : public ::fidl::internal::IncomingMessageDispatcher {
 public:
  WireServer() = default;
  virtual ~WireServer() = default;

  // The FIDL protocol type that is implemented by this server.
  using _EnclosingProtocol = ::test_bindingsdenylist::OnlyLibfuzzerAndDeps;

  using LibfuzzerNeedsNonemptyProtocolCompleter =
      ::fidl::internal::WireCompleter<
          ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
              LibfuzzerNeedsNonemptyProtocol>;
  using LibfuzzerNeedsNonemptyProtocolRequestView =
      ::fidl::internal::WireRequestView<
          ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
              LibfuzzerNeedsNonemptyProtocol>;

  virtual void LibfuzzerNeedsNonemptyProtocol(
      LibfuzzerNeedsNonemptyProtocolRequestView request,
      LibfuzzerNeedsNonemptyProtocolCompleter::Sync& completer) = 0;

 private:
  void dispatch_message(
      ::fidl::IncomingMessage&& msg, ::fidl::Transaction* txn,
      ::fidl::internal::IncomingTransportContext transport_context) final;
};
namespace fidl {
#endif  // __Fuchsia__

}  // namespace fidl
namespace test_bindingsdenylist {}  // namespace test_bindingsdenylist
#ifdef __Fuchsia__

template <>
struct ::fidl::internal::ProtocolDetails<
    ::test_bindingsdenylist::OnlyCppAndDeps> {};
#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireServerDispatcher<
    ::test_bindingsdenylist::OnlyCppAndDeps>
    final {
  WireServerDispatcher() = delete;
  static ::fidl::DispatchResult TryDispatch(
      ::fidl::WireServer<::test_bindingsdenylist::OnlyCppAndDeps>* impl,
      ::fidl::IncomingMessage& msg,
      internal::IncomingTransportContext transport_context,
      ::fidl::Transaction* txn);
  static void Dispatch(
      ::fidl::WireServer<::test_bindingsdenylist::OnlyCppAndDeps>* impl,
      ::fidl::IncomingMessage&& msg,
      internal::IncomingTransportContext transport_context,
      ::fidl::Transaction* txn);

 private:
  static const ::fidl::internal::MethodEntry entries_[];
  static const ::fidl::internal::MethodEntry* entries_end_;
};
#endif  // __Fuchsia__

namespace fidl {

#ifdef __Fuchsia__
}  // namespace fidl
template <>
class ::fidl::internal::WireEventHandlerInterface<
    ::test_bindingsdenylist::OnlyCppAndDeps> {
 public:
  WireEventHandlerInterface() = default;
  virtual ~WireEventHandlerInterface() = default;
};

template <>
class ::fidl::WireAsyncEventHandler<::test_bindingsdenylist::OnlyCppAndDeps>
    : public ::fidl::internal::WireEventHandlerInterface<
          ::test_bindingsdenylist::OnlyCppAndDeps>,
      public ::fidl::internal::AsyncEventHandler {
 public:
  WireAsyncEventHandler() = default;
};

template <>
class ::fidl::WireSyncEventHandler<::test_bindingsdenylist::OnlyCppAndDeps>
    : public ::fidl::internal::WireEventHandlerInterface<
          ::test_bindingsdenylist::OnlyCppAndDeps> {
 public:
  WireSyncEventHandler() = default;

  // Handle all possible events defined in this protocol.
  // Blocks to consume exactly one message from the channel, then call the
  // corresponding virtual method.
  ::fidl::Status HandleOneEvent(
      ::fidl::UnownedClientEnd<::test_bindingsdenylist::OnlyCppAndDeps>
          client_end);

 private:
  [[maybe_unused]] bool got_transitional_ = false;
};

template <>
class ::fidl::internal::WireEventDispatcher<
    ::test_bindingsdenylist::OnlyCppAndDeps>
    final : public ::fidl::internal::IncomingEventDispatcher<
                ::fidl::WireAsyncEventHandler<
                    ::test_bindingsdenylist::OnlyCppAndDeps>> {
 public:
  explicit WireEventDispatcher(
      ::fidl::WireAsyncEventHandler<::test_bindingsdenylist::OnlyCppAndDeps>*
          event_handler)
      : IncomingEventDispatcher(event_handler) {}

 private:
  std::optional<::fidl::UnbindInfo> DispatchEvent(
      ::fidl::IncomingMessage& msg,
      ::fidl::internal::IncomingTransportContext transport_context) override;
};

// Methods to make a sync FIDL call directly on an unowned handle or a
// const reference to a
// |fidl::ClientEnd<::test_bindingsdenylist::OnlyCppAndDeps>|, avoiding setting
// up a client.
template <>
class ::fidl::internal::WireSyncClientImpl<
    ::test_bindingsdenylist::OnlyCppAndDeps>
    final : public ::fidl::internal::SyncEndpointManagedVeneer<
                ::fidl::internal::WireSyncClientImpl<
                    ::test_bindingsdenylist::OnlyCppAndDeps>> {
 public:
 private:
  ::fidl::UnownedClientEnd<::test_bindingsdenylist::OnlyCppAndDeps>
  _client_end() const {
    return ::fidl::UnownedClientEnd<::test_bindingsdenylist::OnlyCppAndDeps>(
        _transport().get<::fidl::internal::ChannelTransport>());
  }
};

template <>
class ::fidl::internal::WireSyncBufferClientImpl<
    ::test_bindingsdenylist::OnlyCppAndDeps>
    final : public ::fidl::internal::SyncEndpointBufferVeneer<
                ::fidl::internal::WireSyncBufferClientImpl<
                    ::test_bindingsdenylist::OnlyCppAndDeps>> {
 public:
 private:
  ::fidl::UnownedClientEnd<::test_bindingsdenylist::OnlyCppAndDeps>
  _client_end() const {
    return ::fidl::UnownedClientEnd<::test_bindingsdenylist::OnlyCppAndDeps>(
        _transport().get<::fidl::internal::ChannelTransport>());
  }
};

// Pure-virtual interface to be implemented by a server.
// This interface uses typed channels (i.e. |fidl::ClientEnd<SomeProtocol>|
// and |fidl::ServerEnd<SomeProtocol>|).
template <>
class ::fidl::WireServer<::test_bindingsdenylist::OnlyCppAndDeps>
    : public ::fidl::internal::IncomingMessageDispatcher {
 public:
  WireServer() = default;
  virtual ~WireServer() = default;

  // The FIDL protocol type that is implemented by this server.
  using _EnclosingProtocol = ::test_bindingsdenylist::OnlyCppAndDeps;

 private:
  void dispatch_message(
      ::fidl::IncomingMessage&& msg, ::fidl::Transaction* txn,
      ::fidl::internal::IncomingTransportContext transport_context) final;
};
namespace fidl {
#endif  // __Fuchsia__

}  // namespace fidl
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_bindingsdenylist::ImportsSameNameContext::Unattributed>
    final {
  static constexpr uint64_t value = 475191379775102607lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_bindingsdenylist::ImportsSameNameContext::
        AlwaysAppearsInImportingLibrary>
    final {
  static constexpr uint64_t value = 2914965219653596920lu;
};

namespace test_bindingsdenylist {}  // namespace test_bindingsdenylist
#ifdef __Fuchsia__

template <>
struct ::fidl::internal::ProtocolDetails<
    ::test_bindingsdenylist::ImportsSameNameContext> {};
#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireServerDispatcher<
    ::test_bindingsdenylist::ImportsSameNameContext>
    final {
  WireServerDispatcher() = delete;
  static ::fidl::DispatchResult TryDispatch(
      ::fidl::WireServer<::test_bindingsdenylist::ImportsSameNameContext>* impl,
      ::fidl::IncomingMessage& msg,
      internal::IncomingTransportContext transport_context,
      ::fidl::Transaction* txn);
  static void Dispatch(
      ::fidl::WireServer<::test_bindingsdenylist::ImportsSameNameContext>* impl,
      ::fidl::IncomingMessage&& msg,
      internal::IncomingTransportContext transport_context,
      ::fidl::Transaction* txn);

 private:
  static const ::fidl::internal::MethodEntry entries_[];
  static const ::fidl::internal::MethodEntry* entries_end_;
};
#endif  // __Fuchsia__

template <>
struct ::fidl::WireRequest<
    ::test_bindingsdenylist::ImportsSameNameContext::Unattributed>
    final {
  WireRequest() = default;
};

template <>
struct ::fidl::internal::TransactionalRequest<
    ::test_bindingsdenylist::ImportsSameNameContext::Unattributed>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  TransactionalRequest() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireRequest<::test_bindingsdenylist::ImportsSameNameContext::
                               AlwaysAppearsInImportingLibrary>
    final {
  WireRequest() = default;
};

template <>
struct ::fidl::internal::TransactionalRequest<
    ::test_bindingsdenylist::ImportsSameNameContext::
        AlwaysAppearsInImportingLibrary>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  TransactionalRequest() { _InitHeader(); }

 private:
  void _InitHeader();
};

namespace fidl {

template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<
    ::test_bindingsdenylist::ImportsSameNameContext::Unattributed>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireRequest<
    ::test_bindingsdenylist::ImportsSameNameContext::Unattributed>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<
    ::test_bindingsdenylist::ImportsSameNameContext::Unattributed>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::WireRequest<
    ::test_bindingsdenylist::ImportsSameNameContext::Unattributed>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<
    ::test_bindingsdenylist::ImportsSameNameContext::Unattributed>> {
  static constexpr const fidl_type_t* kType = nullptr;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(0 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(0 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(
    sizeof(::fidl::internal::TransactionalRequest<
           ::test_bindingsdenylist::ImportsSameNameContext::Unattributed>) ==
    TypeTraits<::fidl::internal::TransactionalRequest<
        ::test_bindingsdenylist::ImportsSameNameContext::Unattributed>>::
        kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalRequest<
                 ::test_bindingsdenylist::ImportsSameNameContext::Unattributed>,
             header) == 0);

template <>
struct TypeTraits<::fidl::WireRequest<
    ::test_bindingsdenylist::ImportsSameNameContext::Unattributed>> {
  static constexpr const fidl_type_t* kType = nullptr;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 0;
  static constexpr uint32_t kPrimarySizeV1 = 0;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<
    ::test_bindingsdenylist::ImportsSameNameContext::
        AlwaysAppearsInImportingLibrary>> : public std::true_type {};
template <>
struct IsFidlType<
    ::fidl::WireRequest<::test_bindingsdenylist::ImportsSameNameContext::
                            AlwaysAppearsInImportingLibrary>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<
    ::test_bindingsdenylist::ImportsSameNameContext::
        AlwaysAppearsInImportingLibrary>> : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireRequest<::test_bindingsdenylist::ImportsSameNameContext::
                            AlwaysAppearsInImportingLibrary>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<
    ::test_bindingsdenylist::ImportsSameNameContext::
        AlwaysAppearsInImportingLibrary>> {
  static constexpr const fidl_type_t* kType = nullptr;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(0 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(0 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(sizeof(::fidl::internal::TransactionalRequest<
                     ::test_bindingsdenylist::ImportsSameNameContext::
                         AlwaysAppearsInImportingLibrary>) ==
              TypeTraits<::fidl::internal::TransactionalRequest<
                  ::test_bindingsdenylist::ImportsSameNameContext::
                      AlwaysAppearsInImportingLibrary>>::kPrimarySize);
static_assert(offsetof(::fidl::internal::TransactionalRequest<
                           ::test_bindingsdenylist::ImportsSameNameContext::
                               AlwaysAppearsInImportingLibrary>,
                       header) == 0);

template <>
struct TypeTraits<
    ::fidl::WireRequest<::test_bindingsdenylist::ImportsSameNameContext::
                            AlwaysAppearsInImportingLibrary>> {
  static constexpr const fidl_type_t* kType = nullptr;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 0;
  static constexpr uint32_t kPrimarySizeV1 = 0;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};
#ifdef __Fuchsia__
}  // namespace fidl
template <>
class [[nodiscard]] ::fidl::WireResult<
    ::test_bindingsdenylist::ImportsSameNameContext::Unattributed>
    final : public ::fidl::Status {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_bindingsdenylist::ImportsSameNameContext>
          client,
      ::fidl::internal::TransactionalRequest<
          ::test_bindingsdenylist::ImportsSameNameContext::Unattributed>*
          request);
  explicit WireResult(const ::fidl::Status& result) : ::fidl::Status(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult* operator=(WireResult&&) = delete;
  WireResult* operator=(const WireResult&) = delete;
  ~WireResult() = default;

 private:
};
template <>
class [[nodiscard]] ::fidl::WireUnownedResult<
    ::test_bindingsdenylist::ImportsSameNameContext::Unattributed>
    final : public ::fidl::Status {
 public:
  explicit WireUnownedResult(
      ::fidl::UnownedClientEnd<::test_bindingsdenylist::ImportsSameNameContext>
          client_end,
      ::fidl::internal::AnyBufferAllocator& allocator,
      ::fidl::internal::TransactionalRequest<
          ::test_bindingsdenylist::ImportsSameNameContext::Unattributed>*
          request);
  explicit WireUnownedResult(const ::fidl::Status& result)
      : ::fidl::Status(result) {}
  WireUnownedResult(WireUnownedResult&&) = delete;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult* operator=(WireUnownedResult&&) = delete;
  WireUnownedResult* operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
};
template <>
class [[nodiscard]] ::fidl::WireResult<
    ::test_bindingsdenylist::ImportsSameNameContext::
        AlwaysAppearsInImportingLibrary>
    final : public ::fidl::Status {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_bindingsdenylist::ImportsSameNameContext>
          client,
      ::fidl::internal::TransactionalRequest<
          ::test_bindingsdenylist::ImportsSameNameContext::
              AlwaysAppearsInImportingLibrary>* request);
  explicit WireResult(const ::fidl::Status& result) : ::fidl::Status(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult* operator=(WireResult&&) = delete;
  WireResult* operator=(const WireResult&) = delete;
  ~WireResult() = default;

 private:
};
template <>
class [[nodiscard]] ::fidl::WireUnownedResult<
    ::test_bindingsdenylist::ImportsSameNameContext::
        AlwaysAppearsInImportingLibrary>
    final : public ::fidl::Status {
 public:
  explicit WireUnownedResult(
      ::fidl::UnownedClientEnd<::test_bindingsdenylist::ImportsSameNameContext>
          client_end,
      ::fidl::internal::AnyBufferAllocator& allocator,
      ::fidl::internal::TransactionalRequest<
          ::test_bindingsdenylist::ImportsSameNameContext::
              AlwaysAppearsInImportingLibrary>* request);
  explicit WireUnownedResult(const ::fidl::Status& result)
      : ::fidl::Status(result) {}
  WireUnownedResult(WireUnownedResult&&) = delete;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult* operator=(WireUnownedResult&&) = delete;
  WireUnownedResult* operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
};
template <>
class ::fidl::internal::WireEventHandlerInterface<
    ::test_bindingsdenylist::ImportsSameNameContext> {
 public:
  WireEventHandlerInterface() = default;
  virtual ~WireEventHandlerInterface() = default;
};

template <>
class ::fidl::WireAsyncEventHandler<
    ::test_bindingsdenylist::ImportsSameNameContext>
    : public ::fidl::internal::WireEventHandlerInterface<
          ::test_bindingsdenylist::ImportsSameNameContext>,
      public ::fidl::internal::AsyncEventHandler {
 public:
  WireAsyncEventHandler() = default;
};

template <>
class ::fidl::WireSyncEventHandler<
    ::test_bindingsdenylist::ImportsSameNameContext>
    : public ::fidl::internal::WireEventHandlerInterface<
          ::test_bindingsdenylist::ImportsSameNameContext> {
 public:
  WireSyncEventHandler() = default;

  // Handle all possible events defined in this protocol.
  // Blocks to consume exactly one message from the channel, then call the
  // corresponding virtual method.
  ::fidl::Status HandleOneEvent(
      ::fidl::UnownedClientEnd<::test_bindingsdenylist::ImportsSameNameContext>
          client_end);

 private:
  [[maybe_unused]] bool got_transitional_ = false;
};

template <>
class ::fidl::internal::WireEventDispatcher<
    ::test_bindingsdenylist::ImportsSameNameContext>
    final : public ::fidl::internal::IncomingEventDispatcher<
                ::fidl::WireAsyncEventHandler<
                    ::test_bindingsdenylist::ImportsSameNameContext>> {
 public:
  explicit WireEventDispatcher(
      ::fidl::WireAsyncEventHandler<
          ::test_bindingsdenylist::ImportsSameNameContext>* event_handler)
      : IncomingEventDispatcher(event_handler) {}

 private:
  std::optional<::fidl::UnbindInfo> DispatchEvent(
      ::fidl::IncomingMessage& msg,
      ::fidl::internal::IncomingTransportContext transport_context) override;
};

// Methods to make a sync FIDL call directly on an unowned handle or a
// const reference to a
// |fidl::ClientEnd<::test_bindingsdenylist::ImportsSameNameContext>|, avoiding
// setting up a client.
template <>
class ::fidl::internal::WireSyncClientImpl<
    ::test_bindingsdenylist::ImportsSameNameContext>
    final : public ::fidl::internal::SyncEndpointManagedVeneer<
                ::fidl::internal::WireSyncClientImpl<
                    ::test_bindingsdenylist::ImportsSameNameContext>> {
 public:
  // Allocates 32 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<
      ::test_bindingsdenylist::ImportsSameNameContext::Unattributed>
  Unattributed() {
    ::fidl::internal::TransactionalRequest<
        ::test_bindingsdenylist::ImportsSameNameContext::Unattributed>
        _request{};
    return ::fidl::WireResult<
        ::test_bindingsdenylist::ImportsSameNameContext::Unattributed>(
        _client_end(), &_request);
  }

  // Allocates 32 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<::test_bindingsdenylist::ImportsSameNameContext::
                         AlwaysAppearsInImportingLibrary>
  AlwaysAppearsInImportingLibrary() {
    ::fidl::internal::TransactionalRequest<
        ::test_bindingsdenylist::ImportsSameNameContext::
            AlwaysAppearsInImportingLibrary>
        _request{};
    return ::fidl::WireResult<::test_bindingsdenylist::ImportsSameNameContext::
                                  AlwaysAppearsInImportingLibrary>(
        _client_end(), &_request);
  }

 private:
  ::fidl::UnownedClientEnd<::test_bindingsdenylist::ImportsSameNameContext>
  _client_end() const {
    return ::fidl::UnownedClientEnd<
        ::test_bindingsdenylist::ImportsSameNameContext>(
        _transport().get<::fidl::internal::ChannelTransport>());
  }
};

template <>
class ::fidl::internal::WireSyncBufferClientImpl<
    ::test_bindingsdenylist::ImportsSameNameContext>
    final : public ::fidl::internal::SyncEndpointBufferVeneer<
                ::fidl::internal::WireSyncBufferClientImpl<
                    ::test_bindingsdenylist::ImportsSameNameContext>> {
 public:
  // Caller provides the backing storage for FIDL message via an argument to
  // `.buffer()`.
  ::fidl::WireUnownedResult<
      ::test_bindingsdenylist::ImportsSameNameContext::Unattributed>
  Unattributed() {
    ::fidl::internal::TransactionalRequest<
        ::test_bindingsdenylist::ImportsSameNameContext::Unattributed>
        _request{};
    return ::fidl::WireUnownedResult<
        ::test_bindingsdenylist::ImportsSameNameContext::Unattributed>(
        _client_end(), _allocator(), &_request);
  }

  // Caller provides the backing storage for FIDL message via an argument to
  // `.buffer()`.
  ::fidl::WireUnownedResult<::test_bindingsdenylist::ImportsSameNameContext::
                                AlwaysAppearsInImportingLibrary>
  AlwaysAppearsInImportingLibrary() {
    ::fidl::internal::TransactionalRequest<
        ::test_bindingsdenylist::ImportsSameNameContext::
            AlwaysAppearsInImportingLibrary>
        _request{};
    return ::fidl::WireUnownedResult<
        ::test_bindingsdenylist::ImportsSameNameContext::
            AlwaysAppearsInImportingLibrary>(_client_end(), _allocator(),
                                             &_request);
  }

 private:
  ::fidl::UnownedClientEnd<::test_bindingsdenylist::ImportsSameNameContext>
  _client_end() const {
    return ::fidl::UnownedClientEnd<
        ::test_bindingsdenylist::ImportsSameNameContext>(
        _transport().get<::fidl::internal::ChannelTransport>());
  }
};

// Pure-virtual interface to be implemented by a server.
// This interface uses typed channels (i.e. |fidl::ClientEnd<SomeProtocol>|
// and |fidl::ServerEnd<SomeProtocol>|).
template <>
class ::fidl::WireServer<::test_bindingsdenylist::ImportsSameNameContext>
    : public ::fidl::internal::IncomingMessageDispatcher {
 public:
  WireServer() = default;
  virtual ~WireServer() = default;

  // The FIDL protocol type that is implemented by this server.
  using _EnclosingProtocol = ::test_bindingsdenylist::ImportsSameNameContext;

  using UnattributedCompleter = ::fidl::internal::WireCompleter<
      ::test_bindingsdenylist::ImportsSameNameContext::Unattributed>;
  using UnattributedRequestView = ::fidl::internal::WireRequestView<
      ::test_bindingsdenylist::ImportsSameNameContext::Unattributed>;

  virtual void Unattributed(UnattributedRequestView request,
                            UnattributedCompleter::Sync& completer) = 0;

  using AlwaysAppearsInImportingLibraryCompleter =
      ::fidl::internal::WireCompleter<
          ::test_bindingsdenylist::ImportsSameNameContext::
              AlwaysAppearsInImportingLibrary>;
  using AlwaysAppearsInImportingLibraryRequestView =
      ::fidl::internal::WireRequestView<
          ::test_bindingsdenylist::ImportsSameNameContext::
              AlwaysAppearsInImportingLibrary>;

  virtual void AlwaysAppearsInImportingLibrary(
      AlwaysAppearsInImportingLibraryRequestView request,
      AlwaysAppearsInImportingLibraryCompleter::Sync& completer) = 0;

 private:
  void dispatch_message(
      ::fidl::IncomingMessage&& msg, ::fidl::Transaction* txn,
      ::fidl::internal::IncomingTransportContext transport_context) final;
};
namespace fidl {
#endif  // __Fuchsia__

}  // namespace fidl
namespace test_bindingsdenylist {
__LOCAL extern "C" const fidl_type_t
    test_bindingsdenylist_DenyEachBindingOnlyDenyDartRequestTable;
__LOCAL extern "C" const fidl_type_t
    test_bindingsdenylist_DenyEachBindingOnlyDenyDartTopResponseTable;
__LOCAL extern "C" const fidl_type_t
    test_bindingsdenylist_DenyEachBindingOnlyDenyGoRequestTable;
__LOCAL extern "C" const fidl_type_t
    test_bindingsdenylist_DenyEachBindingOnlyDenyGoTopResponseTable;
__LOCAL extern "C" const fidl_type_t
    test_bindingsdenylist_DenyEachBindingOnlyDenyLibfuzzerRequestTable;
__LOCAL extern "C" const fidl_type_t
    test_bindingsdenylist_DenyEachBindingOnlyDenyLibfuzzerTopResponseTable;
__LOCAL extern "C" const fidl_type_t
    test_bindingsdenylist_DenyEachBindingOnlyDenyRustRequestTable;
__LOCAL extern "C" const fidl_type_t
    test_bindingsdenylist_DenyEachBindingOnlyDenyRustTopResponseTable;
__LOCAL extern "C" const fidl_type_t
    test_bindingsdenylist_DenyEachBindingOnlyDenySyzkallerRequestTable;
__LOCAL extern "C" const fidl_type_t
    test_bindingsdenylist_DenyEachBindingOnlyDenySyzkallerTopResponseTable;
}  // namespace test_bindingsdenylist
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>
    final {
  static constexpr uint64_t value = 8446571910689294295lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>
    final {
  static constexpr uint64_t value = 7311125300308839833lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>
    final {
  static constexpr uint64_t value = 2184115815603862302lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>
    final {
  static constexpr uint64_t value = 3719805222870932662lu;
};
template <>
struct ::fidl::internal::WireOrdinal<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>
    final {
  static constexpr uint64_t value = 2319043834522757514lu;
};

namespace test_bindingsdenylist {}  // namespace test_bindingsdenylist
#ifdef __Fuchsia__

template <>
struct ::fidl::internal::ProtocolDetails<
    ::test_bindingsdenylist::DenyEachBinding> {};
#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireServerDispatcher<
    ::test_bindingsdenylist::DenyEachBinding>
    final {
  WireServerDispatcher() = delete;
  static ::fidl::DispatchResult TryDispatch(
      ::fidl::WireServer<::test_bindingsdenylist::DenyEachBinding>* impl,
      ::fidl::IncomingMessage& msg,
      internal::IncomingTransportContext transport_context,
      ::fidl::Transaction* txn);
  static void Dispatch(
      ::fidl::WireServer<::test_bindingsdenylist::DenyEachBinding>* impl,
      ::fidl::IncomingMessage&& msg,
      internal::IncomingTransportContext transport_context,
      ::fidl::Transaction* txn);

 private:
  static const ::fidl::internal::MethodEntry entries_[];
  static const ::fidl::internal::MethodEntry* entries_end_;
};
#endif  // __Fuchsia__

template <>
struct ::fidl::WireRequest<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>
    final
    : public ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartRequest {
  explicit WireRequest(
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartRequest base)
      : ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartRequest(
            std::move(base)) {}
  explicit WireRequest(bool a)
      : ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartRequest{
            .a = std::move(a)} {}
  WireRequest() = default;
  using ResponseType = ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>;
};

template <>
struct ::fidl::internal::TransactionalRequest<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireRequest<::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>
      body;
  explicit TransactionalRequest(bool a)
      : body(::fidl::WireRequest<
             ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>(a)) {
    _InitHeader();
  }
  TransactionalRequest() { _InitHeader(); }
  using ResponseType = ::fidl::internal::TransactionalResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>;

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireResponse<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>
    final : public ::test_bindingsdenylist::wire::
                DenyEachBindingOnlyDenyDartTopResponse {
  using Result = test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartResult;

  explicit WireResponse(
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartTopResponse
          base)
      : ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartTopResponse(
            std::move(base)) {}
  explicit WireResponse(
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartResult result)
      : ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartTopResponse{
            .result = std::move(result)} {}
  WireResponse() = default;
};

template <>
struct ::fidl::internal::TransactionalResponse<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireResponse<::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>
      body;
  explicit TransactionalResponse(
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartResult result)
      : body(::fidl::WireResponse<
             ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>(result)) {
    _InitHeader();
  }
  TransactionalResponse() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireRequest<::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>
    final
    : public ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoRequest {
  explicit WireRequest(
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoRequest base)
      : ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoRequest(
            std::move(base)) {}
  explicit WireRequest(bool a)
      : ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoRequest{
            .a = std::move(a)} {}
  WireRequest() = default;
  using ResponseType = ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>;
};

template <>
struct ::fidl::internal::TransactionalRequest<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireRequest<::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>
      body;
  explicit TransactionalRequest(bool a)
      : body(::fidl::WireRequest<
             ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>(a)) {
    _InitHeader();
  }
  TransactionalRequest() { _InitHeader(); }
  using ResponseType = ::fidl::internal::TransactionalResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>;

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireResponse<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>
    final : public ::test_bindingsdenylist::wire::
                DenyEachBindingOnlyDenyGoTopResponse {
  using Result = test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoResult;

  explicit WireResponse(
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoTopResponse base)
      : ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoTopResponse(
            std::move(base)) {}
  explicit WireResponse(
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoResult result)
      : ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoTopResponse{
            .result = std::move(result)} {}
  WireResponse() = default;
};

template <>
struct ::fidl::internal::TransactionalResponse<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireResponse<::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>
      body;
  explicit TransactionalResponse(
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoResult result)
      : body(::fidl::WireResponse<
             ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>(result)) {
    _InitHeader();
  }
  TransactionalResponse() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireRequest<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>
    final : public ::test_bindingsdenylist::wire::
                DenyEachBindingOnlyDenyLibfuzzerRequest {
  explicit WireRequest(
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyLibfuzzerRequest
          base)
      : ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyLibfuzzerRequest(
            std::move(base)) {}
  explicit WireRequest(bool a)
      : ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyLibfuzzerRequest{
            .a = std::move(a)} {}
  WireRequest() = default;
  using ResponseType = ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>;
};

template <>
struct ::fidl::internal::TransactionalRequest<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireRequest<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>
      body;
  explicit TransactionalRequest(bool a)
      : body(::fidl::WireRequest<
             ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>(a)) {
    _InitHeader();
  }
  TransactionalRequest() { _InitHeader(); }
  using ResponseType = ::fidl::internal::TransactionalResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>;

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireResponse<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>
    final : public ::test_bindingsdenylist::wire::
                DenyEachBindingOnlyDenyLibfuzzerTopResponse {
  using Result =
      test_bindingsdenylist::wire::DenyEachBindingOnlyDenyLibfuzzerResult;

  explicit WireResponse(
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyLibfuzzerTopResponse
          base)
      : ::test_bindingsdenylist::wire::
            DenyEachBindingOnlyDenyLibfuzzerTopResponse(std::move(base)) {}
  explicit WireResponse(
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyLibfuzzerResult
          result)
      : ::test_bindingsdenylist::wire::
            DenyEachBindingOnlyDenyLibfuzzerTopResponse{.result =
                                                            std::move(result)} {
  }
  WireResponse() = default;
};

template <>
struct ::fidl::internal::TransactionalResponse<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>
      body;
  explicit TransactionalResponse(
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyLibfuzzerResult
          result)
      : body(::fidl::WireResponse<
             ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>(
            result)) {
    _InitHeader();
  }
  TransactionalResponse() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireRequest<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>
    final
    : public ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustRequest {
  explicit WireRequest(
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustRequest base)
      : ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustRequest(
            std::move(base)) {}
  explicit WireRequest(bool a)
      : ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustRequest{
            .a = std::move(a)} {}
  WireRequest() = default;
  using ResponseType = ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>;
};

template <>
struct ::fidl::internal::TransactionalRequest<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireRequest<::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>
      body;
  explicit TransactionalRequest(bool a)
      : body(::fidl::WireRequest<
             ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>(a)) {
    _InitHeader();
  }
  TransactionalRequest() { _InitHeader(); }
  using ResponseType = ::fidl::internal::TransactionalResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>;

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireResponse<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>
    final : public ::test_bindingsdenylist::wire::
                DenyEachBindingOnlyDenyRustTopResponse {
  using Result = test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustResult;

  explicit WireResponse(
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustTopResponse
          base)
      : ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustTopResponse(
            std::move(base)) {}
  explicit WireResponse(
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustResult result)
      : ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustTopResponse{
            .result = std::move(result)} {}
  WireResponse() = default;
};

template <>
struct ::fidl::internal::TransactionalResponse<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireResponse<::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>
      body;
  explicit TransactionalResponse(
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustResult result)
      : body(::fidl::WireResponse<
             ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>(result)) {
    _InitHeader();
  }
  TransactionalResponse() { _InitHeader(); }

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireRequest<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>
    final : public ::test_bindingsdenylist::wire::
                DenyEachBindingOnlyDenySyzkallerRequest {
  explicit WireRequest(
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenySyzkallerRequest
          base)
      : ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenySyzkallerRequest(
            std::move(base)) {}
  explicit WireRequest(bool a)
      : ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenySyzkallerRequest{
            .a = std::move(a)} {}
  WireRequest() = default;
  using ResponseType = ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>;
};

template <>
struct ::fidl::internal::TransactionalRequest<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireRequest<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>
      body;
  explicit TransactionalRequest(bool a)
      : body(::fidl::WireRequest<
             ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>(a)) {
    _InitHeader();
  }
  TransactionalRequest() { _InitHeader(); }
  using ResponseType = ::fidl::internal::TransactionalResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>;

 private:
  void _InitHeader();
};

template <>
struct ::fidl::WireResponse<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>
    final : public ::test_bindingsdenylist::wire::
                DenyEachBindingOnlyDenySyzkallerTopResponse {
  using Result =
      test_bindingsdenylist::wire::DenyEachBindingOnlyDenySyzkallerResult;

  explicit WireResponse(
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenySyzkallerTopResponse
          base)
      : ::test_bindingsdenylist::wire::
            DenyEachBindingOnlyDenySyzkallerTopResponse(std::move(base)) {}
  explicit WireResponse(
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenySyzkallerResult
          result)
      : ::test_bindingsdenylist::wire::
            DenyEachBindingOnlyDenySyzkallerTopResponse{.result =
                                                            std::move(result)} {
  }
  WireResponse() = default;
};

template <>
struct ::fidl::internal::TransactionalResponse<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>
    final {
  FIDL_ALIGNDECL
  fidl_message_header_t header;

  ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>
      body;
  explicit TransactionalResponse(
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenySyzkallerResult
          result)
      : body(::fidl::WireResponse<
             ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>(
            result)) {
    _InitHeader();
  }
  TransactionalResponse() { _InitHeader(); }

 private:
  void _InitHeader();
};

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireMethodTypes<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart> {
  using Completer = fidl::Completer<::fidl::internal::WireCompleterBase<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>>;

  using ApplicationError = uint32_t;

  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart,
      ::fidl::unstable::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>,
          ::fidl::internal::ChannelTransport>>;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart,
      ::fidl::unstable::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>,
          ::fidl::internal::ChannelTransport>>;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireMethodTypes<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo> {
  using Completer = fidl::Completer<::fidl::internal::WireCompleterBase<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>>;

  using ApplicationError = uint32_t;

  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo,
      ::fidl::unstable::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>,
          ::fidl::internal::ChannelTransport>>;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo,
      ::fidl::unstable::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>,
          ::fidl::internal::ChannelTransport>>;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireMethodTypes<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer> {
  using Completer = fidl::Completer<::fidl::internal::WireCompleterBase<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>>;

  using ApplicationError = uint32_t;

  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer,
      ::fidl::unstable::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>,
          ::fidl::internal::ChannelTransport>>;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer,
      ::fidl::unstable::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>,
          ::fidl::internal::ChannelTransport>>;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireMethodTypes<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust> {
  using Completer = fidl::Completer<::fidl::internal::WireCompleterBase<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>>;

  using ApplicationError = uint32_t;

  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust,
      ::fidl::unstable::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>,
          ::fidl::internal::ChannelTransport>>;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust,
      ::fidl::unstable::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>,
          ::fidl::internal::ChannelTransport>>;
};

#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
struct ::fidl::internal::WireMethodTypes<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller> {
  using Completer = fidl::Completer<::fidl::internal::WireCompleterBase<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>>;

  using ApplicationError = uint32_t;

  using Thenable = ::fidl::internal::WireThenableImpl<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller,
      ::fidl::unstable::OwnedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>,
          ::fidl::internal::ChannelTransport>>;

  using BufferThenable = ::fidl::internal::WireThenableImpl<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller,
      ::fidl::unstable::UnownedEncodedMessage<
          ::fidl::internal::TransactionalRequest<
              ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>,
          ::fidl::internal::ChannelTransport>>;
};

#endif  // __Fuchsia__

namespace fidl {

template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>>
    : public std::true_type {};
template <>
struct IsFidlType<
    ::fidl::WireRequest<::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireRequest<::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>> {
  static constexpr const fidl_type_t* kType =
      &::test_bindingsdenylist::
          test_bindingsdenylist_DenyEachBindingOnlyDenyDartRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(1 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(1 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(
    sizeof(::fidl::internal::TransactionalRequest<
           ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>) ==
    TypeTraits<::fidl::internal::TransactionalRequest<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>>::kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalRequest<
                 ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>,
             header) == 0);
static_assert(
    offsetof(::fidl::internal::TransactionalRequest<
                 ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>,
             body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireRequest<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>> {
  static constexpr const fidl_type_t* kType =
      &::test_bindingsdenylist::
          test_bindingsdenylist_DenyEachBindingOnlyDenyDartRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 1;
  static constexpr uint32_t kPrimarySizeV1 = 1;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};
static_assert(
    sizeof(::fidl::WireRequest<
           ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>) ==
    TypeTraits<::fidl::WireRequest<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>>::kPrimarySize);
static_assert(
    offsetof(::fidl::WireRequest<
                 ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>,
             a) == 0);

template <>
struct IsFidlType<::fidl::internal::TransactionalResponse<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireResponse<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalResponse<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::WireResponse<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalResponse<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>> {
  static constexpr const fidl_type_t* kType =
      &::test_bindingsdenylist::
          test_bindingsdenylist_DenyEachBindingOnlyDenyDartTopResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(24 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalResponse<
           ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>) ==
    TypeTraits<::fidl::internal::TransactionalResponse<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>>::kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalResponse<
                 ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>,
             header) == 0);
static_assert(
    offsetof(::fidl::internal::TransactionalResponse<
                 ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>,
             body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireResponse<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>> {
  static constexpr const fidl_type_t* kType =
      &::test_bindingsdenylist::
          test_bindingsdenylist_DenyEachBindingOnlyDenyDartTopResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 24;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(::fidl::WireResponse<
           ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>) ==
    TypeTraits<::fidl::WireResponse<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>>::kPrimarySize);
static_assert(
    offsetof(::fidl::WireResponse<
                 ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>,
             result) == 0);

template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>>
    : public std::true_type {};
template <>
struct IsFidlType<
    ::fidl::WireRequest<::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireRequest<::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>> {
  static constexpr const fidl_type_t* kType =
      &::test_bindingsdenylist::
          test_bindingsdenylist_DenyEachBindingOnlyDenyGoRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(1 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(1 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(
    sizeof(::fidl::internal::TransactionalRequest<
           ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>) ==
    TypeTraits<::fidl::internal::TransactionalRequest<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>>::kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalRequest<
                 ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>,
             header) == 0);
static_assert(
    offsetof(::fidl::internal::TransactionalRequest<
                 ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>,
             body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<
    ::fidl::WireRequest<::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>> {
  static constexpr const fidl_type_t* kType =
      &::test_bindingsdenylist::
          test_bindingsdenylist_DenyEachBindingOnlyDenyGoRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 1;
  static constexpr uint32_t kPrimarySizeV1 = 1;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};
static_assert(
    sizeof(::fidl::WireRequest<
           ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>) ==
    TypeTraits<::fidl::WireRequest<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>>::kPrimarySize);
static_assert(
    offsetof(::fidl::WireRequest<
                 ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>,
             a) == 0);

template <>
struct IsFidlType<::fidl::internal::TransactionalResponse<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>>
    : public std::true_type {};
template <>
struct IsFidlType<
    ::fidl::WireResponse<::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalResponse<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireResponse<::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalResponse<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>> {
  static constexpr const fidl_type_t* kType =
      &::test_bindingsdenylist::
          test_bindingsdenylist_DenyEachBindingOnlyDenyGoTopResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(24 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalResponse<
           ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>) ==
    TypeTraits<::fidl::internal::TransactionalResponse<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>>::kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalResponse<
                 ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>,
             header) == 0);
static_assert(
    offsetof(::fidl::internal::TransactionalResponse<
                 ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>,
             body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireResponse<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>> {
  static constexpr const fidl_type_t* kType =
      &::test_bindingsdenylist::
          test_bindingsdenylist_DenyEachBindingOnlyDenyGoTopResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 24;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(::fidl::WireResponse<
           ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>) ==
    TypeTraits<::fidl::WireResponse<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>>::kPrimarySize);
static_assert(
    offsetof(::fidl::WireResponse<
                 ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>,
             result) == 0);

template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireRequest<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::WireRequest<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>> {
  static constexpr const fidl_type_t* kType =
      &::test_bindingsdenylist::
          test_bindingsdenylist_DenyEachBindingOnlyDenyLibfuzzerRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(1 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(1 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(
    sizeof(::fidl::internal::TransactionalRequest<
           ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>) ==
    TypeTraits<::fidl::internal::TransactionalRequest<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>>::
        kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalRequest<
                 ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>,
             header) == 0);
static_assert(
    offsetof(::fidl::internal::TransactionalRequest<
                 ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>,
             body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireRequest<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>> {
  static constexpr const fidl_type_t* kType =
      &::test_bindingsdenylist::
          test_bindingsdenylist_DenyEachBindingOnlyDenyLibfuzzerRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 1;
  static constexpr uint32_t kPrimarySizeV1 = 1;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};
static_assert(
    sizeof(::fidl::WireRequest<
           ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>) ==
    TypeTraits<::fidl::WireRequest<::test_bindingsdenylist::DenyEachBinding::
                                       OnlyDenyLibfuzzer>>::kPrimarySize);
static_assert(
    offsetof(::fidl::WireRequest<
                 ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>,
             a) == 0);

template <>
struct IsFidlType<::fidl::internal::TransactionalResponse<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireResponse<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalResponse<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::WireResponse<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalResponse<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>> {
  static constexpr const fidl_type_t* kType =
      &::test_bindingsdenylist::
          test_bindingsdenylist_DenyEachBindingOnlyDenyLibfuzzerTopResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(24 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalResponse<
           ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>) ==
    TypeTraits<::fidl::internal::TransactionalResponse<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>>::
        kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalResponse<
                 ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>,
             header) == 0);
static_assert(
    offsetof(::fidl::internal::TransactionalResponse<
                 ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>,
             body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireResponse<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>> {
  static constexpr const fidl_type_t* kType =
      &::test_bindingsdenylist::
          test_bindingsdenylist_DenyEachBindingOnlyDenyLibfuzzerTopResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 24;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(::fidl::WireResponse<
           ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>) ==
    TypeTraits<::fidl::WireResponse<::test_bindingsdenylist::DenyEachBinding::
                                        OnlyDenyLibfuzzer>>::kPrimarySize);
static_assert(
    offsetof(::fidl::WireResponse<
                 ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>,
             result) == 0);

template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>>
    : public std::true_type {};
template <>
struct IsFidlType<
    ::fidl::WireRequest<::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<
    ::fidl::WireRequest<::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>> {
  static constexpr const fidl_type_t* kType =
      &::test_bindingsdenylist::
          test_bindingsdenylist_DenyEachBindingOnlyDenyRustRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(1 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(1 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(
    sizeof(::fidl::internal::TransactionalRequest<
           ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>) ==
    TypeTraits<::fidl::internal::TransactionalRequest<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>>::kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalRequest<
                 ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>,
             header) == 0);
static_assert(
    offsetof(::fidl::internal::TransactionalRequest<
                 ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>,
             body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireRequest<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>> {
  static constexpr const fidl_type_t* kType =
      &::test_bindingsdenylist::
          test_bindingsdenylist_DenyEachBindingOnlyDenyRustRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 1;
  static constexpr uint32_t kPrimarySizeV1 = 1;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};
static_assert(
    sizeof(::fidl::WireRequest<
           ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>) ==
    TypeTraits<::fidl::WireRequest<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>>::kPrimarySize);
static_assert(
    offsetof(::fidl::WireRequest<
                 ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>,
             a) == 0);

template <>
struct IsFidlType<::fidl::internal::TransactionalResponse<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireResponse<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalResponse<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::WireResponse<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalResponse<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>> {
  static constexpr const fidl_type_t* kType =
      &::test_bindingsdenylist::
          test_bindingsdenylist_DenyEachBindingOnlyDenyRustTopResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(24 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalResponse<
           ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>) ==
    TypeTraits<::fidl::internal::TransactionalResponse<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>>::kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalResponse<
                 ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>,
             header) == 0);
static_assert(
    offsetof(::fidl::internal::TransactionalResponse<
                 ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>,
             body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireResponse<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>> {
  static constexpr const fidl_type_t* kType =
      &::test_bindingsdenylist::
          test_bindingsdenylist_DenyEachBindingOnlyDenyRustTopResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 24;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(::fidl::WireResponse<
           ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>) ==
    TypeTraits<::fidl::WireResponse<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>>::kPrimarySize);
static_assert(
    offsetof(::fidl::WireResponse<
                 ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>,
             result) == 0);

template <>
struct IsFidlType<::fidl::internal::TransactionalRequest<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireRequest<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalRequest<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::WireRequest<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalRequest<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>> {
  static constexpr const fidl_type_t* kType =
      &::test_bindingsdenylist::
          test_bindingsdenylist_DenyEachBindingOnlyDenySyzkallerRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(1 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(1 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};

static_assert(
    sizeof(::fidl::internal::TransactionalRequest<
           ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>) ==
    TypeTraits<::fidl::internal::TransactionalRequest<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>>::
        kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalRequest<
                 ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>,
             header) == 0);
static_assert(
    offsetof(::fidl::internal::TransactionalRequest<
                 ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>,
             body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireRequest<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>> {
  static constexpr const fidl_type_t* kType =
      &::test_bindingsdenylist::
          test_bindingsdenylist_DenyEachBindingOnlyDenySyzkallerRequestTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 1;
  static constexpr uint32_t kPrimarySizeV1 = 1;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kRequest;
};
static_assert(
    sizeof(::fidl::WireRequest<
           ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>) ==
    TypeTraits<::fidl::WireRequest<::test_bindingsdenylist::DenyEachBinding::
                                       OnlyDenySyzkaller>>::kPrimarySize);
static_assert(
    offsetof(::fidl::WireRequest<
                 ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>,
             a) == 0);

template <>
struct IsFidlType<::fidl::internal::TransactionalResponse<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>>
    : public std::true_type {};
template <>
struct IsFidlType<::fidl::WireResponse<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::internal::TransactionalResponse<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>>
    : public std::true_type {};
template <>
struct IsFidlTransactionalMessage<::fidl::WireResponse<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>>
    : public std::false_type {};

template <>
struct TypeTraits<::fidl::internal::TransactionalResponse<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>> {
  static constexpr const fidl_type_t* kType =
      &::test_bindingsdenylist::
          test_bindingsdenylist_DenyEachBindingOnlyDenySyzkallerTopResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize =
      FIDL_ALIGN(16 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kPrimarySizeV1 =
      FIDL_ALIGN(24 + sizeof(fidl_message_header_t));
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};

static_assert(
    sizeof(::fidl::internal::TransactionalResponse<
           ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>) ==
    TypeTraits<::fidl::internal::TransactionalResponse<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>>::
        kPrimarySize);
static_assert(
    offsetof(::fidl::internal::TransactionalResponse<
                 ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>,
             header) == 0);
static_assert(
    offsetof(::fidl::internal::TransactionalResponse<
                 ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>,
             body) == sizeof(fidl_message_header_t));

template <>
struct TypeTraits<::fidl::WireResponse<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>> {
  static constexpr const fidl_type_t* kType =
      &::test_bindingsdenylist::
          test_bindingsdenylist_DenyEachBindingOnlyDenySyzkallerTopResponseTable;
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kPrimarySizeV1 = 24;
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr uint32_t kMaxOutOfLineV1 = 8;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
  static constexpr ::fidl::internal::TransactionalMessageKind kMessageKind =
      ::fidl::internal::TransactionalMessageKind::kResponse;
};
static_assert(
    sizeof(::fidl::WireResponse<
           ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>) ==
    TypeTraits<::fidl::WireResponse<::test_bindingsdenylist::DenyEachBinding::
                                        OnlyDenySyzkaller>>::kPrimarySize);
static_assert(
    offsetof(::fidl::WireResponse<
                 ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>,
             result) == 0);
#ifdef __Fuchsia__
}  // namespace fidl

template <>
struct ::fidl::internal::IncomingMessageStorage<
    ::fidl::internal::TransactionalResponse<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>>
    final
    : public ::fidl::internal::ChannelMessageStorageBase<
          ::fidl::internal::IncomingMessageStorage<
              ::fidl::internal::TransactionalResponse<
                  ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>>> {
  static constexpr uint32_t kNumHandles = fidl::internal::ClampedHandleCount<
      ::fidl::WireResponse<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>,
      fidl::MessageDirection::kReceiving>();

  ::fidl::internal::InlineMessageBuffer<48> bytes_;
  ::std::array<zx_handle_t, kNumHandles> handles_;
  ::std::array<fidl_channel_handle_metadata_t, kNumHandles> handle_metadata_;
};

template <>
struct ::fidl::internal::IncomingMessageStorage<
    ::fidl::internal::TransactionalResponse<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>>
    final
    : public ::fidl::internal::ChannelMessageStorageBase<
          ::fidl::internal::IncomingMessageStorage<
              ::fidl::internal::TransactionalResponse<
                  ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>>> {
  static constexpr uint32_t kNumHandles = fidl::internal::ClampedHandleCount<
      ::fidl::WireResponse<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>,
      fidl::MessageDirection::kReceiving>();

  ::fidl::internal::InlineMessageBuffer<48> bytes_;
  ::std::array<zx_handle_t, kNumHandles> handles_;
  ::std::array<fidl_channel_handle_metadata_t, kNumHandles> handle_metadata_;
};

template <>
struct ::fidl::internal::IncomingMessageStorage<
    ::fidl::internal::TransactionalResponse<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>>
    final : public ::fidl::internal::ChannelMessageStorageBase<
                ::fidl::internal::IncomingMessageStorage<
                    ::fidl::internal::TransactionalResponse<
                        ::test_bindingsdenylist::DenyEachBinding::
                            OnlyDenyLibfuzzer>>> {
  static constexpr uint32_t kNumHandles = fidl::internal::ClampedHandleCount<
      ::fidl::WireResponse<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>,
      fidl::MessageDirection::kReceiving>();

  ::fidl::internal::InlineMessageBuffer<48> bytes_;
  ::std::array<zx_handle_t, kNumHandles> handles_;
  ::std::array<fidl_channel_handle_metadata_t, kNumHandles> handle_metadata_;
};

template <>
struct ::fidl::internal::IncomingMessageStorage<
    ::fidl::internal::TransactionalResponse<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>>
    final
    : public ::fidl::internal::ChannelMessageStorageBase<
          ::fidl::internal::IncomingMessageStorage<
              ::fidl::internal::TransactionalResponse<
                  ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>>> {
  static constexpr uint32_t kNumHandles = fidl::internal::ClampedHandleCount<
      ::fidl::WireResponse<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>,
      fidl::MessageDirection::kReceiving>();

  ::fidl::internal::InlineMessageBuffer<48> bytes_;
  ::std::array<zx_handle_t, kNumHandles> handles_;
  ::std::array<fidl_channel_handle_metadata_t, kNumHandles> handle_metadata_;
};

template <>
struct ::fidl::internal::IncomingMessageStorage<
    ::fidl::internal::TransactionalResponse<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>>
    final : public ::fidl::internal::ChannelMessageStorageBase<
                ::fidl::internal::IncomingMessageStorage<
                    ::fidl::internal::TransactionalResponse<
                        ::test_bindingsdenylist::DenyEachBinding::
                            OnlyDenySyzkaller>>> {
  static constexpr uint32_t kNumHandles = fidl::internal::ClampedHandleCount<
      ::fidl::WireResponse<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>,
      fidl::MessageDirection::kReceiving>();

  ::fidl::internal::InlineMessageBuffer<48> bytes_;
  ::std::array<zx_handle_t, kNumHandles> handles_;
  ::std::array<fidl_channel_handle_metadata_t, kNumHandles> handle_metadata_;
};
template <>
class [[nodiscard]] ::fidl::WireResult<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>
    final : public ::fidl::Status {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_bindingsdenylist::DenyEachBinding> client,
      ::fidl::internal::TransactionalRequest<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>* request);
  WireResult(
      ::fidl::UnownedClientEnd<::test_bindingsdenylist::DenyEachBinding> client,
      ::fidl::internal::TransactionalRequest<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>* request,
      zx_time_t _deadline);
  explicit WireResult(const ::fidl::Status& result) : ::fidl::Status(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult* operator=(WireResult&&) = delete;
  WireResult* operator=(const WireResult&) = delete;
  ~WireResult() = default;
  ::fidl::WireResponse<::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<::fidl::WireResponse<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }
  const ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<const ::fidl::WireResponse<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }

  ::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartResponse*>*
  Unwrap_NEW() {
    return &result_.value();
  }
  const ::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartResponse*>*
  Unwrap_NEW() const {
    return &result_.value();
  }

  ::fidl::WireResponse<::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>&
  value() const {
    return *Unwrap();
  }

  ::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartResponse*>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartResponse*>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>&
  operator*() const {
    return value();
  }

 private:
  ::fidl::internal::InlineMessageBuffer<48> bytes_;
  std::optional<::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartResponse*>>
      result_ = std::nullopt;
};
template <>
class [[nodiscard]] ::fidl::WireUnownedResult<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>
    final : public ::fidl::Status {
 public:
  explicit WireUnownedResult(
      ::fidl::UnownedClientEnd<::test_bindingsdenylist::DenyEachBinding>
          client_end,
      ::fidl::internal::AnyBufferAllocator& allocator,
      ::fidl::internal::TransactionalRequest<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>* request);
  explicit WireUnownedResult(
      ::fidl::internal::TransactionalResponse<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>* response)
      : bytes_(reinterpret_cast<uint8_t*>(response)) {
    auto* raw_response = reinterpret_cast<::fidl::WireResponse<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>*>(
        bytes_ + sizeof(fidl_message_header_t));
    if (raw_response->result.is_err()) {
      result_ = fitx::error(raw_response->result.err());
    } else {
      result_ = fitx::ok(&(raw_response->result.response()));
    }
  }
  explicit WireUnownedResult(const ::fidl::Status& result)
      : ::fidl::Status(result) {}
  explicit WireUnownedResult(
      ::fidl::unstable::DecodedMessage<::fidl::internal::TransactionalResponse<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>>&& decoded,
      ::fidl::internal::IncomingTransportContext context)
      : ::fidl::Status(decoded) {
    if (decoded.ok()) {
      bytes_ = reinterpret_cast<uint8_t*>(decoded.PrimaryObject());
      auto* raw_response = reinterpret_cast<::fidl::WireResponse<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>*>(
          bytes_ + sizeof(fidl_message_header_t));
      if (raw_response->result.is_err()) {
        result_ = fitx::error(raw_response->result.err());
      } else if (raw_response->result.is_response()) {
        result_ = fitx::ok(&(raw_response->result.response()));
      }
    } else {
      bytes_ = nullptr;
    }
    decoded.ReleasePrimaryObject();
  }
  WireUnownedResult(WireUnownedResult&&) = delete;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult* operator=(WireUnownedResult&&) = delete;
  WireUnownedResult* operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
  ::fidl::WireResponse<::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return &(
        reinterpret_cast<::fidl::internal::TransactionalResponse<
            ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>*>(bytes_)
            ->body);
  }
  const ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return &(
        reinterpret_cast<const ::fidl::internal::TransactionalResponse<
            ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>*>(bytes_)
            ->body);
  }

  ::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartResponse*>*
  Unwrap_NEW() {
    return &result_.value();
  }
  const ::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartResponse*>*
  Unwrap_NEW() const {
    return &result_.value();
  }

  ::fidl::WireResponse<::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>&
  value() const {
    return *Unwrap();
  }

  ::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartResponse*>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartResponse*>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>&
  operator*() const {
    return value();
  }

 private:
  uint8_t* bytes_;
  std::optional<::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartResponse*>>
      result_ = std::nullopt;
};
template <>
class [[nodiscard]] ::fidl::WireResult<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>
    final : public ::fidl::Status {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_bindingsdenylist::DenyEachBinding> client,
      ::fidl::internal::TransactionalRequest<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>* request);
  WireResult(
      ::fidl::UnownedClientEnd<::test_bindingsdenylist::DenyEachBinding> client,
      ::fidl::internal::TransactionalRequest<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>* request,
      zx_time_t _deadline);
  explicit WireResult(const ::fidl::Status& result) : ::fidl::Status(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult* operator=(WireResult&&) = delete;
  WireResult* operator=(const WireResult&) = delete;
  ~WireResult() = default;
  ::fidl::WireResponse<::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<::fidl::WireResponse<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }
  const ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<const ::fidl::WireResponse<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }

  ::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoResponse*>*
  Unwrap_NEW() {
    return &result_.value();
  }
  const ::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoResponse*>*
  Unwrap_NEW() const {
    return &result_.value();
  }

  ::fidl::WireResponse<::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>&
  value() const {
    return *Unwrap();
  }

  ::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoResponse*>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoResponse*>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>&
  operator*() const {
    return value();
  }

 private:
  ::fidl::internal::InlineMessageBuffer<48> bytes_;
  std::optional<::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoResponse*>>
      result_ = std::nullopt;
};
template <>
class [[nodiscard]] ::fidl::WireUnownedResult<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>
    final : public ::fidl::Status {
 public:
  explicit WireUnownedResult(
      ::fidl::UnownedClientEnd<::test_bindingsdenylist::DenyEachBinding>
          client_end,
      ::fidl::internal::AnyBufferAllocator& allocator,
      ::fidl::internal::TransactionalRequest<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>* request);
  explicit WireUnownedResult(
      ::fidl::internal::TransactionalResponse<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>* response)
      : bytes_(reinterpret_cast<uint8_t*>(response)) {
    auto* raw_response = reinterpret_cast<::fidl::WireResponse<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>*>(
        bytes_ + sizeof(fidl_message_header_t));
    if (raw_response->result.is_err()) {
      result_ = fitx::error(raw_response->result.err());
    } else {
      result_ = fitx::ok(&(raw_response->result.response()));
    }
  }
  explicit WireUnownedResult(const ::fidl::Status& result)
      : ::fidl::Status(result) {}
  explicit WireUnownedResult(
      ::fidl::unstable::DecodedMessage<::fidl::internal::TransactionalResponse<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>>&& decoded,
      ::fidl::internal::IncomingTransportContext context)
      : ::fidl::Status(decoded) {
    if (decoded.ok()) {
      bytes_ = reinterpret_cast<uint8_t*>(decoded.PrimaryObject());
      auto* raw_response = reinterpret_cast<::fidl::WireResponse<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>*>(
          bytes_ + sizeof(fidl_message_header_t));
      if (raw_response->result.is_err()) {
        result_ = fitx::error(raw_response->result.err());
      } else if (raw_response->result.is_response()) {
        result_ = fitx::ok(&(raw_response->result.response()));
      }
    } else {
      bytes_ = nullptr;
    }
    decoded.ReleasePrimaryObject();
  }
  WireUnownedResult(WireUnownedResult&&) = delete;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult* operator=(WireUnownedResult&&) = delete;
  WireUnownedResult* operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
  ::fidl::WireResponse<::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<::fidl::internal::TransactionalResponse<
                 ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>*>(bytes_)
                 ->body);
  }
  const ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<const ::fidl::internal::TransactionalResponse<
                 ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>*>(bytes_)
                 ->body);
  }

  ::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoResponse*>*
  Unwrap_NEW() {
    return &result_.value();
  }
  const ::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoResponse*>*
  Unwrap_NEW() const {
    return &result_.value();
  }

  ::fidl::WireResponse<::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>&
  value() const {
    return *Unwrap();
  }

  ::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoResponse*>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoResponse*>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>&
  operator*() const {
    return value();
  }

 private:
  uint8_t* bytes_;
  std::optional<::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoResponse*>>
      result_ = std::nullopt;
};
template <>
class [[nodiscard]] ::fidl::WireResult<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>
    final : public ::fidl::Status {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_bindingsdenylist::DenyEachBinding> client,
      ::fidl::internal::TransactionalRequest<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>*
          request);
  WireResult(
      ::fidl::UnownedClientEnd<::test_bindingsdenylist::DenyEachBinding> client,
      ::fidl::internal::TransactionalRequest<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>* request,
      zx_time_t _deadline);
  explicit WireResult(const ::fidl::Status& result) : ::fidl::Status(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult* operator=(WireResult&&) = delete;
  WireResult* operator=(const WireResult&) = delete;
  ~WireResult() = default;
  ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<::fidl::WireResponse<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }
  const ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<const ::fidl::WireResponse<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }

  ::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyLibfuzzerResponse*>*
  Unwrap_NEW() {
    return &result_.value();
  }
  const ::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyLibfuzzerResponse*>*
  Unwrap_NEW() const {
    return &result_.value();
  }

  ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>&
  value() const {
    return *Unwrap();
  }

  ::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyLibfuzzerResponse*>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyLibfuzzerResponse*>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>&
  operator*() const {
    return value();
  }

 private:
  ::fidl::internal::InlineMessageBuffer<48> bytes_;
  std::optional<::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyLibfuzzerResponse*>>
      result_ = std::nullopt;
};
template <>
class [[nodiscard]] ::fidl::WireUnownedResult<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>
    final : public ::fidl::Status {
 public:
  explicit WireUnownedResult(
      ::fidl::UnownedClientEnd<::test_bindingsdenylist::DenyEachBinding>
          client_end,
      ::fidl::internal::AnyBufferAllocator& allocator,
      ::fidl::internal::TransactionalRequest<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>*
          request);
  explicit WireUnownedResult(
      ::fidl::internal::TransactionalResponse<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>*
          response)
      : bytes_(reinterpret_cast<uint8_t*>(response)) {
    auto* raw_response = reinterpret_cast<::fidl::WireResponse<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>*>(
        bytes_ + sizeof(fidl_message_header_t));
    if (raw_response->result.is_err()) {
      result_ = fitx::error(raw_response->result.err());
    } else {
      result_ = fitx::ok(&(raw_response->result.response()));
    }
  }
  explicit WireUnownedResult(const ::fidl::Status& result)
      : ::fidl::Status(result) {}
  explicit WireUnownedResult(
      ::fidl::unstable::DecodedMessage<::fidl::internal::TransactionalResponse<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>>&&
          decoded,
      ::fidl::internal::IncomingTransportContext context)
      : ::fidl::Status(decoded) {
    if (decoded.ok()) {
      bytes_ = reinterpret_cast<uint8_t*>(decoded.PrimaryObject());
      auto* raw_response = reinterpret_cast<::fidl::WireResponse<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>*>(
          bytes_ + sizeof(fidl_message_header_t));
      if (raw_response->result.is_err()) {
        result_ = fitx::error(raw_response->result.err());
      } else if (raw_response->result.is_response()) {
        result_ = fitx::ok(&(raw_response->result.response()));
      }
    } else {
      bytes_ = nullptr;
    }
    decoded.ReleasePrimaryObject();
  }
  WireUnownedResult(WireUnownedResult&&) = delete;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult* operator=(WireUnownedResult&&) = delete;
  WireUnownedResult* operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
  ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<::fidl::internal::TransactionalResponse<
                 ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>*>(
                 bytes_)
                 ->body);
  }
  const ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<const ::fidl::internal::TransactionalResponse<
                 ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>*>(
                 bytes_)
                 ->body);
  }

  ::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyLibfuzzerResponse*>*
  Unwrap_NEW() {
    return &result_.value();
  }
  const ::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyLibfuzzerResponse*>*
  Unwrap_NEW() const {
    return &result_.value();
  }

  ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>&
  value() const {
    return *Unwrap();
  }

  ::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyLibfuzzerResponse*>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyLibfuzzerResponse*>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>&
  operator*() const {
    return value();
  }

 private:
  uint8_t* bytes_;
  std::optional<::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyLibfuzzerResponse*>>
      result_ = std::nullopt;
};
template <>
class [[nodiscard]] ::fidl::WireResult<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>
    final : public ::fidl::Status {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_bindingsdenylist::DenyEachBinding> client,
      ::fidl::internal::TransactionalRequest<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>* request);
  WireResult(
      ::fidl::UnownedClientEnd<::test_bindingsdenylist::DenyEachBinding> client,
      ::fidl::internal::TransactionalRequest<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>* request,
      zx_time_t _deadline);
  explicit WireResult(const ::fidl::Status& result) : ::fidl::Status(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult* operator=(WireResult&&) = delete;
  WireResult* operator=(const WireResult&) = delete;
  ~WireResult() = default;
  ::fidl::WireResponse<::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<::fidl::WireResponse<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }
  const ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<const ::fidl::WireResponse<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }

  ::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustResponse*>*
  Unwrap_NEW() {
    return &result_.value();
  }
  const ::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustResponse*>*
  Unwrap_NEW() const {
    return &result_.value();
  }

  ::fidl::WireResponse<::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>&
  value() const {
    return *Unwrap();
  }

  ::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustResponse*>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustResponse*>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>&
  operator*() const {
    return value();
  }

 private:
  ::fidl::internal::InlineMessageBuffer<48> bytes_;
  std::optional<::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustResponse*>>
      result_ = std::nullopt;
};
template <>
class [[nodiscard]] ::fidl::WireUnownedResult<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>
    final : public ::fidl::Status {
 public:
  explicit WireUnownedResult(
      ::fidl::UnownedClientEnd<::test_bindingsdenylist::DenyEachBinding>
          client_end,
      ::fidl::internal::AnyBufferAllocator& allocator,
      ::fidl::internal::TransactionalRequest<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>* request);
  explicit WireUnownedResult(
      ::fidl::internal::TransactionalResponse<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>* response)
      : bytes_(reinterpret_cast<uint8_t*>(response)) {
    auto* raw_response = reinterpret_cast<::fidl::WireResponse<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>*>(
        bytes_ + sizeof(fidl_message_header_t));
    if (raw_response->result.is_err()) {
      result_ = fitx::error(raw_response->result.err());
    } else {
      result_ = fitx::ok(&(raw_response->result.response()));
    }
  }
  explicit WireUnownedResult(const ::fidl::Status& result)
      : ::fidl::Status(result) {}
  explicit WireUnownedResult(
      ::fidl::unstable::DecodedMessage<::fidl::internal::TransactionalResponse<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>>&& decoded,
      ::fidl::internal::IncomingTransportContext context)
      : ::fidl::Status(decoded) {
    if (decoded.ok()) {
      bytes_ = reinterpret_cast<uint8_t*>(decoded.PrimaryObject());
      auto* raw_response = reinterpret_cast<::fidl::WireResponse<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>*>(
          bytes_ + sizeof(fidl_message_header_t));
      if (raw_response->result.is_err()) {
        result_ = fitx::error(raw_response->result.err());
      } else if (raw_response->result.is_response()) {
        result_ = fitx::ok(&(raw_response->result.response()));
      }
    } else {
      bytes_ = nullptr;
    }
    decoded.ReleasePrimaryObject();
  }
  WireUnownedResult(WireUnownedResult&&) = delete;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult* operator=(WireUnownedResult&&) = delete;
  WireUnownedResult* operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
  ::fidl::WireResponse<::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return &(
        reinterpret_cast<::fidl::internal::TransactionalResponse<
            ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>*>(bytes_)
            ->body);
  }
  const ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return &(
        reinterpret_cast<const ::fidl::internal::TransactionalResponse<
            ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>*>(bytes_)
            ->body);
  }

  ::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustResponse*>*
  Unwrap_NEW() {
    return &result_.value();
  }
  const ::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustResponse*>*
  Unwrap_NEW() const {
    return &result_.value();
  }

  ::fidl::WireResponse<::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>&
  value() const {
    return *Unwrap();
  }

  ::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustResponse*>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustResponse*>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>&
  operator*() const {
    return value();
  }

 private:
  uint8_t* bytes_;
  std::optional<::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustResponse*>>
      result_ = std::nullopt;
};
template <>
class [[nodiscard]] ::fidl::WireResult<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>
    final : public ::fidl::Status {
 public:
  WireResult(
      ::fidl::UnownedClientEnd<::test_bindingsdenylist::DenyEachBinding> client,
      ::fidl::internal::TransactionalRequest<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>*
          request);
  WireResult(
      ::fidl::UnownedClientEnd<::test_bindingsdenylist::DenyEachBinding> client,
      ::fidl::internal::TransactionalRequest<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>* request,
      zx_time_t _deadline);
  explicit WireResult(const ::fidl::Status& result) : ::fidl::Status(result) {}
  WireResult(WireResult&&) = delete;
  WireResult(const WireResult&) = delete;
  WireResult* operator=(WireResult&&) = delete;
  WireResult* operator=(const WireResult&) = delete;
  ~WireResult() = default;
  ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<::fidl::WireResponse<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }
  const ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return reinterpret_cast<const ::fidl::WireResponse<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>*>(
        bytes_.data() + sizeof(fidl_message_header_t));
  }

  ::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenySyzkallerResponse*>*
  Unwrap_NEW() {
    return &result_.value();
  }
  const ::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenySyzkallerResponse*>*
  Unwrap_NEW() const {
    return &result_.value();
  }

  ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>&
  value() const {
    return *Unwrap();
  }

  ::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenySyzkallerResponse*>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenySyzkallerResponse*>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>&
  operator*() const {
    return value();
  }

 private:
  ::fidl::internal::InlineMessageBuffer<48> bytes_;
  std::optional<::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenySyzkallerResponse*>>
      result_ = std::nullopt;
};
template <>
class [[nodiscard]] ::fidl::WireUnownedResult<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>
    final : public ::fidl::Status {
 public:
  explicit WireUnownedResult(
      ::fidl::UnownedClientEnd<::test_bindingsdenylist::DenyEachBinding>
          client_end,
      ::fidl::internal::AnyBufferAllocator& allocator,
      ::fidl::internal::TransactionalRequest<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>*
          request);
  explicit WireUnownedResult(
      ::fidl::internal::TransactionalResponse<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>*
          response)
      : bytes_(reinterpret_cast<uint8_t*>(response)) {
    auto* raw_response = reinterpret_cast<::fidl::WireResponse<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>*>(
        bytes_ + sizeof(fidl_message_header_t));
    if (raw_response->result.is_err()) {
      result_ = fitx::error(raw_response->result.err());
    } else {
      result_ = fitx::ok(&(raw_response->result.response()));
    }
  }
  explicit WireUnownedResult(const ::fidl::Status& result)
      : ::fidl::Status(result) {}
  explicit WireUnownedResult(
      ::fidl::unstable::DecodedMessage<::fidl::internal::TransactionalResponse<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>>&&
          decoded,
      ::fidl::internal::IncomingTransportContext context)
      : ::fidl::Status(decoded) {
    if (decoded.ok()) {
      bytes_ = reinterpret_cast<uint8_t*>(decoded.PrimaryObject());
      auto* raw_response = reinterpret_cast<::fidl::WireResponse<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>*>(
          bytes_ + sizeof(fidl_message_header_t));
      if (raw_response->result.is_err()) {
        result_ = fitx::error(raw_response->result.err());
      } else if (raw_response->result.is_response()) {
        result_ = fitx::ok(&(raw_response->result.response()));
      }
    } else {
      bytes_ = nullptr;
    }
    decoded.ReleasePrimaryObject();
  }
  WireUnownedResult(WireUnownedResult&&) = delete;
  WireUnownedResult(const WireUnownedResult&) = delete;
  WireUnownedResult* operator=(WireUnownedResult&&) = delete;
  WireUnownedResult* operator=(const WireUnownedResult&) = delete;
  ~WireUnownedResult() = default;
  ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>*
  Unwrap() {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<::fidl::internal::TransactionalResponse<
                 ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>*>(
                 bytes_)
                 ->body);
  }
  const ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>*
  Unwrap() const {
    ZX_DEBUG_ASSERT(ok());
    return &(reinterpret_cast<const ::fidl::internal::TransactionalResponse<
                 ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>*>(
                 bytes_)
                 ->body);
  }

  ::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenySyzkallerResponse*>*
  Unwrap_NEW() {
    return &result_.value();
  }
  const ::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenySyzkallerResponse*>*
  Unwrap_NEW() const {
    return &result_.value();
  }

  ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>&
  value() {
    return *Unwrap();
  }
  const ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>&
  value() const {
    return *Unwrap();
  }

  ::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenySyzkallerResponse*>&
  value_NEW() {
    return *Unwrap_NEW();
  }
  const ::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenySyzkallerResponse*>&
  value_NEW() const {
    return *Unwrap_NEW();
  }

  ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>*
  operator->() {
    return &value();
  }
  const ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>*
  operator->() const {
    return &value();
  }

  ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>&
  operator*() {
    return value();
  }
  const ::fidl::WireResponse<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>&
  operator*() const {
    return value();
  }

 private:
  uint8_t* bytes_;
  std::optional<::fitx::result<
      uint32_t,
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenySyzkallerResponse*>>
      result_ = std::nullopt;
};
template <>
class ::fidl::internal::WireEventHandlerInterface<
    ::test_bindingsdenylist::DenyEachBinding> {
 public:
  WireEventHandlerInterface() = default;
  virtual ~WireEventHandlerInterface() = default;
};

template <>
class ::fidl::WireAsyncEventHandler<::test_bindingsdenylist::DenyEachBinding>
    : public ::fidl::internal::WireEventHandlerInterface<
          ::test_bindingsdenylist::DenyEachBinding>,
      public ::fidl::internal::AsyncEventHandler {
 public:
  WireAsyncEventHandler() = default;
};

template <>
class ::fidl::WireSyncEventHandler<::test_bindingsdenylist::DenyEachBinding>
    : public ::fidl::internal::WireEventHandlerInterface<
          ::test_bindingsdenylist::DenyEachBinding> {
 public:
  WireSyncEventHandler() = default;

  // Handle all possible events defined in this protocol.
  // Blocks to consume exactly one message from the channel, then call the
  // corresponding virtual method.
  ::fidl::Status HandleOneEvent(
      ::fidl::UnownedClientEnd<::test_bindingsdenylist::DenyEachBinding>
          client_end);

 private:
  [[maybe_unused]] bool got_transitional_ = false;
};

template <>
class ::fidl::internal::WireEventDispatcher<
    ::test_bindingsdenylist::DenyEachBinding>
    final : public ::fidl::internal::IncomingEventDispatcher<
                ::fidl::WireAsyncEventHandler<
                    ::test_bindingsdenylist::DenyEachBinding>> {
 public:
  explicit WireEventDispatcher(
      ::fidl::WireAsyncEventHandler<::test_bindingsdenylist::DenyEachBinding>*
          event_handler)
      : IncomingEventDispatcher(event_handler) {}

 private:
  std::optional<::fidl::UnbindInfo> DispatchEvent(
      ::fidl::IncomingMessage& msg,
      ::fidl::internal::IncomingTransportContext transport_context) override;
};

// Methods to make a sync FIDL call directly on an unowned handle or a
// const reference to a
// |fidl::ClientEnd<::test_bindingsdenylist::DenyEachBinding>|, avoiding setting
// up a client.
template <>
class ::fidl::internal::WireSyncClientImpl<
    ::test_bindingsdenylist::DenyEachBinding>
    final : public ::fidl::internal::SyncEndpointManagedVeneer<
                ::fidl::internal::WireSyncClientImpl<
                    ::test_bindingsdenylist::DenyEachBinding>> {
 public:
  // Allocates 56 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>
  OnlyDenyDart(bool a) {
    ::fidl::internal::TransactionalRequest<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>
        _request{a};
    return ::fidl::WireResult<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>(_client_end(),
                                                                &_request);
  }

  // Allocates 56 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>
  OnlyDenyGo(bool a) {
    ::fidl::internal::TransactionalRequest<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>
        _request{a};
    return ::fidl::WireResult<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>(_client_end(),
                                                              &_request);
  }

  // Allocates 56 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>
  OnlyDenyLibfuzzer(bool a) {
    ::fidl::internal::TransactionalRequest<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>
        _request{a};
    return ::fidl::WireResult<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>(
        _client_end(), &_request);
  }

  // Allocates 56 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>
  OnlyDenyRust(bool a) {
    ::fidl::internal::TransactionalRequest<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>
        _request{a};
    return ::fidl::WireResult<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>(_client_end(),
                                                                &_request);
  }

  // Allocates 56 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>
  OnlyDenySyzkaller(bool a) {
    ::fidl::internal::TransactionalRequest<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>
        _request{a};
    return ::fidl::WireResult<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>(
        _client_end(), &_request);
  }

 private:
  ::fidl::UnownedClientEnd<::test_bindingsdenylist::DenyEachBinding>
  _client_end() const {
    return ::fidl::UnownedClientEnd<::test_bindingsdenylist::DenyEachBinding>(
        _transport().get<::fidl::internal::ChannelTransport>());
  }
};

template <>
class ::fidl::internal::WireSyncBufferClientImpl<
    ::test_bindingsdenylist::DenyEachBinding>
    final : public ::fidl::internal::SyncEndpointBufferVeneer<
                ::fidl::internal::WireSyncBufferClientImpl<
                    ::test_bindingsdenylist::DenyEachBinding>> {
 public:
  // Caller provides the backing storage for FIDL message via an argument to
  // `.buffer()`.
  ::fidl::WireUnownedResult<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>
  OnlyDenyDart(bool a) {
    ::fidl::internal::TransactionalRequest<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>
        _request{a};
    return ::fidl::WireUnownedResult<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>(
        _client_end(), _allocator(), &_request);
  }

  // Caller provides the backing storage for FIDL message via an argument to
  // `.buffer()`.
  ::fidl::WireUnownedResult<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>
  OnlyDenyGo(bool a) {
    ::fidl::internal::TransactionalRequest<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>
        _request{a};
    return ::fidl::WireUnownedResult<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>(
        _client_end(), _allocator(), &_request);
  }

  // Caller provides the backing storage for FIDL message via an argument to
  // `.buffer()`.
  ::fidl::WireUnownedResult<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>
  OnlyDenyLibfuzzer(bool a) {
    ::fidl::internal::TransactionalRequest<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>
        _request{a};
    return ::fidl::WireUnownedResult<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>(
        _client_end(), _allocator(), &_request);
  }

  // Caller provides the backing storage for FIDL message via an argument to
  // `.buffer()`.
  ::fidl::WireUnownedResult<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>
  OnlyDenyRust(bool a) {
    ::fidl::internal::TransactionalRequest<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>
        _request{a};
    return ::fidl::WireUnownedResult<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>(
        _client_end(), _allocator(), &_request);
  }

  // Caller provides the backing storage for FIDL message via an argument to
  // `.buffer()`.
  ::fidl::WireUnownedResult<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>
  OnlyDenySyzkaller(bool a) {
    ::fidl::internal::TransactionalRequest<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>
        _request{a};
    return ::fidl::WireUnownedResult<
        ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>(
        _client_end(), _allocator(), &_request);
  }

 private:
  ::fidl::UnownedClientEnd<::test_bindingsdenylist::DenyEachBinding>
  _client_end() const {
    return ::fidl::UnownedClientEnd<::test_bindingsdenylist::DenyEachBinding>(
        _transport().get<::fidl::internal::ChannelTransport>());
  }
};

template <>
class ::fidl::internal::WireCompleterImpl<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>
    : public ::fidl::internal::CompleterImplBase<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartResult result);
  void ReplySuccess(int32_t b);
  void ReplyError(uint32_t error);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>
    : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyDartResult result);
  void ReplySuccess(int32_t b);
  void ReplyError(uint32_t error);
};

template <>
class ::fidl::internal::WireCompleterBase<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>
    : public ::fidl::CompleterBase,
      public ::fidl::internal::WireCompleterImpl<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart> {
 public:
  WireCompleterBase(::fidl::Transaction* transaction, bool owned,
                    bool expects_reply)
      : CompleterBase(transaction, owned, expects_reply),
        WireCompleterImpl(this) {}
  WireCompleterBase(WireCompleterBase&& other) noexcept
      : CompleterBase(std::move(other)), WireCompleterImpl(this) {}
  WireCompleterBase& operator=(WireCompleterBase&& other) noexcept {
    CompleterBase::operator=(std::move(other));
    WireCompleterImpl::_set_core(this);
    return *this;
  }
};

template <>
class ::fidl::internal::WireCompleterImpl<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>
    : public ::fidl::internal::CompleterImplBase<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoResult result);
  void ReplySuccess(int32_t b);
  void ReplyError(uint32_t error);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>
    : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyGoResult result);
  void ReplySuccess(int32_t b);
  void ReplyError(uint32_t error);
};

template <>
class ::fidl::internal::WireCompleterBase<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>
    : public ::fidl::CompleterBase,
      public ::fidl::internal::WireCompleterImpl<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo> {
 public:
  WireCompleterBase(::fidl::Transaction* transaction, bool owned,
                    bool expects_reply)
      : CompleterBase(transaction, owned, expects_reply),
        WireCompleterImpl(this) {}
  WireCompleterBase(WireCompleterBase&& other) noexcept
      : CompleterBase(std::move(other)), WireCompleterImpl(this) {}
  WireCompleterBase& operator=(WireCompleterBase&& other) noexcept {
    CompleterBase::operator=(std::move(other));
    WireCompleterImpl::_set_core(this);
    return *this;
  }
};

template <>
class ::fidl::internal::WireCompleterImpl<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>
    : public ::fidl::internal::CompleterImplBase<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyLibfuzzerResult
          result);
  void ReplySuccess(int32_t b);
  void ReplyError(uint32_t error);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>
    : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyLibfuzzerResult
          result);
  void ReplySuccess(int32_t b);
  void ReplyError(uint32_t error);
};

template <>
class ::fidl::internal::WireCompleterBase<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>
    : public ::fidl::CompleterBase,
      public ::fidl::internal::WireCompleterImpl<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer> {
 public:
  WireCompleterBase(::fidl::Transaction* transaction, bool owned,
                    bool expects_reply)
      : CompleterBase(transaction, owned, expects_reply),
        WireCompleterImpl(this) {}
  WireCompleterBase(WireCompleterBase&& other) noexcept
      : CompleterBase(std::move(other)), WireCompleterImpl(this) {}
  WireCompleterBase& operator=(WireCompleterBase&& other) noexcept {
    CompleterBase::operator=(std::move(other));
    WireCompleterImpl::_set_core(this);
    return *this;
  }
};

template <>
class ::fidl::internal::WireCompleterImpl<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>
    : public ::fidl::internal::CompleterImplBase<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustResult result);
  void ReplySuccess(int32_t b);
  void ReplyError(uint32_t error);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>
    : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenyRustResult result);
  void ReplySuccess(int32_t b);
  void ReplyError(uint32_t error);
};

template <>
class ::fidl::internal::WireCompleterBase<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>
    : public ::fidl::CompleterBase,
      public ::fidl::internal::WireCompleterImpl<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust> {
 public:
  WireCompleterBase(::fidl::Transaction* transaction, bool owned,
                    bool expects_reply)
      : CompleterBase(transaction, owned, expects_reply),
        WireCompleterImpl(this) {}
  WireCompleterBase(WireCompleterBase&& other) noexcept
      : CompleterBase(std::move(other)), WireCompleterImpl(this) {}
  WireCompleterBase& operator=(WireCompleterBase&& other) noexcept {
    CompleterBase::operator=(std::move(other));
    WireCompleterImpl::_set_core(this);
    return *this;
  }
};

template <>
class ::fidl::internal::WireCompleterImpl<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>
    : public ::fidl::internal::CompleterImplBase<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller> {
 public:
  using CompleterImplBase::CompleterImplBase;

  void Reply(
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenySyzkallerResult
          result);
  void ReplySuccess(int32_t b);
  void ReplyError(uint32_t error);
};

template <>
class ::fidl::internal::WireBufferCompleterImpl<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>
    : public ::fidl::internal::BufferCompleterImplBase {
 public:
  using BufferCompleterImplBase::BufferCompleterImplBase;

  void Reply(
      ::test_bindingsdenylist::wire::DenyEachBindingOnlyDenySyzkallerResult
          result);
  void ReplySuccess(int32_t b);
  void ReplyError(uint32_t error);
};

template <>
class ::fidl::internal::WireCompleterBase<
    ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>
    : public ::fidl::CompleterBase,
      public ::fidl::internal::WireCompleterImpl<
          ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller> {
 public:
  WireCompleterBase(::fidl::Transaction* transaction, bool owned,
                    bool expects_reply)
      : CompleterBase(transaction, owned, expects_reply),
        WireCompleterImpl(this) {}
  WireCompleterBase(WireCompleterBase&& other) noexcept
      : CompleterBase(std::move(other)), WireCompleterImpl(this) {}
  WireCompleterBase& operator=(WireCompleterBase&& other) noexcept {
    CompleterBase::operator=(std::move(other));
    WireCompleterImpl::_set_core(this);
    return *this;
  }
};

// Pure-virtual interface to be implemented by a server.
// This interface uses typed channels (i.e. |fidl::ClientEnd<SomeProtocol>|
// and |fidl::ServerEnd<SomeProtocol>|).
template <>
class ::fidl::WireServer<::test_bindingsdenylist::DenyEachBinding>
    : public ::fidl::internal::IncomingMessageDispatcher {
 public:
  WireServer() = default;
  virtual ~WireServer() = default;

  // The FIDL protocol type that is implemented by this server.
  using _EnclosingProtocol = ::test_bindingsdenylist::DenyEachBinding;

  using OnlyDenyDartCompleter = ::fidl::internal::WireCompleter<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>;
  using OnlyDenyDartRequestView = ::fidl::internal::WireRequestView<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>;

  virtual void OnlyDenyDart(OnlyDenyDartRequestView request,
                            OnlyDenyDartCompleter::Sync& completer) = 0;

  using OnlyDenyGoCompleter = ::fidl::internal::WireCompleter<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>;
  using OnlyDenyGoRequestView = ::fidl::internal::WireRequestView<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>;

  virtual void OnlyDenyGo(OnlyDenyGoRequestView request,
                          OnlyDenyGoCompleter::Sync& completer) = 0;

  using OnlyDenyLibfuzzerCompleter = ::fidl::internal::WireCompleter<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>;
  using OnlyDenyLibfuzzerRequestView = ::fidl::internal::WireRequestView<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>;

  virtual void OnlyDenyLibfuzzer(
      OnlyDenyLibfuzzerRequestView request,
      OnlyDenyLibfuzzerCompleter::Sync& completer) = 0;

  using OnlyDenyRustCompleter = ::fidl::internal::WireCompleter<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>;
  using OnlyDenyRustRequestView = ::fidl::internal::WireRequestView<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>;

  virtual void OnlyDenyRust(OnlyDenyRustRequestView request,
                            OnlyDenyRustCompleter::Sync& completer) = 0;

  using OnlyDenySyzkallerCompleter = ::fidl::internal::WireCompleter<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>;
  using OnlyDenySyzkallerRequestView = ::fidl::internal::WireRequestView<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>;

  virtual void OnlyDenySyzkaller(
      OnlyDenySyzkallerRequestView request,
      OnlyDenySyzkallerCompleter::Sync& completer) = 0;

 private:
  void dispatch_message(
      ::fidl::IncomingMessage&& msg, ::fidl::Transaction* txn,
      ::fidl::internal::IncomingTransportContext transport_context) final;
};
namespace fidl {
#endif  // __Fuchsia__

#ifdef __Fuchsia__
}  // namespace fidl
template <>
class ::fidl::internal::WireWeakOnewayClientImpl<
    ::test_bindingsdenylist::Allowed>
    : public ::fidl::internal::ClientImplBase {
 public:
  using ClientImplBase::ClientImplBase;
};

template <>
class ::fidl::internal::WireWeakAsyncClientImpl<
    ::test_bindingsdenylist::Allowed>
    final : public ::fidl::internal::WireWeakOnewayClientImpl<
                ::test_bindingsdenylist::Allowed> {
 public:
  using WireWeakOnewayClientImpl::WireWeakOnewayClientImpl;
};

template <>
class ::fidl::internal::WireWeakOnewayBufferClientImpl<
    ::test_bindingsdenylist::Allowed>
    : public ::fidl::internal::BufferClientImplBase {
 public:
  using BufferClientImplBase::BufferClientImplBase;
};

template <>
class ::fidl::internal::WireWeakAsyncBufferClientImpl<
    ::test_bindingsdenylist::Allowed>
    final : public ::fidl::internal::WireWeakOnewayBufferClientImpl<
                ::test_bindingsdenylist::Allowed> {
 public:
  using WireWeakOnewayBufferClientImpl::WireWeakOnewayBufferClientImpl;
};
template <>
class ::fidl::internal::WireWeakSyncClientImpl<::test_bindingsdenylist::Allowed>
    final : public ::fidl::internal::WireWeakOnewayClientImpl<
                ::test_bindingsdenylist::Allowed> {
 public:
  using WireWeakOnewayClientImpl::WireWeakOnewayClientImpl;
};
namespace fidl {
#endif  // __Fuchsia__

}  // namespace fidl
#ifdef __Fuchsia__
template <>
class ::fidl::internal::WireWeakEventSender<::test_bindingsdenylist::Allowed>
    : public ::fidl::internal::WeakEventSenderBase {
 public:
  using WeakEventSenderBase::WeakEventSenderBase;
};

template <>
class ::fidl::internal::WireWeakBufferEventSender<
    ::test_bindingsdenylist::Allowed>
    : public ::fidl::internal::WeakBufferEventSenderBase {
 public:
  using WeakBufferEventSenderBase::WeakBufferEventSenderBase;
};

template <>
class ::fidl::internal::WireEventSender<::test_bindingsdenylist::Allowed>
    : public ::fidl::internal::SyncEndpointManagedVeneer<
          ::fidl::internal::WireEventSender<::test_bindingsdenylist::Allowed>> {
 public:
  using SyncEndpointManagedVeneer::SyncEndpointManagedVeneer;
};

template <>
class ::fidl::internal::WireBufferEventSender<::test_bindingsdenylist::Allowed>
    : public ::fidl::internal::SyncEndpointBufferVeneer<
          ::fidl::internal::WireBufferEventSender<
              ::test_bindingsdenylist::Allowed>> {
 public:
  using SyncEndpointBufferVeneer::SyncEndpointBufferVeneer;
};
#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
class ::fidl::internal::WireWeakOnewayClientImpl<
    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps>
    : public ::fidl::internal::ClientImplBase {
 public:
  using ClientImplBase::ClientImplBase;
};

template <>
class ::fidl::internal::WireWeakAsyncClientImpl<
    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps>
    final : public ::fidl::internal::WireWeakOnewayClientImpl<
                ::test_bindingsdenylist::OnlyLibfuzzerAndDeps> {
 public:
  using WireWeakOnewayClientImpl::WireWeakOnewayClientImpl;
  // Allocates 16 bytes of request buffer on the stack. The callback is stored
  // on the heap.
  ::fidl::internal::WireThenable<::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                                     LibfuzzerNeedsNonemptyProtocol>
  LibfuzzerNeedsNonemptyProtocol();
};

template <>
class ::fidl::internal::WireWeakOnewayBufferClientImpl<
    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps>
    : public ::fidl::internal::BufferClientImplBase {
 public:
  using BufferClientImplBase::BufferClientImplBase;
};

template <>
class ::fidl::internal::WireWeakAsyncBufferClientImpl<
    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps>
    final : public ::fidl::internal::WireWeakOnewayBufferClientImpl<
                ::test_bindingsdenylist::OnlyLibfuzzerAndDeps> {
 public:
  using WireWeakOnewayBufferClientImpl::WireWeakOnewayBufferClientImpl;

  // Caller provides the backing storage for FIDL message.
  ::fidl::internal::WireBufferThenable<
      ::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
          LibfuzzerNeedsNonemptyProtocol>
  LibfuzzerNeedsNonemptyProtocol();
};
template <>
class ::fidl::internal::WireWeakSyncClientImpl<
    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps>
    final : public ::fidl::internal::WireWeakOnewayClientImpl<
                ::test_bindingsdenylist::OnlyLibfuzzerAndDeps> {
 public:
  using WireWeakOnewayClientImpl::WireWeakOnewayClientImpl;

  // Allocates 32 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<::test_bindingsdenylist::OnlyLibfuzzerAndDeps::
                         LibfuzzerNeedsNonemptyProtocol>
  LibfuzzerNeedsNonemptyProtocol();
};
#endif  // __Fuchsia__

#ifdef __Fuchsia__
template <>
class ::fidl::internal::WireWeakEventSender<
    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps>
    : public ::fidl::internal::WeakEventSenderBase {
 public:
  using WeakEventSenderBase::WeakEventSenderBase;
};

template <>
class ::fidl::internal::WireWeakBufferEventSender<
    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps>
    : public ::fidl::internal::WeakBufferEventSenderBase {
 public:
  using WeakBufferEventSenderBase::WeakBufferEventSenderBase;
};

template <>
class ::fidl::internal::WireEventSender<
    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps>
    : public ::fidl::internal::SyncEndpointManagedVeneer<
          ::fidl::internal::WireEventSender<
              ::test_bindingsdenylist::OnlyLibfuzzerAndDeps>> {
 public:
  using SyncEndpointManagedVeneer::SyncEndpointManagedVeneer;
};

template <>
class ::fidl::internal::WireBufferEventSender<
    ::test_bindingsdenylist::OnlyLibfuzzerAndDeps>
    : public ::fidl::internal::SyncEndpointBufferVeneer<
          ::fidl::internal::WireBufferEventSender<
              ::test_bindingsdenylist::OnlyLibfuzzerAndDeps>> {
 public:
  using SyncEndpointBufferVeneer::SyncEndpointBufferVeneer;
};
#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
class ::fidl::internal::WireWeakOnewayClientImpl<
    ::test_bindingsdenylist::OnlyCppAndDeps>
    : public ::fidl::internal::ClientImplBase {
 public:
  using ClientImplBase::ClientImplBase;
};

template <>
class ::fidl::internal::WireWeakAsyncClientImpl<
    ::test_bindingsdenylist::OnlyCppAndDeps>
    final : public ::fidl::internal::WireWeakOnewayClientImpl<
                ::test_bindingsdenylist::OnlyCppAndDeps> {
 public:
  using WireWeakOnewayClientImpl::WireWeakOnewayClientImpl;
};

template <>
class ::fidl::internal::WireWeakOnewayBufferClientImpl<
    ::test_bindingsdenylist::OnlyCppAndDeps>
    : public ::fidl::internal::BufferClientImplBase {
 public:
  using BufferClientImplBase::BufferClientImplBase;
};

template <>
class ::fidl::internal::WireWeakAsyncBufferClientImpl<
    ::test_bindingsdenylist::OnlyCppAndDeps>
    final : public ::fidl::internal::WireWeakOnewayBufferClientImpl<
                ::test_bindingsdenylist::OnlyCppAndDeps> {
 public:
  using WireWeakOnewayBufferClientImpl::WireWeakOnewayBufferClientImpl;
};
template <>
class ::fidl::internal::WireWeakSyncClientImpl<
    ::test_bindingsdenylist::OnlyCppAndDeps>
    final : public ::fidl::internal::WireWeakOnewayClientImpl<
                ::test_bindingsdenylist::OnlyCppAndDeps> {
 public:
  using WireWeakOnewayClientImpl::WireWeakOnewayClientImpl;
};
#endif  // __Fuchsia__

#ifdef __Fuchsia__
template <>
class ::fidl::internal::WireWeakEventSender<
    ::test_bindingsdenylist::OnlyCppAndDeps>
    : public ::fidl::internal::WeakEventSenderBase {
 public:
  using WeakEventSenderBase::WeakEventSenderBase;
};

template <>
class ::fidl::internal::WireWeakBufferEventSender<
    ::test_bindingsdenylist::OnlyCppAndDeps>
    : public ::fidl::internal::WeakBufferEventSenderBase {
 public:
  using WeakBufferEventSenderBase::WeakBufferEventSenderBase;
};

template <>
class ::fidl::internal::WireEventSender<::test_bindingsdenylist::OnlyCppAndDeps>
    : public ::fidl::internal::SyncEndpointManagedVeneer<
          ::fidl::internal::WireEventSender<
              ::test_bindingsdenylist::OnlyCppAndDeps>> {
 public:
  using SyncEndpointManagedVeneer::SyncEndpointManagedVeneer;
};

template <>
class ::fidl::internal::WireBufferEventSender<
    ::test_bindingsdenylist::OnlyCppAndDeps>
    : public ::fidl::internal::SyncEndpointBufferVeneer<
          ::fidl::internal::WireBufferEventSender<
              ::test_bindingsdenylist::OnlyCppAndDeps>> {
 public:
  using SyncEndpointBufferVeneer::SyncEndpointBufferVeneer;
};
#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
class ::fidl::internal::WireWeakOnewayClientImpl<
    ::test_bindingsdenylist::ImportsSameNameContext>
    : public ::fidl::internal::ClientImplBase {
 public:
  using ClientImplBase::ClientImplBase;

  // Allocates 32 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::Status Unattributed();

  // Allocates 32 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::Status AlwaysAppearsInImportingLibrary();
};

template <>
class ::fidl::internal::WireWeakAsyncClientImpl<
    ::test_bindingsdenylist::ImportsSameNameContext>
    final : public ::fidl::internal::WireWeakOnewayClientImpl<
                ::test_bindingsdenylist::ImportsSameNameContext> {
 public:
  using WireWeakOnewayClientImpl::WireWeakOnewayClientImpl;
};

template <>
class ::fidl::internal::WireWeakOnewayBufferClientImpl<
    ::test_bindingsdenylist::ImportsSameNameContext>
    : public ::fidl::internal::BufferClientImplBase {
 public:
  using BufferClientImplBase::BufferClientImplBase;

  // Caller provides the backing storage for FIDL message.
  ::fidl::Status Unattributed();

  // Caller provides the backing storage for FIDL message.
  ::fidl::Status AlwaysAppearsInImportingLibrary();
};

template <>
class ::fidl::internal::WireWeakAsyncBufferClientImpl<
    ::test_bindingsdenylist::ImportsSameNameContext>
    final : public ::fidl::internal::WireWeakOnewayBufferClientImpl<
                ::test_bindingsdenylist::ImportsSameNameContext> {
 public:
  using WireWeakOnewayBufferClientImpl::WireWeakOnewayBufferClientImpl;
};
template <>
class ::fidl::internal::WireWeakSyncClientImpl<
    ::test_bindingsdenylist::ImportsSameNameContext>
    final : public ::fidl::internal::WireWeakOnewayClientImpl<
                ::test_bindingsdenylist::ImportsSameNameContext> {
 public:
  using WireWeakOnewayClientImpl::WireWeakOnewayClientImpl;
};
#endif  // __Fuchsia__

#ifdef __Fuchsia__
template <>
class ::fidl::internal::WireWeakEventSender<
    ::test_bindingsdenylist::ImportsSameNameContext>
    : public ::fidl::internal::WeakEventSenderBase {
 public:
  using WeakEventSenderBase::WeakEventSenderBase;
};

template <>
class ::fidl::internal::WireWeakBufferEventSender<
    ::test_bindingsdenylist::ImportsSameNameContext>
    : public ::fidl::internal::WeakBufferEventSenderBase {
 public:
  using WeakBufferEventSenderBase::WeakBufferEventSenderBase;
};

template <>
class ::fidl::internal::WireEventSender<
    ::test_bindingsdenylist::ImportsSameNameContext>
    : public ::fidl::internal::SyncEndpointManagedVeneer<
          ::fidl::internal::WireEventSender<
              ::test_bindingsdenylist::ImportsSameNameContext>> {
 public:
  using SyncEndpointManagedVeneer::SyncEndpointManagedVeneer;
};

template <>
class ::fidl::internal::WireBufferEventSender<
    ::test_bindingsdenylist::ImportsSameNameContext>
    : public ::fidl::internal::SyncEndpointBufferVeneer<
          ::fidl::internal::WireBufferEventSender<
              ::test_bindingsdenylist::ImportsSameNameContext>> {
 public:
  using SyncEndpointBufferVeneer::SyncEndpointBufferVeneer;
};
#endif  // __Fuchsia__

#ifdef __Fuchsia__

template <>
class ::fidl::internal::WireWeakOnewayClientImpl<
    ::test_bindingsdenylist::DenyEachBinding>
    : public ::fidl::internal::ClientImplBase {
 public:
  using ClientImplBase::ClientImplBase;
};

template <>
class ::fidl::internal::WireWeakAsyncClientImpl<
    ::test_bindingsdenylist::DenyEachBinding>
    final : public ::fidl::internal::WireWeakOnewayClientImpl<
                ::test_bindingsdenylist::DenyEachBinding> {
 public:
  using WireWeakOnewayClientImpl::WireWeakOnewayClientImpl;
  // Allocates 24 bytes of request buffer on the stack. The callback is stored
  // on the heap.
  ::fidl::internal::WireThenable<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>
  OnlyDenyDart(bool a);
  // Allocates 24 bytes of request buffer on the stack. The callback is stored
  // on the heap.
  ::fidl::internal::WireThenable<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>
  OnlyDenyGo(bool a);
  // Allocates 24 bytes of request buffer on the stack. The callback is stored
  // on the heap.
  ::fidl::internal::WireThenable<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>
  OnlyDenyLibfuzzer(bool a);
  // Allocates 24 bytes of request buffer on the stack. The callback is stored
  // on the heap.
  ::fidl::internal::WireThenable<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>
  OnlyDenyRust(bool a);
  // Allocates 24 bytes of request buffer on the stack. The callback is stored
  // on the heap.
  ::fidl::internal::WireThenable<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>
  OnlyDenySyzkaller(bool a);
};

template <>
class ::fidl::internal::WireWeakOnewayBufferClientImpl<
    ::test_bindingsdenylist::DenyEachBinding>
    : public ::fidl::internal::BufferClientImplBase {
 public:
  using BufferClientImplBase::BufferClientImplBase;
};

template <>
class ::fidl::internal::WireWeakAsyncBufferClientImpl<
    ::test_bindingsdenylist::DenyEachBinding>
    final : public ::fidl::internal::WireWeakOnewayBufferClientImpl<
                ::test_bindingsdenylist::DenyEachBinding> {
 public:
  using WireWeakOnewayBufferClientImpl::WireWeakOnewayBufferClientImpl;

  // Caller provides the backing storage for FIDL message.
  ::fidl::internal::WireBufferThenable<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>
  OnlyDenyDart(bool a);

  // Caller provides the backing storage for FIDL message.
  ::fidl::internal::WireBufferThenable<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>
  OnlyDenyGo(bool a);

  // Caller provides the backing storage for FIDL message.
  ::fidl::internal::WireBufferThenable<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>
  OnlyDenyLibfuzzer(bool a);

  // Caller provides the backing storage for FIDL message.
  ::fidl::internal::WireBufferThenable<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>
  OnlyDenyRust(bool a);

  // Caller provides the backing storage for FIDL message.
  ::fidl::internal::WireBufferThenable<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>
  OnlyDenySyzkaller(bool a);
};
template <>
class ::fidl::internal::WireWeakSyncClientImpl<
    ::test_bindingsdenylist::DenyEachBinding>
    final : public ::fidl::internal::WireWeakOnewayClientImpl<
                ::test_bindingsdenylist::DenyEachBinding> {
 public:
  using WireWeakOnewayClientImpl::WireWeakOnewayClientImpl;

  // Allocates 56 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<::test_bindingsdenylist::DenyEachBinding::OnlyDenyDart>
  OnlyDenyDart(bool a);

  // Allocates 56 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<::test_bindingsdenylist::DenyEachBinding::OnlyDenyGo>
  OnlyDenyGo(bool a);

  // Allocates 56 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenyLibfuzzer>
  OnlyDenyLibfuzzer(bool a);

  // Allocates 56 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<::test_bindingsdenylist::DenyEachBinding::OnlyDenyRust>
  OnlyDenyRust(bool a);

  // Allocates 56 bytes of message buffer on the stack. No heap allocation
  // necessary.
  ::fidl::WireResult<
      ::test_bindingsdenylist::DenyEachBinding::OnlyDenySyzkaller>
  OnlyDenySyzkaller(bool a);
};
#endif  // __Fuchsia__

#ifdef __Fuchsia__
template <>
class ::fidl::internal::WireWeakEventSender<
    ::test_bindingsdenylist::DenyEachBinding>
    : public ::fidl::internal::WeakEventSenderBase {
 public:
  using WeakEventSenderBase::WeakEventSenderBase;
};

template <>
class ::fidl::internal::WireWeakBufferEventSender<
    ::test_bindingsdenylist::DenyEachBinding>
    : public ::fidl::internal::WeakBufferEventSenderBase {
 public:
  using WeakBufferEventSenderBase::WeakBufferEventSenderBase;
};

template <>
class ::fidl::internal::WireEventSender<
    ::test_bindingsdenylist::DenyEachBinding>
    : public ::fidl::internal::SyncEndpointManagedVeneer<
          ::fidl::internal::WireEventSender<
              ::test_bindingsdenylist::DenyEachBinding>> {
 public:
  using SyncEndpointManagedVeneer::SyncEndpointManagedVeneer;
};

template <>
class ::fidl::internal::WireBufferEventSender<
    ::test_bindingsdenylist::DenyEachBinding>
    : public ::fidl::internal::SyncEndpointBufferVeneer<
          ::fidl::internal::WireBufferEventSender<
              ::test_bindingsdenylist::DenyEachBinding>> {
 public:
  using SyncEndpointBufferVeneer::SyncEndpointBufferVeneer;
};
#endif  // __Fuchsia__
