// Generated by the gRPC C++ plugin.
// If you make any local change, they will be lost.
// source: keyapis/access_management/v1/keyapis_access_management_template_v1.proto
// Original file comments:
//
// Сервис реализует функционал управления шаблонами пользовательских групп
#ifndef GRPC_keyapis_2faccess_5fmanagement_2fv1_2fkeyapis_5faccess_5fmanagement_5ftemplate_5fv1_2eproto__INCLUDED
#define GRPC_keyapis_2faccess_5fmanagement_2fv1_2fkeyapis_5faccess_5fmanagement_5ftemplate_5fv1_2eproto__INCLUDED

#include "keyapis/access_management/v1/keyapis_access_management_template_v1.pb.h"

#include <functional>
#include <grpcpp/impl/codegen/async_generic_service.h>
#include <grpcpp/impl/codegen/async_stream.h>
#include <grpcpp/impl/codegen/async_unary_call.h>
#include <grpcpp/impl/codegen/client_callback.h>
#include <grpcpp/impl/codegen/client_context.h>
#include <grpcpp/impl/codegen/completion_queue.h>
#include <grpcpp/impl/codegen/message_allocator.h>
#include <grpcpp/impl/codegen/method_handler.h>
#include <grpcpp/impl/codegen/proto_utils.h>
#include <grpcpp/impl/codegen/rpc_method.h>
#include <grpcpp/impl/codegen/server_callback.h>
#include <grpcpp/impl/codegen/server_callback_handlers.h>
#include <grpcpp/impl/codegen/server_context.h>
#include <grpcpp/impl/codegen/service_type.h>
#include <grpcpp/impl/codegen/status.h>
#include <grpcpp/impl/codegen/stub_options.h>
#include <grpcpp/impl/codegen/sync_stream.h>

