functor (GC : Common_types.CoreModuleSig->
  functor (Viewmgr : Common_types.CoreModuleSig->
    functor
      (MakeImpl : functor
                    (Descriptor : sig
                                    type t
                                    val get_value :
                                      Channel_factory.t -> Viewmgr.t
                                    val to_gdesc : Channel_factory.t -> GC.t
                                  end->
                    functor
                      (Group : AutoMakeViewmanagerToGroupInterfaceSig(GC)(Viewmgr)(Descriptor).TSig->
                      sig
                        val create : Proc_info.t -> Viewmgr.t
                        val process_create :
                          Descriptor.t -> Proc_info.t -> unit
                        val process_destroy : Descriptor.t -> unit
                        val process_is_valid : Descriptor.t -> unit
                        val process_join : Descriptor.t -> View.t -> unit
                        val process_leave : Descriptor.t -> unit
                        val process_incoming_message :
                          Descriptor.t -> Proc_info.t -> Iovec.t -> unit
                        val process_cache_reply_missing :
                          Descriptor.t ->
                          (Seqnum.t * (Proc_info.t * Iovec.t)) list list ->
                          unit
                        val process_timer_set : Timer.id -> unit
                        val process_timer_cancelled : Timer.id -> unit
                      end->
      sig
        module ViewmanagerDescriptor :
          sig
            type t = {
              gdesc : GC.t;
              vdesc : Viewmgr.t;
              mutable to_group_regular :
                (GC.t,
                 Channel_factory.AutoMakeViewmangerFromTemplate.ViewmanagerDescriptor.t)
                Request_types.Viewmanager_to_group.message
                Channel_message_store.t;
              mutable to_group_viewchange :
                (GC.t,
                 Channel_factory.AutoMakeViewmangerFromTemplate.ViewmanagerDescriptor.t)
                Request_types.Viewmanager_to_group.message
                Channel_message_store.t;
              mutable to_group_cache :
                (GC.t,
                 Channel_factory.AutoMakeViewmangerFromTemplate.ViewmanagerDescriptor.t)
                Request_types.Viewmanager_to_group.message
                Channel_message_store.t;
            }
            val create :
              GC.t ->
              Viewmgr.t ->
              Channel_factory.AutoMakeViewmangerFromTemplate.ViewmanagerDescriptor.t
            val to_gdesc :
              Channel_factory.AutoMakeViewmangerFromTemplate.ViewmanagerDescriptor.t ->
              GC.t
            val get_value :
              Channel_factory.AutoMakeViewmangerFromTemplate.ViewmanagerDescriptor.t ->
              Viewmgr.t
            val to_string :
              Channel_factory.AutoMakeViewmangerFromTemplate.ViewmanagerDescriptor.t ->
              string
            val hash :
              Channel_factory.AutoMakeViewmangerFromTemplate.ViewmanagerDescriptor.t ->
              int
            val equal :
              Channel_factory.AutoMakeViewmangerFromTemplate.ViewmanagerDescriptor.t ->
              Channel_factory.AutoMakeViewmangerFromTemplate.ViewmanagerDescriptor.t ->
              bool
          end
        type t =
          ViewmanagerDescriptor.t = {
          gdesc : GC.t;
          vdesc : Viewmgr.t;
          mutable to_group_regular :
            (GC.t, t) Request_types.Viewmanager_to_group.message
            Channel_message_store.t;
          mutable to_group_viewchange :
            (GC.t, t) Request_types.Viewmanager_to_group.message
            Channel_message_store.t;
          mutable to_group_cache :
            (GC.t, t) Request_types.Viewmanager_to_group.message
            Channel_message_store.t;
        }
        val create : GC.t -> Viewmgr.t -> t
        val to_gdesc : t -> GC.t
        val get_value : t -> Viewmgr.t
        val to_string : t -> string
        val hash : t -> int
        val equal : t -> t -> bool
        type group = GC.t
        module Request :
          sig
            val sa_send_request :
              ((GC.t, ViewmanagerDescriptor.t)
               Request_types.Viewmanager_to_group.send_request -> unit)
              Sa_var.t
            val sa_receive_request :
              ((ViewmanagerDescriptor.t, GC.t)
               Request_types.Group_to_viewmanager.receive_request -> 
               unit)
              Sa_var.t
            val send_request :
              (GC.t, ViewmanagerDescriptor.t)
              Request_types.Viewmanager_to_group.send_request -> unit
            val receive_request :
              (ViewmanagerDescriptor.t, GC.t)
              Request_types.Group_to_viewmanager.receive_request -> unit
          end
        module Impl :
          sig
            val retrieve_message :
              (GC.t, ViewmanagerDescriptor.t)
              Request_types.Viewmanager_to_group.send_request ->
              (GC.t, ViewmanagerDescriptor.t)
              Request_types.Viewmanager_to_group.message
            val process_message :
              (ViewmanagerDescriptor.t, GC.t)
              Request_types.Group_to_viewmanager.receive_request ->
              (ViewmanagerDescriptor.t, GC.t)
              Request_types.Group_to_viewmanager.message -> unit
          end
        module DescriptorTypes :
          sig
            type seq_dsc
            type viewmgr_dsc = ViewmanagerDescriptor.t
            type transport_dsc
            type group_dsc = GC.t
          end
        module MakeChanSrc :
          functor
            (Config : sig
                        type message
                        type request
                        module Make :
                          functor
                            (ToChannel : sig
                                           type to_chan
                                           type send_req = request
                                           val send_request :
                                             to_chan -> send_req -> unit
                                         end->
                            sig
                              val start : ToChannel.to_chan -> unit
                              val retrieve_message :
                                ToChannel.to_chan -> request -> message
                            end
                      end->
            functor (Types : sig type d_t type c_t end->
              sig
                type group_dsc = DescriptorTypes.group_dsc
                type seq_dsc = DescriptorTypes.seq_dsc
                type viewmgr_dsc = DescriptorTypes.viewmgr_dsc
                type transport_dsc = DescriptorTypes.transport_dsc
                type msg = Config.message
                type req = Config.request
                type s_t = unit
                type d_t = Types.d_t
                type c_t = Types.c_t
                type dsc = s_t * d_t * c_t
                val init : '-> '-> unit lazy_t
                module type ToBoundedChannelSig =
                  sig
                    type to_chan = dsc
                    type send_req = req
                    val send_request : to_chan -> send_req -> unit
                  end
                module Make :
                  functor (ToChannel : ToBoundedChannelSig->
                    sig
                      type src = dsc
                      type m = msg
                      type req = ToChannel.send_req
                      val start : ToChannel.to_chan -> unit
                      val retrieve_message :
                        ToChannel.to_chan -> Config.request -> Config.message
                    end
              end
        module MakeChanDest :
          functor
            (Config : sig
                        type message
                        type request
                        module Make :
                          functor
                            (FromChannel : sig
                                             type from_chan
                                             type receive_req = request
                                             val receive_request :
                                               from_chan ->
                                               receive_req -> unit
                                           end->
                            sig
                              val start : FromChannel.from_chan -> unit
                              val process_message :
                                FromChannel.from_chan ->
                                request -> message -> unit
                            end
                      end->
            functor (Types : sig type s_t type c_t end->
              sig
                type group_dsc = DescriptorTypes.group_dsc
                type seq_dsc = DescriptorTypes.seq_dsc
                type viewmgr_dsc = DescriptorTypes.viewmgr_dsc
                type transport_dsc = DescriptorTypes.transport_dsc
                type msg = Config.message
                type req = Config.request
                type s_t = Types.s_t
                type d_t = unit
                type c_t = Types.c_t
                type dsc = s_t * d_t * c_t
                val init : '-> '-> unit lazy_t
                module type FromBoundedChannelSig =
                  sig
                    type from_chan = dsc
                    type receive_req = req
                    val receive_request : from_chan -> receive_req -> unit
                  end
                module Make :
                  functor (FromChannel : FromBoundedChannelSig->
                    sig
                      type dest = dsc
                      type m = msg
                      type req = FromChannel.receive_req
                      val start : FromChannel.from_chan -> unit
                      val process_message :
                        FromChannel.from_chan ->
                        Config.request -> Config.message -> unit
                    end
              end
        module Chan_to_group :
          functor (Types : sig type d_t type c_t end->
            sig
              type group_dsc = DescriptorTypes.group_dsc
              type seq_dsc = DescriptorTypes.seq_dsc
              type viewmgr_dsc = DescriptorTypes.viewmgr_dsc
              type transport_dsc = DescriptorTypes.transport_dsc
              type msg =
                  (GC.t, ViewmanagerDescriptor.t)
                  Request_types.Viewmanager_to_group.message
              type req =
                  (GC.t, ViewmanagerDescriptor.t)
                  Request_types.Viewmanager_to_group.send_request
              type s_t = unit
              type d_t = Types.d_t
              type c_t = Types.c_t
              type dsc = s_t * d_t * c_t
              val init : '-> '-> unit lazy_t
              module type ToBoundedChannelSig =
                sig
                  type to_chan = dsc
                  type send_req = req
                  val send_request : to_chan -> send_req -> unit
                end
              module Make :
                functor (ToChannel : ToBoundedChannelSig->
                  sig
                    type src = dsc
                    type m = msg
                    type req = ToChannel.send_req
                    val start : ToChannel.to_chan -> unit
                    val retrieve_message :
                      ToChannel.to_chan ->
                      (GC.t, ViewmanagerDescriptor.t)
                      Request_types.Viewmanager_to_group.send_request ->
                      (GC.t, ViewmanagerDescriptor.t)
                      Request_types.Viewmanager_to_group.message
                  end
            end
        module Chan_from_group :
          functor (Types : sig type s_t type c_t end->
            sig
              type group_dsc = DescriptorTypes.group_dsc
              type seq_dsc = DescriptorTypes.seq_dsc
              type viewmgr_dsc = DescriptorTypes.viewmgr_dsc
              type transport_dsc = DescriptorTypes.transport_dsc
              type msg =
                  (ViewmanagerDescriptor.t, GC.t)
                  Request_types.Group_to_viewmanager.message
              type req =
                  (ViewmanagerDescriptor.t, GC.t)
                  Request_types.Group_to_viewmanager.receive_request
              type s_t = Types.s_t
              type d_t = unit
              type c_t = Types.c_t
              type dsc = s_t * d_t * c_t
              val init : '-> '-> unit lazy_t
              module type FromBoundedChannelSig =
                sig
                  type from_chan = dsc
                  type receive_req = req
                  val receive_request : from_chan -> receive_req -> unit
                end
              module Make :
                functor (FromChannel : FromBoundedChannelSig->
                  sig
                    type dest = dsc
                    type m = msg
                    type req = FromChannel.receive_req
                    val start : FromChannel.from_chan -> unit
                    val process_message :
                      FromChannel.from_chan ->
                      (ViewmanagerDescriptor.t, GC.t)
                      Request_types.Group_to_viewmanager.receive_request ->
                      (ViewmanagerDescriptor.t, GC.t)
                      Request_types.Group_to_viewmanager.message -> unit
                  end
            end
      end