Browse code

Update swarmkit to 25572005f

Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>

Tonis Tiigi authored on 2016/06/15 09:07:14
Showing 29 changed files
... ...
@@ -139,7 +139,7 @@ clone git github.com/docker/docker-credential-helpers v0.3.0
139 139
 clone git github.com/docker/containerd 860f3a94940894ac0a106eff4bd1616a67407ee2
140 140
 
141 141
 # cluster
142
-clone git github.com/docker/swarmkit 45094b473cbdb2d45e4d8f703fb615989399ae29
142
+clone git github.com/docker/swarmkit 25572005febb76c2cc5f7e37d878615e6fe330f9
143 143
 clone git github.com/golang/mock bd3c8e81be01eef76d4b503f5e687d2d1354d2d9
144 144
 clone git github.com/gogo/protobuf 43a2e0b1c32252bfbbdf81f7faa7a88fb3fa4028
145 145
 clone git github.com/cloudflare/cfssl 92f037e39eb103fb30f9151be40d9ed267fc4ae2
... ...
@@ -622,15 +622,18 @@ func (n *Node) runManager(ctx context.Context, securityConfig *ca.SecurityConfig
622 622
 
623 623
 			select {
624 624
 			case <-ctx.Done():
625
+				m.Stop(context.Background()) // todo: this should be sync like other components
625 626
 			case <-n.waitRole(ctx, ca.AgentRole):
626 627
 			}
627 628
 
628
-			m.Stop(context.Background()) // todo: this should be sync like other components
629 629
 			<-done
630 630
 
631 631
 			ready = nil // ready event happens once, even on multiple starts
632 632
 			n.Lock()
633 633
 			n.manager = nil
634
+			if n.conn != nil {
635
+				n.conn.Close()
636
+			}
634 637
 			n.Unlock()
635 638
 
636 639
 			if ctx.Err() != nil {
... ...
@@ -349,20 +349,13 @@ func (m *ListNetworksResponse) Reset()                    { *m = ListNetworksRes
349 349
 func (*ListNetworksResponse) ProtoMessage()               {}
350 350
 func (*ListNetworksResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{31} }
351 351
 
352
-type RemoveManagerResponse struct {
353
-}
354
-
355
-func (m *RemoveManagerResponse) Reset()                    { *m = RemoveManagerResponse{} }
356
-func (*RemoveManagerResponse) ProtoMessage()               {}
357
-func (*RemoveManagerResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{32} }
358
-
359 352
 type GetClusterRequest struct {
360 353
 	ClusterID string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"`
361 354
 }
362 355
 
363 356
 func (m *GetClusterRequest) Reset()                    { *m = GetClusterRequest{} }
364 357
 func (*GetClusterRequest) ProtoMessage()               {}
365
-func (*GetClusterRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{33} }
358
+func (*GetClusterRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{32} }
366 359
 
367 360
 type GetClusterResponse struct {
368 361
 	Cluster *Cluster `protobuf:"bytes,1,opt,name=cluster" json:"cluster,omitempty"`
... ...
@@ -370,7 +363,7 @@ type GetClusterResponse struct {
370 370
 
371 371
 func (m *GetClusterResponse) Reset()                    { *m = GetClusterResponse{} }
372 372
 func (*GetClusterResponse) ProtoMessage()               {}
373
-func (*GetClusterResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{34} }
373
+func (*GetClusterResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{33} }
374 374
 
375 375
 type ListClustersRequest struct {
376 376
 	Filters *ListClustersRequest_Filters `protobuf:"bytes,1,opt,name=filters" json:"filters,omitempty"`
... ...
@@ -378,7 +371,7 @@ type ListClustersRequest struct {
378 378
 
379 379
 func (m *ListClustersRequest) Reset()                    { *m = ListClustersRequest{} }
380 380
 func (*ListClustersRequest) ProtoMessage()               {}
381
-func (*ListClustersRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{35} }
381
+func (*ListClustersRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{34} }
382 382
 
383 383
 type ListClustersRequest_Filters struct {
384 384
 	Names      []string          `protobuf:"bytes,1,rep,name=names" json:"names,omitempty"`
... ...
@@ -389,7 +382,7 @@ type ListClustersRequest_Filters struct {
389 389
 func (m *ListClustersRequest_Filters) Reset()      { *m = ListClustersRequest_Filters{} }
390 390
 func (*ListClustersRequest_Filters) ProtoMessage() {}
391 391
 func (*ListClustersRequest_Filters) Descriptor() ([]byte, []int) {
392
-	return fileDescriptorControl, []int{35, 0}
392
+	return fileDescriptorControl, []int{34, 0}
393 393
 }
394 394
 
395 395
 type ListClustersResponse struct {
... ...
@@ -398,7 +391,7 @@ type ListClustersResponse struct {
398 398
 
399 399
 func (m *ListClustersResponse) Reset()                    { *m = ListClustersResponse{} }
400 400
 func (*ListClustersResponse) ProtoMessage()               {}
401
-func (*ListClustersResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{36} }
401
+func (*ListClustersResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{35} }
402 402
 
403 403
 type UpdateClusterRequest struct {
404 404
 	// ClusterID is the cluster ID to update.
... ...
@@ -411,7 +404,7 @@ type UpdateClusterRequest struct {
411 411
 
412 412
 func (m *UpdateClusterRequest) Reset()                    { *m = UpdateClusterRequest{} }
413 413
 func (*UpdateClusterRequest) ProtoMessage()               {}
414
-func (*UpdateClusterRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{37} }
414
+func (*UpdateClusterRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{36} }
415 415
 
416 416
 type UpdateClusterResponse struct {
417 417
 	Cluster *Cluster `protobuf:"bytes,1,opt,name=cluster" json:"cluster,omitempty"`
... ...
@@ -419,7 +412,7 @@ type UpdateClusterResponse struct {
419 419
 
420 420
 func (m *UpdateClusterResponse) Reset()                    { *m = UpdateClusterResponse{} }
421 421
 func (*UpdateClusterResponse) ProtoMessage()               {}
422
-func (*UpdateClusterResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{38} }
422
+func (*UpdateClusterResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{37} }
423 423
 
424 424
 func init() {
425 425
 	proto.RegisterType((*GetNodeRequest)(nil), "docker.swarmkit.v1.GetNodeRequest")
... ...
@@ -458,7 +451,6 @@ func init() {
458 458
 	proto.RegisterType((*ListNetworksRequest)(nil), "docker.swarmkit.v1.ListNetworksRequest")
459 459
 	proto.RegisterType((*ListNetworksRequest_Filters)(nil), "docker.swarmkit.v1.ListNetworksRequest.Filters")
460 460
 	proto.RegisterType((*ListNetworksResponse)(nil), "docker.swarmkit.v1.ListNetworksResponse")
461
-	proto.RegisterType((*RemoveManagerResponse)(nil), "docker.swarmkit.v1.RemoveManagerResponse")
462 461
 	proto.RegisterType((*GetClusterRequest)(nil), "docker.swarmkit.v1.GetClusterRequest")
463 462
 	proto.RegisterType((*GetClusterResponse)(nil), "docker.swarmkit.v1.GetClusterResponse")
464 463
 	proto.RegisterType((*ListClustersRequest)(nil), "docker.swarmkit.v1.ListClustersRequest")
... ...
@@ -1193,16 +1185,6 @@ func (m *ListNetworksResponse) Copy() *ListNetworksResponse {
1193 1193
 	return o
1194 1194
 }
1195 1195
 
1196
-func (m *RemoveManagerResponse) Copy() *RemoveManagerResponse {
1197
-	if m == nil {
1198
-		return nil
1199
-	}
1200
-
1201
-	o := &RemoveManagerResponse{}
1202
-
1203
-	return o
1204
-}
1205
-
1206 1196
 func (m *GetClusterRequest) Copy() *GetClusterRequest {
1207 1197
 	if m == nil {
1208 1198
 		return nil
... ...
@@ -1780,15 +1762,6 @@ func (this *ListNetworksResponse) GoString() string {
1780 1780
 	s = append(s, "}")
1781 1781
 	return strings.Join(s, "")
1782 1782
 }
1783
-func (this *RemoveManagerResponse) GoString() string {
1784
-	if this == nil {
1785
-		return "nil"
1786
-	}
1787
-	s := make([]string, 0, 4)
1788
-	s = append(s, "&api.RemoveManagerResponse{")
1789
-	s = append(s, "}")
1790
-	return strings.Join(s, "")
1791
-}
1792 1783
 func (this *GetClusterRequest) GoString() string {
1793 1784
 	if this == nil {
1794 1785
 		return "nil"
... ...
@@ -3765,24 +3738,6 @@ func (m *ListNetworksResponse) MarshalTo(data []byte) (int, error) {
3765 3765
 	return i, nil
3766 3766
 }
3767 3767
 
3768
-func (m *RemoveManagerResponse) Marshal() (data []byte, err error) {
3769
-	size := m.Size()
3770
-	data = make([]byte, size)
3771
-	n, err := m.MarshalTo(data)
3772
-	if err != nil {
3773
-		return nil, err
3774
-	}
3775
-	return data[:n], nil
3776
-}
3777
-
3778
-func (m *RemoveManagerResponse) MarshalTo(data []byte) (int, error) {
3779
-	var i int
3780
-	_ = i
3781
-	var l int
3782
-	_ = l
3783
-	return i, nil
3784
-}
3785
-
3786 3768
 func (m *GetClusterRequest) Marshal() (data []byte, err error) {
3787 3769
 	size := m.Size()
3788 3770
 	data = make([]byte, size)
... ...
@@ -4874,12 +4829,6 @@ func (m *ListNetworksResponse) Size() (n int) {
4874 4874
 	return n
4875 4875
 }
4876 4876
 
4877
-func (m *RemoveManagerResponse) Size() (n int) {
4878
-	var l int
4879
-	_ = l
4880
-	return n
4881
-}
4882
-
4883 4877
 func (m *GetClusterRequest) Size() (n int) {
4884 4878
 	var l int
4885 4879
 	_ = l
... ...
@@ -5404,15 +5353,6 @@ func (this *ListNetworksResponse) String() string {
5404 5404
 	}, "")
5405 5405
 	return s
5406 5406
 }
5407
-func (this *RemoveManagerResponse) String() string {
5408
-	if this == nil {
5409
-		return "nil"
5410
-	}
5411
-	s := strings.Join([]string{`&RemoveManagerResponse{`,
5412
-		`}`,
5413
-	}, "")
5414
-	return s
5415
-}
5416 5407
 func (this *GetClusterRequest) String() string {
5417 5408
 	if this == nil {
5418 5409
 		return "nil"
... ...
@@ -9165,56 +9105,6 @@ func (m *ListNetworksResponse) Unmarshal(data []byte) error {
9165 9165
 	}
9166 9166
 	return nil
9167 9167
 }
9168
-func (m *RemoveManagerResponse) Unmarshal(data []byte) error {
9169
-	l := len(data)
9170
-	iNdEx := 0
9171
-	for iNdEx < l {
9172
-		preIndex := iNdEx
9173
-		var wire uint64
9174
-		for shift := uint(0); ; shift += 7 {
9175
-			if shift >= 64 {
9176
-				return ErrIntOverflowControl
9177
-			}
9178
-			if iNdEx >= l {
9179
-				return io.ErrUnexpectedEOF
9180
-			}
9181
-			b := data[iNdEx]
9182
-			iNdEx++
9183
-			wire |= (uint64(b) & 0x7F) << shift
9184
-			if b < 0x80 {
9185
-				break
9186
-			}
9187
-		}
9188
-		fieldNum := int32(wire >> 3)
9189
-		wireType := int(wire & 0x7)
9190
-		if wireType == 4 {
9191
-			return fmt.Errorf("proto: RemoveManagerResponse: wiretype end group for non-group")
9192
-		}
9193
-		if fieldNum <= 0 {
9194
-			return fmt.Errorf("proto: RemoveManagerResponse: illegal tag %d (wire type %d)", fieldNum, wire)
9195
-		}
9196
-		switch fieldNum {
9197
-		default:
9198
-			iNdEx = preIndex
9199
-			skippy, err := skipControl(data[iNdEx:])
9200
-			if err != nil {
9201
-				return err
9202
-			}
9203
-			if skippy < 0 {
9204
-				return ErrInvalidLengthControl
9205
-			}
9206
-			if (iNdEx + skippy) > l {
9207
-				return io.ErrUnexpectedEOF
9208
-			}
9209
-			iNdEx += skippy
9210
-		}
9211
-	}
9212
-
9213
-	if iNdEx > l {
9214
-		return io.ErrUnexpectedEOF
9215
-	}
9216
-	return nil
9217
-}
9218 9168
 func (m *GetClusterRequest) Unmarshal(data []byte) error {
9219 9169
 	l := len(data)
9220 9170
 	iNdEx := 0
... ...
@@ -10094,92 +9984,92 @@ var (
10094 10094
 )
10095 10095
 
10096 10096
 var fileDescriptorControl = []byte{
10097
-	// 1391 bytes of a gzipped FileDescriptorProto
10098
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xcc, 0x59, 0x4f, 0x6f, 0x1b, 0x45,
10099
-	0x14, 0xc7, 0x4e, 0x1b, 0xd7, 0xcf, 0x75, 0xd2, 0x4c, 0x1d, 0x11, 0xb9, 0x21, 0x45, 0x5b, 0x48,
10100
-	0x13, 0x29, 0x38, 0xe0, 0xa8, 0x22, 0x80, 0x04, 0x22, 0x09, 0x45, 0x16, 0x6d, 0xa8, 0x36, 0x14,
10101
-	0x71, 0x8b, 0x1c, 0x7b, 0x1a, 0x96, 0xd8, 0x5e, 0xb3, 0xbb, 0x49, 0x1b, 0x71, 0xe1, 0x63, 0xf0,
10102
-	0x19, 0x38, 0x70, 0xe7, 0xc4, 0x81, 0x4b, 0xc5, 0x89, 0x0b, 0x12, 0x48, 0x08, 0xb5, 0xfd, 0x00,
10103
-	0x88, 0x0f, 0xc0, 0x81, 0x99, 0x9d, 0x37, 0xbb, 0xeb, 0xf1, 0xec, 0xac, 0x1d, 0xa7, 0xa2, 0x07,
10104
-	0xab, 0xde, 0xd9, 0xdf, 0xfb, 0x37, 0xef, 0xf7, 0x5e, 0xde, 0x73, 0xa1, 0xdc, 0x72, 0x7b, 0x81,
10105
-	0xe7, 0x76, 0x6a, 0x7d, 0xcf, 0x0d, 0x5c, 0x42, 0xda, 0x6e, 0xeb, 0x88, 0x7a, 0x35, 0xff, 0x61,
10106
-	0xd3, 0xeb, 0x1e, 0x39, 0x41, 0xed, 0xe4, 0xad, 0x6a, 0xc9, 0xef, 0xd3, 0x96, 0x2f, 0x00, 0xd5,
10107
-	0xb2, 0x7b, 0xf0, 0x15, 0x6d, 0x05, 0xf2, 0xb1, 0x14, 0x9c, 0xf6, 0xa9, 0x7c, 0xa8, 0x1c, 0xba,
10108
-	0x87, 0x6e, 0xf8, 0x75, 0x9d, 0x7f, 0xc3, 0xd3, 0xab, 0xfd, 0xce, 0xf1, 0xa1, 0xd3, 0x5b, 0x17,
10109
-	0xff, 0x88, 0x43, 0xeb, 0x16, 0xcc, 0x7c, 0x4c, 0x83, 0x5d, 0xb7, 0x4d, 0x6d, 0xfa, 0xf5, 0x31,
10110
-	0xf5, 0x03, 0x72, 0x03, 0x0a, 0x3d, 0xf6, 0xb8, 0xef, 0xb4, 0x17, 0x72, 0xaf, 0xe6, 0x56, 0x8a,
10111
-	0x5b, 0xf0, 0xec, 0xaf, 0xeb, 0xd3, 0x1c, 0xd1, 0xd8, 0xb1, 0xa7, 0xf9, 0xab, 0x46, 0xdb, 0xfa,
10112
-	0x00, 0x66, 0x23, 0x31, 0xbf, 0xef, 0xf6, 0x7c, 0x4a, 0xd6, 0xe0, 0x02, 0x7f, 0x19, 0x0a, 0x95,
10113
-	0xea, 0x0b, 0xb5, 0xe1, 0x00, 0x6a, 0x21, 0x3e, 0x44, 0x59, 0x3f, 0x4e, 0xc1, 0x95, 0x3b, 0x8e,
10114
-	0x1f, 0xaa, 0xf0, 0xa5, 0xe9, 0xdb, 0x50, 0x78, 0xe0, 0x74, 0x02, 0xea, 0xf9, 0xa8, 0x65, 0x4d,
10115
-	0xa7, 0x45, 0x15, 0xab, 0xdd, 0x16, 0x32, 0xb6, 0x14, 0xae, 0xfe, 0x99, 0x87, 0x02, 0x1e, 0x92,
10116
-	0x0a, 0x5c, 0xec, 0x35, 0xbb, 0x94, 0x6b, 0x9c, 0x5a, 0x29, 0xda, 0xe2, 0x81, 0xac, 0x43, 0xc9,
10117
-	0x69, 0xef, 0xf7, 0x3d, 0xfa, 0xc0, 0x79, 0xc4, 0xde, 0xe5, 0xf9, 0xbb, 0xad, 0x19, 0x16, 0x28,
10118
-	0x34, 0x76, 0xee, 0xe1, 0xa9, 0x0d, 0x4e, 0x5b, 0x7e, 0x27, 0xf7, 0x60, 0xba, 0xd3, 0x3c, 0xa0,
10119
-	0x1d, 0x7f, 0x61, 0x8a, 0x61, 0x4b, 0xf5, 0xcd, 0x71, 0x3c, 0xab, 0xdd, 0x09, 0x45, 0x3f, 0x62,
10120
-	0x09, 0x3e, 0xb5, 0x51, 0x0f, 0x69, 0x40, 0xa9, 0x4b, 0xbb, 0x07, 0xec, 0xf5, 0x97, 0x4e, 0xdf,
10121
-	0x5f, 0xb8, 0xc0, 0xd4, 0xce, 0xd4, 0x6f, 0xa6, 0x5d, 0xdb, 0x1e, 0x4b, 0x7d, 0xed, 0x6e, 0x84,
10122
-	0xb7, 0x93, 0xb2, 0xa4, 0x0e, 0x17, 0x19, 0x73, 0x58, 0x1c, 0x17, 0x43, 0x25, 0x8b, 0xa9, 0x77,
10123
-	0xcf, 0x40, 0xb6, 0x80, 0x56, 0xdf, 0x81, 0x52, 0xc2, 0x2b, 0x72, 0x05, 0xa6, 0x8e, 0xe8, 0xa9,
10124
-	0xc8, 0xb8, 0xcd, 0xbf, 0xf2, 0x8b, 0x3b, 0x69, 0x76, 0x8e, 0x29, 0xbb, 0x1c, 0x7e, 0x26, 0x1e,
10125
-	0xde, 0xcd, 0x6f, 0xe6, 0xac, 0x6d, 0x98, 0x4b, 0x44, 0x8a, 0xe9, 0xaf, 0xb1, 0x7b, 0xe6, 0x07,
10126
-	0xe1, 0x3d, 0x9b, 0xf2, 0x2f, 0x60, 0xd6, 0xf7, 0x39, 0x98, 0xbb, 0xdf, 0x6f, 0x37, 0x03, 0x3a,
10127
-	0x2e, 0xf9, 0xc8, 0xfb, 0x70, 0x39, 0x04, 0x9d, 0xb0, 0xf8, 0x1d, 0xb7, 0x17, 0x3a, 0x58, 0xaa,
10128
-	0x5f, 0xd3, 0x59, 0xfc, 0x5c, 0x40, 0xec, 0x12, 0x17, 0xc0, 0x07, 0xf2, 0x26, 0x5c, 0xe0, 0x95,
10129
-	0xc4, 0x32, 0xc9, 0xe5, 0x16, 0x4d, 0x57, 0x6e, 0x87, 0x48, 0x6b, 0x0b, 0x48, 0xd2, 0xd7, 0x33,
10130
-	0x31, 0x7e, 0x13, 0xe6, 0x6c, 0xda, 0x75, 0x4f, 0xc6, 0x8e, 0xd7, 0xaa, 0x00, 0x49, 0x4a, 0x0a,
10131
-	0xeb, 0x58, 0xb9, 0x9f, 0x35, 0xfd, 0xa3, 0x84, 0xb2, 0x80, 0x3d, 0x2a, 0xca, 0x38, 0x82, 0x2b,
10132
-	0xe3, 0xaf, 0xa2, 0xca, 0x15, 0x62, 0x71, 0x1c, 0xfc, 0xa5, 0x29, 0x8e, 0x10, 0x1f, 0xa2, 0xe2,
10133
-	0x38, 0xc6, 0x36, 0x1d, 0xc5, 0x91, 0xb4, 0x6e, 0xfd, 0x81, 0x9d, 0x80, 0x1f, 0x9e, 0xa1, 0x13,
10134
-	0x24, 0xc5, 0x86, 0x3b, 0xc1, 0xbf, 0xff, 0x63, 0x27, 0xd0, 0x79, 0xa6, 0xed, 0x04, 0xcc, 0x05,
10135
-	0x9f, 0x7a, 0x27, 0x4e, 0x8b, 0xf3, 0x40, 0x74, 0x02, 0x74, 0x61, 0x4f, 0x1c, 0x37, 0x76, 0x98,
10136
-	0x0b, 0x08, 0x69, 0xb4, 0x7d, 0xb2, 0x0c, 0x97, 0x90, 0x35, 0xa2, 0xe4, 0x8b, 0x5b, 0x25, 0x86,
10137
-	0x2e, 0x08, 0xda, 0xb0, 0xe8, 0x05, 0x6f, 0x7c, 0xb2, 0x03, 0x33, 0xac, 0xd4, 0x1c, 0x8f, 0xb6,
10138
-	0xf7, 0xfd, 0x80, 0xb1, 0xd7, 0x5f, 0x98, 0x0e, 0x1b, 0xc4, 0x2b, 0x69, 0x29, 0xde, 0xe3, 0x28,
10139
-	0xbb, 0x8c, 0x42, 0xe1, 0xd3, 0x79, 0x74, 0x0a, 0xbc, 0x89, 0xb8, 0x53, 0x70, 0x42, 0x18, 0x3b,
10140
-	0x45, 0xc8, 0x10, 0x01, 0xb3, 0x3e, 0x81, 0xca, 0xb6, 0x47, 0x99, 0x2b, 0x78, 0x1b, 0x92, 0x23,
10141
-	0x1b, 0x58, 0xc6, 0x82, 0x20, 0xd7, 0x75, 0x6a, 0x50, 0x22, 0x51, 0xc9, 0xbb, 0x30, 0xaf, 0x28,
10142
-	0x43, 0xaf, 0x6e, 0x41, 0x01, 0x6f, 0x18, 0x15, 0x5e, 0x33, 0x28, 0xb4, 0x25, 0xd6, 0xfa, 0x10,
10143
-	0xe6, 0x58, 0x39, 0x29, 0x9e, 0xad, 0x01, 0xc4, 0x09, 0xc5, 0x82, 0x28, 0xb3, 0x0c, 0x15, 0xa3,
10144
-	0x7c, 0xda, 0xc5, 0x28, 0x9d, 0x2c, 0x3e, 0x92, 0x54, 0x31, 0x99, 0x3f, 0x3f, 0xe5, 0xa0, 0x22,
10145
-	0x5a, 0xd5, 0x24, 0x3e, 0x31, 0xe6, 0xcc, 0x4a, 0xf4, 0x18, 0x5d, 0x76, 0x06, 0x65, 0x64, 0xa3,
10146
-	0xdd, 0x18, 0x68, 0xb4, 0xa3, 0x67, 0x48, 0x09, 0x60, 0xb2, 0x1b, 0xd9, 0x81, 0x8a, 0xe8, 0x3a,
10147
-	0x13, 0x25, 0xe9, 0x65, 0x98, 0x57, 0xb4, 0x60, 0xfb, 0xfa, 0x39, 0x0f, 0x57, 0x39, 0xc7, 0xf1,
10148
-	0x3c, 0xea, 0x60, 0x0d, 0xb5, 0x83, 0xad, 0xa7, 0xf5, 0x09, 0x45, 0x72, 0xb8, 0x89, 0x3d, 0xc9,
10149
-	0x9d, 0x7b, 0x13, 0xdb, 0x53, 0x9a, 0xd8, 0x7b, 0x63, 0x3a, 0xa7, 0xeb, 0x63, 0x93, 0x34, 0x8a,
10150
-	0x4f, 0xa1, 0x32, 0x68, 0x0d, 0x73, 0xfe, 0x36, 0x5c, 0xc2, 0x1c, 0xc8, 0x76, 0x61, 0x4c, 0x7a,
10151
-	0x04, 0x8e, 0x9b, 0xc6, 0x2e, 0x0d, 0x1e, 0xba, 0xde, 0xd1, 0x18, 0x4d, 0x03, 0x25, 0x74, 0x4d,
10152
-	0x23, 0x52, 0x16, 0x53, 0xb2, 0x27, 0x8e, 0x4c, 0x94, 0x94, 0x52, 0x12, 0x6b, 0xdd, 0x0f, 0x9b,
10153
-	0x86, 0xe2, 0x19, 0x61, 0xd3, 0x04, 0x4b, 0x26, 0xde, 0x57, 0xf8, 0x9d, 0x73, 0x14, 0x65, 0x38,
10154
-	0x47, 0xf3, 0x31, 0x47, 0x51, 0x96, 0x73, 0x14, 0x01, 0x51, 0x23, 0x39, 0x27, 0x1f, 0xbf, 0x90,
10155
-	0x65, 0x73, 0xee, 0x6e, 0x46, 0xa5, 0xa4, 0x78, 0x1a, 0x95, 0x12, 0x9e, 0x9f, 0xa1, 0x94, 0x14,
10156
-	0xc9, 0x17, 0xab, 0x94, 0x52, 0x9c, 0x7b, 0x4e, 0xa5, 0x14, 0x5b, 0x8b, 0x4b, 0x09, 0x73, 0x60,
10157
-	0x2c, 0x25, 0x99, 0x94, 0x08, 0x1c, 0xe7, 0xeb, 0x6e, 0xb3, 0xd7, 0x3c, 0xa4, 0x5e, 0x94, 0x2f,
10158
-	0xf1, 0xb7, 0x6f, 0xbb, 0x73, 0xec, 0x07, 0xfc, 0x34, 0x6a, 0xab, 0x2d, 0x71, 0xa2, 0xb4, 0x55,
10159
-	0xc4, 0x71, 0x2e, 0x20, 0x20, 0xa2, 0x6c, 0xa4, 0x22, 0xa6, 0x2c, 0x42, 0x4c, 0x94, 0x95, 0x52,
10160
-	0x12, 0x1b, 0xf1, 0x07, 0x5f, 0x9c, 0x81, 0x3f, 0x8a, 0xe4, 0x8b, 0xc5, 0x9f, 0x14, 0xe7, 0x9e,
10161
-	0x13, 0x7f, 0x62, 0x6b, 0x31, 0x7f, 0xf0, 0xa2, 0x8d, 0xfc, 0x91, 0x59, 0x89, 0xc0, 0x89, 0x91,
10162
-	0x64, 0x12, 0xaa, 0xf0, 0x91, 0x44, 0xa2, 0xc7, 0x19, 0x49, 0x50, 0x66, 0x8c, 0x91, 0x04, 0xad,
10163
-	0xeb, 0x46, 0x92, 0xf3, 0x21, 0x6a, 0xfd, 0xb7, 0x39, 0x28, 0x6c, 0x8b, 0x9f, 0x7b, 0x88, 0x03,
10164
-	0x05, 0xfc, 0x25, 0x85, 0x58, 0x3a, 0xe1, 0xc1, 0x5f, 0x67, 0xaa, 0x37, 0x8c, 0x18, 0x2c, 0xcc,
10165
-	0xf9, 0x5f, 0x7e, 0xf8, 0xfb, 0xbb, 0xfc, 0x2c, 0x94, 0x43, 0xd0, 0x1b, 0x5d, 0x51, 0xb7, 0xc4,
10166
-	0x85, 0x62, 0xb4, 0xb7, 0x93, 0xd7, 0x46, 0xf9, 0x01, 0xa3, 0xfa, 0x7a, 0x06, 0xca, 0x6c, 0xd0,
10167
-	0x03, 0x88, 0xd7, 0x66, 0xa2, 0xd5, 0x35, 0xf4, 0x13, 0x40, 0x75, 0x39, 0x0b, 0x96, 0x69, 0x33,
10168
-	0x5e, 0x96, 0xf5, 0x36, 0x87, 0xd6, 0x70, 0xbd, 0x4d, 0xcd, 0xce, 0x9d, 0x62, 0x53, 0xe4, 0x90,
10169
-	0xef, 0x2c, 0xa9, 0x39, 0x4c, 0x2c, 0xcb, 0xa9, 0x39, 0x1c, 0x58, 0x8b, 0xcd, 0x39, 0x0c, 0x37,
10170
-	0xaa, 0xf4, 0x1c, 0x26, 0x57, 0xcf, 0xf4, 0x1c, 0x0e, 0xac, 0x65, 0x99, 0xf7, 0x19, 0x86, 0x67,
10171
-	0xb8, 0xcf, 0x64, 0x84, 0xcb, 0x59, 0xb0, 0x4c, 0x9b, 0xf1, 0x46, 0xa4, 0xb7, 0x39, 0xb4, 0x74,
10172
-	0xe9, 0x6d, 0x0e, 0x2f, 0x56, 0x69, 0x36, 0x1f, 0xc1, 0xe5, 0xe4, 0x04, 0x4a, 0x6e, 0x8e, 0x38,
10173
-	0x11, 0x57, 0x57, 0xb2, 0x81, 0x66, 0xcb, 0xdf, 0x40, 0x79, 0x60, 0x25, 0x25, 0x5a, 0x8d, 0xba,
10174
-	0x15, 0xb8, 0xba, 0x3a, 0x02, 0x32, 0xd3, 0xf8, 0xc0, 0xb6, 0xa5, 0x37, 0xae, 0xdb, 0x28, 0xf5,
10175
-	0xc6, 0xb5, 0xab, 0x9b, 0xc1, 0xf8, 0xc0, 0x52, 0xa5, 0x37, 0xae, 0xdb, 0xde, 0xf4, 0xc6, 0xf5,
10176
-	0x1b, 0x9a, 0x91, 0x64, 0x38, 0xee, 0xa4, 0x92, 0x6c, 0x70, 0xfa, 0x4d, 0x25, 0x99, 0x3a, 0xca,
10177
-	0x9a, 0x49, 0x26, 0x67, 0xb3, 0x74, 0x92, 0x29, 0xb3, 0x62, 0x3a, 0xc9, 0xd4, 0x31, 0x2f, 0x93,
10178
-	0x64, 0x32, 0x60, 0x03, 0xc9, 0x94, 0x98, 0x57, 0x47, 0x40, 0x8e, 0x98, 0x67, 0xa3, 0x71, 0xdd,
10179
-	0xba, 0x61, 0xca, 0xf3, 0x88, 0xc6, 0x45, 0x9e, 0xf1, 0x6f, 0x70, 0x6a, 0x9e, 0x07, 0x47, 0x93,
10180
-	0xd4, 0x3c, 0x2b, 0x03, 0x40, 0x46, 0x9e, 0xe5, 0x0c, 0x95, 0x9e, 0x67, 0x65, 0xa6, 0x4b, 0xcf,
10181
-	0xb3, 0x3a, 0x8e, 0x65, 0xd6, 0xb3, 0x0c, 0xd8, 0x50, 0xcf, 0x4a, 0xcc, 0xab, 0x23, 0x20, 0x8d,
10182
-	0xc6, 0xb7, 0x16, 0x1f, 0x3f, 0x5d, 0x7a, 0xe9, 0x77, 0xf6, 0xf9, 0xe7, 0xe9, 0x52, 0xee, 0xdb,
10183
-	0x67, 0x4b, 0xb9, 0xc7, 0xec, 0xf3, 0x2b, 0xfb, 0x3c, 0x61, 0x9f, 0x83, 0xe9, 0xf0, 0x7f, 0x9c,
10184
-	0x36, 0xfe, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x43, 0x84, 0x5f, 0x00, 0xea, 0x1a, 0x00, 0x00,
10097
+	// 1384 bytes of a gzipped FileDescriptorProto
10098
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xcc, 0x59, 0xcf, 0x6f, 0x1b, 0xc5,
10099
+	0x17, 0xff, 0xda, 0x69, 0xe2, 0xfa, 0xb9, 0x4e, 0x9a, 0xa9, 0xa3, 0x6f, 0xe4, 0x86, 0x14, 0x6d,
10100
+	0x21, 0x4d, 0xa4, 0xe0, 0x80, 0xa3, 0x8a, 0x00, 0x12, 0x88, 0x24, 0x14, 0x59, 0x94, 0x50, 0x6d,
10101
+	0x28, 0xe2, 0x16, 0x39, 0xf6, 0x34, 0x2c, 0xb1, 0xbd, 0x66, 0x77, 0x93, 0x36, 0xe2, 0xc2, 0x9f,
10102
+	0xc1, 0xdf, 0xc0, 0x81, 0x3b, 0x27, 0x0e, 0x5c, 0x2a, 0x4e, 0x5c, 0x90, 0x40, 0x42, 0xa8, 0xed,
10103
+	0x1f, 0x80, 0xf8, 0x03, 0x38, 0x30, 0xb3, 0xf3, 0x66, 0x77, 0x3d, 0x9e, 0x9d, 0xb5, 0xe3, 0x54,
10104
+	0xf4, 0x60, 0xd5, 0x3b, 0xfb, 0x79, 0xbf, 0xe6, 0x7d, 0xde, 0xcb, 0x7b, 0x2e, 0x94, 0x5b, 0x6e,
10105
+	0x2f, 0xf0, 0xdc, 0x4e, 0xad, 0xef, 0xb9, 0x81, 0x4b, 0x48, 0xdb, 0x6d, 0x1d, 0x53, 0xaf, 0xe6,
10106
+	0x3f, 0x6c, 0x7a, 0xdd, 0x63, 0x27, 0xa8, 0x9d, 0xbe, 0x51, 0x2d, 0xf9, 0x7d, 0xda, 0xf2, 0x05,
10107
+	0xa0, 0x5a, 0x76, 0x0f, 0xbf, 0xa4, 0xad, 0x40, 0x3e, 0x96, 0x82, 0xb3, 0x3e, 0x95, 0x0f, 0x95,
10108
+	0x23, 0xf7, 0xc8, 0x0d, 0xbf, 0x6e, 0xf0, 0x6f, 0x78, 0x7a, 0xad, 0xdf, 0x39, 0x39, 0x72, 0x7a,
10109
+	0x1b, 0xe2, 0x1f, 0x71, 0x68, 0xdd, 0x86, 0xd9, 0x0f, 0x69, 0xb0, 0xe7, 0xb6, 0xa9, 0x4d, 0xbf,
10110
+	0x3a, 0xa1, 0x7e, 0x40, 0x6e, 0x42, 0xa1, 0xc7, 0x1e, 0x0f, 0x9c, 0xf6, 0x62, 0xee, 0xe5, 0xdc,
10111
+	0x6a, 0x71, 0x1b, 0x9e, 0xfd, 0x79, 0x63, 0x86, 0x23, 0x1a, 0xbb, 0xf6, 0x0c, 0x7f, 0xd5, 0x68,
10112
+	0x5b, 0xef, 0xc1, 0x5c, 0x24, 0xe6, 0xf7, 0xdd, 0x9e, 0x4f, 0xc9, 0x3a, 0x5c, 0xe2, 0x2f, 0x43,
10113
+	0xa1, 0x52, 0x7d, 0xb1, 0x36, 0x1c, 0x40, 0x2d, 0xc4, 0x87, 0x28, 0xeb, 0x87, 0x29, 0xb8, 0x7a,
10114
+	0xd7, 0xf1, 0x43, 0x15, 0xbe, 0x34, 0x7d, 0x07, 0x0a, 0x0f, 0x9c, 0x4e, 0x40, 0x3d, 0x1f, 0xb5,
10115
+	0xac, 0xeb, 0xb4, 0xa8, 0x62, 0xb5, 0x3b, 0x42, 0xc6, 0x96, 0xc2, 0xd5, 0x3f, 0xf2, 0x50, 0xc0,
10116
+	0x43, 0x52, 0x81, 0xe9, 0x5e, 0xb3, 0x4b, 0xb9, 0xc6, 0xa9, 0xd5, 0xa2, 0x2d, 0x1e, 0xc8, 0x06,
10117
+	0x94, 0x9c, 0xf6, 0x41, 0xdf, 0xa3, 0x0f, 0x9c, 0x47, 0xec, 0x5d, 0x9e, 0xbf, 0xdb, 0x9e, 0x65,
10118
+	0x81, 0x42, 0x63, 0xf7, 0x1e, 0x9e, 0xda, 0xe0, 0xb4, 0xe5, 0x77, 0x72, 0x0f, 0x66, 0x3a, 0xcd,
10119
+	0x43, 0xda, 0xf1, 0x17, 0xa7, 0x18, 0xb6, 0x54, 0xdf, 0x1a, 0xc7, 0xb3, 0xda, 0xdd, 0x50, 0xf4,
10120
+	0x03, 0x96, 0xe0, 0x33, 0x1b, 0xf5, 0x90, 0x06, 0x94, 0xba, 0xb4, 0x7b, 0xc8, 0x5e, 0x7f, 0xe1,
10121
+	0xf4, 0xfd, 0xc5, 0x4b, 0x4c, 0xed, 0x6c, 0xfd, 0x56, 0xda, 0xb5, 0xed, 0xb3, 0xd4, 0xd7, 0x3e,
10122
+	0x8e, 0xf0, 0x76, 0x52, 0x96, 0xd4, 0x61, 0x9a, 0x31, 0x87, 0xc5, 0x31, 0x1d, 0x2a, 0x59, 0x4a,
10123
+	0xbd, 0x7b, 0x06, 0xb2, 0x05, 0xb4, 0xfa, 0x16, 0x94, 0x12, 0x5e, 0x91, 0xab, 0x30, 0x75, 0x4c,
10124
+	0xcf, 0x44, 0xc6, 0x6d, 0xfe, 0x95, 0x5f, 0xdc, 0x69, 0xb3, 0x73, 0x42, 0xd9, 0xe5, 0xf0, 0x33,
10125
+	0xf1, 0xf0, 0x76, 0x7e, 0x2b, 0x67, 0xed, 0xc0, 0x7c, 0x22, 0x52, 0x4c, 0x7f, 0x8d, 0xdd, 0x33,
10126
+	0x3f, 0x08, 0xef, 0xd9, 0x94, 0x7f, 0x01, 0xb3, 0xbe, 0xcb, 0xc1, 0xfc, 0xfd, 0x7e, 0xbb, 0x19,
10127
+	0xd0, 0x71, 0xc9, 0x47, 0xde, 0x85, 0x2b, 0x21, 0xe8, 0x94, 0xc5, 0xef, 0xb8, 0xbd, 0xd0, 0xc1,
10128
+	0x52, 0xfd, 0xba, 0xce, 0xe2, 0x67, 0x02, 0x62, 0x97, 0xb8, 0x00, 0x3e, 0x90, 0xd7, 0xe1, 0x12,
10129
+	0xaf, 0x24, 0x96, 0x49, 0x2e, 0xb7, 0x64, 0xba, 0x72, 0x3b, 0x44, 0x5a, 0xdb, 0x40, 0x92, 0xbe,
10130
+	0x9e, 0x8b, 0xf1, 0x5b, 0x30, 0x6f, 0xd3, 0xae, 0x7b, 0x3a, 0x76, 0xbc, 0x56, 0x05, 0x48, 0x52,
10131
+	0x52, 0x58, 0xc7, 0xca, 0xfd, 0xb4, 0xe9, 0x1f, 0x27, 0x94, 0x05, 0xec, 0x51, 0x51, 0xc6, 0x11,
10132
+	0x5c, 0x19, 0x7f, 0x15, 0x55, 0xae, 0x10, 0x8b, 0xe3, 0xe0, 0x2f, 0x4d, 0x71, 0x84, 0xf8, 0x10,
10133
+	0x15, 0xc7, 0x31, 0xb6, 0xe9, 0x28, 0x8e, 0xa4, 0x75, 0xeb, 0x77, 0xec, 0x04, 0xfc, 0xf0, 0x1c,
10134
+	0x9d, 0x20, 0x29, 0x36, 0xdc, 0x09, 0xfe, 0xf9, 0x0f, 0x3b, 0x81, 0xce, 0x33, 0x6d, 0x27, 0x60,
10135
+	0x2e, 0xf8, 0xd4, 0x3b, 0x75, 0x5a, 0x9c, 0x07, 0xa2, 0x13, 0xa0, 0x0b, 0xfb, 0xe2, 0xb8, 0xb1,
10136
+	0xcb, 0x5c, 0x40, 0x48, 0xa3, 0xed, 0x93, 0x15, 0xb8, 0x8c, 0xac, 0x11, 0x25, 0x5f, 0xdc, 0x2e,
10137
+	0x31, 0x74, 0x41, 0xd0, 0x86, 0x45, 0x2f, 0x78, 0xe3, 0x93, 0x5d, 0x98, 0x65, 0xa5, 0xe6, 0x78,
10138
+	0xb4, 0x7d, 0xe0, 0x07, 0x8c, 0xbd, 0xfe, 0xe2, 0x4c, 0xd8, 0x20, 0x5e, 0x4a, 0x4b, 0xf1, 0x3e,
10139
+	0x47, 0xd9, 0x65, 0x14, 0x0a, 0x9f, 0x2e, 0xa2, 0x53, 0xe0, 0x4d, 0xc4, 0x9d, 0x82, 0x13, 0xc2,
10140
+	0xd8, 0x29, 0x42, 0x86, 0x08, 0x98, 0xf5, 0x11, 0x54, 0x76, 0x3c, 0xca, 0x5c, 0xc1, 0xdb, 0x90,
10141
+	0x1c, 0xd9, 0xc4, 0x32, 0x16, 0x04, 0xb9, 0xa1, 0x53, 0x83, 0x12, 0x89, 0x4a, 0xde, 0x83, 0x05,
10142
+	0x45, 0x19, 0x7a, 0x75, 0x1b, 0x0a, 0x78, 0xc3, 0xa8, 0xf0, 0xba, 0x41, 0xa1, 0x2d, 0xb1, 0xd6,
10143
+	0xfb, 0x30, 0xcf, 0xca, 0x49, 0xf1, 0x6c, 0x1d, 0x20, 0x4e, 0x28, 0x16, 0x44, 0x99, 0x65, 0xa8,
10144
+	0x18, 0xe5, 0xd3, 0x2e, 0x46, 0xe9, 0x64, 0xf1, 0x91, 0xa4, 0x8a, 0xc9, 0xfc, 0xf9, 0x31, 0x07,
10145
+	0x15, 0xd1, 0xaa, 0x26, 0xf1, 0x89, 0x31, 0x67, 0x4e, 0xa2, 0xc7, 0xe8, 0xb2, 0xb3, 0x28, 0x23,
10146
+	0x1b, 0xed, 0xe6, 0x40, 0xa3, 0x1d, 0x3d, 0x43, 0x4a, 0x00, 0x93, 0xdd, 0xc8, 0x2e, 0x54, 0x44,
10147
+	0xd7, 0x99, 0x28, 0x49, 0xff, 0x87, 0x05, 0x45, 0x0b, 0xb6, 0xaf, 0x9f, 0xf2, 0x70, 0x8d, 0x73,
10148
+	0x1c, 0xcf, 0xa3, 0x0e, 0xd6, 0x50, 0x3b, 0xd8, 0x46, 0x5a, 0x9f, 0x50, 0x24, 0x87, 0x9b, 0xd8,
10149
+	0x93, 0xdc, 0x85, 0x37, 0xb1, 0x7d, 0xa5, 0x89, 0xbd, 0x33, 0xa6, 0x73, 0xba, 0x3e, 0x36, 0x49,
10150
+	0xa3, 0xf8, 0x04, 0x2a, 0x83, 0xd6, 0x30, 0xe7, 0x6f, 0xc2, 0x65, 0xcc, 0x81, 0x6c, 0x17, 0xc6,
10151
+	0xa4, 0x47, 0xe0, 0xb8, 0x69, 0xec, 0xd1, 0xe0, 0xa1, 0xeb, 0x1d, 0x8f, 0xd1, 0x34, 0x50, 0x42,
10152
+	0xd7, 0x34, 0x22, 0x65, 0x31, 0x25, 0x7b, 0xe2, 0xc8, 0x44, 0x49, 0x29, 0x25, 0xb1, 0xd6, 0xfd,
10153
+	0xb0, 0x69, 0x28, 0x9e, 0x11, 0x36, 0x4d, 0xb0, 0x64, 0xe2, 0x7d, 0x85, 0xdf, 0x39, 0x47, 0x51,
10154
+	0x86, 0x73, 0x34, 0x1f, 0x73, 0x14, 0x65, 0x39, 0x47, 0x11, 0x10, 0x35, 0x92, 0x0b, 0xf2, 0xf1,
10155
+	0x73, 0x59, 0x36, 0x17, 0xee, 0x66, 0x54, 0x4a, 0x8a, 0xa7, 0x51, 0x29, 0xe1, 0xf9, 0x39, 0x4a,
10156
+	0x49, 0x91, 0x7c, 0xb1, 0x4a, 0x29, 0xc5, 0xb9, 0xe7, 0x54, 0x4a, 0xb1, 0xb5, 0xb8, 0x94, 0x30,
10157
+	0x07, 0xc6, 0x52, 0x92, 0x49, 0x89, 0xc0, 0xf8, 0x27, 0x6e, 0xa7, 0x73, 0xe2, 0x33, 0x77, 0x13,
10158
+	0xdd, 0xb3, 0x25, 0x4e, 0x94, 0xee, 0x89, 0x38, 0x9e, 0x72, 0x04, 0x44, 0xcc, 0x8c, 0x54, 0xc4,
10159
+	0xcc, 0x44, 0x88, 0x89, 0x99, 0x52, 0x4a, 0x62, 0x23, 0x9a, 0xe0, 0x8b, 0x73, 0xd0, 0x44, 0x91,
10160
+	0x7c, 0xb1, 0x68, 0x92, 0xe2, 0xdc, 0x73, 0xa2, 0x49, 0x6c, 0x2d, 0xa6, 0x09, 0x5e, 0xb4, 0x91,
10161
+	0x26, 0x32, 0x2b, 0x11, 0x38, 0x31, 0x79, 0x4c, 0x42, 0x15, 0x3e, 0x79, 0x48, 0xf4, 0x38, 0x93,
10162
+	0x07, 0xca, 0x8c, 0x31, 0x79, 0xa0, 0x75, 0xdd, 0xe4, 0x71, 0x31, 0x44, 0xad, 0xff, 0x3a, 0x0f,
10163
+	0x85, 0x1d, 0xf1, 0xab, 0x0e, 0x71, 0xa0, 0x80, 0x3f, 0x98, 0x10, 0x4b, 0x27, 0x3c, 0xf8, 0x23,
10164
+	0x4c, 0xf5, 0xa6, 0x11, 0x83, 0xfd, 0x72, 0xe1, 0xe7, 0xef, 0xff, 0xfa, 0x36, 0x3f, 0x07, 0xe5,
10165
+	0x10, 0xf4, 0x5a, 0xb7, 0xd9, 0x6b, 0x1e, 0x51, 0x8f, 0xb8, 0x50, 0x8c, 0xd6, 0x73, 0xf2, 0xca,
10166
+	0x28, 0xbf, 0x53, 0x54, 0x5f, 0xcd, 0x40, 0x99, 0x0d, 0x7a, 0x00, 0xf1, 0x76, 0x4c, 0xb4, 0xba,
10167
+	0x86, 0x36, 0xfd, 0xea, 0x4a, 0x16, 0x2c, 0xd3, 0x66, 0xbc, 0x13, 0xeb, 0x6d, 0x0e, 0x6d, 0xdb,
10168
+	0x7a, 0x9b, 0x9a, 0xd5, 0x3a, 0xc5, 0xa6, 0xc8, 0x21, 0x5f, 0x4d, 0x52, 0x73, 0x98, 0xd8, 0x89,
10169
+	0x53, 0x73, 0x38, 0xb0, 0xfd, 0x9a, 0x73, 0x18, 0x2e, 0x4e, 0xe9, 0x39, 0x4c, 0x6e, 0x98, 0xe9,
10170
+	0x39, 0x1c, 0xd8, 0xbe, 0x32, 0xef, 0x33, 0x0c, 0xcf, 0x70, 0x9f, 0xc9, 0x08, 0x57, 0xb2, 0x60,
10171
+	0x99, 0x36, 0xe3, 0xc5, 0x47, 0x6f, 0x73, 0x68, 0xb7, 0xd2, 0xdb, 0x1c, 0xde, 0x9f, 0xd2, 0x6c,
10172
+	0x3e, 0x82, 0x2b, 0xc9, 0x41, 0x93, 0xdc, 0x1a, 0x71, 0xf0, 0xad, 0xae, 0x66, 0x03, 0xcd, 0x96,
10173
+	0xbf, 0x86, 0xf2, 0xc0, 0xe6, 0x49, 0xb4, 0x1a, 0x75, 0x9b, 0x6e, 0x75, 0x6d, 0x04, 0x64, 0xa6,
10174
+	0xf1, 0x81, 0xa5, 0x4a, 0x6f, 0x5c, 0xb7, 0x38, 0xea, 0x8d, 0x6b, 0x37, 0x34, 0x83, 0xf1, 0x81,
10175
+	0xdd, 0x49, 0x6f, 0x5c, 0xb7, 0xa4, 0xe9, 0x8d, 0xeb, 0x17, 0x31, 0x23, 0xc9, 0x70, 0xaa, 0x49,
10176
+	0x25, 0xd9, 0xe0, 0x90, 0x9b, 0x4a, 0x32, 0x75, 0x62, 0x35, 0x93, 0x4c, 0x8e, 0x60, 0xe9, 0x24,
10177
+	0x53, 0x46, 0xc2, 0x74, 0x92, 0xa9, 0xd3, 0x5c, 0x26, 0xc9, 0x64, 0xc0, 0x06, 0x92, 0x29, 0x31,
10178
+	0xaf, 0x8d, 0x80, 0x1c, 0x31, 0xcf, 0x46, 0xe3, 0xba, 0xad, 0xc2, 0x94, 0xe7, 0x11, 0x8d, 0x8b,
10179
+	0x3c, 0xe3, 0xdf, 0xe0, 0xd4, 0x3c, 0x0f, 0x8e, 0x26, 0xa9, 0x79, 0x56, 0x06, 0x80, 0x8c, 0x3c,
10180
+	0xcb, 0x19, 0x2a, 0x3d, 0xcf, 0xca, 0x4c, 0x97, 0x9e, 0x67, 0x75, 0x1c, 0xcb, 0xac, 0x67, 0x19,
10181
+	0xb0, 0xa1, 0x9e, 0x95, 0x98, 0xd7, 0x46, 0x40, 0x1a, 0x8d, 0x6f, 0x2f, 0x3d, 0x7e, 0xba, 0xfc,
10182
+	0xbf, 0xdf, 0xd8, 0xe7, 0xef, 0xa7, 0xcb, 0xb9, 0x6f, 0x9e, 0x2d, 0xe7, 0x1e, 0xb3, 0xcf, 0x2f,
10183
+	0xec, 0xf3, 0x84, 0x7d, 0x0e, 0x67, 0xc2, 0xff, 0x58, 0xda, 0xfc, 0x37, 0x00, 0x00, 0xff, 0xff,
10184
+	0x35, 0x0f, 0xc7, 0x5a, 0xd1, 0x1a, 0x00, 0x00,
10185 10185
 }
... ...
@@ -235,8 +235,6 @@ message ListNetworksResponse {
235 235
 	repeated Network networks = 1;
236 236
 }
237 237
 
238
-message RemoveManagerResponse {}
239
-
240 238
 message GetClusterRequest {
241 239
 	string cluster_id = 1 [(gogoproto.customname) = "ClusterID"];
242 240
 }
... ...
@@ -49,8 +49,8 @@ type Node struct {
49 49
 	Description *NodeDescription `protobuf:"bytes,4,opt,name=description" json:"description,omitempty"`
50 50
 	// Status provides the current status of the node, as seen by the manager.
51 51
 	Status NodeStatus `protobuf:"bytes,5,opt,name=status" json:"status"`
52
-	// Status of the manager. If the node is not a manager, this field will not
53
-	// be set.
52
+	// ManagerStatus provides the current status of the node's manager
53
+	// component, if the node is a manager.
54 54
 	ManagerStatus *ManagerStatus `protobuf:"bytes,6,opt,name=manager_status,json=managerStatus" json:"manager_status,omitempty"`
55 55
 	// The node attachment to the ingress network.
56 56
 	Attachment *NetworkAttachment `protobuf:"bytes,7,opt,name=attachment" json:"attachment,omitempty"`
... ...
@@ -39,8 +39,8 @@ message Node {
39 39
 	// Status provides the current status of the node, as seen by the manager.
40 40
 	NodeStatus status = 5 [(gogoproto.nullable) = false];
41 41
 
42
-	// Status of the manager. If the node is not a manager, this field will not
43
-	// be set.
42
+	// ManagerStatus provides the current status of the node's manager
43
+	// component, if the node is a manager.
44 44
 	ManagerStatus manager_status = 6;
45 45
 
46 46
 	// The node attachment to the ingress network.
... ...
@@ -64,6 +64,22 @@ func (x StoreActionKind) String() string {
64 64
 }
65 65
 func (StoreActionKind) EnumDescriptor() ([]byte, []int) { return fileDescriptorRaft, []int{0} }
66 66
 
67
+type RaftMember struct {
68
+	// RaftID specifies the internal ID used by the manager in a raft context, it can never be modified
69
+	// and is used only for information purposes
70
+	RaftID uint64 `protobuf:"varint,1,opt,name=raft_id,json=raftId,proto3" json:"raft_id,omitempty"`
71
+	// NodeID is the node's ID.
72
+	NodeID string `protobuf:"bytes,2,opt,name=node_id,json=nodeId,proto3" json:"node_id,omitempty"`
73
+	// Addr specifies the address of the member
74
+	Addr string `protobuf:"bytes,3,opt,name=addr,proto3" json:"addr,omitempty"`
75
+	// Status provides the current status of the manager from the perspective of another manager.
76
+	Status RaftMemberStatus `protobuf:"bytes,4,opt,name=status" json:"status"`
77
+}
78
+
79
+func (m *RaftMember) Reset()                    { *m = RaftMember{} }
80
+func (*RaftMember) ProtoMessage()               {}
81
+func (*RaftMember) Descriptor() ([]byte, []int) { return fileDescriptorRaft, []int{0} }
82
+
67 83
 type JoinRequest struct {
68 84
 	// Addr specifies the address of the member
69 85
 	Addr string `protobuf:"bytes,1,opt,name=addr,proto3" json:"addr,omitempty"`
... ...
@@ -71,15 +87,16 @@ type JoinRequest struct {
71 71
 
72 72
 func (m *JoinRequest) Reset()                    { *m = JoinRequest{} }
73 73
 func (*JoinRequest) ProtoMessage()               {}
74
-func (*JoinRequest) Descriptor() ([]byte, []int) { return fileDescriptorRaft, []int{0} }
74
+func (*JoinRequest) Descriptor() ([]byte, []int) { return fileDescriptorRaft, []int{1} }
75 75
 
76 76
 type JoinResponse struct {
77
-	Members []*RaftMember `protobuf:"bytes,1,rep,name=members" json:"members,omitempty"`
77
+	RaftID  uint64        `protobuf:"varint,1,opt,name=raft_id,json=raftId,proto3" json:"raft_id,omitempty"`
78
+	Members []*RaftMember `protobuf:"bytes,2,rep,name=members" json:"members,omitempty"`
78 79
 }
79 80
 
80 81
 func (m *JoinResponse) Reset()                    { *m = JoinResponse{} }
81 82
 func (*JoinResponse) ProtoMessage()               {}
82
-func (*JoinResponse) Descriptor() ([]byte, []int) { return fileDescriptorRaft, []int{1} }
83
+func (*JoinResponse) Descriptor() ([]byte, []int) { return fileDescriptorRaft, []int{2} }
83 84
 
84 85
 type LeaveRequest struct {
85 86
 	Node *RaftMember `protobuf:"bytes,1,opt,name=node" json:"node,omitempty"`
... ...
@@ -87,14 +104,14 @@ type LeaveRequest struct {
87 87
 
88 88
 func (m *LeaveRequest) Reset()                    { *m = LeaveRequest{} }
89 89
 func (*LeaveRequest) ProtoMessage()               {}
90
-func (*LeaveRequest) Descriptor() ([]byte, []int) { return fileDescriptorRaft, []int{2} }
90
+func (*LeaveRequest) Descriptor() ([]byte, []int) { return fileDescriptorRaft, []int{3} }
91 91
 
92 92
 type LeaveResponse struct {
93 93
 }
94 94
 
95 95
 func (m *LeaveResponse) Reset()                    { *m = LeaveResponse{} }
96 96
 func (*LeaveResponse) ProtoMessage()               {}
97
-func (*LeaveResponse) Descriptor() ([]byte, []int) { return fileDescriptorRaft, []int{3} }
97
+func (*LeaveResponse) Descriptor() ([]byte, []int) { return fileDescriptorRaft, []int{4} }
98 98
 
99 99
 type ProcessRaftMessageRequest struct {
100 100
 	Message *raftpb.Message `protobuf:"bytes,1,opt,name=message" json:"message,omitempty"`
... ...
@@ -102,14 +119,14 @@ type ProcessRaftMessageRequest struct {
102 102
 
103 103
 func (m *ProcessRaftMessageRequest) Reset()                    { *m = ProcessRaftMessageRequest{} }
104 104
 func (*ProcessRaftMessageRequest) ProtoMessage()               {}
105
-func (*ProcessRaftMessageRequest) Descriptor() ([]byte, []int) { return fileDescriptorRaft, []int{4} }
105
+func (*ProcessRaftMessageRequest) Descriptor() ([]byte, []int) { return fileDescriptorRaft, []int{5} }
106 106
 
107 107
 type ProcessRaftMessageResponse struct {
108 108
 }
109 109
 
110 110
 func (m *ProcessRaftMessageResponse) Reset()                    { *m = ProcessRaftMessageResponse{} }
111 111
 func (*ProcessRaftMessageResponse) ProtoMessage()               {}
112
-func (*ProcessRaftMessageResponse) Descriptor() ([]byte, []int) { return fileDescriptorRaft, []int{5} }
112
+func (*ProcessRaftMessageResponse) Descriptor() ([]byte, []int) { return fileDescriptorRaft, []int{6} }
113 113
 
114 114
 type ResolveAddressRequest struct {
115 115
 	// raft_id is the ID to resolve to an address.
... ...
@@ -118,7 +135,7 @@ type ResolveAddressRequest struct {
118 118
 
119 119
 func (m *ResolveAddressRequest) Reset()                    { *m = ResolveAddressRequest{} }
120 120
 func (*ResolveAddressRequest) ProtoMessage()               {}
121
-func (*ResolveAddressRequest) Descriptor() ([]byte, []int) { return fileDescriptorRaft, []int{6} }
121
+func (*ResolveAddressRequest) Descriptor() ([]byte, []int) { return fileDescriptorRaft, []int{7} }
122 122
 
123 123
 type ResolveAddressResponse struct {
124 124
 	// Addr specifies the address of the member
... ...
@@ -127,7 +144,7 @@ type ResolveAddressResponse struct {
127 127
 
128 128
 func (m *ResolveAddressResponse) Reset()                    { *m = ResolveAddressResponse{} }
129 129
 func (*ResolveAddressResponse) ProtoMessage()               {}
130
-func (*ResolveAddressResponse) Descriptor() ([]byte, []int) { return fileDescriptorRaft, []int{7} }
130
+func (*ResolveAddressResponse) Descriptor() ([]byte, []int) { return fileDescriptorRaft, []int{8} }
131 131
 
132 132
 // Contains one of many protobuf encoded objects to replicate
133 133
 // over the raft backend with a request ID to track when the
... ...
@@ -139,7 +156,7 @@ type InternalRaftRequest struct {
139 139
 
140 140
 func (m *InternalRaftRequest) Reset()                    { *m = InternalRaftRequest{} }
141 141
 func (*InternalRaftRequest) ProtoMessage()               {}
142
-func (*InternalRaftRequest) Descriptor() ([]byte, []int) { return fileDescriptorRaft, []int{8} }
142
+func (*InternalRaftRequest) Descriptor() ([]byte, []int) { return fileDescriptorRaft, []int{9} }
143 143
 
144 144
 // StoreAction defines a taret and operation to apply on the storage system.
145 145
 type StoreAction struct {
... ...
@@ -155,7 +172,7 @@ type StoreAction struct {
155 155
 
156 156
 func (m *StoreAction) Reset()                    { *m = StoreAction{} }
157 157
 func (*StoreAction) ProtoMessage()               {}
158
-func (*StoreAction) Descriptor() ([]byte, []int) { return fileDescriptorRaft, []int{9} }
158
+func (*StoreAction) Descriptor() ([]byte, []int) { return fileDescriptorRaft, []int{10} }
159 159
 
160 160
 type isStoreAction_Target interface {
161 161
 	isStoreAction_Target()
... ...
@@ -359,6 +376,7 @@ func _StoreAction_OneofSizer(msg proto.Message) (n int) {
359 359
 }
360 360
 
361 361
 func init() {
362
+	proto.RegisterType((*RaftMember)(nil), "docker.swarmkit.v1.RaftMember")
362 363
 	proto.RegisterType((*JoinRequest)(nil), "docker.swarmkit.v1.JoinRequest")
363 364
 	proto.RegisterType((*JoinResponse)(nil), "docker.swarmkit.v1.JoinResponse")
364 365
 	proto.RegisterType((*LeaveRequest)(nil), "docker.swarmkit.v1.LeaveRequest")
... ...
@@ -384,36 +402,63 @@ func NewAuthenticatedWrapperRaftServer(local RaftServer, authorize func(context.
384 384
 	}
385 385
 }
386 386
 
387
-func (p *authenticatedWrapperRaftServer) Join(ctx context.Context, r *JoinRequest) (*JoinResponse, error) {
387
+func (p *authenticatedWrapperRaftServer) ProcessRaftMessage(ctx context.Context, r *ProcessRaftMessageRequest) (*ProcessRaftMessageResponse, error) {
388 388
 
389 389
 	if err := p.authorize(ctx, []string{"swarm-manager"}); err != nil {
390 390
 		return nil, err
391 391
 	}
392
-	return p.local.Join(ctx, r)
392
+	return p.local.ProcessRaftMessage(ctx, r)
393 393
 }
394 394
 
395
-func (p *authenticatedWrapperRaftServer) Leave(ctx context.Context, r *LeaveRequest) (*LeaveResponse, error) {
395
+func (p *authenticatedWrapperRaftServer) ResolveAddress(ctx context.Context, r *ResolveAddressRequest) (*ResolveAddressResponse, error) {
396 396
 
397 397
 	if err := p.authorize(ctx, []string{"swarm-manager"}); err != nil {
398 398
 		return nil, err
399 399
 	}
400
-	return p.local.Leave(ctx, r)
400
+	return p.local.ResolveAddress(ctx, r)
401 401
 }
402 402
 
403
-func (p *authenticatedWrapperRaftServer) ProcessRaftMessage(ctx context.Context, r *ProcessRaftMessageRequest) (*ProcessRaftMessageResponse, error) {
403
+type authenticatedWrapperRaftMembershipServer struct {
404
+	local     RaftMembershipServer
405
+	authorize func(context.Context, []string) error
406
+}
407
+
408
+func NewAuthenticatedWrapperRaftMembershipServer(local RaftMembershipServer, authorize func(context.Context, []string) error) RaftMembershipServer {
409
+	return &authenticatedWrapperRaftMembershipServer{
410
+		local:     local,
411
+		authorize: authorize,
412
+	}
413
+}
414
+
415
+func (p *authenticatedWrapperRaftMembershipServer) Join(ctx context.Context, r *JoinRequest) (*JoinResponse, error) {
404 416
 
405 417
 	if err := p.authorize(ctx, []string{"swarm-manager"}); err != nil {
406 418
 		return nil, err
407 419
 	}
408
-	return p.local.ProcessRaftMessage(ctx, r)
420
+	return p.local.Join(ctx, r)
409 421
 }
410 422
 
411
-func (p *authenticatedWrapperRaftServer) ResolveAddress(ctx context.Context, r *ResolveAddressRequest) (*ResolveAddressResponse, error) {
423
+func (p *authenticatedWrapperRaftMembershipServer) Leave(ctx context.Context, r *LeaveRequest) (*LeaveResponse, error) {
412 424
 
413 425
 	if err := p.authorize(ctx, []string{"swarm-manager"}); err != nil {
414 426
 		return nil, err
415 427
 	}
416
-	return p.local.ResolveAddress(ctx, r)
428
+	return p.local.Leave(ctx, r)
429
+}
430
+
431
+func (m *RaftMember) Copy() *RaftMember {
432
+	if m == nil {
433
+		return nil
434
+	}
435
+
436
+	o := &RaftMember{
437
+		RaftID: m.RaftID,
438
+		NodeID: m.NodeID,
439
+		Addr:   m.Addr,
440
+		Status: *m.Status.Copy(),
441
+	}
442
+
443
+	return o
417 444
 }
418 445
 
419 446
 func (m *JoinRequest) Copy() *JoinRequest {
... ...
@@ -433,7 +478,9 @@ func (m *JoinResponse) Copy() *JoinResponse {
433 433
 		return nil
434 434
 	}
435 435
 
436
-	o := &JoinResponse{}
436
+	o := &JoinResponse{
437
+		RaftID: m.RaftID,
438
+	}
437 439
 
438 440
 	if m.Members != nil {
439 441
 		o.Members = make([]*RaftMember, 0, len(m.Members))
... ...
@@ -565,6 +612,19 @@ func (m *StoreAction) Copy() *StoreAction {
565 565
 	return o
566 566
 }
567 567
 
568
+func (this *RaftMember) GoString() string {
569
+	if this == nil {
570
+		return "nil"
571
+	}
572
+	s := make([]string, 0, 8)
573
+	s = append(s, "&api.RaftMember{")
574
+	s = append(s, "RaftID: "+fmt.Sprintf("%#v", this.RaftID)+",\n")
575
+	s = append(s, "NodeID: "+fmt.Sprintf("%#v", this.NodeID)+",\n")
576
+	s = append(s, "Addr: "+fmt.Sprintf("%#v", this.Addr)+",\n")
577
+	s = append(s, "Status: "+strings.Replace(this.Status.GoString(), `&`, ``, 1)+",\n")
578
+	s = append(s, "}")
579
+	return strings.Join(s, "")
580
+}
568 581
 func (this *JoinRequest) GoString() string {
569 582
 	if this == nil {
570 583
 		return "nil"
... ...
@@ -579,8 +639,9 @@ func (this *JoinResponse) GoString() string {
579 579
 	if this == nil {
580 580
 		return "nil"
581 581
 	}
582
-	s := make([]string, 0, 5)
582
+	s := make([]string, 0, 6)
583 583
 	s = append(s, "&api.JoinResponse{")
584
+	s = append(s, "RaftID: "+fmt.Sprintf("%#v", this.RaftID)+",\n")
584 585
 	if this.Members != nil {
585 586
 		s = append(s, "Members: "+fmt.Sprintf("%#v", this.Members)+",\n")
586 587
 	}
... ...
@@ -752,10 +813,6 @@ const _ = grpc.SupportPackageIsVersion2
752 752
 // Client API for Raft service
753 753
 
754 754
 type RaftClient interface {
755
-	// Join adds a RaftMember to the raft cluster.
756
-	Join(ctx context.Context, in *JoinRequest, opts ...grpc.CallOption) (*JoinResponse, error)
757
-	// Leave removes a RaftMember from the raft cluster.
758
-	Leave(ctx context.Context, in *LeaveRequest, opts ...grpc.CallOption) (*LeaveResponse, error)
759 755
 	// ProcessRaftMessage sends a raft message to be processed on a raft member, it is
760 756
 	// called from the RaftMember willing to send a message to its destination ('To' field)
761 757
 	ProcessRaftMessage(ctx context.Context, in *ProcessRaftMessageRequest, opts ...grpc.CallOption) (*ProcessRaftMessageResponse, error)
... ...
@@ -771,24 +828,6 @@ func NewRaftClient(cc *grpc.ClientConn) RaftClient {
771 771
 	return &raftClient{cc}
772 772
 }
773 773
 
774
-func (c *raftClient) Join(ctx context.Context, in *JoinRequest, opts ...grpc.CallOption) (*JoinResponse, error) {
775
-	out := new(JoinResponse)
776
-	err := grpc.Invoke(ctx, "/docker.swarmkit.v1.Raft/Join", in, out, c.cc, opts...)
777
-	if err != nil {
778
-		return nil, err
779
-	}
780
-	return out, nil
781
-}
782
-
783
-func (c *raftClient) Leave(ctx context.Context, in *LeaveRequest, opts ...grpc.CallOption) (*LeaveResponse, error) {
784
-	out := new(LeaveResponse)
785
-	err := grpc.Invoke(ctx, "/docker.swarmkit.v1.Raft/Leave", in, out, c.cc, opts...)
786
-	if err != nil {
787
-		return nil, err
788
-	}
789
-	return out, nil
790
-}
791
-
792 774
 func (c *raftClient) ProcessRaftMessage(ctx context.Context, in *ProcessRaftMessageRequest, opts ...grpc.CallOption) (*ProcessRaftMessageResponse, error) {
793 775
 	out := new(ProcessRaftMessageResponse)
794 776
 	err := grpc.Invoke(ctx, "/docker.swarmkit.v1.Raft/ProcessRaftMessage", in, out, c.cc, opts...)
... ...
@@ -810,10 +849,6 @@ func (c *raftClient) ResolveAddress(ctx context.Context, in *ResolveAddressReque
810 810
 // Server API for Raft service
811 811
 
812 812
 type RaftServer interface {
813
-	// Join adds a RaftMember to the raft cluster.
814
-	Join(context.Context, *JoinRequest) (*JoinResponse, error)
815
-	// Leave removes a RaftMember from the raft cluster.
816
-	Leave(context.Context, *LeaveRequest) (*LeaveResponse, error)
817 813
 	// ProcessRaftMessage sends a raft message to be processed on a raft member, it is
818 814
 	// called from the RaftMember willing to send a message to its destination ('To' field)
819 815
 	ProcessRaftMessage(context.Context, *ProcessRaftMessageRequest) (*ProcessRaftMessageResponse, error)
... ...
@@ -825,102 +860,201 @@ func RegisterRaftServer(s *grpc.Server, srv RaftServer) {
825 825
 	s.RegisterService(&_Raft_serviceDesc, srv)
826 826
 }
827 827
 
828
-func _Raft_Join_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
829
-	in := new(JoinRequest)
828
+func _Raft_ProcessRaftMessage_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
829
+	in := new(ProcessRaftMessageRequest)
830 830
 	if err := dec(in); err != nil {
831 831
 		return nil, err
832 832
 	}
833 833
 	if interceptor == nil {
834
-		return srv.(RaftServer).Join(ctx, in)
834
+		return srv.(RaftServer).ProcessRaftMessage(ctx, in)
835 835
 	}
836 836
 	info := &grpc.UnaryServerInfo{
837 837
 		Server:     srv,
838
-		FullMethod: "/docker.swarmkit.v1.Raft/Join",
838
+		FullMethod: "/docker.swarmkit.v1.Raft/ProcessRaftMessage",
839 839
 	}
840 840
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
841
-		return srv.(RaftServer).Join(ctx, req.(*JoinRequest))
841
+		return srv.(RaftServer).ProcessRaftMessage(ctx, req.(*ProcessRaftMessageRequest))
842 842
 	}
843 843
 	return interceptor(ctx, in, info, handler)
844 844
 }
845 845
 
846
-func _Raft_Leave_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
847
-	in := new(LeaveRequest)
846
+func _Raft_ResolveAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
847
+	in := new(ResolveAddressRequest)
848 848
 	if err := dec(in); err != nil {
849 849
 		return nil, err
850 850
 	}
851 851
 	if interceptor == nil {
852
-		return srv.(RaftServer).Leave(ctx, in)
852
+		return srv.(RaftServer).ResolveAddress(ctx, in)
853 853
 	}
854 854
 	info := &grpc.UnaryServerInfo{
855 855
 		Server:     srv,
856
-		FullMethod: "/docker.swarmkit.v1.Raft/Leave",
856
+		FullMethod: "/docker.swarmkit.v1.Raft/ResolveAddress",
857 857
 	}
858 858
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
859
-		return srv.(RaftServer).Leave(ctx, req.(*LeaveRequest))
859
+		return srv.(RaftServer).ResolveAddress(ctx, req.(*ResolveAddressRequest))
860 860
 	}
861 861
 	return interceptor(ctx, in, info, handler)
862 862
 }
863 863
 
864
-func _Raft_ProcessRaftMessage_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
865
-	in := new(ProcessRaftMessageRequest)
864
+var _Raft_serviceDesc = grpc.ServiceDesc{
865
+	ServiceName: "docker.swarmkit.v1.Raft",
866
+	HandlerType: (*RaftServer)(nil),
867
+	Methods: []grpc.MethodDesc{
868
+		{
869
+			MethodName: "ProcessRaftMessage",
870
+			Handler:    _Raft_ProcessRaftMessage_Handler,
871
+		},
872
+		{
873
+			MethodName: "ResolveAddress",
874
+			Handler:    _Raft_ResolveAddress_Handler,
875
+		},
876
+	},
877
+	Streams: []grpc.StreamDesc{},
878
+}
879
+
880
+// Client API for RaftMembership service
881
+
882
+type RaftMembershipClient interface {
883
+	// Join adds a RaftMember to the raft cluster.
884
+	Join(ctx context.Context, in *JoinRequest, opts ...grpc.CallOption) (*JoinResponse, error)
885
+	// Leave removes a RaftMember from the raft cluster.
886
+	Leave(ctx context.Context, in *LeaveRequest, opts ...grpc.CallOption) (*LeaveResponse, error)
887
+}
888
+
889
+type raftMembershipClient struct {
890
+	cc *grpc.ClientConn
891
+}
892
+
893
+func NewRaftMembershipClient(cc *grpc.ClientConn) RaftMembershipClient {
894
+	return &raftMembershipClient{cc}
895
+}
896
+
897
+func (c *raftMembershipClient) Join(ctx context.Context, in *JoinRequest, opts ...grpc.CallOption) (*JoinResponse, error) {
898
+	out := new(JoinResponse)
899
+	err := grpc.Invoke(ctx, "/docker.swarmkit.v1.RaftMembership/Join", in, out, c.cc, opts...)
900
+	if err != nil {
901
+		return nil, err
902
+	}
903
+	return out, nil
904
+}
905
+
906
+func (c *raftMembershipClient) Leave(ctx context.Context, in *LeaveRequest, opts ...grpc.CallOption) (*LeaveResponse, error) {
907
+	out := new(LeaveResponse)
908
+	err := grpc.Invoke(ctx, "/docker.swarmkit.v1.RaftMembership/Leave", in, out, c.cc, opts...)
909
+	if err != nil {
910
+		return nil, err
911
+	}
912
+	return out, nil
913
+}
914
+
915
+// Server API for RaftMembership service
916
+
917
+type RaftMembershipServer interface {
918
+	// Join adds a RaftMember to the raft cluster.
919
+	Join(context.Context, *JoinRequest) (*JoinResponse, error)
920
+	// Leave removes a RaftMember from the raft cluster.
921
+	Leave(context.Context, *LeaveRequest) (*LeaveResponse, error)
922
+}
923
+
924
+func RegisterRaftMembershipServer(s *grpc.Server, srv RaftMembershipServer) {
925
+	s.RegisterService(&_RaftMembership_serviceDesc, srv)
926
+}
927
+
928
+func _RaftMembership_Join_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
929
+	in := new(JoinRequest)
866 930
 	if err := dec(in); err != nil {
867 931
 		return nil, err
868 932
 	}
869 933
 	if interceptor == nil {
870
-		return srv.(RaftServer).ProcessRaftMessage(ctx, in)
934
+		return srv.(RaftMembershipServer).Join(ctx, in)
871 935
 	}
872 936
 	info := &grpc.UnaryServerInfo{
873 937
 		Server:     srv,
874
-		FullMethod: "/docker.swarmkit.v1.Raft/ProcessRaftMessage",
938
+		FullMethod: "/docker.swarmkit.v1.RaftMembership/Join",
875 939
 	}
876 940
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
877
-		return srv.(RaftServer).ProcessRaftMessage(ctx, req.(*ProcessRaftMessageRequest))
941
+		return srv.(RaftMembershipServer).Join(ctx, req.(*JoinRequest))
878 942
 	}
879 943
 	return interceptor(ctx, in, info, handler)
880 944
 }
881 945
 
882
-func _Raft_ResolveAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
883
-	in := new(ResolveAddressRequest)
946
+func _RaftMembership_Leave_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
947
+	in := new(LeaveRequest)
884 948
 	if err := dec(in); err != nil {
885 949
 		return nil, err
886 950
 	}
887 951
 	if interceptor == nil {
888
-		return srv.(RaftServer).ResolveAddress(ctx, in)
952
+		return srv.(RaftMembershipServer).Leave(ctx, in)
889 953
 	}
890 954
 	info := &grpc.UnaryServerInfo{
891 955
 		Server:     srv,
892
-		FullMethod: "/docker.swarmkit.v1.Raft/ResolveAddress",
956
+		FullMethod: "/docker.swarmkit.v1.RaftMembership/Leave",
893 957
 	}
894 958
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
895
-		return srv.(RaftServer).ResolveAddress(ctx, req.(*ResolveAddressRequest))
959
+		return srv.(RaftMembershipServer).Leave(ctx, req.(*LeaveRequest))
896 960
 	}
897 961
 	return interceptor(ctx, in, info, handler)
898 962
 }
899 963
 
900
-var _Raft_serviceDesc = grpc.ServiceDesc{
901
-	ServiceName: "docker.swarmkit.v1.Raft",
902
-	HandlerType: (*RaftServer)(nil),
964
+var _RaftMembership_serviceDesc = grpc.ServiceDesc{
965
+	ServiceName: "docker.swarmkit.v1.RaftMembership",
966
+	HandlerType: (*RaftMembershipServer)(nil),
903 967
 	Methods: []grpc.MethodDesc{
904 968
 		{
905 969
 			MethodName: "Join",
906
-			Handler:    _Raft_Join_Handler,
970
+			Handler:    _RaftMembership_Join_Handler,
907 971
 		},
908 972
 		{
909 973
 			MethodName: "Leave",
910
-			Handler:    _Raft_Leave_Handler,
911
-		},
912
-		{
913
-			MethodName: "ProcessRaftMessage",
914
-			Handler:    _Raft_ProcessRaftMessage_Handler,
915
-		},
916
-		{
917
-			MethodName: "ResolveAddress",
918
-			Handler:    _Raft_ResolveAddress_Handler,
974
+			Handler:    _RaftMembership_Leave_Handler,
919 975
 		},
920 976
 	},
921 977
 	Streams: []grpc.StreamDesc{},
922 978
 }
923 979
 
980
+func (m *RaftMember) Marshal() (data []byte, err error) {
981
+	size := m.Size()
982
+	data = make([]byte, size)
983
+	n, err := m.MarshalTo(data)
984
+	if err != nil {
985
+		return nil, err
986
+	}
987
+	return data[:n], nil
988
+}
989
+
990
+func (m *RaftMember) MarshalTo(data []byte) (int, error) {
991
+	var i int
992
+	_ = i
993
+	var l int
994
+	_ = l
995
+	if m.RaftID != 0 {
996
+		data[i] = 0x8
997
+		i++
998
+		i = encodeVarintRaft(data, i, uint64(m.RaftID))
999
+	}
1000
+	if len(m.NodeID) > 0 {
1001
+		data[i] = 0x12
1002
+		i++
1003
+		i = encodeVarintRaft(data, i, uint64(len(m.NodeID)))
1004
+		i += copy(data[i:], m.NodeID)
1005
+	}
1006
+	if len(m.Addr) > 0 {
1007
+		data[i] = 0x1a
1008
+		i++
1009
+		i = encodeVarintRaft(data, i, uint64(len(m.Addr)))
1010
+		i += copy(data[i:], m.Addr)
1011
+	}
1012
+	data[i] = 0x22
1013
+	i++
1014
+	i = encodeVarintRaft(data, i, uint64(m.Status.Size()))
1015
+	n1, err := m.Status.MarshalTo(data[i:])
1016
+	if err != nil {
1017
+		return 0, err
1018
+	}
1019
+	i += n1
1020
+	return i, nil
1021
+}
1022
+
924 1023
 func (m *JoinRequest) Marshal() (data []byte, err error) {
925 1024
 	size := m.Size()
926 1025
 	data = make([]byte, size)
... ...
@@ -960,9 +1094,14 @@ func (m *JoinResponse) MarshalTo(data []byte) (int, error) {
960 960
 	_ = i
961 961
 	var l int
962 962
 	_ = l
963
+	if m.RaftID != 0 {
964
+		data[i] = 0x8
965
+		i++
966
+		i = encodeVarintRaft(data, i, uint64(m.RaftID))
967
+	}
963 968
 	if len(m.Members) > 0 {
964 969
 		for _, msg := range m.Members {
965
-			data[i] = 0xa
970
+			data[i] = 0x12
966 971
 			i++
967 972
 			i = encodeVarintRaft(data, i, uint64(msg.Size()))
968 973
 			n, err := msg.MarshalTo(data[i:])
... ...
@@ -994,11 +1133,11 @@ func (m *LeaveRequest) MarshalTo(data []byte) (int, error) {
994 994
 		data[i] = 0xa
995 995
 		i++
996 996
 		i = encodeVarintRaft(data, i, uint64(m.Node.Size()))
997
-		n1, err := m.Node.MarshalTo(data[i:])
997
+		n2, err := m.Node.MarshalTo(data[i:])
998 998
 		if err != nil {
999 999
 			return 0, err
1000 1000
 		}
1001
-		i += n1
1001
+		i += n2
1002 1002
 	}
1003 1003
 	return i, nil
1004 1004
 }
... ...
@@ -1040,11 +1179,11 @@ func (m *ProcessRaftMessageRequest) MarshalTo(data []byte) (int, error) {
1040 1040
 		data[i] = 0xa
1041 1041
 		i++
1042 1042
 		i = encodeVarintRaft(data, i, uint64(m.Message.Size()))
1043
-		n2, err := m.Message.MarshalTo(data[i:])
1043
+		n3, err := m.Message.MarshalTo(data[i:])
1044 1044
 		if err != nil {
1045 1045
 			return 0, err
1046 1046
 		}
1047
-		i += n2
1047
+		i += n3
1048 1048
 	}
1049 1049
 	return i, nil
1050 1050
 }
... ...
@@ -1170,11 +1309,11 @@ func (m *StoreAction) MarshalTo(data []byte) (int, error) {
1170 1170
 		i = encodeVarintRaft(data, i, uint64(m.Action))
1171 1171
 	}
1172 1172
 	if m.Target != nil {
1173
-		nn3, err := m.Target.MarshalTo(data[i:])
1173
+		nn4, err := m.Target.MarshalTo(data[i:])
1174 1174
 		if err != nil {
1175 1175
 			return 0, err
1176 1176
 		}
1177
-		i += nn3
1177
+		i += nn4
1178 1178
 	}
1179 1179
 	return i, nil
1180 1180
 }
... ...
@@ -1185,11 +1324,11 @@ func (m *StoreAction_Node) MarshalTo(data []byte) (int, error) {
1185 1185
 		data[i] = 0x12
1186 1186
 		i++
1187 1187
 		i = encodeVarintRaft(data, i, uint64(m.Node.Size()))
1188
-		n4, err := m.Node.MarshalTo(data[i:])
1188
+		n5, err := m.Node.MarshalTo(data[i:])
1189 1189
 		if err != nil {
1190 1190
 			return 0, err
1191 1191
 		}
1192
-		i += n4
1192
+		i += n5
1193 1193
 	}
1194 1194
 	return i, nil
1195 1195
 }
... ...
@@ -1199,11 +1338,11 @@ func (m *StoreAction_Service) MarshalTo(data []byte) (int, error) {
1199 1199
 		data[i] = 0x1a
1200 1200
 		i++
1201 1201
 		i = encodeVarintRaft(data, i, uint64(m.Service.Size()))
1202
-		n5, err := m.Service.MarshalTo(data[i:])
1202
+		n6, err := m.Service.MarshalTo(data[i:])
1203 1203
 		if err != nil {
1204 1204
 			return 0, err
1205 1205
 		}
1206
-		i += n5
1206
+		i += n6
1207 1207
 	}
1208 1208
 	return i, nil
1209 1209
 }
... ...
@@ -1213,11 +1352,11 @@ func (m *StoreAction_Task) MarshalTo(data []byte) (int, error) {
1213 1213
 		data[i] = 0x22
1214 1214
 		i++
1215 1215
 		i = encodeVarintRaft(data, i, uint64(m.Task.Size()))
1216
-		n6, err := m.Task.MarshalTo(data[i:])
1216
+		n7, err := m.Task.MarshalTo(data[i:])
1217 1217
 		if err != nil {
1218 1218
 			return 0, err
1219 1219
 		}
1220
-		i += n6
1220
+		i += n7
1221 1221
 	}
1222 1222
 	return i, nil
1223 1223
 }
... ...
@@ -1227,11 +1366,11 @@ func (m *StoreAction_Network) MarshalTo(data []byte) (int, error) {
1227 1227
 		data[i] = 0x2a
1228 1228
 		i++
1229 1229
 		i = encodeVarintRaft(data, i, uint64(m.Network.Size()))
1230
-		n7, err := m.Network.MarshalTo(data[i:])
1230
+		n8, err := m.Network.MarshalTo(data[i:])
1231 1231
 		if err != nil {
1232 1232
 			return 0, err
1233 1233
 		}
1234
-		i += n7
1234
+		i += n8
1235 1235
 	}
1236 1236
 	return i, nil
1237 1237
 }
... ...
@@ -1241,11 +1380,11 @@ func (m *StoreAction_Cluster) MarshalTo(data []byte) (int, error) {
1241 1241
 		data[i] = 0x32
1242 1242
 		i++
1243 1243
 		i = encodeVarintRaft(data, i, uint64(m.Cluster.Size()))
1244
-		n8, err := m.Cluster.MarshalTo(data[i:])
1244
+		n9, err := m.Cluster.MarshalTo(data[i:])
1245 1245
 		if err != nil {
1246 1246
 			return 0, err
1247 1247
 		}
1248
-		i += n8
1248
+		i += n9
1249 1249
 	}
1250 1250
 	return i, nil
1251 1251
 }
... ...
@@ -1322,10 +1461,10 @@ func (p *raftProxyRaftServer) runCtxMods(ctx context.Context) (context.Context,
1322 1322
 	return ctx, nil
1323 1323
 }
1324 1324
 
1325
-func (p *raftProxyRaftServer) Join(ctx context.Context, r *JoinRequest) (*JoinResponse, error) {
1325
+func (p *raftProxyRaftServer) ProcessRaftMessage(ctx context.Context, r *ProcessRaftMessageRequest) (*ProcessRaftMessageResponse, error) {
1326 1326
 
1327 1327
 	if p.cluster.IsLeader() {
1328
-		return p.local.Join(ctx, r)
1328
+		return p.local.ProcessRaftMessage(ctx, r)
1329 1329
 	}
1330 1330
 	ctx, err := p.runCtxMods(ctx)
1331 1331
 	if err != nil {
... ...
@@ -1335,13 +1474,13 @@ func (p *raftProxyRaftServer) Join(ctx context.Context, r *JoinRequest) (*JoinRe
1335 1335
 	if err != nil {
1336 1336
 		return nil, err
1337 1337
 	}
1338
-	return NewRaftClient(conn).Join(ctx, r)
1338
+	return NewRaftClient(conn).ProcessRaftMessage(ctx, r)
1339 1339
 }
1340 1340
 
1341
-func (p *raftProxyRaftServer) Leave(ctx context.Context, r *LeaveRequest) (*LeaveResponse, error) {
1341
+func (p *raftProxyRaftServer) ResolveAddress(ctx context.Context, r *ResolveAddressRequest) (*ResolveAddressResponse, error) {
1342 1342
 
1343 1343
 	if p.cluster.IsLeader() {
1344
-		return p.local.Leave(ctx, r)
1344
+		return p.local.ResolveAddress(ctx, r)
1345 1345
 	}
1346 1346
 	ctx, err := p.runCtxMods(ctx)
1347 1347
 	if err != nil {
... ...
@@ -1351,13 +1490,58 @@ func (p *raftProxyRaftServer) Leave(ctx context.Context, r *LeaveRequest) (*Leav
1351 1351
 	if err != nil {
1352 1352
 		return nil, err
1353 1353
 	}
1354
-	return NewRaftClient(conn).Leave(ctx, r)
1354
+	return NewRaftClient(conn).ResolveAddress(ctx, r)
1355 1355
 }
1356 1356
 
1357
-func (p *raftProxyRaftServer) ProcessRaftMessage(ctx context.Context, r *ProcessRaftMessageRequest) (*ProcessRaftMessageResponse, error) {
1357
+type raftProxyRaftMembershipServer struct {
1358
+	local        RaftMembershipServer
1359
+	connSelector *raftpicker.ConnSelector
1360
+	cluster      raftpicker.RaftCluster
1361
+	ctxMods      []func(context.Context) (context.Context, error)
1362
+}
1363
+
1364
+func NewRaftProxyRaftMembershipServer(local RaftMembershipServer, connSelector *raftpicker.ConnSelector, cluster raftpicker.RaftCluster, ctxMod func(context.Context) (context.Context, error)) RaftMembershipServer {
1365
+	redirectChecker := func(ctx context.Context) (context.Context, error) {
1366
+		s, ok := transport.StreamFromContext(ctx)
1367
+		if !ok {
1368
+			return ctx, grpc.Errorf(codes.InvalidArgument, "remote addr is not found in context")
1369
+		}
1370
+		addr := s.ServerTransport().RemoteAddr().String()
1371
+		md, ok := metadata.FromContext(ctx)
1372
+		if ok && len(md["redirect"]) != 0 {
1373
+			return ctx, grpc.Errorf(codes.ResourceExhausted, "more than one redirect to leader from: %s", md["redirect"])
1374
+		}
1375
+		if !ok {
1376
+			md = metadata.New(map[string]string{})
1377
+		}
1378
+		md["redirect"] = append(md["redirect"], addr)
1379
+		return metadata.NewContext(ctx, md), nil
1380
+	}
1381
+	mods := []func(context.Context) (context.Context, error){redirectChecker}
1382
+	mods = append(mods, ctxMod)
1383
+
1384
+	return &raftProxyRaftMembershipServer{
1385
+		local:        local,
1386
+		cluster:      cluster,
1387
+		connSelector: connSelector,
1388
+		ctxMods:      mods,
1389
+	}
1390
+}
1391
+func (p *raftProxyRaftMembershipServer) runCtxMods(ctx context.Context) (context.Context, error) {
1392
+	var err error
1393
+	for _, mod := range p.ctxMods {
1394
+		ctx, err = mod(ctx)
1395
+		if err != nil {
1396
+			return ctx, err
1397
+		}
1398
+	}
1399
+	return ctx, nil
1400
+}
1401
+
1402
+func (p *raftProxyRaftMembershipServer) Join(ctx context.Context, r *JoinRequest) (*JoinResponse, error) {
1358 1403
 
1359 1404
 	if p.cluster.IsLeader() {
1360
-		return p.local.ProcessRaftMessage(ctx, r)
1405
+		return p.local.Join(ctx, r)
1361 1406
 	}
1362 1407
 	ctx, err := p.runCtxMods(ctx)
1363 1408
 	if err != nil {
... ...
@@ -1367,13 +1551,13 @@ func (p *raftProxyRaftServer) ProcessRaftMessage(ctx context.Context, r *Process
1367 1367
 	if err != nil {
1368 1368
 		return nil, err
1369 1369
 	}
1370
-	return NewRaftClient(conn).ProcessRaftMessage(ctx, r)
1370
+	return NewRaftMembershipClient(conn).Join(ctx, r)
1371 1371
 }
1372 1372
 
1373
-func (p *raftProxyRaftServer) ResolveAddress(ctx context.Context, r *ResolveAddressRequest) (*ResolveAddressResponse, error) {
1373
+func (p *raftProxyRaftMembershipServer) Leave(ctx context.Context, r *LeaveRequest) (*LeaveResponse, error) {
1374 1374
 
1375 1375
 	if p.cluster.IsLeader() {
1376
-		return p.local.ResolveAddress(ctx, r)
1376
+		return p.local.Leave(ctx, r)
1377 1377
 	}
1378 1378
 	ctx, err := p.runCtxMods(ctx)
1379 1379
 	if err != nil {
... ...
@@ -1383,7 +1567,26 @@ func (p *raftProxyRaftServer) ResolveAddress(ctx context.Context, r *ResolveAddr
1383 1383
 	if err != nil {
1384 1384
 		return nil, err
1385 1385
 	}
1386
-	return NewRaftClient(conn).ResolveAddress(ctx, r)
1386
+	return NewRaftMembershipClient(conn).Leave(ctx, r)
1387
+}
1388
+
1389
+func (m *RaftMember) Size() (n int) {
1390
+	var l int
1391
+	_ = l
1392
+	if m.RaftID != 0 {
1393
+		n += 1 + sovRaft(uint64(m.RaftID))
1394
+	}
1395
+	l = len(m.NodeID)
1396
+	if l > 0 {
1397
+		n += 1 + l + sovRaft(uint64(l))
1398
+	}
1399
+	l = len(m.Addr)
1400
+	if l > 0 {
1401
+		n += 1 + l + sovRaft(uint64(l))
1402
+	}
1403
+	l = m.Status.Size()
1404
+	n += 1 + l + sovRaft(uint64(l))
1405
+	return n
1387 1406
 }
1388 1407
 
1389 1408
 func (m *JoinRequest) Size() (n int) {
... ...
@@ -1399,6 +1602,9 @@ func (m *JoinRequest) Size() (n int) {
1399 1399
 func (m *JoinResponse) Size() (n int) {
1400 1400
 	var l int
1401 1401
 	_ = l
1402
+	if m.RaftID != 0 {
1403
+		n += 1 + sovRaft(uint64(m.RaftID))
1404
+	}
1402 1405
 	if len(m.Members) > 0 {
1403 1406
 		for _, e := range m.Members {
1404 1407
 			l = e.Size()
... ...
@@ -1545,6 +1751,19 @@ func sovRaft(x uint64) (n int) {
1545 1545
 func sozRaft(x uint64) (n int) {
1546 1546
 	return sovRaft(uint64((x << 1) ^ uint64((int64(x) >> 63))))
1547 1547
 }
1548
+func (this *RaftMember) String() string {
1549
+	if this == nil {
1550
+		return "nil"
1551
+	}
1552
+	s := strings.Join([]string{`&RaftMember{`,
1553
+		`RaftID:` + fmt.Sprintf("%v", this.RaftID) + `,`,
1554
+		`NodeID:` + fmt.Sprintf("%v", this.NodeID) + `,`,
1555
+		`Addr:` + fmt.Sprintf("%v", this.Addr) + `,`,
1556
+		`Status:` + strings.Replace(strings.Replace(this.Status.String(), "RaftMemberStatus", "RaftMemberStatus", 1), `&`, ``, 1) + `,`,
1557
+		`}`,
1558
+	}, "")
1559
+	return s
1560
+}
1548 1561
 func (this *JoinRequest) String() string {
1549 1562
 	if this == nil {
1550 1563
 		return "nil"
... ...
@@ -1560,6 +1779,7 @@ func (this *JoinResponse) String() string {
1560 1560
 		return "nil"
1561 1561
 	}
1562 1562
 	s := strings.Join([]string{`&JoinResponse{`,
1563
+		`RaftID:` + fmt.Sprintf("%v", this.RaftID) + `,`,
1563 1564
 		`Members:` + strings.Replace(fmt.Sprintf("%v", this.Members), "RaftMember", "RaftMember", 1) + `,`,
1564 1565
 		`}`,
1565 1566
 	}, "")
... ...
@@ -1703,6 +1923,163 @@ func valueToStringRaft(v interface{}) string {
1703 1703
 	pv := reflect.Indirect(rv).Interface()
1704 1704
 	return fmt.Sprintf("*%v", pv)
1705 1705
 }
1706
+func (m *RaftMember) Unmarshal(data []byte) error {
1707
+	l := len(data)
1708
+	iNdEx := 0
1709
+	for iNdEx < l {
1710
+		preIndex := iNdEx
1711
+		var wire uint64
1712
+		for shift := uint(0); ; shift += 7 {
1713
+			if shift >= 64 {
1714
+				return ErrIntOverflowRaft
1715
+			}
1716
+			if iNdEx >= l {
1717
+				return io.ErrUnexpectedEOF
1718
+			}
1719
+			b := data[iNdEx]
1720
+			iNdEx++
1721
+			wire |= (uint64(b) & 0x7F) << shift
1722
+			if b < 0x80 {
1723
+				break
1724
+			}
1725
+		}
1726
+		fieldNum := int32(wire >> 3)
1727
+		wireType := int(wire & 0x7)
1728
+		if wireType == 4 {
1729
+			return fmt.Errorf("proto: RaftMember: wiretype end group for non-group")
1730
+		}
1731
+		if fieldNum <= 0 {
1732
+			return fmt.Errorf("proto: RaftMember: illegal tag %d (wire type %d)", fieldNum, wire)
1733
+		}
1734
+		switch fieldNum {
1735
+		case 1:
1736
+			if wireType != 0 {
1737
+				return fmt.Errorf("proto: wrong wireType = %d for field RaftID", wireType)
1738
+			}
1739
+			m.RaftID = 0
1740
+			for shift := uint(0); ; shift += 7 {
1741
+				if shift >= 64 {
1742
+					return ErrIntOverflowRaft
1743
+				}
1744
+				if iNdEx >= l {
1745
+					return io.ErrUnexpectedEOF
1746
+				}
1747
+				b := data[iNdEx]
1748
+				iNdEx++
1749
+				m.RaftID |= (uint64(b) & 0x7F) << shift
1750
+				if b < 0x80 {
1751
+					break
1752
+				}
1753
+			}
1754
+		case 2:
1755
+			if wireType != 2 {
1756
+				return fmt.Errorf("proto: wrong wireType = %d for field NodeID", wireType)
1757
+			}
1758
+			var stringLen uint64
1759
+			for shift := uint(0); ; shift += 7 {
1760
+				if shift >= 64 {
1761
+					return ErrIntOverflowRaft
1762
+				}
1763
+				if iNdEx >= l {
1764
+					return io.ErrUnexpectedEOF
1765
+				}
1766
+				b := data[iNdEx]
1767
+				iNdEx++
1768
+				stringLen |= (uint64(b) & 0x7F) << shift
1769
+				if b < 0x80 {
1770
+					break
1771
+				}
1772
+			}
1773
+			intStringLen := int(stringLen)
1774
+			if intStringLen < 0 {
1775
+				return ErrInvalidLengthRaft
1776
+			}
1777
+			postIndex := iNdEx + intStringLen
1778
+			if postIndex > l {
1779
+				return io.ErrUnexpectedEOF
1780
+			}
1781
+			m.NodeID = string(data[iNdEx:postIndex])
1782
+			iNdEx = postIndex
1783
+		case 3:
1784
+			if wireType != 2 {
1785
+				return fmt.Errorf("proto: wrong wireType = %d for field Addr", wireType)
1786
+			}
1787
+			var stringLen uint64
1788
+			for shift := uint(0); ; shift += 7 {
1789
+				if shift >= 64 {
1790
+					return ErrIntOverflowRaft
1791
+				}
1792
+				if iNdEx >= l {
1793
+					return io.ErrUnexpectedEOF
1794
+				}
1795
+				b := data[iNdEx]
1796
+				iNdEx++
1797
+				stringLen |= (uint64(b) & 0x7F) << shift
1798
+				if b < 0x80 {
1799
+					break
1800
+				}
1801
+			}
1802
+			intStringLen := int(stringLen)
1803
+			if intStringLen < 0 {
1804
+				return ErrInvalidLengthRaft
1805
+			}
1806
+			postIndex := iNdEx + intStringLen
1807
+			if postIndex > l {
1808
+				return io.ErrUnexpectedEOF
1809
+			}
1810
+			m.Addr = string(data[iNdEx:postIndex])
1811
+			iNdEx = postIndex
1812
+		case 4:
1813
+			if wireType != 2 {
1814
+				return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType)
1815
+			}
1816
+			var msglen int
1817
+			for shift := uint(0); ; shift += 7 {
1818
+				if shift >= 64 {
1819
+					return ErrIntOverflowRaft
1820
+				}
1821
+				if iNdEx >= l {
1822
+					return io.ErrUnexpectedEOF
1823
+				}
1824
+				b := data[iNdEx]
1825
+				iNdEx++
1826
+				msglen |= (int(b) & 0x7F) << shift
1827
+				if b < 0x80 {
1828
+					break
1829
+				}
1830
+			}
1831
+			if msglen < 0 {
1832
+				return ErrInvalidLengthRaft
1833
+			}
1834
+			postIndex := iNdEx + msglen
1835
+			if postIndex > l {
1836
+				return io.ErrUnexpectedEOF
1837
+			}
1838
+			if err := m.Status.Unmarshal(data[iNdEx:postIndex]); err != nil {
1839
+				return err
1840
+			}
1841
+			iNdEx = postIndex
1842
+		default:
1843
+			iNdEx = preIndex
1844
+			skippy, err := skipRaft(data[iNdEx:])
1845
+			if err != nil {
1846
+				return err
1847
+			}
1848
+			if skippy < 0 {
1849
+				return ErrInvalidLengthRaft
1850
+			}
1851
+			if (iNdEx + skippy) > l {
1852
+				return io.ErrUnexpectedEOF
1853
+			}
1854
+			iNdEx += skippy
1855
+		}
1856
+	}
1857
+
1858
+	if iNdEx > l {
1859
+		return io.ErrUnexpectedEOF
1860
+	}
1861
+	return nil
1862
+}
1706 1863
 func (m *JoinRequest) Unmarshal(data []byte) error {
1707 1864
 	l := len(data)
1708 1865
 	iNdEx := 0
... ...
@@ -1812,6 +2189,25 @@ func (m *JoinResponse) Unmarshal(data []byte) error {
1812 1812
 		}
1813 1813
 		switch fieldNum {
1814 1814
 		case 1:
1815
+			if wireType != 0 {
1816
+				return fmt.Errorf("proto: wrong wireType = %d for field RaftID", wireType)
1817
+			}
1818
+			m.RaftID = 0
1819
+			for shift := uint(0); ; shift += 7 {
1820
+				if shift >= 64 {
1821
+					return ErrIntOverflowRaft
1822
+				}
1823
+				if iNdEx >= l {
1824
+					return io.ErrUnexpectedEOF
1825
+				}
1826
+				b := data[iNdEx]
1827
+				iNdEx++
1828
+				m.RaftID |= (uint64(b) & 0x7F) << shift
1829
+				if b < 0x80 {
1830
+					break
1831
+				}
1832
+			}
1833
+		case 2:
1815 1834
 			if wireType != 2 {
1816 1835
 				return fmt.Errorf("proto: wrong wireType = %d for field Members", wireType)
1817 1836
 			}
... ...
@@ -2712,53 +3108,58 @@ var (
2712 2712
 )
2713 2713
 
2714 2714
 var fileDescriptorRaft = []byte{
2715
-	// 757 bytes of a gzipped FileDescriptorProto
2716
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x8c, 0x95, 0xcf, 0x52, 0xd3, 0x40,
2717
-	0x1c, 0xc7, 0xfb, 0x27, 0xb4, 0xba, 0xe5, 0xdf, 0x2c, 0x82, 0x25, 0x32, 0x05, 0xc2, 0x41, 0x60,
2718
-	0x24, 0x1d, 0xeb, 0x41, 0x47, 0xbd, 0xb4, 0xa5, 0x33, 0x54, 0xa0, 0x65, 0x42, 0xab, 0xdc, 0x30,
2719
-	0x4d, 0x96, 0x1a, 0xdb, 0x66, 0x6b, 0x76, 0x5b, 0xc6, 0x8b, 0xc3, 0xd1, 0xe1, 0x05, 0xf4, 0xe2,
2720
-	0x49, 0xcf, 0x3e, 0x80, 0x4f, 0xc0, 0x78, 0xf2, 0xe8, 0x78, 0x50, 0xe1, 0x01, 0xd4, 0x47, 0x70,
2721
-	0x77, 0x93, 0x20, 0x96, 0xb4, 0x70, 0xd8, 0x76, 0xbb, 0xfb, 0xf9, 0x7e, 0xbf, 0x9b, 0xdd, 0xec,
2722
-	0xaf, 0x00, 0x38, 0xfa, 0x1e, 0x55, 0xdb, 0x0e, 0xa6, 0x18, 0x42, 0x13, 0x1b, 0x0d, 0xe4, 0xa8,
2723
-	0x64, 0x5f, 0x77, 0x5a, 0x0d, 0x8b, 0xaa, 0xdd, 0xdb, 0xf2, 0x08, 0xae, 0x3d, 0x47, 0x06, 0x25,
2724
-	0x2e, 0x22, 0x27, 0xe8, 0xcb, 0x36, 0xf2, 0x7f, 0xac, 0xd4, 0x2d, 0xfa, 0xac, 0x53, 0x53, 0x0d,
2725
-	0xdc, 0x4a, 0x1b, 0xd8, 0x41, 0x98, 0xa4, 0x11, 0x35, 0xcc, 0x34, 0xb7, 0x14, 0x1f, 0xed, 0x5a,
2726
-	0xfa, 0x9f, 0xbd, 0x7c, 0xad, 0x8e, 0xeb, 0x58, 0x74, 0xd3, 0xbc, 0xe7, 0x8d, 0x4e, 0xb4, 0x9b,
2727
-	0x9d, 0xba, 0x65, 0xa7, 0xdd, 0x2f, 0x77, 0x50, 0x99, 0x07, 0x89, 0x47, 0xd8, 0xb2, 0x35, 0xf4,
2728
-	0xa2, 0x83, 0x08, 0x85, 0x10, 0x48, 0xba, 0x69, 0x3a, 0xc9, 0xf0, 0x5c, 0x78, 0xf1, 0xaa, 0x26,
2729
-	0xfa, 0xca, 0x1a, 0x18, 0x76, 0x11, 0xd2, 0xc6, 0x36, 0x41, 0xf0, 0x1e, 0x88, 0xb7, 0x50, 0xab,
2730
-	0x86, 0x1c, 0xc2, 0xb0, 0xe8, 0x62, 0x22, 0x93, 0x52, 0xcf, 0x3f, 0x8e, 0xaa, 0xb1, 0xe5, 0x6c,
2731
-	0x0a, 0x4c, 0xf3, 0x71, 0x25, 0x07, 0x86, 0x37, 0x90, 0xde, 0x45, 0x7e, 0x5a, 0x06, 0x48, 0x36,
2732
-	0x36, 0x91, 0x48, 0xbb, 0xd8, 0x46, 0xb0, 0xca, 0x18, 0x18, 0xf1, 0x3c, 0xdc, 0xe5, 0x28, 0x1b,
2733
-	0x60, 0x7a, 0xcb, 0xc1, 0x06, 0x22, 0xc4, 0x65, 0x09, 0xd1, 0xeb, 0xa7, 0x09, 0x4b, 0x7c, 0xad,
2734
-	0x62, 0xc4, 0x0b, 0x19, 0x53, 0xdd, 0xed, 0x52, 0x7d, 0xd0, 0x9f, 0xbf, 0x2f, 0x1d, 0xbc, 0x51,
2735
-	0x42, 0xca, 0x0c, 0x90, 0x83, 0xdc, 0xbc, 0xac, 0x87, 0x60, 0x92, 0xf5, 0x71, 0xb3, 0x8b, 0xb2,
2736
-	0x6c, 0x67, 0x38, 0xe4, 0xe5, 0x2c, 0x80, 0x38, 0xf7, 0xdd, 0xb5, 0x4c, 0x91, 0x23, 0xe5, 0xc0,
2737
-	0xc9, 0xf7, 0xd9, 0x18, 0xb7, 0x28, 0xae, 0x6a, 0x31, 0x3e, 0x55, 0x34, 0x95, 0x5b, 0x60, 0xaa,
2738
-	0x57, 0xed, 0x6d, 0x69, 0xd0, 0xb6, 0xef, 0x81, 0x89, 0xa2, 0x4d, 0x91, 0x63, 0xeb, 0x4d, 0xee,
2739
-	0xe3, 0x27, 0x4d, 0x81, 0xc8, 0x69, 0x48, 0x8c, 0x85, 0x44, 0x58, 0x00, 0x1b, 0x81, 0x77, 0x41,
2740
-	0x4c, 0x37, 0xa8, 0x85, 0xed, 0x64, 0x44, 0x1c, 0xca, 0x6c, 0xd0, 0x6e, 0x6e, 0x53, 0xf6, 0xf2,
2741
-	0x64, 0x05, 0xa6, 0x79, 0xb8, 0xf2, 0x23, 0x02, 0x12, 0x67, 0xc6, 0xe1, 0x83, 0x53, 0x23, 0x1e,
2742
-	0x32, 0x9a, 0x59, 0xb8, 0xc0, 0x68, 0xdd, 0xb2, 0x4d, 0xdf, 0x0c, 0xaa, 0xde, 0x89, 0x46, 0xc4,
2743
-	0x66, 0x27, 0x83, 0xa4, 0x25, 0x36, 0xbf, 0x16, 0x72, 0x4f, 0x93, 0xad, 0x3a, 0x4e, 0x90, 0xd3,
2744
-	0xb5, 0x0c, 0x94, 0x8c, 0x0a, 0xc9, 0x8d, 0xc0, 0x34, 0x17, 0x61, 0x2a, 0x9f, 0xe6, 0x41, 0x54,
2745
-	0x27, 0x8d, 0xa4, 0xd4, 0x3f, 0xa8, 0xc2, 0xe6, 0x79, 0x10, 0xe7, 0x78, 0x90, 0x8d, 0xe8, 0x3e,
2746
-	0x76, 0x1a, 0xc9, 0xa1, 0xfe, 0x41, 0x25, 0x17, 0xe1, 0x41, 0x1e, 0xcd, 0x85, 0x46, 0xb3, 0x43,
2747
-	0xd8, 0x41, 0x24, 0x63, 0xfd, 0x85, 0x79, 0x17, 0xe1, 0x42, 0x8f, 0xce, 0x5d, 0x01, 0x31, 0xaa,
2748
-	0x3b, 0x75, 0x44, 0x97, 0x7f, 0x87, 0xc1, 0x58, 0xcf, 0x86, 0xc1, 0x9b, 0x20, 0x5e, 0x2d, 0xad,
2749
-	0x97, 0xca, 0x4f, 0x4a, 0xe3, 0x21, 0x59, 0x3e, 0x7c, 0x37, 0x37, 0xd5, 0x43, 0x54, 0xed, 0x86,
2750
-	0x8d, 0xf7, 0x6d, 0x76, 0x47, 0x26, 0xb6, 0x2b, 0x65, 0xad, 0xb0, 0x9b, 0xcd, 0x57, 0x8a, 0xe5,
2751
-	0xd2, 0x6e, 0x5e, 0x2b, 0x64, 0x2b, 0x85, 0xf1, 0xb0, 0x3c, 0xcd, 0x44, 0x93, 0x3d, 0xa2, 0xbc,
2752
-	0x83, 0x74, 0x8a, 0xce, 0x69, 0xaa, 0x5b, 0xab, 0x5c, 0x13, 0x09, 0xd4, 0x54, 0xdb, 0x66, 0x90,
2753
-	0x46, 0x2b, 0x6c, 0x96, 0x1f, 0x17, 0xc6, 0xa3, 0x81, 0x1a, 0x0d, 0xb5, 0x70, 0x17, 0xc9, 0xd7,
2754
-	0x5f, 0xbf, 0x4f, 0x85, 0x3e, 0x7d, 0x48, 0xf5, 0x3e, 0x5d, 0xe6, 0x5b, 0x14, 0x48, 0xfc, 0xa5,
2755
-	0x85, 0x4f, 0x81, 0xc4, 0x6b, 0x07, 0x0c, 0x7c, 0x1b, 0xcf, 0x14, 0x1e, 0x79, 0xae, 0x3f, 0xe0,
2756
-	0xdd, 0xbd, 0xc9, 0xcf, 0x1f, 0x7f, 0xbd, 0x8d, 0xb0, 0xeb, 0x2f, 0x88, 0x95, 0x96, 0x6e, 0xb3,
2757
-	0x9b, 0xe9, 0x40, 0x03, 0x0c, 0x89, 0x7a, 0x00, 0x03, 0x1d, 0xce, 0x96, 0x1b, 0x79, 0x7e, 0x00,
2758
-	0x31, 0x38, 0xe4, 0x30, 0x0c, 0xe0, 0xf9, 0xb2, 0x00, 0x57, 0x82, 0x0c, 0xfb, 0x16, 0x23, 0x59,
2759
-	0xbd, 0x2c, 0x3e, 0x78, 0x31, 0xaf, 0xc0, 0xe8, 0xff, 0x65, 0x04, 0x2e, 0x05, 0x56, 0xce, 0xa0,
2760
-	0x42, 0x25, 0x2f, 0x5f, 0x06, 0x1d, 0x98, 0x9f, 0x9b, 0x39, 0x3a, 0x4e, 0x85, 0xbe, 0xb2, 0xf6,
2761
-	0xe7, 0x38, 0x15, 0x3e, 0x38, 0x49, 0x85, 0x8f, 0x58, 0xfb, 0xc2, 0xda, 0x4f, 0xd6, 0x76, 0xa2,
2762
-	0x3b, 0x52, 0x2d, 0x26, 0xfe, 0x5b, 0xee, 0xfc, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xeb, 0xbf, 0x94,
2763
-	0x02, 0xf3, 0x06, 0x00, 0x00,
2715
+	// 833 bytes of a gzipped FileDescriptorProto
2716
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x8c, 0x95, 0x4d, 0x53, 0xdb, 0x46,
2717
+	0x18, 0xc7, 0x2d, 0x59, 0xc8, 0xed, 0x9a, 0xb7, 0x59, 0x0a, 0x35, 0x2a, 0x63, 0x40, 0x74, 0xa6,
2718
+	0x85, 0x29, 0xf2, 0xd4, 0x3d, 0xb4, 0xd3, 0xf6, 0x62, 0x1b, 0xcf, 0xd4, 0x05, 0x6c, 0x46, 0xd8,
2719
+	0x2d, 0x37, 0x2a, 0x4b, 0x8b, 0x51, 0x6d, 0x6b, 0x5d, 0xed, 0xda, 0x4c, 0x2f, 0x19, 0x8e, 0x19,
2720
+	0xae, 0x39, 0x24, 0x97, 0x9c, 0x92, 0x33, 0x1f, 0x20, 0x9f, 0x80, 0xc9, 0x29, 0xb7, 0xe4, 0x44,
2721
+	0x02, 0x1f, 0x20, 0xc9, 0x47, 0xc8, 0xae, 0x5e, 0x0c, 0x31, 0xb2, 0xf1, 0x41, 0xb0, 0xec, 0xfe,
2722
+	0xfe, 0xcf, 0xff, 0xd9, 0x67, 0xf7, 0x59, 0x00, 0x70, 0x8d, 0x23, 0xaa, 0x75, 0x5c, 0x4c, 0x31,
2723
+	0x84, 0x16, 0x36, 0x9b, 0xc8, 0xd5, 0xc8, 0x89, 0xe1, 0xb6, 0x9b, 0x36, 0xd5, 0x7a, 0x3f, 0x2a,
2724
+	0x53, 0xb8, 0xfe, 0x2f, 0x32, 0x29, 0xf1, 0x11, 0x25, 0x49, 0xff, 0xef, 0xa0, 0xf0, 0x8f, 0xcd,
2725
+	0x86, 0x4d, 0x8f, 0xbb, 0x75, 0xcd, 0xc4, 0xed, 0x8c, 0x89, 0x5d, 0x84, 0x49, 0x06, 0x51, 0xd3,
2726
+	0xca, 0xf0, 0x90, 0xde, 0x8f, 0x4e, 0x3d, 0x73, 0x13, 0x5e, 0xf9, 0xaa, 0x81, 0x1b, 0xd8, 0x1b,
2727
+	0x66, 0xf8, 0x28, 0x98, 0x9d, 0xeb, 0xb4, 0xba, 0x0d, 0xdb, 0xc9, 0xf8, 0xbf, 0xfc, 0x49, 0xf5,
2728
+	0x5c, 0x00, 0x40, 0x67, 0xca, 0x5d, 0xd4, 0xae, 0x23, 0x17, 0xae, 0x81, 0x04, 0x8f, 0x73, 0x68,
2729
+	0x5b, 0x29, 0x61, 0x45, 0xf8, 0x5e, 0xca, 0x83, 0xeb, 0xcb, 0x65, 0x99, 0x03, 0xa5, 0x2d, 0x5d,
2730
+	0xe6, 0x4b, 0x25, 0x8b, 0x43, 0x0e, 0xb6, 0x10, 0x87, 0x44, 0x06, 0x7d, 0xe9, 0x43, 0x65, 0x36,
2731
+	0xc5, 0x21, 0xbe, 0xc4, 0x20, 0x08, 0x24, 0xc3, 0xb2, 0xdc, 0x54, 0x9c, 0x13, 0xba, 0x37, 0x86,
2732
+	0x79, 0x20, 0x13, 0x6a, 0xd0, 0x2e, 0x49, 0x49, 0x6c, 0x36, 0x99, 0xfd, 0x56, 0xbb, 0x5b, 0x07,
2733
+	0xed, 0x26, 0x9b, 0x7d, 0x8f, 0xcd, 0x4b, 0x17, 0x97, 0xcb, 0x31, 0x3d, 0x50, 0xaa, 0xab, 0x20,
2734
+	0xf9, 0x27, 0xb6, 0x1d, 0x1d, 0xfd, 0xd7, 0x45, 0x84, 0xf6, 0x6d, 0x84, 0x1b, 0x1b, 0xb5, 0x0d,
2735
+	0x26, 0x7d, 0x84, 0x74, 0xb0, 0x43, 0xd0, 0x78, 0x9b, 0xfa, 0x05, 0x24, 0xda, 0x9e, 0x2b, 0x61,
2736
+	0x9b, 0x8a, 0xb3, 0xe4, 0xd2, 0xa3, 0x93, 0xd3, 0x43, 0x5c, 0xcd, 0x83, 0xc9, 0x1d, 0x64, 0xf4,
2737
+	0x50, 0x98, 0x52, 0x16, 0x48, 0xbc, 0x06, 0x9e, 0xd7, 0xfd, 0x61, 0x3c, 0x56, 0x9d, 0x01, 0x53,
2738
+	0x41, 0x0c, 0x3f, 0x67, 0x75, 0x07, 0x2c, 0xee, 0xb9, 0xd8, 0x44, 0x84, 0xf8, 0x2c, 0x21, 0x46,
2739
+	0xa3, 0xef, 0xb0, 0xce, 0x73, 0xf5, 0x66, 0x02, 0x93, 0x19, 0xcd, 0xbf, 0x04, 0x5a, 0x08, 0x86,
2740
+	0xeb, 0xbf, 0x4a, 0xa7, 0x8f, 0xd5, 0x98, 0xba, 0x04, 0x94, 0xa8, 0x68, 0x81, 0xd7, 0xef, 0x60,
2741
+	0x9e, 0x8d, 0x71, 0xab, 0x87, 0x72, 0xac, 0x7c, 0x1c, 0x0a, 0x7c, 0xc6, 0x29, 0x9c, 0xfa, 0x03,
2742
+	0x58, 0x18, 0x54, 0x07, 0x75, 0x8f, 0x3a, 0x9b, 0x23, 0x30, 0x57, 0x72, 0x28, 0x72, 0x1d, 0xa3,
2743
+	0xc5, 0xe3, 0x84, 0x4e, 0x0b, 0x40, 0xec, 0x9b, 0xc8, 0xcc, 0x44, 0x64, 0x06, 0x6c, 0x06, 0xfe,
2744
+	0x0c, 0x64, 0xc3, 0xa4, 0x36, 0x76, 0x82, 0x43, 0x59, 0x8e, 0xaa, 0xe6, 0x3e, 0x65, 0x2d, 0x91,
2745
+	0xf3, 0x30, 0x3d, 0xc0, 0xd5, 0xb7, 0x22, 0x48, 0xde, 0x9a, 0x87, 0xbf, 0xf5, 0x03, 0x71, 0x93,
2746
+	0xe9, 0xec, 0xda, 0x3d, 0x81, 0xb6, 0x6d, 0xc7, 0x0a, 0x83, 0x41, 0x2d, 0x38, 0x51, 0xd1, 0x2b,
2747
+	0x76, 0x2a, 0x4a, 0xca, 0x6f, 0xff, 0x1f, 0x31, 0xff, 0x34, 0x59, 0xd6, 0x09, 0x82, 0xdc, 0x9e,
2748
+	0x6d, 0x22, 0xef, 0xfa, 0x27, 0xb3, 0xdf, 0x44, 0xba, 0xf9, 0x08, 0x53, 0x85, 0x34, 0x37, 0xa2,
2749
+	0x06, 0x69, 0x06, 0xed, 0x11, 0x69, 0x54, 0x65, 0xeb, 0xdc, 0x88, 0x73, 0xdc, 0xc8, 0x41, 0xf4,
2750
+	0x04, 0xbb, 0xcd, 0xd4, 0xc4, 0x70, 0xa3, 0xb2, 0x8f, 0x70, 0xa3, 0x80, 0xe6, 0x42, 0xb3, 0xd5,
2751
+	0x25, 0xec, 0x20, 0x52, 0xf2, 0x70, 0x61, 0xc1, 0x47, 0xb8, 0x30, 0xa0, 0xf3, 0x5f, 0x00, 0x99,
2752
+	0x1a, 0x6e, 0x03, 0xd1, 0x8d, 0x0f, 0x02, 0x98, 0x19, 0x28, 0x18, 0xfc, 0x0e, 0x24, 0x6a, 0xe5,
2753
+	0xed, 0x72, 0xe5, 0xef, 0xf2, 0x6c, 0x4c, 0x51, 0xce, 0x9e, 0xae, 0x2c, 0x0c, 0x10, 0x35, 0xa7,
2754
+	0xe9, 0xe0, 0x13, 0x87, 0xf5, 0xc8, 0xdc, 0x7e, 0xb5, 0xa2, 0x17, 0x0f, 0x73, 0x85, 0x6a, 0xa9,
2755
+	0x52, 0x3e, 0x2c, 0xe8, 0xc5, 0x5c, 0xb5, 0x38, 0x2b, 0x28, 0x8b, 0x4c, 0x34, 0x3f, 0x20, 0x2a,
2756
+	0xb8, 0xc8, 0xa0, 0xe8, 0x8e, 0xa6, 0xb6, 0xb7, 0xc5, 0x35, 0x62, 0xa4, 0xa6, 0xd6, 0xb1, 0xa2,
2757
+	0x34, 0x7a, 0x71, 0xb7, 0xf2, 0x57, 0x71, 0x36, 0x1e, 0xa9, 0xd1, 0x51, 0x1b, 0xf7, 0x90, 0xf2,
2758
+	0xf5, 0xc3, 0x67, 0xe9, 0xd8, 0x8b, 0xe7, 0xe9, 0xc1, 0xdd, 0x65, 0x1f, 0x89, 0x40, 0xe2, 0x97,
2759
+	0x16, 0x9e, 0x09, 0x00, 0xde, 0xed, 0x27, 0xb8, 0x19, 0x55, 0xc3, 0xa1, 0x5d, 0xac, 0x68, 0xe3,
2760
+	0xe2, 0x41, 0x9b, 0xce, 0xbf, 0x3c, 0x7f, 0xff, 0x44, 0x64, 0x2f, 0x85, 0xc7, 0x6f, 0xb6, 0x0d,
2761
+	0x87, 0xad, 0xba, 0xf0, 0x01, 0x98, 0xfe, 0xbc, 0xff, 0xe0, 0x7a, 0xe4, 0x93, 0x13, 0xd5, 0xe1,
2762
+	0xca, 0xc6, 0x38, 0xe8, 0x48, 0xff, 0xec, 0x6b, 0x81, 0x25, 0xd0, 0x7f, 0xcf, 0xc8, 0xb1, 0xdd,
2763
+	0x81, 0xff, 0x00, 0x89, 0x3f, 0xc0, 0x30, 0xb2, 0x5b, 0x6f, 0xbd, 0xde, 0xca, 0xca, 0x70, 0x60,
2764
+	0xf4, 0xa6, 0x4d, 0x30, 0xe1, 0xbd, 0x97, 0x30, 0x32, 0xc2, 0xed, 0xe7, 0x58, 0x59, 0x1d, 0x41,
2765
+	0x8c, 0x34, 0xc9, 0x2f, 0x5d, 0x5c, 0xa5, 0x63, 0x6f, 0xd8, 0xf7, 0xf1, 0x2a, 0x2d, 0x9c, 0x5e,
2766
+	0xa7, 0x85, 0x0b, 0xf6, 0xbd, 0x62, 0xdf, 0x3b, 0xf6, 0x1d, 0xc4, 0x0f, 0xa4, 0xba, 0xec, 0xfd,
2767
+	0x13, 0xfd, 0xe9, 0x53, 0x00, 0x00, 0x00, 0xff, 0xff, 0xa4, 0xfb, 0x14, 0x74, 0xdc, 0x07, 0x00,
2768
+	0x00,
2764 2769
 }
... ...
@@ -10,35 +10,56 @@ import weak "plugin/plugin.proto";
10 10
 
11 11
 // Raft defines the RPC communication between raft nodes.
12 12
 service Raft {
13
-	// Join adds a RaftMember to the raft cluster.
14
-	rpc Join(JoinRequest) returns (JoinResponse) {
13
+	// ProcessRaftMessage sends a raft message to be processed on a raft member, it is
14
+	// called from the RaftMember willing to send a message to its destination ('To' field)
15
+	rpc ProcessRaftMessage(ProcessRaftMessageRequest) returns (ProcessRaftMessageResponse) {
15 16
 		option (docker.protobuf.plugin.tls_authorization) = { roles: "swarm-manager" };
16 17
 	};
17 18
 
18
-	// Leave removes a RaftMember from the raft cluster.
19
-	rpc Leave(LeaveRequest) returns (LeaveResponse) {
19
+	// ResolveAddress returns the address where the node with the given ID can be reached.
20
+	rpc ResolveAddress(ResolveAddressRequest) returns (ResolveAddressResponse) {
20 21
 		option (docker.protobuf.plugin.tls_authorization) = { roles: "swarm-manager" };
21 22
 	};
23
+}
22 24
 
23
-	// ProcessRaftMessage sends a raft message to be processed on a raft member, it is
24
-	// called from the RaftMember willing to send a message to its destination ('To' field)
25
-	rpc ProcessRaftMessage(ProcessRaftMessageRequest) returns (ProcessRaftMessageResponse) {
25
+// RaftMembership defines RPCs for adding and removing members from the
26
+// cluster. These RPCs must always run on the leader, so they are in a separate
27
+// service to support the raft proxy.
28
+service RaftMembership {
29
+	// Join adds a RaftMember to the raft cluster.
30
+	rpc Join(JoinRequest) returns (JoinResponse) {
26 31
 		option (docker.protobuf.plugin.tls_authorization) = { roles: "swarm-manager" };
27 32
 	};
28 33
 
29
-	// ResolveAddress returns the address where the node with the given ID can be reached.
30
-	rpc ResolveAddress(ResolveAddressRequest) returns (ResolveAddressResponse) {
34
+	// Leave removes a RaftMember from the raft cluster.
35
+	rpc Leave(LeaveRequest) returns (LeaveResponse) {
31 36
 		option (docker.protobuf.plugin.tls_authorization) = { roles: "swarm-manager" };
32 37
 	};
33 38
 }
34 39
 
40
+message RaftMember {
41
+	// RaftID specifies the internal ID used by the manager in a raft context, it can never be modified
42
+	// and is used only for information purposes
43
+	uint64 raft_id = 1 [(gogoproto.customname) = "RaftID"];
44
+
45
+	// NodeID is the node's ID.
46
+	string node_id = 2 [(gogoproto.customname) = "NodeID"];
47
+
48
+	// Addr specifies the address of the member
49
+	string addr = 3;
50
+
51
+	// Status provides the current status of the manager from the perspective of another manager.
52
+	RaftMemberStatus status = 4 [(gogoproto.nullable) = false];
53
+}
54
+
35 55
 message JoinRequest {
36 56
 	// Addr specifies the address of the member
37 57
 	string addr = 1;
38 58
 }
39 59
 
40 60
 message JoinResponse {
41
-	repeated RaftMember members = 1;
61
+	uint64 raft_id = 1 [(gogoproto.customname) = "RaftID"];
62
+	repeated RaftMember members = 2;
42 63
 }
43 64
 
44 65
 message LeaveRequest {
... ...
@@ -1086,30 +1086,30 @@ var (
1086 1086
 )
1087 1087
 
1088 1088
 var fileDescriptorSnapshot = []byte{
1089
-	// 387 bytes of a gzipped FileDescriptorProto
1089
+	// 386 bytes of a gzipped FileDescriptorProto
1090 1090
 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x7c, 0x92, 0xbf, 0x4e, 0xf3, 0x30,
1091
-	0x14, 0xc5, 0x9b, 0xf4, 0x4f, 0x2a, 0x57, 0xed, 0xf7, 0x61, 0x31, 0x44, 0x05, 0x05, 0x08, 0x0c,
1092
-	0x9d, 0x02, 0x94, 0x01, 0x16, 0x18, 0xca, 0xc4, 0x40, 0x07, 0x17, 0x55, 0xac, 0x69, 0x6a, 0xda,
1093
-	0x50, 0x12, 0x47, 0xb6, 0x49, 0xc5, 0xc6, 0x73, 0xf0, 0x44, 0x1d, 0x19, 0x99, 0x10, 0x65, 0x61,
1094
-	0xe5, 0x11, 0xb0, 0xe3, 0x24, 0xaa, 0x44, 0xca, 0x70, 0x25, 0xdb, 0xfa, 0x9d, 0x73, 0x6e, 0x6e,
1095
-	0x2e, 0x68, 0xb1, 0xd0, 0x8d, 0xd8, 0x94, 0x70, 0x27, 0xa2, 0x84, 0x13, 0x08, 0xc7, 0xc4, 0x9b,
1096
-	0x61, 0xea, 0xb0, 0xb9, 0x4b, 0x83, 0x99, 0xcf, 0x9d, 0xf8, 0xb8, 0xdd, 0x24, 0xa3, 0x7b, 0xec,
1097
-	0x71, 0xa6, 0x90, 0x76, 0x83, 0x3f, 0x45, 0x38, 0xbb, 0x6c, 0x4e, 0xc8, 0x84, 0x24, 0xc7, 0x43,
1098
-	0x79, 0x52, 0xaf, 0xf6, 0x8b, 0x0e, 0x9a, 0x03, 0x4e, 0x28, 0x1e, 0xa4, 0xee, 0xd0, 0x01, 0xd5,
1099
-	0x90, 0x8c, 0x31, 0x33, 0xb5, 0xdd, 0x72, 0xa7, 0xd1, 0x35, 0x9d, 0xdf, 0x39, 0x4e, 0x5f, 0x00,
1100
-	0x48, 0x61, 0xf0, 0x14, 0xd4, 0x19, 0xa6, 0xb1, 0xef, 0x09, 0x89, 0x9e, 0x48, 0xb6, 0x8a, 0x24,
1101
-	0x03, 0xc5, 0xa0, 0x1c, 0x96, 0xc2, 0x10, 0xf3, 0x39, 0xa1, 0x33, 0x66, 0x96, 0xd7, 0x0b, 0xfb,
1102
-	0x8a, 0x41, 0x39, 0x2c, 0x3b, 0xe4, 0x2e, 0x13, 0xaa, 0xca, 0xfa, 0x0e, 0x6f, 0x04, 0x80, 0x14,
1103
-	0x26, 0x83, 0xbc, 0x87, 0x47, 0xc6, 0x31, 0x65, 0x66, 0x75, 0x7d, 0xd0, 0xa5, 0x62, 0x50, 0x0e,
1104
-	0xdb, 0x18, 0xfc, 0x4b, 0x1f, 0xf3, 0xe9, 0x9c, 0x01, 0x23, 0xc0, 0xc1, 0x48, 0x5a, 0xa9, 0xf9,
1105
-	0x58, 0x45, 0x56, 0xc8, 0xbd, 0xe3, 0xd7, 0x09, 0x86, 0x32, 0x1c, 0x9a, 0xc0, 0xa0, 0x38, 0x20,
1106
-	0x31, 0x1e, 0x27, 0x63, 0xaa, 0xa0, 0xec, 0x6a, 0x7f, 0x69, 0xa0, 0x9e, 0x07, 0x5c, 0x00, 0x23,
1107
-	0x16, 0xb8, 0x4f, 0x42, 0x11, 0xa0, 0x75, 0x5a, 0xdd, 0x83, 0xc2, 0x69, 0x66, 0xbb, 0x30, 0x54,
1108
-	0x2c, 0xca, 0x44, 0xf0, 0x0a, 0x80, 0x34, 0x71, 0xea, 0x47, 0x22, 0x49, 0x13, 0x3d, 0xee, 0xff,
1109
-	0xf1, 0xb9, 0x99, 0x53, 0xaf, 0xb2, 0x78, 0xdf, 0x29, 0xa1, 0x15, 0x31, 0x3c, 0x07, 0x55, 0x26,
1110
-	0x57, 0x43, 0xfc, 0x1d, 0xe9, 0xb2, 0x57, 0xd8, 0xc8, 0xea, 0xee, 0xa4, 0x1e, 0x4a, 0x65, 0x6f,
1111
-	0x00, 0x23, 0xed, 0x0e, 0xd6, 0x80, 0x3e, 0x3c, 0xfa, 0x5f, 0xea, 0x6d, 0x2f, 0x96, 0x56, 0xe9,
1112
-	0x4d, 0xd4, 0xf7, 0xd2, 0xd2, 0x9e, 0x3f, 0x2d, 0x6d, 0x21, 0xea, 0x55, 0xd4, 0x87, 0xa8, 0x5b,
1113
-	0x7d, 0x54, 0x4b, 0x96, 0xf2, 0xe4, 0x27, 0x00, 0x00, 0xff, 0xff, 0x16, 0x1e, 0xaa, 0x44, 0xec,
1114
-	0x02, 0x00, 0x00,
1091
+	0x14, 0xc5, 0x9b, 0xf4, 0x4f, 0xaa, 0xfb, 0xa9, 0xfd, 0xc0, 0x62, 0x88, 0x0a, 0x0a, 0x10, 0x18,
1092
+	0x3a, 0x05, 0x28, 0x03, 0x2c, 0x30, 0x94, 0x89, 0x81, 0x0e, 0x2e, 0xaa, 0x58, 0xd3, 0xd4, 0xb4,
1093
+	0xa1, 0x24, 0xae, 0x6c, 0x93, 0xae, 0x3c, 0x07, 0x4f, 0xd4, 0x91, 0x91, 0x09, 0x51, 0x16, 0x56,
1094
+	0x1e, 0x01, 0x27, 0x4e, 0xa2, 0x4a, 0xa4, 0x0c, 0x57, 0x72, 0xac, 0xdf, 0x39, 0xe7, 0xe6, 0xfa,
1095
+	0x42, 0x93, 0x87, 0xee, 0x8c, 0x4f, 0xa8, 0x70, 0x66, 0x8c, 0x0a, 0x8a, 0xd0, 0x88, 0x7a, 0x53,
1096
+	0xc2, 0x1c, 0x3e, 0x77, 0x59, 0x30, 0xf5, 0x85, 0x13, 0x9d, 0xb4, 0x1a, 0x74, 0xf8, 0x40, 0x3c,
1097
+	0xc1, 0x15, 0xd2, 0x02, 0xe6, 0xde, 0xa7, 0x78, 0x6b, 0x6b, 0x4c, 0xc7, 0x34, 0x39, 0x1e, 0xc5,
1098
+	0x27, 0x75, 0x6b, 0xbf, 0xe8, 0xd0, 0xe8, 0x0b, 0xca, 0x48, 0x3f, 0x35, 0x47, 0x0e, 0x54, 0x43,
1099
+	0x3a, 0x22, 0xdc, 0xd4, 0xf6, 0xca, 0xed, 0x7f, 0x1d, 0xd3, 0xf9, 0x1d, 0xe3, 0xf4, 0x24, 0x80,
1100
+	0x15, 0x86, 0xce, 0xa0, 0xce, 0x09, 0x8b, 0x7c, 0x4f, 0x4a, 0xf4, 0x44, 0xb2, 0x5d, 0x24, 0xe9,
1101
+	0x2b, 0x06, 0xe7, 0x70, 0x2c, 0x0c, 0x89, 0x98, 0x53, 0x36, 0xe5, 0x66, 0x79, 0xbd, 0xb0, 0xa7,
1102
+	0x18, 0x9c, 0xc3, 0x71, 0x87, 0xc2, 0xe5, 0x52, 0x55, 0x59, 0xdf, 0xe1, 0xad, 0x04, 0xb0, 0xc2,
1103
+	0xe2, 0x20, 0xef, 0xf1, 0x89, 0x0b, 0xc2, 0xb8, 0x59, 0x5d, 0x1f, 0x74, 0xa5, 0x18, 0x9c, 0xc3,
1104
+	0x36, 0x81, 0xff, 0xe9, 0x65, 0x3e, 0x9d, 0x73, 0x30, 0x02, 0x12, 0x0c, 0x63, 0x2b, 0x35, 0x1f,
1105
+	0xab, 0xc8, 0x0a, 0xcb, 0xb1, 0xdf, 0x24, 0x18, 0xce, 0x70, 0x64, 0x82, 0xc1, 0x48, 0x40, 0x23,
1106
+	0x32, 0x4a, 0xc6, 0x54, 0xc1, 0xd9, 0xa7, 0xfd, 0xa5, 0x41, 0x3d, 0x0f, 0xb8, 0x04, 0x23, 0x92,
1107
+	0xb8, 0x4f, 0x43, 0x19, 0xa0, 0xb5, 0x9b, 0x9d, 0xc3, 0xc2, 0x69, 0x66, 0xab, 0x30, 0x50, 0x2c,
1108
+	0xce, 0x44, 0xe8, 0x1a, 0x20, 0x4d, 0x9c, 0xf8, 0x33, 0x99, 0xa4, 0xc9, 0x1e, 0x0f, 0xfe, 0xf8,
1109
+	0xdd, 0xcc, 0xa9, 0x5b, 0x59, 0xbc, 0xef, 0x96, 0xf0, 0x8a, 0x18, 0x5d, 0x40, 0x95, 0xc7, 0xab,
1110
+	0x21, 0x5f, 0x27, 0x76, 0xd9, 0x2f, 0x6c, 0x64, 0x75, 0x77, 0x52, 0x0f, 0xa5, 0xb2, 0x37, 0xc1,
1111
+	0x48, 0xbb, 0x43, 0x35, 0xd0, 0x07, 0xc7, 0x1b, 0xa5, 0xee, 0xce, 0x62, 0x69, 0x95, 0xde, 0x64,
1112
+	0x7d, 0x2f, 0x2d, 0xed, 0xf9, 0xd3, 0xd2, 0x16, 0xb2, 0x5e, 0x65, 0x7d, 0xc8, 0xba, 0xd3, 0x87,
1113
+	0xb5, 0x64, 0x29, 0x4f, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0xc9, 0xd9, 0x1a, 0xd9, 0xeb, 0x02,
1114
+	0x00, 0x00,
1115 1115
 }
... ...
@@ -3,7 +3,7 @@ syntax = "proto3";
3 3
 package docker.swarmkit.v1;
4 4
 
5 5
 import "objects.proto";
6
-import "types.proto";
6
+import "raft.proto";
7 7
 import weak "gogoproto/gogo.proto";
8 8
 
9 9
 // StoreSnapshot is used to store snapshots of the store.
... ...
@@ -405,6 +405,10 @@ type ContainerSpec struct {
405 405
 	// service definitions will used immutable references, either through tags
406 406
 	// that don't change or verifiable digests.
407 407
 	Image string `protobuf:"bytes,1,opt,name=image,proto3" json:"image,omitempty"`
408
+	// RegistryAuth is the registry auth token obtained from the client, required
409
+	// to pull private images
410
+	// TODO(nishanttotla): This field will later be deprecated
411
+	RegistryAuth string `protobuf:"bytes,64,opt,name=registry_auth,json=registryAuth,proto3" json:"registry_auth,omitempty"`
408 412
 	// Labels defines labels to be added to the container at creation time. If
409 413
 	// collisions with system labels occur, these labels will be overridden.
410 414
 	//
... ...
@@ -625,6 +629,7 @@ func (m *ContainerSpec) Copy() *ContainerSpec {
625 625
 
626 626
 	o := &ContainerSpec{
627 627
 		Image:           m.Image,
628
+		RegistryAuth:    m.RegistryAuth,
628 629
 		Dir:             m.Dir,
629 630
 		User:            m.User,
630 631
 		StopGracePeriod: m.StopGracePeriod.Copy(),
... ...
@@ -835,9 +840,10 @@ func (this *ContainerSpec) GoString() string {
835 835
 	if this == nil {
836 836
 		return "nil"
837 837
 	}
838
-	s := make([]string, 0, 13)
838
+	s := make([]string, 0, 14)
839 839
 	s = append(s, "&api.ContainerSpec{")
840 840
 	s = append(s, "Image: "+fmt.Sprintf("%#v", this.Image)+",\n")
841
+	s = append(s, "RegistryAuth: "+fmt.Sprintf("%#v", this.RegistryAuth)+",\n")
841 842
 	keysForLabels := make([]string, 0, len(this.Labels))
842 843
 	for k, _ := range this.Labels {
843 844
 		keysForLabels = append(keysForLabels, k)
... ...
@@ -1344,6 +1350,14 @@ func (m *ContainerSpec) MarshalTo(data []byte) (int, error) {
1344 1344
 		}
1345 1345
 		i += n14
1346 1346
 	}
1347
+	if len(m.RegistryAuth) > 0 {
1348
+		data[i] = 0x82
1349
+		i++
1350
+		data[i] = 0x4
1351
+		i++
1352
+		i = encodeVarintSpecs(data, i, uint64(len(m.RegistryAuth)))
1353
+		i += copy(data[i:], m.RegistryAuth)
1354
+	}
1347 1355
 	return i, nil
1348 1356
 }
1349 1357
 
... ...
@@ -1716,6 +1730,10 @@ func (m *ContainerSpec) Size() (n int) {
1716 1716
 		l = m.StopGracePeriod.Size()
1717 1717
 		n += 1 + l + sovSpecs(uint64(l))
1718 1718
 	}
1719
+	l = len(m.RegistryAuth)
1720
+	if l > 0 {
1721
+		n += 2 + l + sovSpecs(uint64(l))
1722
+	}
1719 1723
 	return n
1720 1724
 }
1721 1725
 
... ...
@@ -1912,6 +1930,7 @@ func (this *ContainerSpec) String() string {
1912 1912
 		`User:` + fmt.Sprintf("%v", this.User) + `,`,
1913 1913
 		`Mounts:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Mounts), "Mount", "Mount", 1), `&`, ``, 1) + `,`,
1914 1914
 		`StopGracePeriod:` + strings.Replace(fmt.Sprintf("%v", this.StopGracePeriod), "Duration", "docker_swarmkit_v11.Duration", 1) + `,`,
1915
+		`RegistryAuth:` + fmt.Sprintf("%v", this.RegistryAuth) + `,`,
1915 1916
 		`}`,
1916 1917
 	}, "")
1917 1918
 	return s
... ...
@@ -3158,6 +3177,35 @@ func (m *ContainerSpec) Unmarshal(data []byte) error {
3158 3158
 				return err
3159 3159
 			}
3160 3160
 			iNdEx = postIndex
3161
+		case 64:
3162
+			if wireType != 2 {
3163
+				return fmt.Errorf("proto: wrong wireType = %d for field RegistryAuth", wireType)
3164
+			}
3165
+			var stringLen uint64
3166
+			for shift := uint(0); ; shift += 7 {
3167
+				if shift >= 64 {
3168
+					return ErrIntOverflowSpecs
3169
+				}
3170
+				if iNdEx >= l {
3171
+					return io.ErrUnexpectedEOF
3172
+				}
3173
+				b := data[iNdEx]
3174
+				iNdEx++
3175
+				stringLen |= (uint64(b) & 0x7F) << shift
3176
+				if b < 0x80 {
3177
+					break
3178
+				}
3179
+			}
3180
+			intStringLen := int(stringLen)
3181
+			if intStringLen < 0 {
3182
+				return ErrInvalidLengthSpecs
3183
+			}
3184
+			postIndex := iNdEx + intStringLen
3185
+			if postIndex > l {
3186
+				return io.ErrUnexpectedEOF
3187
+			}
3188
+			m.RegistryAuth = string(data[iNdEx:postIndex])
3189
+			iNdEx = postIndex
3161 3190
 		default:
3162 3191
 			iNdEx = preIndex
3163 3192
 			skippy, err := skipSpecs(data[iNdEx:])
... ...
@@ -3801,82 +3849,84 @@ var (
3801 3801
 )
3802 3802
 
3803 3803
 var fileDescriptorSpecs = []byte{
3804
-	// 1224 bytes of a gzipped FileDescriptorProto
3805
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xac, 0x56, 0x4d, 0x6f, 0x1b, 0x45,
3806
-	0x18, 0x8e, 0xe3, 0x8d, 0xb3, 0x9e, 0x4d, 0x5a, 0x77, 0x54, 0x5a, 0xd7, 0x2d, 0x49, 0x6a, 0x15,
3807
-	0x28, 0x48, 0x38, 0x60, 0x50, 0x5b, 0xbe, 0x84, 0xb6, 0xb6, 0x49, 0x4d, 0x89, 0x6b, 0x4d, 0xda,
3808
-	0x70, 0x8c, 0xc6, 0xbb, 0x53, 0x67, 0x95, 0xf5, 0xce, 0x32, 0x3b, 0x76, 0x95, 0x1b, 0xc7, 0x8a,
3809
-	0x03, 0xe2, 0xc2, 0x05, 0x89, 0x13, 0xff, 0x81, 0xdf, 0x90, 0x23, 0x37, 0x38, 0x55, 0xb4, 0xbf,
3810
-	0x00, 0x89, 0x3f, 0xc0, 0x3b, 0xb3, 0x63, 0x7b, 0x4d, 0x37, 0xed, 0x25, 0x87, 0x95, 0xe6, 0xe3,
3811
-	0x79, 0x9e, 0x99, 0x79, 0x3f, 0x17, 0x39, 0x49, 0xcc, 0xbc, 0xa4, 0x11, 0x0b, 0x2e, 0x39, 0xc6,
3812
-	0x3e, 0xf7, 0x8e, 0x98, 0x68, 0x24, 0x4f, 0xa8, 0x18, 0x1d, 0x05, 0xb2, 0x31, 0xf9, 0xb0, 0xe6,
3813
-	0xc8, 0xe3, 0x98, 0x19, 0x40, 0xed, 0xe2, 0x90, 0x0f, 0xb9, 0x1e, 0x6e, 0xab, 0x91, 0x59, 0xbd,
3814
-	0xec, 0x8f, 0x05, 0x95, 0x01, 0x8f, 0xb6, 0xa7, 0x83, 0x74, 0xa3, 0xfe, 0xa3, 0x85, 0xec, 0x1e,
3815
-	0xf7, 0xd9, 0x1e, 0x9c, 0x81, 0x77, 0x90, 0x43, 0xa3, 0x88, 0x4b, 0x0d, 0x48, 0xaa, 0x85, 0xad,
3816
-	0xc2, 0x4d, 0xa7, 0xb9, 0xd9, 0x78, 0xf9, 0xc8, 0x86, 0x3b, 0x87, 0xdd, 0xb5, 0x4e, 0x9e, 0x6d,
3817
-	0x2e, 0x91, 0x2c, 0x13, 0x7f, 0x80, 0x2c, 0xc1, 0x43, 0x56, 0x5d, 0x06, 0x85, 0x73, 0xcd, 0x6b,
3818
-	0x79, 0x0a, 0xea, 0x50, 0x02, 0x18, 0xa2, 0x91, 0x70, 0x34, 0x1a, 0xb1, 0xd1, 0x80, 0x89, 0xe4,
3819
-	0x30, 0x88, 0xab, 0x45, 0xcd, 0x7b, 0xe7, 0x34, 0x9e, 0xba, 0x6c, 0x63, 0x77, 0x06, 0x27, 0x19,
3820
-	0x2a, 0xde, 0x45, 0x6b, 0x74, 0x42, 0x83, 0x90, 0x0e, 0x82, 0x30, 0x90, 0xc7, 0x55, 0x4b, 0x4b,
3821
-	0xbd, 0xfb, 0x4a, 0x29, 0x37, 0x43, 0x20, 0x0b, 0xf4, 0xba, 0x8f, 0xd0, 0xfc, 0x20, 0xfc, 0x36,
3822
-	0x5a, 0xed, 0x77, 0x7a, 0xed, 0x6e, 0x6f, 0xa7, 0xb2, 0x54, 0xbb, 0xf2, 0xc3, 0xaf, 0x5b, 0x6f,
3823
-	0x28, 0x8d, 0x39, 0xa0, 0xcf, 0x22, 0x3f, 0x88, 0x86, 0xf8, 0x26, 0xb2, 0xdd, 0x56, 0xab, 0xd3,
3824
-	0x7f, 0xd8, 0x69, 0x57, 0x0a, 0xb5, 0x1a, 0x00, 0x2f, 0x2d, 0x02, 0x5d, 0xcf, 0x63, 0xb1, 0x64,
3825
-	0x7e, 0xcd, 0x7a, 0xfa, 0xdb, 0xc6, 0x52, 0xfd, 0x69, 0x01, 0xad, 0x65, 0x2f, 0x01, 0x07, 0x95,
3826
-	0xdc, 0xd6, 0xc3, 0xee, 0x7e, 0x07, 0xce, 0x99, 0xd1, 0xb3, 0x08, 0xd7, 0x93, 0xc1, 0x84, 0xe1,
3827
-	0x1b, 0x68, 0xa5, 0xef, 0x3e, 0xda, 0xeb, 0xc0, 0x29, 0xb3, 0xeb, 0x64, 0x61, 0x7d, 0x3a, 0x4e,
3828
-	0x34, 0xaa, 0x4d, 0xdc, 0x6e, 0xaf, 0xb2, 0x9c, 0x8f, 0x6a, 0x0b, 0x1a, 0x44, 0xe6, 0x2a, 0xbf,
3829
-	0x5b, 0xc8, 0xd9, 0x63, 0x62, 0x12, 0x78, 0x67, 0x1c, 0x13, 0xb7, 0x90, 0x25, 0x69, 0x72, 0xa4,
3830
-	0x63, 0xc2, 0xc9, 0x8f, 0x89, 0x87, 0xb0, 0xaf, 0x0e, 0x35, 0x74, 0x8d, 0x57, 0x91, 0x21, 0x58,
3831
-	0x1c, 0x06, 0x1e, 0x05, 0x7b, 0xe9, 0xc8, 0x70, 0x9a, 0x6f, 0xe5, 0xb1, 0xc9, 0x0c, 0x65, 0xee,
3832
-	0x7f, 0x6f, 0x89, 0x64, 0xa8, 0xf8, 0x33, 0x54, 0x1a, 0x86, 0x7c, 0x40, 0x43, 0x1d, 0x13, 0x4e,
3833
-	0xf3, 0x7a, 0x9e, 0xc8, 0x8e, 0x46, 0xcc, 0x05, 0x0c, 0x05, 0xdf, 0x41, 0xa5, 0x71, 0xec, 0x83,
3834
-	0x4e, 0xb5, 0xa4, 0xc9, 0x5b, 0x79, 0xe4, 0x47, 0x1a, 0xd1, 0xe2, 0xd1, 0xe3, 0x60, 0x48, 0x0c,
3835
-	0x1e, 0xef, 0x21, 0x3b, 0x62, 0xf2, 0x09, 0x17, 0x47, 0x49, 0x75, 0x75, 0xab, 0x08, 0xdc, 0xdb,
3836
-	0x79, 0xdc, 0x8c, 0xcd, 0x1b, 0xbd, 0x14, 0xef, 0x4a, 0x49, 0xbd, 0xc3, 0x11, 0x8b, 0xa4, 0x91,
3837
-	0x9c, 0x09, 0xe1, 0xcf, 0x91, 0x0d, 0xa1, 0x16, 0xf3, 0x20, 0x92, 0x55, 0xfb, 0xf4, 0x0b, 0x75,
3838
-	0x0c, 0x46, 0xa9, 0x92, 0x19, 0xa3, 0x76, 0x1f, 0x5d, 0x3e, 0xe5, 0x08, 0x7c, 0x09, 0x95, 0x24,
3839
-	0x15, 0x43, 0x26, 0xb5, 0xa7, 0xcb, 0xc4, 0xcc, 0x70, 0x15, 0xad, 0xd2, 0x30, 0xa0, 0x09, 0x4b,
3840
-	0xc0, 0x81, 0x45, 0xd8, 0x98, 0x4e, 0xef, 0x96, 0x90, 0x35, 0x82, 0x78, 0xaa, 0x6f, 0xa3, 0x0b,
3841
-	0x2f, 0x79, 0x00, 0xd7, 0x90, 0x6d, 0x3c, 0x90, 0x86, 0x8e, 0x45, 0x66, 0xf3, 0xfa, 0x79, 0xb4,
3842
-	0xbe, 0x60, 0xed, 0xfa, 0x2f, 0xcb, 0xc8, 0x9e, 0x86, 0x00, 0x76, 0x51, 0xd9, 0xe3, 0x91, 0x84,
3843
-	0xc0, 0x64, 0xc2, 0x44, 0x5d, 0xae, 0xc3, 0x5a, 0x53, 0x90, 0x62, 0x81, 0xc3, 0xe6, 0x2c, 0xfc,
3844
-	0x15, 0x2a, 0x0b, 0x96, 0xf0, 0xb1, 0xf0, 0xf4, 0xad, 0x95, 0xc4, 0xcd, 0xfc, 0xc0, 0x49, 0x41,
3845
-	0x84, 0x7d, 0x37, 0x0e, 0x04, 0x53, 0xd6, 0x48, 0xc8, 0x9c, 0x0a, 0x81, 0xb3, 0x0a, 0x13, 0x30,
3846
-	0x84, 0x7c, 0x55, 0xe4, 0x90, 0x14, 0xd2, 0xe7, 0xf0, 0xba, 0x63, 0x32, 0x65, 0x00, 0xb9, 0x1c,
3847
-	0x87, 0xd4, 0xd3, 0xaa, 0xd5, 0x15, 0x4d, 0x7f, 0x33, 0x8f, 0xde, 0x9f, 0x82, 0xc8, 0x1c, 0x7f,
3848
-	0xb7, 0x0c, 0x27, 0x8f, 0x23, 0x19, 0x8c, 0x58, 0xfd, 0xa7, 0x22, 0x5a, 0x5f, 0x78, 0x2b, 0xbe,
3849
-	0x88, 0x56, 0x82, 0x11, 0x1d, 0x32, 0xe3, 0xa9, 0x74, 0x82, 0x3b, 0xa8, 0x04, 0x69, 0xcd, 0xc2,
3850
-	0xd4, 0x4f, 0x4e, 0xf3, 0xfd, 0xd7, 0x1a, 0xad, 0xf1, 0x8d, 0xc6, 0x77, 0x22, 0x29, 0x8e, 0x89,
3851
-	0x21, 0x2b, 0x7f, 0x7b, 0x7c, 0x34, 0xa2, 0x91, 0x4a, 0x39, 0xed, 0x6f, 0x33, 0xc5, 0x18, 0x59,
3852
-	0x10, 0x12, 0x09, 0x98, 0x42, 0x2d, 0xeb, 0x31, 0xae, 0xa0, 0x22, 0x8b, 0x26, 0xf0, 0x3c, 0xb5,
3853
-	0xa4, 0x86, 0x6a, 0xc5, 0x0f, 0x84, 0x4e, 0x16, 0x58, 0x81, 0xa1, 0xe2, 0x41, 0x2d, 0x12, 0x90,
3854
-	0x03, 0x6a, 0x49, 0x8f, 0xf1, 0x6d, 0x54, 0x1a, 0x71, 0x78, 0x60, 0x02, 0x41, 0xac, 0x2e, 0x7b,
3855
-	0x25, 0xef, 0xb2, 0xbb, 0x0a, 0x61, 0x4a, 0x82, 0x81, 0xe3, 0x7b, 0xe8, 0x42, 0x22, 0x79, 0x7c,
3856
-	0x30, 0x14, 0x60, 0xaa, 0x83, 0x98, 0x89, 0x80, 0xfb, 0xd5, 0xf2, 0xe9, 0x95, 0xa5, 0x6d, 0xba,
3857
-	0x1e, 0x39, 0xaf, 0x68, 0x3b, 0x8a, 0xd5, 0xd7, 0xa4, 0xda, 0x27, 0xc8, 0xc9, 0xbc, 0x5f, 0xdd,
3858
-	0xfb, 0x88, 0x1d, 0x1b, 0x93, 0xaa, 0xa1, 0x32, 0xf3, 0x84, 0x86, 0xe3, 0xb4, 0x99, 0x81, 0x99,
3859
-	0xf5, 0xe4, 0xd3, 0xe5, 0x3b, 0x85, 0xfa, 0xbf, 0x50, 0xb5, 0xb3, 0x19, 0x86, 0x5b, 0x69, 0x2a,
3860
-	0x68, 0xf6, 0xb9, 0xe6, 0xf6, 0xeb, 0x32, 0x52, 0x07, 0x5e, 0x38, 0x56, 0xf7, 0xda, 0x55, 0xdd,
3861
-	0x50, 0x93, 0xf1, 0xc7, 0x68, 0x25, 0xe6, 0x42, 0x4e, 0xfd, 0xb7, 0x91, 0x1b, 0x2c, 0x00, 0x30,
3862
-	0x35, 0x21, 0x05, 0xd7, 0x0f, 0xd1, 0xb9, 0x45, 0x35, 0x28, 0xfa, 0xc5, 0xfd, 0x6e, 0x1f, 0xfa,
3863
-	0xc7, 0x55, 0x28, 0xf9, 0x97, 0x17, 0x37, 0xf7, 0x03, 0x21, 0xc7, 0x34, 0xec, 0xf6, 0xf1, 0x7b,
3864
-	0xd0, 0x1a, 0x7a, 0x7b, 0x84, 0x40, 0x03, 0xd9, 0x04, 0xdc, 0xd5, 0x45, 0x9c, 0xda, 0x02, 0x83,
3865
-	0xfb, 0x84, 0x0f, 0x66, 0x0d, 0xe2, 0xe7, 0x65, 0xe4, 0x98, 0xea, 0x71, 0xb6, 0x0d, 0xe2, 0x4b,
3866
-	0xb4, 0xee, 0x0b, 0x68, 0x6a, 0xe2, 0xc0, 0xd3, 0x4f, 0x33, 0x29, 0x5b, 0xcb, 0xf5, 0xa7, 0x06,
3867
-	0x92, 0xb5, 0x94, 0x60, 0x6a, 0xd7, 0x75, 0xb4, 0x16, 0xc4, 0x93, 0x5b, 0x07, 0x2c, 0xa2, 0x83,
3868
-	0xd0, 0xf4, 0x0a, 0x9b, 0x38, 0x6a, 0xad, 0x93, 0x2e, 0xa9, 0x7a, 0x04, 0xc6, 0x67, 0x22, 0x32,
3869
-	0x5d, 0xc0, 0x26, 0xb3, 0x39, 0xfe, 0x02, 0x59, 0x41, 0x4c, 0x47, 0x26, 0x49, 0x73, 0x5f, 0xd0,
3870
-	0xed, 0xbb, 0xbb, 0x0f, 0xe2, 0xf4, 0x05, 0xf6, 0x8b, 0x67, 0x9b, 0x96, 0x5a, 0x20, 0x9a, 0x56,
3871
-	0xff, 0xb3, 0x88, 0x9c, 0x56, 0x38, 0x4e, 0xa4, 0x49, 0xcf, 0x33, 0xb3, 0xcb, 0xb7, 0xe8, 0x02,
3872
-	0xd5, 0xbf, 0x0b, 0x34, 0x52, 0xb1, 0xae, 0xeb, 0x8b, 0xb1, 0xcd, 0x8d, 0x5c, 0xb9, 0x19, 0x38,
3873
-	0xad, 0x45, 0x46, 0xb3, 0x42, 0xff, 0xb7, 0x0e, 0x9d, 0x69, 0x9d, 0x0b, 0xef, 0x10, 0x0a, 0x55,
3874
-	0x9a, 0x1c, 0xa6, 0xb9, 0xe6, 0xfe, 0x76, 0x3d, 0xc8, 0x02, 0x53, 0x7b, 0x1b, 0xdd, 0x45, 0x0d,
3875
-	0x68, 0x94, 0x96, 0xa0, 0x8f, 0xa7, 0x95, 0x32, 0x37, 0x7a, 0x09, 0xec, 0x2f, 0x48, 0x68, 0x06,
3876
-	0xfe, 0x1a, 0x21, 0x3f, 0x48, 0x62, 0x2a, 0x41, 0x4e, 0x18, 0x2f, 0xe4, 0x3e, 0xb0, 0x3d, 0x43,
3877
-	0x2d, 0xa8, 0x64, 0xd8, 0xf8, 0x3e, 0x74, 0x0f, 0x3a, 0x8d, 0xa3, 0xd2, 0xe9, 0x75, 0xa1, 0xe5,
3878
-	0x1a, 0x89, 0x8a, 0x92, 0x00, 0x8f, 0xda, 0xd3, 0x15, 0x62, 0x7b, 0xd4, 0xec, 0x5d, 0x3b, 0x79,
3879
-	0xbe, 0xb1, 0xf4, 0x17, 0x7c, 0xff, 0x3c, 0xdf, 0x28, 0x7c, 0xff, 0x62, 0xa3, 0x70, 0x02, 0xdf,
3880
-	0x1f, 0xf0, 0xfd, 0x0d, 0xdf, 0xa0, 0xa4, 0x7f, 0xa4, 0x3f, 0xfa, 0x2f, 0x00, 0x00, 0xff, 0xff,
3881
-	0x4e, 0xfb, 0xdd, 0xf6, 0xa7, 0x0b, 0x00, 0x00,
3804
+	// 1249 bytes of a gzipped FileDescriptorProto
3805
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xac, 0x56, 0x4f, 0x73, 0x1b, 0x35,
3806
+	0x14, 0x8f, 0xe3, 0x8d, 0xb3, 0xd6, 0x26, 0xad, 0xab, 0x29, 0xad, 0xeb, 0x96, 0x24, 0x35, 0x05,
3807
+	0x0a, 0x33, 0x38, 0x60, 0x98, 0xb6, 0xfc, 0x1b, 0xd8, 0xda, 0x26, 0x35, 0x25, 0xae, 0x47, 0x69,
3808
+	0xcb, 0x31, 0x23, 0xef, 0xaa, 0x8e, 0x26, 0xeb, 0xdd, 0x45, 0x2b, 0xbb, 0x93, 0x1b, 0xc7, 0x0e,
3809
+	0x07, 0x6e, 0x5c, 0x98, 0xe1, 0xc4, 0x67, 0x80, 0xcf, 0x90, 0x23, 0x37, 0x38, 0x75, 0x68, 0x3f,
3810
+	0x01, 0x33, 0x7c, 0x01, 0x9e, 0xb4, 0xb2, 0xbd, 0xa6, 0x9b, 0xf6, 0x92, 0xc3, 0xce, 0x48, 0x4f,
3811
+	0xbf, 0xdf, 0x4f, 0xd2, 0x7b, 0x4f, 0xef, 0x2d, 0x72, 0x92, 0x98, 0x79, 0x49, 0x23, 0x16, 0x91,
3812
+	0x8c, 0x30, 0xf6, 0x23, 0xef, 0x90, 0x89, 0x46, 0xf2, 0x98, 0x8a, 0xd1, 0x21, 0x97, 0x8d, 0xc9,
3813
+	0x07, 0x35, 0x47, 0x1e, 0xc5, 0xcc, 0x00, 0x6a, 0xe7, 0x87, 0xd1, 0x30, 0xd2, 0xc3, 0x6d, 0x35,
3814
+	0x32, 0xd6, 0x8b, 0xfe, 0x58, 0x50, 0xc9, 0xa3, 0x70, 0x7b, 0x3a, 0x48, 0x17, 0xea, 0x3f, 0x5a,
3815
+	0xc8, 0xee, 0x45, 0x3e, 0xdb, 0x83, 0x3d, 0xf0, 0x0e, 0x72, 0x68, 0x18, 0x46, 0x52, 0x03, 0x92,
3816
+	0x6a, 0x61, 0xab, 0x70, 0xdd, 0x69, 0x6e, 0x36, 0x5e, 0xdc, 0xb2, 0xe1, 0xce, 0x61, 0xb7, 0xad,
3817
+	0xe3, 0xa7, 0x9b, 0x4b, 0x24, 0xcb, 0xc4, 0xef, 0x23, 0x4b, 0x44, 0x01, 0xab, 0x2e, 0x83, 0xc2,
3818
+	0x99, 0xe6, 0x95, 0x3c, 0x05, 0xb5, 0x29, 0x01, 0x0c, 0xd1, 0x48, 0xd8, 0x1a, 0x8d, 0xd8, 0x68,
3819
+	0xc0, 0x44, 0x72, 0xc0, 0xe3, 0x6a, 0x51, 0xf3, 0xde, 0x3e, 0x89, 0xa7, 0x0e, 0xdb, 0xd8, 0x9d,
3820
+	0xc1, 0x49, 0x86, 0x8a, 0x77, 0xd1, 0x1a, 0x9d, 0x50, 0x1e, 0xd0, 0x01, 0x0f, 0xb8, 0x3c, 0xaa,
3821
+	0x5a, 0x5a, 0xea, 0x9d, 0x97, 0x4a, 0xb9, 0x19, 0x02, 0x59, 0xa0, 0xd7, 0x7d, 0x84, 0xe6, 0x1b,
3822
+	0xe1, 0xb7, 0xd0, 0x6a, 0xbf, 0xd3, 0x6b, 0x77, 0x7b, 0x3b, 0x95, 0xa5, 0xda, 0xa5, 0x1f, 0x7e,
3823
+	0xd9, 0x7a, 0x4d, 0x69, 0xcc, 0x01, 0x7d, 0x16, 0xfa, 0x3c, 0x1c, 0xe2, 0xeb, 0xc8, 0x76, 0x5b,
3824
+	0xad, 0x4e, 0xff, 0x7e, 0xa7, 0x5d, 0x29, 0xd4, 0x6a, 0x00, 0xbc, 0xb0, 0x08, 0x74, 0x3d, 0x8f,
3825
+	0xc5, 0x92, 0xf9, 0x35, 0xeb, 0xc9, 0xaf, 0x1b, 0x4b, 0xf5, 0x27, 0x05, 0xb4, 0x96, 0x3d, 0x04,
3826
+	0x6c, 0x54, 0x72, 0x5b, 0xf7, 0xbb, 0x0f, 0x3b, 0xb0, 0xcf, 0x8c, 0x9e, 0x45, 0xb8, 0x9e, 0xe4,
3827
+	0x13, 0x86, 0xaf, 0xa1, 0x95, 0xbe, 0xfb, 0x60, 0xaf, 0x03, 0xbb, 0xcc, 0x8e, 0x93, 0x85, 0xf5,
3828
+	0xe9, 0x38, 0xd1, 0xa8, 0x36, 0x71, 0xbb, 0xbd, 0xca, 0x72, 0x3e, 0xaa, 0x2d, 0x28, 0x0f, 0xcd,
3829
+	0x51, 0x7e, 0xb7, 0x90, 0xb3, 0xc7, 0xc4, 0x84, 0x7b, 0xa7, 0x9c, 0x13, 0x37, 0x90, 0x25, 0x69,
3830
+	0x72, 0xa8, 0x73, 0xc2, 0xc9, 0xcf, 0x89, 0xfb, 0xb0, 0xae, 0x36, 0x35, 0x74, 0x8d, 0x57, 0x99,
3831
+	0x21, 0x58, 0x1c, 0x70, 0x8f, 0x82, 0xbf, 0x74, 0x66, 0x38, 0xcd, 0x37, 0xf3, 0xd8, 0x64, 0x86,
3832
+	0x32, 0xe7, 0xbf, 0xb3, 0x44, 0x32, 0x54, 0xfc, 0x29, 0x2a, 0x0d, 0x83, 0x68, 0x40, 0x03, 0x9d,
3833
+	0x13, 0x4e, 0xf3, 0x6a, 0x9e, 0xc8, 0x8e, 0x46, 0xcc, 0x05, 0x0c, 0x05, 0xdf, 0x42, 0xa5, 0x71,
3834
+	0xec, 0x83, 0x4e, 0xb5, 0xa4, 0xc9, 0x5b, 0x79, 0xe4, 0x07, 0x1a, 0xd1, 0x8a, 0xc2, 0x47, 0x7c,
3835
+	0x48, 0x0c, 0x1e, 0xef, 0x21, 0x3b, 0x64, 0xf2, 0x71, 0x24, 0x0e, 0x93, 0xea, 0xea, 0x56, 0x11,
3836
+	0xb8, 0x37, 0xf3, 0xb8, 0x19, 0x9f, 0x37, 0x7a, 0x29, 0xde, 0x95, 0x92, 0x7a, 0x07, 0x23, 0x16,
3837
+	0x4a, 0x23, 0x39, 0x13, 0xc2, 0x9f, 0x21, 0x1b, 0x52, 0x2d, 0x8e, 0x78, 0x28, 0xab, 0xf6, 0xc9,
3838
+	0x07, 0xea, 0x18, 0x8c, 0x52, 0x25, 0x33, 0x46, 0xed, 0x2e, 0xba, 0x78, 0xc2, 0x16, 0xf8, 0x02,
3839
+	0x2a, 0x49, 0x2a, 0x86, 0x4c, 0xea, 0x48, 0x97, 0x89, 0x99, 0xe1, 0x2a, 0x5a, 0xa5, 0x01, 0xa7,
3840
+	0x09, 0x4b, 0x20, 0x80, 0x45, 0x58, 0x98, 0x4e, 0x6f, 0x97, 0x90, 0x35, 0x82, 0x7c, 0xaa, 0x6f,
3841
+	0xa3, 0x73, 0x2f, 0x44, 0x00, 0xd7, 0x90, 0x6d, 0x22, 0x90, 0xa6, 0x8e, 0x45, 0x66, 0xf3, 0xfa,
3842
+	0x59, 0xb4, 0xbe, 0xe0, 0xed, 0xfa, 0xcf, 0xcb, 0xc8, 0x9e, 0xa6, 0x00, 0x76, 0x51, 0xd9, 0x8b,
3843
+	0x42, 0x09, 0x89, 0xc9, 0x84, 0xc9, 0xba, 0xdc, 0x80, 0xb5, 0xa6, 0x20, 0xc5, 0x82, 0x80, 0xcd,
3844
+	0x59, 0xf8, 0x2b, 0x54, 0x16, 0x2c, 0x89, 0xc6, 0xc2, 0xd3, 0xa7, 0x56, 0x12, 0xd7, 0xf3, 0x13,
3845
+	0x27, 0x05, 0x11, 0xf6, 0xdd, 0x98, 0x0b, 0xa6, 0xbc, 0x91, 0x90, 0x39, 0x15, 0x12, 0x67, 0x15,
3846
+	0x26, 0xe0, 0x08, 0xf9, 0xb2, 0xcc, 0x21, 0x29, 0xa4, 0x1f, 0xc1, 0xed, 0x8e, 0xc8, 0x94, 0x01,
3847
+	0xe4, 0x72, 0x1c, 0x50, 0x4f, 0xab, 0x56, 0x57, 0x34, 0xfd, 0xf5, 0x3c, 0x7a, 0x7f, 0x0a, 0x22,
3848
+	0x73, 0xfc, 0xed, 0x32, 0xec, 0x3c, 0x0e, 0x25, 0x1f, 0xb1, 0xfa, 0x6f, 0x45, 0xb4, 0xbe, 0x70,
3849
+	0x57, 0x7c, 0x1e, 0xad, 0xf0, 0x11, 0x1d, 0x32, 0x13, 0xa9, 0x74, 0x82, 0x3b, 0xa8, 0x04, 0xcf,
3850
+	0x9a, 0x05, 0x69, 0x9c, 0x9c, 0xe6, 0x7b, 0xaf, 0x74, 0x5a, 0xe3, 0x1b, 0x8d, 0xef, 0x84, 0x52,
3851
+	0x1c, 0x11, 0x43, 0x56, 0xf1, 0xf6, 0xa2, 0xd1, 0x88, 0x86, 0xea, 0xc9, 0xe9, 0x78, 0x9b, 0x29,
3852
+	0xc6, 0xc8, 0x82, 0x94, 0x48, 0xc0, 0x15, 0xca, 0xac, 0xc7, 0xb8, 0x82, 0x8a, 0x2c, 0x9c, 0xc0,
3853
+	0xf5, 0x94, 0x49, 0x0d, 0x95, 0xc5, 0xe7, 0x42, 0x3f, 0x16, 0xb0, 0xc0, 0x50, 0xf1, 0xa0, 0x16,
3854
+	0x09, 0x78, 0x03, 0xca, 0xa4, 0xc7, 0xf8, 0x26, 0x2a, 0x8d, 0x22, 0xb8, 0x60, 0x02, 0x49, 0xac,
3855
+	0x0e, 0x7b, 0x29, 0xef, 0xb0, 0xbb, 0x0a, 0x61, 0x4a, 0x82, 0x81, 0xe3, 0x3b, 0xe8, 0x5c, 0x22,
3856
+	0xa3, 0x78, 0x7f, 0x28, 0xc0, 0x55, 0xfb, 0x31, 0x13, 0x3c, 0xf2, 0xab, 0xe5, 0x93, 0x2b, 0x4b,
3857
+	0xdb, 0x74, 0x3d, 0x72, 0x56, 0xd1, 0x76, 0x14, 0xab, 0xaf, 0x49, 0xf8, 0x0d, 0xb4, 0x2e, 0xd8,
3858
+	0x90, 0x27, 0x70, 0xf9, 0x7d, 0x3a, 0x96, 0x07, 0xd5, 0x2f, 0xf5, 0xf9, 0xd6, 0xa6, 0x46, 0x17,
3859
+	0x6c, 0xb5, 0x8f, 0x91, 0x93, 0x71, 0x92, 0xba, 0xdc, 0x21, 0x3b, 0x32, 0x7e, 0x57, 0x43, 0x15,
3860
+	0x8b, 0x09, 0x0d, 0xc6, 0x69, 0xc7, 0x83, 0x58, 0xe8, 0xc9, 0x27, 0xcb, 0xb7, 0x0a, 0xf5, 0x7f,
3861
+	0xa1, 0xb4, 0x67, 0x9f, 0x21, 0x6e, 0xa5, 0xef, 0x45, 0xb3, 0xcf, 0x34, 0xb7, 0x5f, 0xf5, 0x6c,
3862
+	0x75, 0x76, 0x06, 0x63, 0x75, 0xf8, 0x5d, 0xd5, 0x32, 0x35, 0x19, 0x7f, 0x84, 0x56, 0xe2, 0x48,
3863
+	0xc8, 0x69, 0x90, 0x37, 0x72, 0x33, 0x0a, 0x00, 0xa6, 0x70, 0xa4, 0xe0, 0xfa, 0x01, 0x3a, 0xb3,
3864
+	0xa8, 0x06, 0x9d, 0xa1, 0xf8, 0xb0, 0xdb, 0x87, 0x26, 0x73, 0x19, 0xfa, 0xc2, 0xc5, 0xc5, 0xc5,
3865
+	0x87, 0x5c, 0xc8, 0x31, 0x0d, 0xba, 0x7d, 0xfc, 0x2e, 0xf4, 0x8f, 0xde, 0x1e, 0x21, 0xd0, 0x65,
3866
+	0x36, 0x01, 0x77, 0x79, 0x11, 0xa7, 0x96, 0x20, 0x2a, 0x3e, 0x89, 0x06, 0xb3, 0x2e, 0xf2, 0xd3,
3867
+	0x32, 0x72, 0x4c, 0x89, 0x39, 0xdd, 0x2e, 0xf2, 0x05, 0x5a, 0xf7, 0x05, 0x74, 0x3e, 0xb1, 0xef,
3868
+	0xe9, 0xab, 0x99, 0x77, 0x5d, 0xcb, 0x0d, 0xba, 0x06, 0x92, 0xb5, 0x94, 0x60, 0x0a, 0xdc, 0x55,
3869
+	0xb4, 0xc6, 0xe3, 0xc9, 0x8d, 0x7d, 0x16, 0xd2, 0x41, 0x60, 0x1a, 0x8a, 0x4d, 0x1c, 0x65, 0xeb,
3870
+	0xa4, 0x26, 0x55, 0xb4, 0xc0, 0xf9, 0x4c, 0x84, 0xa6, 0x55, 0xd8, 0x64, 0x36, 0xc7, 0x9f, 0x23,
3871
+	0x8b, 0xc7, 0x74, 0x64, 0x5e, 0x72, 0xee, 0x0d, 0xba, 0x7d, 0x77, 0xf7, 0x5e, 0x9c, 0xde, 0xc0,
3872
+	0x7e, 0xfe, 0x74, 0xd3, 0x52, 0x06, 0xa2, 0x69, 0xf5, 0x3f, 0x8b, 0xc8, 0x69, 0x05, 0xe3, 0x44,
3873
+	0x9a, 0x37, 0x7c, 0x6a, 0x7e, 0xf9, 0x16, 0x9d, 0xa3, 0xfa, 0x9f, 0x82, 0x86, 0xea, 0x41, 0xe8,
3874
+	0x22, 0x64, 0x7c, 0x73, 0x2d, 0x57, 0x6e, 0x06, 0x4e, 0x0b, 0x96, 0xd1, 0xac, 0xd0, 0xff, 0xd9,
3875
+	0xa1, 0x7d, 0xad, 0x47, 0xc2, 0x3b, 0x80, 0x6a, 0x96, 0xbe, 0x20, 0xd3, 0x81, 0x73, 0xff, 0xcd,
3876
+	0xee, 0x65, 0x81, 0xa9, 0xbf, 0x8d, 0xee, 0xa2, 0x06, 0x74, 0x53, 0x4b, 0xd0, 0x47, 0xd3, 0x72,
3877
+	0x9a, 0x9b, 0xbd, 0x04, 0xd6, 0x17, 0x24, 0x34, 0x03, 0x7f, 0x8d, 0x90, 0xcf, 0x93, 0x98, 0x4a,
3878
+	0x90, 0x13, 0x26, 0x0a, 0xb9, 0x17, 0x6c, 0xcf, 0x50, 0x0b, 0x2a, 0x19, 0x36, 0xbe, 0x0b, 0x2d,
3879
+	0x86, 0x4e, 0xf3, 0xa8, 0x74, 0x72, 0xf1, 0x68, 0xb9, 0x46, 0xa2, 0xa2, 0x24, 0x20, 0xa2, 0xf6,
3880
+	0xd4, 0x42, 0x6c, 0x8f, 0x9a, 0xb5, 0x2b, 0xc7, 0xcf, 0x36, 0x96, 0xfe, 0x82, 0xef, 0x9f, 0x67,
3881
+	0x1b, 0x85, 0xef, 0x9f, 0x6f, 0x14, 0x8e, 0xe1, 0xfb, 0x03, 0xbe, 0xbf, 0xe1, 0x1b, 0x94, 0xf4,
3882
+	0xdf, 0xf6, 0x87, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x3c, 0x6e, 0x60, 0xc5, 0xcc, 0x0b, 0x00,
3883
+	0x00,
3882 3884
 }
... ...
@@ -127,6 +127,11 @@ message ContainerSpec {
127 127
 	// that don't change or verifiable digests.
128 128
 	string image = 1;
129 129
 
130
+	// RegistryAuth is the registry auth token obtained from the client, required
131
+	// to pull private images
132
+	// TODO(nishanttotla): This field will later be deprecated
133
+	string registry_auth = 64;
134
+
130 135
 	// Labels defines labels to be added to the container at creation time. If
131 136
 	// collisions with system labels occur, these labels will be overridden.
132 137
 	//
... ...
@@ -44,7 +44,6 @@
44 44
 		OrchestrationConfig
45 45
 		DispatcherConfig
46 46
 		RaftConfig
47
-		RaftMember
48 47
 		Placement
49 48
 		RootCA
50 49
 		Certificate
... ...
@@ -99,7 +98,6 @@
99 99
 		RemoveNetworkResponse
100 100
 		ListNetworksRequest
101 101
 		ListNetworksResponse
102
-		RemoveManagerResponse
103 102
 		GetClusterRequest
104 103
 		GetClusterResponse
105 104
 		ListClustersRequest
... ...
@@ -123,6 +121,7 @@
123 123
 		StoreSnapshot
124 124
 		ClusterSnapshot
125 125
 		Snapshot
126
+		RaftMember
126 127
 		JoinRequest
127 128
 		JoinResponse
128 129
 		LeaveRequest
... ...
@@ -481,7 +480,7 @@ func (x EncryptionKey_Algorithm) String() string {
481 481
 	return proto.EnumName(EncryptionKey_Algorithm_name, int32(x))
482 482
 }
483 483
 func (EncryptionKey_Algorithm) EnumDescriptor() ([]byte, []int) {
484
-	return fileDescriptorTypes, []int{32, 0}
484
+	return fileDescriptorTypes, []int{31, 0}
485 485
 }
486 486
 
487 487
 // Version tracks the last time an object in the store was updated.
... ...
@@ -1009,20 +1008,6 @@ func (m *RaftConfig) Reset()                    { *m = RaftConfig{} }
1009 1009
 func (*RaftConfig) ProtoMessage()               {}
1010 1010
 func (*RaftConfig) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{27} }
1011 1011
 
1012
-type RaftMember struct {
1013
-	// RaftID specifies the internal ID used by the manager in a raft context, it can never be modified
1014
-	// and is used only for information purposes
1015
-	RaftID uint64 `protobuf:"varint,1,opt,name=raft_id,json=raftId,proto3" json:"raft_id,omitempty"`
1016
-	// Addr specifies the address of the member
1017
-	Addr string `protobuf:"bytes,2,opt,name=addr,proto3" json:"addr,omitempty"`
1018
-	// Status provides the current status of the manager from the perspective of another manager.
1019
-	Status RaftMemberStatus `protobuf:"bytes,3,opt,name=status" json:"status"`
1020
-}
1021
-
1022
-func (m *RaftMember) Reset()                    { *m = RaftMember{} }
1023
-func (*RaftMember) ProtoMessage()               {}
1024
-func (*RaftMember) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{28} }
1025
-
1026 1012
 // Placement specifies task distribution constraints.
1027 1013
 type Placement struct {
1028 1014
 	// constraints specifies a set of requirements a node should meet for a task.
... ...
@@ -1031,7 +1016,7 @@ type Placement struct {
1031 1031
 
1032 1032
 func (m *Placement) Reset()                    { *m = Placement{} }
1033 1033
 func (*Placement) ProtoMessage()               {}
1034
-func (*Placement) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{29} }
1034
+func (*Placement) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{28} }
1035 1035
 
1036 1036
 type RootCA struct {
1037 1037
 	// CAKey is the root CA private key.
... ...
@@ -1044,7 +1029,7 @@ type RootCA struct {
1044 1044
 
1045 1045
 func (m *RootCA) Reset()                    { *m = RootCA{} }
1046 1046
 func (*RootCA) ProtoMessage()               {}
1047
-func (*RootCA) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{30} }
1047
+func (*RootCA) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{29} }
1048 1048
 
1049 1049
 type Certificate struct {
1050 1050
 	Role        NodeRole       `protobuf:"varint,1,opt,name=role,proto3,enum=docker.swarmkit.v1.NodeRole" json:"role,omitempty"`
... ...
@@ -1057,7 +1042,7 @@ type Certificate struct {
1057 1057
 
1058 1058
 func (m *Certificate) Reset()                    { *m = Certificate{} }
1059 1059
 func (*Certificate) ProtoMessage()               {}
1060
-func (*Certificate) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{31} }
1060
+func (*Certificate) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{30} }
1061 1061
 
1062 1062
 // Symmetric keys to encrypt inter-agent communication.
1063 1063
 type EncryptionKey struct {
... ...
@@ -1073,16 +1058,24 @@ type EncryptionKey struct {
1073 1073
 
1074 1074
 func (m *EncryptionKey) Reset()                    { *m = EncryptionKey{} }
1075 1075
 func (*EncryptionKey) ProtoMessage()               {}
1076
-func (*EncryptionKey) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{32} }
1076
+func (*EncryptionKey) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{31} }
1077 1077
 
1078
-// ManagerStatus provides information about the status of a manager in the cluster.
1078
+// ManagerStatus provides informations about the state of a manager in the cluster.
1079 1079
 type ManagerStatus struct {
1080
-	Raft RaftMember `protobuf:"bytes,1,opt,name=raft" json:"raft"`
1080
+	// RaftID specifies the internal ID used by the manager in a raft context, it can never be modified
1081
+	// and is used only for information purposes
1082
+	RaftID uint64 `protobuf:"varint,1,opt,name=raft_id,json=raftId,proto3" json:"raft_id,omitempty"`
1083
+	// Addr is the address advertised to raft.
1084
+	Addr string `protobuf:"bytes,2,opt,name=addr,proto3" json:"addr,omitempty"`
1085
+	// Leader is set to true if this node is the raft leader.
1086
+	Leader bool `protobuf:"varint,3,opt,name=leader,proto3" json:"leader,omitempty"`
1087
+	// Reachability specifies whether this node is reachable.
1088
+	Reachability RaftMemberStatus_Reachability `protobuf:"varint,4,opt,name=reachability,proto3,enum=docker.swarmkit.v1.RaftMemberStatus_Reachability" json:"reachability,omitempty"`
1081 1089
 }
1082 1090
 
1083 1091
 func (m *ManagerStatus) Reset()                    { *m = ManagerStatus{} }
1084 1092
 func (*ManagerStatus) ProtoMessage()               {}
1085
-func (*ManagerStatus) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{33} }
1093
+func (*ManagerStatus) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{32} }
1086 1094
 
1087 1095
 func init() {
1088 1096
 	proto.RegisterType((*Version)(nil), "docker.swarmkit.v1.Version")
... ...
@@ -1117,7 +1110,6 @@ func init() {
1117 1117
 	proto.RegisterType((*OrchestrationConfig)(nil), "docker.swarmkit.v1.OrchestrationConfig")
1118 1118
 	proto.RegisterType((*DispatcherConfig)(nil), "docker.swarmkit.v1.DispatcherConfig")
1119 1119
 	proto.RegisterType((*RaftConfig)(nil), "docker.swarmkit.v1.RaftConfig")
1120
-	proto.RegisterType((*RaftMember)(nil), "docker.swarmkit.v1.RaftMember")
1121 1120
 	proto.RegisterType((*Placement)(nil), "docker.swarmkit.v1.Placement")
1122 1121
 	proto.RegisterType((*RootCA)(nil), "docker.swarmkit.v1.RootCA")
1123 1122
 	proto.RegisterType((*Certificate)(nil), "docker.swarmkit.v1.Certificate")
... ...
@@ -1624,20 +1616,6 @@ func (m *RaftConfig) Copy() *RaftConfig {
1624 1624
 	return o
1625 1625
 }
1626 1626
 
1627
-func (m *RaftMember) Copy() *RaftMember {
1628
-	if m == nil {
1629
-		return nil
1630
-	}
1631
-
1632
-	o := &RaftMember{
1633
-		RaftID: m.RaftID,
1634
-		Addr:   m.Addr,
1635
-		Status: *m.Status.Copy(),
1636
-	}
1637
-
1638
-	return o
1639
-}
1640
-
1641 1627
 func (m *Placement) Copy() *Placement {
1642 1628
 	if m == nil {
1643 1629
 		return nil
... ...
@@ -1706,7 +1684,10 @@ func (m *ManagerStatus) Copy() *ManagerStatus {
1706 1706
 	}
1707 1707
 
1708 1708
 	o := &ManagerStatus{
1709
-		Raft: *m.Raft.Copy(),
1709
+		RaftID:       m.RaftID,
1710
+		Addr:         m.Addr,
1711
+		Leader:       m.Leader,
1712
+		Reachability: m.Reachability,
1710 1713
 	}
1711 1714
 
1712 1715
 	return o
... ...
@@ -2187,18 +2168,6 @@ func (this *RaftConfig) GoString() string {
2187 2187
 	s = append(s, "}")
2188 2188
 	return strings.Join(s, "")
2189 2189
 }
2190
-func (this *RaftMember) GoString() string {
2191
-	if this == nil {
2192
-		return "nil"
2193
-	}
2194
-	s := make([]string, 0, 7)
2195
-	s = append(s, "&api.RaftMember{")
2196
-	s = append(s, "RaftID: "+fmt.Sprintf("%#v", this.RaftID)+",\n")
2197
-	s = append(s, "Addr: "+fmt.Sprintf("%#v", this.Addr)+",\n")
2198
-	s = append(s, "Status: "+strings.Replace(this.Status.GoString(), `&`, ``, 1)+",\n")
2199
-	s = append(s, "}")
2200
-	return strings.Join(s, "")
2201
-}
2202 2190
 func (this *Placement) GoString() string {
2203 2191
 	if this == nil {
2204 2192
 		return "nil"
... ...
@@ -2252,9 +2221,12 @@ func (this *ManagerStatus) GoString() string {
2252 2252
 	if this == nil {
2253 2253
 		return "nil"
2254 2254
 	}
2255
-	s := make([]string, 0, 5)
2255
+	s := make([]string, 0, 8)
2256 2256
 	s = append(s, "&api.ManagerStatus{")
2257
-	s = append(s, "Raft: "+strings.Replace(this.Raft.GoString(), `&`, ``, 1)+",\n")
2257
+	s = append(s, "RaftID: "+fmt.Sprintf("%#v", this.RaftID)+",\n")
2258
+	s = append(s, "Addr: "+fmt.Sprintf("%#v", this.Addr)+",\n")
2259
+	s = append(s, "Leader: "+fmt.Sprintf("%#v", this.Leader)+",\n")
2260
+	s = append(s, "Reachability: "+fmt.Sprintf("%#v", this.Reachability)+",\n")
2258 2261
 	s = append(s, "}")
2259 2262
 	return strings.Join(s, "")
2260 2263
 }
... ...
@@ -3484,43 +3456,6 @@ func (m *RaftConfig) MarshalTo(data []byte) (int, error) {
3484 3484
 	return i, nil
3485 3485
 }
3486 3486
 
3487
-func (m *RaftMember) Marshal() (data []byte, err error) {
3488
-	size := m.Size()
3489
-	data = make([]byte, size)
3490
-	n, err := m.MarshalTo(data)
3491
-	if err != nil {
3492
-		return nil, err
3493
-	}
3494
-	return data[:n], nil
3495
-}
3496
-
3497
-func (m *RaftMember) MarshalTo(data []byte) (int, error) {
3498
-	var i int
3499
-	_ = i
3500
-	var l int
3501
-	_ = l
3502
-	if m.RaftID != 0 {
3503
-		data[i] = 0x8
3504
-		i++
3505
-		i = encodeVarintTypes(data, i, uint64(m.RaftID))
3506
-	}
3507
-	if len(m.Addr) > 0 {
3508
-		data[i] = 0x12
3509
-		i++
3510
-		i = encodeVarintTypes(data, i, uint64(len(m.Addr)))
3511
-		i += copy(data[i:], m.Addr)
3512
-	}
3513
-	data[i] = 0x1a
3514
-	i++
3515
-	i = encodeVarintTypes(data, i, uint64(m.Status.Size()))
3516
-	n19, err := m.Status.MarshalTo(data[i:])
3517
-	if err != nil {
3518
-		return 0, err
3519
-	}
3520
-	i += n19
3521
-	return i, nil
3522
-}
3523
-
3524 3487
 func (m *Placement) Marshal() (data []byte, err error) {
3525 3488
 	size := m.Size()
3526 3489
 	data = make([]byte, size)
... ...
@@ -3619,11 +3554,11 @@ func (m *Certificate) MarshalTo(data []byte) (int, error) {
3619 3619
 	data[i] = 0x1a
3620 3620
 	i++
3621 3621
 	i = encodeVarintTypes(data, i, uint64(m.Status.Size()))
3622
-	n20, err := m.Status.MarshalTo(data[i:])
3622
+	n19, err := m.Status.MarshalTo(data[i:])
3623 3623
 	if err != nil {
3624 3624
 		return 0, err
3625 3625
 	}
3626
-	i += n20
3626
+	i += n19
3627 3627
 	if len(m.Certificate) > 0 {
3628 3628
 		data[i] = 0x22
3629 3629
 		i++
... ...
@@ -3694,14 +3629,32 @@ func (m *ManagerStatus) MarshalTo(data []byte) (int, error) {
3694 3694
 	_ = i
3695 3695
 	var l int
3696 3696
 	_ = l
3697
-	data[i] = 0xa
3698
-	i++
3699
-	i = encodeVarintTypes(data, i, uint64(m.Raft.Size()))
3700
-	n21, err := m.Raft.MarshalTo(data[i:])
3701
-	if err != nil {
3702
-		return 0, err
3697
+	if m.RaftID != 0 {
3698
+		data[i] = 0x8
3699
+		i++
3700
+		i = encodeVarintTypes(data, i, uint64(m.RaftID))
3701
+	}
3702
+	if len(m.Addr) > 0 {
3703
+		data[i] = 0x12
3704
+		i++
3705
+		i = encodeVarintTypes(data, i, uint64(len(m.Addr)))
3706
+		i += copy(data[i:], m.Addr)
3707
+	}
3708
+	if m.Leader {
3709
+		data[i] = 0x18
3710
+		i++
3711
+		if m.Leader {
3712
+			data[i] = 1
3713
+		} else {
3714
+			data[i] = 0
3715
+		}
3716
+		i++
3717
+	}
3718
+	if m.Reachability != 0 {
3719
+		data[i] = 0x20
3720
+		i++
3721
+		i = encodeVarintTypes(data, i, uint64(m.Reachability))
3703 3722
 	}
3704
-	i += n21
3705 3723
 	return i, nil
3706 3724
 }
3707 3725
 
... ...
@@ -4250,21 +4203,6 @@ func (m *RaftConfig) Size() (n int) {
4250 4250
 	return n
4251 4251
 }
4252 4252
 
4253
-func (m *RaftMember) Size() (n int) {
4254
-	var l int
4255
-	_ = l
4256
-	if m.RaftID != 0 {
4257
-		n += 1 + sovTypes(uint64(m.RaftID))
4258
-	}
4259
-	l = len(m.Addr)
4260
-	if l > 0 {
4261
-		n += 1 + l + sovTypes(uint64(l))
4262
-	}
4263
-	l = m.Status.Size()
4264
-	n += 1 + l + sovTypes(uint64(l))
4265
-	return n
4266
-}
4267
-
4268 4253
 func (m *Placement) Size() (n int) {
4269 4254
 	var l int
4270 4255
 	_ = l
... ...
@@ -4341,8 +4279,19 @@ func (m *EncryptionKey) Size() (n int) {
4341 4341
 func (m *ManagerStatus) Size() (n int) {
4342 4342
 	var l int
4343 4343
 	_ = l
4344
-	l = m.Raft.Size()
4345
-	n += 1 + l + sovTypes(uint64(l))
4344
+	if m.RaftID != 0 {
4345
+		n += 1 + sovTypes(uint64(m.RaftID))
4346
+	}
4347
+	l = len(m.Addr)
4348
+	if l > 0 {
4349
+		n += 1 + l + sovTypes(uint64(l))
4350
+	}
4351
+	if m.Leader {
4352
+		n += 2
4353
+	}
4354
+	if m.Reachability != 0 {
4355
+		n += 1 + sovTypes(uint64(m.Reachability))
4356
+	}
4346 4357
 	return n
4347 4358
 }
4348 4359
 
... ...
@@ -4788,18 +4737,6 @@ func (this *RaftConfig) String() string {
4788 4788
 	}, "")
4789 4789
 	return s
4790 4790
 }
4791
-func (this *RaftMember) String() string {
4792
-	if this == nil {
4793
-		return "nil"
4794
-	}
4795
-	s := strings.Join([]string{`&RaftMember{`,
4796
-		`RaftID:` + fmt.Sprintf("%v", this.RaftID) + `,`,
4797
-		`Addr:` + fmt.Sprintf("%v", this.Addr) + `,`,
4798
-		`Status:` + strings.Replace(strings.Replace(this.Status.String(), "RaftMemberStatus", "RaftMemberStatus", 1), `&`, ``, 1) + `,`,
4799
-		`}`,
4800
-	}, "")
4801
-	return s
4802
-}
4803 4791
 func (this *Placement) String() string {
4804 4792
 	if this == nil {
4805 4793
 		return "nil"
... ...
@@ -4854,7 +4791,10 @@ func (this *ManagerStatus) String() string {
4854 4854
 		return "nil"
4855 4855
 	}
4856 4856
 	s := strings.Join([]string{`&ManagerStatus{`,
4857
-		`Raft:` + strings.Replace(strings.Replace(this.Raft.String(), "RaftMember", "RaftMember", 1), `&`, ``, 1) + `,`,
4857
+		`RaftID:` + fmt.Sprintf("%v", this.RaftID) + `,`,
4858
+		`Addr:` + fmt.Sprintf("%v", this.Addr) + `,`,
4859
+		`Leader:` + fmt.Sprintf("%v", this.Leader) + `,`,
4860
+		`Reachability:` + fmt.Sprintf("%v", this.Reachability) + `,`,
4858 4861
 		`}`,
4859 4862
 	}, "")
4860 4863
 	return s
... ...
@@ -8992,134 +8932,6 @@ func (m *RaftConfig) Unmarshal(data []byte) error {
8992 8992
 	}
8993 8993
 	return nil
8994 8994
 }
8995
-func (m *RaftMember) Unmarshal(data []byte) error {
8996
-	l := len(data)
8997
-	iNdEx := 0
8998
-	for iNdEx < l {
8999
-		preIndex := iNdEx
9000
-		var wire uint64
9001
-		for shift := uint(0); ; shift += 7 {
9002
-			if shift >= 64 {
9003
-				return ErrIntOverflowTypes
9004
-			}
9005
-			if iNdEx >= l {
9006
-				return io.ErrUnexpectedEOF
9007
-			}
9008
-			b := data[iNdEx]
9009
-			iNdEx++
9010
-			wire |= (uint64(b) & 0x7F) << shift
9011
-			if b < 0x80 {
9012
-				break
9013
-			}
9014
-		}
9015
-		fieldNum := int32(wire >> 3)
9016
-		wireType := int(wire & 0x7)
9017
-		if wireType == 4 {
9018
-			return fmt.Errorf("proto: RaftMember: wiretype end group for non-group")
9019
-		}
9020
-		if fieldNum <= 0 {
9021
-			return fmt.Errorf("proto: RaftMember: illegal tag %d (wire type %d)", fieldNum, wire)
9022
-		}
9023
-		switch fieldNum {
9024
-		case 1:
9025
-			if wireType != 0 {
9026
-				return fmt.Errorf("proto: wrong wireType = %d for field RaftID", wireType)
9027
-			}
9028
-			m.RaftID = 0
9029
-			for shift := uint(0); ; shift += 7 {
9030
-				if shift >= 64 {
9031
-					return ErrIntOverflowTypes
9032
-				}
9033
-				if iNdEx >= l {
9034
-					return io.ErrUnexpectedEOF
9035
-				}
9036
-				b := data[iNdEx]
9037
-				iNdEx++
9038
-				m.RaftID |= (uint64(b) & 0x7F) << shift
9039
-				if b < 0x80 {
9040
-					break
9041
-				}
9042
-			}
9043
-		case 2:
9044
-			if wireType != 2 {
9045
-				return fmt.Errorf("proto: wrong wireType = %d for field Addr", wireType)
9046
-			}
9047
-			var stringLen uint64
9048
-			for shift := uint(0); ; shift += 7 {
9049
-				if shift >= 64 {
9050
-					return ErrIntOverflowTypes
9051
-				}
9052
-				if iNdEx >= l {
9053
-					return io.ErrUnexpectedEOF
9054
-				}
9055
-				b := data[iNdEx]
9056
-				iNdEx++
9057
-				stringLen |= (uint64(b) & 0x7F) << shift
9058
-				if b < 0x80 {
9059
-					break
9060
-				}
9061
-			}
9062
-			intStringLen := int(stringLen)
9063
-			if intStringLen < 0 {
9064
-				return ErrInvalidLengthTypes
9065
-			}
9066
-			postIndex := iNdEx + intStringLen
9067
-			if postIndex > l {
9068
-				return io.ErrUnexpectedEOF
9069
-			}
9070
-			m.Addr = string(data[iNdEx:postIndex])
9071
-			iNdEx = postIndex
9072
-		case 3:
9073
-			if wireType != 2 {
9074
-				return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType)
9075
-			}
9076
-			var msglen int
9077
-			for shift := uint(0); ; shift += 7 {
9078
-				if shift >= 64 {
9079
-					return ErrIntOverflowTypes
9080
-				}
9081
-				if iNdEx >= l {
9082
-					return io.ErrUnexpectedEOF
9083
-				}
9084
-				b := data[iNdEx]
9085
-				iNdEx++
9086
-				msglen |= (int(b) & 0x7F) << shift
9087
-				if b < 0x80 {
9088
-					break
9089
-				}
9090
-			}
9091
-			if msglen < 0 {
9092
-				return ErrInvalidLengthTypes
9093
-			}
9094
-			postIndex := iNdEx + msglen
9095
-			if postIndex > l {
9096
-				return io.ErrUnexpectedEOF
9097
-			}
9098
-			if err := m.Status.Unmarshal(data[iNdEx:postIndex]); err != nil {
9099
-				return err
9100
-			}
9101
-			iNdEx = postIndex
9102
-		default:
9103
-			iNdEx = preIndex
9104
-			skippy, err := skipTypes(data[iNdEx:])
9105
-			if err != nil {
9106
-				return err
9107
-			}
9108
-			if skippy < 0 {
9109
-				return ErrInvalidLengthTypes
9110
-			}
9111
-			if (iNdEx + skippy) > l {
9112
-				return io.ErrUnexpectedEOF
9113
-			}
9114
-			iNdEx += skippy
9115
-		}
9116
-	}
9117
-
9118
-	if iNdEx > l {
9119
-		return io.ErrUnexpectedEOF
9120
-	}
9121
-	return nil
9122
-}
9123 8995
 func (m *Placement) Unmarshal(data []byte) error {
9124 8996
 	l := len(data)
9125 8997
 	iNdEx := 0
... ...
@@ -9708,10 +9520,29 @@ func (m *ManagerStatus) Unmarshal(data []byte) error {
9708 9708
 		}
9709 9709
 		switch fieldNum {
9710 9710
 		case 1:
9711
+			if wireType != 0 {
9712
+				return fmt.Errorf("proto: wrong wireType = %d for field RaftID", wireType)
9713
+			}
9714
+			m.RaftID = 0
9715
+			for shift := uint(0); ; shift += 7 {
9716
+				if shift >= 64 {
9717
+					return ErrIntOverflowTypes
9718
+				}
9719
+				if iNdEx >= l {
9720
+					return io.ErrUnexpectedEOF
9721
+				}
9722
+				b := data[iNdEx]
9723
+				iNdEx++
9724
+				m.RaftID |= (uint64(b) & 0x7F) << shift
9725
+				if b < 0x80 {
9726
+					break
9727
+				}
9728
+			}
9729
+		case 2:
9711 9730
 			if wireType != 2 {
9712
-				return fmt.Errorf("proto: wrong wireType = %d for field Raft", wireType)
9731
+				return fmt.Errorf("proto: wrong wireType = %d for field Addr", wireType)
9713 9732
 			}
9714
-			var msglen int
9733
+			var stringLen uint64
9715 9734
 			for shift := uint(0); ; shift += 7 {
9716 9735
 				if shift >= 64 {
9717 9736
 					return ErrIntOverflowTypes
... ...
@@ -9721,22 +9552,60 @@ func (m *ManagerStatus) Unmarshal(data []byte) error {
9721 9721
 				}
9722 9722
 				b := data[iNdEx]
9723 9723
 				iNdEx++
9724
-				msglen |= (int(b) & 0x7F) << shift
9724
+				stringLen |= (uint64(b) & 0x7F) << shift
9725 9725
 				if b < 0x80 {
9726 9726
 					break
9727 9727
 				}
9728 9728
 			}
9729
-			if msglen < 0 {
9729
+			intStringLen := int(stringLen)
9730
+			if intStringLen < 0 {
9730 9731
 				return ErrInvalidLengthTypes
9731 9732
 			}
9732
-			postIndex := iNdEx + msglen
9733
+			postIndex := iNdEx + intStringLen
9733 9734
 			if postIndex > l {
9734 9735
 				return io.ErrUnexpectedEOF
9735 9736
 			}
9736
-			if err := m.Raft.Unmarshal(data[iNdEx:postIndex]); err != nil {
9737
-				return err
9738
-			}
9737
+			m.Addr = string(data[iNdEx:postIndex])
9739 9738
 			iNdEx = postIndex
9739
+		case 3:
9740
+			if wireType != 0 {
9741
+				return fmt.Errorf("proto: wrong wireType = %d for field Leader", wireType)
9742
+			}
9743
+			var v int
9744
+			for shift := uint(0); ; shift += 7 {
9745
+				if shift >= 64 {
9746
+					return ErrIntOverflowTypes
9747
+				}
9748
+				if iNdEx >= l {
9749
+					return io.ErrUnexpectedEOF
9750
+				}
9751
+				b := data[iNdEx]
9752
+				iNdEx++
9753
+				v |= (int(b) & 0x7F) << shift
9754
+				if b < 0x80 {
9755
+					break
9756
+				}
9757
+			}
9758
+			m.Leader = bool(v != 0)
9759
+		case 4:
9760
+			if wireType != 0 {
9761
+				return fmt.Errorf("proto: wrong wireType = %d for field Reachability", wireType)
9762
+			}
9763
+			m.Reachability = 0
9764
+			for shift := uint(0); ; shift += 7 {
9765
+				if shift >= 64 {
9766
+					return ErrIntOverflowTypes
9767
+				}
9768
+				if iNdEx >= l {
9769
+					return io.ErrUnexpectedEOF
9770
+				}
9771
+				b := data[iNdEx]
9772
+				iNdEx++
9773
+				m.Reachability |= (RaftMemberStatus_Reachability(b) & 0x7F) << shift
9774
+				if b < 0x80 {
9775
+					break
9776
+				}
9777
+			}
9740 9778
 		default:
9741 9779
 			iNdEx = preIndex
9742 9780
 			skippy, err := skipTypes(data[iNdEx:])
... ...
@@ -9864,189 +9733,188 @@ var (
9864 9864
 )
9865 9865
 
9866 9866
 var fileDescriptorTypes = []byte{
9867
-	// 2940 bytes of a gzipped FileDescriptorProto
9868
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xa4, 0x58, 0xcb, 0x73, 0x1b, 0xc7,
9869
-	0xd1, 0x27, 0x9e, 0x04, 0x06, 0x20, 0x09, 0xad, 0x64, 0x99, 0x82, 0xf9, 0x51, 0xfa, 0xd6, 0x52,
9870
-	0x2c, 0x3f, 0x02, 0x5b, 0xb4, 0x93, 0x52, 0xec, 0x72, 0xec, 0xc5, 0x83, 0x22, 0x22, 0x12, 0x44,
9871
-	0x0d, 0x48, 0xaa, 0x7c, 0x48, 0x50, 0xcb, 0xc5, 0x90, 0x58, 0x73, 0xb1, 0x8b, 0xec, 0x2e, 0x48,
9872
-	0xa1, 0x52, 0xa9, 0x92, 0x73, 0x49, 0xe2, 0x53, 0xee, 0x29, 0x57, 0x2a, 0x95, 0x5c, 0xf3, 0x0f,
9873
-	0xe4, 0xa4, 0xa3, 0x8e, 0x49, 0xa5, 0x2a, 0xe5, 0x93, 0x2b, 0x76, 0x0e, 0xb9, 0xa6, 0x2a, 0xa9,
9874
-	0xf8, 0x90, 0x1c, 0xd2, 0x3d, 0x8f, 0xc5, 0x43, 0x2b, 0x5a, 0x8a, 0x0f, 0x28, 0xec, 0xf4, 0xfc,
9875
-	0xba, 0xa7, 0xbb, 0xa7, 0xa7, 0xbb, 0x67, 0x48, 0x21, 0x1c, 0x0f, 0x59, 0x50, 0x19, 0xfa, 0x5e,
9876
-	0xe8, 0x69, 0x5a, 0xcf, 0xb3, 0x4e, 0x98, 0x5f, 0x09, 0xce, 0x4c, 0x7f, 0x70, 0x62, 0x87, 0x95,
9877
-	0xd3, 0x5b, 0xe5, 0x2b, 0xa1, 0x3d, 0x60, 0x41, 0x68, 0x0e, 0x86, 0xaf, 0x47, 0x5f, 0x02, 0x5e,
9878
-	0x7e, 0xbe, 0x37, 0xf2, 0xcd, 0xd0, 0xf6, 0xdc, 0xd7, 0xd5, 0x87, 0x9c, 0xb8, 0x74, 0xec, 0x1d,
9879
-	0x7b, 0xfc, 0xf3, 0x75, 0xfc, 0x12, 0x54, 0xfd, 0x2a, 0x59, 0x3c, 0x60, 0x7e, 0x00, 0x30, 0xed,
9880
-	0x12, 0xc9, 0xd8, 0x6e, 0x8f, 0xdd, 0x5f, 0x4d, 0x5c, 0x4b, 0xdc, 0x4c, 0x53, 0x31, 0xd0, 0x7f,
9881
-	0x9d, 0x20, 0x05, 0xc3, 0x75, 0xbd, 0x90, 0xcb, 0x0a, 0x34, 0x8d, 0xa4, 0x5d, 0x73, 0xc0, 0x38,
9882
-	0x28, 0x4f, 0xf9, 0xb7, 0x56, 0x23, 0x59, 0xc7, 0x3c, 0x64, 0x4e, 0xb0, 0x9a, 0xbc, 0x96, 0xba,
9883
-	0x59, 0xd8, 0x78, 0xb5, 0xf2, 0xb8, 0xce, 0x95, 0x29, 0x21, 0x95, 0x6d, 0x8e, 0x6e, 0xb8, 0xa1,
9884
-	0x3f, 0xa6, 0x92, 0xb5, 0xfc, 0x1d, 0x52, 0x98, 0x22, 0x6b, 0x25, 0x92, 0x3a, 0x61, 0x63, 0xb9,
9885
-	0x0c, 0x7e, 0xa2, 0x7e, 0xa7, 0xa6, 0x33, 0x62, 0xb0, 0x08, 0xd2, 0xc4, 0xe0, 0xed, 0xe4, 0xed,
9886
-	0x84, 0xfe, 0x01, 0xc9, 0x53, 0x16, 0x78, 0x23, 0xdf, 0x62, 0x81, 0xf6, 0x32, 0xc9, 0xbb, 0xa6,
9887
-	0xeb, 0x75, 0xad, 0xe1, 0x28, 0xe0, 0xec, 0xa9, 0x6a, 0xf1, 0x8b, 0xcf, 0xae, 0xe6, 0x5a, 0x40,
9888
-	0xac, 0xb5, 0xf7, 0x03, 0x9a, 0xc3, 0xe9, 0x1a, 0xcc, 0x6a, 0xff, 0x4f, 0x8a, 0x03, 0x36, 0xf0,
9889
-	0xfc, 0x71, 0xf7, 0x70, 0x1c, 0xb2, 0x80, 0x0b, 0x4e, 0xd1, 0x82, 0xa0, 0x55, 0x91, 0xa4, 0xff,
9890
-	0x22, 0x41, 0x2e, 0x29, 0xd9, 0x94, 0xfd, 0x70, 0x64, 0xfb, 0x6c, 0xc0, 0xdc, 0x30, 0xd0, 0xbe,
9891
-	0x05, 0x36, 0xdb, 0x03, 0x3b, 0x14, 0x6b, 0x14, 0x36, 0xfe, 0x2f, 0xce, 0xe6, 0x48, 0x2b, 0x2a,
9892
-	0xc1, 0x9a, 0x41, 0x8a, 0x3e, 0x0b, 0x98, 0x7f, 0x2a, 0x3c, 0xc1, 0x97, 0xfc, 0x4a, 0xe6, 0x19,
9893
-	0x16, 0x7d, 0x93, 0xe4, 0xda, 0x8e, 0x19, 0x1e, 0x79, 0xfe, 0x40, 0xd3, 0x49, 0xd1, 0xf4, 0xad,
9894
-	0xbe, 0x1d, 0x32, 0x2b, 0x1c, 0xf9, 0x6a, 0x57, 0x66, 0x68, 0xda, 0x65, 0x92, 0xf4, 0xc4, 0x42,
9895
-	0xf9, 0x6a, 0x16, 0x3c, 0x91, 0xdc, 0xed, 0x50, 0xa0, 0xe8, 0xef, 0x90, 0x0b, 0x6d, 0x67, 0x74,
9896
-	0x6c, 0xbb, 0x75, 0x16, 0x58, 0xbe, 0x3d, 0x44, 0xe9, 0xb8, 0xbd, 0x18, 0x7c, 0x6a, 0x7b, 0xf1,
9897
-	0x3b, 0xda, 0xf2, 0xe4, 0x64, 0xcb, 0xf5, 0x9f, 0x26, 0xc9, 0x85, 0x86, 0x0b, 0xcc, 0x6c, 0x9a,
9898
-	0xfb, 0x06, 0x59, 0x66, 0x9c, 0xd8, 0x3d, 0x15, 0x41, 0x25, 0xe5, 0x2c, 0x09, 0xaa, 0x8a, 0xb4,
9899
-	0xe6, 0x5c, 0xbc, 0xdc, 0x8a, 0x33, 0xff, 0x31, 0xe9, 0x71, 0x51, 0xa3, 0x35, 0xc8, 0xe2, 0x90,
9900
-	0x1b, 0x11, 0xac, 0xa6, 0xb8, 0xac, 0x1b, 0x71, 0xb2, 0x1e, 0xb3, 0xb3, 0x9a, 0x7e, 0xf4, 0xd9,
9901
-	0xd5, 0x05, 0xaa, 0x78, 0xbf, 0x4e, 0xf0, 0xfd, 0x35, 0x41, 0x56, 0x5a, 0x5e, 0x6f, 0xc6, 0x0f,
9902
-	0x65, 0x92, 0xeb, 0x7b, 0x41, 0x38, 0x75, 0x50, 0xa2, 0xb1, 0x76, 0x9b, 0xe4, 0x86, 0x72, 0xfb,
9903
-	0xe4, 0xee, 0xaf, 0xc5, 0xab, 0x2c, 0x30, 0x34, 0x42, 0x6b, 0xef, 0x90, 0xbc, 0xaf, 0x62, 0x02,
9904
-	0xac, 0x7d, 0x8a, 0xc0, 0x99, 0xe0, 0xb5, 0x77, 0x49, 0x56, 0x6c, 0xc2, 0x6a, 0x9a, 0x73, 0xde,
9905
-	0x78, 0x2a, 0x9f, 0x53, 0xc9, 0xa4, 0x7f, 0x9a, 0x20, 0x25, 0x6a, 0x1e, 0x85, 0x3b, 0x6c, 0x70,
9906
-	0xc8, 0xfc, 0x0e, 0x1c, 0x64, 0x38, 0x3f, 0x97, 0x61, 0x1f, 0x99, 0xd9, 0x63, 0x3e, 0x37, 0x32,
9907
-	0x47, 0xe5, 0x48, 0xdb, 0xc7, 0x20, 0x37, 0xad, 0xbe, 0x79, 0x68, 0x3b, 0x76, 0x38, 0xe6, 0x66,
9908
-	0x2e, 0xc7, 0xef, 0xf2, 0xbc, 0x4c, 0x50, 0x7e, 0xc2, 0x48, 0x67, 0xc4, 0x68, 0xab, 0x64, 0x11,
9909
-	0x72, 0x5d, 0x60, 0x1e, 0x33, 0x6e, 0x7d, 0x9e, 0xaa, 0x21, 0x84, 0x72, 0x71, 0x9a, 0x4f, 0x2b,
9910
-	0x90, 0xc5, 0xfd, 0xd6, 0xdd, 0xd6, 0xee, 0xbd, 0x56, 0x69, 0x41, 0x5b, 0x21, 0x85, 0xfd, 0x16,
9911
-	0x6d, 0x18, 0xb5, 0x2d, 0xa3, 0xba, 0xdd, 0x28, 0x25, 0xb4, 0x25, 0x48, 0x17, 0xd1, 0x30, 0xa9,
9912
-	0xff, 0x2a, 0x41, 0x08, 0x6e, 0xa0, 0x34, 0xea, 0x6d, 0x92, 0x81, 0x7c, 0x1a, 0x8a, 0x8d, 0x5b,
9913
-	0xde, 0xb8, 0x1e, 0xa7, 0xf5, 0x04, 0x5e, 0xc1, 0x3f, 0x46, 0x05, 0xcb, 0xb4, 0x86, 0xc9, 0x79,
9914
-	0x0d, 0x33, 0x1c, 0x39, 0xab, 0x5a, 0x8e, 0xa4, 0xeb, 0xf8, 0x95, 0xd0, 0xf2, 0x24, 0x03, 0x3a,
9915
-	0xd5, 0x3f, 0x28, 0x25, 0x21, 0xf8, 0x8a, 0xf5, 0x66, 0xa7, 0xb6, 0xdb, 0x6a, 0x35, 0x6a, 0x7b,
9916
-	0x8d, 0x7a, 0x29, 0xa5, 0xdf, 0x20, 0x99, 0xe6, 0x00, 0xa4, 0x68, 0x6b, 0x18, 0x01, 0x47, 0xcc,
9917
-	0x67, 0xae, 0xa5, 0x02, 0x6b, 0x42, 0xd0, 0xff, 0xb5, 0x48, 0x32, 0x3b, 0xde, 0xc8, 0x0d, 0xb5,
9918
-	0x8d, 0xa9, 0x53, 0xbc, 0xbc, 0xb1, 0x1e, 0x67, 0x02, 0x07, 0x56, 0xf6, 0x00, 0x25, 0x4f, 0x39,
9919
-	0x6c, 0xa6, 0x88, 0x15, 0xa9, 0xba, 0x1c, 0x21, 0x3d, 0x34, 0xfd, 0x63, 0x16, 0x4a, 0xa7, 0xcb,
9920
-	0x11, 0xc6, 0xf8, 0x99, 0x6f, 0x87, 0xe6, 0xa1, 0x23, 0x42, 0x2a, 0x47, 0xa3, 0xb1, 0xb6, 0x45,
9921
-	0x8a, 0x87, 0x50, 0x3e, 0xba, 0xde, 0x50, 0x64, 0xb9, 0xcc, 0x93, 0x43, 0x4e, 0xe8, 0x51, 0x05,
9922
-	0xf4, 0xae, 0x00, 0xd3, 0xc2, 0xe1, 0x64, 0xa0, 0xb5, 0xc8, 0xf2, 0xa9, 0xe7, 0x8c, 0x06, 0x2c,
9923
-	0x92, 0x95, 0xe5, 0xb2, 0x5e, 0x7a, 0xb2, 0xac, 0x03, 0x8e, 0x57, 0xd2, 0x96, 0x4e, 0xa7, 0x87,
9924
-	0xe5, 0x9f, 0xa4, 0x48, 0x61, 0x6a, 0x31, 0xad, 0x43, 0x0a, 0x50, 0x08, 0x87, 0xe6, 0x31, 0x4f,
9925
-	0xae, 0xd2, 0x61, 0xb7, 0x9e, 0x4a, 0xd1, 0x4a, 0x7b, 0xc2, 0x48, 0xa7, 0xa5, 0xe8, 0x9f, 0x24,
9926
-	0x49, 0x61, 0x6a, 0x52, 0x7b, 0x85, 0xe4, 0x68, 0x9b, 0x36, 0x0f, 0x8c, 0xbd, 0x46, 0x69, 0xa1,
9927
-	0xbc, 0xf6, 0xf1, 0x27, 0xd7, 0x56, 0xb9, 0xb4, 0x69, 0x01, 0x6d, 0xdf, 0x3e, 0xc5, 0xf8, 0xb8,
9928
-	0x49, 0x16, 0x15, 0x34, 0x51, 0x7e, 0x01, 0xa0, 0xcf, 0xcf, 0x43, 0xa7, 0x90, 0xb4, 0xb3, 0x65,
9929
-	0x50, 0x08, 0x91, 0x64, 0x3c, 0x92, 0x76, 0xfa, 0xa6, 0xcf, 0x7a, 0xda, 0x37, 0x48, 0x56, 0x02,
9930
-	0x53, 0xe5, 0x32, 0x00, 0x2f, 0xcf, 0x03, 0x27, 0x38, 0xda, 0xd9, 0x36, 0x0e, 0x1a, 0xa5, 0x74,
9931
-	0x3c, 0x8e, 0x76, 0x1c, 0xf3, 0x94, 0x69, 0xd7, 0x21, 0x98, 0x39, 0x2c, 0x53, 0xbe, 0x02, 0xb0,
9932
-	0xe7, 0x1e, 0x13, 0x87, 0xa8, 0xf2, 0xea, 0xcf, 0x7e, 0xb3, 0xbe, 0xf0, 0xfb, 0xdf, 0xae, 0x97,
9933
-	0xe6, 0xa7, 0xcb, 0xff, 0x4c, 0x90, 0xa5, 0x99, 0x5d, 0xc2, 0x60, 0x1a, 0x7a, 0xc3, 0x91, 0xa3,
9934
-	0xce, 0x1d, 0x04, 0x93, 0x1a, 0x6b, 0x77, 0xe7, 0xaa, 0xc5, 0x9b, 0x4f, 0xb9, 0xf5, 0xb1, 0xf5,
9935
-	0xe2, 0x3d, 0xb2, 0xd4, 0x03, 0xff, 0x31, 0xbf, 0x6b, 0x79, 0xee, 0x91, 0x7d, 0x2c, 0xf3, 0x68,
9936
-	0x39, 0x4e, 0x66, 0x9d, 0x03, 0x69, 0x51, 0x30, 0xd4, 0x38, 0xfe, 0xeb, 0x54, 0x8a, 0x7b, 0x24,
9937
-	0x8d, 0xe7, 0x4d, 0x7b, 0x81, 0xa4, 0xab, 0xcd, 0x56, 0x1d, 0x42, 0xe1, 0x02, 0x78, 0x6f, 0x89,
9938
-	0xab, 0x8e, 0x13, 0x18, 0x5b, 0xda, 0x55, 0x92, 0x3d, 0xd8, 0xdd, 0xde, 0xdf, 0xc1, 0xed, 0xbf,
9939
-	0x08, 0xd3, 0x2b, 0xd1, 0xb4, 0x30, 0xae, 0x7c, 0x41, 0xba, 0x35, 0x1f, 0x4d, 0xe8, 0xff, 0x4e,
9940
-	0x92, 0x25, 0x8a, 0x5d, 0xa0, 0x1f, 0xb6, 0x3d, 0xc7, 0xb6, 0xc6, 0x5a, 0x9b, 0xe4, 0xc1, 0xbe,
9941
-	0x9e, 0x3d, 0x15, 0xd4, 0x1b, 0x4f, 0x28, 0x15, 0x13, 0x2e, 0x35, 0xaa, 0x29, 0x4e, 0x3a, 0x11,
9942
-	0x02, 0x29, 0x25, 0xd3, 0x63, 0x8e, 0x39, 0x3e, 0xaf, 0x66, 0xd5, 0x65, 0xc7, 0x49, 0x05, 0x94,
9943
-	0xf7, 0x57, 0xe6, 0xfd, 0xae, 0x19, 0x86, 0x6c, 0x30, 0x0c, 0x45, 0xcd, 0x4a, 0x43, 0x7f, 0x65,
9944
-	0xde, 0x37, 0x24, 0x49, 0x7b, 0x8b, 0x64, 0xcf, 0xc0, 0x6c, 0xef, 0x4c, 0x96, 0xa5, 0xf3, 0xe5,
9945
-	0x4a, 0xac, 0xfe, 0x31, 0x56, 0xa3, 0x39, 0x65, 0xd1, 0xad, 0xad, 0xdd, 0x56, 0x43, 0xb9, 0x55,
9946
-	0xce, 0xef, 0xba, 0x2d, 0xcf, 0xc5, 0x90, 0x25, 0xbb, 0xad, 0xee, 0xa6, 0xd1, 0xdc, 0xde, 0xa7,
9947
-	0xe8, 0xda, 0x4b, 0x00, 0x29, 0x45, 0x90, 0x4d, 0xd3, 0x76, 0xb0, 0x55, 0xba, 0x42, 0x52, 0x46,
9948
-	0x0b, 0x72, 0x70, 0xb9, 0x04, 0xd3, 0xc5, 0x68, 0xda, 0x70, 0xc7, 0x93, 0x68, 0x9e, 0x5f, 0x57,
9949
-	0xff, 0x90, 0x14, 0xf7, 0x87, 0x3d, 0x88, 0x54, 0x11, 0x21, 0xda, 0x35, 0x48, 0x29, 0xa6, 0x6f,
9950
-	0x3a, 0x0e, 0x73, 0xec, 0x60, 0x20, 0xbb, 0xe9, 0x69, 0x12, 0xb4, 0x00, 0x4f, 0xef, 0x4b, 0xd9,
9951
-	0xa9, 0x08, 0x06, 0xfd, 0xc7, 0x64, 0x05, 0x56, 0x09, 0x4d, 0x28, 0xc9, 0xaa, 0x08, 0x6f, 0x90,
9952
-	0xa2, 0xa5, 0x48, 0x5d, 0xbb, 0x27, 0x42, 0xb1, 0xba, 0x02, 0x8d, 0x5e, 0x21, 0x82, 0x36, 0xeb,
9953
-	0xb4, 0x10, 0x81, 0x9a, 0x3d, 0xb4, 0x73, 0x08, 0x50, 0x5c, 0x3e, 0x53, 0x5d, 0x04, 0x68, 0xaa,
9954
-	0x0d, 0x10, 0xa4, 0x81, 0x17, 0xf3, 0xec, 0xbe, 0x1d, 0xc2, 0xf1, 0xe8, 0x89, 0x32, 0x9b, 0xa1,
9955
-	0x39, 0x24, 0xd4, 0x60, 0xac, 0x7f, 0x94, 0x24, 0x64, 0xcf, 0x0c, 0x4e, 0xe4, 0xd2, 0xd0, 0x90,
9956
-	0x44, 0xd7, 0x8f, 0xf3, 0xda, 0xe0, 0x3d, 0x05, 0xa2, 0x13, 0xbc, 0xf6, 0xa6, 0xaa, 0xb3, 0xa2,
9957
-	0x3b, 0x88, 0x67, 0x94, 0x6b, 0xc5, 0x15, 0xd8, 0xd9, 0x16, 0x00, 0x0f, 0x22, 0xf3, 0x7d, 0x1e,
9958
-	0x45, 0x70, 0x10, 0xe1, 0x13, 0x6e, 0x25, 0xf9, 0xc8, 0x66, 0x59, 0x81, 0x5e, 0x8c, 0x5b, 0x64,
9959
-	0xce, 0xa1, 0x5b, 0x0b, 0x74, 0xc2, 0x57, 0x2d, 0x91, 0x65, 0x1f, 0x8e, 0x19, 0x68, 0xdd, 0x0d,
9960
-	0xf8, 0xb4, 0xfe, 0x27, 0xf0, 0x41, 0xb3, 0x6d, 0xec, 0xc8, 0xdd, 0xae, 0x93, 0xec, 0x91, 0x39,
9961
-	0xb0, 0x9d, 0xb1, 0x3c, 0x66, 0xaf, 0xc5, 0x2d, 0x31, 0xc1, 0x57, 0x8c, 0x5e, 0x0f, 0x9a, 0xb2,
9962
-	0x60, 0x93, 0xf3, 0x50, 0xc9, 0xcb, 0x8b, 0xef, 0xe8, 0xd0, 0x85, 0x22, 0xab, 0x8a, 0x2f, 0x1f,
9963
-	0x61, 0x32, 0xf1, 0x4d, 0x37, 0xb2, 0x56, 0x0c, 0xd0, 0x0b, 0x90, 0x49, 0xd9, 0x19, 0x44, 0x90,
9964
-	0xb0, 0x57, 0x0d, 0xa1, 0xf0, 0xe6, 0xc4, 0x5d, 0x81, 0xf5, 0xc0, 0x64, 0xcc, 0x96, 0x5f, 0xa5,
9965
-	0x0f, 0x95, 0x70, 0x91, 0x26, 0x23, 0xee, 0xf2, 0x3b, 0x3c, 0xa5, 0x4c, 0xa6, 0x9e, 0x29, 0xd3,
9966
-	0xbd, 0x41, 0x96, 0x66, 0xec, 0x7c, 0xac, 0xeb, 0x69, 0xb6, 0x0f, 0xde, 0x2a, 0xa5, 0xe5, 0xd7,
9967
-	0xb7, 0x4b, 0x59, 0xfd, 0x1f, 0xd0, 0x84, 0xb5, 0x3d, 0x7e, 0xac, 0xd0, 0xab, 0xf1, 0xb7, 0xcc,
9968
-	0x1c, 0xbf, 0xb3, 0x5a, 0x9e, 0x23, 0x63, 0x26, 0xb6, 0x09, 0x98, 0x48, 0xc1, 0x02, 0xcd, 0xe1,
9969
-	0x34, 0x62, 0x84, 0xf4, 0x5a, 0x10, 0xfd, 0x4b, 0x77, 0x08, 0x38, 0xee, 0xd6, 0x25, 0x4a, 0x04,
9970
-	0x09, 0x39, 0xf1, 0x0a, 0x33, 0x1c, 0x1d, 0xc2, 0x31, 0xed, 0xb3, 0x9e, 0xc0, 0xa4, 0x39, 0x66,
9971
-	0x29, 0xa2, 0x22, 0x4c, 0xaf, 0xc3, 0x25, 0x4c, 0xc9, 0x5c, 0x25, 0xa9, 0xbd, 0x5a, 0x1b, 0xf2,
9972
-	0xce, 0x0a, 0x64, 0x8d, 0x82, 0x22, 0x03, 0x09, 0x67, 0xf6, 0xeb, 0x6d, 0x48, 0x37, 0x33, 0x33,
9973
-	0x40, 0x2a, 0xa7, 0x31, 0x9d, 0xe8, 0xbf, 0x4c, 0x90, 0xac, 0xa8, 0x32, 0xb1, 0x16, 0x1b, 0x64,
9974
-	0x51, 0x75, 0x3d, 0xa2, 0xf4, 0xbd, 0xf4, 0xe4, 0x32, 0x55, 0x91, 0x55, 0x4f, 0xec, 0xa3, 0xe2,
9975
-	0x2b, 0xbf, 0x4d, 0x8a, 0xd3, 0x13, 0xcf, 0xb4, 0x8b, 0x3f, 0x22, 0x05, 0x0c, 0x14, 0x55, 0xa3,
9976
-	0x37, 0x48, 0x56, 0x54, 0x42, 0x79, 0xd4, 0xcf, 0xab, 0x99, 0x12, 0x09, 0x99, 0x6e, 0x51, 0xd4,
9977
-	0x59, 0x75, 0x3d, 0x5b, 0x3f, 0x3f, 0x1c, 0xa9, 0x82, 0xeb, 0xef, 0x91, 0x74, 0x9b, 0x81, 0x84,
9978
-	0x17, 0xc9, 0xa2, 0x0b, 0xa9, 0x67, 0x92, 0xd9, 0x08, 0xa4, 0xab, 0x2c, 0x36, 0xe0, 0x90, 0xb1,
9979
-	0xb2, 0x38, 0x05, 0xf9, 0x0c, 0x9c, 0x67, 0x42, 0xbc, 0xa9, 0x1b, 0x2a, 0x7e, 0xeb, 0x7b, 0xa4,
9980
-	0x78, 0x8f, 0xd9, 0xc7, 0xfd, 0x10, 0x76, 0x0c, 0x05, 0xbd, 0x46, 0xd2, 0x43, 0x16, 0x29, 0xbf,
9981
-	0x1a, 0x1b, 0x3a, 0x30, 0x4f, 0x39, 0x0a, 0x0f, 0xe4, 0x19, 0xe7, 0x96, 0x8f, 0x02, 0x72, 0xa4,
9982
-	0xff, 0x2e, 0x49, 0x96, 0x9b, 0x41, 0x30, 0x32, 0xa1, 0xe1, 0x96, 0x59, 0xf0, 0xbb, 0xb3, 0x17,
9983
-	0x86, 0x9b, 0xb1, 0x16, 0xce, 0xb0, 0xcc, 0x5e, 0x1a, 0x64, 0xe6, 0x4a, 0x46, 0x99, 0x4b, 0x7f,
9984
-	0x94, 0x50, 0xb7, 0x85, 0x1b, 0x53, 0xe7, 0xa6, 0xbc, 0x0a, 0x41, 0x74, 0x69, 0x5a, 0x12, 0xdb,
9985
-	0x77, 0x4f, 0x5c, 0xef, 0xcc, 0x85, 0x42, 0x0b, 0xb7, 0x87, 0x56, 0xe3, 0x1e, 0x44, 0xda, 0x65,
9986
-	0x00, 0x69, 0x33, 0x20, 0xca, 0x5c, 0x76, 0x86, 0x92, 0xda, 0x8d, 0x56, 0xbd, 0xd9, 0xba, 0x03,
9987
-	0xe5, 0xed, 0x71, 0x49, 0x6d, 0x06, 0xe5, 0xcc, 0x3d, 0x06, 0x77, 0x67, 0x9b, 0x9d, 0xce, 0x3e,
9988
-	0x6f, 0x15, 0x9f, 0x07, 0xd4, 0xc5, 0x19, 0x14, 0x0e, 0xa0, 0x4f, 0x04, 0x10, 0x56, 0x52, 0x00,
9989
-	0xa5, 0x63, 0x40, 0x58, 0x4c, 0x21, 0x81, 0x88, 0x08, 0xff, 0x5b, 0x92, 0x94, 0x0c, 0xcb, 0x62,
9990
-	0xc3, 0x10, 0xe7, 0x65, 0x77, 0xb2, 0x87, 0xdd, 0x1e, 0x7c, 0xd9, 0x0c, 0x5f, 0x4f, 0x30, 0x2c,
9991
-	0x6e, 0xc7, 0xbe, 0x18, 0xcd, 0xf1, 0x55, 0xa8, 0xe7, 0x30, 0xa3, 0x37, 0xb0, 0x03, 0x7c, 0x45,
9992
-	0x10, 0x34, 0x1a, 0x49, 0x2a, 0xff, 0x27, 0x41, 0x2e, 0xc6, 0x20, 0xb4, 0x37, 0x48, 0xda, 0x07,
9993
-	0xb2, 0xdc, 0x9e, 0xb5, 0x27, 0xdd, 0xe7, 0x90, 0x95, 0x72, 0xa4, 0xb6, 0x4e, 0x88, 0x39, 0x0a,
9994
-	0x3d, 0x93, 0xaf, 0xcf, 0x37, 0x26, 0x47, 0xa7, 0x28, 0xda, 0xf7, 0x21, 0x5b, 0x33, 0xcb, 0x97,
9995
-	0x57, 0xa2, 0xc2, 0x46, 0xe3, 0x7f, 0xd5, 0xbe, 0xb2, 0x65, 0x62, 0x46, 0xe9, 0x70, 0x61, 0x54,
9996
-	0x0a, 0x2d, 0xbf, 0x45, 0x8a, 0xd3, 0x74, 0x8c, 0x6e, 0x68, 0x2f, 0x4c, 0x6e, 0x40, 0x91, 0xf2,
9997
-	0x6f, 0x0c, 0x1a, 0xd3, 0x39, 0x56, 0x41, 0x03, 0x9f, 0x3a, 0x25, 0xb9, 0x9a, 0x21, 0xd3, 0xe7,
9998
-	0x26, 0x29, 0xf1, 0x43, 0x63, 0x31, 0x3f, 0xec, 0xb2, 0xfb, 0x43, 0xdb, 0x1f, 0xcb, 0xb8, 0x3f,
9999
-	0xbf, 0xbf, 0x5a, 0x46, 0xae, 0x1a, 0x30, 0x35, 0x38, 0x8f, 0x7e, 0x40, 0x2e, 0xee, 0xfa, 0x56,
10000
-	0x1f, 0x2a, 0xb6, 0x00, 0x48, 0xf1, 0xef, 0x91, 0xb5, 0x10, 0x2a, 0x73, 0xb7, 0x6f, 0x07, 0x21,
10001
-	0xbe, 0x9e, 0x81, 0x92, 0xcc, 0xc5, 0xf9, 0x2e, 0x7f, 0xe5, 0x12, 0xaf, 0x6e, 0xf4, 0x0a, 0x62,
10002
-	0xb6, 0x04, 0x84, 0x2a, 0xc4, 0x36, 0x02, 0xf4, 0x77, 0x49, 0xa9, 0x6e, 0x07, 0x43, 0x33, 0x04,
10003
-	0xd9, 0xb2, 0xb1, 0xd6, 0x5e, 0x26, 0xa5, 0x3e, 0x83, 0xc6, 0xea, 0x90, 0x99, 0x90, 0x9c, 0x99,
10004
-	0x6f, 0x7b, 0x3d, 0xd9, 0x3b, 0xad, 0x44, 0xf4, 0x36, 0x27, 0xeb, 0x5f, 0x42, 0xb1, 0xc0, 0x87,
10005
-	0x03, 0xc9, 0xf9, 0x2a, 0xb9, 0x10, 0xb8, 0xe6, 0x30, 0xe8, 0x7b, 0x61, 0xd7, 0x76, 0x43, 0x7c,
10006
-	0x29, 0x73, 0x24, 0x6b, 0x49, 0x4d, 0x34, 0x25, 0x1d, 0xd2, 0x80, 0x76, 0xc2, 0xd8, 0xb0, 0xeb,
10007
-	0x39, 0xbd, 0xae, 0x9a, 0x14, 0xaf, 0x63, 0x80, 0xc6, 0x99, 0x5d, 0xa7, 0xd7, 0x51, 0x74, 0xad,
10008
-	0x4a, 0xd6, 0x1d, 0xef, 0xb8, 0x0b, 0xba, 0xfb, 0x10, 0x62, 0xdd, 0x23, 0xcf, 0xef, 0x06, 0x8e,
10009
-	0x77, 0x06, 0x1f, 0x0e, 0xfc, 0x31, 0x5f, 0xf5, 0xb4, 0x65, 0x40, 0x35, 0x04, 0x68, 0xd3, 0xf3,
10010
-	0x3b, 0x30, 0xb7, 0xa9, 0x10, 0x58, 0x51, 0x26, 0x86, 0x85, 0xb6, 0x75, 0xa2, 0x2a, 0x4a, 0x44,
10011
-	0xdd, 0x03, 0x22, 0x1c, 0xaa, 0x25, 0xe6, 0x30, 0x8b, 0xbb, 0x91, 0xa3, 0x32, 0x1c, 0x55, 0x54,
10012
-	0x44, 0x04, 0xe9, 0x3f, 0x97, 0x96, 0x8b, 0x27, 0x13, 0x4c, 0x8e, 0x3e, 0x8c, 0x54, 0x72, 0x4c,
10013
-	0x8b, 0xe4, 0x88, 0x00, 0x4c, 0x8e, 0x38, 0x15, 0x9f, 0x1c, 0xc1, 0xae, 0xac, 0x68, 0x67, 0x64,
10014
-	0x04, 0x5f, 0x7f, 0x9a, 0xb7, 0x19, 0xd9, 0x8a, 0x4a, 0x4e, 0xfd, 0x9b, 0x24, 0xdf, 0x76, 0x4c,
10015
-	0x8b, 0xbf, 0x87, 0x62, 0xd3, 0x0b, 0x99, 0x1b, 0xe3, 0x04, 0x76, 0x40, 0x9c, 0xea, 0x3c, 0x9d,
10016
-	0x26, 0xe9, 0x1f, 0x41, 0xad, 0xa3, 0x9e, 0x17, 0xd6, 0x0c, 0x00, 0x67, 0x2d, 0xb3, 0xab, 0xea,
10017
-	0x50, 0xb1, 0x9a, 0x07, 0xad, 0x33, 0x35, 0xe3, 0x2e, 0x1b, 0xd3, 0x8c, 0x65, 0xc2, 0x1f, 0x1a,
10018
-	0x06, 0x08, 0x0c, 0x5f, 0xae, 0x76, 0x51, 0x18, 0x06, 0xf1, 0x0d, 0x14, 0x0a, 0xcc, 0xf8, 0x0f,
10019
-	0x07, 0xbb, 0x28, 0x41, 0xdd, 0x3e, 0x9c, 0x17, 0xd1, 0x23, 0x55, 0x97, 0x01, 0x49, 0x04, 0x12,
10020
-	0x4f, 0x11, 0x25, 0x02, 0x8d, 0xdf, 0xfa, 0x9f, 0x13, 0xa4, 0x80, 0x03, 0xfb, 0xc8, 0xb6, 0x30,
10021
-	0xbd, 0x3e, 0x7b, 0x6a, 0x80, 0xce, 0xd9, 0x0a, 0x7c, 0xa9, 0x14, 0xef, 0x9c, 0x6b, 0x1d, 0x4a,
10022
-	0x91, 0xa6, 0xbd, 0x3f, 0xe7, 0x53, 0xfd, 0xab, 0x0b, 0xc1, 0xac, 0x47, 0xb9, 0x13, 0x27, 0xda,
10023
-	0xf1, 0x30, 0x29, 0xd2, 0x69, 0x12, 0xbe, 0xe5, 0x5a, 0x2e, 0x8f, 0x0c, 0xf9, 0x96, 0x5b, 0x6b,
10024
-	0x51, 0xa0, 0xe8, 0x7f, 0x84, 0x1b, 0x75, 0xc3, 0xb5, 0xfc, 0x31, 0xaf, 0xd5, 0xe8, 0xc1, 0x35,
10025
-	0x92, 0x87, 0x1e, 0x32, 0x18, 0x07, 0x70, 0xd1, 0x52, 0x4f, 0x45, 0x11, 0x41, 0x6b, 0x92, 0x3c,
10026
-	0xe4, 0x0c, 0xcf, 0xb7, 0xc3, 0xfe, 0x40, 0x36, 0x53, 0xaf, 0xc6, 0x3f, 0x08, 0x4e, 0xc9, 0xac,
10027
-	0x18, 0x8a, 0x85, 0x4e, 0xb8, 0x55, 0x47, 0x91, 0xe2, 0xca, 0xf2, 0x8e, 0x02, 0xae, 0x7d, 0x0e,
10028
-	0x74, 0xf8, 0xd0, 0x26, 0x75, 0xb1, 0x71, 0xe6, 0x76, 0xc0, 0x0d, 0x48, 0xd2, 0xf0, 0x32, 0xa0,
10029
-	0xeb, 0x24, 0x1f, 0x09, 0xc3, 0x07, 0x3a, 0xa3, 0xd1, 0xe9, 0xde, 0xda, 0xb8, 0xdd, 0xbd, 0x53,
10030
-	0xdb, 0x81, 0x42, 0x27, 0x4a, 0x47, 0x93, 0x2c, 0xed, 0x98, 0x2e, 0xf4, 0xf6, 0xea, 0xa6, 0x73,
10031
-	0x1b, 0x76, 0x0b, 0x42, 0x52, 0x66, 0xb2, 0xf5, 0xf3, 0x43, 0x56, 0xba, 0x96, 0x73, 0xbc, 0xf2,
10032
-	0x65, 0x8a, 0xe4, 0xa3, 0xbb, 0x04, 0xee, 0x21, 0xd6, 0xca, 0x05, 0x71, 0xcb, 0x8b, 0xe8, 0x2d,
10033
-	0x5e, 0x25, 0xf3, 0xc6, 0xf6, 0xf6, 0x6e, 0xcd, 0xc0, 0x87, 0xb7, 0xf7, 0x45, 0x31, 0x8d, 0x00,
10034
-	0x06, 0x9c, 0x68, 0xdc, 0x85, 0x9e, 0xa6, 0x4f, 0x8a, 0xe9, 0x03, 0x79, 0x97, 0x8c, 0x50, 0xaa,
10035
-	0x92, 0x5e, 0x27, 0x39, 0xa3, 0xd3, 0x69, 0xde, 0x69, 0x81, 0xa4, 0x87, 0x89, 0xf2, 0x73, 0x00,
10036
-	0xba, 0x30, 0x11, 0x05, 0x45, 0xe0, 0xd8, 0x05, 0x49, 0x88, 0xaa, 0xd5, 0x1a, 0x6d, 0x5c, 0xef,
10037
-	0x41, 0x72, 0x1e, 0xc5, 0x4b, 0x08, 0x7f, 0x98, 0xc9, 0xb7, 0x69, 0xa3, 0x6d, 0x50, 0x5c, 0xf1,
10038
-	0x61, 0x72, 0x4e, 0xaf, 0xb6, 0xcf, 0xe0, 0x76, 0x89, 0x6b, 0xae, 0xab, 0x57, 0xc4, 0x07, 0xa9,
10039
-	0xb2, 0x06, 0x98, 0xe5, 0xc9, 0x05, 0x8a, 0x99, 0xbd, 0x31, 0xae, 0xd6, 0xd9, 0x33, 0xe8, 0x1e,
10040
-	0x17, 0x93, 0x9a, 0x5b, 0xad, 0x83, 0xd7, 0x5a, 0x94, 0x02, 0xd6, 0xd1, 0xfd, 0x56, 0x8b, 0x5b,
10041
-	0x97, 0x9e, 0xb3, 0x8e, 0x8e, 0x5c, 0x17, 0x31, 0x37, 0xa0, 0xda, 0xec, 0xee, 0xb4, 0xb7, 0x1b,
10042
-	0x7b, 0x8d, 0xd2, 0xc3, 0xf4, 0x9c, 0x42, 0x35, 0x6f, 0x30, 0x74, 0x58, 0x28, 0xcc, 0xeb, 0x6c,
10043
-	0xed, 0xef, 0xf1, 0x47, 0xce, 0x07, 0x99, 0xf9, 0x05, 0xfb, 0xa3, 0xb0, 0x87, 0xed, 0xcb, 0xb5,
10044
-	0xa8, 0x9f, 0x78, 0x98, 0x11, 0x8f, 0x1e, 0x11, 0x46, 0x34, 0x13, 0x28, 0x87, 0x36, 0xbe, 0x27,
10045
-	0xde, 0x43, 0x1f, 0x64, 0xe7, 0xe4, 0x50, 0xf6, 0x21, 0xa4, 0x48, 0x68, 0x39, 0xa2, 0xa7, 0x91,
10046
-	0x68, 0xea, 0x95, 0x1f, 0x90, 0x9c, 0x3a, 0xc1, 0xe0, 0x9d, 0xec, 0xbd, 0x5d, 0x7a, 0xb7, 0x41,
10047
-	0x61, 0xeb, 0xb9, 0x77, 0xd4, 0xcc, 0x3d, 0xcf, 0x87, 0x40, 0x02, 0x35, 0x16, 0x77, 0x8c, 0x96,
10048
-	0x71, 0x07, 0x00, 0xf2, 0xed, 0x45, 0x01, 0x64, 0x1c, 0x96, 0x4b, 0x72, 0x81, 0x48, 0x66, 0x75,
10049
-	0xed, 0xd1, 0xe7, 0xeb, 0x0b, 0x9f, 0xc2, 0xef, 0xef, 0x9f, 0xaf, 0x27, 0x1e, 0x7c, 0xb1, 0x9e,
10050
-	0x78, 0x04, 0xbf, 0x3f, 0xc0, 0xef, 0x2f, 0xf0, 0x3b, 0xcc, 0xf2, 0x7b, 0xc7, 0x9b, 0xff, 0x0d,
10051
-	0x00, 0x00, 0xff, 0xff, 0x6c, 0xaf, 0xb7, 0x57, 0xd1, 0x1b, 0x00, 0x00,
9867
+	// 2920 bytes of a gzipped FileDescriptorProto
9868
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xac, 0x58, 0x4d, 0x6c, 0x1b, 0xc7,
9869
+	0x15, 0x16, 0x7f, 0x45, 0x0e, 0x29, 0x89, 0x5e, 0x3b, 0x8e, 0xcc, 0xa8, 0xb2, 0xbb, 0x89, 0x1b,
9870
+	0xe7, 0xa7, 0x4c, 0xac, 0xa4, 0x85, 0x9b, 0x20, 0x4d, 0x96, 0x3f, 0xb2, 0x58, 0x4b, 0x14, 0x31,
9871
+	0x94, 0x64, 0xe4, 0xd0, 0x12, 0xab, 0xe5, 0x48, 0xdc, 0x68, 0xb9, 0xcb, 0xee, 0x2e, 0x25, 0x13,
9872
+	0x45, 0x01, 0xa7, 0x97, 0x16, 0x39, 0xf5, 0x5e, 0x04, 0x45, 0xd1, 0x5e, 0x7b, 0x2e, 0xd0, 0x93,
9873
+	0x8f, 0x3e, 0xb6, 0x28, 0x50, 0xe4, 0x14, 0x34, 0xe9, 0xa1, 0xd7, 0x02, 0x2d, 0x9a, 0x43, 0x7b,
9874
+	0xe8, 0x7b, 0xf3, 0xb3, 0xfc, 0xf1, 0x5a, 0xb1, 0x9b, 0x1e, 0x08, 0xee, 0xbc, 0xf9, 0xde, 0x9b,
9875
+	0x79, 0x6f, 0xde, 0xdf, 0x0c, 0x29, 0x84, 0xe3, 0x21, 0x0b, 0x2a, 0x43, 0xdf, 0x0b, 0x3d, 0x4d,
9876
+	0xeb, 0x79, 0xd6, 0x09, 0xf3, 0x2b, 0xc1, 0x99, 0xe9, 0x0f, 0x4e, 0xec, 0xb0, 0x72, 0x7a, 0xb3,
9877
+	0x7c, 0x25, 0xb4, 0x07, 0x2c, 0x08, 0xcd, 0xc1, 0xf0, 0xb5, 0xe8, 0x4b, 0xc0, 0xcb, 0xcf, 0xf6,
9878
+	0x46, 0xbe, 0x19, 0xda, 0x9e, 0xfb, 0x9a, 0xfa, 0x90, 0x13, 0x97, 0x8e, 0xbd, 0x63, 0x8f, 0x7f,
9879
+	0xbe, 0x86, 0x5f, 0x82, 0xaa, 0x5f, 0x25, 0x8b, 0x07, 0xcc, 0x0f, 0x00, 0xa6, 0x5d, 0x22, 0x19,
9880
+	0xdb, 0xed, 0xb1, 0x7b, 0xab, 0x89, 0x6b, 0x89, 0x1b, 0x69, 0x2a, 0x06, 0xfa, 0xaf, 0x12, 0xa4,
9881
+	0x60, 0xb8, 0xae, 0x17, 0x72, 0x59, 0x81, 0xa6, 0x91, 0xb4, 0x6b, 0x0e, 0x18, 0x07, 0xe5, 0x29,
9882
+	0xff, 0xd6, 0x6a, 0x24, 0xeb, 0x98, 0x87, 0xcc, 0x09, 0x56, 0x93, 0xd7, 0x52, 0x37, 0x0a, 0x1b,
9883
+	0xaf, 0x54, 0x1e, 0xdd, 0x73, 0x65, 0x4a, 0x48, 0x65, 0x9b, 0xa3, 0x1b, 0x6e, 0xe8, 0x8f, 0xa9,
9884
+	0x64, 0x2d, 0x7f, 0x87, 0x14, 0xa6, 0xc8, 0x5a, 0x89, 0xa4, 0x4e, 0xd8, 0x58, 0x2e, 0x83, 0x9f,
9885
+	0xb8, 0xbf, 0x53, 0xd3, 0x19, 0x31, 0x58, 0x04, 0x69, 0x62, 0xf0, 0x56, 0xf2, 0x56, 0x42, 0x7f,
9886
+	0x9f, 0xe4, 0x29, 0x0b, 0xbc, 0x91, 0x6f, 0xb1, 0x40, 0x7b, 0x89, 0xe4, 0x5d, 0xd3, 0xf5, 0xba,
9887
+	0xd6, 0x70, 0x14, 0x70, 0xf6, 0x54, 0xb5, 0xf8, 0xf9, 0xa7, 0x57, 0x73, 0x2d, 0x20, 0xd6, 0xda,
9888
+	0xfb, 0x01, 0xcd, 0xe1, 0x74, 0x0d, 0x66, 0xb5, 0xaf, 0x93, 0xe2, 0x80, 0x0d, 0x3c, 0x7f, 0xdc,
9889
+	0x3d, 0x1c, 0x87, 0x2c, 0xe0, 0x82, 0x53, 0xb4, 0x20, 0x68, 0x55, 0x24, 0xe9, 0x3f, 0x4f, 0x90,
9890
+	0x4b, 0x4a, 0x36, 0x65, 0x3f, 0x1c, 0xd9, 0x3e, 0x1b, 0x30, 0x37, 0x0c, 0xb4, 0x6f, 0x81, 0xce,
9891
+	0xf6, 0xc0, 0x0e, 0xc5, 0x1a, 0x85, 0x8d, 0xaf, 0xc5, 0xe9, 0x1c, 0xed, 0x8a, 0x4a, 0xb0, 0x66,
9892
+	0x90, 0xa2, 0xcf, 0x02, 0xe6, 0x9f, 0x0a, 0x4b, 0xf0, 0x25, 0xbf, 0x94, 0x79, 0x86, 0x45, 0xdf,
9893
+	0x24, 0xb9, 0xb6, 0x63, 0x86, 0x47, 0x9e, 0x3f, 0xd0, 0x74, 0x52, 0x34, 0x7d, 0xab, 0x6f, 0x87,
9894
+	0xcc, 0x0a, 0x47, 0xbe, 0x3a, 0x95, 0x19, 0x9a, 0x76, 0x99, 0x24, 0x3d, 0xb1, 0x50, 0xbe, 0x9a,
9895
+	0x05, 0x4b, 0x24, 0x77, 0x3b, 0x14, 0x28, 0xfa, 0xdb, 0xe4, 0x42, 0xdb, 0x19, 0x1d, 0xdb, 0x6e,
9896
+	0x9d, 0x05, 0x96, 0x6f, 0x0f, 0x51, 0x3a, 0x1e, 0x2f, 0x3a, 0x9f, 0x3a, 0x5e, 0xfc, 0x8e, 0x8e,
9897
+	0x3c, 0x39, 0x39, 0x72, 0xfd, 0xa7, 0x49, 0x72, 0xa1, 0xe1, 0x02, 0x33, 0x9b, 0xe6, 0xbe, 0x4e,
9898
+	0x96, 0x19, 0x27, 0x76, 0x4f, 0x85, 0x53, 0x49, 0x39, 0x4b, 0x82, 0xaa, 0x3c, 0xad, 0x39, 0xe7,
9899
+	0x2f, 0x37, 0xe3, 0xd4, 0x7f, 0x44, 0x7a, 0x9c, 0xd7, 0x68, 0x0d, 0xb2, 0x38, 0xe4, 0x4a, 0x04,
9900
+	0xab, 0x29, 0x2e, 0xeb, 0x7a, 0x9c, 0xac, 0x47, 0xf4, 0xac, 0xa6, 0x1f, 0x7e, 0x7a, 0x75, 0x81,
9901
+	0x2a, 0xde, 0xaf, 0xe2, 0x7c, 0x7f, 0x4d, 0x90, 0x95, 0x96, 0xd7, 0x9b, 0xb1, 0x43, 0x99, 0xe4,
9902
+	0xfa, 0x5e, 0x10, 0x4e, 0x05, 0x4a, 0x34, 0xd6, 0x6e, 0x91, 0xdc, 0x50, 0x1e, 0x9f, 0x3c, 0xfd,
9903
+	0xb5, 0xf8, 0x2d, 0x0b, 0x0c, 0x8d, 0xd0, 0xda, 0xdb, 0x24, 0xef, 0x2b, 0x9f, 0x00, 0x6d, 0x9f,
9904
+	0xc0, 0x71, 0x26, 0x78, 0xed, 0x1d, 0x92, 0x15, 0x87, 0xb0, 0x9a, 0xe6, 0x9c, 0xd7, 0x9f, 0xc8,
9905
+	0xe6, 0x54, 0x32, 0xe9, 0x9f, 0x24, 0x48, 0x89, 0x9a, 0x47, 0xe1, 0x0e, 0x1b, 0x1c, 0x32, 0xbf,
9906
+	0x03, 0x81, 0x0c, 0xf1, 0x73, 0x19, 0xce, 0x91, 0x99, 0x3d, 0xe6, 0x73, 0x25, 0x73, 0x54, 0x8e,
9907
+	0xb4, 0x7d, 0x74, 0x72, 0xd3, 0xea, 0x9b, 0x87, 0xb6, 0x63, 0x87, 0x63, 0xae, 0xe6, 0x72, 0xfc,
9908
+	0x29, 0xcf, 0xcb, 0x84, 0xcd, 0x4f, 0x18, 0xe9, 0x8c, 0x18, 0x6d, 0x95, 0x2c, 0x42, 0xae, 0x0b,
9909
+	0xcc, 0x63, 0xc6, 0xb5, 0xcf, 0x53, 0x35, 0x04, 0x57, 0x2e, 0x4e, 0xf3, 0x69, 0x05, 0xb2, 0xb8,
9910
+	0xdf, 0xba, 0xd3, 0xda, 0xbd, 0xdb, 0x2a, 0x2d, 0x68, 0x2b, 0xa4, 0xb0, 0xdf, 0xa2, 0x0d, 0xa3,
9911
+	0xb6, 0x65, 0x54, 0xb7, 0x1b, 0xa5, 0x84, 0xb6, 0x04, 0xe9, 0x22, 0x1a, 0x26, 0xf5, 0x5f, 0x26,
9912
+	0x08, 0xc1, 0x03, 0x94, 0x4a, 0xbd, 0x45, 0x32, 0x90, 0x4f, 0x43, 0x71, 0x70, 0xcb, 0x1b, 0x2f,
9913
+	0xc4, 0xed, 0x7a, 0x02, 0xaf, 0xe0, 0x1f, 0xa3, 0x82, 0x65, 0x7a, 0x87, 0xc9, 0xf9, 0x1d, 0x66,
9914
+	0x38, 0x72, 0x76, 0x6b, 0x39, 0x92, 0xae, 0xe3, 0x57, 0x42, 0xcb, 0x93, 0x0c, 0xec, 0xa9, 0xfe,
9915
+	0x7e, 0x29, 0x09, 0xce, 0x57, 0xac, 0x37, 0x3b, 0xb5, 0xdd, 0x56, 0xab, 0x51, 0xdb, 0x6b, 0xd4,
9916
+	0x4b, 0x29, 0xfd, 0x3a, 0xc9, 0x34, 0x07, 0x20, 0x45, 0x5b, 0x43, 0x0f, 0x38, 0x62, 0x3e, 0x73,
9917
+	0x2d, 0xe5, 0x58, 0x13, 0x82, 0xfe, 0xaf, 0x45, 0x92, 0xd9, 0xf1, 0x46, 0x6e, 0xa8, 0x6d, 0x4c,
9918
+	0x45, 0xf1, 0xf2, 0xc6, 0x7a, 0x9c, 0x0a, 0x1c, 0x58, 0xd9, 0x03, 0x94, 0x8c, 0x72, 0x38, 0x4c,
9919
+	0xe1, 0x2b, 0x72, 0xeb, 0x72, 0x84, 0xf4, 0xd0, 0xf4, 0x8f, 0x59, 0x28, 0x8d, 0x2e, 0x47, 0xe8,
9920
+	0xe3, 0x67, 0xbe, 0x1d, 0x9a, 0x87, 0x8e, 0x70, 0xa9, 0x1c, 0x8d, 0xc6, 0xda, 0x16, 0x29, 0x1e,
9921
+	0x42, 0xf9, 0xe8, 0x7a, 0x43, 0x91, 0xe5, 0x32, 0x8f, 0x77, 0x39, 0xb1, 0x8f, 0x2a, 0xa0, 0x77,
9922
+	0x05, 0x98, 0x16, 0x0e, 0x27, 0x03, 0xad, 0x45, 0x96, 0x4f, 0x3d, 0x67, 0x34, 0x60, 0x91, 0xac,
9923
+	0x2c, 0x97, 0xf5, 0xe2, 0xe3, 0x65, 0x1d, 0x70, 0xbc, 0x92, 0xb6, 0x74, 0x3a, 0x3d, 0x2c, 0xff,
9924
+	0x24, 0x45, 0x0a, 0x53, 0x8b, 0x69, 0x1d, 0x52, 0x80, 0x42, 0x38, 0x34, 0x8f, 0x79, 0x72, 0x95,
9925
+	0x06, 0xbb, 0xf9, 0x44, 0x1b, 0xad, 0xb4, 0x27, 0x8c, 0x74, 0x5a, 0x8a, 0xfe, 0x71, 0x92, 0x14,
9926
+	0xa6, 0x26, 0xb5, 0x97, 0x49, 0x8e, 0xb6, 0x69, 0xf3, 0xc0, 0xd8, 0x6b, 0x94, 0x16, 0xca, 0x6b,
9927
+	0x1f, 0x7d, 0x7c, 0x6d, 0x95, 0x4b, 0x9b, 0x16, 0xd0, 0xf6, 0xed, 0x53, 0xf4, 0x8f, 0x1b, 0x64,
9928
+	0x51, 0x41, 0x13, 0xe5, 0xe7, 0x00, 0xfa, 0xec, 0x3c, 0x74, 0x0a, 0x49, 0x3b, 0x5b, 0x06, 0x05,
9929
+	0x17, 0x49, 0xc6, 0x23, 0x69, 0xa7, 0x6f, 0xfa, 0xac, 0xa7, 0x7d, 0x83, 0x64, 0x25, 0x30, 0x55,
9930
+	0x2e, 0x03, 0xf0, 0xf2, 0x3c, 0x70, 0x82, 0xa3, 0x9d, 0x6d, 0xe3, 0xa0, 0x51, 0x4a, 0xc7, 0xe3,
9931
+	0x68, 0xc7, 0x31, 0x4f, 0x99, 0xf6, 0x02, 0x38, 0x33, 0x87, 0x65, 0xca, 0x57, 0x00, 0xf6, 0xcc,
9932
+	0x23, 0xe2, 0x10, 0x55, 0x5e, 0xfd, 0xd9, 0xaf, 0xd7, 0x17, 0x7e, 0xff, 0x9b, 0xf5, 0xd2, 0xfc,
9933
+	0x74, 0xf9, 0x9f, 0x09, 0xb2, 0x34, 0x73, 0x4a, 0xe8, 0x4c, 0x43, 0x6f, 0x38, 0x72, 0x54, 0xdc,
9934
+	0x81, 0x33, 0xa9, 0xb1, 0x76, 0x67, 0xae, 0x5a, 0xbc, 0xf1, 0x84, 0x47, 0x1f, 0x5b, 0x2f, 0xde,
9935
+	0x25, 0x4b, 0x3d, 0xb0, 0x1f, 0xf3, 0xbb, 0x96, 0xe7, 0x1e, 0xd9, 0xc7, 0x32, 0x8f, 0x96, 0xe3,
9936
+	0x64, 0xd6, 0x39, 0x90, 0x16, 0x05, 0x43, 0x8d, 0xe3, 0xbf, 0x4a, 0xa5, 0xb8, 0x4b, 0xd2, 0x18,
9937
+	0x6f, 0xda, 0x73, 0x24, 0x5d, 0x6d, 0xb6, 0xea, 0xe0, 0x0a, 0x17, 0xc0, 0x7a, 0x4b, 0x7c, 0xeb,
9938
+	0x38, 0x81, 0xbe, 0xa5, 0x5d, 0x25, 0xd9, 0x83, 0xdd, 0xed, 0xfd, 0x1d, 0x3c, 0xfe, 0x8b, 0x30,
9939
+	0xbd, 0x12, 0x4d, 0x0b, 0xe5, 0xca, 0x17, 0xa4, 0x59, 0xf3, 0xd1, 0x84, 0xfe, 0xef, 0x24, 0x59,
9940
+	0xa2, 0xd8, 0x05, 0xfa, 0x61, 0xdb, 0x73, 0x6c, 0x6b, 0xac, 0xb5, 0x49, 0x1e, 0xf4, 0xeb, 0xd9,
9941
+	0x53, 0x4e, 0xbd, 0xf1, 0x98, 0x52, 0x31, 0xe1, 0x52, 0xa3, 0x9a, 0xe2, 0xa4, 0x13, 0x21, 0x90,
9942
+	0x52, 0x32, 0x3d, 0xe6, 0x98, 0xe3, 0xf3, 0x6a, 0x56, 0x5d, 0x76, 0x9c, 0x54, 0x40, 0x79, 0x7f,
9943
+	0x65, 0xde, 0xeb, 0x9a, 0x61, 0xc8, 0x06, 0xc3, 0x50, 0xd4, 0xac, 0x34, 0xf4, 0x57, 0xe6, 0x3d,
9944
+	0x43, 0x92, 0xb4, 0x37, 0x49, 0xf6, 0x0c, 0xd4, 0xf6, 0xce, 0x64, 0x59, 0x3a, 0x5f, 0xae, 0xc4,
9945
+	0xea, 0x1f, 0x61, 0x35, 0x9a, 0xdb, 0x2c, 0x9a, 0xb5, 0xb5, 0xdb, 0x6a, 0x28, 0xb3, 0xca, 0xf9,
9946
+	0x5d, 0xb7, 0xe5, 0xb9, 0xe8, 0xb2, 0x64, 0xb7, 0xd5, 0xdd, 0x34, 0x9a, 0xdb, 0xfb, 0x14, 0x4d,
9947
+	0x7b, 0x09, 0x20, 0xa5, 0x08, 0xb2, 0x69, 0xda, 0x0e, 0xb6, 0x4a, 0x57, 0x48, 0xca, 0x68, 0x41,
9948
+	0x0e, 0x2e, 0x97, 0x60, 0xba, 0x18, 0x4d, 0x1b, 0xee, 0x78, 0xe2, 0xcd, 0xf3, 0xeb, 0xea, 0x1f,
9949
+	0x90, 0xe2, 0xfe, 0xb0, 0x07, 0x9e, 0x2a, 0x3c, 0x44, 0xbb, 0x06, 0x29, 0xc5, 0xf4, 0x4d, 0xc7,
9950
+	0x61, 0x8e, 0x1d, 0x0c, 0x64, 0x37, 0x3d, 0x4d, 0x82, 0x16, 0xe0, 0xc9, 0x6d, 0x29, 0x3b, 0x15,
9951
+	0xc1, 0xa0, 0xff, 0x98, 0xac, 0xc0, 0x2a, 0xa1, 0x09, 0x25, 0x59, 0x15, 0xe1, 0x0d, 0x52, 0xb4,
9952
+	0x14, 0xa9, 0x6b, 0xf7, 0x84, 0x2b, 0x56, 0x57, 0xa0, 0xd1, 0x2b, 0x44, 0xd0, 0x66, 0x9d, 0x16,
9953
+	0x22, 0x50, 0xb3, 0x87, 0x7a, 0x0e, 0x01, 0x8a, 0xcb, 0x67, 0xaa, 0x8b, 0x00, 0x4d, 0xb5, 0x01,
9954
+	0x82, 0x34, 0xb0, 0x62, 0x9e, 0xdd, 0xb3, 0x43, 0x08, 0x8f, 0x9e, 0x28, 0xb3, 0x19, 0x9a, 0x43,
9955
+	0x42, 0x0d, 0xc6, 0xfa, 0x87, 0x49, 0x42, 0xf6, 0xcc, 0xe0, 0x44, 0x2e, 0x0d, 0x0d, 0x49, 0x74,
9956
+	0xfd, 0x38, 0xaf, 0x0d, 0xde, 0x53, 0x20, 0x3a, 0xc1, 0x6b, 0x6f, 0xa8, 0x3a, 0x2b, 0xba, 0x83,
9957
+	0x78, 0x46, 0xb9, 0x56, 0x5c, 0x81, 0x9d, 0x6d, 0x01, 0x30, 0x10, 0x99, 0xef, 0x73, 0x2f, 0x82,
9958
+	0x40, 0x84, 0x4f, 0xb8, 0x95, 0xe4, 0x23, 0x9d, 0x65, 0x05, 0x7a, 0x3e, 0x6e, 0x91, 0x39, 0x83,
9959
+	0x6e, 0x2d, 0xd0, 0x09, 0x5f, 0xb5, 0x44, 0x96, 0x7d, 0x08, 0x33, 0xd8, 0x75, 0x37, 0xe0, 0xd3,
9960
+	0xfa, 0x9f, 0xc0, 0x06, 0xcd, 0xb6, 0xb1, 0x23, 0x4f, 0xbb, 0x4e, 0xb2, 0x47, 0xe6, 0xc0, 0x76,
9961
+	0xc6, 0x32, 0xcc, 0x5e, 0x8d, 0x5b, 0x62, 0x82, 0xaf, 0x18, 0xbd, 0x1e, 0x34, 0x65, 0xc1, 0x26,
9962
+	0xe7, 0xa1, 0x92, 0x97, 0x17, 0xdf, 0xd1, 0xa1, 0x0b, 0x45, 0x56, 0x15, 0x5f, 0x3e, 0xc2, 0x64,
9963
+	0xe2, 0x9b, 0x6e, 0xa4, 0xad, 0x18, 0xa0, 0x15, 0x20, 0x93, 0xb2, 0x33, 0xf0, 0x20, 0xa1, 0xaf,
9964
+	0x1a, 0x42, 0xe1, 0xcd, 0x89, 0xbb, 0x02, 0xeb, 0x81, 0xca, 0x98, 0x2d, 0xbf, 0x6c, 0x3f, 0x54,
9965
+	0xc2, 0x45, 0x9a, 0x8c, 0xb8, 0xcb, 0x6f, 0xf3, 0x94, 0x32, 0x99, 0x7a, 0xaa, 0x4c, 0xf7, 0x3a,
9966
+	0x59, 0x9a, 0xd1, 0xf3, 0x91, 0xae, 0xa7, 0xd9, 0x3e, 0x78, 0xb3, 0x94, 0x96, 0x5f, 0xdf, 0x2e,
9967
+	0x65, 0xf5, 0x7f, 0x40, 0x13, 0xd6, 0xf6, 0x78, 0x58, 0xa1, 0x55, 0xe3, 0x6f, 0x99, 0x39, 0x7e,
9968
+	0x67, 0xb5, 0x3c, 0x47, 0xfa, 0x4c, 0x6c, 0x13, 0x30, 0x91, 0x82, 0x05, 0x9a, 0xc3, 0x69, 0xc4,
9969
+	0x08, 0xe9, 0xb5, 0x20, 0xfa, 0x97, 0xee, 0x10, 0x70, 0xdc, 0xac, 0x4b, 0x94, 0x08, 0x12, 0x72,
9970
+	0xe2, 0x15, 0x66, 0x38, 0x3a, 0x84, 0x30, 0xed, 0xb3, 0x9e, 0xc0, 0xa4, 0x39, 0x66, 0x29, 0xa2,
9971
+	0x22, 0x4c, 0xaf, 0xc3, 0x25, 0x4c, 0xc9, 0x5c, 0x25, 0xa9, 0xbd, 0x5a, 0x1b, 0xf2, 0xce, 0x0a,
9972
+	0x64, 0x8d, 0x82, 0x22, 0x03, 0x09, 0x67, 0xf6, 0xeb, 0x6d, 0x48, 0x37, 0x33, 0x33, 0x40, 0x2a,
9973
+	0xa7, 0x31, 0x9d, 0xe8, 0xbf, 0x48, 0x90, 0xac, 0xa8, 0x32, 0xb1, 0x1a, 0x1b, 0x64, 0x51, 0x75,
9974
+	0x3d, 0xa2, 0xf4, 0xbd, 0xf8, 0xf8, 0x32, 0x55, 0x91, 0x55, 0x4f, 0x9c, 0xa3, 0xe2, 0x2b, 0xbf,
9975
+	0x45, 0x8a, 0xd3, 0x13, 0x4f, 0x75, 0x8a, 0x3f, 0x22, 0x05, 0x74, 0x14, 0x55, 0xa3, 0x37, 0x48,
9976
+	0x56, 0x54, 0x42, 0x19, 0xea, 0xe7, 0xd5, 0x4c, 0x89, 0x84, 0x4c, 0xb7, 0x28, 0xea, 0xac, 0xba,
9977
+	0x9e, 0xad, 0x9f, 0xef, 0x8e, 0x54, 0xc1, 0xf5, 0x77, 0x49, 0xba, 0xcd, 0x40, 0xc2, 0xf3, 0x64,
9978
+	0xd1, 0x85, 0xd4, 0x33, 0xc9, 0x6c, 0x04, 0xd2, 0x55, 0x16, 0x1b, 0x70, 0xc8, 0x58, 0x59, 0x9c,
9979
+	0x82, 0x7c, 0x06, 0xc6, 0x33, 0xc1, 0xdf, 0xd4, 0x0d, 0x15, 0xbf, 0xf5, 0x3d, 0x52, 0xbc, 0xcb,
9980
+	0xec, 0xe3, 0x7e, 0x08, 0x27, 0x86, 0x82, 0x5e, 0x25, 0xe9, 0x21, 0x8b, 0x36, 0xbf, 0x1a, 0xeb,
9981
+	0x3a, 0x30, 0x4f, 0x39, 0x0a, 0x03, 0xf2, 0x8c, 0x73, 0xcb, 0x47, 0x01, 0x39, 0xd2, 0x7f, 0x9b,
9982
+	0x24, 0xcb, 0xcd, 0x20, 0x18, 0x99, 0xd0, 0x70, 0xcb, 0x2c, 0xf8, 0xdd, 0xd9, 0x0b, 0xc3, 0x8d,
9983
+	0x58, 0x0d, 0x67, 0x58, 0x66, 0x2f, 0x0d, 0x32, 0x73, 0x25, 0xa3, 0xcc, 0xa5, 0x3f, 0x4c, 0xa8,
9984
+	0xdb, 0xc2, 0xf5, 0xa9, 0xb8, 0x29, 0xaf, 0x82, 0x13, 0x5d, 0x9a, 0x96, 0xc4, 0xf6, 0xdd, 0x13,
9985
+	0xd7, 0x3b, 0x73, 0xa1, 0xd0, 0xc2, 0xed, 0xa1, 0xd5, 0xb8, 0x0b, 0x9e, 0x76, 0x19, 0x40, 0xda,
9986
+	0x0c, 0x88, 0x32, 0x97, 0x9d, 0xa1, 0xa4, 0x76, 0xa3, 0x55, 0x6f, 0xb6, 0x6e, 0x43, 0x79, 0x7b,
9987
+	0x54, 0x52, 0x9b, 0x41, 0x39, 0x73, 0x8f, 0xc1, 0xdc, 0xd9, 0x66, 0xa7, 0xb3, 0xcf, 0x5b, 0xc5,
9988
+	0x67, 0x01, 0x75, 0x71, 0x06, 0x85, 0x03, 0xe8, 0x13, 0x01, 0x84, 0x95, 0x14, 0x40, 0xe9, 0x18,
9989
+	0x10, 0x16, 0x53, 0x48, 0x20, 0xc2, 0xc3, 0xff, 0x96, 0x24, 0x25, 0xc3, 0xb2, 0xd8, 0x30, 0xc4,
9990
+	0x79, 0xd9, 0x9d, 0xec, 0x61, 0xb7, 0x07, 0x5f, 0x36, 0xc3, 0xd7, 0x13, 0x74, 0x8b, 0x5b, 0xb1,
9991
+	0x2f, 0x46, 0x73, 0x7c, 0x15, 0xea, 0x39, 0xcc, 0xe8, 0x0d, 0xec, 0x00, 0x5f, 0x11, 0x04, 0x8d,
9992
+	0x46, 0x92, 0xca, 0xff, 0x49, 0x90, 0x8b, 0x31, 0x08, 0xed, 0x75, 0x92, 0xf6, 0x81, 0x2c, 0x8f,
9993
+	0x67, 0xed, 0x71, 0xf7, 0x39, 0x64, 0xa5, 0x1c, 0xa9, 0xad, 0x13, 0x62, 0x8e, 0x42, 0xcf, 0xe4,
9994
+	0xeb, 0xf3, 0x83, 0xc9, 0xd1, 0x29, 0x8a, 0xf6, 0x7d, 0xc8, 0xd6, 0xcc, 0xf2, 0xe5, 0x95, 0xa8,
9995
+	0xb0, 0xd1, 0xf8, 0x5f, 0x77, 0x5f, 0xd9, 0x32, 0x31, 0xa3, 0x74, 0xb8, 0x30, 0x2a, 0x85, 0x96,
9996
+	0xdf, 0x24, 0xc5, 0x69, 0x3a, 0x7a, 0x37, 0xb4, 0x17, 0x26, 0x57, 0xa0, 0x48, 0xf9, 0x37, 0x3a,
9997
+	0x8d, 0xe9, 0x1c, 0x2b, 0xa7, 0x81, 0x4f, 0x9d, 0x92, 0x5c, 0xcd, 0x90, 0xe9, 0x73, 0x93, 0x94,
9998
+	0x78, 0xd0, 0x58, 0xcc, 0x0f, 0xbb, 0xec, 0xde, 0xd0, 0xf6, 0xc7, 0xd2, 0xef, 0xcf, 0xef, 0xaf,
9999
+	0x96, 0x91, 0xab, 0x06, 0x4c, 0x0d, 0xce, 0xa3, 0x1f, 0x90, 0x8b, 0xbb, 0xbe, 0xd5, 0x87, 0x8a,
10000
+	0x2d, 0x00, 0x52, 0xfc, 0xbb, 0x64, 0x2d, 0x84, 0xca, 0xdc, 0xed, 0xdb, 0x41, 0x88, 0xaf, 0x67,
10001
+	0xb0, 0x49, 0xe6, 0xe2, 0x7c, 0x97, 0xbf, 0x72, 0x89, 0x57, 0x37, 0x7a, 0x05, 0x31, 0x5b, 0x02,
10002
+	0x42, 0x15, 0x62, 0x1b, 0x01, 0xfa, 0x3b, 0xa4, 0x54, 0xb7, 0x83, 0xa1, 0x19, 0x82, 0x6c, 0xd9,
10003
+	0x58, 0x6b, 0x2f, 0x91, 0x52, 0x9f, 0x41, 0x63, 0x75, 0xc8, 0x4c, 0x48, 0xce, 0xcc, 0xb7, 0xbd,
10004
+	0x9e, 0xec, 0x9d, 0x56, 0x22, 0x7a, 0x9b, 0x93, 0xf5, 0x2f, 0xa0, 0x58, 0xe0, 0xc3, 0x81, 0xe4,
10005
+	0x7c, 0x85, 0x5c, 0x08, 0x5c, 0x73, 0x18, 0xf4, 0xbd, 0xb0, 0x6b, 0xbb, 0x21, 0xbe, 0x94, 0x39,
10006
+	0x92, 0xb5, 0xa4, 0x26, 0x9a, 0x92, 0x0e, 0x69, 0x40, 0x3b, 0x61, 0x6c, 0xd8, 0xf5, 0x9c, 0x5e,
10007
+	0x57, 0x4d, 0x8a, 0xd7, 0x31, 0x40, 0xe3, 0xcc, 0xae, 0xd3, 0xeb, 0x28, 0xba, 0x56, 0x25, 0xeb,
10008
+	0x8e, 0x77, 0xdc, 0x85, 0xbd, 0xfb, 0xe0, 0x62, 0xdd, 0x23, 0xcf, 0xef, 0x06, 0x8e, 0x77, 0x06,
10009
+	0x1f, 0x0e, 0xfc, 0x31, 0x5f, 0xf5, 0xb4, 0x65, 0x40, 0x35, 0x04, 0x68, 0xd3, 0xf3, 0x3b, 0x30,
10010
+	0xb7, 0xa9, 0x10, 0x58, 0x51, 0x26, 0x8a, 0x85, 0xb6, 0x75, 0xa2, 0x2a, 0x4a, 0x44, 0xdd, 0x03,
10011
+	0x22, 0x04, 0xd5, 0x12, 0x73, 0x98, 0xc5, 0xcd, 0xc8, 0x51, 0x19, 0x8e, 0x2a, 0x2a, 0x22, 0x82,
10012
+	0xf4, 0x6f, 0x92, 0x7c, 0xdb, 0x31, 0x2d, 0xfe, 0x06, 0x89, 0x8d, 0x26, 0x64, 0x4b, 0x3c, 0x1b,
10013
+	0xd0, 0x5a, 0x44, 0x52, 0x9e, 0x4e, 0x93, 0xf4, 0x0f, 0xa1, 0xbe, 0x50, 0xcf, 0x0b, 0x6b, 0x06,
10014
+	0x80, 0xb3, 0x96, 0xd9, 0x55, 0xb9, 0xbf, 0x58, 0xcd, 0x43, 0x1a, 0xcd, 0xd4, 0x8c, 0x3b, 0x6c,
10015
+	0x4c, 0x33, 0x96, 0x09, 0x7f, 0x98, 0x69, 0x01, 0x81, 0x2e, 0xc3, 0xcd, 0x51, 0x14, 0x99, 0x16,
10016
+	0x7c, 0x0a, 0x28, 0x14, 0x98, 0xf1, 0x1f, 0x82, 0xa9, 0x28, 0x41, 0xdd, 0x3e, 0xf8, 0xa8, 0xe8,
10017
+	0x4b, 0xaa, 0xcb, 0x80, 0x24, 0x02, 0x89, 0x9e, 0x4b, 0x89, 0x40, 0xe3, 0xb7, 0xfe, 0xe7, 0x04,
10018
+	0x29, 0xe0, 0xc0, 0x3e, 0xb2, 0x2d, 0x4c, 0x69, 0x4f, 0x1f, 0x8e, 0xd0, 0xad, 0x5a, 0x81, 0x2f,
10019
+	0x37, 0xc5, 0xbb, 0xd5, 0x5a, 0x87, 0x52, 0xa4, 0x69, 0xef, 0x41, 0x24, 0xf2, 0x94, 0x2a, 0x23,
10020
+	0x51, 0xff, 0xf2, 0xe4, 0x2b, 0x1b, 0x6a, 0xc9, 0xc7, 0x8d, 0x38, 0xd9, 0x1d, 0x3f, 0x9a, 0x22,
10021
+	0x9d, 0x26, 0xe1, 0xfb, 0xa9, 0xe5, 0xf2, 0xd3, 0x90, 0xef, 0xa7, 0xb5, 0x16, 0x05, 0x8a, 0xfe,
10022
+	0x47, 0xb8, 0xc5, 0x36, 0x5c, 0xcb, 0x1f, 0xf3, 0xfa, 0x88, 0x16, 0x5c, 0x23, 0x79, 0xe8, 0xdb,
10023
+	0x82, 0x71, 0x00, 0x97, 0x1b, 0xf5, 0x3c, 0x13, 0x11, 0xb4, 0x26, 0xc9, 0x43, 0x9c, 0x7a, 0xbe,
10024
+	0x1d, 0xf6, 0x07, 0xb2, 0x81, 0x79, 0x25, 0xfe, 0x11, 0x6e, 0x4a, 0x66, 0xc5, 0x50, 0x2c, 0x74,
10025
+	0xc2, 0xad, 0xaa, 0x78, 0x8a, 0x6f, 0x96, 0x57, 0x71, 0xb8, 0x6a, 0x39, 0xd0, 0x55, 0x43, 0x6b,
10026
+	0xd2, 0xc5, 0x66, 0x95, 0xeb, 0x01, 0xb7, 0x0e, 0x49, 0xc3, 0x06, 0x5c, 0xd7, 0x49, 0x3e, 0x12,
10027
+	0x86, 0x8f, 0x62, 0x46, 0xa3, 0xd3, 0xbd, 0xb9, 0x71, 0xab, 0x7b, 0xbb, 0xb6, 0x03, 0xc5, 0x45,
10028
+	0xa4, 0xeb, 0xdf, 0x81, 0x4e, 0x3b, 0xa6, 0x0b, 0x0d, 0xb5, 0xba, 0x5e, 0x80, 0x57, 0xf8, 0x10,
10029
+	0x6a, 0xaa, 0xfe, 0xa6, 0x85, 0x57, 0x60, 0xf4, 0x61, 0xfd, 0xc5, 0xa9, 0xf8, 0xfa, 0x3b, 0xf5,
10030
+	0x38, 0x98, 0x3a, 0xf7, 0x71, 0x30, 0xfd, 0x7f, 0x79, 0x1c, 0x7c, 0xf9, 0x8b, 0x14, 0xc9, 0x47,
10031
+	0xd7, 0x05, 0x74, 0x19, 0x2c, 0x87, 0x0b, 0xe2, 0x22, 0x17, 0xd1, 0x5b, 0xbc, 0x10, 0xe6, 0x8d,
10032
+	0xed, 0xed, 0xdd, 0x9a, 0x81, 0x6f, 0x6b, 0xef, 0x89, 0x7a, 0x19, 0x01, 0x0c, 0x08, 0x5a, 0x3c,
10033
+	0xf4, 0x9e, 0xa6, 0x4f, 0xea, 0xe5, 0x7d, 0x79, 0x5d, 0x8c, 0x50, 0xaa, 0x58, 0xbe, 0x40, 0x72,
10034
+	0x46, 0xa7, 0xd3, 0xbc, 0xdd, 0x02, 0x49, 0x0f, 0x12, 0xe5, 0x67, 0x00, 0x74, 0x61, 0x22, 0x0a,
10035
+	0xf2, 0xfc, 0xb1, 0x0b, 0x92, 0x10, 0x55, 0xab, 0x35, 0xda, 0xb8, 0xde, 0xfd, 0xe4, 0x3c, 0x8a,
10036
+	0x57, 0x09, 0xfe, 0xf6, 0x92, 0x6f, 0xd3, 0x46, 0xdb, 0xa0, 0xb8, 0xe2, 0x83, 0xe4, 0xdc, 0xbe,
10037
+	0xda, 0x3e, 0x83, 0x0b, 0x24, 0xae, 0xb9, 0xae, 0x1e, 0x0a, 0xef, 0xa7, 0xca, 0x1a, 0x60, 0x96,
10038
+	0x27, 0x77, 0x24, 0xb0, 0xef, 0x18, 0x57, 0xeb, 0xec, 0x19, 0x74, 0x8f, 0x8b, 0x49, 0xcd, 0xad,
10039
+	0xd6, 0xc1, 0x9b, 0x2b, 0x4a, 0x01, 0xed, 0xe8, 0x7e, 0xab, 0xc5, 0xb5, 0x4b, 0xcf, 0x69, 0x47,
10040
+	0x47, 0xae, 0x8b, 0x98, 0xeb, 0x50, 0x50, 0x76, 0x77, 0xda, 0xdb, 0x8d, 0xbd, 0x46, 0xe9, 0x41,
10041
+	0x7a, 0x6e, 0x43, 0x35, 0x6f, 0x30, 0x74, 0x58, 0x28, 0xd4, 0xeb, 0x6c, 0xed, 0xef, 0xf1, 0x77,
10042
+	0xcc, 0xfb, 0x99, 0xf9, 0x05, 0xfb, 0xa3, 0xb0, 0x87, 0x1d, 0xca, 0xb5, 0xa8, 0x65, 0x78, 0x90,
10043
+	0x11, 0xef, 0x1a, 0x11, 0x46, 0xf4, 0x0b, 0x28, 0x87, 0x36, 0xbe, 0x27, 0x9e, 0x3c, 0xef, 0x67,
10044
+	0xe7, 0xe4, 0x50, 0xf6, 0x01, 0x64, 0x41, 0xe8, 0x2a, 0xa2, 0xd7, 0x8f, 0x68, 0xea, 0xe5, 0x1f,
10045
+	0x90, 0x9c, 0x4a, 0x18, 0x60, 0x9d, 0xec, 0xdd, 0x5d, 0x7a, 0xa7, 0x41, 0xe1, 0xe8, 0xb9, 0x75,
10046
+	0xd4, 0xcc, 0x5d, 0xcf, 0x07, 0xef, 0x82, 0x6d, 0x2c, 0xee, 0x18, 0x2d, 0xe3, 0x36, 0x00, 0xe4,
10047
+	0xf3, 0x8a, 0x02, 0x48, 0xaf, 0x2f, 0x97, 0xe4, 0x02, 0x91, 0xcc, 0xea, 0xda, 0xc3, 0xcf, 0xd6,
10048
+	0x17, 0x3e, 0x81, 0xdf, 0xdf, 0x3f, 0x5b, 0x4f, 0xdc, 0xff, 0x7c, 0x3d, 0xf1, 0x10, 0x7e, 0x7f,
10049
+	0x80, 0xdf, 0x5f, 0xe0, 0x77, 0x98, 0xe5, 0x57, 0x8b, 0x37, 0xfe, 0x1b, 0x00, 0x00, 0xff, 0xff,
10050
+	0xe7, 0xbe, 0x71, 0xe8, 0xb4, 0x1b, 0x00, 0x00,
10052 10051
 }
... ...
@@ -484,18 +484,6 @@ message RaftConfig {
484 484
 	uint32 election_tick = 5;
485 485
 }
486 486
 
487
-message RaftMember {
488
-	// RaftID specifies the internal ID used by the manager in a raft context, it can never be modified
489
-	// and is used only for information purposes
490
-	uint64 raft_id = 1 [(gogoproto.customname) = "RaftID"];
491
-
492
-	// Addr specifies the address of the member
493
-	string addr = 2;
494
-
495
-	// Status provides the current status of the manager from the perspective of another manager.
496
-	RaftMemberStatus status = 3 [(gogoproto.nullable) = false];
497
-}
498
-
499 487
 // Placement specifies task distribution constraints.
500 488
 message Placement {
501 489
 	// constraints specifies a set of requirements a node should meet for a task.
... ...
@@ -558,7 +546,18 @@ message EncryptionKey {
558 558
 	uint64 lamport_time = 4;
559 559
 }
560 560
 
561
-// ManagerStatus provides information about the status of a manager in the cluster.
561
+// ManagerStatus provides informations about the state of a manager in the cluster.
562 562
 message ManagerStatus {
563
-	RaftMember raft = 1 [(gogoproto.nullable) = false];
564
-}
565 563
\ No newline at end of file
564
+	// RaftID specifies the internal ID used by the manager in a raft context, it can never be modified
565
+	// and is used only for information purposes
566
+	uint64 raft_id = 1 [(gogoproto.customname) = "RaftID"];
567
+
568
+	// Addr is the address advertised to raft.
569
+	string addr = 2;
570
+
571
+	// Leader is set to true if this node is the raft leader.
572
+	bool leader = 3;
573
+
574
+	// Reachability specifies whether this node is reachable.
575
+	RaftMemberStatus.Reachability reachability = 4;
576
+}
... ...
@@ -476,7 +476,7 @@ func BootstrapCluster(baseCertDir string) error {
476 476
 		return err
477 477
 	}
478 478
 
479
-	nodeID := identity.NewNodeID()
479
+	nodeID := identity.NewID()
480 480
 	newOrg := identity.NewID()
481 481
 	_, err = GenerateAndSignNewTLSCert(rootCA, nodeID, ManagerRole, newOrg, paths.Node)
482 482
 
... ...
@@ -194,7 +194,7 @@ func LoadOrCreateSecurityConfig(ctx context.Context, baseCertDir, caHash, secret
194 194
 
195 195
 		if rootCA.CanSign() {
196 196
 			// Create a new random ID for this certificate
197
-			cn := identity.NewNodeID()
197
+			cn := identity.NewID()
198 198
 			org := identity.NewID()
199 199
 
200 200
 			if nodeInfo != nil {
... ...
@@ -30,6 +30,10 @@ type Server struct {
30 30
 	store            *store.MemoryStore
31 31
 	securityConfig   *SecurityConfig
32 32
 	acceptancePolicy *api.AcceptancePolicy
33
+
34
+	// Started is a channel which gets closed once the server is running
35
+	// and able to service RPCs.
36
+	Started chan struct{}
33 37
 }
34 38
 
35 39
 // DefaultAcceptancePolicy returns the default acceptance policy.
... ...
@@ -60,6 +64,7 @@ func NewServer(store *store.MemoryStore, securityConfig *SecurityConfig) *Server
60 60
 	return &Server{
61 61
 		store:          store,
62 62
 		securityConfig: securityConfig,
63
+		Started:        make(chan struct{}),
63 64
 	}
64 65
 }
65 66
 
... ...
@@ -200,7 +205,7 @@ func (s *Server) IssueNodeCertificate(ctx context.Context, request *api.IssueNod
200 200
 	maxRetries := 3
201 201
 	// Generate a random ID for this new node
202 202
 	for i := 0; ; i++ {
203
-		nodeID = identity.NewNodeID()
203
+		nodeID = identity.NewID()
204 204
 
205 205
 		// Create a new node
206 206
 		err := s.store.Update(func(tx store.Tx) error {
... ...
@@ -353,6 +358,8 @@ func (s *Server) Run(ctx context.Context) error {
353 353
 	s.ctx, s.cancel = context.WithCancel(ctx)
354 354
 	s.mu.Unlock()
355 355
 
356
+	close(s.Started)
357
+
356 358
 	// Retrieve the channels to keep track of changes in the cluster
357 359
 	// Retrieve all the currently registered nodes
358 360
 	var nodes []*api.Node
... ...
@@ -2,12 +2,9 @@ package identity
2 2
 
3 3
 import (
4 4
 	"crypto/rand"
5
-	"encoding/binary"
6
-	"errors"
7 5
 	"fmt"
8 6
 	"io"
9 7
 	"math/big"
10
-	"strconv"
11 8
 )
12 9
 
13 10
 var (
... ...
@@ -53,31 +50,3 @@ func NewID() string {
53 53
 	nn.SetBytes(p[:])
54 54
 	return fmt.Sprintf("%0[1]*s", maxRandomIDLength, nn.Text(randomIDBase))
55 55
 }
56
-
57
-// NewNodeID generates a new identifier for identifying a node. These IDs
58
-// are shorter than the IDs returned by NewID, so they can be used directly
59
-// by Raft. Because they are short, they MUST be checked for collisions.
60
-func NewNodeID() string {
61
-	var p [randomNodeIDEntropyBytes]byte
62
-
63
-	if _, err := io.ReadFull(idReader, p[:]); err != nil {
64
-		panic(fmt.Errorf("failed to read random bytes: %v", err))
65
-	}
66
-
67
-	randomInt := binary.LittleEndian.Uint64(p[:])
68
-	return FormatNodeID(randomInt)
69
-}
70
-
71
-// FormatNodeID converts a node ID from uint64 to string format.
72
-// A string-formatted node ID looks like 1w8ynjwhcy4zd.
73
-func FormatNodeID(nodeID uint64) string {
74
-	return fmt.Sprintf("%0[1]*s", maxRandomNodeIDLength, strconv.FormatUint(nodeID, 36))
75
-}
76
-
77
-// ParseNodeID converts a node ID from string format to uint64.
78
-func ParseNodeID(nodeID string) (uint64, error) {
79
-	if len(nodeID) != maxRandomNodeIDLength {
80
-		return 0, errors.New("node ID has invalid length")
81
-	}
82
-	return strconv.ParseUint(nodeID, 36, 64)
83
-}
... ...
@@ -169,6 +169,7 @@ func redactClusters(clusters []*api.Cluster) []*api.Cluster {
169 169
 	// Only add public fields to the new clusters
170 170
 	for _, cluster := range clusters {
171 171
 		// Copy all the mandatory fields
172
+		// Do not copy secret key
172 173
 		newCluster := &api.Cluster{
173 174
 			ID:   cluster.ID,
174 175
 			Meta: cluster.Meta,
... ...
@@ -179,17 +180,6 @@ func redactClusters(clusters []*api.Cluster) []*api.Cluster {
179 179
 			},
180 180
 		}
181 181
 
182
-		// Redact the acceptance policy secrets
183
-		if len(newCluster.Spec.AcceptancePolicy.Policies) > 0 {
184
-			for _, policy := range newCluster.Spec.AcceptancePolicy.Policies {
185
-				// Adding [REDACTED] to the api client so they know there is a
186
-				// a secret configured, but without telling them what it is.
187
-				if policy.Secret != nil {
188
-					policy.Secret.Data = []byte("[REDACTED]")
189
-				}
190
-
191
-			}
192
-		}
193 182
 		redactedClusters = append(redactedClusters, newCluster)
194 183
 	}
195 184
 
... ...
@@ -2,7 +2,6 @@ package controlapi
2 2
 
3 3
 import (
4 4
 	"github.com/docker/swarmkit/api"
5
-	"github.com/docker/swarmkit/identity"
6 5
 	"github.com/docker/swarmkit/manager/state/store"
7 6
 	"golang.org/x/net/context"
8 7
 	"google.golang.org/grpc"
... ...
@@ -34,9 +33,16 @@ func (s *Server) GetNode(ctx context.Context, request *api.GetNodeRequest) (*api
34 34
 
35 35
 	if s.raft != nil {
36 36
 		memberlist := s.raft.GetMemberlist()
37
-		raftID, err := identity.ParseNodeID(request.NodeID)
38
-		if err == nil && memberlist[raftID] != nil {
39
-			node.ManagerStatus = &api.ManagerStatus{Raft: *memberlist[raftID]}
37
+		for _, member := range memberlist {
38
+			if member.NodeID == node.ID {
39
+				node.ManagerStatus = &api.ManagerStatus{
40
+					RaftID:       member.RaftID,
41
+					Addr:         member.Addr,
42
+					Leader:       member.Status.Leader,
43
+					Reachability: member.Status.Reachability,
44
+				}
45
+				break
46
+			}
40 47
 		}
41 48
 	}
42 49
 
... ...
@@ -148,10 +154,17 @@ func (s *Server) ListNodes(ctx context.Context, request *api.ListNodesRequest) (
148 148
 	if s.raft != nil {
149 149
 		memberlist := s.raft.GetMemberlist()
150 150
 
151
-		for _, n := range nodes {
152
-			raftID, err := identity.ParseNodeID(n.ID)
153
-			if err == nil && memberlist[raftID] != nil {
154
-				n.ManagerStatus = &api.ManagerStatus{Raft: *memberlist[raftID]}
151
+		for _, node := range nodes {
152
+			for _, member := range memberlist {
153
+				if member.NodeID == node.ID {
154
+					node.ManagerStatus = &api.ManagerStatus{
155
+						RaftID:       member.RaftID,
156
+						Addr:         member.Addr,
157
+						Leader:       member.Status.Leader,
158
+						Reachability: member.Status.Reachability,
159
+					}
160
+					break
161
+				}
155 162
 			}
156 163
 		}
157 164
 	}
... ...
@@ -173,7 +186,10 @@ func (s *Server) UpdateNode(ctx context.Context, request *api.UpdateNodeRequest)
173 173
 		return nil, err
174 174
 	}
175 175
 
176
-	var node *api.Node
176
+	var (
177
+		node   *api.Node
178
+		demote bool
179
+	)
177 180
 	err := s.store.Update(func(tx store.Tx) error {
178 181
 		node = store.GetNode(tx, request.NodeID)
179 182
 		if node == nil {
... ...
@@ -182,6 +198,7 @@ func (s *Server) UpdateNode(ctx context.Context, request *api.UpdateNodeRequest)
182 182
 
183 183
 		// Demotion sanity checks.
184 184
 		if node.Spec.Role == api.NodeRoleManager && request.Spec.Role == api.NodeRoleWorker {
185
+			demote = true
185 186
 			managers, err := store.FindNodes(tx, store.ByRole(api.NodeRoleManager))
186 187
 			if err != nil {
187 188
 				return grpc.Errorf(codes.Internal, "internal store error: %v", err)
... ...
@@ -201,6 +218,19 @@ func (s *Server) UpdateNode(ctx context.Context, request *api.UpdateNodeRequest)
201 201
 	if node == nil {
202 202
 		return nil, grpc.Errorf(codes.NotFound, "node %s not found", request.NodeID)
203 203
 	}
204
+
205
+	if demote && s.raft != nil {
206
+		memberlist := s.raft.GetMemberlist()
207
+		for raftID, member := range memberlist {
208
+			if member.NodeID == request.NodeID {
209
+				if err := s.raft.RemoveMember(ctx, raftID); err != nil {
210
+					return nil, err
211
+				}
212
+				break
213
+			}
214
+		}
215
+	}
216
+
204 217
 	return &api.UpdateNodeResponse{
205 218
 		Node: node,
206 219
 	}, nil
... ...
@@ -217,9 +247,11 @@ func (s *Server) RemoveNode(ctx context.Context, request *api.RemoveNodeRequest)
217 217
 	}
218 218
 	if s.raft != nil {
219 219
 		memberlist := s.raft.GetMemberlist()
220
-		raftID, err := identity.ParseNodeID(request.NodeID)
221
-		if err == nil && memberlist[raftID] != nil {
222
-			return nil, grpc.Errorf(codes.FailedPrecondition, "node %s is a cluster manager and is part of the quorum. It must be demoted to worker before removal", request.NodeID)
220
+
221
+		for _, member := range memberlist {
222
+			if member.NodeID == request.NodeID {
223
+				return nil, grpc.Errorf(codes.FailedPrecondition, "node %s is a cluster manager and is part of the quorum. It must be demoted to worker before removal", request.NodeID)
224
+			}
223 225
 		}
224 226
 	}
225 227
 
... ...
@@ -15,7 +15,6 @@ import (
15 15
 	"github.com/Sirupsen/logrus"
16 16
 	"github.com/docker/swarmkit/api"
17 17
 	"github.com/docker/swarmkit/ca"
18
-	"github.com/docker/swarmkit/identity"
19 18
 	"github.com/docker/swarmkit/log"
20 19
 	"github.com/docker/swarmkit/manager/state"
21 20
 	"github.com/docker/swarmkit/manager/state/store"
... ...
@@ -136,7 +135,7 @@ func getWeightedPeers(cluster Cluster) []*api.WeightedPeer {
136 136
 	for _, m := range members {
137 137
 		mgrs = append(mgrs, &api.WeightedPeer{
138 138
 			Peer: &api.Peer{
139
-				NodeID: identity.FormatNodeID(m.RaftID),
139
+				NodeID: m.NodeID,
140 140
 				Addr:   m.Addr,
141 141
 			},
142 142
 			Weight: 1,
... ...
@@ -443,10 +443,12 @@ func (m *Manager) Run(parent context.Context) error {
443 443
 	authenticatedCAAPI := api.NewAuthenticatedWrapperCAServer(m.caserver, authorize)
444 444
 	authenticatedNodeCAAPI := api.NewAuthenticatedWrapperNodeCAServer(m.caserver, authorize)
445 445
 	authenticatedRaftAPI := api.NewAuthenticatedWrapperRaftServer(m.RaftNode, authorize)
446
+	authenticatedRaftMembershipAPI := api.NewAuthenticatedWrapperRaftMembershipServer(m.RaftNode, authorize)
446 447
 
447 448
 	proxyDispatcherAPI := api.NewRaftProxyDispatcherServer(authenticatedDispatcherAPI, cs, m.RaftNode, ca.WithMetadataForwardTLSInfo)
448 449
 	proxyCAAPI := api.NewRaftProxyCAServer(authenticatedCAAPI, cs, m.RaftNode, ca.WithMetadataForwardTLSInfo)
449 450
 	proxyNodeCAAPI := api.NewRaftProxyNodeCAServer(authenticatedNodeCAAPI, cs, m.RaftNode, ca.WithMetadataForwardTLSInfo)
451
+	proxyRaftMembershipAPI := api.NewRaftProxyRaftMembershipServer(authenticatedRaftMembershipAPI, cs, m.RaftNode, ca.WithMetadataForwardTLSInfo)
450 452
 
451 453
 	// localProxyControlAPI is a special kind of proxy. It is only wired up
452 454
 	// to receive requests from a trusted local socket, and these requests
... ...
@@ -462,6 +464,7 @@ func (m *Manager) Run(parent context.Context) error {
462 462
 	api.RegisterCAServer(m.server, proxyCAAPI)
463 463
 	api.RegisterNodeCAServer(m.server, proxyNodeCAAPI)
464 464
 	api.RegisterRaftServer(m.server, authenticatedRaftAPI)
465
+	api.RegisterRaftMembershipServer(m.server, proxyRaftMembershipAPI)
465 466
 	api.RegisterControlServer(m.localserver, localProxyControlAPI)
466 467
 	api.RegisterControlServer(m.server, authenticatedControlAPI)
467 468
 	api.RegisterDispatcherServer(m.server, proxyDispatcherAPI)
... ...
@@ -570,7 +573,7 @@ func (m *Manager) Stop(ctx context.Context) {
570 570
 	}
571 571
 
572 572
 	m.RaftNode.Shutdown()
573
-	// some time after this point, Run will recieve an error from one of these
573
+	// some time after this point, Run will receive an error from one of these
574 574
 	m.server.Stop()
575 575
 	m.localserver.Stop()
576 576
 
... ...
@@ -99,29 +99,34 @@ func (r *ReplicatedOrchestrator) reconcile(ctx context.Context, service *api.Ser
99 99
 
100 100
 	// TODO(aaronl): Add support for restart delays.
101 101
 
102
-	_, err = r.store.Batch(func(batch *store.Batch) error {
103
-		switch {
104
-		case specifiedInstances > numTasks:
105
-			log.G(ctx).Debugf("Service %s was scaled up from %d to %d instances", service.ID, numTasks, specifiedInstances)
106
-			// Update all current tasks then add missing tasks
107
-			r.updater.Update(ctx, service, runningTasks)
102
+	switch {
103
+	case specifiedInstances > numTasks:
104
+		log.G(ctx).Debugf("Service %s was scaled up from %d to %d instances", service.ID, numTasks, specifiedInstances)
105
+		// Update all current tasks then add missing tasks
106
+		r.updater.Update(ctx, service, runningTasks)
107
+		_, err = r.store.Batch(func(batch *store.Batch) error {
108 108
 			r.addTasks(ctx, batch, service, runningInstances, specifiedInstances-numTasks)
109
+			return nil
110
+		})
111
+		if err != nil {
112
+			log.G(ctx).WithError(err).Errorf("reconcile batch failed")
113
+		}
109 114
 
110
-		case specifiedInstances < numTasks:
111
-			// Update up to N tasks then remove the extra
112
-			log.G(ctx).Debugf("Service %s was scaled down from %d to %d instances", service.ID, numTasks, specifiedInstances)
113
-			r.updater.Update(ctx, service, runningTasks[:specifiedInstances])
115
+	case specifiedInstances < numTasks:
116
+		// Update up to N tasks then remove the extra
117
+		log.G(ctx).Debugf("Service %s was scaled down from %d to %d instances", service.ID, numTasks, specifiedInstances)
118
+		r.updater.Update(ctx, service, runningTasks[:specifiedInstances])
119
+		_, err = r.store.Batch(func(batch *store.Batch) error {
114 120
 			r.removeTasks(ctx, batch, service, runningTasks[specifiedInstances:])
115
-
116
-		case specifiedInstances == numTasks:
117
-			// Simple update, no scaling - update all tasks.
118
-			r.updater.Update(ctx, service, runningTasks)
121
+			return nil
122
+		})
123
+		if err != nil {
124
+			log.G(ctx).WithError(err).Errorf("reconcile batch failed")
119 125
 		}
120
-		return nil
121
-	})
122 126
 
123
-	if err != nil {
124
-		log.G(ctx).WithError(err).Errorf("reconcile batch failed")
127
+	case specifiedInstances == numTasks:
128
+		// Simple update, no scaling - update all tasks.
129
+		r.updater.Update(ctx, service, runningTasks)
125 130
 	}
126 131
 }
127 132
 
... ...
@@ -53,6 +53,9 @@ func (f *ResourceFilter) SetTask(t *api.Task) bool {
53 53
 
54 54
 // Check returns true if the task can be scheduled into the given node.
55 55
 func (f *ResourceFilter) Check(n *NodeInfo) bool {
56
+	if n.AvailableResources == nil {
57
+		return false
58
+	}
56 59
 	if f.reservations.NanoCPUs > n.AvailableResources.NanoCPUs {
57 60
 		return false
58 61
 	}
... ...
@@ -6,10 +6,10 @@ import "github.com/docker/swarmkit/api"
6 6
 type NodeInfo struct {
7 7
 	*api.Node
8 8
 	Tasks              map[string]*api.Task
9
-	AvailableResources api.Resources
9
+	AvailableResources *api.Resources
10 10
 }
11 11
 
12
-func newNodeInfo(n *api.Node, tasks map[string]*api.Task, availableResources api.Resources) NodeInfo {
12
+func newNodeInfo(n *api.Node, tasks map[string]*api.Task, availableResources *api.Resources) NodeInfo {
13 13
 	nodeInfo := NodeInfo{
14 14
 		Node:               n,
15 15
 		Tasks:              make(map[string]*api.Task),
... ...
@@ -31,9 +31,11 @@ func (nodeInfo *NodeInfo) removeTask(t *api.Task) bool {
31 31
 	}
32 32
 
33 33
 	delete(nodeInfo.Tasks, t.ID)
34
-	reservations := taskReservations(t.Spec)
35
-	nodeInfo.AvailableResources.MemoryBytes += reservations.MemoryBytes
36
-	nodeInfo.AvailableResources.NanoCPUs += reservations.NanoCPUs
34
+	if nodeInfo.AvailableResources != nil {
35
+		reservations := taskReservations(t.Spec)
36
+		nodeInfo.AvailableResources.MemoryBytes += reservations.MemoryBytes
37
+		nodeInfo.AvailableResources.NanoCPUs += reservations.NanoCPUs
38
+	}
37 39
 
38 40
 	return true
39 41
 }
... ...
@@ -47,9 +49,11 @@ func (nodeInfo *NodeInfo) addTask(t *api.Task) bool {
47 47
 	}
48 48
 	if _, ok := nodeInfo.Tasks[t.ID]; !ok {
49 49
 		nodeInfo.Tasks[t.ID] = t
50
-		reservations := taskReservations(t.Spec)
51
-		nodeInfo.AvailableResources.MemoryBytes -= reservations.MemoryBytes
52
-		nodeInfo.AvailableResources.NanoCPUs -= reservations.NanoCPUs
50
+		if nodeInfo.AvailableResources != nil {
51
+			reservations := taskReservations(t.Spec)
52
+			nodeInfo.AvailableResources.MemoryBytes -= reservations.MemoryBytes
53
+			nodeInfo.AvailableResources.NanoCPUs -= reservations.NanoCPUs
54
+		}
53 55
 		return true
54 56
 	}
55 57
 
... ...
@@ -242,13 +242,17 @@ func (s *Scheduler) deleteTask(ctx context.Context, t *api.Task) {
242 242
 }
243 243
 
244 244
 func (s *Scheduler) createOrUpdateNode(n *api.Node) {
245
-	var resources api.Resources
245
+	nodeInfo := s.nodeHeap.nodeInfo(n.ID)
246 246
 	if n.Description != nil && n.Description.Resources != nil {
247
-		resources = *n.Description.Resources
247
+		if nodeInfo.AvailableResources == nil {
248
+			// if nodeInfo.AvailableResources hasn't been initialized
249
+			// we copy resources information from node description and
250
+			// pass it to nodeInfo
251
+			resources := *n.Description.Resources
252
+			nodeInfo.AvailableResources = &resources
253
+		}
248 254
 	}
249
-	nodeInfo := s.nodeHeap.nodeInfo(n.ID)
250 255
 	nodeInfo.Node = n
251
-	nodeInfo.AvailableResources = resources
252 256
 	s.nodeHeap.addOrUpdateNode(nodeInfo)
253 257
 }
254 258
 
... ...
@@ -418,9 +422,10 @@ func (s *Scheduler) buildNodeHeap(tx store.ReadTx, tasksByNode map[string]map[st
418 418
 
419 419
 	i := 0
420 420
 	for _, n := range nodes {
421
-		var resources api.Resources
421
+		var resources *api.Resources
422 422
 		if n.Description != nil && n.Description.Resources != nil {
423
-			resources = *n.Description.Resources
423
+			resources = &api.Resources{NanoCPUs: n.Description.Resources.NanoCPUs,
424
+				MemoryBytes: n.Description.Resources.MemoryBytes}
424 425
 		}
425 426
 		s.nodeHeap.heap = append(s.nodeHeap.heap, newNodeInfo(n, tasksByNode[n.ID], resources))
426 427
 		s.nodeHeap.index[n.ID] = i
... ...
@@ -3,6 +3,7 @@ package raft
3 3
 import (
4 4
 	"errors"
5 5
 	"math"
6
+	"math/rand"
6 7
 	"sync"
7 8
 	"sync/atomic"
8 9
 	"time"
... ...
@@ -22,7 +23,6 @@ import (
22 22
 	"github.com/docker/go-events"
23 23
 	"github.com/docker/swarmkit/api"
24 24
 	"github.com/docker/swarmkit/ca"
25
-	"github.com/docker/swarmkit/identity"
26 25
 	"github.com/docker/swarmkit/log"
27 26
 	"github.com/docker/swarmkit/manager/state/raft/membership"
28 27
 	"github.com/docker/swarmkit/manager/state/store"
... ...
@@ -109,6 +109,8 @@ type Node struct {
109 109
 
110 110
 	// used to coordinate shutdown
111 111
 	stopMu sync.RWMutex
112
+	// used for membership management checks
113
+	membershipLock sync.Mutex
112 114
 
113 115
 	snapshotInProgress chan uint64
114 116
 	asyncTasks         sync.WaitGroup
... ...
@@ -142,6 +144,10 @@ type NewNodeOptions struct {
142 142
 	TLSCredentials credentials.TransportAuthenticator
143 143
 }
144 144
 
145
+func init() {
146
+	rand.Seed(time.Now().UnixNano())
147
+}
148
+
145 149
 // NewNode generates a new Raft node
146 150
 func NewNode(ctx context.Context, opts NewNodeOptions) (*Node, error) {
147 151
 	cfg := opts.Config
... ...
@@ -152,11 +158,6 @@ func NewNode(ctx context.Context, opts NewNodeOptions) (*Node, error) {
152 152
 		opts.TickInterval = time.Second
153 153
 	}
154 154
 
155
-	raftID, err := identity.ParseNodeID(opts.ID)
156
-	if err != nil {
157
-		return nil, err
158
-	}
159
-
160 155
 	raftStore := raft.NewMemoryStorage()
161 156
 
162 157
 	ctx, cancel := context.WithCancel(ctx)
... ...
@@ -175,7 +176,6 @@ func NewNode(ctx context.Context, opts NewNodeOptions) (*Node, error) {
175 175
 			MaxSizePerMsg:   cfg.MaxSizePerMsg,
176 176
 			MaxInflightMsgs: cfg.MaxInflightMsgs,
177 177
 			Logger:          cfg.Logger,
178
-			ID:              raftID,
179 178
 		},
180 179
 		forceNewCluster:     opts.ForceNewCluster,
181 180
 		stopCh:              make(chan struct{}),
... ...
@@ -196,9 +196,10 @@ func NewNode(ctx context.Context, opts NewNodeOptions) (*Node, error) {
196 196
 		n.sendTimeout = opts.SendTimeout
197 197
 	}
198 198
 
199
-	if err := n.loadAndStart(ctx, opts.ForceNewCluster); err != nil {
199
+	loadAndStartErr := n.loadAndStart(ctx, opts.ForceNewCluster)
200
+	if loadAndStartErr != nil && loadAndStartErr != errNoWAL {
200 201
 		n.ticker.Stop()
201
-		return nil, err
202
+		return nil, loadAndStartErr
202 203
 	}
203 204
 
204 205
 	snapshot, err := raftStore.Snapshot()
... ...
@@ -213,32 +214,45 @@ func NewNode(ctx context.Context, opts NewNodeOptions) (*Node, error) {
213 213
 	n.reqIDGen = idutil.NewGenerator(uint16(n.Config.ID), time.Now())
214 214
 	n.wait = newWait()
215 215
 
216
-	if n.startNodePeers != nil {
216
+	if loadAndStartErr == errNoWAL {
217 217
 		if n.joinAddr != "" {
218 218
 			c, err := n.ConnectToMember(n.joinAddr, 10*time.Second)
219 219
 			if err != nil {
220 220
 				return nil, err
221 221
 			}
222
+			client := api.NewRaftMembershipClient(c.Conn)
222 223
 			defer func() {
223 224
 				_ = c.Conn.Close()
224 225
 			}()
225 226
 
226 227
 			ctx, cancel := context.WithTimeout(n.Ctx, 10*time.Second)
227 228
 			defer cancel()
228
-			resp, err := c.Join(ctx, &api.JoinRequest{
229
+			resp, err := client.Join(ctx, &api.JoinRequest{
229 230
 				Addr: n.Address,
230 231
 			})
231 232
 			if err != nil {
232 233
 				return nil, err
233 234
 			}
234 235
 
236
+			n.Config.ID = resp.RaftID
237
+
238
+			if _, err := n.createWAL(opts.ID); err != nil {
239
+				return nil, err
240
+			}
241
+
235 242
 			n.Node = raft.StartNode(n.Config, []raft.Peer{})
236 243
 
237 244
 			if err := n.registerNodes(resp.Members); err != nil {
238 245
 				return nil, err
239 246
 			}
240 247
 		} else {
241
-			n.Node = raft.StartNode(n.Config, n.startNodePeers)
248
+			// First member in the cluster, self-assign ID
249
+			n.Config.ID = uint64(rand.Int63()) + 1
250
+			peer, err := n.createWAL(opts.ID)
251
+			if err != nil {
252
+				return nil, err
253
+			}
254
+			n.Node = raft.StartNode(n.Config, []raft.Peer{peer})
242 255
 			if err := n.Campaign(n.Ctx); err != nil {
243 256
 				return nil, err
244 257
 			}
... ...
@@ -363,6 +377,14 @@ func (n *Node) Run(ctx context.Context) error {
363 363
 			// send back an error to the caller to start
364 364
 			// the shutdown process.
365 365
 			if n.mustStop() {
366
+				n.stop()
367
+
368
+				// Move WAL and snapshot out of the way, since
369
+				// they are no longer usable.
370
+				if err := n.moveWALAndSnap(); err != nil {
371
+					n.Config.Logger.Error(err)
372
+				}
373
+
366 374
 				return ErrMemberRemoved
367 375
 			}
368 376
 
... ...
@@ -387,7 +409,6 @@ func (n *Node) Run(ctx context.Context) error {
387 387
 func (n *Node) Shutdown() {
388 388
 	select {
389 389
 	case <-n.doneCh:
390
-		n.stop()
391 390
 	default:
392 391
 		close(n.stopCh)
393 392
 		<-n.doneCh
... ...
@@ -409,7 +430,7 @@ func (n *Node) stop() {
409 409
 	}
410 410
 	n.Stop()
411 411
 	if err := n.wal.Close(); err != nil {
412
-		n.Config.Logger.Error(err)
412
+		n.Config.Logger.Errorf("raft: error closing WAL: %v", err)
413 413
 	}
414 414
 	// TODO(stevvooe): Handle ctx.Done()
415 415
 }
... ...
@@ -446,45 +467,55 @@ func (n *Node) Join(ctx context.Context, req *api.JoinRequest) (*api.JoinRespons
446 446
 	}
447 447
 	log := log.G(ctx).WithFields(fields)
448 448
 
449
-	raftID, err := identity.ParseNodeID(nodeInfo.NodeID)
450
-	if err != nil {
451
-		return nil, err
452
-	}
453
-
454 449
 	// can't stop the raft node while an async RPC is in progress
455 450
 	n.stopMu.RLock()
456 451
 	defer n.stopMu.RUnlock()
457 452
 
453
+	n.membershipLock.Lock()
454
+	defer n.membershipLock.Unlock()
455
+
458 456
 	if n.Node == nil {
459 457
 		log.WithError(ErrStopped).Errorf(ErrStopped.Error())
460 458
 		return nil, ErrStopped
461 459
 	}
462 460
 
463
-	// We submit a configuration change only if the node was not registered yet
464
-	if n.cluster.GetMember(raftID) == nil {
465
-		err = n.addMember(ctx, req.Addr, raftID)
466
-		if err != nil {
467
-			log.WithError(err).Errorf("failed to add member")
468
-			return nil, err
461
+	if !n.IsLeader() {
462
+		return nil, ErrLostLeadership
463
+	}
464
+
465
+	// Find a unique ID for the joining member.
466
+	var raftID uint64
467
+	for {
468
+		raftID = uint64(rand.Int63()) + 1
469
+		if n.cluster.GetMember(raftID) == nil && !n.cluster.IsIDRemoved(raftID) {
470
+			break
469 471
 		}
470 472
 	}
471 473
 
474
+	err = n.addMember(ctx, req.Addr, raftID, nodeInfo.NodeID)
475
+	if err != nil {
476
+		log.WithError(err).Errorf("failed to add member")
477
+		return nil, err
478
+	}
479
+
472 480
 	var nodes []*api.RaftMember
473 481
 	for _, node := range n.cluster.Members() {
474 482
 		nodes = append(nodes, &api.RaftMember{
475 483
 			RaftID: node.RaftID,
484
+			NodeID: node.NodeID,
476 485
 			Addr:   node.Addr,
477 486
 		})
478 487
 	}
479 488
 	log.Debugf("node joined")
480 489
 
481
-	return &api.JoinResponse{Members: nodes}, nil
490
+	return &api.JoinResponse{Members: nodes, RaftID: raftID}, nil
482 491
 }
483 492
 
484 493
 // addMember submits a configuration change to add a new member on the raft cluster.
485
-func (n *Node) addMember(ctx context.Context, addr string, raftID uint64) error {
494
+func (n *Node) addMember(ctx context.Context, addr string, raftID uint64, nodeID string) error {
486 495
 	node := api.RaftMember{
487 496
 		RaftID: raftID,
497
+		NodeID: nodeID,
488 498
 		Addr:   addr,
489 499
 	}
490 500
 
... ...
@@ -531,6 +562,10 @@ func (n *Node) Leave(ctx context.Context, req *api.LeaveRequest) (*api.LeaveResp
531 531
 		return nil, ErrStopped
532 532
 	}
533 533
 
534
+	if !n.IsLeader() {
535
+		return nil, ErrLostLeadership
536
+	}
537
+
534 538
 	err = n.RemoveMember(ctx, req.Node.RaftID)
535 539
 	if err != nil {
536 540
 		return nil, err
... ...
@@ -541,8 +576,9 @@ func (n *Node) Leave(ctx context.Context, req *api.LeaveRequest) (*api.LeaveResp
541 541
 
542 542
 // RemoveMember submits a configuration change to remove a member from the raft cluster.
543 543
 func (n *Node) RemoveMember(ctx context.Context, id uint64) error {
544
-	// TODO(abronan): this can race if multiple removes are processed, we should
545
-	// send all the requests to the Leader and track pending removals.
544
+	n.membershipLock.Lock()
545
+	defer n.membershipLock.Unlock()
546
+
546 547
 	if n.cluster.CanRemoveMember(n.Config.ID, id) {
547 548
 		cc := raftpb.ConfChange{
548 549
 			ID:      id,
... ...
@@ -600,7 +636,7 @@ func (n *Node) ResolveAddress(ctx context.Context, msg *api.ResolveAddressReques
600 600
 
601 601
 	member := n.cluster.GetMember(msg.RaftID)
602 602
 	if member == nil {
603
-		return nil, grpc.Errorf(codes.NotFound, "member %s not found", identity.FormatNodeID(msg.RaftID))
603
+		return nil, grpc.Errorf(codes.NotFound, "member %x not found", msg.RaftID)
604 604
 	}
605 605
 	return &api.ResolveAddressResponse{Addr: member.Addr}, nil
606 606
 }
... ...
@@ -630,6 +666,11 @@ func (n *Node) LeaderAddr() (string, error) {
630 630
 func (n *Node) registerNode(node *api.RaftMember) error {
631 631
 	member := &membership.Member{}
632 632
 
633
+	if n.cluster.GetMember(node.RaftID) != nil {
634
+		// member already exists
635
+		return nil
636
+	}
637
+
633 638
 	// Avoid opening a connection to the local node
634 639
 	if node.RaftID != n.Config.ID {
635 640
 		// We don't want to impose a timeout on the grpc connection. It
... ...
@@ -702,6 +743,7 @@ func (n *Node) GetMemberlist() map[uint64]*api.RaftMember {
702 702
 
703 703
 		memberlist[id] = &api.RaftMember{
704 704
 			RaftID: member.RaftID,
705
+			NodeID: member.NodeID,
705 706
 			Addr:   member.Addr,
706 707
 			Status: api.RaftMemberStatus{
707 708
 				Leader:       leader,
... ...
@@ -787,7 +829,7 @@ func (n *Node) sendToMember(members map[uint64]*membership.Member, m raftpb.Mess
787 787
 		// If we are being asked to send to a member that's not in
788 788
 		// our member list, that could indicate that the current leader
789 789
 		// was added while we were offline. Try to resolve its address.
790
-		n.Config.Logger.Warningf("sending message to an unrecognized member ID %s", identity.FormatNodeID(m.To))
790
+		n.Config.Logger.Warningf("sending message to an unrecognized member ID %x", m.To)
791 791
 
792 792
 		// Choose a random member
793 793
 		var (
... ...
@@ -807,12 +849,12 @@ func (n *Node) sendToMember(members map[uint64]*membership.Member, m raftpb.Mess
807 807
 
808 808
 		resp, err := queryMember.ResolveAddress(ctx, &api.ResolveAddressRequest{RaftID: m.To})
809 809
 		if err != nil {
810
-			n.Config.Logger.Errorf("could not resolve address of member ID %s: %v", identity.FormatNodeID(m.To), err)
810
+			n.Config.Logger.Errorf("could not resolve address of member ID %x: %v", m.To, err)
811 811
 			return
812 812
 		}
813 813
 		conn, err = n.ConnectToMember(resp.Addr, n.sendTimeout)
814 814
 		if err != nil {
815
-			n.Config.Logger.Errorf("could connect to member ID %s at %s: %v", identity.FormatNodeID(m.To), resp.Addr, err)
815
+			n.Config.Logger.Errorf("could connect to member ID %x at %s: %v", m.To, resp.Addr, err)
816 816
 			return
817 817
 		}
818 818
 		// The temporary connection is only used for this message.
... ...
@@ -1,6 +1,7 @@
1 1
 package raft
2 2
 
3 3
 import (
4
+	"errors"
4 5
 	"fmt"
5 6
 	"io"
6 7
 	"io/ioutil"
... ...
@@ -21,6 +22,8 @@ import (
21 21
 	"golang.org/x/net/context"
22 22
 )
23 23
 
24
+var errNoWAL = errors.New("no WAL present")
25
+
24 26
 func (n *Node) walDir() string {
25 27
 	return filepath.Join(n.StateDir, "wal")
26 28
 }
... ...
@@ -41,23 +44,7 @@ func (n *Node) loadAndStart(ctx context.Context, forceNewCluster bool) error {
41 41
 	n.snapshotter = snap.New(snapDir)
42 42
 
43 43
 	if !wal.Exist(walDir) {
44
-		raftNode := &api.RaftMember{
45
-			RaftID: n.Config.ID,
46
-			Addr:   n.Address,
47
-		}
48
-		metadata, err := raftNode.Marshal()
49
-		if err != nil {
50
-			return fmt.Errorf("error marshalling raft node: %v", err)
51
-		}
52
-		n.wal, err = wal.Create(walDir, metadata)
53
-		if err != nil {
54
-			return fmt.Errorf("create wal error: %v", err)
55
-		}
56
-
57
-		n.cluster.AddMember(&membership.Member{RaftMember: raftNode})
58
-		n.startNodePeers = []raft.Peer{{ID: n.Config.ID, Context: metadata}}
59
-
60
-		return nil
44
+		return errNoWAL
61 45
 	}
62 46
 
63 47
 	// Load snapshot data
... ...
@@ -82,6 +69,49 @@ func (n *Node) loadAndStart(ctx context.Context, forceNewCluster bool) error {
82 82
 	return nil
83 83
 }
84 84
 
85
+func (n *Node) createWAL(nodeID string) (raft.Peer, error) {
86
+	raftNode := &api.RaftMember{
87
+		RaftID: n.Config.ID,
88
+		NodeID: nodeID,
89
+		Addr:   n.Address,
90
+	}
91
+	metadata, err := raftNode.Marshal()
92
+	if err != nil {
93
+		return raft.Peer{}, fmt.Errorf("error marshalling raft node: %v", err)
94
+	}
95
+	n.wal, err = wal.Create(n.walDir(), metadata)
96
+	if err != nil {
97
+		return raft.Peer{}, fmt.Errorf("create wal error: %v", err)
98
+	}
99
+
100
+	n.cluster.AddMember(&membership.Member{RaftMember: raftNode})
101
+	return raft.Peer{ID: n.Config.ID, Context: metadata}, nil
102
+}
103
+
104
+// moveWALAndSnap moves away the WAL and snapshot because we were removed
105
+// from the cluster and will need to recreate them if we are readded.
106
+func (n *Node) moveWALAndSnap() error {
107
+	newWALDir, err := ioutil.TempDir(n.StateDir, "wal.")
108
+	if err != nil {
109
+		return err
110
+	}
111
+	err = os.Rename(n.walDir(), newWALDir)
112
+	if err != nil {
113
+		return err
114
+	}
115
+
116
+	newSnapDir, err := ioutil.TempDir(n.StateDir, "snap.")
117
+	if err != nil {
118
+		return err
119
+	}
120
+	err = os.Rename(n.snapDir(), newSnapDir)
121
+	if err != nil {
122
+		return err
123
+	}
124
+
125
+	return nil
126
+}
127
+
85 128
 func (n *Node) readWAL(ctx context.Context, snapshot *raftpb.Snapshot, forceNewCluster bool) (err error) {
86 129
 	var (
87 130
 		walsnap  walpb.Snapshot
... ...
@@ -238,6 +268,7 @@ func (n *Node) doSnapshot(raftConfig *api.RaftConfig) {
238 238
 	for _, member := range n.cluster.Members() {
239 239
 		snapshot.Membership.Members = append(snapshot.Membership.Members,
240 240
 			&api.RaftMember{
241
+				NodeID: member.NodeID,
241 242
 				RaftID: member.RaftID,
242 243
 				Addr:   member.Addr,
243 244
 			})
... ...
@@ -312,7 +343,7 @@ func (n *Node) restoreFromSnapshot(data []byte, forceNewCluster bool) error {
312 312
 
313 313
 	if !forceNewCluster {
314 314
 		for _, member := range snapshot.Membership.Members {
315
-			if err := n.registerNode(&api.RaftMember{RaftID: member.RaftID, Addr: member.Addr}); err != nil {
315
+			if err := n.registerNode(&api.RaftMember{RaftID: member.RaftID, NodeID: member.NodeID, Addr: member.Addr}); err != nil {
316 316
 				return err
317 317
 			}
318 318
 		}
... ...
@@ -29,6 +29,7 @@ func dial(addr string, protocol string, creds credentials.TransportAuthenticator
29 29
 // Register registers the node raft server
30 30
 func Register(server *grpc.Server, node *Node) {
31 31
 	api.RegisterRaftServer(server, node)
32
+	api.RegisterRaftMembershipServer(server, node)
32 33
 }
33 34
 
34 35
 // WaitForLeader waits until node observe some leader in cluster. It returns