namespace keyapis {
namespace access_management {
namespace v1 {

// Сервис управления шаблонами пользовательских групп
class GroupTemplateService final {
 public:
  static constexpr char const* service_full_name() {
    return "keyapis.access_management.v1.GroupTemplateService";
  }
  class StubInterface {
   public:
    virtual ~StubInterface() {}
    // Метод получения шаблона группы.
    // Метод доступен для: admin, service, bti, seller
    virtual ::grpc::Status GetGroupTemplate(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateRequest& request, ::keyapis::access_management::v1::GetGroupTemplateResponse* response) = 0;
    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::GetGroupTemplateResponse>> AsyncGetGroupTemplate(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::GetGroupTemplateResponse>>(AsyncGetGroupTemplateRaw(context, request, cq));
    }
    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::GetGroupTemplateResponse>> PrepareAsyncGetGroupTemplate(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::GetGroupTemplateResponse>>(PrepareAsyncGetGroupTemplateRaw(context, request, cq));
    }
    // Метод получения списка шаблонов групп.
    // Метод доступен для: admin, service, bti, seller
    std::unique_ptr< ::grpc::ClientReaderInterface< ::keyapis::access_management::v1::GetGroupTemplateListResponse>> GetGroupTemplateList(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateListRequest& request) {
      return std::unique_ptr< ::grpc::ClientReaderInterface< ::keyapis::access_management::v1::GetGroupTemplateListResponse>>(GetGroupTemplateListRaw(context, request));
    }
    std::unique_ptr< ::grpc::ClientAsyncReaderInterface< ::keyapis::access_management::v1::GetGroupTemplateListResponse>> AsyncGetGroupTemplateList(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateListRequest& request, ::grpc::CompletionQueue* cq, void* tag) {
      return std::unique_ptr< ::grpc::ClientAsyncReaderInterface< ::keyapis::access_management::v1::GetGroupTemplateListResponse>>(AsyncGetGroupTemplateListRaw(context, request, cq, tag));
    }
    std::unique_ptr< ::grpc::ClientAsyncReaderInterface< ::keyapis::access_management::v1::GetGroupTemplateListResponse>> PrepareAsyncGetGroupTemplateList(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateListRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncReaderInterface< ::keyapis::access_management::v1::GetGroupTemplateListResponse>>(PrepareAsyncGetGroupTemplateListRaw(context, request, cq));
    }
    // Метод получения количества шаблонов групп.
    // Метод доступен для: admin, service, bti, seller
    virtual ::grpc::Status GetGroupTemplateCount(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateCountRequest& request, ::keyapis::access_management::v1::GetGroupTemplateCountResponse* response) = 0;
    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::GetGroupTemplateCountResponse>> AsyncGetGroupTemplateCount(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateCountRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::GetGroupTemplateCountResponse>>(AsyncGetGroupTemplateCountRaw(context, request, cq));
    }
    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::GetGroupTemplateCountResponse>> PrepareAsyncGetGroupTemplateCount(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateCountRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::GetGroupTemplateCountResponse>>(PrepareAsyncGetGroupTemplateCountRaw(context, request, cq));
    }
    // Метод сохранения шаблона группы.
    // Поддерживает создание и обновление как UPSERT по GroupTemplate.id.
    // Метод доступен для: admin, service
    virtual ::grpc::Status PostGroupTemplate(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PostGroupTemplateRequest& request, ::keyapis::access_management::v1::PostGroupTemplateResponse* response) = 0;
    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::PostGroupTemplateResponse>> AsyncPostGroupTemplate(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PostGroupTemplateRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::PostGroupTemplateResponse>>(AsyncPostGroupTemplateRaw(context, request, cq));
    }
    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::PostGroupTemplateResponse>> PrepareAsyncPostGroupTemplate(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PostGroupTemplateRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::PostGroupTemplateResponse>>(PrepareAsyncPostGroupTemplateRaw(context, request, cq));
    }
    // Метод удаления шаблона группы.
    // Проставляет дату удаления GroupTemplate.deleted_at.
    // Метод доступен для: admin, service
    virtual ::grpc::Status DeleteGroupTemplate(::grpc::ClientContext* context, const ::keyapis::access_management::v1::DeleteGroupTemplateRequest& request, ::keyapis::access_management::v1::DeleteGroupTemplateResponse* response) = 0;
    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::DeleteGroupTemplateResponse>> AsyncDeleteGroupTemplate(::grpc::ClientContext* context, const ::keyapis::access_management::v1::DeleteGroupTemplateRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::DeleteGroupTemplateResponse>>(AsyncDeleteGroupTemplateRaw(context, request, cq));
    }
    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::DeleteGroupTemplateResponse>> PrepareAsyncDeleteGroupTemplate(::grpc::ClientContext* context, const ::keyapis::access_management::v1::DeleteGroupTemplateRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::DeleteGroupTemplateResponse>>(PrepareAsyncDeleteGroupTemplateRaw(context, request, cq));
    }
    // Метод получения списка связей шаблонов групп и группы пользователя.
    // Метод доступен для: admin, service
    std::unique_ptr< ::grpc::ClientReaderInterface< ::keyapis::access_management::v1::GetGroupTemplateGroupListResponse>> GetGroupTemplateGroupList(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateGroupListRequest& request) {
      return std::unique_ptr< ::grpc::ClientReaderInterface< ::keyapis::access_management::v1::GetGroupTemplateGroupListResponse>>(GetGroupTemplateGroupListRaw(context, request));
    }
    std::unique_ptr< ::grpc::ClientAsyncReaderInterface< ::keyapis::access_management::v1::GetGroupTemplateGroupListResponse>> AsyncGetGroupTemplateGroupList(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateGroupListRequest& request, ::grpc::CompletionQueue* cq, void* tag) {
      return std::unique_ptr< ::grpc::ClientAsyncReaderInterface< ::keyapis::access_management::v1::GetGroupTemplateGroupListResponse>>(AsyncGetGroupTemplateGroupListRaw(context, request, cq, tag));
    }
    std::unique_ptr< ::grpc::ClientAsyncReaderInterface< ::keyapis::access_management::v1::GetGroupTemplateGroupListResponse>> PrepareAsyncGetGroupTemplateGroupList(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateGroupListRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncReaderInterface< ::keyapis::access_management::v1::GetGroupTemplateGroupListResponse>>(PrepareAsyncGetGroupTemplateGroupListRaw(context, request, cq));
    }
    // Метод получения количества связей шаблонов групп и группы пользователя.
    // Метод доступен для: admin, service
    virtual ::grpc::Status GetGroupTemplateGroupCount(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateGroupCountRequest& request, ::keyapis::access_management::v1::GetGroupTemplateGroupCountResponse* response) = 0;
    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::GetGroupTemplateGroupCountResponse>> AsyncGetGroupTemplateGroupCount(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateGroupCountRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::GetGroupTemplateGroupCountResponse>>(AsyncGetGroupTemplateGroupCountRaw(context, request, cq));
    }
    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::GetGroupTemplateGroupCountResponse>> PrepareAsyncGetGroupTemplateGroupCount(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateGroupCountRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::GetGroupTemplateGroupCountResponse>>(PrepareAsyncGetGroupTemplateGroupCountRaw(context, request, cq));
    }
    // Метод сохранения связей шаблонов групп и группы пользователя.
    // Метод доступен для: admin, service
    virtual ::grpc::Status PutGroupTemplateGroupAttach(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PutGroupTemplateGroupAttachRequest& request, ::keyapis::access_management::v1::PutGroupTemplateGroupAttachResponse* response) = 0;
    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::PutGroupTemplateGroupAttachResponse>> AsyncPutGroupTemplateGroupAttach(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PutGroupTemplateGroupAttachRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::PutGroupTemplateGroupAttachResponse>>(AsyncPutGroupTemplateGroupAttachRaw(context, request, cq));
    }
    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::PutGroupTemplateGroupAttachResponse>> PrepareAsyncPutGroupTemplateGroupAttach(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PutGroupTemplateGroupAttachRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::PutGroupTemplateGroupAttachResponse>>(PrepareAsyncPutGroupTemplateGroupAttachRaw(context, request, cq));
    }
    // Метод удаления связей шаблонов групп и группы пользователя.
    // Метод доступен для: admin, service
    virtual ::grpc::Status PutGroupTemplateGroupDetach(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PutGroupTemplateGroupDetachRequest& request, ::keyapis::access_management::v1::PutGroupTemplateGroupDetachResponse* response) = 0;
    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::PutGroupTemplateGroupDetachResponse>> AsyncPutGroupTemplateGroupDetach(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PutGroupTemplateGroupDetachRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::PutGroupTemplateGroupDetachResponse>>(AsyncPutGroupTemplateGroupDetachRaw(context, request, cq));
    }
    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::PutGroupTemplateGroupDetachResponse>> PrepareAsyncPutGroupTemplateGroupDetach(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PutGroupTemplateGroupDetachRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::PutGroupTemplateGroupDetachResponse>>(PrepareAsyncPutGroupTemplateGroupDetachRaw(context, request, cq));
    }
    class async_interface {
     public:
      virtual ~async_interface() {}
      // Метод получения шаблона группы.
      // Метод доступен для: admin, service, bti, seller
      virtual void GetGroupTemplate(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateRequest* request, ::keyapis::access_management::v1::GetGroupTemplateResponse* response, std::function<void(::grpc::Status)>) = 0;
      virtual void GetGroupTemplate(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateRequest* request, ::keyapis::access_management::v1::GetGroupTemplateResponse* response, ::grpc::ClientUnaryReactor* reactor) = 0;
      // Метод получения списка шаблонов групп.
      // Метод доступен для: admin, service, bti, seller
      virtual void GetGroupTemplateList(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateListRequest* request, ::grpc::ClientReadReactor< ::keyapis::access_management::v1::GetGroupTemplateListResponse>* reactor) = 0;
      // Метод получения количества шаблонов групп.
      // Метод доступен для: admin, service, bti, seller
      virtual void GetGroupTemplateCount(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateCountRequest* request, ::keyapis::access_management::v1::GetGroupTemplateCountResponse* response, std::function<void(::grpc::Status)>) = 0;
      virtual void GetGroupTemplateCount(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateCountRequest* request, ::keyapis::access_management::v1::GetGroupTemplateCountResponse* response, ::grpc::ClientUnaryReactor* reactor) = 0;
      // Метод сохранения шаблона группы.
      // Поддерживает создание и обновление как UPSERT по GroupTemplate.id.
      // Метод доступен для: admin, service
      virtual void PostGroupTemplate(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PostGroupTemplateRequest* request, ::keyapis::access_management::v1::PostGroupTemplateResponse* response, std::function<void(::grpc::Status)>) = 0;
      virtual void PostGroupTemplate(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PostGroupTemplateRequest* request, ::keyapis::access_management::v1::PostGroupTemplateResponse* response, ::grpc::ClientUnaryReactor* reactor) = 0;
      // Метод удаления шаблона группы.
      // Проставляет дату удаления GroupTemplate.deleted_at.
      // Метод доступен для: admin, service
      virtual void DeleteGroupTemplate(::grpc::ClientContext* context, const ::keyapis::access_management::v1::DeleteGroupTemplateRequest* request, ::keyapis::access_management::v1::DeleteGroupTemplateResponse* response, std::function<void(::grpc::Status)>) = 0;
      virtual void DeleteGroupTemplate(::grpc::ClientContext* context, const ::keyapis::access_management::v1::DeleteGroupTemplateRequest* request, ::keyapis::access_management::v1::DeleteGroupTemplateResponse* response, ::grpc::ClientUnaryReactor* reactor) = 0;
      // Метод получения списка связей шаблонов групп и группы пользователя.
      // Метод доступен для: admin, service
      virtual void GetGroupTemplateGroupList(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateGroupListRequest* request, ::grpc::ClientReadReactor< ::keyapis::access_management::v1::GetGroupTemplateGroupListResponse>* reactor) = 0;
      // Метод получения количества связей шаблонов групп и группы пользователя.
      // Метод доступен для: admin, service
      virtual void GetGroupTemplateGroupCount(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateGroupCountRequest* request, ::keyapis::access_management::v1::GetGroupTemplateGroupCountResponse* response, std::function<void(::grpc::Status)>) = 0;
      virtual void GetGroupTemplateGroupCount(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateGroupCountRequest* request, ::keyapis::access_management::v1::GetGroupTemplateGroupCountResponse* response, ::grpc::ClientUnaryReactor* reactor) = 0;
      // Метод сохранения связей шаблонов групп и группы пользователя.
      // Метод доступен для: admin, service
      virtual void PutGroupTemplateGroupAttach(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PutGroupTemplateGroupAttachRequest* request, ::keyapis::access_management::v1::PutGroupTemplateGroupAttachResponse* response, std::function<void(::grpc::Status)>) = 0;
      virtual void PutGroupTemplateGroupAttach(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PutGroupTemplateGroupAttachRequest* request, ::keyapis::access_management::v1::PutGroupTemplateGroupAttachResponse* response, ::grpc::ClientUnaryReactor* reactor) = 0;
      // Метод удаления связей шаблонов групп и группы пользователя.
      // Метод доступен для: admin, service
      virtual void PutGroupTemplateGroupDetach(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PutGroupTemplateGroupDetachRequest* request, ::keyapis::access_management::v1::PutGroupTemplateGroupDetachResponse* response, std::function<void(::grpc::Status)>) = 0;
      virtual void PutGroupTemplateGroupDetach(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PutGroupTemplateGroupDetachRequest* request, ::keyapis::access_management::v1::PutGroupTemplateGroupDetachResponse* response, ::grpc::ClientUnaryReactor* reactor) = 0;
    };
    typedef class async_interface experimental_async_interface;
    virtual class async_interface* async() { return nullptr; }
    class async_interface* experimental_async() { return async(); }
   private:
    virtual ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::GetGroupTemplateResponse>* AsyncGetGroupTemplateRaw(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateRequest& request, ::grpc::CompletionQueue* cq) = 0;
    virtual ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::GetGroupTemplateResponse>* PrepareAsyncGetGroupTemplateRaw(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateRequest& request, ::grpc::CompletionQueue* cq) = 0;
    virtual ::grpc::ClientReaderInterface< ::keyapis::access_management::v1::GetGroupTemplateListResponse>* GetGroupTemplateListRaw(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateListRequest& request) = 0;
    virtual ::grpc::ClientAsyncReaderInterface< ::keyapis::access_management::v1::GetGroupTemplateListResponse>* AsyncGetGroupTemplateListRaw(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateListRequest& request, ::grpc::CompletionQueue* cq, void* tag) = 0;
    virtual ::grpc::ClientAsyncReaderInterface< ::keyapis::access_management::v1::GetGroupTemplateListResponse>* PrepareAsyncGetGroupTemplateListRaw(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateListRequest& request, ::grpc::CompletionQueue* cq) = 0;
    virtual ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::GetGroupTemplateCountResponse>* AsyncGetGroupTemplateCountRaw(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateCountRequest& request, ::grpc::CompletionQueue* cq) = 0;
    virtual ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::GetGroupTemplateCountResponse>* PrepareAsyncGetGroupTemplateCountRaw(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateCountRequest& request, ::grpc::CompletionQueue* cq) = 0;
    virtual ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::PostGroupTemplateResponse>* AsyncPostGroupTemplateRaw(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PostGroupTemplateRequest& request, ::grpc::CompletionQueue* cq) = 0;
    virtual ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::PostGroupTemplateResponse>* PrepareAsyncPostGroupTemplateRaw(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PostGroupTemplateRequest& request, ::grpc::CompletionQueue* cq) = 0;
    virtual ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::DeleteGroupTemplateResponse>* AsyncDeleteGroupTemplateRaw(::grpc::ClientContext* context, const ::keyapis::access_management::v1::DeleteGroupTemplateRequest& request, ::grpc::CompletionQueue* cq) = 0;
    virtual ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::DeleteGroupTemplateResponse>* PrepareAsyncDeleteGroupTemplateRaw(::grpc::ClientContext* context, const ::keyapis::access_management::v1::DeleteGroupTemplateRequest& request, ::grpc::CompletionQueue* cq) = 0;
    virtual ::grpc::ClientReaderInterface< ::keyapis::access_management::v1::GetGroupTemplateGroupListResponse>* GetGroupTemplateGroupListRaw(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateGroupListRequest& request) = 0;
    virtual ::grpc::ClientAsyncReaderInterface< ::keyapis::access_management::v1::GetGroupTemplateGroupListResponse>* AsyncGetGroupTemplateGroupListRaw(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateGroupListRequest& request, ::grpc::CompletionQueue* cq, void* tag) = 0;
    virtual ::grpc::ClientAsyncReaderInterface< ::keyapis::access_management::v1::GetGroupTemplateGroupListResponse>* PrepareAsyncGetGroupTemplateGroupListRaw(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateGroupListRequest& request, ::grpc::CompletionQueue* cq) = 0;
    virtual ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::GetGroupTemplateGroupCountResponse>* AsyncGetGroupTemplateGroupCountRaw(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateGroupCountRequest& request, ::grpc::CompletionQueue* cq) = 0;
    virtual ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::GetGroupTemplateGroupCountResponse>* PrepareAsyncGetGroupTemplateGroupCountRaw(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateGroupCountRequest& request, ::grpc::CompletionQueue* cq) = 0;
    virtual ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::PutGroupTemplateGroupAttachResponse>* AsyncPutGroupTemplateGroupAttachRaw(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PutGroupTemplateGroupAttachRequest& request, ::grpc::CompletionQueue* cq) = 0;
    virtual ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::PutGroupTemplateGroupAttachResponse>* PrepareAsyncPutGroupTemplateGroupAttachRaw(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PutGroupTemplateGroupAttachRequest& request, ::grpc::CompletionQueue* cq) = 0;
    virtual ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::PutGroupTemplateGroupDetachResponse>* AsyncPutGroupTemplateGroupDetachRaw(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PutGroupTemplateGroupDetachRequest& request, ::grpc::CompletionQueue* cq) = 0;
    virtual ::grpc::ClientAsyncResponseReaderInterface< ::keyapis::access_management::v1::PutGroupTemplateGroupDetachResponse>* PrepareAsyncPutGroupTemplateGroupDetachRaw(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PutGroupTemplateGroupDetachRequest& request, ::grpc::CompletionQueue* cq) = 0;
  };
  class Stub final : public StubInterface {
   public:
    Stub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& options = ::grpc::StubOptions());
    ::grpc::Status GetGroupTemplate(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateRequest& request, ::keyapis::access_management::v1::GetGroupTemplateResponse* response) override;
    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::GetGroupTemplateResponse>> AsyncGetGroupTemplate(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::GetGroupTemplateResponse>>(AsyncGetGroupTemplateRaw(context, request, cq));
    }
    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::GetGroupTemplateResponse>> PrepareAsyncGetGroupTemplate(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::GetGroupTemplateResponse>>(PrepareAsyncGetGroupTemplateRaw(context, request, cq));
    }
    std::unique_ptr< ::grpc::ClientReader< ::keyapis::access_management::v1::GetGroupTemplateListResponse>> GetGroupTemplateList(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateListRequest& request) {
      return std::unique_ptr< ::grpc::ClientReader< ::keyapis::access_management::v1::GetGroupTemplateListResponse>>(GetGroupTemplateListRaw(context, request));
    }
    std::unique_ptr< ::grpc::ClientAsyncReader< ::keyapis::access_management::v1::GetGroupTemplateListResponse>> AsyncGetGroupTemplateList(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateListRequest& request, ::grpc::CompletionQueue* cq, void* tag) {
      return std::unique_ptr< ::grpc::ClientAsyncReader< ::keyapis::access_management::v1::GetGroupTemplateListResponse>>(AsyncGetGroupTemplateListRaw(context, request, cq, tag));
    }
    std::unique_ptr< ::grpc::ClientAsyncReader< ::keyapis::access_management::v1::GetGroupTemplateListResponse>> PrepareAsyncGetGroupTemplateList(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateListRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncReader< ::keyapis::access_management::v1::GetGroupTemplateListResponse>>(PrepareAsyncGetGroupTemplateListRaw(context, request, cq));
    }
    ::grpc::Status GetGroupTemplateCount(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateCountRequest& request, ::keyapis::access_management::v1::GetGroupTemplateCountResponse* response) override;
    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::GetGroupTemplateCountResponse>> AsyncGetGroupTemplateCount(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateCountRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::GetGroupTemplateCountResponse>>(AsyncGetGroupTemplateCountRaw(context, request, cq));
    }
    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::GetGroupTemplateCountResponse>> PrepareAsyncGetGroupTemplateCount(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateCountRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::GetGroupTemplateCountResponse>>(PrepareAsyncGetGroupTemplateCountRaw(context, request, cq));
    }
    ::grpc::Status PostGroupTemplate(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PostGroupTemplateRequest& request, ::keyapis::access_management::v1::PostGroupTemplateResponse* response) override;
    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::PostGroupTemplateResponse>> AsyncPostGroupTemplate(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PostGroupTemplateRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::PostGroupTemplateResponse>>(AsyncPostGroupTemplateRaw(context, request, cq));
    }
    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::PostGroupTemplateResponse>> PrepareAsyncPostGroupTemplate(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PostGroupTemplateRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::PostGroupTemplateResponse>>(PrepareAsyncPostGroupTemplateRaw(context, request, cq));
    }
    ::grpc::Status DeleteGroupTemplate(::grpc::ClientContext* context, const ::keyapis::access_management::v1::DeleteGroupTemplateRequest& request, ::keyapis::access_management::v1::DeleteGroupTemplateResponse* response) override;
    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::DeleteGroupTemplateResponse>> AsyncDeleteGroupTemplate(::grpc::ClientContext* context, const ::keyapis::access_management::v1::DeleteGroupTemplateRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::DeleteGroupTemplateResponse>>(AsyncDeleteGroupTemplateRaw(context, request, cq));
    }
    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::DeleteGroupTemplateResponse>> PrepareAsyncDeleteGroupTemplate(::grpc::ClientContext* context, const ::keyapis::access_management::v1::DeleteGroupTemplateRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::DeleteGroupTemplateResponse>>(PrepareAsyncDeleteGroupTemplateRaw(context, request, cq));
    }
    std::unique_ptr< ::grpc::ClientReader< ::keyapis::access_management::v1::GetGroupTemplateGroupListResponse>> GetGroupTemplateGroupList(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateGroupListRequest& request) {
      return std::unique_ptr< ::grpc::ClientReader< ::keyapis::access_management::v1::GetGroupTemplateGroupListResponse>>(GetGroupTemplateGroupListRaw(context, request));
    }
    std::unique_ptr< ::grpc::ClientAsyncReader< ::keyapis::access_management::v1::GetGroupTemplateGroupListResponse>> AsyncGetGroupTemplateGroupList(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateGroupListRequest& request, ::grpc::CompletionQueue* cq, void* tag) {
      return std::unique_ptr< ::grpc::ClientAsyncReader< ::keyapis::access_management::v1::GetGroupTemplateGroupListResponse>>(AsyncGetGroupTemplateGroupListRaw(context, request, cq, tag));
    }
    std::unique_ptr< ::grpc::ClientAsyncReader< ::keyapis::access_management::v1::GetGroupTemplateGroupListResponse>> PrepareAsyncGetGroupTemplateGroupList(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateGroupListRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncReader< ::keyapis::access_management::v1::GetGroupTemplateGroupListResponse>>(PrepareAsyncGetGroupTemplateGroupListRaw(context, request, cq));
    }
    ::grpc::Status GetGroupTemplateGroupCount(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateGroupCountRequest& request, ::keyapis::access_management::v1::GetGroupTemplateGroupCountResponse* response) override;
    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::GetGroupTemplateGroupCountResponse>> AsyncGetGroupTemplateGroupCount(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateGroupCountRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::GetGroupTemplateGroupCountResponse>>(AsyncGetGroupTemplateGroupCountRaw(context, request, cq));
    }
    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::GetGroupTemplateGroupCountResponse>> PrepareAsyncGetGroupTemplateGroupCount(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateGroupCountRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::GetGroupTemplateGroupCountResponse>>(PrepareAsyncGetGroupTemplateGroupCountRaw(context, request, cq));
    }
    ::grpc::Status PutGroupTemplateGroupAttach(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PutGroupTemplateGroupAttachRequest& request, ::keyapis::access_management::v1::PutGroupTemplateGroupAttachResponse* response) override;
    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::PutGroupTemplateGroupAttachResponse>> AsyncPutGroupTemplateGroupAttach(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PutGroupTemplateGroupAttachRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::PutGroupTemplateGroupAttachResponse>>(AsyncPutGroupTemplateGroupAttachRaw(context, request, cq));
    }
    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::PutGroupTemplateGroupAttachResponse>> PrepareAsyncPutGroupTemplateGroupAttach(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PutGroupTemplateGroupAttachRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::PutGroupTemplateGroupAttachResponse>>(PrepareAsyncPutGroupTemplateGroupAttachRaw(context, request, cq));
    }
    ::grpc::Status PutGroupTemplateGroupDetach(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PutGroupTemplateGroupDetachRequest& request, ::keyapis::access_management::v1::PutGroupTemplateGroupDetachResponse* response) override;
    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::PutGroupTemplateGroupDetachResponse>> AsyncPutGroupTemplateGroupDetach(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PutGroupTemplateGroupDetachRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::PutGroupTemplateGroupDetachResponse>>(AsyncPutGroupTemplateGroupDetachRaw(context, request, cq));
    }
    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::PutGroupTemplateGroupDetachResponse>> PrepareAsyncPutGroupTemplateGroupDetach(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PutGroupTemplateGroupDetachRequest& request, ::grpc::CompletionQueue* cq) {
      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::PutGroupTemplateGroupDetachResponse>>(PrepareAsyncPutGroupTemplateGroupDetachRaw(context, request, cq));
    }
    class async final :
      public StubInterface::async_interface {
     public:
      void GetGroupTemplate(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateRequest* request, ::keyapis::access_management::v1::GetGroupTemplateResponse* response, std::function<void(::grpc::Status)>) override;
      void GetGroupTemplate(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateRequest* request, ::keyapis::access_management::v1::GetGroupTemplateResponse* response, ::grpc::ClientUnaryReactor* reactor) override;
      void GetGroupTemplateList(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateListRequest* request, ::grpc::ClientReadReactor< ::keyapis::access_management::v1::GetGroupTemplateListResponse>* reactor) override;
      void GetGroupTemplateCount(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateCountRequest* request, ::keyapis::access_management::v1::GetGroupTemplateCountResponse* response, std::function<void(::grpc::Status)>) override;
      void GetGroupTemplateCount(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateCountRequest* request, ::keyapis::access_management::v1::GetGroupTemplateCountResponse* response, ::grpc::ClientUnaryReactor* reactor) override;
      void PostGroupTemplate(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PostGroupTemplateRequest* request, ::keyapis::access_management::v1::PostGroupTemplateResponse* response, std::function<void(::grpc::Status)>) override;
      void PostGroupTemplate(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PostGroupTemplateRequest* request, ::keyapis::access_management::v1::PostGroupTemplateResponse* response, ::grpc::ClientUnaryReactor* reactor) override;
      void DeleteGroupTemplate(::grpc::ClientContext* context, const ::keyapis::access_management::v1::DeleteGroupTemplateRequest* request, ::keyapis::access_management::v1::DeleteGroupTemplateResponse* response, std::function<void(::grpc::Status)>) override;
      void DeleteGroupTemplate(::grpc::ClientContext* context, const ::keyapis::access_management::v1::DeleteGroupTemplateRequest* request, ::keyapis::access_management::v1::DeleteGroupTemplateResponse* response, ::grpc::ClientUnaryReactor* reactor) override;
      void GetGroupTemplateGroupList(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateGroupListRequest* request, ::grpc::ClientReadReactor< ::keyapis::access_management::v1::GetGroupTemplateGroupListResponse>* reactor) override;
      void GetGroupTemplateGroupCount(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateGroupCountRequest* request, ::keyapis::access_management::v1::GetGroupTemplateGroupCountResponse* response, std::function<void(::grpc::Status)>) override;
      void GetGroupTemplateGroupCount(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateGroupCountRequest* request, ::keyapis::access_management::v1::GetGroupTemplateGroupCountResponse* response, ::grpc::ClientUnaryReactor* reactor) override;
      void PutGroupTemplateGroupAttach(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PutGroupTemplateGroupAttachRequest* request, ::keyapis::access_management::v1::PutGroupTemplateGroupAttachResponse* response, std::function<void(::grpc::Status)>) override;
      void PutGroupTemplateGroupAttach(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PutGroupTemplateGroupAttachRequest* request, ::keyapis::access_management::v1::PutGroupTemplateGroupAttachResponse* response, ::grpc::ClientUnaryReactor* reactor) override;
      void PutGroupTemplateGroupDetach(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PutGroupTemplateGroupDetachRequest* request, ::keyapis::access_management::v1::PutGroupTemplateGroupDetachResponse* response, std::function<void(::grpc::Status)>) override;
      void PutGroupTemplateGroupDetach(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PutGroupTemplateGroupDetachRequest* request, ::keyapis::access_management::v1::PutGroupTemplateGroupDetachResponse* response, ::grpc::ClientUnaryReactor* reactor) override;
     private:
      friend class Stub;
      explicit async(Stub* stub): stub_(stub) { }
      Stub* stub() { return stub_; }
      Stub* stub_;
    };
    class async* async() override { return &async_stub_; }

   private:
    std::shared_ptr< ::grpc::ChannelInterface> channel_;
    class async async_stub_{this};
    ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::GetGroupTemplateResponse>* AsyncGetGroupTemplateRaw(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateRequest& request, ::grpc::CompletionQueue* cq) override;
    ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::GetGroupTemplateResponse>* PrepareAsyncGetGroupTemplateRaw(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateRequest& request, ::grpc::CompletionQueue* cq) override;
    ::grpc::ClientReader< ::keyapis::access_management::v1::GetGroupTemplateListResponse>* GetGroupTemplateListRaw(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateListRequest& request) override;
    ::grpc::ClientAsyncReader< ::keyapis::access_management::v1::GetGroupTemplateListResponse>* AsyncGetGroupTemplateListRaw(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateListRequest& request, ::grpc::CompletionQueue* cq, void* tag) override;
    ::grpc::ClientAsyncReader< ::keyapis::access_management::v1::GetGroupTemplateListResponse>* PrepareAsyncGetGroupTemplateListRaw(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateListRequest& request, ::grpc::CompletionQueue* cq) override;
    ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::GetGroupTemplateCountResponse>* AsyncGetGroupTemplateCountRaw(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateCountRequest& request, ::grpc::CompletionQueue* cq) override;
    ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::GetGroupTemplateCountResponse>* PrepareAsyncGetGroupTemplateCountRaw(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateCountRequest& request, ::grpc::CompletionQueue* cq) override;
    ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::PostGroupTemplateResponse>* AsyncPostGroupTemplateRaw(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PostGroupTemplateRequest& request, ::grpc::CompletionQueue* cq) override;
    ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::PostGroupTemplateResponse>* PrepareAsyncPostGroupTemplateRaw(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PostGroupTemplateRequest& request, ::grpc::CompletionQueue* cq) override;
    ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::DeleteGroupTemplateResponse>* AsyncDeleteGroupTemplateRaw(::grpc::ClientContext* context, const ::keyapis::access_management::v1::DeleteGroupTemplateRequest& request, ::grpc::CompletionQueue* cq) override;
    ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::DeleteGroupTemplateResponse>* PrepareAsyncDeleteGroupTemplateRaw(::grpc::ClientContext* context, const ::keyapis::access_management::v1::DeleteGroupTemplateRequest& request, ::grpc::CompletionQueue* cq) override;
    ::grpc::ClientReader< ::keyapis::access_management::v1::GetGroupTemplateGroupListResponse>* GetGroupTemplateGroupListRaw(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateGroupListRequest& request) override;
    ::grpc::ClientAsyncReader< ::keyapis::access_management::v1::GetGroupTemplateGroupListResponse>* AsyncGetGroupTemplateGroupListRaw(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateGroupListRequest& request, ::grpc::CompletionQueue* cq, void* tag) override;
    ::grpc::ClientAsyncReader< ::keyapis::access_management::v1::GetGroupTemplateGroupListResponse>* PrepareAsyncGetGroupTemplateGroupListRaw(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateGroupListRequest& request, ::grpc::CompletionQueue* cq) override;
    ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::GetGroupTemplateGroupCountResponse>* AsyncGetGroupTemplateGroupCountRaw(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateGroupCountRequest& request, ::grpc::CompletionQueue* cq) override;
    ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::GetGroupTemplateGroupCountResponse>* PrepareAsyncGetGroupTemplateGroupCountRaw(::grpc::ClientContext* context, const ::keyapis::access_management::v1::GetGroupTemplateGroupCountRequest& request, ::grpc::CompletionQueue* cq) override;
    ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::PutGroupTemplateGroupAttachResponse>* AsyncPutGroupTemplateGroupAttachRaw(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PutGroupTemplateGroupAttachRequest& request, ::grpc::CompletionQueue* cq) override;
    ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::PutGroupTemplateGroupAttachResponse>* PrepareAsyncPutGroupTemplateGroupAttachRaw(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PutGroupTemplateGroupAttachRequest& request, ::grpc::CompletionQueue* cq) override;
    ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::PutGroupTemplateGroupDetachResponse>* AsyncPutGroupTemplateGroupDetachRaw(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PutGroupTemplateGroupDetachRequest& request, ::grpc::CompletionQueue* cq) override;
    ::grpc::ClientAsyncResponseReader< ::keyapis::access_management::v1::PutGroupTemplateGroupDetachResponse>* PrepareAsyncPutGroupTemplateGroupDetachRaw(::grpc::ClientContext* context, const ::keyapis::access_management::v1::PutGroupTemplateGroupDetachRequest& request, ::grpc::CompletionQueue* cq) override;
    const ::grpc::internal::RpcMethod rpcmethod_GetGroupTemplate_;
    const ::grpc::internal::RpcMethod rpcmethod_GetGroupTemplateList_;
    const ::grpc::internal::RpcMethod rpcmethod_GetGroupTemplateCount_;
    const ::grpc::internal::RpcMethod rpcmethod_PostGroupTemplate_;
    const ::grpc::internal::RpcMethod rpcmethod_DeleteGroupTemplate_;
    const ::grpc::internal::RpcMethod rpcmethod_GetGroupTemplateGroupList_;
    const ::grpc::internal::RpcMethod rpcmethod_GetGroupTemplateGroupCount_;
    const ::grpc::internal::RpcMethod rpcmethod_PutGroupTemplateGroupAttach_;
    const ::grpc::internal::RpcMethod rpcmethod_PutGroupTemplateGroupDetach_;
  };
  static std::unique_ptr<Stub> NewStub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& options = ::grpc::StubOptions());

  class Service : public ::grpc::Service {
   public:
    Service();
    virtual ~Service();
    // Метод получения шаблона группы.
    // Метод доступен для: admin, service, bti, seller
    virtual ::grpc::Status GetGroupTemplate(::grpc::ServerContext* context, const ::keyapis::access_management::v1::GetGroupTemplateRequest* request, ::keyapis::access_management::v1::GetGroupTemplateResponse* response);
    // Метод получения списка шаблонов групп.
    // Метод доступен для: admin, service, bti, seller
    virtual ::grpc::Status GetGroupTemplateList(::grpc::ServerContext* context, const ::keyapis::access_management::v1::GetGroupTemplateListRequest* request, ::grpc::ServerWriter< ::keyapis::access_management::v1::GetGroupTemplateListResponse>* writer);
    // Метод получения количества шаблонов групп.
    // Метод доступен для: admin, service, bti, seller
    virtual ::grpc::Status GetGroupTemplateCount(::grpc::ServerContext* context, const ::keyapis::access_management::v1::GetGroupTemplateCountRequest* request, ::keyapis::access_management::v1::GetGroupTemplateCountResponse* response);
    // Метод сохранения шаблона группы.
    // Поддерживает создание и обновление как UPSERT по GroupTemplate.id.
    // Метод доступен для: admin, service
    virtual ::grpc::Status PostGroupTemplate(::grpc::ServerContext* context, const ::keyapis::access_management::v1::PostGroupTemplateRequest* request, ::keyapis::access_management::v1::PostGroupTemplateResponse* response);
    // Метод удаления шаблона группы.
    // Проставляет дату удаления GroupTemplate.deleted_at.
    // Метод доступен для: admin, service
    virtual ::grpc::Status DeleteGroupTemplate(::grpc::ServerContext* context, const ::keyapis::access_management::v1::DeleteGroupTemplateRequest* request, ::keyapis::access_management::v1::DeleteGroupTemplateResponse* response);
    // Метод получения списка связей шаблонов групп и группы пользователя.
    // Метод доступен для: admin, service
    virtual ::grpc::Status GetGroupTemplateGroupList(::grpc::ServerContext* context, const ::keyapis::access_management::v1::GetGroupTemplateGroupListRequest* request, ::grpc::ServerWriter< ::keyapis::access_management::v1::GetGroupTemplateGroupListResponse>* writer);
    // Метод получения количества связей шаблонов групп и группы пользователя.
    // Метод доступен для: admin, service
    virtual ::grpc::Status GetGroupTemplateGroupCount(::grpc::ServerContext* context, const ::keyapis::access_management::v1::GetGroupTemplateGroupCountRequest* request, ::keyapis::access_management::v1::GetGroupTemplateGroupCountResponse* response);
    // Метод сохранения связей шаблонов групп и группы пользователя.
    // Метод доступен для: admin, service
    virtual ::grpc::Status PutGroupTemplateGroupAttach(::grpc::ServerContext* context, const ::keyapis::access_management::v1::PutGroupTemplateGroupAttachRequest* request, ::keyapis::access_management::v1::PutGroupTemplateGroupAttachResponse* response);
    // Метод удаления связей шаблонов групп и группы пользователя.
    // Метод доступен для: admin, service
    virtual ::grpc::Status PutGroupTemplateGroupDetach(::grpc::ServerContext* context, const ::keyapis::access_management::v1::PutGroupTemplateGroupDetachRequest* request, ::keyapis::access_management::v1::PutGroupTemplateGroupDetachResponse* response);
  };
  template <class BaseClass>
  class WithAsyncMethod_GetGroupTemplate : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithAsyncMethod_GetGroupTemplate() {
      ::grpc::Service::MarkMethodAsync(0);
    }
    ~WithAsyncMethod_GetGroupTemplate() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status GetGroupTemplate(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::GetGroupTemplateRequest* /*request*/, ::keyapis::access_management::v1::GetGroupTemplateResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    void RequestGetGroupTemplate(::grpc::ServerContext* context, ::keyapis::access_management::v1::GetGroupTemplateRequest* request, ::grpc::ServerAsyncResponseWriter< ::keyapis::access_management::v1::GetGroupTemplateResponse>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
      ::grpc::Service::RequestAsyncUnary(0, context, request, response, new_call_cq, notification_cq, tag);
    }
  };
  template <class BaseClass>
  class WithAsyncMethod_GetGroupTemplateList : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithAsyncMethod_GetGroupTemplateList() {
      ::grpc::Service::MarkMethodAsync(1);
    }
    ~WithAsyncMethod_GetGroupTemplateList() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status GetGroupTemplateList(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::GetGroupTemplateListRequest* /*request*/, ::grpc::ServerWriter< ::keyapis::access_management::v1::GetGroupTemplateListResponse>* /*writer*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    void RequestGetGroupTemplateList(::grpc::ServerContext* context, ::keyapis::access_management::v1::GetGroupTemplateListRequest* request, ::grpc::ServerAsyncWriter< ::keyapis::access_management::v1::GetGroupTemplateListResponse>* writer, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
      ::grpc::Service::RequestAsyncServerStreaming(1, context, request, writer, new_call_cq, notification_cq, tag);
    }
  };
  template <class BaseClass>
  class WithAsyncMethod_GetGroupTemplateCount : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithAsyncMethod_GetGroupTemplateCount() {
      ::grpc::Service::MarkMethodAsync(2);
    }
    ~WithAsyncMethod_GetGroupTemplateCount() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status GetGroupTemplateCount(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::GetGroupTemplateCountRequest* /*request*/, ::keyapis::access_management::v1::GetGroupTemplateCountResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    void RequestGetGroupTemplateCount(::grpc::ServerContext* context, ::keyapis::access_management::v1::GetGroupTemplateCountRequest* request, ::grpc::ServerAsyncResponseWriter< ::keyapis::access_management::v1::GetGroupTemplateCountResponse>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
      ::grpc::Service::RequestAsyncUnary(2, context, request, response, new_call_cq, notification_cq, tag);
    }
  };
  template <class BaseClass>
  class WithAsyncMethod_PostGroupTemplate : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithAsyncMethod_PostGroupTemplate() {
      ::grpc::Service::MarkMethodAsync(3);
    }
    ~WithAsyncMethod_PostGroupTemplate() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status PostGroupTemplate(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::PostGroupTemplateRequest* /*request*/, ::keyapis::access_management::v1::PostGroupTemplateResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    void RequestPostGroupTemplate(::grpc::ServerContext* context, ::keyapis::access_management::v1::PostGroupTemplateRequest* request, ::grpc::ServerAsyncResponseWriter< ::keyapis::access_management::v1::PostGroupTemplateResponse>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
      ::grpc::Service::RequestAsyncUnary(3, context, request, response, new_call_cq, notification_cq, tag);
    }
  };
  template <class BaseClass>
  class WithAsyncMethod_DeleteGroupTemplate : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithAsyncMethod_DeleteGroupTemplate() {
      ::grpc::Service::MarkMethodAsync(4);
    }
    ~WithAsyncMethod_DeleteGroupTemplate() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status DeleteGroupTemplate(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::DeleteGroupTemplateRequest* /*request*/, ::keyapis::access_management::v1::DeleteGroupTemplateResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    void RequestDeleteGroupTemplate(::grpc::ServerContext* context, ::keyapis::access_management::v1::DeleteGroupTemplateRequest* request, ::grpc::ServerAsyncResponseWriter< ::keyapis::access_management::v1::DeleteGroupTemplateResponse>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
      ::grpc::Service::RequestAsyncUnary(4, context, request, response, new_call_cq, notification_cq, tag);
    }
  };
  template <class BaseClass>
  class WithAsyncMethod_GetGroupTemplateGroupList : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithAsyncMethod_GetGroupTemplateGroupList() {
      ::grpc::Service::MarkMethodAsync(5);
    }
    ~WithAsyncMethod_GetGroupTemplateGroupList() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status GetGroupTemplateGroupList(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::GetGroupTemplateGroupListRequest* /*request*/, ::grpc::ServerWriter< ::keyapis::access_management::v1::GetGroupTemplateGroupListResponse>* /*writer*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    void RequestGetGroupTemplateGroupList(::grpc::ServerContext* context, ::keyapis::access_management::v1::GetGroupTemplateGroupListRequest* request, ::grpc::ServerAsyncWriter< ::keyapis::access_management::v1::GetGroupTemplateGroupListResponse>* writer, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
      ::grpc::Service::RequestAsyncServerStreaming(5, context, request, writer, new_call_cq, notification_cq, tag);
    }
  };
  template <class BaseClass>
  class WithAsyncMethod_GetGroupTemplateGroupCount : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithAsyncMethod_GetGroupTemplateGroupCount() {
      ::grpc::Service::MarkMethodAsync(6);
    }
    ~WithAsyncMethod_GetGroupTemplateGroupCount() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status GetGroupTemplateGroupCount(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::GetGroupTemplateGroupCountRequest* /*request*/, ::keyapis::access_management::v1::GetGroupTemplateGroupCountResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    void RequestGetGroupTemplateGroupCount(::grpc::ServerContext* context, ::keyapis::access_management::v1::GetGroupTemplateGroupCountRequest* request, ::grpc::ServerAsyncResponseWriter< ::keyapis::access_management::v1::GetGroupTemplateGroupCountResponse>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
      ::grpc::Service::RequestAsyncUnary(6, context, request, response, new_call_cq, notification_cq, tag);
    }
  };
  template <class BaseClass>
  class WithAsyncMethod_PutGroupTemplateGroupAttach : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithAsyncMethod_PutGroupTemplateGroupAttach() {
      ::grpc::Service::MarkMethodAsync(7);
    }
    ~WithAsyncMethod_PutGroupTemplateGroupAttach() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status PutGroupTemplateGroupAttach(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::PutGroupTemplateGroupAttachRequest* /*request*/, ::keyapis::access_management::v1::PutGroupTemplateGroupAttachResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    void RequestPutGroupTemplateGroupAttach(::grpc::ServerContext* context, ::keyapis::access_management::v1::PutGroupTemplateGroupAttachRequest* request, ::grpc::ServerAsyncResponseWriter< ::keyapis::access_management::v1::PutGroupTemplateGroupAttachResponse>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
      ::grpc::Service::RequestAsyncUnary(7, context, request, response, new_call_cq, notification_cq, tag);
    }
  };
  template <class BaseClass>
  class WithAsyncMethod_PutGroupTemplateGroupDetach : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithAsyncMethod_PutGroupTemplateGroupDetach() {
      ::grpc::Service::MarkMethodAsync(8);
    }
    ~WithAsyncMethod_PutGroupTemplateGroupDetach() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status PutGroupTemplateGroupDetach(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::PutGroupTemplateGroupDetachRequest* /*request*/, ::keyapis::access_management::v1::PutGroupTemplateGroupDetachResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    void RequestPutGroupTemplateGroupDetach(::grpc::ServerContext* context, ::keyapis::access_management::v1::PutGroupTemplateGroupDetachRequest* request, ::grpc::ServerAsyncResponseWriter< ::keyapis::access_management::v1::PutGroupTemplateGroupDetachResponse>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
      ::grpc::Service::RequestAsyncUnary(8, context, request, response, new_call_cq, notification_cq, tag);
    }
  };
  typedef WithAsyncMethod_GetGroupTemplate<WithAsyncMethod_GetGroupTemplateList<WithAsyncMethod_GetGroupTemplateCount<WithAsyncMethod_PostGroupTemplate<WithAsyncMethod_DeleteGroupTemplate<WithAsyncMethod_GetGroupTemplateGroupList<WithAsyncMethod_GetGroupTemplateGroupCount<WithAsyncMethod_PutGroupTemplateGroupAttach<WithAsyncMethod_PutGroupTemplateGroupDetach<Service > > > > > > > > > AsyncService;
  template <class BaseClass>
  class WithCallbackMethod_GetGroupTemplate : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithCallbackMethod_GetGroupTemplate() {
      ::grpc::Service::MarkMethodCallback(0,
          new ::grpc::internal::CallbackUnaryHandler< ::keyapis::access_management::v1::GetGroupTemplateRequest, ::keyapis::access_management::v1::GetGroupTemplateResponse>(
            [this](
                   ::grpc::CallbackServerContext* context, const ::keyapis::access_management::v1::GetGroupTemplateRequest* request, ::keyapis::access_management::v1::GetGroupTemplateResponse* response) { return this->GetGroupTemplate(context, request, response); }));}
    void SetMessageAllocatorFor_GetGroupTemplate(
        ::grpc::MessageAllocator< ::keyapis::access_management::v1::GetGroupTemplateRequest, ::keyapis::access_management::v1::GetGroupTemplateResponse>* allocator) {
      ::grpc::internal::MethodHandler* const handler = ::grpc::Service::GetHandler(0);
      static_cast<::grpc::internal::CallbackUnaryHandler< ::keyapis::access_management::v1::GetGroupTemplateRequest, ::keyapis::access_management::v1::GetGroupTemplateResponse>*>(handler)
              ->SetMessageAllocator(allocator);
    }
    ~WithCallbackMethod_GetGroupTemplate() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status GetGroupTemplate(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::GetGroupTemplateRequest* /*request*/, ::keyapis::access_management::v1::GetGroupTemplateResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    virtual ::grpc::ServerUnaryReactor* GetGroupTemplate(
      ::grpc::CallbackServerContext* /*context*/, const ::keyapis::access_management::v1::GetGroupTemplateRequest* /*request*/, ::keyapis::access_management::v1::GetGroupTemplateResponse* /*response*/)  { return nullptr; }
  };
  template <class BaseClass>
  class WithCallbackMethod_GetGroupTemplateList : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithCallbackMethod_GetGroupTemplateList() {
      ::grpc::Service::MarkMethodCallback(1,
          new ::grpc::internal::CallbackServerStreamingHandler< ::keyapis::access_management::v1::GetGroupTemplateListRequest, ::keyapis::access_management::v1::GetGroupTemplateListResponse>(
            [this](
                   ::grpc::CallbackServerContext* context, const ::keyapis::access_management::v1::GetGroupTemplateListRequest* request) { return this->GetGroupTemplateList(context, request); }));
    }
    ~WithCallbackMethod_GetGroupTemplateList() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status GetGroupTemplateList(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::GetGroupTemplateListRequest* /*request*/, ::grpc::ServerWriter< ::keyapis::access_management::v1::GetGroupTemplateListResponse>* /*writer*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    virtual ::grpc::ServerWriteReactor< ::keyapis::access_management::v1::GetGroupTemplateListResponse>* GetGroupTemplateList(
      ::grpc::CallbackServerContext* /*context*/, const ::keyapis::access_management::v1::GetGroupTemplateListRequest* /*request*/)  { return nullptr; }
  };
  template <class BaseClass>
  class WithCallbackMethod_GetGroupTemplateCount : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithCallbackMethod_GetGroupTemplateCount() {
      ::grpc::Service::MarkMethodCallback(2,
          new ::grpc::internal::CallbackUnaryHandler< ::keyapis::access_management::v1::GetGroupTemplateCountRequest, ::keyapis::access_management::v1::GetGroupTemplateCountResponse>(
            [this](
                   ::grpc::CallbackServerContext* context, const ::keyapis::access_management::v1::GetGroupTemplateCountRequest* request, ::keyapis::access_management::v1::GetGroupTemplateCountResponse* response) { return this->GetGroupTemplateCount(context, request, response); }));}
    void SetMessageAllocatorFor_GetGroupTemplateCount(
        ::grpc::MessageAllocator< ::keyapis::access_management::v1::GetGroupTemplateCountRequest, ::keyapis::access_management::v1::GetGroupTemplateCountResponse>* allocator) {
      ::grpc::internal::MethodHandler* const handler = ::grpc::Service::GetHandler(2);
      static_cast<::grpc::internal::CallbackUnaryHandler< ::keyapis::access_management::v1::GetGroupTemplateCountRequest, ::keyapis::access_management::v1::GetGroupTemplateCountResponse>*>(handler)
              ->SetMessageAllocator(allocator);
    }
    ~WithCallbackMethod_GetGroupTemplateCount() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status GetGroupTemplateCount(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::GetGroupTemplateCountRequest* /*request*/, ::keyapis::access_management::v1::GetGroupTemplateCountResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    virtual ::grpc::ServerUnaryReactor* GetGroupTemplateCount(
      ::grpc::CallbackServerContext* /*context*/, const ::keyapis::access_management::v1::GetGroupTemplateCountRequest* /*request*/, ::keyapis::access_management::v1::GetGroupTemplateCountResponse* /*response*/)  { return nullptr; }
  };
  template <class BaseClass>
  class WithCallbackMethod_PostGroupTemplate : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithCallbackMethod_PostGroupTemplate() {
      ::grpc::Service::MarkMethodCallback(3,
          new ::grpc::internal::CallbackUnaryHandler< ::keyapis::access_management::v1::PostGroupTemplateRequest, ::keyapis::access_management::v1::PostGroupTemplateResponse>(
            [this](
                   ::grpc::CallbackServerContext* context, const ::keyapis::access_management::v1::PostGroupTemplateRequest* request, ::keyapis::access_management::v1::PostGroupTemplateResponse* response) { return this->PostGroupTemplate(context, request, response); }));}
    void SetMessageAllocatorFor_PostGroupTemplate(
        ::grpc::MessageAllocator< ::keyapis::access_management::v1::PostGroupTemplateRequest, ::keyapis::access_management::v1::PostGroupTemplateResponse>* allocator) {
      ::grpc::internal::MethodHandler* const handler = ::grpc::Service::GetHandler(3);
      static_cast<::grpc::internal::CallbackUnaryHandler< ::keyapis::access_management::v1::PostGroupTemplateRequest, ::keyapis::access_management::v1::PostGroupTemplateResponse>*>(handler)
              ->SetMessageAllocator(allocator);
    }
    ~WithCallbackMethod_PostGroupTemplate() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status PostGroupTemplate(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::PostGroupTemplateRequest* /*request*/, ::keyapis::access_management::v1::PostGroupTemplateResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    virtual ::grpc::ServerUnaryReactor* PostGroupTemplate(
      ::grpc::CallbackServerContext* /*context*/, const ::keyapis::access_management::v1::PostGroupTemplateRequest* /*request*/, ::keyapis::access_management::v1::PostGroupTemplateResponse* /*response*/)  { return nullptr; }
  };
  template <class BaseClass>
  class WithCallbackMethod_DeleteGroupTemplate : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithCallbackMethod_DeleteGroupTemplate() {
      ::grpc::Service::MarkMethodCallback(4,
          new ::grpc::internal::CallbackUnaryHandler< ::keyapis::access_management::v1::DeleteGroupTemplateRequest, ::keyapis::access_management::v1::DeleteGroupTemplateResponse>(
            [this](
                   ::grpc::CallbackServerContext* context, const ::keyapis::access_management::v1::DeleteGroupTemplateRequest* request, ::keyapis::access_management::v1::DeleteGroupTemplateResponse* response) { return this->DeleteGroupTemplate(context, request, response); }));}
    void SetMessageAllocatorFor_DeleteGroupTemplate(
        ::grpc::MessageAllocator< ::keyapis::access_management::v1::DeleteGroupTemplateRequest, ::keyapis::access_management::v1::DeleteGroupTemplateResponse>* allocator) {
      ::grpc::internal::MethodHandler* const handler = ::grpc::Service::GetHandler(4);
      static_cast<::grpc::internal::CallbackUnaryHandler< ::keyapis::access_management::v1::DeleteGroupTemplateRequest, ::keyapis::access_management::v1::DeleteGroupTemplateResponse>*>(handler)
              ->SetMessageAllocator(allocator);
    }
    ~WithCallbackMethod_DeleteGroupTemplate() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status DeleteGroupTemplate(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::DeleteGroupTemplateRequest* /*request*/, ::keyapis::access_management::v1::DeleteGroupTemplateResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    virtual ::grpc::ServerUnaryReactor* DeleteGroupTemplate(
      ::grpc::CallbackServerContext* /*context*/, const ::keyapis::access_management::v1::DeleteGroupTemplateRequest* /*request*/, ::keyapis::access_management::v1::DeleteGroupTemplateResponse* /*response*/)  { return nullptr; }
  };
  template <class BaseClass>
  class WithCallbackMethod_GetGroupTemplateGroupList : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithCallbackMethod_GetGroupTemplateGroupList() {
      ::grpc::Service::MarkMethodCallback(5,
          new ::grpc::internal::CallbackServerStreamingHandler< ::keyapis::access_management::v1::GetGroupTemplateGroupListRequest, ::keyapis::access_management::v1::GetGroupTemplateGroupListResponse>(
            [this](
                   ::grpc::CallbackServerContext* context, const ::keyapis::access_management::v1::GetGroupTemplateGroupListRequest* request) { return this->GetGroupTemplateGroupList(context, request); }));
    }
    ~WithCallbackMethod_GetGroupTemplateGroupList() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status GetGroupTemplateGroupList(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::GetGroupTemplateGroupListRequest* /*request*/, ::grpc::ServerWriter< ::keyapis::access_management::v1::GetGroupTemplateGroupListResponse>* /*writer*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    virtual ::grpc::ServerWriteReactor< ::keyapis::access_management::v1::GetGroupTemplateGroupListResponse>* GetGroupTemplateGroupList(
      ::grpc::CallbackServerContext* /*context*/, const ::keyapis::access_management::v1::GetGroupTemplateGroupListRequest* /*request*/)  { return nullptr; }
  };
  template <class BaseClass>
  class WithCallbackMethod_GetGroupTemplateGroupCount : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithCallbackMethod_GetGroupTemplateGroupCount() {
      ::grpc::Service::MarkMethodCallback(6,
          new ::grpc::internal::CallbackUnaryHandler< ::keyapis::access_management::v1::GetGroupTemplateGroupCountRequest, ::keyapis::access_management::v1::GetGroupTemplateGroupCountResponse>(
            [this](
                   ::grpc::CallbackServerContext* context, const ::keyapis::access_management::v1::GetGroupTemplateGroupCountRequest* request, ::keyapis::access_management::v1::GetGroupTemplateGroupCountResponse* response) { return this->GetGroupTemplateGroupCount(context, request, response); }));}
    void SetMessageAllocatorFor_GetGroupTemplateGroupCount(
        ::grpc::MessageAllocator< ::keyapis::access_management::v1::GetGroupTemplateGroupCountRequest, ::keyapis::access_management::v1::GetGroupTemplateGroupCountResponse>* allocator) {
      ::grpc::internal::MethodHandler* const handler = ::grpc::Service::GetHandler(6);
      static_cast<::grpc::internal::CallbackUnaryHandler< ::keyapis::access_management::v1::GetGroupTemplateGroupCountRequest, ::keyapis::access_management::v1::GetGroupTemplateGroupCountResponse>*>(handler)
              ->SetMessageAllocator(allocator);
    }
    ~WithCallbackMethod_GetGroupTemplateGroupCount() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status GetGroupTemplateGroupCount(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::GetGroupTemplateGroupCountRequest* /*request*/, ::keyapis::access_management::v1::GetGroupTemplateGroupCountResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    virtual ::grpc::ServerUnaryReactor* GetGroupTemplateGroupCount(
      ::grpc::CallbackServerContext* /*context*/, const ::keyapis::access_management::v1::GetGroupTemplateGroupCountRequest* /*request*/, ::keyapis::access_management::v1::GetGroupTemplateGroupCountResponse* /*response*/)  { return nullptr; }
  };
  template <class BaseClass>
  class WithCallbackMethod_PutGroupTemplateGroupAttach : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithCallbackMethod_PutGroupTemplateGroupAttach() {
      ::grpc::Service::MarkMethodCallback(7,
          new ::grpc::internal::CallbackUnaryHandler< ::keyapis::access_management::v1::PutGroupTemplateGroupAttachRequest, ::keyapis::access_management::v1::PutGroupTemplateGroupAttachResponse>(
            [this](
                   ::grpc::CallbackServerContext* context, const ::keyapis::access_management::v1::PutGroupTemplateGroupAttachRequest* request, ::keyapis::access_management::v1::PutGroupTemplateGroupAttachResponse* response) { return this->PutGroupTemplateGroupAttach(context, request, response); }));}
    void SetMessageAllocatorFor_PutGroupTemplateGroupAttach(
        ::grpc::MessageAllocator< ::keyapis::access_management::v1::PutGroupTemplateGroupAttachRequest, ::keyapis::access_management::v1::PutGroupTemplateGroupAttachResponse>* allocator) {
      ::grpc::internal::MethodHandler* const handler = ::grpc::Service::GetHandler(7);
      static_cast<::grpc::internal::CallbackUnaryHandler< ::keyapis::access_management::v1::PutGroupTemplateGroupAttachRequest, ::keyapis::access_management::v1::PutGroupTemplateGroupAttachResponse>*>(handler)
              ->SetMessageAllocator(allocator);
    }
    ~WithCallbackMethod_PutGroupTemplateGroupAttach() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status PutGroupTemplateGroupAttach(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::PutGroupTemplateGroupAttachRequest* /*request*/, ::keyapis::access_management::v1::PutGroupTemplateGroupAttachResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    virtual ::grpc::ServerUnaryReactor* PutGroupTemplateGroupAttach(
      ::grpc::CallbackServerContext* /*context*/, const ::keyapis::access_management::v1::PutGroupTemplateGroupAttachRequest* /*request*/, ::keyapis::access_management::v1::PutGroupTemplateGroupAttachResponse* /*response*/)  { return nullptr; }
  };
  template <class BaseClass>
  class WithCallbackMethod_PutGroupTemplateGroupDetach : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithCallbackMethod_PutGroupTemplateGroupDetach() {
      ::grpc::Service::MarkMethodCallback(8,
          new ::grpc::internal::CallbackUnaryHandler< ::keyapis::access_management::v1::PutGroupTemplateGroupDetachRequest, ::keyapis::access_management::v1::PutGroupTemplateGroupDetachResponse>(
            [this](
                   ::grpc::CallbackServerContext* context, const ::keyapis::access_management::v1::PutGroupTemplateGroupDetachRequest* request, ::keyapis::access_management::v1::PutGroupTemplateGroupDetachResponse* response) { return this->PutGroupTemplateGroupDetach(context, request, response); }));}
    void SetMessageAllocatorFor_PutGroupTemplateGroupDetach(
        ::grpc::MessageAllocator< ::keyapis::access_management::v1::PutGroupTemplateGroupDetachRequest, ::keyapis::access_management::v1::PutGroupTemplateGroupDetachResponse>* allocator) {
      ::grpc::internal::MethodHandler* const handler = ::grpc::Service::GetHandler(8);
      static_cast<::grpc::internal::CallbackUnaryHandler< ::keyapis::access_management::v1::PutGroupTemplateGroupDetachRequest, ::keyapis::access_management::v1::PutGroupTemplateGroupDetachResponse>*>(handler)
              ->SetMessageAllocator(allocator);
    }
    ~WithCallbackMethod_PutGroupTemplateGroupDetach() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status PutGroupTemplateGroupDetach(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::PutGroupTemplateGroupDetachRequest* /*request*/, ::keyapis::access_management::v1::PutGroupTemplateGroupDetachResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    virtual ::grpc::ServerUnaryReactor* PutGroupTemplateGroupDetach(
      ::grpc::CallbackServerContext* /*context*/, const ::keyapis::access_management::v1::PutGroupTemplateGroupDetachRequest* /*request*/, ::keyapis::access_management::v1::PutGroupTemplateGroupDetachResponse* /*response*/)  { return nullptr; }
  };
  typedef WithCallbackMethod_GetGroupTemplate<WithCallbackMethod_GetGroupTemplateList<WithCallbackMethod_GetGroupTemplateCount<WithCallbackMethod_PostGroupTemplate<WithCallbackMethod_DeleteGroupTemplate<WithCallbackMethod_GetGroupTemplateGroupList<WithCallbackMethod_GetGroupTemplateGroupCount<WithCallbackMethod_PutGroupTemplateGroupAttach<WithCallbackMethod_PutGroupTemplateGroupDetach<Service > > > > > > > > > CallbackService;
  typedef CallbackService ExperimentalCallbackService;
  template <class BaseClass>
  class WithGenericMethod_GetGroupTemplate : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithGenericMethod_GetGroupTemplate() {
      ::grpc::Service::MarkMethodGeneric(0);
    }
    ~WithGenericMethod_GetGroupTemplate() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status GetGroupTemplate(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::GetGroupTemplateRequest* /*request*/, ::keyapis::access_management::v1::GetGroupTemplateResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
  };
  template <class BaseClass>
  class WithGenericMethod_GetGroupTemplateList : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithGenericMethod_GetGroupTemplateList() {
      ::grpc::Service::MarkMethodGeneric(1);
    }
    ~WithGenericMethod_GetGroupTemplateList() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status GetGroupTemplateList(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::GetGroupTemplateListRequest* /*request*/, ::grpc::ServerWriter< ::keyapis::access_management::v1::GetGroupTemplateListResponse>* /*writer*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
  };
  template <class BaseClass>
  class WithGenericMethod_GetGroupTemplateCount : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithGenericMethod_GetGroupTemplateCount() {
      ::grpc::Service::MarkMethodGeneric(2);
    }
    ~WithGenericMethod_GetGroupTemplateCount() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status GetGroupTemplateCount(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::GetGroupTemplateCountRequest* /*request*/, ::keyapis::access_management::v1::GetGroupTemplateCountResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
  };
  template <class BaseClass>
  class WithGenericMethod_PostGroupTemplate : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithGenericMethod_PostGroupTemplate() {
      ::grpc::Service::MarkMethodGeneric(3);
    }
    ~WithGenericMethod_PostGroupTemplate() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status PostGroupTemplate(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::PostGroupTemplateRequest* /*request*/, ::keyapis::access_management::v1::PostGroupTemplateResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
  };
  template <class BaseClass>
  class WithGenericMethod_DeleteGroupTemplate : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithGenericMethod_DeleteGroupTemplate() {
      ::grpc::Service::MarkMethodGeneric(4);
    }
    ~WithGenericMethod_DeleteGroupTemplate() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status DeleteGroupTemplate(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::DeleteGroupTemplateRequest* /*request*/, ::keyapis::access_management::v1::DeleteGroupTemplateResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
  };
  template <class BaseClass>
  class WithGenericMethod_GetGroupTemplateGroupList : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithGenericMethod_GetGroupTemplateGroupList() {
      ::grpc::Service::MarkMethodGeneric(5);
    }
    ~WithGenericMethod_GetGroupTemplateGroupList() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status GetGroupTemplateGroupList(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::GetGroupTemplateGroupListRequest* /*request*/, ::grpc::ServerWriter< ::keyapis::access_management::v1::GetGroupTemplateGroupListResponse>* /*writer*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
  };
  template <class BaseClass>
  class WithGenericMethod_GetGroupTemplateGroupCount : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithGenericMethod_GetGroupTemplateGroupCount() {
      ::grpc::Service::MarkMethodGeneric(6);
    }
    ~WithGenericMethod_GetGroupTemplateGroupCount() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status GetGroupTemplateGroupCount(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::GetGroupTemplateGroupCountRequest* /*request*/, ::keyapis::access_management::v1::GetGroupTemplateGroupCountResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
  };
  template <class BaseClass>
  class WithGenericMethod_PutGroupTemplateGroupAttach : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithGenericMethod_PutGroupTemplateGroupAttach() {
      ::grpc::Service::MarkMethodGeneric(7);
    }
    ~WithGenericMethod_PutGroupTemplateGroupAttach() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status PutGroupTemplateGroupAttach(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::PutGroupTemplateGroupAttachRequest* /*request*/, ::keyapis::access_management::v1::PutGroupTemplateGroupAttachResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
  };
  template <class BaseClass>
  class WithGenericMethod_PutGroupTemplateGroupDetach : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithGenericMethod_PutGroupTemplateGroupDetach() {
      ::grpc::Service::MarkMethodGeneric(8);
    }
    ~WithGenericMethod_PutGroupTemplateGroupDetach() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status PutGroupTemplateGroupDetach(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::PutGroupTemplateGroupDetachRequest* /*request*/, ::keyapis::access_management::v1::PutGroupTemplateGroupDetachResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
  };
  template <class BaseClass>
  class WithRawMethod_GetGroupTemplate : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithRawMethod_GetGroupTemplate() {
      ::grpc::Service::MarkMethodRaw(0);
    }
    ~WithRawMethod_GetGroupTemplate() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status GetGroupTemplate(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::GetGroupTemplateRequest* /*request*/, ::keyapis::access_management::v1::GetGroupTemplateResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    void RequestGetGroupTemplate(::grpc::ServerContext* context, ::grpc::ByteBuffer* request, ::grpc::ServerAsyncResponseWriter< ::grpc::ByteBuffer>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
      ::grpc::Service::RequestAsyncUnary(0, context, request, response, new_call_cq, notification_cq, tag);
    }
  };
  template <class BaseClass>
  class WithRawMethod_GetGroupTemplateList : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithRawMethod_GetGroupTemplateList() {
      ::grpc::Service::MarkMethodRaw(1);
    }
    ~WithRawMethod_GetGroupTemplateList() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status GetGroupTemplateList(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::GetGroupTemplateListRequest* /*request*/, ::grpc::ServerWriter< ::keyapis::access_management::v1::GetGroupTemplateListResponse>* /*writer*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    void RequestGetGroupTemplateList(::grpc::ServerContext* context, ::grpc::ByteBuffer* request, ::grpc::ServerAsyncWriter< ::grpc::ByteBuffer>* writer, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
      ::grpc::Service::RequestAsyncServerStreaming(1, context, request, writer, new_call_cq, notification_cq, tag);
    }
  };
  template <class BaseClass>
  class WithRawMethod_GetGroupTemplateCount : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithRawMethod_GetGroupTemplateCount() {
      ::grpc::Service::MarkMethodRaw(2);
    }
    ~WithRawMethod_GetGroupTemplateCount() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status GetGroupTemplateCount(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::GetGroupTemplateCountRequest* /*request*/, ::keyapis::access_management::v1::GetGroupTemplateCountResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    void RequestGetGroupTemplateCount(::grpc::ServerContext* context, ::grpc::ByteBuffer* request, ::grpc::ServerAsyncResponseWriter< ::grpc::ByteBuffer>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
      ::grpc::Service::RequestAsyncUnary(2, context, request, response, new_call_cq, notification_cq, tag);
    }
  };
  template <class BaseClass>
  class WithRawMethod_PostGroupTemplate : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithRawMethod_PostGroupTemplate() {
      ::grpc::Service::MarkMethodRaw(3);
    }
    ~WithRawMethod_PostGroupTemplate() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status PostGroupTemplate(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::PostGroupTemplateRequest* /*request*/, ::keyapis::access_management::v1::PostGroupTemplateResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    void RequestPostGroupTemplate(::grpc::ServerContext* context, ::grpc::ByteBuffer* request, ::grpc::ServerAsyncResponseWriter< ::grpc::ByteBuffer>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
      ::grpc::Service::RequestAsyncUnary(3, context, request, response, new_call_cq, notification_cq, tag);
    }
  };
  template <class BaseClass>
  class WithRawMethod_DeleteGroupTemplate : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithRawMethod_DeleteGroupTemplate() {
      ::grpc::Service::MarkMethodRaw(4);
    }
    ~WithRawMethod_DeleteGroupTemplate() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status DeleteGroupTemplate(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::DeleteGroupTemplateRequest* /*request*/, ::keyapis::access_management::v1::DeleteGroupTemplateResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    void RequestDeleteGroupTemplate(::grpc::ServerContext* context, ::grpc::ByteBuffer* request, ::grpc::ServerAsyncResponseWriter< ::grpc::ByteBuffer>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
      ::grpc::Service::RequestAsyncUnary(4, context, request, response, new_call_cq, notification_cq, tag);
    }
  };
  template <class BaseClass>
  class WithRawMethod_GetGroupTemplateGroupList : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithRawMethod_GetGroupTemplateGroupList() {
      ::grpc::Service::MarkMethodRaw(5);
    }
    ~WithRawMethod_GetGroupTemplateGroupList() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status GetGroupTemplateGroupList(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::GetGroupTemplateGroupListRequest* /*request*/, ::grpc::ServerWriter< ::keyapis::access_management::v1::GetGroupTemplateGroupListResponse>* /*writer*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    void RequestGetGroupTemplateGroupList(::grpc::ServerContext* context, ::grpc::ByteBuffer* request, ::grpc::ServerAsyncWriter< ::grpc::ByteBuffer>* writer, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
      ::grpc::Service::RequestAsyncServerStreaming(5, context, request, writer, new_call_cq, notification_cq, tag);
    }
  };
  template <class BaseClass>
  class WithRawMethod_GetGroupTemplateGroupCount : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithRawMethod_GetGroupTemplateGroupCount() {
      ::grpc::Service::MarkMethodRaw(6);
    }
    ~WithRawMethod_GetGroupTemplateGroupCount() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status GetGroupTemplateGroupCount(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::GetGroupTemplateGroupCountRequest* /*request*/, ::keyapis::access_management::v1::GetGroupTemplateGroupCountResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    void RequestGetGroupTemplateGroupCount(::grpc::ServerContext* context, ::grpc::ByteBuffer* request, ::grpc::ServerAsyncResponseWriter< ::grpc::ByteBuffer>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
      ::grpc::Service::RequestAsyncUnary(6, context, request, response, new_call_cq, notification_cq, tag);
    }
  };
  template <class BaseClass>
  class WithRawMethod_PutGroupTemplateGroupAttach : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithRawMethod_PutGroupTemplateGroupAttach() {
      ::grpc::Service::MarkMethodRaw(7);
    }
    ~WithRawMethod_PutGroupTemplateGroupAttach() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status PutGroupTemplateGroupAttach(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::PutGroupTemplateGroupAttachRequest* /*request*/, ::keyapis::access_management::v1::PutGroupTemplateGroupAttachResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    void RequestPutGroupTemplateGroupAttach(::grpc::ServerContext* context, ::grpc::ByteBuffer* request, ::grpc::ServerAsyncResponseWriter< ::grpc::ByteBuffer>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
      ::grpc::Service::RequestAsyncUnary(7, context, request, response, new_call_cq, notification_cq, tag);
    }
  };
  template <class BaseClass>
  class WithRawMethod_PutGroupTemplateGroupDetach : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithRawMethod_PutGroupTemplateGroupDetach() {
      ::grpc::Service::MarkMethodRaw(8);
    }
    ~WithRawMethod_PutGroupTemplateGroupDetach() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status PutGroupTemplateGroupDetach(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::PutGroupTemplateGroupDetachRequest* /*request*/, ::keyapis::access_management::v1::PutGroupTemplateGroupDetachResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    void RequestPutGroupTemplateGroupDetach(::grpc::ServerContext* context, ::grpc::ByteBuffer* request, ::grpc::ServerAsyncResponseWriter< ::grpc::ByteBuffer>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
      ::grpc::Service::RequestAsyncUnary(8, context, request, response, new_call_cq, notification_cq, tag);
    }
  };
  template <class BaseClass>
  class WithRawCallbackMethod_GetGroupTemplate : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithRawCallbackMethod_GetGroupTemplate() {
      ::grpc::Service::MarkMethodRawCallback(0,
          new ::grpc::internal::CallbackUnaryHandler< ::grpc::ByteBuffer, ::grpc::ByteBuffer>(
            [this](
                   ::grpc::CallbackServerContext* context, const ::grpc::ByteBuffer* request, ::grpc::ByteBuffer* response) { return this->GetGroupTemplate(context, request, response); }));
    }
    ~WithRawCallbackMethod_GetGroupTemplate() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status GetGroupTemplate(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::GetGroupTemplateRequest* /*request*/, ::keyapis::access_management::v1::GetGroupTemplateResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    virtual ::grpc::ServerUnaryReactor* GetGroupTemplate(
      ::grpc::CallbackServerContext* /*context*/, const ::grpc::ByteBuffer* /*request*/, ::grpc::ByteBuffer* /*response*/)  { return nullptr; }
  };
  template <class BaseClass>
  class WithRawCallbackMethod_GetGroupTemplateList : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithRawCallbackMethod_GetGroupTemplateList() {
      ::grpc::Service::MarkMethodRawCallback(1,
          new ::grpc::internal::CallbackServerStreamingHandler< ::grpc::ByteBuffer, ::grpc::ByteBuffer>(
            [this](
                   ::grpc::CallbackServerContext* context, const::grpc::ByteBuffer* request) { return this->GetGroupTemplateList(context, request); }));
    }
    ~WithRawCallbackMethod_GetGroupTemplateList() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status GetGroupTemplateList(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::GetGroupTemplateListRequest* /*request*/, ::grpc::ServerWriter< ::keyapis::access_management::v1::GetGroupTemplateListResponse>* /*writer*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    virtual ::grpc::ServerWriteReactor< ::grpc::ByteBuffer>* GetGroupTemplateList(
      ::grpc::CallbackServerContext* /*context*/, const ::grpc::ByteBuffer* /*request*/)  { return nullptr; }
  };
  template <class BaseClass>
  class WithRawCallbackMethod_GetGroupTemplateCount : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithRawCallbackMethod_GetGroupTemplateCount() {
      ::grpc::Service::MarkMethodRawCallback(2,
          new ::grpc::internal::CallbackUnaryHandler< ::grpc::ByteBuffer, ::grpc::ByteBuffer>(
            [this](
                   ::grpc::CallbackServerContext* context, const ::grpc::ByteBuffer* request, ::grpc::ByteBuffer* response) { return this->GetGroupTemplateCount(context, request, response); }));
    }
    ~WithRawCallbackMethod_GetGroupTemplateCount() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status GetGroupTemplateCount(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::GetGroupTemplateCountRequest* /*request*/, ::keyapis::access_management::v1::GetGroupTemplateCountResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    virtual ::grpc::ServerUnaryReactor* GetGroupTemplateCount(
      ::grpc::CallbackServerContext* /*context*/, const ::grpc::ByteBuffer* /*request*/, ::grpc::ByteBuffer* /*response*/)  { return nullptr; }
  };
  template <class BaseClass>
  class WithRawCallbackMethod_PostGroupTemplate : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithRawCallbackMethod_PostGroupTemplate() {
      ::grpc::Service::MarkMethodRawCallback(3,
          new ::grpc::internal::CallbackUnaryHandler< ::grpc::ByteBuffer, ::grpc::ByteBuffer>(
            [this](
                   ::grpc::CallbackServerContext* context, const ::grpc::ByteBuffer* request, ::grpc::ByteBuffer* response) { return this->PostGroupTemplate(context, request, response); }));
    }
    ~WithRawCallbackMethod_PostGroupTemplate() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status PostGroupTemplate(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::PostGroupTemplateRequest* /*request*/, ::keyapis::access_management::v1::PostGroupTemplateResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    virtual ::grpc::ServerUnaryReactor* PostGroupTemplate(
      ::grpc::CallbackServerContext* /*context*/, const ::grpc::ByteBuffer* /*request*/, ::grpc::ByteBuffer* /*response*/)  { return nullptr; }
  };
  template <class BaseClass>
  class WithRawCallbackMethod_DeleteGroupTemplate : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithRawCallbackMethod_DeleteGroupTemplate() {
      ::grpc::Service::MarkMethodRawCallback(4,
          new ::grpc::internal::CallbackUnaryHandler< ::grpc::ByteBuffer, ::grpc::ByteBuffer>(
            [this](
                   ::grpc::CallbackServerContext* context, const ::grpc::ByteBuffer* request, ::grpc::ByteBuffer* response) { return this->DeleteGroupTemplate(context, request, response); }));
    }
    ~WithRawCallbackMethod_DeleteGroupTemplate() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status DeleteGroupTemplate(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::DeleteGroupTemplateRequest* /*request*/, ::keyapis::access_management::v1::DeleteGroupTemplateResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    virtual ::grpc::ServerUnaryReactor* DeleteGroupTemplate(
      ::grpc::CallbackServerContext* /*context*/, const ::grpc::ByteBuffer* /*request*/, ::grpc::ByteBuffer* /*response*/)  { return nullptr; }
  };
  template <class BaseClass>
  class WithRawCallbackMethod_GetGroupTemplateGroupList : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithRawCallbackMethod_GetGroupTemplateGroupList() {
      ::grpc::Service::MarkMethodRawCallback(5,
          new ::grpc::internal::CallbackServerStreamingHandler< ::grpc::ByteBuffer, ::grpc::ByteBuffer>(
            [this](
                   ::grpc::CallbackServerContext* context, const::grpc::ByteBuffer* request) { return this->GetGroupTemplateGroupList(context, request); }));
    }
    ~WithRawCallbackMethod_GetGroupTemplateGroupList() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status GetGroupTemplateGroupList(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::GetGroupTemplateGroupListRequest* /*request*/, ::grpc::ServerWriter< ::keyapis::access_management::v1::GetGroupTemplateGroupListResponse>* /*writer*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    virtual ::grpc::ServerWriteReactor< ::grpc::ByteBuffer>* GetGroupTemplateGroupList(
      ::grpc::CallbackServerContext* /*context*/, const ::grpc::ByteBuffer* /*request*/)  { return nullptr; }
  };
  template <class BaseClass>
  class WithRawCallbackMethod_GetGroupTemplateGroupCount : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithRawCallbackMethod_GetGroupTemplateGroupCount() {
      ::grpc::Service::MarkMethodRawCallback(6,
          new ::grpc::internal::CallbackUnaryHandler< ::grpc::ByteBuffer, ::grpc::ByteBuffer>(
            [this](
                   ::grpc::CallbackServerContext* context, const ::grpc::ByteBuffer* request, ::grpc::ByteBuffer* response) { return this->GetGroupTemplateGroupCount(context, request, response); }));
    }
    ~WithRawCallbackMethod_GetGroupTemplateGroupCount() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status GetGroupTemplateGroupCount(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::GetGroupTemplateGroupCountRequest* /*request*/, ::keyapis::access_management::v1::GetGroupTemplateGroupCountResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    virtual ::grpc::ServerUnaryReactor* GetGroupTemplateGroupCount(
      ::grpc::CallbackServerContext* /*context*/, const ::grpc::ByteBuffer* /*request*/, ::grpc::ByteBuffer* /*response*/)  { return nullptr; }
  };
  template <class BaseClass>
  class WithRawCallbackMethod_PutGroupTemplateGroupAttach : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithRawCallbackMethod_PutGroupTemplateGroupAttach() {
      ::grpc::Service::MarkMethodRawCallback(7,
          new ::grpc::internal::CallbackUnaryHandler< ::grpc::ByteBuffer, ::grpc::ByteBuffer>(
            [this](
                   ::grpc::CallbackServerContext* context, const ::grpc::ByteBuffer* request, ::grpc::ByteBuffer* response) { return this->PutGroupTemplateGroupAttach(context, request, response); }));
    }
    ~WithRawCallbackMethod_PutGroupTemplateGroupAttach() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status PutGroupTemplateGroupAttach(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::PutGroupTemplateGroupAttachRequest* /*request*/, ::keyapis::access_management::v1::PutGroupTemplateGroupAttachResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    virtual ::grpc::ServerUnaryReactor* PutGroupTemplateGroupAttach(
      ::grpc::CallbackServerContext* /*context*/, const ::grpc::ByteBuffer* /*request*/, ::grpc::ByteBuffer* /*response*/)  { return nullptr; }
  };
  template <class BaseClass>
  class WithRawCallbackMethod_PutGroupTemplateGroupDetach : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithRawCallbackMethod_PutGroupTemplateGroupDetach() {
      ::grpc::Service::MarkMethodRawCallback(8,
          new ::grpc::internal::CallbackUnaryHandler< ::grpc::ByteBuffer, ::grpc::ByteBuffer>(
            [this](
                   ::grpc::CallbackServerContext* context, const ::grpc::ByteBuffer* request, ::grpc::ByteBuffer* response) { return this->PutGroupTemplateGroupDetach(context, request, response); }));
    }
    ~WithRawCallbackMethod_PutGroupTemplateGroupDetach() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable synchronous version of this method
    ::grpc::Status PutGroupTemplateGroupDetach(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::PutGroupTemplateGroupDetachRequest* /*request*/, ::keyapis::access_management::v1::PutGroupTemplateGroupDetachResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    virtual ::grpc::ServerUnaryReactor* PutGroupTemplateGroupDetach(
      ::grpc::CallbackServerContext* /*context*/, const ::grpc::ByteBuffer* /*request*/, ::grpc::ByteBuffer* /*response*/)  { return nullptr; }
  };
  template <class BaseClass>
  class WithStreamedUnaryMethod_GetGroupTemplate : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithStreamedUnaryMethod_GetGroupTemplate() {
      ::grpc::Service::MarkMethodStreamed(0,
        new ::grpc::internal::StreamedUnaryHandler<
          ::keyapis::access_management::v1::GetGroupTemplateRequest, ::keyapis::access_management::v1::GetGroupTemplateResponse>(
            [this](::grpc::ServerContext* context,
                   ::grpc::ServerUnaryStreamer<
                     ::keyapis::access_management::v1::GetGroupTemplateRequest, ::keyapis::access_management::v1::GetGroupTemplateResponse>* streamer) {
                       return this->StreamedGetGroupTemplate(context,
                         streamer);
                  }));
    }
    ~WithStreamedUnaryMethod_GetGroupTemplate() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable regular version of this method
    ::grpc::Status GetGroupTemplate(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::GetGroupTemplateRequest* /*request*/, ::keyapis::access_management::v1::GetGroupTemplateResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    // replace default version of method with streamed unary
    virtual ::grpc::Status StreamedGetGroupTemplate(::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< ::keyapis::access_management::v1::GetGroupTemplateRequest,::keyapis::access_management::v1::GetGroupTemplateResponse>* server_unary_streamer) = 0;
  };
  template <class BaseClass>
  class WithStreamedUnaryMethod_GetGroupTemplateCount : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithStreamedUnaryMethod_GetGroupTemplateCount() {
      ::grpc::Service::MarkMethodStreamed(2,
        new ::grpc::internal::StreamedUnaryHandler<
          ::keyapis::access_management::v1::GetGroupTemplateCountRequest, ::keyapis::access_management::v1::GetGroupTemplateCountResponse>(
            [this](::grpc::ServerContext* context,
                   ::grpc::ServerUnaryStreamer<
                     ::keyapis::access_management::v1::GetGroupTemplateCountRequest, ::keyapis::access_management::v1::GetGroupTemplateCountResponse>* streamer) {
                       return this->StreamedGetGroupTemplateCount(context,
                         streamer);
                  }));
    }
    ~WithStreamedUnaryMethod_GetGroupTemplateCount() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable regular version of this method
    ::grpc::Status GetGroupTemplateCount(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::GetGroupTemplateCountRequest* /*request*/, ::keyapis::access_management::v1::GetGroupTemplateCountResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    // replace default version of method with streamed unary
    virtual ::grpc::Status StreamedGetGroupTemplateCount(::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< ::keyapis::access_management::v1::GetGroupTemplateCountRequest,::keyapis::access_management::v1::GetGroupTemplateCountResponse>* server_unary_streamer) = 0;
  };
  template <class BaseClass>
  class WithStreamedUnaryMethod_PostGroupTemplate : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithStreamedUnaryMethod_PostGroupTemplate() {
      ::grpc::Service::MarkMethodStreamed(3,
        new ::grpc::internal::StreamedUnaryHandler<
          ::keyapis::access_management::v1::PostGroupTemplateRequest, ::keyapis::access_management::v1::PostGroupTemplateResponse>(
            [this](::grpc::ServerContext* context,
                   ::grpc::ServerUnaryStreamer<
                     ::keyapis::access_management::v1::PostGroupTemplateRequest, ::keyapis::access_management::v1::PostGroupTemplateResponse>* streamer) {
                       return this->StreamedPostGroupTemplate(context,
                         streamer);
                  }));
    }
    ~WithStreamedUnaryMethod_PostGroupTemplate() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable regular version of this method
    ::grpc::Status PostGroupTemplate(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::PostGroupTemplateRequest* /*request*/, ::keyapis::access_management::v1::PostGroupTemplateResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    // replace default version of method with streamed unary
    virtual ::grpc::Status StreamedPostGroupTemplate(::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< ::keyapis::access_management::v1::PostGroupTemplateRequest,::keyapis::access_management::v1::PostGroupTemplateResponse>* server_unary_streamer) = 0;
  };
  template <class BaseClass>
  class WithStreamedUnaryMethod_DeleteGroupTemplate : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithStreamedUnaryMethod_DeleteGroupTemplate() {
      ::grpc::Service::MarkMethodStreamed(4,
        new ::grpc::internal::StreamedUnaryHandler<
          ::keyapis::access_management::v1::DeleteGroupTemplateRequest, ::keyapis::access_management::v1::DeleteGroupTemplateResponse>(
            [this](::grpc::ServerContext* context,
                   ::grpc::ServerUnaryStreamer<
                     ::keyapis::access_management::v1::DeleteGroupTemplateRequest, ::keyapis::access_management::v1::DeleteGroupTemplateResponse>* streamer) {
                       return this->StreamedDeleteGroupTemplate(context,
                         streamer);
                  }));
    }
    ~WithStreamedUnaryMethod_DeleteGroupTemplate() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable regular version of this method
    ::grpc::Status DeleteGroupTemplate(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::DeleteGroupTemplateRequest* /*request*/, ::keyapis::access_management::v1::DeleteGroupTemplateResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    // replace default version of method with streamed unary
    virtual ::grpc::Status StreamedDeleteGroupTemplate(::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< ::keyapis::access_management::v1::DeleteGroupTemplateRequest,::keyapis::access_management::v1::DeleteGroupTemplateResponse>* server_unary_streamer) = 0;
  };
  template <class BaseClass>
  class WithStreamedUnaryMethod_GetGroupTemplateGroupCount : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithStreamedUnaryMethod_GetGroupTemplateGroupCount() {
      ::grpc::Service::MarkMethodStreamed(6,
        new ::grpc::internal::StreamedUnaryHandler<
          ::keyapis::access_management::v1::GetGroupTemplateGroupCountRequest, ::keyapis::access_management::v1::GetGroupTemplateGroupCountResponse>(
            [this](::grpc::ServerContext* context,
                   ::grpc::ServerUnaryStreamer<
                     ::keyapis::access_management::v1::GetGroupTemplateGroupCountRequest, ::keyapis::access_management::v1::GetGroupTemplateGroupCountResponse>* streamer) {
                       return this->StreamedGetGroupTemplateGroupCount(context,
                         streamer);
                  }));
    }
    ~WithStreamedUnaryMethod_GetGroupTemplateGroupCount() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable regular version of this method
    ::grpc::Status GetGroupTemplateGroupCount(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::GetGroupTemplateGroupCountRequest* /*request*/, ::keyapis::access_management::v1::GetGroupTemplateGroupCountResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    // replace default version of method with streamed unary
    virtual ::grpc::Status StreamedGetGroupTemplateGroupCount(::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< ::keyapis::access_management::v1::GetGroupTemplateGroupCountRequest,::keyapis::access_management::v1::GetGroupTemplateGroupCountResponse>* server_unary_streamer) = 0;
  };
  template <class BaseClass>
  class WithStreamedUnaryMethod_PutGroupTemplateGroupAttach : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithStreamedUnaryMethod_PutGroupTemplateGroupAttach() {
      ::grpc::Service::MarkMethodStreamed(7,
        new ::grpc::internal::StreamedUnaryHandler<
          ::keyapis::access_management::v1::PutGroupTemplateGroupAttachRequest, ::keyapis::access_management::v1::PutGroupTemplateGroupAttachResponse>(
            [this](::grpc::ServerContext* context,
                   ::grpc::ServerUnaryStreamer<
                     ::keyapis::access_management::v1::PutGroupTemplateGroupAttachRequest, ::keyapis::access_management::v1::PutGroupTemplateGroupAttachResponse>* streamer) {
                       return this->StreamedPutGroupTemplateGroupAttach(context,
                         streamer);
                  }));
    }
    ~WithStreamedUnaryMethod_PutGroupTemplateGroupAttach() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable regular version of this method
    ::grpc::Status PutGroupTemplateGroupAttach(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::PutGroupTemplateGroupAttachRequest* /*request*/, ::keyapis::access_management::v1::PutGroupTemplateGroupAttachResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    // replace default version of method with streamed unary
    virtual ::grpc::Status StreamedPutGroupTemplateGroupAttach(::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< ::keyapis::access_management::v1::PutGroupTemplateGroupAttachRequest,::keyapis::access_management::v1::PutGroupTemplateGroupAttachResponse>* server_unary_streamer) = 0;
  };
  template <class BaseClass>
  class WithStreamedUnaryMethod_PutGroupTemplateGroupDetach : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithStreamedUnaryMethod_PutGroupTemplateGroupDetach() {
      ::grpc::Service::MarkMethodStreamed(8,
        new ::grpc::internal::StreamedUnaryHandler<
          ::keyapis::access_management::v1::PutGroupTemplateGroupDetachRequest, ::keyapis::access_management::v1::PutGroupTemplateGroupDetachResponse>(
            [this](::grpc::ServerContext* context,
                   ::grpc::ServerUnaryStreamer<
                     ::keyapis::access_management::v1::PutGroupTemplateGroupDetachRequest, ::keyapis::access_management::v1::PutGroupTemplateGroupDetachResponse>* streamer) {
                       return this->StreamedPutGroupTemplateGroupDetach(context,
                         streamer);
                  }));
    }
    ~WithStreamedUnaryMethod_PutGroupTemplateGroupDetach() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable regular version of this method
    ::grpc::Status PutGroupTemplateGroupDetach(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::PutGroupTemplateGroupDetachRequest* /*request*/, ::keyapis::access_management::v1::PutGroupTemplateGroupDetachResponse* /*response*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    // replace default version of method with streamed unary
    virtual ::grpc::Status StreamedPutGroupTemplateGroupDetach(::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< ::keyapis::access_management::v1::PutGroupTemplateGroupDetachRequest,::keyapis::access_management::v1::PutGroupTemplateGroupDetachResponse>* server_unary_streamer) = 0;
  };
  typedef WithStreamedUnaryMethod_GetGroupTemplate<WithStreamedUnaryMethod_GetGroupTemplateCount<WithStreamedUnaryMethod_PostGroupTemplate<WithStreamedUnaryMethod_DeleteGroupTemplate<WithStreamedUnaryMethod_GetGroupTemplateGroupCount<WithStreamedUnaryMethod_PutGroupTemplateGroupAttach<WithStreamedUnaryMethod_PutGroupTemplateGroupDetach<Service > > > > > > > StreamedUnaryService;
  template <class BaseClass>
  class WithSplitStreamingMethod_GetGroupTemplateList : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithSplitStreamingMethod_GetGroupTemplateList() {
      ::grpc::Service::MarkMethodStreamed(1,
        new ::grpc::internal::SplitServerStreamingHandler<
          ::keyapis::access_management::v1::GetGroupTemplateListRequest, ::keyapis::access_management::v1::GetGroupTemplateListResponse>(
            [this](::grpc::ServerContext* context,
                   ::grpc::ServerSplitStreamer<
                     ::keyapis::access_management::v1::GetGroupTemplateListRequest, ::keyapis::access_management::v1::GetGroupTemplateListResponse>* streamer) {
                       return this->StreamedGetGroupTemplateList(context,
                         streamer);
                  }));
    }
    ~WithSplitStreamingMethod_GetGroupTemplateList() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable regular version of this method
    ::grpc::Status GetGroupTemplateList(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::GetGroupTemplateListRequest* /*request*/, ::grpc::ServerWriter< ::keyapis::access_management::v1::GetGroupTemplateListResponse>* /*writer*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    // replace default version of method with split streamed
    virtual ::grpc::Status StreamedGetGroupTemplateList(::grpc::ServerContext* context, ::grpc::ServerSplitStreamer< ::keyapis::access_management::v1::GetGroupTemplateListRequest,::keyapis::access_management::v1::GetGroupTemplateListResponse>* server_split_streamer) = 0;
  };
  template <class BaseClass>
  class WithSplitStreamingMethod_GetGroupTemplateGroupList : public BaseClass {
   private:
    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
   public:
    WithSplitStreamingMethod_GetGroupTemplateGroupList() {
      ::grpc::Service::MarkMethodStreamed(5,
        new ::grpc::internal::SplitServerStreamingHandler<
          ::keyapis::access_management::v1::GetGroupTemplateGroupListRequest, ::keyapis::access_management::v1::GetGroupTemplateGroupListResponse>(
            [this](::grpc::ServerContext* context,
                   ::grpc::ServerSplitStreamer<
                     ::keyapis::access_management::v1::GetGroupTemplateGroupListRequest, ::keyapis::access_management::v1::GetGroupTemplateGroupListResponse>* streamer) {
                       return this->StreamedGetGroupTemplateGroupList(context,
                         streamer);
                  }));
    }
    ~WithSplitStreamingMethod_GetGroupTemplateGroupList() override {
      BaseClassMustBeDerivedFromService(this);
    }
    // disable regular version of this method
    ::grpc::Status GetGroupTemplateGroupList(::grpc::ServerContext* /*context*/, const ::keyapis::access_management::v1::GetGroupTemplateGroupListRequest* /*request*/, ::grpc::ServerWriter< ::keyapis::access_management::v1::GetGroupTemplateGroupListResponse>* /*writer*/) override {
      abort();
      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
    }
    // replace default version of method with split streamed
    virtual ::grpc::Status StreamedGetGroupTemplateGroupList(::grpc::ServerContext* context, ::grpc::ServerSplitStreamer< ::keyapis::access_management::v1::GetGroupTemplateGroupListRequest,::keyapis::access_management::v1::GetGroupTemplateGroupListResponse>* server_split_streamer) = 0;
  };
  typedef WithSplitStreamingMethod_GetGroupTemplateList<WithSplitStreamingMethod_GetGroupTemplateGroupList<Service > > SplitStreamedService;
  typedef WithStreamedUnaryMethod_GetGroupTemplate<WithSplitStreamingMethod_GetGroupTemplateList<WithStreamedUnaryMethod_GetGroupTemplateCount<WithStreamedUnaryMethod_PostGroupTemplate<WithStreamedUnaryMethod_DeleteGroupTemplate<WithSplitStreamingMethod_GetGroupTemplateGroupList<WithStreamedUnaryMethod_GetGroupTemplateGroupCount<WithStreamedUnaryMethod_PutGroupTemplateGroupAttach<WithStreamedUnaryMethod_PutGroupTemplateGroupDetach<Service > > > > > > > > > StreamedService;
};

}  // namespace v1
}  // namespace access_management
}  // namespace keyapis


#endif  // GRPC_keyapis_2faccess_5fmanagement_2fv1_2fkeyapis_5faccess_5fmanagement_5ftemplate_5fv1_2eproto__INCLUDED
