Merge pull request #13216 from serathius/wal

Annotate proto messages with version and detect etcd version generated the wal
This commit is contained in:
Piotr Tabor 2021-08-06 10:58:57 +02:00 committed by GitHub
commit 873f3691f1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
19 changed files with 1431 additions and 474 deletions

View File

@ -12,6 +12,7 @@ import (
_ "github.com/gogo/protobuf/gogoproto" _ "github.com/gogo/protobuf/gogoproto"
proto "github.com/golang/protobuf/proto" proto "github.com/golang/protobuf/proto"
membershippb "go.etcd.io/etcd/api/v3/membershippb" membershippb "go.etcd.io/etcd/api/v3/membershippb"
_ "go.etcd.io/etcd/api/v3/versionpb"
) )
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.
@ -237,70 +238,73 @@ func init() {
func init() { proto.RegisterFile("raft_internal.proto", fileDescriptor_b4c9a9be0cfca103) } func init() { proto.RegisterFile("raft_internal.proto", fileDescriptor_b4c9a9be0cfca103) }
var fileDescriptor_b4c9a9be0cfca103 = []byte{ var fileDescriptor_b4c9a9be0cfca103 = []byte{
// 1003 bytes of a gzipped FileDescriptorProto // 1054 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x96, 0xd9, 0x72, 0x1b, 0x45, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x56, 0x5d, 0x6f, 0x1b, 0x45,
0x14, 0x86, 0x23, 0xc5, 0x71, 0xac, 0x96, 0xed, 0x38, 0x6d, 0x87, 0x34, 0x72, 0x95, 0x70, 0x1c, 0x14, 0xad, 0xd3, 0x34, 0x89, 0xc7, 0x49, 0x9a, 0x4e, 0x52, 0x3a, 0x38, 0x92, 0x71, 0x03, 0x2d,
0x12, 0xcc, 0x66, 0x53, 0xca, 0x03, 0x80, 0x90, 0x5c, 0x8e, 0xab, 0x42, 0x70, 0x4d, 0xcc, 0x52, 0x01, 0x8a, 0x53, 0x1c, 0x78, 0xe1, 0x05, 0x5c, 0x3b, 0x4a, 0x83, 0x4a, 0x15, 0x6d, 0x0b, 0xaa,
0xc5, 0xc5, 0xd0, 0x9a, 0x39, 0x96, 0x06, 0xcf, 0x46, 0x77, 0x4b, 0x31, 0xef, 0x11, 0x28, 0x1e, 0x84, 0xd0, 0x32, 0xde, 0xbd, 0xb1, 0xb7, 0x59, 0xef, 0x2e, 0x33, 0x63, 0x37, 0x7d, 0xe5, 0x91,
0x83, 0xed, 0x21, 0x72, 0xc1, 0x62, 0xe0, 0x05, 0xc0, 0xdc, 0x70, 0x0f, 0xdc, 0x53, 0xbd, 0xcc, 0x67, 0x40, 0xfc, 0x0c, 0x3e, 0xff, 0x43, 0x85, 0xf8, 0x28, 0xf0, 0x07, 0x20, 0xbc, 0xf0, 0x0e,
0x26, 0xb5, 0x7c, 0xa7, 0xf9, 0xcf, 0x7f, 0xbe, 0x73, 0xba, 0xe7, 0xf4, 0xa8, 0xd1, 0x3a, 0xa3, 0xbc, 0xa3, 0xf9, 0xd8, 0x5d, 0xaf, 0x3d, 0xce, 0xdb, 0xfa, 0xde, 0x73, 0xcf, 0x39, 0x33, 0x73,
0x27, 0xc2, 0x0d, 0x62, 0x01, 0x2c, 0xa6, 0xe1, 0x6e, 0xca, 0x12, 0x91, 0xe0, 0x65, 0x10, 0x9e, 0xef, 0x78, 0xd0, 0x3a, 0xa3, 0x47, 0xc2, 0x0d, 0x22, 0x01, 0x2c, 0xa2, 0x61, 0x23, 0x61, 0xb1,
0xcf, 0x81, 0x4d, 0x80, 0xa5, 0x83, 0xd6, 0xc6, 0x30, 0x19, 0x26, 0x2a, 0xb0, 0x27, 0x7f, 0x69, 0x88, 0xf1, 0x32, 0x08, 0xcf, 0xe7, 0xc0, 0x46, 0xc0, 0x92, 0x6e, 0x75, 0xa3, 0x17, 0xf7, 0x62,
0x4f, 0x6b, 0xad, 0xf0, 0x18, 0xa5, 0xc1, 0x52, 0xcf, 0xfc, 0xbc, 0x2f, 0x83, 0x7b, 0x34, 0x0d, 0x95, 0xd8, 0x91, 0x5f, 0x1a, 0x53, 0x5d, 0xcb, 0x31, 0x26, 0x52, 0x66, 0x89, 0x67, 0x3e, 0xeb,
0xf6, 0x22, 0x88, 0x06, 0xc0, 0xf8, 0x28, 0x48, 0xd3, 0x41, 0xe9, 0x41, 0xfb, 0xb6, 0x3f, 0x45, 0x32, 0xb9, 0x43, 0x93, 0x60, 0x67, 0x04, 0x8c, 0x07, 0x71, 0x94, 0x74, 0xd3, 0x2f, 0x83, 0xb8,
0x2b, 0x0e, 0x7c, 0x3e, 0x06, 0x2e, 0x1e, 0x02, 0xf5, 0x81, 0xe1, 0x55, 0x54, 0x3f, 0xec, 0x93, 0x9e, 0x21, 0x06, 0x30, 0xe8, 0x02, 0xe3, 0xfd, 0x20, 0x49, 0xba, 0x63, 0x3f, 0x34, 0x6e, 0x8b,
0xda, 0x56, 0x6d, 0x67, 0xc1, 0xa9, 0x1f, 0xf6, 0x71, 0x0b, 0x2d, 0x8d, 0xb9, 0x6c, 0x2d, 0x02, 0xa1, 0x15, 0x07, 0x3e, 0x1e, 0x02, 0x17, 0xb7, 0x81, 0xfa, 0xc0, 0xf0, 0x2a, 0x9a, 0x3b, 0xe8,
0x52, 0xdf, 0xaa, 0xed, 0x34, 0x9c, 0xfc, 0x19, 0xdf, 0x45, 0x2b, 0x74, 0x2c, 0x46, 0x2e, 0x83, 0x90, 0x52, 0xbd, 0xb4, 0x3d, 0xef, 0xcc, 0x1d, 0x74, 0x70, 0x15, 0x2d, 0x0d, 0xb9, 0x34, 0x3f,
0x49, 0xc0, 0x83, 0x24, 0x26, 0x57, 0x55, 0xda, 0xb2, 0x14, 0x1d, 0xa3, 0x6d, 0x3f, 0xc3, 0x68, 0x00, 0x32, 0x57, 0x2f, 0x6d, 0x97, 0x9d, 0xec, 0x37, 0xbe, 0x81, 0x56, 0xe8, 0x50, 0xf4, 0x5d,
0xfd, 0xd0, 0xac, 0xce, 0xa1, 0x27, 0xc2, 0x94, 0xc3, 0x0f, 0xd0, 0xe2, 0x48, 0x95, 0x24, 0xfe, 0x06, 0xa3, 0x40, 0x6a, 0x93, 0xf3, 0xb2, 0xec, 0xd6, 0xe2, 0xa7, 0xdf, 0x93, 0xf3, 0xbb, 0x8d,
0x56, 0x6d, 0xa7, 0xd9, 0xd9, 0xdc, 0x2d, 0xaf, 0x79, 0xb7, 0xd2, 0x95, 0x63, 0xac, 0x33, 0xdd, 0xd7, 0x9c, 0x65, 0x99, 0x75, 0x4c, 0xf2, 0xcd, 0xc5, 0x4f, 0x54, 0xf8, 0xe6, 0xd6, 0x0f, 0x18,
0xdd, 0x43, 0xf5, 0x49, 0x47, 0xf5, 0xd5, 0xec, 0xdc, 0xb2, 0x02, 0x9c, 0xfa, 0xa4, 0x83, 0xdf, 0xad, 0x1f, 0x98, 0x1d, 0x71, 0xe8, 0x91, 0x30, 0x06, 0xf0, 0x2e, 0x5a, 0xe8, 0x2b, 0x13, 0xc4,
0x42, 0xd7, 0x18, 0x8d, 0x87, 0xa0, 0x1a, 0x6c, 0x76, 0x5a, 0x53, 0x4e, 0x19, 0xca, 0xec, 0xda, 0xaf, 0x97, 0xb6, 0x2b, 0xcd, 0xcd, 0xc6, 0xf8, 0x3e, 0x35, 0x0a, 0x3e, 0x1d, 0x03, 0x9d, 0xf2,
0x88, 0x5f, 0x43, 0x57, 0xd3, 0xb1, 0x20, 0x0b, 0xca, 0x4f, 0xaa, 0xfe, 0xa3, 0x71, 0xb6, 0x08, 0x7b, 0x0d, 0xcd, 0x8d, 0x9a, 0xca, 0x69, 0xa5, 0x79, 0xd9, 0x4a, 0xe0, 0xcc, 0x8d, 0x9a, 0xf8,
0x47, 0x9a, 0x70, 0x0f, 0x2d, 0xfb, 0x10, 0x82, 0x00, 0x57, 0x17, 0xb9, 0xa6, 0x92, 0xb6, 0xaa, 0x26, 0xba, 0xc0, 0x68, 0xd4, 0x03, 0x65, 0xb9, 0xd2, 0xac, 0x4e, 0x20, 0x65, 0x2a, 0x85, 0x6b,
0x49, 0x7d, 0xe5, 0xa8, 0x94, 0x6a, 0xfa, 0x85, 0x26, 0x0b, 0x8a, 0xb3, 0x98, 0x2c, 0xda, 0x0a, 0x20, 0x7e, 0x19, 0x9d, 0x4f, 0x86, 0x82, 0xcc, 0x2b, 0x3c, 0x29, 0xe2, 0x0f, 0x87, 0xe9, 0x22,
0x1e, 0x9f, 0xc5, 0x79, 0x41, 0x71, 0x16, 0xe3, 0xb7, 0x11, 0xf2, 0x92, 0x28, 0xa5, 0x9e, 0x90, 0x1c, 0x09, 0xc2, 0x6d, 0xb4, 0xec, 0x43, 0x08, 0x02, 0x5c, 0x2d, 0x72, 0x41, 0x15, 0xd5, 0x8b,
0x9b, 0x7e, 0x5d, 0xa5, 0xbc, 0x54, 0x4d, 0xe9, 0xe5, 0xf1, 0x2c, 0xb3, 0x94, 0x82, 0xdf, 0x41, 0x45, 0x1d, 0x85, 0x28, 0x48, 0x55, 0xfc, 0x3c, 0x26, 0x05, 0xc5, 0x49, 0x44, 0x16, 0x6c, 0x82,
0xcd, 0x10, 0x28, 0x07, 0x77, 0xc8, 0x68, 0x2c, 0xc8, 0x92, 0x8d, 0xf0, 0x48, 0x1a, 0x0e, 0x64, 0xf7, 0x4f, 0xa2, 0x4c, 0x50, 0x9c, 0x44, 0xf8, 0x2d, 0x84, 0xbc, 0x78, 0x90, 0x50, 0x4f, 0xc8,
0x3c, 0x27, 0x84, 0xb9, 0x24, 0xd7, 0xac, 0x09, 0x0c, 0x26, 0xc9, 0x29, 0x90, 0x86, 0x6d, 0xcd, 0x63, 0x58, 0x54, 0x25, 0xcf, 0x15, 0x4b, 0xda, 0x59, 0x3e, 0xad, 0x1c, 0x2b, 0xc1, 0x6f, 0xa3,
0x0a, 0xe1, 0x28, 0x43, 0xbe, 0xe6, 0xb0, 0xd0, 0xe4, 0x6b, 0xa1, 0x21, 0x65, 0x11, 0x41, 0xb6, 0x4a, 0x08, 0x94, 0x83, 0xdb, 0x63, 0x34, 0x12, 0x64, 0xc9, 0xc6, 0x70, 0x47, 0x02, 0xf6, 0x65,
0xd7, 0xd2, 0x95, 0xa1, 0xfc, 0xb5, 0x28, 0x23, 0x7e, 0x1f, 0xad, 0xe9, 0xb2, 0xde, 0x08, 0xbc, 0x3e, 0x63, 0x08, 0xb3, 0x90, 0x5c, 0xb3, 0x66, 0x60, 0x30, 0x8a, 0x8f, 0x81, 0x94, 0x6d, 0x6b,
0xd3, 0x34, 0x09, 0x62, 0x41, 0x9a, 0x2a, 0xf9, 0x65, 0x4b, 0xe9, 0x5e, 0x6e, 0xca, 0x30, 0x37, 0x56, 0x14, 0x8e, 0x02, 0x64, 0x6b, 0x0e, 0xf3, 0x98, 0x3c, 0x16, 0x1a, 0x52, 0x36, 0x20, 0xc8,
0xc2, 0xaa, 0x8e, 0xbb, 0xa8, 0xa9, 0x46, 0x18, 0x62, 0x3a, 0x08, 0x81, 0xfc, 0x6d, 0xdd, 0xcc, 0x76, 0x2c, 0x2d, 0x99, 0xca, 0x8e, 0x45, 0x01, 0xf1, 0x03, 0xb4, 0xa6, 0x65, 0xbd, 0x3e, 0x78,
0xee, 0x58, 0x8c, 0xf6, 0x95, 0x21, 0xdf, 0x0a, 0x9a, 0x4b, 0xb8, 0x8f, 0xd4, 0xc0, 0xbb, 0x7e, 0xc7, 0x49, 0x1c, 0x44, 0x82, 0x54, 0x54, 0xf1, 0x0b, 0x16, 0xe9, 0x76, 0x06, 0x32, 0x34, 0x69,
0xc0, 0x15, 0xe3, 0x9f, 0xeb, 0xb6, 0xbd, 0x90, 0x8c, 0xbe, 0x76, 0xe4, 0x7b, 0x41, 0x0b, 0x2d, 0xb3, 0xbe, 0xee, 0x5c, 0x0c, 0x8b, 0x00, 0xdc, 0x42, 0x15, 0xd5, 0xdd, 0x10, 0xd1, 0x6e, 0x08,
0x6f, 0x84, 0x0b, 0x2a, 0xc6, 0x9c, 0xfc, 0x37, 0xb7, 0x91, 0x27, 0xca, 0x50, 0x69, 0x44, 0x4b, 0xe4, 0x6f, 0xeb, 0xae, 0xb6, 0x86, 0xa2, 0xbf, 0xa7, 0x00, 0xd9, 0x9e, 0xd0, 0x2c, 0x84, 0x3b,
0xf8, 0xb1, 0x6e, 0x04, 0x62, 0x11, 0x78, 0x54, 0x00, 0xf9, 0x57, 0x33, 0x5e, 0xad, 0x32, 0xb2, 0x48, 0x8d, 0x80, 0xeb, 0x07, 0x5c, 0x71, 0xfc, 0xb3, 0x68, 0xdb, 0x14, 0xc9, 0xd1, 0xd1, 0x88,
0xb3, 0xd8, 0x2d, 0x59, 0x33, 0x5a, 0x25, 0x1f, 0xef, 0x9b, 0xe3, 0x2d, 0xcf, 0xbb, 0x4b, 0x7d, 0x6c, 0x53, 0x68, 0x1e, 0xc3, 0xef, 0x18, 0x23, 0x5c, 0x50, 0x31, 0xe4, 0xe4, 0xbf, 0x99, 0x46,
0x9f, 0xfc, 0xb8, 0x34, 0x6f, 0x65, 0x1f, 0x70, 0x60, 0x5d, 0xdf, 0xaf, 0xac, 0xcc, 0x68, 0xf8, 0xee, 0x29, 0xc0, 0xc4, 0xca, 0xde, 0xd0, 0x8e, 0x74, 0x0e, 0xdf, 0xd5, 0x8e, 0x20, 0x12, 0x81,
0x31, 0x5a, 0x2b, 0x30, 0x7a, 0xe4, 0xc9, 0x4f, 0x9a, 0x74, 0xd7, 0x4e, 0x32, 0x67, 0xc5, 0xc0, 0x47, 0x05, 0x90, 0x7f, 0x35, 0xd9, 0x4b, 0x45, 0xb2, 0x74, 0x3a, 0x5b, 0x63, 0xd0, 0xd4, 0x5a,
0x56, 0x69, 0x45, 0xae, 0xb6, 0x35, 0x04, 0x41, 0x7e, 0xbe, 0xb4, 0xad, 0x03, 0x10, 0x33, 0x6d, 0xa1, 0x1e, 0xef, 0x99, 0x2b, 0x40, 0xde, 0x09, 0x2e, 0xf5, 0x7d, 0xf2, 0xe3, 0xd2, 0xac, 0x25,
0x1d, 0x80, 0xc0, 0x43, 0xf4, 0x62, 0x81, 0xf1, 0x46, 0xf2, 0x10, 0xba, 0x29, 0xe5, 0xfc, 0x69, 0xbe, 0xc7, 0x81, 0xb5, 0x7c, 0xbf, 0xb0, 0x44, 0x13, 0xc3, 0x77, 0xd1, 0x5a, 0x4e, 0xa3, 0x87,
0xc2, 0x7c, 0xf2, 0x8b, 0x46, 0xbe, 0x6e, 0x47, 0xf6, 0x94, 0xfb, 0xc8, 0x98, 0x33, 0xfa, 0x0b, 0x80, 0xfc, 0xa4, 0x99, 0x9e, 0xb7, 0x33, 0x99, 0xe9, 0x31, 0x64, 0xab, 0xb4, 0x10, 0x2e, 0xda,
0xd4, 0x1a, 0xc6, 0x1f, 0xa3, 0x8d, 0x52, 0xbf, 0xf2, 0xf4, 0xb8, 0x2c, 0x09, 0x81, 0x9c, 0xeb, 0xea, 0x81, 0x20, 0x3f, 0x9f, 0x69, 0x6b, 0x1f, 0xc4, 0x94, 0xad, 0x7d, 0x10, 0xb8, 0x87, 0x9e,
0x1a, 0xf7, 0xe7, 0xb4, 0xad, 0x4e, 0x5e, 0x52, 0x4c, 0xcb, 0x4d, 0x3a, 0x1d, 0xc1, 0x9f, 0xa0, 0xcd, 0x69, 0xbc, 0xbe, 0x1c, 0x4b, 0x37, 0xa1, 0x9c, 0x3f, 0x8a, 0x99, 0x4f, 0x7e, 0xd1, 0x94,
0x5b, 0x05, 0x59, 0x1f, 0x44, 0x8d, 0xfe, 0x55, 0xa3, 0x5f, 0xb1, 0xa3, 0xcd, 0x89, 0x2c, 0xb1, 0xaf, 0xd8, 0x29, 0xdb, 0x0a, 0x7d, 0x68, 0xc0, 0x29, 0xfb, 0x33, 0xd4, 0x9a, 0xc6, 0x0f, 0xd0,
0x31, 0x9d, 0x09, 0xe1, 0x87, 0x68, 0xb5, 0x80, 0x87, 0x01, 0x17, 0xe4, 0x37, 0x4d, 0xbd, 0x63, 0xc6, 0x98, 0x5f, 0x39, 0x4f, 0x2e, 0x8b, 0x43, 0x20, 0x4f, 0xb5, 0xc6, 0xf5, 0x19, 0xb6, 0xd5,
0xa7, 0x3e, 0x0a, 0xb8, 0xa8, 0xcc, 0x51, 0x26, 0xe6, 0x24, 0xd9, 0x9a, 0x26, 0xfd, 0x3e, 0x97, 0x2c, 0xc6, 0x79, 0xdb, 0x5c, 0xa2, 0x93, 0x19, 0xfc, 0x01, 0xba, 0x9c, 0x33, 0xeb, 0xd1, 0xd4,
0x24, 0x4b, 0xcf, 0x90, 0x32, 0x31, 0x7f, 0xf5, 0x8a, 0x24, 0x27, 0xf2, 0x9b, 0xc6, 0xbc, 0x57, 0xd4, 0xbf, 0x6a, 0xea, 0x17, 0xed, 0xd4, 0x66, 0x46, 0xc7, 0xb8, 0x31, 0x9d, 0x4a, 0xe1, 0xdb,
0x2f, 0x73, 0xa6, 0x27, 0xd2, 0x68, 0xf9, 0x44, 0x2a, 0x8c, 0x99, 0xc8, 0x6f, 0x1b, 0xf3, 0x26, 0x68, 0x35, 0x27, 0x0f, 0x03, 0x2e, 0xc8, 0x6f, 0x9a, 0xf5, 0xaa, 0x9d, 0xf5, 0x4e, 0xc0, 0x45,
0x52, 0x66, 0x59, 0x26, 0xb2, 0x90, 0xab, 0x6d, 0xc9, 0x89, 0xfc, 0xee, 0xd2, 0xb6, 0xa6, 0x27, 0xa1, 0x8f, 0xd2, 0x60, 0xc6, 0x24, 0xad, 0x69, 0xa6, 0xdf, 0x67, 0x32, 0x49, 0xe9, 0x29, 0xa6,
0xd2, 0x68, 0xf8, 0x33, 0xd4, 0x2a, 0x61, 0xd4, 0xa0, 0xa4, 0xc0, 0xa2, 0x80, 0xab, 0xff, 0xd6, 0x34, 0x98, 0x1d, 0xbd, 0x62, 0x92, 0x1d, 0xf9, 0x55, 0x79, 0xd6, 0xd1, 0xcb, 0x9a, 0xc9, 0x8e,
0xef, 0x35, 0xf3, 0x8d, 0x39, 0x4c, 0x69, 0x3f, 0xca, 0xdd, 0x19, 0xff, 0x36, 0xb5, 0xc7, 0x71, 0x34, 0xb1, 0xac, 0x23, 0x15, 0x8d, 0xe9, 0xc8, 0xaf, 0xcb, 0xb3, 0x3a, 0x52, 0x56, 0x59, 0x3a,
0x84, 0x36, 0x8b, 0x5a, 0x66, 0x74, 0x4a, 0xc5, 0x7e, 0xd0, 0xc5, 0xde, 0xb4, 0x17, 0xd3, 0x53, 0x32, 0x0f, 0x17, 0x6d, 0xc9, 0x8e, 0xfc, 0xe6, 0x4c, 0x5b, 0x93, 0x1d, 0x69, 0x62, 0xf8, 0x21,
0x32, 0x5b, 0x8d, 0xd0, 0x39, 0x06, 0xfc, 0x11, 0x5a, 0xf7, 0xc2, 0x31, 0x17, 0xc0, 0xdc, 0x09, 0xaa, 0x8e, 0xd1, 0xa8, 0x46, 0x49, 0x80, 0x0d, 0x02, 0xae, 0xfe, 0x7f, 0xbf, 0xd5, 0x9c, 0x37,
0x30, 0x29, 0xb9, 0x1c, 0x04, 0x79, 0x86, 0xcc, 0x11, 0x28, 0x5f, 0x52, 0x76, 0x7b, 0xda, 0xf9, 0x66, 0x70, 0x4a, 0xf8, 0x61, 0x86, 0x4e, 0xf9, 0xaf, 0x50, 0x7b, 0x1e, 0x0f, 0xd0, 0x66, 0xae,
0xa1, 0x36, 0x3e, 0x29, 0x76, 0xeb, 0xa6, 0x37, 0x1d, 0xc1, 0x14, 0xdd, 0xce, 0xc0, 0x9a, 0xe1, 0x65, 0x5a, 0x67, 0x4c, 0xec, 0x3b, 0x2d, 0xf6, 0xaa, 0x5d, 0x4c, 0x77, 0xc9, 0xb4, 0x1a, 0xa1,
0x52, 0x21, 0x98, 0x82, 0x7f, 0x89, 0xcc, 0xe7, 0xcf, 0x06, 0x7f, 0x4f, 0x69, 0x5d, 0x21, 0x58, 0x33, 0x00, 0xf8, 0x23, 0xb4, 0xee, 0x85, 0x43, 0x2e, 0x80, 0xb9, 0xe6, 0x2d, 0xe3, 0x72, 0x10,
0x89, 0xbf, 0xe1, 0x59, 0x82, 0xf8, 0x18, 0x61, 0x3f, 0x79, 0x1a, 0x0f, 0x19, 0xf5, 0xc1, 0x0d, 0xe4, 0x33, 0x64, 0x46, 0x60, 0xfc, 0x21, 0xd3, 0x68, 0x6b, 0xe4, 0xfb, 0x1a, 0x78, 0x0f, 0xc4,
0xe2, 0x93, 0x44, 0xd1, 0xbf, 0xd2, 0xf4, 0x7b, 0x55, 0x7a, 0x3f, 0x33, 0x1e, 0xc6, 0x27, 0x49, 0xd4, 0xad, 0x77, 0xc9, 0x9b, 0x84, 0xe0, 0x87, 0xe8, 0x4a, 0xaa, 0xa0, 0xc9, 0x5c, 0x2a, 0x04,
0x89, 0xbc, 0xe6, 0x4f, 0x05, 0xb6, 0x6f, 0xa0, 0x95, 0xfd, 0x28, 0x15, 0x5f, 0x38, 0xc0, 0xd3, 0x53, 0x2a, 0x9f, 0x23, 0x73, 0x0f, 0xda, 0x54, 0xde, 0x55, 0xb1, 0x96, 0x10, 0xcc, 0x26, 0xb4,
0x24, 0xe6, 0xb0, 0x9d, 0xa2, 0xcd, 0x4b, 0x3e, 0xcd, 0x18, 0xa3, 0x05, 0x75, 0x07, 0xab, 0xa9, 0xe1, 0x59, 0x50, 0xf8, 0x43, 0x84, 0xfd, 0xf8, 0x51, 0xd4, 0x63, 0xd4, 0x07, 0x37, 0x88, 0x8e,
0x3b, 0x98, 0xfa, 0x2d, 0xef, 0x66, 0xf9, 0x17, 0xcb, 0xdc, 0xcd, 0xb2, 0x67, 0x7c, 0x07, 0x2d, 0x62, 0x25, 0xf3, 0x85, 0x96, 0xb9, 0x56, 0x94, 0xe9, 0xa4, 0xc0, 0x83, 0xe8, 0x28, 0xb6, 0x49,
0xf3, 0x20, 0x4a, 0x43, 0x70, 0x45, 0x72, 0x0a, 0xfa, 0x6a, 0xd6, 0x70, 0x9a, 0x5a, 0x3b, 0x96, 0xac, 0xf9, 0x13, 0x88, 0xfc, 0x31, 0x75, 0x11, 0xad, 0xec, 0x0d, 0x12, 0xf1, 0xd8, 0x01, 0x9e,
0xd2, 0xbb, 0x1b, 0xcf, 0xff, 0x6c, 0x5f, 0x79, 0x7e, 0xd1, 0xae, 0x9d, 0x5f, 0xb4, 0x6b, 0x7f, 0xc4, 0x11, 0x87, 0xad, 0xc7, 0x68, 0xf3, 0x8c, 0xeb, 0x1b, 0x63, 0x34, 0xaf, 0xde, 0x72, 0x25,
0x5c, 0xb4, 0x6b, 0x5f, 0xff, 0xd5, 0xbe, 0x32, 0x58, 0x54, 0x17, 0xc3, 0x07, 0xff, 0x07, 0x00, 0xf5, 0x96, 0x53, 0xdf, 0xf2, 0x8d, 0x97, 0xdd, 0x6a, 0xe6, 0x8d, 0x97, 0xfe, 0xc6, 0x57, 0xd1,
0x00, 0xff, 0xff, 0x94, 0x6f, 0x64, 0x0a, 0x98, 0x0a, 0x00, 0x00, 0x32, 0x0f, 0x06, 0x49, 0x08, 0xae, 0x88, 0x8f, 0x41, 0x3f, 0xf1, 0xca, 0x4e, 0x45, 0xc7, 0xee,
0xcb, 0x50, 0xe6, 0xe5, 0xd6, 0xc6, 0x93, 0x3f, 0x6b, 0xe7, 0x9e, 0x9c, 0xd6, 0x4a, 0x4f, 0x4f,
0x6b, 0xa5, 0x3f, 0x4e, 0x6b, 0xa5, 0x2f, 0xff, 0xaa, 0x9d, 0xeb, 0x2e, 0xa8, 0x97, 0xe6, 0xee,
0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0x30, 0x36, 0x53, 0xc6, 0x0b, 0x0b, 0x00, 0x00,
} }
func (m *RequestHeader) Marshal() (dAtA []byte, err error) { func (m *RequestHeader) Marshal() (dAtA []byte, err error) {

View File

@ -4,6 +4,7 @@ package etcdserverpb;
import "gogoproto/gogo.proto"; import "gogoproto/gogo.proto";
import "etcdserver.proto"; import "etcdserver.proto";
import "rpc.proto"; import "rpc.proto";
import "etcd/api/versionpb/version.proto";
import "etcd/api/membershippb/membership.proto"; import "etcd/api/membershippb/membership.proto";
option (gogoproto.marshaler_all) = true; option (gogoproto.marshaler_all) = true;
@ -12,16 +13,20 @@ option (gogoproto.unmarshaler_all) = true;
option (gogoproto.goproto_getters_all) = false; option (gogoproto.goproto_getters_all) = false;
message RequestHeader { message RequestHeader {
option (versionpb.etcd_version_msg) = "3.0";
uint64 ID = 1; uint64 ID = 1;
// username is a username that is associated with an auth token of gRPC connection // username is a username that is associated with an auth token of gRPC connection
string username = 2; string username = 2;
// auth_revision is a revision number of auth.authStore. It is not related to mvcc // auth_revision is a revision number of auth.authStore. It is not related to mvcc
uint64 auth_revision = 3; uint64 auth_revision = 3 [(versionpb.etcd_version_field) = "3.1"];
} }
// An InternalRaftRequest is the union of all requests which can be // An InternalRaftRequest is the union of all requests which can be
// sent via raft. // sent via raft.
message InternalRaftRequest { message InternalRaftRequest {
option (versionpb.etcd_version_msg) = "3.0";
RequestHeader header = 100; RequestHeader header = 100;
uint64 ID = 1; uint64 ID = 1;
@ -38,11 +43,11 @@ message InternalRaftRequest {
AlarmRequest alarm = 10; AlarmRequest alarm = 10;
LeaseCheckpointRequest lease_checkpoint = 11; LeaseCheckpointRequest lease_checkpoint = 11 [(versionpb.etcd_version_field) = "3.4"];
AuthEnableRequest auth_enable = 1000; AuthEnableRequest auth_enable = 1000;
AuthDisableRequest auth_disable = 1011; AuthDisableRequest auth_disable = 1011;
AuthStatusRequest auth_status = 1013; AuthStatusRequest auth_status = 1013 [(versionpb.etcd_version_field) = "3.5"];
InternalAuthenticateRequest authenticate = 1012; InternalAuthenticateRequest authenticate = 1012;
@ -61,9 +66,9 @@ message InternalRaftRequest {
AuthRoleGrantPermissionRequest auth_role_grant_permission = 1203; AuthRoleGrantPermissionRequest auth_role_grant_permission = 1203;
AuthRoleRevokePermissionRequest auth_role_revoke_permission = 1204; AuthRoleRevokePermissionRequest auth_role_revoke_permission = 1204;
membershippb.ClusterVersionSetRequest cluster_version_set = 1300; membershippb.ClusterVersionSetRequest cluster_version_set = 1300 [(versionpb.etcd_version_field) = "3.5"];
membershippb.ClusterMemberAttrSetRequest cluster_member_attr_set = 1301; membershippb.ClusterMemberAttrSetRequest cluster_member_attr_set = 1301 [(versionpb.etcd_version_field) = "3.5"];
membershippb.DowngradeInfoSetRequest downgrade_info_set = 1302; membershippb.DowngradeInfoSetRequest downgrade_info_set = 1302 [(versionpb.etcd_version_field) = "3.5"];
} }
message EmptyResponse { message EmptyResponse {
@ -73,6 +78,7 @@ message EmptyResponse {
// InternalAuthenticateRequest has a member that is filled by etcdserver and shouldn't be user-facing. // InternalAuthenticateRequest has a member that is filled by etcdserver and shouldn't be user-facing.
// For avoiding misusage the field, we have an internal version of AuthenticateRequest. // For avoiding misusage the field, we have an internal version of AuthenticateRequest.
message InternalAuthenticateRequest { message InternalAuthenticateRequest {
option (versionpb.etcd_version_msg) = "3.0";
string name = 1; string name = 1;
string password = 2; string password = 2;

View File

@ -14,6 +14,7 @@ import (
proto "github.com/golang/protobuf/proto" proto "github.com/golang/protobuf/proto"
authpb "go.etcd.io/etcd/api/v3/authpb" authpb "go.etcd.io/etcd/api/v3/authpb"
mvccpb "go.etcd.io/etcd/api/v3/mvccpb" mvccpb "go.etcd.io/etcd/api/v3/mvccpb"
_ "go.etcd.io/etcd/api/v3/versionpb"
_ "google.golang.org/genproto/googleapis/api/annotations" _ "google.golang.org/genproto/googleapis/api/annotations"
grpc "google.golang.org/grpc" grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes" codes "google.golang.org/grpc/codes"
@ -276,7 +277,7 @@ type ResponseHeader struct {
MemberId uint64 `protobuf:"varint,2,opt,name=member_id,json=memberId,proto3" json:"member_id,omitempty"` MemberId uint64 `protobuf:"varint,2,opt,name=member_id,json=memberId,proto3" json:"member_id,omitempty"`
// revision is the key-value store revision when the request was applied. // revision is the key-value store revision when the request was applied.
// For watch progress responses, the header.revision indicates progress. All future events // For watch progress responses, the header.revision indicates progress. All future events
// recieved in this stream are guaranteed to have a higher revision number than the // received in this stream are guaranteed to have a higher revision number than the
// header.revision number. // header.revision number.
Revision int64 `protobuf:"varint,3,opt,name=revision,proto3" json:"revision,omitempty"` Revision int64 `protobuf:"varint,3,opt,name=revision,proto3" json:"revision,omitempty"`
// raft_term is the raft term when the request was applied. // raft_term is the raft term when the request was applied.
@ -6165,265 +6166,282 @@ func init() {
func init() { proto.RegisterFile("rpc.proto", fileDescriptor_77a6da22d6a3feb1) } func init() { proto.RegisterFile("rpc.proto", fileDescriptor_77a6da22d6a3feb1) }
var fileDescriptor_77a6da22d6a3feb1 = []byte{ var fileDescriptor_77a6da22d6a3feb1 = []byte{
// 4115 bytes of a gzipped FileDescriptorProto // 4394 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x5b, 0x5b, 0x73, 0x1b, 0xc9, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x3c, 0x4d, 0x6f, 0x24, 0x49,
0x75, 0xe6, 0x00, 0x24, 0x40, 0x1c, 0x5c, 0x08, 0x36, 0x2f, 0x82, 0xb0, 0x12, 0xc5, 0x6d, 0xad, 0x56, 0xce, 0xfa, 0x74, 0xbd, 0x2a, 0x97, 0xcb, 0xd1, 0xee, 0x9e, 0xea, 0x9a, 0x6e, 0xb7, 0x27,
0xb4, 0x5c, 0x69, 0x97, 0x5c, 0xd3, 0x76, 0xb6, 0x4a, 0x49, 0x1c, 0x43, 0x24, 0x56, 0xe2, 0x92, 0x7b, 0x7a, 0xc6, 0xe3, 0x99, 0xb1, 0xbb, 0x6d, 0xf7, 0x0e, 0x34, 0x9a, 0x61, 0xab, 0xed, 0x9a,
0x22, 0xb9, 0x43, 0x48, 0x7b, 0x29, 0x57, 0x58, 0x43, 0xa0, 0x45, 0x4e, 0x08, 0xcc, 0xc0, 0x33, 0xb6, 0x69, 0xb7, 0xed, 0x4d, 0x57, 0xf7, 0xec, 0x0c, 0xd2, 0x9a, 0x74, 0x55, 0xb4, 0x9d, 0xeb,
0x03, 0x88, 0xdc, 0x5c, 0x9c, 0x72, 0x39, 0xae, 0xe4, 0xd5, 0xae, 0x4a, 0x25, 0x0f, 0x49, 0x1e, 0xaa, 0xcc, 0xda, 0xcc, 0x2c, 0xb7, 0xbd, 0x1c, 0x76, 0x59, 0x58, 0x56, 0x0b, 0xd2, 0x4a, 0x2c,
0x52, 0x29, 0x97, 0x1f, 0xfc, 0x9c, 0xbf, 0x90, 0xa7, 0x5c, 0x2a, 0x7f, 0x20, 0xb5, 0xf1, 0x4b, 0x12, 0x5a, 0x21, 0xb8, 0x20, 0x24, 0x38, 0x00, 0x82, 0x03, 0x07, 0xc4, 0x81, 0x03, 0x1c, 0xe0,
0xf2, 0x23, 0x52, 0xa9, 0xbe, 0xcd, 0x74, 0xcf, 0x85, 0x94, 0x8d, 0xdd, 0x7d, 0x11, 0xd1, 0xa7, 0x80, 0x84, 0xc4, 0x1f, 0x80, 0x61, 0x4f, 0xfc, 0x05, 0x24, 0xb4, 0x8a, 0xaf, 0x8c, 0xc8, 0xcc,
0x4f, 0x9f, 0xef, 0xf4, 0xe9, 0xee, 0x73, 0x4e, 0x9f, 0x1e, 0x41, 0xc9, 0x1b, 0x76, 0xd7, 0x87, 0x28, 0xdb, 0xb3, 0xf6, 0x68, 0x2f, 0xd3, 0x95, 0x11, 0xef, 0x2b, 0xde, 0x8b, 0xf7, 0x5e, 0xc4,
0x9e, 0x1b, 0xb8, 0xa8, 0x42, 0x82, 0x6e, 0xcf, 0x27, 0xde, 0x98, 0x78, 0xc3, 0x93, 0xe6, 0xe2, 0x7b, 0xe1, 0x81, 0x92, 0x3f, 0xe8, 0x2c, 0x0c, 0x7c, 0x2f, 0xf4, 0x50, 0x05, 0x87, 0x9d, 0x6e,
0xa9, 0x7b, 0xea, 0xb2, 0x8e, 0x0d, 0xfa, 0x8b, 0xf3, 0x34, 0x1b, 0x94, 0x67, 0xc3, 0x1a, 0xda, 0x80, 0xfd, 0x63, 0xec, 0x0f, 0xf6, 0x1b, 0xd3, 0x07, 0xde, 0x81, 0x47, 0x27, 0x16, 0xc9, 0x2f,
0x1b, 0x83, 0x71, 0xb7, 0x3b, 0x3c, 0xd9, 0x38, 0x1f, 0x8b, 0x9e, 0x66, 0xd8, 0x63, 0x8d, 0x82, 0x06, 0xd3, 0xa8, 0x13, 0x98, 0x45, 0x7b, 0xe0, 0x2c, 0xf6, 0x8f, 0x3b, 0x9d, 0xc1, 0xfe, 0xe2,
0xb3, 0xe1, 0x09, 0xfb, 0x23, 0xfa, 0x6e, 0x9d, 0xba, 0xee, 0x69, 0x9f, 0xf0, 0x5e, 0xc7, 0x71, 0xd1, 0x31, 0x9f, 0x69, 0x44, 0x33, 0xf6, 0x30, 0x3c, 0x1c, 0xec, 0xd3, 0x7f, 0xf8, 0xdc, 0x6c,
0x03, 0x2b, 0xb0, 0x5d, 0xc7, 0xe7, 0xbd, 0xf8, 0x2f, 0x0c, 0xa8, 0x99, 0xc4, 0x1f, 0xba, 0x8e, 0x34, 0x77, 0x8c, 0xfd, 0xc0, 0xf1, 0xdc, 0xc1, 0xbe, 0xf8, 0xc5, 0x21, 0x6e, 0x1d, 0x78, 0xde,
0x4f, 0x9e, 0x12, 0xab, 0x47, 0x3c, 0x74, 0x1b, 0xa0, 0xdb, 0x1f, 0xf9, 0x01, 0xf1, 0x8e, 0xed, 0x41, 0x0f, 0x33, 0x7c, 0xd7, 0xf5, 0x42, 0x3b, 0x74, 0x3c, 0x37, 0x60, 0xb3, 0xe6, 0x8f, 0x0c,
0x5e, 0xc3, 0x58, 0x35, 0xd6, 0xa6, 0xcd, 0x92, 0xa0, 0xec, 0xf4, 0xd0, 0x1b, 0x50, 0x1a, 0x90, 0xa8, 0x5a, 0x38, 0x18, 0x78, 0x6e, 0x80, 0xd7, 0xb1, 0xdd, 0xc5, 0x3e, 0xba, 0x0d, 0xd0, 0xe9,
0xc1, 0x09, 0xef, 0xcd, 0xb1, 0xde, 0x59, 0x4e, 0xd8, 0xe9, 0xa1, 0x26, 0xcc, 0x7a, 0x64, 0x6c, 0x0d, 0x83, 0x10, 0xfb, 0x7b, 0x4e, 0xb7, 0x6e, 0xcc, 0x1a, 0x73, 0x39, 0xab, 0xc4, 0x47, 0x36,
0xfb, 0xb6, 0xeb, 0x34, 0xf2, 0xab, 0xc6, 0x5a, 0xde, 0x0c, 0xdb, 0x74, 0xa0, 0x67, 0xbd, 0x0c, 0xba, 0xe8, 0x75, 0x28, 0xf5, 0x71, 0x7f, 0x9f, 0xcd, 0x66, 0xe8, 0xec, 0x38, 0x1b, 0xd8, 0xe8,
0x8e, 0x03, 0xe2, 0x0d, 0x1a, 0xd3, 0x7c, 0x20, 0x25, 0x74, 0x88, 0x37, 0xc0, 0x3f, 0x99, 0x81, 0xa2, 0x06, 0x8c, 0xfb, 0xf8, 0xd8, 0x21, 0xec, 0xeb, 0xd9, 0x59, 0x63, 0x2e, 0x6b, 0x45, 0xdf,
0x8a, 0x69, 0x39, 0xa7, 0xc4, 0x24, 0x3f, 0x1c, 0x11, 0x3f, 0x40, 0x75, 0xc8, 0x9f, 0x93, 0x4b, 0x04, 0xd1, 0xb7, 0x5f, 0x86, 0x7b, 0x21, 0xf6, 0xfb, 0xf5, 0x1c, 0x43, 0x24, 0x03, 0x6d, 0xec,
0x06, 0x5f, 0x31, 0xe9, 0x4f, 0x3e, 0xde, 0x39, 0x25, 0xc7, 0xc4, 0xe1, 0xc0, 0x15, 0x3a, 0xde, 0xf7, 0x1f, 0x15, 0xbf, 0xf7, 0xf7, 0xf5, 0xec, 0xf2, 0xc2, 0x7d, 0xf3, 0x9f, 0xf3, 0x50, 0xb1,
0x39, 0x25, 0x6d, 0xa7, 0x87, 0x16, 0x61, 0xa6, 0x6f, 0x0f, 0xec, 0x40, 0xa0, 0xf2, 0x86, 0xa6, 0x6c, 0xf7, 0x00, 0x5b, 0xf8, 0x5b, 0x43, 0x1c, 0x84, 0xa8, 0x06, 0xd9, 0x23, 0x7c, 0x4a, 0xe5,
0xce, 0x74, 0x4c, 0x9d, 0x2d, 0x00, 0xdf, 0xf5, 0x82, 0x63, 0xd7, 0xeb, 0x11, 0xaf, 0x31, 0xb3, 0xa8, 0x58, 0xe4, 0x27, 0x23, 0xe4, 0x1e, 0xe0, 0x3d, 0xec, 0x32, 0x09, 0x2a, 0x84, 0x90, 0x7b,
0x6a, 0xac, 0xd5, 0x36, 0xdf, 0x5a, 0x57, 0x97, 0x61, 0x5d, 0x55, 0x68, 0xfd, 0xc8, 0xf5, 0x82, 0x80, 0x5b, 0x6e, 0x17, 0x4d, 0x43, 0xbe, 0xe7, 0xf4, 0x9d, 0x90, 0xb3, 0x67, 0x1f, 0x31, 0xb9,
0x03, 0xca, 0x6b, 0x96, 0x7c, 0xf9, 0x13, 0x7d, 0x08, 0x65, 0x26, 0x24, 0xb0, 0xbc, 0x53, 0x12, 0x72, 0x09, 0xb9, 0x56, 0x01, 0x02, 0xcf, 0x0f, 0xf7, 0x3c, 0xbf, 0x8b, 0xfd, 0x7a, 0x7e, 0xd6,
0x34, 0x0a, 0x4c, 0xca, 0xbd, 0x6b, 0xa4, 0x74, 0x18, 0xb3, 0xc9, 0xe0, 0xf9, 0x6f, 0x84, 0xa1, 0x98, 0xab, 0x2e, 0xbd, 0xb9, 0xa0, 0x5a, 0x6c, 0x41, 0x15, 0x68, 0x61, 0xd7, 0xf3, 0xc3, 0x6d,
0xe2, 0x13, 0xcf, 0xb6, 0xfa, 0xf6, 0x17, 0xd6, 0x49, 0x9f, 0x34, 0x8a, 0xab, 0xc6, 0xda, 0xac, 0x02, 0x6b, 0x95, 0x02, 0xf1, 0x13, 0x7d, 0x0c, 0x65, 0x4a, 0x24, 0xb4, 0xfd, 0x03, 0x1c, 0xd6,
0xa9, 0xd1, 0xe8, 0xfc, 0xcf, 0xc9, 0xa5, 0x7f, 0xec, 0x3a, 0xfd, 0xcb, 0xc6, 0x2c, 0x63, 0x98, 0x0b, 0x94, 0xca, 0xbd, 0x73, 0xa8, 0xb4, 0x29, 0xb0, 0x45, 0xd9, 0xb3, 0xdf, 0xc8, 0x84, 0x4a,
0xa5, 0x84, 0x03, 0xa7, 0x7f, 0xc9, 0x16, 0xcd, 0x1d, 0x39, 0x01, 0xef, 0x2d, 0xb1, 0xde, 0x12, 0x80, 0x7d, 0xc7, 0xee, 0x39, 0xdf, 0xb6, 0xf7, 0x7b, 0xb8, 0x5e, 0x9c, 0x35, 0xe6, 0xc6, 0xad,
0xa3, 0xb0, 0xee, 0x35, 0xa8, 0x0f, 0x6c, 0xe7, 0x78, 0xe0, 0xf6, 0x8e, 0x43, 0x83, 0x00, 0x33, 0xd8, 0x18, 0x59, 0xff, 0x11, 0x3e, 0x0d, 0xf6, 0x3c, 0xb7, 0x77, 0x5a, 0x1f, 0xa7, 0x00, 0xe3,
0x48, 0x6d, 0x60, 0x3b, 0xcf, 0xdc, 0x9e, 0x29, 0xcd, 0x42, 0x39, 0xad, 0x0b, 0x9d, 0xb3, 0x2c, 0x64, 0x60, 0xdb, 0xed, 0x9d, 0x52, 0xeb, 0x79, 0x43, 0x37, 0x64, 0xb3, 0x25, 0x3a, 0x5b, 0xa2,
0x38, 0xad, 0x0b, 0x95, 0x73, 0x1d, 0x16, 0xa8, 0xcc, 0xae, 0x47, 0xac, 0x80, 0x44, 0xcc, 0x15, 0x23, 0x74, 0xfa, 0x01, 0xd4, 0xfa, 0x8e, 0xbb, 0xd7, 0xf7, 0xba, 0x7b, 0x91, 0x42, 0x80, 0x28,
0xc6, 0x3c, 0x3f, 0xb0, 0x9d, 0x2d, 0xd6, 0xa3, 0xf1, 0x5b, 0x17, 0x09, 0xfe, 0xaa, 0xe0, 0xb7, 0xe4, 0x71, 0xf1, 0xf7, 0xa8, 0x05, 0x1e, 0x58, 0xd5, 0xbe, 0xe3, 0x3e, 0xf3, 0xba, 0x96, 0xd0,
0x2e, 0x74, 0x7e, 0xbc, 0x0e, 0xa5, 0xd0, 0xe6, 0x68, 0x16, 0xa6, 0xf7, 0x0f, 0xf6, 0xdb, 0xf5, 0x0f, 0x41, 0xb1, 0x4f, 0xe2, 0x28, 0xe5, 0x24, 0x8a, 0x7d, 0xa2, 0xa2, 0x7c, 0x00, 0xd7, 0x08,
0x29, 0x04, 0x50, 0x68, 0x1d, 0x6d, 0xb5, 0xf7, 0xb7, 0xeb, 0x06, 0x2a, 0x43, 0x71, 0xbb, 0xcd, 0x97, 0x8e, 0x8f, 0xed, 0x10, 0x4b, 0xac, 0x4a, 0x1c, 0x6b, 0xaa, 0xef, 0xb8, 0xab, 0x14, 0x24,
0x1b, 0x39, 0xfc, 0x18, 0x20, 0xb2, 0x2e, 0x2a, 0x42, 0x7e, 0xb7, 0xfd, 0x59, 0x7d, 0x8a, 0xf2, 0x86, 0x68, 0x9f, 0xa4, 0x10, 0x27, 0x92, 0x88, 0xf6, 0x49, 0x1c, 0xd1, 0xfc, 0x00, 0x4a, 0x91,
0xbc, 0x68, 0x9b, 0x47, 0x3b, 0x07, 0xfb, 0x75, 0x83, 0x0e, 0xde, 0x32, 0xdb, 0xad, 0x4e, 0xbb, 0x5d, 0xd0, 0x38, 0xe4, 0xb6, 0xb6, 0xb7, 0x5a, 0xb5, 0x31, 0x04, 0x50, 0x68, 0xee, 0xae, 0xb6,
0x9e, 0xa3, 0x1c, 0xcf, 0x0e, 0xb6, 0xeb, 0x79, 0x54, 0x82, 0x99, 0x17, 0xad, 0xbd, 0xe7, 0xed, 0xb6, 0xd6, 0x6a, 0x06, 0x2a, 0x43, 0x71, 0xad, 0xc5, 0x3e, 0x32, 0x8d, 0xe2, 0x8f, 0xf9, 0x7e,
0xfa, 0x34, 0xfe, 0xb9, 0x01, 0x55, 0xb1, 0x5e, 0xfc, 0x4c, 0xa0, 0xef, 0x40, 0xe1, 0x8c, 0x9d, 0x7b, 0x0a, 0x20, 0x4d, 0x81, 0x8a, 0x90, 0x7d, 0xda, 0xfa, 0xb4, 0x36, 0x46, 0x80, 0x5f, 0xb4,
0x0b, 0xb6, 0x15, 0xcb, 0x9b, 0xb7, 0x62, 0x8b, 0xab, 0x9d, 0x1d, 0x53, 0xf0, 0x22, 0x0c, 0xf9, 0xac, 0xdd, 0x8d, 0xed, 0xad, 0x9a, 0x41, 0xa8, 0xac, 0x5a, 0xad, 0x66, 0xbb, 0x55, 0xcb, 0x10,
0xf3, 0xb1, 0xdf, 0xc8, 0xad, 0xe6, 0xd7, 0xca, 0x9b, 0xf5, 0x75, 0x7e, 0x5e, 0xd7, 0x77, 0xc9, 0x88, 0x67, 0xdb, 0x6b, 0xb5, 0x2c, 0x2a, 0x41, 0xfe, 0x45, 0x73, 0xf3, 0x79, 0xab, 0x96, 0x8b,
0xe5, 0x0b, 0xab, 0x3f, 0x22, 0x26, 0xed, 0x44, 0x08, 0xa6, 0x07, 0xae, 0x47, 0xd8, 0x8e, 0x9d, 0x88, 0xc9, 0x5d, 0xfc, 0x27, 0x06, 0x4c, 0x70, 0x73, 0x33, 0xdf, 0x42, 0x2b, 0x50, 0x38, 0xa4,
0x35, 0xd9, 0x6f, 0xba, 0x8d, 0xd9, 0xa2, 0x89, 0xdd, 0xca, 0x1b, 0xf8, 0x97, 0x06, 0xc0, 0xe1, 0xfe, 0x45, 0x77, 0x72, 0x79, 0xe9, 0x56, 0x62, 0x6f, 0xc4, 0x7c, 0xd0, 0xe2, 0xb0, 0xc8, 0x84,
0x28, 0xc8, 0x3e, 0x1a, 0x8b, 0x30, 0x33, 0xa6, 0x82, 0xc5, 0xb1, 0xe0, 0x0d, 0x76, 0x26, 0x88, 0xec, 0xd1, 0x71, 0x50, 0xcf, 0xcc, 0x66, 0xe7, 0xca, 0x4b, 0xb5, 0x05, 0x16, 0x19, 0x16, 0x9e,
0xe5, 0x93, 0xf0, 0x4c, 0xd0, 0x06, 0xba, 0x01, 0xc5, 0xa1, 0x47, 0xc6, 0xc7, 0xe7, 0x63, 0x06, 0xe2, 0xd3, 0x17, 0x76, 0x6f, 0x88, 0x2d, 0x32, 0x89, 0x10, 0xe4, 0xfa, 0x9e, 0x8f, 0xe9, 0x86,
0x32, 0x6b, 0x16, 0x68, 0x73, 0x77, 0x8c, 0xde, 0x84, 0x8a, 0x7d, 0xea, 0xb8, 0x1e, 0x39, 0xe6, 0x1f, 0xb7, 0xe8, 0x6f, 0xe2, 0x05, 0xd4, 0xe6, 0x7c, 0xb3, 0xb3, 0x0f, 0x29, 0xde, 0xbf, 0x1b,
0xb2, 0x66, 0x58, 0x6f, 0x99, 0xd3, 0x98, 0xde, 0x0a, 0x0b, 0x17, 0x5c, 0x50, 0x59, 0xf6, 0x28, 0x00, 0x3b, 0xc3, 0x70, 0xb4, 0x8b, 0x4d, 0x43, 0xfe, 0x98, 0x70, 0xe0, 0xee, 0xc5, 0x3e, 0xa8,
0x09, 0x3b, 0x50, 0x66, 0xaa, 0x4e, 0x64, 0xbe, 0x77, 0x22, 0x1d, 0x73, 0x6c, 0x58, 0xd2, 0x84, 0x6f, 0x61, 0x3b, 0xc0, 0x91, 0x6f, 0x91, 0x0f, 0x34, 0x0b, 0xc5, 0x81, 0x8f, 0x8f, 0xf7, 0x8e,
0x42, 0x6b, 0xfc, 0x03, 0x40, 0xdb, 0xa4, 0x4f, 0x02, 0x32, 0x89, 0xf7, 0x50, 0x6c, 0x92, 0x57, 0x8e, 0x29, 0xb7, 0x71, 0x69, 0xa7, 0x02, 0x19, 0x7f, 0x7a, 0x8c, 0xe6, 0xa1, 0xe2, 0x1c, 0xb8,
0x6d, 0x82, 0x7f, 0x66, 0xc0, 0x82, 0x26, 0x7e, 0xa2, 0x69, 0x35, 0xa0, 0xd8, 0x63, 0xc2, 0xb8, 0x9e, 0x8f, 0xf7, 0x18, 0xd1, 0xbc, 0x0a, 0xb6, 0x64, 0x95, 0xd9, 0x24, 0x5d, 0x92, 0x02, 0xcb,
0x06, 0x79, 0x53, 0x36, 0xd1, 0x43, 0x98, 0x15, 0x0a, 0xf8, 0x8d, 0x7c, 0xc6, 0xa6, 0x29, 0x72, 0x58, 0x15, 0xb4, 0xb0, 0x9b, 0x64, 0x4e, 0xae, 0xe7, 0xbb, 0x06, 0x94, 0xe9, 0x7a, 0x2e, 0xa5,
0x9d, 0x7c, 0xfc, 0xcb, 0x1c, 0x94, 0xc4, 0x44, 0x0f, 0x86, 0xa8, 0x05, 0x55, 0x8f, 0x37, 0x8e, 0xec, 0x25, 0xb9, 0x90, 0x0c, 0x45, 0x4b, 0x29, 0x3c, 0xb5, 0x34, 0x29, 0x82, 0x0b, 0x68, 0x0d,
0xd9, 0x7c, 0x84, 0x46, 0xcd, 0x6c, 0x27, 0xf4, 0x74, 0xca, 0xac, 0x88, 0x21, 0x8c, 0x8c, 0x7e, 0xf7, 0x70, 0x88, 0x2f, 0x13, 0xbc, 0x14, 0x55, 0x66, 0xb5, 0xaa, 0x94, 0xfc, 0xfe, 0xdc, 0x80,
0x17, 0xca, 0x52, 0xc4, 0x70, 0x14, 0x08, 0x93, 0x37, 0x74, 0x01, 0xd1, 0xfe, 0x7b, 0x3a, 0x65, 0x6b, 0x31, 0x86, 0x97, 0x5a, 0x7a, 0x1d, 0x8a, 0x5d, 0x4a, 0x8c, 0xc9, 0x94, 0xb5, 0xc4, 0x27,
0x82, 0x60, 0x3f, 0x1c, 0x05, 0xa8, 0x03, 0x8b, 0x72, 0x30, 0x9f, 0x8d, 0x50, 0x23, 0xcf, 0xa4, 0x5a, 0x81, 0x71, 0x2e, 0x52, 0x50, 0xcf, 0xea, 0xb7, 0xa1, 0x94, 0xb2, 0xc8, 0xa4, 0x0c, 0xa4,
0xac, 0xea, 0x52, 0x92, 0x4b, 0xf5, 0x74, 0xca, 0x44, 0x62, 0xbc, 0xd2, 0xa9, 0xaa, 0x14, 0x5c, 0x98, 0xff, 0x98, 0x81, 0x12, 0x57, 0xc6, 0xf6, 0x00, 0x35, 0x61, 0xc2, 0x67, 0x1f, 0x7b, 0x74,
0x70, 0xe7, 0x9d, 0x50, 0xa9, 0x73, 0xe1, 0x24, 0x55, 0xea, 0x5c, 0x38, 0x8f, 0x4b, 0x50, 0x14, 0xcd, 0x5c, 0xc6, 0xc6, 0xe8, 0x38, 0xb9, 0x3e, 0x66, 0x55, 0x38, 0x0a, 0x1d, 0x46, 0xbf, 0x02,
0x2d, 0xfc, 0xcf, 0x39, 0x00, 0xb9, 0x1a, 0x07, 0x43, 0xb4, 0x0d, 0x35, 0x4f, 0xb4, 0x34, 0x6b, 0x65, 0x41, 0x62, 0x30, 0x0c, 0xb9, 0xa1, 0xea, 0x71, 0x02, 0x72, 0x6b, 0xaf, 0x8f, 0x59, 0xc0,
0xbd, 0x91, 0x6a, 0x2d, 0xb1, 0x88, 0x53, 0x66, 0x55, 0x0e, 0xe2, 0xca, 0x7d, 0x0f, 0x2a, 0xa1, 0xc1, 0x77, 0x86, 0x21, 0x6a, 0xc3, 0xb4, 0x40, 0x66, 0xeb, 0xe3, 0x62, 0x64, 0x29, 0x95, 0xd9,
0x94, 0xc8, 0x60, 0x37, 0x53, 0x0c, 0x16, 0x4a, 0x28, 0xcb, 0x01, 0xd4, 0x64, 0x9f, 0xc0, 0x52, 0x38, 0x95, 0xb4, 0x39, 0xd7, 0xc7, 0x2c, 0xc4, 0xf1, 0x95, 0x49, 0xb4, 0x26, 0x45, 0x0a, 0x4f,
0x38, 0x3e, 0xc5, 0x66, 0x6f, 0x5e, 0x61, 0xb3, 0x50, 0xe0, 0x82, 0x94, 0xa0, 0x5a, 0x4d, 0x55, 0x58, 0x7e, 0x49, 0x89, 0xd4, 0x3e, 0x71, 0x39, 0x11, 0xa1, 0xad, 0x65, 0x45, 0xb6, 0xf6, 0x89,
0x2c, 0x32, 0xdb, 0xcd, 0x14, 0xb3, 0x25, 0x15, 0xa3, 0x86, 0x03, 0x1a, 0x2f, 0x79, 0x13, 0xff, 0x1b, 0xa9, 0xec, 0x71, 0x09, 0x8a, 0x7c, 0xd8, 0xfc, 0xb7, 0x0c, 0x80, 0xb0, 0xd8, 0xf6, 0x00,
0x4f, 0x1e, 0x8a, 0x5b, 0xee, 0x60, 0x68, 0x79, 0x74, 0x35, 0x0a, 0x1e, 0xf1, 0x47, 0xfd, 0x80, 0xad, 0x41, 0xd5, 0xe7, 0x5f, 0x31, 0xfd, 0xbd, 0xae, 0xd5, 0x1f, 0x37, 0xf4, 0x98, 0x35, 0x21,
0x99, 0xab, 0xb6, 0x79, 0x57, 0x97, 0x28, 0xd8, 0xe4, 0x5f, 0x93, 0xb1, 0x9a, 0x62, 0x08, 0x1d, 0x90, 0x98, 0xb8, 0x1f, 0x41, 0x25, 0xa2, 0x22, 0x55, 0x78, 0x53, 0xa3, 0xc2, 0x88, 0x42, 0x59,
0x2c, 0xc2, 0x63, 0xee, 0x35, 0x06, 0x8b, 0xe0, 0x28, 0x86, 0xc8, 0x83, 0x9c, 0x8f, 0x0e, 0x72, 0x20, 0x10, 0x25, 0x7e, 0x02, 0xd7, 0x23, 0x7c, 0x8d, 0x16, 0xdf, 0x38, 0x43, 0x8b, 0x11, 0xc1,
0x13, 0x8a, 0x63, 0xe2, 0x45, 0x21, 0xfd, 0xe9, 0x94, 0x29, 0x09, 0xe8, 0x1d, 0x98, 0x8b, 0x87, 0x6b, 0x82, 0x82, 0xaa, 0xc7, 0x27, 0x8a, 0x60, 0x52, 0x91, 0x37, 0x35, 0x8a, 0x64, 0x40, 0xaa,
0x97, 0x19, 0xc1, 0x53, 0xeb, 0xea, 0xd1, 0xe8, 0x2e, 0x54, 0xb4, 0x18, 0x57, 0x10, 0x7c, 0xe5, 0x26, 0x23, 0x09, 0x63, 0xaa, 0x04, 0x92, 0xf6, 0xd9, 0xb8, 0xf9, 0x97, 0x39, 0x28, 0xae, 0x7a,
0x81, 0x12, 0xe2, 0x96, 0xa5, 0x5f, 0xa5, 0xf1, 0xb8, 0xf2, 0x74, 0x4a, 0x7a, 0xd6, 0x65, 0xe9, 0xfd, 0x81, 0xed, 0x93, 0x4d, 0x54, 0xf0, 0x71, 0x30, 0xec, 0x85, 0x54, 0x81, 0xd5, 0xa5, 0xbb,
0x59, 0x67, 0xc5, 0x28, 0xe1, 0x5b, 0x35, 0x27, 0xf3, 0x7d, 0xdd, 0xc9, 0xe0, 0xef, 0x43, 0x55, 0x71, 0x1e, 0x1c, 0x4c, 0xfc, 0x6b, 0x51, 0x50, 0x8b, 0xa3, 0x10, 0x64, 0x9e, 0xe5, 0x33, 0x17,
0x33, 0x10, 0x8d, 0x3b, 0xed, 0x8f, 0x9f, 0xb7, 0xf6, 0x78, 0x90, 0x7a, 0xc2, 0xe2, 0x92, 0x59, 0x40, 0xe6, 0x39, 0x9e, 0xa3, 0x88, 0x80, 0x90, 0x95, 0x01, 0xa1, 0x01, 0x45, 0x7e, 0x60, 0x63,
0x37, 0x68, 0xac, 0xdb, 0x6b, 0x1f, 0x1d, 0xd5, 0x73, 0xa8, 0x0a, 0xa5, 0xfd, 0x83, 0xce, 0x31, 0xc1, 0x7a, 0x7d, 0xcc, 0x12, 0x03, 0xe8, 0x1d, 0x98, 0x4c, 0xa6, 0xc2, 0x3c, 0x87, 0xa9, 0x76,
0xe7, 0xca, 0xe3, 0x27, 0xa1, 0x04, 0x11, 0xe4, 0x94, 0xd8, 0x36, 0xa5, 0xc4, 0x36, 0x43, 0xc6, 0xe2, 0x99, 0xf3, 0x2e, 0x54, 0x62, 0x19, 0xba, 0xc0, 0xe1, 0xca, 0x7d, 0x25, 0x2f, 0xdf, 0x10,
0xb6, 0x5c, 0x14, 0xdb, 0x58, 0x98, 0xdb, 0x6b, 0xb7, 0x8e, 0xda, 0xf5, 0xe9, 0xc7, 0x35, 0xa8, 0x61, 0x9d, 0x1c, 0x2b, 0x2a, 0xeb, 0x63, 0x22, 0xb0, 0xdf, 0x11, 0x81, 0x7d, 0x5c, 0x4d, 0xb4,
0x70, 0xfb, 0x1e, 0x8f, 0x1c, 0x1a, 0x6a, 0xff, 0xd1, 0x00, 0x88, 0x4e, 0x13, 0xda, 0x80, 0x62, 0x44, 0xaf, 0x3c, 0xc6, 0xbf, 0xa9, 0x46, 0xad, 0xaf, 0x12, 0xe4, 0x08, 0x48, 0x86, 0x2f, 0xd3,
0x97, 0xe3, 0x34, 0x0c, 0xe6, 0x8c, 0x96, 0x52, 0x97, 0xcc, 0x94, 0x5c, 0xe8, 0x5b, 0x50, 0xf4, 0x82, 0x89, 0x98, 0xca, 0x48, 0x8e, 0x6c, 0x7d, 0xed, 0x79, 0x73, 0x93, 0x25, 0xd4, 0x27, 0x34,
0x47, 0xdd, 0x2e, 0xf1, 0x65, 0xc8, 0xbb, 0x11, 0xf7, 0x87, 0xc2, 0x5b, 0x99, 0x92, 0x8f, 0x0e, 0x87, 0x5a, 0x35, 0x83, 0x24, 0xe8, 0xcd, 0xd6, 0xee, 0x6e, 0x2d, 0x83, 0x6e, 0x40, 0x69, 0x6b,
0x79, 0x69, 0xd9, 0xfd, 0x11, 0x0b, 0x80, 0x57, 0x0f, 0x11, 0x7c, 0xf8, 0x6f, 0x0d, 0x28, 0x2b, 0xbb, 0xbd, 0xc7, 0xa0, 0xb2, 0x8d, 0xe2, 0x1f, 0xb3, 0x48, 0x22, 0xf3, 0xf3, 0xa7, 0x11, 0x4d,
0x9b, 0xf7, 0xb7, 0x74, 0xc2, 0xb7, 0xa0, 0xc4, 0x74, 0x20, 0x3d, 0xe1, 0x86, 0x67, 0xcd, 0x88, 0x9e, 0xa2, 0x95, 0xcc, 0x3c, 0xa6, 0x64, 0x66, 0x43, 0x64, 0xe6, 0x8c, 0xcc, 0xcc, 0x59, 0x84,
0x80, 0x7e, 0x07, 0x4a, 0xf2, 0x04, 0x48, 0x4f, 0xdc, 0x48, 0x17, 0x7b, 0x30, 0x34, 0x23, 0x56, 0x20, 0xbf, 0xd9, 0x6a, 0xee, 0xd2, 0x24, 0xcd, 0x48, 0x2f, 0xa7, 0xb3, 0xf5, 0xe3, 0x2a, 0x54,
0xbc, 0x0b, 0xf3, 0xcc, 0x2a, 0x5d, 0x9a, 0x5c, 0x4b, 0x3b, 0xaa, 0xe9, 0xa7, 0x11, 0x4b, 0x3f, 0x98, 0x79, 0xf6, 0x86, 0x2e, 0x39, 0x4c, 0xfc, 0x95, 0x01, 0x20, 0x1d, 0x16, 0x2d, 0x42, 0xb1,
0x9b, 0x30, 0x3b, 0x3c, 0xbb, 0xf4, 0xed, 0xae, 0xd5, 0x17, 0x5a, 0x84, 0x6d, 0xfc, 0x11, 0x20, 0xc3, 0x44, 0xa8, 0x1b, 0x34, 0x02, 0x5e, 0xd7, 0x5a, 0xdc, 0x12, 0x50, 0xe8, 0x01, 0x14, 0x83,
0x55, 0xd8, 0x24, 0xd3, 0xc5, 0x55, 0x28, 0x3f, 0xb5, 0xfc, 0x33, 0xa1, 0x12, 0x7e, 0x08, 0x55, 0x61, 0xa7, 0x83, 0x03, 0x91, 0xb9, 0x5f, 0x4b, 0x06, 0x61, 0x1e, 0x10, 0x2d, 0x01, 0x47, 0x50,
0xda, 0xdc, 0x7d, 0xf1, 0x1a, 0x3a, 0xb2, 0xcb, 0x81, 0xe4, 0x9e, 0xc8, 0xe6, 0x08, 0xa6, 0xcf, 0x5e, 0xda, 0x4e, 0x6f, 0x48, 0xf3, 0xf8, 0xd9, 0x28, 0x1c, 0x4e, 0xc6, 0xd8, 0x3f, 0x33, 0xa0,
0x2c, 0xff, 0x8c, 0x4d, 0xb4, 0x6a, 0xb2, 0xdf, 0xe8, 0x1d, 0xa8, 0x77, 0xf9, 0x24, 0x8f, 0x63, 0xac, 0xb8, 0xc5, 0xcf, 0x99, 0x02, 0x6e, 0x41, 0x89, 0x0a, 0x83, 0xbb, 0x3c, 0x09, 0x8c, 0x5b,
0x57, 0x86, 0x39, 0x41, 0x0f, 0x33, 0xc1, 0x4f, 0xa1, 0xc2, 0xe7, 0xf0, 0x55, 0x2b, 0x81, 0xe7, 0x72, 0x00, 0x7d, 0x05, 0x4a, 0xc2, 0x93, 0x44, 0x1e, 0xa8, 0xeb, 0xc9, 0x6e, 0x0f, 0x2c, 0x09,
0x61, 0xee, 0xc8, 0xb1, 0x86, 0xfe, 0x99, 0x2b, 0xa3, 0x1b, 0xfe, 0x07, 0x03, 0xea, 0x11, 0x6d, 0x2a, 0x85, 0x6c, 0xc3, 0x14, 0xd5, 0x53, 0x87, 0xdc, 0x3e, 0x84, 0x66, 0xd5, 0x63, 0xb9, 0x91,
0x22, 0xc4, 0xb7, 0x61, 0xce, 0x23, 0x03, 0xcb, 0x76, 0x6c, 0xe7, 0xf4, 0xf8, 0xe4, 0x32, 0x20, 0x38, 0x96, 0x37, 0x60, 0x7c, 0x70, 0x78, 0x1a, 0x38, 0x1d, 0xbb, 0xc7, 0xc5, 0x89, 0xbe, 0x25,
0xbe, 0xb8, 0x30, 0xd5, 0x42, 0xf2, 0x63, 0x4a, 0xa5, 0xaa, 0x9d, 0xf4, 0xdd, 0x13, 0xe1, 0xe6, 0xd5, 0x5d, 0x40, 0x2a, 0xd5, 0xcb, 0x28, 0x40, 0x12, 0xbd, 0x01, 0xe5, 0x75, 0x3b, 0x38, 0xe4,
0xd8, 0x6f, 0x9a, 0x2c, 0xa8, 0x7e, 0xae, 0x14, 0x7a, 0x39, 0xfc, 0xd3, 0x1c, 0x54, 0x3e, 0xb1, 0x42, 0xca, 0xf1, 0x15, 0x98, 0x20, 0xe3, 0x4f, 0x5f, 0x5c, 0x40, 0x7c, 0x81, 0xb5, 0x4c, 0x6f,
0x82, 0xae, 0x5c, 0x54, 0xb4, 0x03, 0xb5, 0xd0, 0xed, 0x31, 0x8a, 0xd0, 0x32, 0x16, 0x7c, 0xd9, 0x58, 0x02, 0xed, 0x52, 0x06, 0x42, 0x90, 0x3b, 0xb4, 0x83, 0x43, 0xaa, 0x8c, 0x09, 0x8b, 0xfe,
0x18, 0x99, 0x64, 0xcb, 0xb8, 0x59, 0xed, 0xaa, 0x04, 0x26, 0xca, 0x72, 0xba, 0xa4, 0x1f, 0x8a, 0x46, 0xef, 0x40, 0xad, 0xc3, 0xd6, 0xbf, 0x97, 0xb8, 0x77, 0x4d, 0xf2, 0x71, 0x2b, 0x25, 0x90,
0xca, 0x65, 0x8b, 0x62, 0x8c, 0xaa, 0x28, 0x95, 0x80, 0x0e, 0xa0, 0x3e, 0xf4, 0xdc, 0x53, 0x8f, 0x0d, 0x15, 0xb6, 0xbc, 0xab, 0x96, 0x46, 0x6a, 0xaa, 0x01, 0x93, 0xbb, 0xae, 0x3d, 0x08, 0x0e,
0xf8, 0x7e, 0x28, 0x8c, 0x07, 0x38, 0x9c, 0x22, 0xec, 0x50, 0xb0, 0x46, 0xe2, 0xe6, 0x86, 0x3a, 0xbd, 0x30, 0xa1, 0xc5, 0x65, 0xf3, 0xef, 0x0c, 0xa8, 0xc9, 0xc9, 0x4b, 0xc9, 0xf0, 0x36, 0x4c,
0xe9, 0xf1, 0x5c, 0x94, 0xe9, 0x70, 0xb7, 0xf5, 0x1f, 0x39, 0x40, 0xc9, 0x49, 0xfd, 0xa6, 0xc9, 0xfa, 0xb8, 0x6f, 0x3b, 0xae, 0xe3, 0x1e, 0xec, 0xed, 0x9f, 0x86, 0x38, 0xe0, 0x17, 0xd2, 0x6a,
0xdf, 0x3d, 0xa8, 0xf9, 0x81, 0xe5, 0x25, 0xb6, 0x61, 0x95, 0x51, 0xc3, 0x58, 0xf0, 0x36, 0x84, 0x34, 0xfc, 0x98, 0x8c, 0x12, 0x61, 0xf7, 0x7b, 0xde, 0x3e, 0x0f, 0xbb, 0xf4, 0x37, 0x7a, 0x23,
0x0a, 0x1d, 0x3b, 0x6e, 0x60, 0xbf, 0xbc, 0x14, 0xf9, 0x73, 0x4d, 0x92, 0xf7, 0x19, 0x15, 0xb5, 0x1e, 0x77, 0x4b, 0x22, 0xa0, 0x7d, 0x25, 0x0a, 0xbf, 0x52, 0xe6, 0x9f, 0x64, 0xa0, 0xf2, 0x89,
0xa1, 0xf8, 0xd2, 0xee, 0x07, 0xc4, 0xf3, 0x1b, 0x33, 0xab, 0xf9, 0xb5, 0xda, 0xe6, 0xc3, 0xeb, 0x1d, 0x76, 0xc4, 0x9e, 0x40, 0x1b, 0x50, 0x8d, 0x02, 0x33, 0x1d, 0xe1, 0x72, 0x27, 0x8e, 0x10,
0x96, 0x61, 0xfd, 0x43, 0xc6, 0xdf, 0xb9, 0x1c, 0x12, 0x53, 0x8e, 0x55, 0x73, 0xd2, 0x82, 0x96, 0x14, 0x47, 0xdc, 0x54, 0xc4, 0x11, 0x62, 0xa2, 0xa3, 0x0e, 0x50, 0x52, 0xb6, 0xdb, 0xc1, 0xbd,
0xa7, 0xdf, 0x84, 0xd9, 0x57, 0x54, 0x04, 0xbd, 0x7f, 0x17, 0x79, 0x1a, 0xc9, 0xda, 0xfc, 0xfa, 0x88, 0x54, 0x66, 0x34, 0x29, 0x0a, 0xa8, 0x92, 0x52, 0x07, 0xd0, 0xd7, 0xa1, 0x36, 0xf0, 0xbd,
0xfd, 0xd2, 0xb3, 0x4e, 0x07, 0xc4, 0x09, 0xe4, 0x0d, 0x51, 0xb6, 0xf1, 0x3d, 0x80, 0x08, 0x86, 0x03, 0x1f, 0x07, 0x41, 0x44, 0x8c, 0x25, 0x65, 0x53, 0x43, 0x6c, 0x87, 0x83, 0x26, 0xce, 0x25,
0x06, 0x83, 0xfd, 0x83, 0xc3, 0xe7, 0x9d, 0xfa, 0x14, 0xaa, 0xc0, 0xec, 0xfe, 0xc1, 0x76, 0x7b, 0x2b, 0xeb, 0x63, 0xd6, 0xe4, 0x20, 0x3e, 0x27, 0x43, 0xe5, 0xa4, 0x3c, 0xc1, 0xb1, 0x58, 0xf9,
0xaf, 0x4d, 0x23, 0x07, 0xde, 0x90, 0x26, 0xd5, 0xd6, 0x52, 0xc5, 0x34, 0x34, 0x4c, 0xbc, 0x0c, 0x83, 0x2c, 0xa0, 0xf4, 0x32, 0xbf, 0xe8, 0xc1, 0xf7, 0x1e, 0x54, 0x83, 0xd0, 0xf6, 0x53, 0xbb,
0x8b, 0x69, 0x0b, 0x48, 0xb3, 0xd4, 0xaa, 0xd8, 0xa5, 0x13, 0x1d, 0x22, 0x15, 0x3a, 0xa7, 0x4f, 0x78, 0x82, 0x8e, 0x46, 0xf9, 0xeb, 0x6d, 0x88, 0x24, 0xdb, 0x73, 0xbd, 0xd0, 0x79, 0x79, 0xca,
0xb7, 0x01, 0x45, 0xbe, 0x7b, 0x7b, 0x22, 0x6d, 0x97, 0x4d, 0x6a, 0x08, 0xbe, 0x19, 0x49, 0x4f, 0xae, 0x1c, 0x56, 0x55, 0x0c, 0x6f, 0xd1, 0x51, 0xb4, 0x05, 0xc5, 0x97, 0x4e, 0x2f, 0xc4, 0x7e,
0xac, 0x52, 0xd8, 0x4e, 0x75, 0x3c, 0x33, 0xa9, 0x8e, 0x07, 0xdd, 0x85, 0x6a, 0x78, 0x1a, 0x2c, 0x50, 0xcf, 0xcf, 0x66, 0xe7, 0xaa, 0x4b, 0xef, 0x9e, 0x67, 0x98, 0x85, 0x8f, 0x29, 0x7c, 0xfb,
0x5f, 0x64, 0x09, 0x25, 0xb3, 0x22, 0x37, 0x3a, 0xa5, 0x69, 0x46, 0x2f, 0xea, 0x46, 0x47, 0xf7, 0x74, 0xa0, 0x9e, 0x67, 0x39, 0x11, 0xf5, 0x60, 0x5e, 0xd0, 0xdf, 0x71, 0x4c, 0x18, 0x7f, 0x45,
0xa0, 0x40, 0xc6, 0xc4, 0x09, 0xfc, 0x46, 0x99, 0xc5, 0x92, 0xaa, 0xcc, 0xea, 0xdb, 0x94, 0x6a, 0x88, 0xee, 0x39, 0x5d, 0x9a, 0x5d, 0xa3, 0x2c, 0xba, 0x62, 0x15, 0xe9, 0xc4, 0x46, 0x17, 0xdd,
0x8a, 0x4e, 0xfc, 0x5d, 0x98, 0x67, 0xb7, 0xa7, 0x27, 0x9e, 0xe5, 0xa8, 0xd7, 0xbc, 0x4e, 0x67, 0x85, 0xf1, 0x97, 0xbe, 0x7d, 0xd0, 0xc7, 0x6e, 0xc8, 0xee, 0xed, 0x12, 0x26, 0x9a, 0x30, 0x17,
0x4f, 0x98, 0x9b, 0xfe, 0x44, 0x35, 0xc8, 0xed, 0x6c, 0x0b, 0x23, 0xe4, 0x76, 0xb6, 0xf1, 0x8f, 0x00, 0xa4, 0x28, 0x24, 0x97, 0x6d, 0x6d, 0xef, 0x3c, 0x6f, 0xd7, 0xc6, 0x50, 0x05, 0xc6, 0xb7,
0x0d, 0x40, 0xea, 0xb8, 0x89, 0xec, 0x1c, 0x13, 0x2e, 0xe1, 0xf3, 0x11, 0xfc, 0x22, 0xcc, 0x10, 0xb6, 0xd7, 0x5a, 0x9b, 0x2d, 0x92, 0xed, 0x44, 0x16, 0x7b, 0x20, 0x9d, 0xae, 0x29, 0x0c, 0x11,
0xcf, 0x73, 0x3d, 0xe1, 0x8f, 0x78, 0x03, 0xbf, 0x25, 0x74, 0x30, 0xc9, 0xd8, 0x3d, 0x0f, 0xcf, 0xdb, 0x13, 0xaa, 0x5c, 0x46, 0xfc, 0x1a, 0x2d, 0xe4, 0x12, 0x24, 0x1e, 0x98, 0x77, 0x60, 0x5a,
0x20, 0x97, 0x66, 0x84, 0xaa, 0xee, 0xc2, 0x82, 0xc6, 0x35, 0x51, 0x4c, 0xfb, 0x10, 0xe6, 0x98, 0xb7, 0x35, 0x04, 0xc0, 0x8a, 0xf9, 0x2f, 0x19, 0x98, 0xe0, 0x8e, 0x70, 0x29, 0xcf, 0xbd, 0xa9,
0xb0, 0xad, 0x33, 0xd2, 0x3d, 0x1f, 0xba, 0xb6, 0x93, 0xc0, 0xa3, 0x2b, 0x17, 0xb9, 0x5e, 0x3a, 0x48, 0xc5, 0x2f, 0x1c, 0x42, 0x49, 0x75, 0x28, 0x32, 0x07, 0xe9, 0xf2, 0x1b, 0xad, 0xf8, 0x24,
0x0f, 0x3e, 0xb1, 0x4a, 0x48, 0xec, 0x74, 0xf6, 0xf0, 0x67, 0xb0, 0x1c, 0x93, 0x23, 0xd5, 0xff, 0xe1, 0x96, 0xed, 0x77, 0xdc, 0xe5, 0x66, 0x8f, 0xbe, 0xb5, 0x81, 0x30, 0xaf, 0x0d, 0x84, 0xe8,
0x03, 0x28, 0x77, 0x43, 0xa2, 0x2f, 0xb2, 0xa0, 0xdb, 0xba, 0x72, 0xf1, 0xa1, 0xea, 0x08, 0x7c, 0x3d, 0x98, 0x88, 0x1c, 0xce, 0x0e, 0xf8, 0x51, 0xa9, 0x24, 0x4d, 0x51, 0x11, 0x4e, 0x45, 0x26,
0x00, 0x37, 0x12, 0xa2, 0x27, 0x9a, 0xf3, 0xdb, 0xb0, 0xc4, 0x04, 0xee, 0x12, 0x32, 0x6c, 0xf5, 0x63, 0x36, 0x2b, 0x8e, 0xb0, 0x19, 0xba, 0x07, 0x05, 0x7c, 0x8c, 0xdd, 0x30, 0xa8, 0x97, 0x69,
0xed, 0x71, 0xa6, 0xa5, 0x87, 0x62, 0x52, 0x0a, 0xe3, 0xd7, 0xbb, 0x2f, 0xf0, 0xef, 0x09, 0xc4, 0x6a, 0x9c, 0x10, 0x57, 0xa4, 0x16, 0x19, 0xb5, 0xf8, 0xa4, 0x34, 0xd5, 0x47, 0x30, 0x45, 0x6f,
0x8e, 0x3d, 0x20, 0x1d, 0x77, 0x2f, 0x5b, 0x37, 0x1a, 0xe7, 0xce, 0xc9, 0xa5, 0x2f, 0x12, 0x1e, 0xb0, 0x4f, 0x7c, 0xdb, 0x55, 0x6f, 0xe1, 0xed, 0xf6, 0x26, 0x4f, 0x24, 0xe4, 0x27, 0xaa, 0x42,
0xf6, 0x1b, 0xff, 0x93, 0x21, 0x4c, 0xa5, 0x0e, 0xff, 0x9a, 0x77, 0xf2, 0x0a, 0xc0, 0x29, 0x3d, 0x66, 0x63, 0x8d, 0xeb, 0x27, 0xb3, 0xb1, 0x26, 0xf1, 0x7f, 0xdf, 0x00, 0xa4, 0x12, 0xb8, 0x94,
0x32, 0xa4, 0x47, 0x3b, 0x78, 0xad, 0x45, 0xa1, 0x84, 0x7a, 0x52, 0xff, 0x5d, 0x11, 0x7a, 0x2e, 0x2d, 0x12, 0x5c, 0x84, 0x1c, 0x59, 0x29, 0xc7, 0x34, 0xe4, 0xb1, 0xef, 0x7b, 0x3e, 0x0b, 0x94,
0x8a, 0x7d, 0xce, 0xfe, 0x09, 0xbd, 0xdc, 0x6d, 0x28, 0x33, 0xc2, 0x51, 0x60, 0x05, 0x23, 0x3f, 0x16, 0xfb, 0x90, 0xd2, 0xbc, 0xcf, 0x85, 0xb1, 0xf0, 0xb1, 0x77, 0x14, 0x45, 0x00, 0x46, 0xd6,
0xb1, 0x18, 0x7f, 0x26, 0xb6, 0xbd, 0x1c, 0x34, 0xd1, 0xbc, 0xbe, 0x05, 0x05, 0x76, 0xcd, 0x90, 0x48, 0x0b, 0xdf, 0x86, 0x6b, 0x31, 0xf0, 0xab, 0x49, 0xda, 0xdb, 0x30, 0x49, 0xa9, 0xae, 0x1e,
0x49, 0xf6, 0xcd, 0x94, 0xfd, 0xc8, 0xf5, 0x30, 0x05, 0x23, 0xfe, 0xa9, 0x01, 0x85, 0x67, 0xac, 0xe2, 0xce, 0xd1, 0xc0, 0x73, 0xdc, 0x94, 0x04, 0xe8, 0x2e, 0x89, 0x5d, 0x22, 0x5d, 0x90, 0x25,
0x38, 0xab, 0xa8, 0x36, 0x2d, 0xd7, 0xc2, 0xb1, 0x06, 0xbc, 0x64, 0x54, 0x32, 0xd9, 0x6f, 0x96, 0xb2, 0x35, 0x57, 0xa2, 0xc1, 0x76, 0x7b, 0x53, 0x6e, 0xf5, 0x7d, 0xb8, 0x91, 0x20, 0x28, 0x56,
0x94, 0x12, 0xe2, 0x3d, 0x37, 0xf7, 0x78, 0xf2, 0x5b, 0x32, 0xc3, 0x36, 0xb5, 0x59, 0xb7, 0x6f, 0xf6, 0xab, 0x50, 0xee, 0x44, 0x83, 0x01, 0x3f, 0x13, 0xde, 0x8e, 0x8b, 0x9b, 0x44, 0x55, 0x31,
0x13, 0x27, 0x60, 0xbd, 0xd3, 0xac, 0x57, 0xa1, 0xd0, 0xbc, 0xda, 0xf6, 0xf7, 0x88, 0xe5, 0x39, 0x24, 0x8f, 0xaf, 0xc3, 0x6b, 0x29, 0x1e, 0x57, 0xa1, 0x8e, 0x15, 0xf3, 0x3e, 0x5c, 0xa7, 0x94,
0xa2, 0x9c, 0x3a, 0x6b, 0x46, 0x04, 0xbc, 0x07, 0x75, 0xae, 0x47, 0xab, 0xd7, 0x53, 0x52, 0xcf, 0x9f, 0x62, 0x3c, 0x68, 0xf6, 0x9c, 0xe3, 0xf3, 0xcd, 0x72, 0xca, 0xd7, 0xab, 0x60, 0x7c, 0xb9,
0x10, 0xcd, 0x88, 0xa1, 0x69, 0xd2, 0x72, 0x71, 0x69, 0xbf, 0x30, 0x60, 0x5e, 0x11, 0x37, 0x91, 0xdb, 0x4a, 0xb2, 0x6e, 0x71, 0xd6, 0x6d, 0xa7, 0x8f, 0xdb, 0xde, 0xe6, 0x68, 0x69, 0x49, 0x22,
0x55, 0xdf, 0x85, 0x02, 0x2f, 0x5f, 0x8b, 0x4c, 0x67, 0x51, 0x1f, 0xc5, 0x61, 0x4c, 0xc1, 0x83, 0x3f, 0xc2, 0xa7, 0x01, 0x3f, 0x10, 0xd2, 0xdf, 0x32, 0x7a, 0xfd, 0x8d, 0xc1, 0xd5, 0xa9, 0xd2,
0xd6, 0xa1, 0xc8, 0x7f, 0xc9, 0xdb, 0x41, 0x3a, 0xbb, 0x64, 0xc2, 0xf7, 0x60, 0x41, 0x90, 0xc8, 0xf9, 0x92, 0x5d, 0x63, 0x06, 0xe0, 0x80, 0xf8, 0x20, 0xee, 0x92, 0x09, 0x56, 0x6d, 0x53, 0x46,
0xc0, 0x4d, 0x3b, 0x18, 0x6c, 0x31, 0xf0, 0x9f, 0xc0, 0xa2, 0xce, 0x36, 0xd1, 0x94, 0x14, 0x25, 0x22, 0x81, 0x49, 0x16, 0xaa, 0x24, 0x05, 0xbe, 0xcd, 0x1d, 0x87, 0xfe, 0x27, 0x48, 0x9d, 0x94,
0x73, 0xaf, 0xa3, 0x64, 0x4b, 0x2a, 0xf9, 0x7c, 0xd8, 0x53, 0xf2, 0xa8, 0xf8, 0x8e, 0x51, 0xd7, 0xde, 0x82, 0x32, 0x9d, 0xd9, 0x0d, 0xed, 0x70, 0x18, 0x8c, 0xb2, 0xdc, 0xb2, 0xf9, 0x03, 0x83,
0x2b, 0xa7, 0xaf, 0x57, 0x34, 0x01, 0x29, 0xe2, 0x1b, 0x9d, 0xc0, 0x07, 0x72, 0x3b, 0xec, 0xd9, 0x7b, 0x94, 0xa0, 0x73, 0xa9, 0x35, 0x3f, 0x80, 0x02, 0xbd, 0xf3, 0x89, 0xbb, 0xcb, 0x4d, 0xcd,
0x7e, 0xe8, 0xc3, 0x31, 0x54, 0xfa, 0xb6, 0x43, 0x2c, 0x4f, 0xd4, 0xd4, 0x0d, 0x5e, 0x53, 0x57, 0xc6, 0x66, 0x12, 0x59, 0x1c, 0x50, 0x39, 0x27, 0x19, 0x50, 0x78, 0x46, 0x7b, 0x01, 0x8a, 0xb4,
0x69, 0xf8, 0x0b, 0x40, 0xea, 0xc0, 0x6f, 0x54, 0xe9, 0xfb, 0xd2, 0x64, 0x87, 0x9e, 0x3b, 0x70, 0x39, 0x61, 0x39, 0xd7, 0xee, 0xb3, 0x82, 0x62, 0xc9, 0xa2, 0xbf, 0xe9, 0x11, 0x1f, 0x63, 0xff,
0x33, 0xcd, 0x8e, 0xff, 0x14, 0x96, 0x62, 0x7c, 0xdf, 0xa8, 0x9a, 0x0b, 0x30, 0xbf, 0x4d, 0x64, 0xb9, 0xb5, 0xc9, 0xee, 0x14, 0x25, 0x2b, 0xfa, 0x26, 0x8a, 0xed, 0xf4, 0x1c, 0xec, 0x86, 0x74,
0x42, 0x23, 0xdd, 0xde, 0x47, 0x80, 0x54, 0xe2, 0x44, 0x91, 0x6d, 0x03, 0xe6, 0x9f, 0xb9, 0x63, 0x36, 0x47, 0x67, 0x95, 0x11, 0x74, 0x0f, 0x4a, 0x4e, 0xb0, 0x89, 0x6d, 0xdf, 0xe5, 0x45, 0x7b,
0xea, 0x22, 0x29, 0x35, 0xf2, 0x0d, 0xbc, 0x42, 0x11, 0x9a, 0x22, 0x6c, 0x53, 0x70, 0x75, 0xc0, 0x25, 0x30, 0xcb, 0x19, 0xb9, 0xc7, 0xbe, 0x01, 0x35, 0x26, 0x59, 0xb3, 0xdb, 0x55, 0xce, 0xef,
0x44, 0xe0, 0xff, 0x66, 0x40, 0xa5, 0xd5, 0xb7, 0xbc, 0x81, 0x04, 0xfe, 0x1e, 0x14, 0xf8, 0xbd, 0x11, 0x7f, 0x23, 0xc1, 0x3f, 0x46, 0x3f, 0x73, 0x3e, 0xfd, 0xbf, 0x35, 0x60, 0x4a, 0x61, 0x70,
0x5b, 0x94, 0xba, 0xee, 0xeb, 0x62, 0x54, 0x5e, 0xde, 0x68, 0xf1, 0x5b, 0xba, 0x18, 0x45, 0x15, 0x29, 0x13, 0xbc, 0x07, 0x05, 0xd6, 0x51, 0xe1, 0x47, 0xc1, 0xe9, 0x38, 0x16, 0x63, 0x63, 0x71,
0x17, 0xaf, 0x61, 0xdb, 0xb1, 0xd7, 0xb1, 0x6d, 0xf4, 0x1e, 0xcc, 0x58, 0x74, 0x08, 0x0b, 0x45, 0x18, 0xb4, 0x00, 0x45, 0xf6, 0x4b, 0x5c, 0xcc, 0xf4, 0xe0, 0x02, 0x48, 0x8a, 0xbc, 0x00, 0xd7,
0xb5, 0x78, 0xc5, 0x83, 0x49, 0x63, 0x77, 0x00, 0xce, 0x85, 0xbf, 0x03, 0x65, 0x05, 0x01, 0x15, 0xf8, 0x1c, 0xee, 0x7b, 0x3a, 0x9f, 0xcb, 0xc5, 0x23, 0xc4, 0xf7, 0x0d, 0x98, 0x8e, 0x23, 0x5c,
0x21, 0xff, 0xa4, 0x2d, 0x12, 0xf6, 0xd6, 0x56, 0x67, 0xe7, 0x05, 0x2f, 0xf5, 0xd4, 0x00, 0xb6, 0x6a, 0x95, 0x8a, 0xdc, 0x99, 0x2f, 0x24, 0xf7, 0xaf, 0x09, 0xb9, 0x9f, 0x0f, 0xba, 0xca, 0x91,
0xdb, 0x61, 0x3b, 0x87, 0x3f, 0x15, 0xa3, 0x84, 0xdb, 0x57, 0xf5, 0x31, 0xb2, 0xf4, 0xc9, 0xbd, 0x33, 0xb9, 0xe3, 0x54, 0xeb, 0x66, 0xe2, 0xd6, 0x95, 0xb4, 0x7e, 0x14, 0xad, 0x49, 0x10, 0xbb,
0x96, 0x3e, 0x17, 0x50, 0x15, 0xd3, 0x9f, 0x34, 0x8c, 0x31, 0x79, 0x19, 0x61, 0x4c, 0x51, 0xde, 0xd4, 0x9a, 0x3e, 0xb8, 0xd0, 0x9a, 0x94, 0x23, 0x58, 0x6a, 0x71, 0x1b, 0x62, 0x1b, 0x6d, 0x3a,
0x14, 0x8c, 0xf8, 0x57, 0x06, 0xd4, 0xb7, 0xdd, 0x57, 0xce, 0xa9, 0x67, 0xf5, 0xc2, 0x73, 0xf2, 0x41, 0x94, 0x71, 0xde, 0x85, 0x4a, 0xcf, 0x71, 0xb1, 0xed, 0xf3, 0xae, 0x90, 0xa1, 0xee, 0xc7,
0x61, 0x6c, 0xa5, 0xd6, 0x63, 0x65, 0xd3, 0x18, 0x7f, 0x44, 0x88, 0xad, 0x98, 0x72, 0xd1, 0xce, 0x87, 0x56, 0x6c, 0x52, 0x92, 0xfa, 0x6d, 0x03, 0x90, 0x4a, 0xeb, 0x17, 0x63, 0xad, 0x45, 0xa1,
0xe9, 0x17, 0xed, 0x0f, 0x60, 0x2e, 0x36, 0x88, 0xda, 0xfe, 0x45, 0x6b, 0x6f, 0x67, 0x9b, 0xda, 0xe0, 0x1d, 0xdf, 0xeb, 0x7b, 0xe1, 0x79, 0xdb, 0x6c, 0xc5, 0xfc, 0x5d, 0x03, 0xae, 0x27, 0x30,
0x9a, 0x95, 0xdc, 0xda, 0xfb, 0xad, 0xc7, 0x7b, 0x6d, 0xf1, 0xb4, 0xd4, 0xda, 0xdf, 0x6a, 0xef, 0x7e, 0x11, 0x92, 0xaf, 0x98, 0xb7, 0x60, 0x6a, 0x0d, 0x8b, 0x33, 0x5e, 0xaa, 0x1a, 0xb0, 0x0b,
0xd5, 0x73, 0xb8, 0x0b, 0xf3, 0x0a, 0xfc, 0xa4, 0x6f, 0x06, 0x19, 0xda, 0xcd, 0x41, 0x55, 0x44, 0x48, 0x9d, 0xbd, 0x9a, 0x53, 0xcc, 0x2f, 0xc1, 0xd4, 0x33, 0xef, 0x98, 0x04, 0x72, 0x32, 0x2d,
0x7b, 0x71, 0x28, 0xff, 0x35, 0x07, 0x35, 0x49, 0xf9, 0x7a, 0x30, 0xd1, 0x32, 0x14, 0x7a, 0x27, 0xc3, 0x14, 0x2b, 0x4f, 0x45, 0xfa, 0x8a, 0xbe, 0x65, 0xe8, 0xdd, 0x05, 0xa4, 0x62, 0x5e, 0x85,
0x47, 0xf6, 0x17, 0xf2, 0x4d, 0x49, 0xb4, 0x28, 0xbd, 0xcf, 0x71, 0xf8, 0xc3, 0xae, 0x68, 0xd1, 0x38, 0xcb, 0xe6, 0x7f, 0x1b, 0x50, 0x69, 0xf6, 0x6c, 0xbf, 0x2f, 0x44, 0xf9, 0x08, 0x0a, 0xac,
0x30, 0xee, 0x59, 0x2f, 0x83, 0x1d, 0xa7, 0x47, 0x2e, 0x58, 0x52, 0x30, 0x6d, 0x46, 0x04, 0x56, 0xd6, 0xc2, 0x0b, 0xa7, 0x6f, 0xc5, 0xe9, 0xa9, 0xb0, 0xec, 0xa3, 0xc9, 0x2a, 0x33, 0x1c, 0x8b,
0x7b, 0x12, 0x0f, 0xc0, 0xec, 0x66, 0xa5, 0x3c, 0x08, 0xa3, 0x07, 0x50, 0xa7, 0xbf, 0x5b, 0xc3, 0x2c, 0x85, 0xf7, 0x8a, 0xd7, 0x12, 0xbd, 0xe3, 0x35, 0xf4, 0x3e, 0xe4, 0x6d, 0x82, 0x42, 0xd3,
0x61, 0xdf, 0x26, 0x3d, 0x2e, 0xa0, 0xc8, 0x78, 0x12, 0x74, 0x8a, 0xce, 0xee, 0x22, 0x7e, 0x63, 0x6b, 0x35, 0x59, 0x00, 0xa3, 0xd4, 0xc8, 0x95, 0xc8, 0x62, 0x50, 0xe6, 0x87, 0x50, 0x56, 0x38,
0x96, 0x85, 0x25, 0xd1, 0x42, 0xab, 0x50, 0xe6, 0xfa, 0xed, 0x38, 0xcf, 0x7d, 0xc2, 0x5e, 0x45, 0xa0, 0x22, 0x64, 0x9f, 0xb4, 0xf8, 0x35, 0xa9, 0xb9, 0xda, 0xde, 0x78, 0xc1, 0x8a, 0x82, 0x55,
0xf3, 0xa6, 0x4a, 0xd2, 0xd3, 0x0c, 0x88, 0xa7, 0x19, 0x0b, 0x30, 0xdf, 0x1a, 0x05, 0x67, 0x6d, 0x80, 0xb5, 0x56, 0xf4, 0x9d, 0x49, 0x15, 0xff, 0x96, 0x4d, 0x9b, 0xd3, 0xe1, 0x79, 0x4b, 0x95,
0x87, 0xc6, 0x0a, 0x69, 0xe5, 0x45, 0x40, 0x94, 0xb8, 0x6d, 0xfb, 0x2a, 0x55, 0xb0, 0xea, 0x0b, 0xd0, 0x18, 0x25, 0x61, 0xe6, 0x22, 0x12, 0x4a, 0xab, 0xfe, 0x96, 0x01, 0x13, 0x5c, 0x35, 0x97,
0xd2, 0x86, 0x05, 0x4a, 0x24, 0x4e, 0x60, 0x77, 0x95, 0xb8, 0x2a, 0x33, 0x2f, 0x23, 0x96, 0x79, 0x4d, 0xcd, 0x94, 0xf2, 0x88, 0xd4, 0xac, 0x2c, 0xc3, 0xe2, 0x80, 0x52, 0x86, 0x7f, 0x32, 0xa0,
0x59, 0xbe, 0xff, 0xca, 0xf5, 0x7a, 0xc2, 0xe6, 0x61, 0x1b, 0xff, 0xbd, 0xc1, 0x21, 0x9f, 0xfb, 0xb6, 0xe6, 0xbd, 0x72, 0x0f, 0x7c, 0xbb, 0x1b, 0xf9, 0xe0, 0xc7, 0x09, 0x73, 0x2e, 0x24, 0x6a,
0x5a, 0xfa, 0xf4, 0x1b, 0x8a, 0x41, 0xef, 0x43, 0xd1, 0x1d, 0xb2, 0xb7, 0x7f, 0x51, 0x86, 0x59, 0xf7, 0x09, 0x78, 0x39, 0x90, 0x30, 0x6b, 0x5d, 0xd6, 0x52, 0x58, 0x7e, 0x17, 0x9f, 0xe6, 0x57,
0x5e, 0xe7, 0x5f, 0x0b, 0xac, 0x0b, 0xc1, 0x07, 0xbc, 0xd7, 0x94, 0x6c, 0xe8, 0x3e, 0xd4, 0xce, 0x61, 0x32, 0x81, 0x44, 0x0c, 0xf4, 0xa2, 0xb9, 0xb9, 0xb1, 0x46, 0x0c, 0x42, 0x2b, 0xb8, 0xad,
0x2c, 0xff, 0x8c, 0xf4, 0x0e, 0xa5, 0x4c, 0x7e, 0xf3, 0x8b, 0x51, 0xf1, 0x5a, 0xa4, 0xdf, 0x13, 0xad, 0xe6, 0xe3, 0xcd, 0x16, 0xef, 0xb3, 0x36, 0xb7, 0x56, 0x5b, 0x9b, 0xd2, 0x50, 0x0f, 0xc5,
0x12, 0x5c, 0xa1, 0x1f, 0x7e, 0x08, 0x4b, 0x92, 0x53, 0xbc, 0x5b, 0x5c, 0xc1, 0xfc, 0x0a, 0x6e, 0x0a, 0x1e, 0x9a, 0x3d, 0x98, 0x52, 0x04, 0xba, 0x6c, 0xbb, 0x4b, 0x2f, 0xaf, 0xe4, 0x56, 0x87,
0x4b, 0xe6, 0xad, 0x33, 0xcb, 0x39, 0x25, 0x12, 0xf0, 0xb7, 0xb5, 0x40, 0x72, 0x3e, 0xf9, 0xd4, 0x09, 0x7e, 0xca, 0x49, 0x3a, 0xfe, 0xff, 0x65, 0xa0, 0x2a, 0xa6, 0xbe, 0x1c, 0x29, 0xd0, 0x0d,
0xf9, 0x3c, 0x86, 0x46, 0x38, 0x1f, 0x76, 0xb3, 0x76, 0xfb, 0xaa, 0xa2, 0x23, 0x5f, 0x9c, 0xa7, 0x28, 0x74, 0xf7, 0x77, 0x9d, 0x6f, 0x8b, 0x4e, 0x2b, 0xff, 0x22, 0xe3, 0x3d, 0xc6, 0x87, 0xbd,
0x92, 0xc9, 0x7e, 0x53, 0x9a, 0xe7, 0xf6, 0xc3, 0x54, 0x9a, 0xfe, 0xc6, 0x5b, 0x70, 0x53, 0xca, 0x9f, 0xe0, 0x5f, 0xe8, 0x16, 0x7b, 0x5a, 0xb1, 0xe1, 0x76, 0xf1, 0x09, 0x3d, 0x0c, 0xe5, 0x2c,
0x10, 0x77, 0x5e, 0x5d, 0x48, 0x42, 0xf1, 0x34, 0x21, 0xc2, 0xb0, 0x74, 0xe8, 0xd5, 0x0b, 0xaf, 0x39, 0x40, 0xcb, 0x94, 0xfc, 0x9d, 0x05, 0xbd, 0xeb, 0x2a, 0xef, 0x2e, 0xd0, 0x32, 0xd4, 0xc8,
0x72, 0xea, 0x4b, 0xc0, 0x64, 0x1a, 0x8a, 0xcc, 0x25, 0xbe, 0x29, 0xa9, 0x62, 0x4a, 0xb6, 0x24, 0xef, 0xe6, 0x60, 0xd0, 0x73, 0x70, 0x97, 0x11, 0x20, 0xd7, 0xdc, 0x9c, 0x3c, 0xed, 0xa4, 0x00,
0xc9, 0x54, 0x80, 0x4a, 0x16, 0x0b, 0x46, 0xc9, 0x89, 0x05, 0x4b, 0x88, 0xfe, 0x01, 0xac, 0x84, 0xd0, 0x1d, 0x28, 0xd0, 0x2b, 0x60, 0x50, 0x1f, 0x27, 0x79, 0x55, 0x82, 0xf2, 0x61, 0xf4, 0x0e,
0x4a, 0x50, 0xbb, 0x1d, 0x12, 0x6f, 0x60, 0xfb, 0xbe, 0x52, 0x11, 0x4f, 0x9b, 0xf8, 0x7d, 0x98, 0x94, 0x99, 0xc4, 0x1b, 0xee, 0xf3, 0x00, 0xd3, 0x57, 0x08, 0x4a, 0x3d, 0x44, 0x9d, 0x8b, 0x9f,
0x1e, 0x12, 0x11, 0x84, 0xca, 0x9b, 0x48, 0x6e, 0x4a, 0x65, 0x30, 0xeb, 0xc7, 0x3d, 0xb8, 0x23, 0xb3, 0xe0, 0xfc, 0x73, 0xd6, 0x2d, 0x98, 0x6a, 0x0e, 0xc3, 0xc3, 0x96, 0x4b, 0x72, 0x5d, 0xca,
0xa5, 0x73, 0x8b, 0xa6, 0x8a, 0x8f, 0x2b, 0x25, 0xab, 0x81, 0xb9, 0x8c, 0x6a, 0x60, 0x3e, 0xf6, 0x36, 0xb7, 0x01, 0x91, 0xd9, 0x35, 0x27, 0xd0, 0x4e, 0x73, 0x64, 0xad, 0x61, 0x1f, 0x9a, 0x5b,
0x4a, 0xf3, 0x11, 0x37, 0xa4, 0x3c, 0xf3, 0x13, 0x25, 0x17, 0xbb, 0xdc, 0xa6, 0xa1, 0xab, 0x98, 0x70, 0x8d, 0xcc, 0x62, 0x37, 0x74, 0x3a, 0xca, 0xb9, 0x42, 0x9c, 0x5c, 0x8d, 0xc4, 0xc9, 0xd5,
0x48, 0xd8, 0x5f, 0x0a, 0x2f, 0xf0, 0x55, 0x79, 0x78, 0xc2, 0x66, 0x28, 0x9f, 0x40, 0x64, 0x93, 0x0e, 0x82, 0x57, 0x9e, 0xdf, 0xe5, 0xb6, 0x8b, 0xbe, 0x25, 0xb7, 0x7f, 0x30, 0x98, 0x34, 0xcf,
0x66, 0xcd, 0x74, 0x01, 0x4c, 0xb5, 0x16, 0x3a, 0x6d, 0x6a, 0x34, 0x7c, 0x02, 0x8b, 0xba, 0x5f, 0x83, 0xd8, 0xa9, 0xf3, 0x0b, 0xd2, 0x43, 0xbf, 0x0c, 0x45, 0x6f, 0x40, 0xdf, 0xec, 0xf0, 0x62,
0x9b, 0x48, 0x97, 0x45, 0x98, 0x09, 0xdc, 0x73, 0x22, 0x63, 0x0d, 0x6f, 0x48, 0xdb, 0x85, 0x3e, 0xde, 0x8d, 0x05, 0xf6, 0x0e, 0x68, 0x81, 0x13, 0xde, 0x66, 0xb3, 0x4a, 0xc1, 0x89, 0xc3, 0xa3,
0x6f, 0x22, 0xdb, 0x59, 0x91, 0x30, 0x76, 0x3a, 0x26, 0xd5, 0x97, 0x6e, 0x2c, 0x79, 0x07, 0xe2, 0x45, 0xa8, 0x1e, 0xda, 0xc1, 0x21, 0xee, 0xee, 0x08, 0xe2, 0xb1, 0x52, 0xe7, 0x43, 0x2b, 0x31,
0x0d, 0xbc, 0x0f, 0xcb, 0x71, 0xcf, 0x36, 0x91, 0xca, 0x2f, 0xf8, 0x59, 0x4a, 0x73, 0x7e, 0x13, 0x2d, 0x65, 0x7f, 0x20, 0x45, 0x7f, 0x82, 0xc3, 0x33, 0x44, 0x57, 0xcb, 0xe3, 0xd7, 0x05, 0x0a,
0xc9, 0xfd, 0x38, 0xf2, 0x4b, 0x8a, 0x6f, 0x9b, 0x48, 0xa4, 0x09, 0xcd, 0x34, 0x57, 0xf7, 0x55, 0xef, 0xea, 0x5d, 0x04, 0xeb, 0x87, 0x06, 0xdc, 0x16, 0x68, 0xab, 0x87, 0xb6, 0x7b, 0x80, 0x85,
0x1c, 0x9d, 0xd0, 0xf3, 0x4d, 0x24, 0xcc, 0x8f, 0x84, 0x4d, 0xbe, 0xfc, 0x91, 0xbb, 0xca, 0x5f, 0x30, 0x3f, 0xaf, 0xbe, 0xd2, 0x8b, 0xce, 0x5e, 0x70, 0xd1, 0x4f, 0xa1, 0x1e, 0x2d, 0x9a, 0x16,
0xe9, 0xae, 0xc4, 0x21, 0x89, 0x1c, 0xea, 0xd7, 0xb0, 0xe9, 0x04, 0x46, 0xe4, 0xcb, 0x27, 0xc5, 0x56, 0xbc, 0x9e, 0xba, 0x88, 0x61, 0xc0, 0x1d, 0xbc, 0x64, 0xd1, 0xdf, 0x64, 0xcc, 0xf7, 0x7a,
0xa0, 0xe1, 0x2c, 0xc4, 0x60, 0x0d, 0xb9, 0xb1, 0xd5, 0x08, 0x30, 0xd1, 0x62, 0x7c, 0x12, 0xb9, 0xd1, 0x9d, 0x86, 0xfc, 0x96, 0xc4, 0x36, 0xe1, 0xa6, 0x20, 0xc6, 0x2b, 0x1d, 0x71, 0x6a, 0xa9,
0xf1, 0x44, 0x90, 0x98, 0x48, 0xf0, 0xa7, 0xb0, 0x9a, 0x1d, 0x1f, 0x26, 0x91, 0xfc, 0x60, 0x03, 0x35, 0x9d, 0x49, 0x8d, 0xdb, 0x83, 0xd0, 0x38, 0x7b, 0x2b, 0x69, 0x51, 0xe2, 0x26, 0xa4, 0x5c,
0x4a, 0xe1, 0x65, 0x48, 0xf9, 0x12, 0xad, 0x0c, 0xc5, 0xfd, 0x83, 0xa3, 0xc3, 0xd6, 0x56, 0x9b, 0x0c, 0x1d, 0x97, 0x19, 0xe6, 0x01, 0x44, 0x66, 0xe5, 0xf8, 0x99, 0x9a, 0x27, 0x24, 0xb5, 0xf3,
0x7f, 0x8a, 0xb6, 0x75, 0x60, 0x9a, 0xcf, 0x0f, 0x3b, 0xf5, 0xdc, 0xe6, 0xaf, 0xf3, 0x90, 0xdb, 0x7c, 0x0b, 0x90, 0xf9, 0xd4, 0x16, 0x18, 0xcd, 0x15, 0xc3, 0x4c, 0x24, 0x28, 0x51, 0xfb, 0x0e,
0x7d, 0x81, 0x3e, 0x83, 0x19, 0xfe, 0x5d, 0xc6, 0x15, 0x1f, 0xe3, 0x34, 0xaf, 0xfa, 0xf4, 0x04, 0xf6, 0xfb, 0x4e, 0x10, 0x28, 0x7d, 0x22, 0x9d, 0xba, 0xde, 0x82, 0xdc, 0x00, 0xf3, 0x5c, 0x5c,
0xdf, 0xf8, 0xf1, 0x7f, 0xfe, 0xfa, 0xe7, 0xb9, 0x79, 0x5c, 0xd9, 0x18, 0x7f, 0x7b, 0xe3, 0x7c, 0x5e, 0x42, 0xc2, 0x27, 0x14, 0x64, 0x3a, 0x2f, 0xd9, 0xf4, 0xe1, 0x8e, 0x60, 0xc3, 0x0c, 0xa2,
0xbc, 0xc1, 0xc2, 0xd4, 0x23, 0xe3, 0x01, 0xfa, 0x18, 0xf2, 0x87, 0xa3, 0x00, 0x65, 0x7e, 0xa4, 0xe5, 0x93, 0x14, 0x53, 0x54, 0xb2, 0x33, 0x23, 0x2a, 0xd9, 0xd9, 0x78, 0x25, 0x3b, 0x76, 0x3e,
0xd3, 0xcc, 0xfe, 0x1a, 0x05, 0x2f, 0x31, 0xa1, 0x73, 0x18, 0x84, 0xd0, 0xe1, 0x28, 0xa0, 0x22, 0x54, 0x03, 0xd5, 0xd5, 0x9c, 0x0f, 0xdb, 0xcc, 0x00, 0x51, 0x7c, 0xbb, 0x1a, 0xaa, 0x7f, 0xc0,
0x7f, 0x08, 0x65, 0xf5, 0x5b, 0x92, 0x6b, 0xbf, 0xdc, 0x69, 0x5e, 0xff, 0x9d, 0x0a, 0xbe, 0xcd, 0x03, 0xd5, 0x55, 0x65, 0x35, 0x4c, 0xd7, 0x2c, 0xba, 0x88, 0xe2, 0x13, 0x99, 0x50, 0x21, 0x46,
0xa0, 0x6e, 0x60, 0x24, 0xa0, 0xf8, 0xd7, 0x2e, 0xea, 0x2c, 0x3a, 0x17, 0x0e, 0xca, 0xfc, 0xae, 0xb2, 0xd4, 0x12, 0x7f, 0xce, 0x8a, 0x8d, 0xc9, 0x60, 0x7c, 0x04, 0xd3, 0xf1, 0x60, 0x7c, 0x29,
0xa7, 0x99, 0xfd, 0xe9, 0x4a, 0x62, 0x16, 0xc1, 0x85, 0x43, 0x45, 0xfe, 0x91, 0xf8, 0x6a, 0xa5, 0xa1, 0xa6, 0x21, 0x1f, 0x7a, 0x47, 0x58, 0x24, 0x5a, 0xf6, 0x91, 0x52, 0x6b, 0x14, 0xa8, 0xaf,
0x1b, 0xa0, 0x3b, 0x29, 0x5f, 0x2d, 0xa8, 0xef, 0xf3, 0xcd, 0xd5, 0x6c, 0x06, 0x01, 0x72, 0x8b, 0x46, 0xad, 0xdf, 0x94, 0x54, 0xa9, 0x03, 0x5e, 0x76, 0x05, 0x64, 0x3b, 0x8a, 0xab, 0x2c, 0xfb,
0x81, 0x2c, 0xe3, 0x79, 0x01, 0xd2, 0x0d, 0x59, 0x1e, 0x19, 0x0f, 0x36, 0xbb, 0x30, 0xc3, 0x5e, 0x90, 0xbc, 0x3e, 0x81, 0x1b, 0xc9, 0xe0, 0x7b, 0x35, 0x8b, 0xd8, 0x63, 0xce, 0xa9, 0x0b, 0xcf,
0xb8, 0xd0, 0xe7, 0xf2, 0x47, 0x33, 0xe5, 0xa9, 0x2f, 0x63, 0xa1, 0xb5, 0xb7, 0x31, 0xbc, 0xc8, 0x57, 0xc3, 0xe0, 0x33, 0x19, 0x27, 0x95, 0xa0, 0x7b, 0x35, 0xb4, 0x7f, 0x1d, 0x1a, 0xba, 0x18,
0x80, 0x6a, 0xb8, 0x44, 0x81, 0xd8, 0xfb, 0xd6, 0x23, 0xe3, 0xc1, 0x9a, 0xf1, 0xbe, 0xb1, 0xf9, 0x7c, 0xa5, 0xbe, 0x18, 0x85, 0xe4, 0xab, 0xa1, 0xfa, 0x7d, 0x43, 0x92, 0x55, 0x77, 0xcd, 0x87,
0xab, 0x19, 0x98, 0x61, 0xa5, 0x5d, 0x74, 0x0e, 0x10, 0xbd, 0xf6, 0xc4, 0x67, 0x97, 0x78, 0x3f, 0x5f, 0x84, 0xac, 0xc8, 0x75, 0xf7, 0xa3, 0xed, 0xb3, 0x18, 0x45, 0xcb, 0xac, 0x3e, 0x5a, 0x4a,
0x8a, 0xcf, 0x2e, 0xf9, 0x50, 0x84, 0x9b, 0x0c, 0x74, 0x11, 0xcf, 0x51, 0x50, 0x56, 0x31, 0xde, 0x14, 0x0a, 0x28, 0xfc, 0x4f, 0x86, 0xfa, 0x2f, 0x73, 0xf7, 0x72, 0x66, 0x32, 0xef, 0x5c, 0x96,
0x60, 0x45, 0x70, 0x6a, 0xc7, 0xbf, 0x32, 0x44, 0x65, 0x9b, 0x9f, 0x25, 0x94, 0x26, 0x4d, 0x7b, 0x19, 0x49, 0xcf, 0x11, 0x33, 0xfa, 0x91, 0x72, 0x15, 0x35, 0x49, 0x5d, 0x8d, 0xe9, 0x7e, 0x43,
0xf2, 0x89, 0x6f, 0x87, 0x94, 0xe7, 0x1e, 0xfc, 0x5d, 0x06, 0xb8, 0x81, 0xeb, 0x11, 0xa0, 0xc7, 0x26, 0x98, 0x54, 0x1e, 0xbb, 0x1a, 0x0e, 0x36, 0xcc, 0x8e, 0x4e, 0x61, 0x57, 0xc2, 0x62, 0xbe,
0x38, 0x1e, 0x19, 0x0f, 0x3e, 0x6f, 0xe0, 0x05, 0x61, 0xe5, 0x58, 0x0f, 0xfa, 0x11, 0xd4, 0xf4, 0x09, 0xa5, 0xe8, 0x22, 0xab, 0x3c, 0xa4, 0x2d, 0x43, 0x71, 0x6b, 0x7b, 0x77, 0xa7, 0xb9, 0x4a,
0x27, 0x0d, 0x74, 0x37, 0x05, 0x2b, 0xfe, 0x32, 0xd2, 0x7c, 0xeb, 0x6a, 0x26, 0xa1, 0xd3, 0x0a, 0xee, 0x69, 0xd3, 0x50, 0x5c, 0xdd, 0xb6, 0xac, 0xe7, 0x3b, 0x6d, 0x72, 0x51, 0x4b, 0xbc, 0xab,
0xd3, 0x49, 0x80, 0x73, 0xe4, 0x73, 0x42, 0x86, 0x16, 0x65, 0x12, 0x6b, 0x80, 0xfe, 0xce, 0x10, 0x59, 0x5e, 0xfa, 0x69, 0x16, 0x32, 0x4f, 0x5f, 0xa0, 0x4f, 0x21, 0xcf, 0xde, 0x75, 0x9d, 0xf1,
0x2f, 0x4e, 0xd1, 0x1b, 0x05, 0x4a, 0x93, 0x9e, 0x78, 0x01, 0x69, 0xde, 0xbb, 0x86, 0x4b, 0x28, 0xbc, 0xaf, 0x71, 0xd6, 0xd3, 0x35, 0xf3, 0xb5, 0xef, 0xfd, 0xe7, 0x4f, 0xff, 0x30, 0x33, 0x65,
0xf1, 0xfb, 0x4c, 0x89, 0x0f, 0xf0, 0x62, 0xa4, 0x44, 0x60, 0x0f, 0x48, 0xe0, 0x0a, 0x2d, 0x3e, 0x56, 0x16, 0x8f, 0x97, 0x17, 0x8f, 0x8e, 0x17, 0x69, 0x92, 0x7d, 0x64, 0xcc, 0xa3, 0xaf, 0x41,
0xbf, 0x85, 0x6f, 0x68, 0xc6, 0xd1, 0x7a, 0xa3, 0xc5, 0xe2, 0xef, 0x0c, 0xa9, 0x8b, 0xa5, 0xbd, 0x76, 0x67, 0x18, 0xa2, 0x91, 0xcf, 0xfe, 0x1a, 0xa3, 0x5f, 0xb3, 0x99, 0xd7, 0x29, 0xd1, 0x49,
0x5b, 0xa4, 0x2e, 0x96, 0xfe, 0x48, 0x91, 0xb6, 0x58, 0xfc, 0x55, 0x21, 0x6d, 0xb1, 0xc2, 0x9e, 0x13, 0x38, 0xd1, 0xc1, 0x30, 0x24, 0x24, 0xbf, 0x05, 0x65, 0xf5, 0x2d, 0xda, 0xb9, 0x6f, 0x01,
0xcd, 0xff, 0x9d, 0x86, 0xe2, 0x16, 0xff, 0x5a, 0x1c, 0xb9, 0x50, 0x0a, 0xcb, 0xf4, 0x68, 0x25, 0x1b, 0xe7, 0xbf, 0x73, 0x33, 0x6f, 0x53, 0x56, 0xaf, 0x99, 0x88, 0xb3, 0x62, 0xaf, 0xe5, 0xd4,
0xad, 0xce, 0x18, 0x5d, 0x6b, 0x9a, 0x77, 0x32, 0xfb, 0x85, 0x42, 0x6f, 0x32, 0x85, 0xde, 0xc0, 0x55, 0xb4, 0x4f, 0x5c, 0x34, 0xf2, 0xa5, 0x60, 0x63, 0xf4, 0xd3, 0xb7, 0xd4, 0x2a, 0xc2, 0x13,
0xcb, 0x14, 0x59, 0x7c, 0x90, 0xbe, 0xc1, 0x8b, 0x59, 0x1b, 0x56, 0xaf, 0x47, 0x0d, 0xf1, 0xc7, 0x97, 0x90, 0xfc, 0x26, 0x7f, 0xe3, 0xd6, 0x09, 0xd1, 0x1d, 0xcd, 0x23, 0x25, 0xf5, 0xf1, 0x4d,
0x50, 0x51, 0xeb, 0xe8, 0xe8, 0xcd, 0xd4, 0xda, 0xa6, 0x5a, 0x8a, 0x6f, 0xe2, 0xab, 0x58, 0x04, 0x63, 0x76, 0x34, 0x00, 0x67, 0x72, 0x8b, 0x32, 0xb9, 0x61, 0x4e, 0x71, 0x26, 0x9d, 0x08, 0xe4,
0xf2, 0x5b, 0x0c, 0x79, 0x05, 0xdf, 0x4c, 0x41, 0xf6, 0x18, 0xab, 0x06, 0xce, 0x6b, 0xe0, 0xe9, 0x91, 0x31, 0xbf, 0xd4, 0x81, 0x3c, 0x6d, 0x05, 0xa3, 0xcf, 0xc4, 0x8f, 0x86, 0xa6, 0xc9, 0x3e,
0xe0, 0x5a, 0x89, 0x3d, 0x1d, 0x5c, 0x2f, 0xa1, 0x5f, 0x09, 0x3e, 0x62, 0xac, 0x14, 0xdc, 0x07, 0xc2, 0xd0, 0xb1, 0x26, 0xb2, 0x39, 0x4d, 0x19, 0x55, 0xcd, 0x12, 0x61, 0x44, 0x1b, 0xc1, 0x8f,
0x88, 0x2a, 0xd9, 0x28, 0xd5, 0x96, 0xca, 0xbd, 0x2e, 0xee, 0x1c, 0x92, 0x45, 0x70, 0x8c, 0x19, 0x8c, 0xf9, 0x39, 0xe3, 0xbe, 0xb1, 0xf4, 0xd7, 0x79, 0xc8, 0xd3, 0x96, 0x03, 0x3a, 0x02, 0x90,
0xac, 0xd8, 0x77, 0x31, 0xd8, 0xbe, 0xed, 0x07, 0xfc, 0x60, 0x56, 0xb5, 0xd2, 0x34, 0x4a, 0x9d, 0x2d, 0xcf, 0xe4, 0xea, 0x52, 0xdd, 0xd4, 0xe4, 0xea, 0xd2, 0xdd, 0x52, 0xb3, 0x41, 0x99, 0x4e,
0x8f, 0x5e, 0xdf, 0x6e, 0xde, 0xbd, 0x92, 0x47, 0xa0, 0xdf, 0x63, 0xe8, 0x77, 0x70, 0x33, 0x05, 0x9b, 0x93, 0x84, 0x29, 0xed, 0x64, 0x2c, 0xd2, 0xc6, 0x0d, 0xd1, 0xe3, 0x0f, 0x0d, 0xde, 0x7b,
0x7d, 0xc8, 0x79, 0xe9, 0x66, 0xfb, 0xbf, 0x02, 0x94, 0x9f, 0x59, 0xb6, 0x13, 0x10, 0xc7, 0x72, 0x61, 0x6e, 0x86, 0x74, 0xd4, 0x62, 0xed, 0xce, 0xe4, 0x76, 0xd0, 0x74, 0x38, 0xcd, 0x87, 0x94,
0xba, 0x04, 0x9d, 0xc0, 0x0c, 0x8b, 0xd4, 0x71, 0x47, 0xac, 0x96, 0x6d, 0xe3, 0x8e, 0x58, 0xab, 0xe1, 0xa2, 0x59, 0x93, 0x0c, 0x7d, 0x0a, 0xf1, 0xc8, 0x98, 0xff, 0xac, 0x6e, 0x5e, 0xe3, 0x5a,
0x69, 0xe2, 0x55, 0x06, 0xdc, 0xc4, 0x4b, 0x14, 0x78, 0x10, 0x89, 0xde, 0x60, 0xa5, 0x48, 0x3a, 0x4e, 0xcc, 0xa0, 0xef, 0x40, 0x35, 0xde, 0x98, 0x43, 0x77, 0x35, 0xbc, 0x92, 0x8d, 0xbe, 0xc6,
0xe9, 0x97, 0x50, 0x10, 0xaf, 0x7d, 0x31, 0x41, 0x5a, 0xf1, 0xa7, 0x79, 0x2b, 0xbd, 0x33, 0x6d, 0x9b, 0x67, 0x03, 0x71, 0x99, 0x66, 0xa8, 0x4c, 0x9c, 0x39, 0xe3, 0x7c, 0x84, 0xf1, 0xc0, 0x26,
0x2f, 0xab, 0x30, 0x3e, 0xe3, 0xa3, 0x38, 0x63, 0x80, 0xa8, 0xc6, 0x1e, 0x5f, 0xd1, 0x44, 0x49, 0x40, 0xdc, 0x06, 0xe8, 0x4f, 0x0d, 0xde, 0x5b, 0x95, 0x7d, 0x35, 0xa4, 0xa3, 0x9e, 0x6a, 0xdf,
0xbe, 0xb9, 0x9a, 0xcd, 0x90, 0x66, 0x53, 0x15, 0xb3, 0x17, 0xf2, 0x52, 0xdc, 0x3f, 0x84, 0xe9, 0x35, 0xee, 0x9d, 0x03, 0xc5, 0x85, 0xf8, 0x90, 0x0a, 0xf1, 0x81, 0x39, 0x2d, 0x85, 0x08, 0x9d,
0xa7, 0x96, 0x7f, 0x86, 0x62, 0xb1, 0x57, 0xf9, 0x8a, 0xac, 0xd9, 0x4c, 0xeb, 0x12, 0x28, 0x77, 0x3e, 0x0e, 0x3d, 0x2e, 0xc5, 0x67, 0xb7, 0xcc, 0xd7, 0x62, 0xca, 0x89, 0xcd, 0x4a, 0x63, 0xb1,
0x18, 0xca, 0x4d, 0xee, 0xca, 0x54, 0x94, 0x33, 0xcb, 0xa7, 0x41, 0x0d, 0xf5, 0xa0, 0xc0, 0x3f, 0xfe, 0x97, 0xd6, 0x58, 0xb1, 0x16, 0x9b, 0xd6, 0x58, 0xf1, 0xe6, 0x99, 0xce, 0x58, 0xbc, 0xdb,
0x2a, 0x8b, 0xdb, 0x4f, 0xfb, 0x30, 0x2d, 0x6e, 0x3f, 0xfd, 0x3b, 0xb4, 0xeb, 0x51, 0x86, 0x30, 0xa5, 0x31, 0x56, 0x34, 0xb3, 0xf4, 0xbf, 0x39, 0x28, 0xae, 0xb2, 0xbf, 0x95, 0x41, 0x1e, 0x94,
0x2b, 0xbf, 0xe2, 0x42, 0xb1, 0x87, 0xfb, 0xd8, 0x17, 0x5f, 0xcd, 0x95, 0xac, 0x6e, 0x81, 0x75, 0xa2, 0x8e, 0x10, 0x9a, 0xd1, 0x15, 0x9d, 0xe5, 0x55, 0xae, 0x71, 0x67, 0xe4, 0x3c, 0x17, 0xe8,
0x97, 0x61, 0xdd, 0xc6, 0x8d, 0xc4, 0x5a, 0x09, 0xce, 0x47, 0xc6, 0x83, 0xf7, 0x0d, 0xf4, 0x23, 0x0d, 0x2a, 0xd0, 0xeb, 0xe6, 0x0d, 0xc2, 0x99, 0xff, 0x39, 0xce, 0x22, 0x2b, 0x4d, 0x2e, 0xda,
0x80, 0xe8, 0x59, 0x22, 0x71, 0x02, 0xe3, 0x2f, 0x1c, 0x89, 0x13, 0x98, 0x78, 0xd1, 0xc0, 0xeb, 0xdd, 0x2e, 0x51, 0xc4, 0x6f, 0x42, 0x45, 0xed, 0xcf, 0xa0, 0x37, 0xb4, 0x85, 0x6e, 0xb5, 0xd9,
0x0c, 0x77, 0x0d, 0xdf, 0x8d, 0xe3, 0x06, 0x9e, 0xe5, 0xf8, 0x2f, 0x89, 0xf7, 0x1e, 0xaf, 0xb2, 0xd3, 0x30, 0xcf, 0x02, 0xe1, 0x9c, 0xdf, 0xa4, 0x9c, 0x67, 0xcc, 0x9b, 0x1a, 0xce, 0x3e, 0x05,
0xfa, 0x67, 0xf6, 0x90, 0x4e, 0xd9, 0x83, 0x52, 0x58, 0x75, 0x8e, 0x7b, 0xdb, 0x78, 0x35, 0x3c, 0x8d, 0x31, 0x67, 0x8d, 0x14, 0x3d, 0xf3, 0x58, 0xc7, 0x46, 0xcf, 0x3c, 0xde, 0x87, 0x39, 0x93,
0xee, 0x6d, 0x13, 0xe5, 0x6a, 0xdd, 0xed, 0x68, 0xbb, 0x45, 0xb2, 0xd2, 0x03, 0xf8, 0x8b, 0x3a, 0xf9, 0x90, 0x82, 0x12, 0xe6, 0x01, 0x80, 0xec, 0x74, 0x20, 0xad, 0x2e, 0x95, 0x0b, 0x6b, 0x32,
0x4c, 0xd3, 0xac, 0x9b, 0x26, 0x27, 0x51, 0xdd, 0x24, 0x3e, 0xfb, 0x44, 0x15, 0x35, 0x3e, 0xfb, 0x38, 0xa4, 0x9b, 0x24, 0xa6, 0x49, 0xd9, 0xf2, 0x7d, 0x97, 0x60, 0xdb, 0x73, 0x82, 0x90, 0x39,
0x64, 0xc9, 0x45, 0x4f, 0x4e, 0xe8, 0x25, 0x6b, 0x83, 0x97, 0x28, 0xe8, 0x4c, 0x5d, 0x28, 0x2b, 0xe6, 0x44, 0xac, 0x4f, 0x81, 0xb4, 0xeb, 0x89, 0xb7, 0x3d, 0x1a, 0x77, 0xcf, 0x84, 0xe1, 0xdc,
0x85, 0x15, 0x94, 0x22, 0x4c, 0x2f, 0xcf, 0xc6, 0xc3, 0x5d, 0x4a, 0x55, 0x06, 0xbf, 0xc1, 0xf0, 0xef, 0x51, 0xee, 0x77, 0xcc, 0x86, 0x86, 0xfb, 0x80, 0xc1, 0x92, 0xcd, 0xf6, 0xff, 0x05, 0x28,
0x96, 0x78, 0xb8, 0x63, 0x78, 0x3d, 0xce, 0x41, 0x01, 0xc5, 0xec, 0xc4, 0xb9, 0x4f, 0x99, 0x9d, 0x3f, 0xb3, 0x1d, 0x37, 0xc4, 0xae, 0xed, 0x76, 0x30, 0xda, 0x87, 0x3c, 0xcd, 0xdd, 0xc9, 0x40,
0x7e, 0xf6, 0x57, 0xb3, 0x19, 0x32, 0x67, 0x17, 0x1d, 0xfc, 0x57, 0x50, 0x51, 0xcb, 0x2b, 0x28, 0xac, 0x96, 0xe5, 0x93, 0x81, 0x38, 0x56, 0x97, 0x36, 0x67, 0x29, 0xe3, 0x86, 0x79, 0x9d, 0x30,
0x45, 0xf9, 0x58, 0x49, 0x39, 0x1e, 0x47, 0xd2, 0xaa, 0x33, 0xba, 0x67, 0x63, 0x90, 0x96, 0xc2, 0xee, 0x4b, 0xd2, 0x8b, 0xac, 0xa2, 0x6d, 0xcc, 0xa3, 0x97, 0x50, 0xe0, 0xfd, 0xe8, 0x04, 0xa1,
0x46, 0x81, 0xfb, 0x50, 0x14, 0xf5, 0x96, 0x34, 0x93, 0xea, 0xe5, 0xe7, 0x34, 0x93, 0xc6, 0x8a, 0x58, 0x51, 0xad, 0x71, 0x4b, 0x3f, 0xa9, 0xdb, 0xcb, 0x2a, 0x9b, 0x80, 0xc2, 0x11, 0x3e, 0xc7,
0x35, 0x7a, 0xf6, 0xcc, 0x10, 0xe9, 0x95, 0x52, 0xc6, 0x6a, 0x81, 0xf6, 0x84, 0x04, 0x59, 0x68, 0x00, 0xb2, 0xbd, 0x92, 0xb4, 0x68, 0xaa, 0x2d, 0xd3, 0x98, 0x1d, 0x0d, 0xa0, 0xd3, 0xa9, 0xca,
0x51, 0x25, 0x33, 0x0b, 0x4d, 0xb9, 0xce, 0x67, 0xa1, 0x9d, 0x92, 0x40, 0xf8, 0x03, 0x79, 0x4d, 0xb3, 0x1b, 0xc1, 0x12, 0xbe, 0xdf, 0x80, 0xdc, 0xba, 0x1d, 0x1c, 0xa2, 0x44, 0xee, 0x55, 0x1e,
0x46, 0x19, 0xc2, 0xd4, 0xf8, 0x88, 0xaf, 0x62, 0x49, 0xbb, 0xdc, 0x44, 0x80, 0x32, 0x38, 0x5e, 0x84, 0x36, 0x1a, 0xba, 0x29, 0xce, 0xe5, 0x0e, 0xe5, 0x72, 0x93, 0x85, 0x32, 0x95, 0x0b, 0x7d,
0x00, 0x44, 0xd5, 0xa0, 0x78, 0xc6, 0x9a, 0x5a, 0x05, 0x8f, 0x67, 0xac, 0xe9, 0x05, 0x25, 0xdd, 0x20, 0x69, 0xcc, 0xa3, 0x2e, 0x14, 0xd8, 0x6b, 0xd0, 0xa4, 0xfe, 0x62, 0x4f, 0x4b, 0x93, 0xfa,
0xf7, 0x45, 0xb8, 0xfc, 0x6e, 0x45, 0x91, 0x7f, 0x66, 0x00, 0x4a, 0x16, 0x8e, 0xd0, 0xc3, 0x74, 0x8b, 0x3f, 0x20, 0x3d, 0x9f, 0xcb, 0x00, 0xc6, 0xc5, 0x1b, 0x4b, 0x94, 0x78, 0x99, 0x92, 0x78,
0xe9, 0xa9, 0xb5, 0xf5, 0xe6, 0xbb, 0xaf, 0xc7, 0x9c, 0x16, 0xce, 0x22, 0x95, 0xba, 0x8c, 0x7b, 0x98, 0xd9, 0x98, 0x19, 0x35, 0xcd, 0x79, 0xdd, 0xa5, 0xbc, 0x6e, 0x9b, 0xf5, 0x94, 0xad, 0x38,
0xf8, 0x8a, 0x2a, 0xf5, 0xe7, 0x06, 0x54, 0xb5, 0xaa, 0x13, 0xba, 0x9f, 0xb1, 0xa6, 0xb1, 0x92, 0xe4, 0x23, 0x63, 0xfe, 0xbe, 0x81, 0xbe, 0x03, 0x20, 0xfb, 0x4f, 0x29, 0x0f, 0x4c, 0xf6, 0xb4,
0x7b, 0xf3, 0xed, 0x6b, 0xf9, 0xd2, 0x52, 0x79, 0x65, 0x07, 0xc8, 0x3b, 0xcd, 0x4f, 0x0c, 0xa8, 0x52, 0x1e, 0x98, 0x6a, 0x5d, 0x99, 0x0b, 0x94, 0xef, 0x9c, 0x79, 0x37, 0xc9, 0x37, 0xf4, 0x6d,
0xe9, 0x55, 0x2a, 0x94, 0x21, 0x3b, 0x51, 0xb2, 0x6f, 0xae, 0x5d, 0xcf, 0x78, 0xf5, 0xf2, 0x44, 0x37, 0x78, 0x89, 0xfd, 0xf7, 0x59, 0xf1, 0x3b, 0x38, 0x74, 0x06, 0x64, 0xc9, 0x3e, 0x94, 0xa2,
0xd7, 0x99, 0x3e, 0x14, 0x45, 0x5d, 0x2b, 0x6d, 0xe3, 0xeb, 0xc5, 0xfe, 0xb4, 0x8d, 0x1f, 0x2b, 0xf6, 0x40, 0x32, 0xda, 0x26, 0x1b, 0x19, 0xc9, 0x68, 0x9b, 0xea, 0x2b, 0xc4, 0xc3, 0x4e, 0x6c,
0x8a, 0xa5, 0x6c, 0x7c, 0xcf, 0xed, 0x13, 0xe5, 0x98, 0x89, 0xc2, 0x57, 0x16, 0xda, 0xd5, 0xc7, 0xb7, 0x08, 0x50, 0xe2, 0x80, 0x7f, 0x51, 0x83, 0x1c, 0x39, 0x90, 0x93, 0xc3, 0x89, 0x2c, 0xf6,
0x2c, 0x56, 0x35, 0xcb, 0x42, 0x8b, 0x8e, 0x99, 0xac, 0x78, 0xa1, 0x0c, 0x61, 0xd7, 0x1c, 0xb3, 0x24, 0x57, 0x9f, 0xaa, 0x57, 0x27, 0x57, 0x9f, 0xae, 0x13, 0xc5, 0x0f, 0x27, 0xe4, 0xb2, 0xb6,
0x78, 0xc1, 0x2c, 0xe5, 0x98, 0x31, 0x40, 0xe5, 0x98, 0x45, 0xb5, 0xa9, 0xb4, 0x63, 0x96, 0x78, 0xc8, 0xaa, 0x28, 0x64, 0xa5, 0x1e, 0x94, 0x95, 0x22, 0x10, 0xd2, 0x10, 0x8b, 0xd7, 0xbf, 0x93,
0xbb, 0x48, 0x3b, 0x66, 0xc9, 0xf2, 0x56, 0xca, 0x3a, 0x32, 0x5c, 0xed, 0x98, 0x2d, 0xa4, 0x94, 0xe9, 0x4e, 0x53, 0x41, 0x32, 0x5f, 0xa7, 0xfc, 0xae, 0xb3, 0x74, 0x47, 0xf9, 0x75, 0x19, 0x04,
0xb1, 0xd0, 0xbb, 0x19, 0x46, 0x4c, 0x7d, 0x12, 0x69, 0xbe, 0xf7, 0x9a, 0xdc, 0x99, 0x7b, 0x9c, 0x61, 0xc8, 0x57, 0xc7, 0xfd, 0x5e, 0xb3, 0xba, 0xb8, 0xef, 0xcf, 0x8e, 0x06, 0x18, 0xb9, 0x3a,
0x9b, 0x5f, 0xee, 0xf1, 0xbf, 0x36, 0x60, 0x31, 0xad, 0x04, 0x86, 0x32, 0x70, 0x32, 0x9e, 0x52, 0xe9, 0xf8, 0xaf, 0xa0, 0xa2, 0x16, 0x7e, 0x90, 0x46, 0xf8, 0x44, 0x85, 0x3e, 0x99, 0x47, 0x74,
0x9a, 0xeb, 0xaf, 0xcb, 0x7e, 0xb5, 0xb5, 0xc2, 0x5d, 0xff, 0xb8, 0xfe, 0x2f, 0x5f, 0xae, 0x18, 0x75, 0xa3, 0x78, 0x64, 0xa3, 0x2c, 0x6d, 0x05, 0x8c, 0x30, 0xee, 0x41, 0x91, 0x17, 0x80, 0x74,
0xff, 0xfe, 0xe5, 0x8a, 0xf1, 0x5f, 0x5f, 0xae, 0x18, 0x7f, 0xf3, 0xdf, 0x2b, 0x53, 0x27, 0x05, 0x2a, 0x8d, 0x17, 0xf1, 0x75, 0x2a, 0x4d, 0x54, 0x8f, 0xe2, 0xa7, 0x67, 0xca, 0x91, 0x5c, 0x44,
0xf6, 0x5f, 0x90, 0xbf, 0xfd, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0x98, 0x81, 0x56, 0x23, 0x07, 0x45, 0xae, 0xe6, 0xdc, 0x9e, 0xe0, 0x70, 0x14, 0x37, 0x59, 0xb4, 0x1d, 0xc5, 0x4d, 0xa9, 0x0f,
0x3d, 0x00, 0x00, 0x8c, 0xe2, 0x76, 0x80, 0x43, 0x1e, 0x0f, 0xc4, 0xe5, 0x1a, 0x8d, 0x20, 0xa6, 0xe6, 0x47, 0xf3,
0x2c, 0x10, 0xdd, 0xe5, 0x46, 0x32, 0x14, 0xc9, 0xf1, 0x04, 0x40, 0x16, 0xa3, 0x92, 0x27, 0x56,
0x6d, 0x9f, 0x20, 0x79, 0x62, 0xd5, 0xd7, 0xb3, 0xe2, 0xb1, 0x4f, 0xf2, 0x65, 0x77, 0x2b, 0xc2,
0xf9, 0xc7, 0x06, 0xa0, 0x74, 0xb9, 0x0a, 0xbd, 0xab, 0xa7, 0xae, 0xed, 0x39, 0x34, 0xde, 0xbb,
0x18, 0xb0, 0x2e, 0x9d, 0x49, 0x91, 0x3a, 0x14, 0x7a, 0xf0, 0x8a, 0x08, 0xf5, 0x5d, 0x03, 0x26,
0x62, 0x25, 0x2e, 0xf4, 0xd6, 0x08, 0x9b, 0x26, 0x1a, 0x0f, 0x8d, 0xb7, 0xcf, 0x85, 0xd3, 0x1d,
0xe5, 0x95, 0x1d, 0x20, 0xee, 0x34, 0xbf, 0x63, 0x40, 0x35, 0x5e, 0x09, 0x43, 0x23, 0x68, 0xa7,
0xfa, 0x15, 0x8d, 0xb9, 0xf3, 0x01, 0xcf, 0x36, 0x8f, 0xbc, 0xce, 0xf4, 0xa0, 0xc8, 0x4b, 0x66,
0xba, 0x8d, 0x1f, 0x6f, 0x70, 0xe8, 0x36, 0x7e, 0xa2, 0xde, 0xa6, 0xd9, 0xf8, 0xbe, 0xd7, 0xc3,
0x8a, 0x9b, 0xf1, 0x4a, 0xda, 0x28, 0x6e, 0x67, 0xbb, 0x59, 0xa2, 0x0c, 0x37, 0x8a, 0x9b, 0x74,
0x33, 0x51, 0x30, 0x43, 0x23, 0x88, 0x9d, 0xe3, 0x66, 0xc9, 0x7a, 0x9b, 0xc6, 0xcd, 0x28, 0x43,
0xc5, 0xcd, 0x64, 0x21, 0x4b, 0xe7, 0x66, 0xa9, 0x5e, 0x8c, 0xce, 0xcd, 0xd2, 0xb5, 0x30, 0x8d,
0x1d, 0x29, 0xdf, 0x98, 0x9b, 0x5d, 0xd3, 0x94, 0xba, 0xd0, 0x7b, 0x23, 0x94, 0xa8, 0xed, 0xec,
0x34, 0xde, 0xbf, 0x20, 0xf4, 0xc8, 0x3d, 0xce, 0xd4, 0x2f, 0xf6, 0xf8, 0x1f, 0x19, 0x30, 0xad,
0xab, 0x8e, 0xa1, 0x11, 0x7c, 0x46, 0x34, 0x82, 0x1a, 0x0b, 0x17, 0x05, 0x3f, 0x5b, 0x5b, 0xd1,
0xae, 0x7f, 0x5c, 0xfb, 0xd7, 0xcf, 0x67, 0x8c, 0xff, 0xf8, 0x7c, 0xc6, 0xf8, 0xaf, 0xcf, 0x67,
0x8c, 0x9f, 0xfc, 0xcf, 0xcc, 0xd8, 0x7e, 0x81, 0xfe, 0x0f, 0x18, 0x96, 0x7f, 0x16, 0x00, 0x00,
0xff, 0xff, 0xe6, 0x88, 0xc4, 0x9e, 0x27, 0x42, 0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.

View File

@ -4,6 +4,7 @@ package etcdserverpb;
import "gogoproto/gogo.proto"; import "gogoproto/gogo.proto";
import "etcd/api/mvccpb/kv.proto"; import "etcd/api/mvccpb/kv.proto";
import "etcd/api/authpb/auth.proto"; import "etcd/api/authpb/auth.proto";
import "etcd/api/versionpb/version.proto";
// for grpc-gateway // for grpc-gateway
import "google/api/annotations.proto"; import "google/api/annotations.proto";
@ -388,6 +389,8 @@ service Auth {
} }
message ResponseHeader { message ResponseHeader {
option (versionpb.etcd_version_msg) = "3.0";
// cluster_id is the ID of the cluster which sent the response. // cluster_id is the ID of the cluster which sent the response.
uint64 cluster_id = 1; uint64 cluster_id = 1;
// member_id is the ID of the member which sent the response. // member_id is the ID of the member which sent the response.
@ -402,17 +405,21 @@ message ResponseHeader {
} }
message RangeRequest { message RangeRequest {
option (versionpb.etcd_version_msg) = "3.0";
enum SortOrder { enum SortOrder {
NONE = 0; // default, no sorting option (versionpb.etcd_version_enum) = "3.0";
ASCEND = 1; // lowest target value first NONE = 0; // default, no sorting
DESCEND = 2; // highest target value first ASCEND = 1; // lowest target value first
DESCEND = 2; // highest target value first
} }
enum SortTarget { enum SortTarget {
KEY = 0; option (versionpb.etcd_version_enum) = "3.0";
VERSION = 1; KEY = 0;
CREATE = 2; VERSION = 1;
MOD = 3; CREATE = 2;
VALUE = 4; MOD = 3;
VALUE = 4;
} }
// key is the first key for the range. If range_end is not given, the request only looks up key. // key is the first key for the range. If range_end is not given, the request only looks up key.
@ -453,22 +460,24 @@ message RangeRequest {
// min_mod_revision is the lower bound for returned key mod revisions; all keys with // min_mod_revision is the lower bound for returned key mod revisions; all keys with
// lesser mod revisions will be filtered away. // lesser mod revisions will be filtered away.
int64 min_mod_revision = 10; int64 min_mod_revision = 10 [(versionpb.etcd_version_field)="3.1"];
// max_mod_revision is the upper bound for returned key mod revisions; all keys with // max_mod_revision is the upper bound for returned key mod revisions; all keys with
// greater mod revisions will be filtered away. // greater mod revisions will be filtered away.
int64 max_mod_revision = 11; int64 max_mod_revision = 11 [(versionpb.etcd_version_field)="3.1"];
// min_create_revision is the lower bound for returned key create revisions; all keys with // min_create_revision is the lower bound for returned key create revisions; all keys with
// lesser create revisions will be filtered away. // lesser create revisions will be filtered away.
int64 min_create_revision = 12; int64 min_create_revision = 12 [(versionpb.etcd_version_field)="3.1"];
// max_create_revision is the upper bound for returned key create revisions; all keys with // max_create_revision is the upper bound for returned key create revisions; all keys with
// greater create revisions will be filtered away. // greater create revisions will be filtered away.
int64 max_create_revision = 13; int64 max_create_revision = 13 [(versionpb.etcd_version_field)="3.1"];
} }
message RangeResponse { message RangeResponse {
option (versionpb.etcd_version_msg) = "3.0";
ResponseHeader header = 1; ResponseHeader header = 1;
// kvs is the list of key-value pairs matched by the range request. // kvs is the list of key-value pairs matched by the range request.
// kvs is empty when count is requested. // kvs is empty when count is requested.
@ -480,6 +489,8 @@ message RangeResponse {
} }
message PutRequest { message PutRequest {
option (versionpb.etcd_version_msg) = "3.0";
// key is the key, in bytes, to put into the key-value store. // key is the key, in bytes, to put into the key-value store.
bytes key = 1; bytes key = 1;
// value is the value, in bytes, to associate with the key in the key-value store. // value is the value, in bytes, to associate with the key in the key-value store.
@ -490,24 +501,28 @@ message PutRequest {
// If prev_kv is set, etcd gets the previous key-value pair before changing it. // If prev_kv is set, etcd gets the previous key-value pair before changing it.
// The previous key-value pair will be returned in the put response. // The previous key-value pair will be returned in the put response.
bool prev_kv = 4; bool prev_kv = 4 [(versionpb.etcd_version_field)="3.1"];
// If ignore_value is set, etcd updates the key using its current value. // If ignore_value is set, etcd updates the key using its current value.
// Returns an error if the key does not exist. // Returns an error if the key does not exist.
bool ignore_value = 5; bool ignore_value = 5 [(versionpb.etcd_version_field)="3.2"];
// If ignore_lease is set, etcd updates the key using its current lease. // If ignore_lease is set, etcd updates the key using its current lease.
// Returns an error if the key does not exist. // Returns an error if the key does not exist.
bool ignore_lease = 6; bool ignore_lease = 6 [(versionpb.etcd_version_field)="3.2"];
} }
message PutResponse { message PutResponse {
option (versionpb.etcd_version_msg) = "3.0";
ResponseHeader header = 1; ResponseHeader header = 1;
// if prev_kv is set in the request, the previous key-value pair will be returned. // if prev_kv is set in the request, the previous key-value pair will be returned.
mvccpb.KeyValue prev_kv = 2; mvccpb.KeyValue prev_kv = 2 [(versionpb.etcd_version_field)="3.1"];
} }
message DeleteRangeRequest { message DeleteRangeRequest {
option (versionpb.etcd_version_msg) = "3.0";
// key is the first key to delete in the range. // key is the first key to delete in the range.
bytes key = 1; bytes key = 1;
// range_end is the key following the last key to delete for the range [key, range_end). // range_end is the key following the last key to delete for the range [key, range_end).
@ -519,50 +534,61 @@ message DeleteRangeRequest {
// If prev_kv is set, etcd gets the previous key-value pairs before deleting it. // If prev_kv is set, etcd gets the previous key-value pairs before deleting it.
// The previous key-value pairs will be returned in the delete response. // The previous key-value pairs will be returned in the delete response.
bool prev_kv = 3; bool prev_kv = 3 [(versionpb.etcd_version_field)="3.1"];
} }
message DeleteRangeResponse { message DeleteRangeResponse {
option (versionpb.etcd_version_msg) = "3.0";
ResponseHeader header = 1; ResponseHeader header = 1;
// deleted is the number of keys deleted by the delete range request. // deleted is the number of keys deleted by the delete range request.
int64 deleted = 2; int64 deleted = 2;
// if prev_kv is set in the request, the previous key-value pairs will be returned. // if prev_kv is set in the request, the previous key-value pairs will be returned.
repeated mvccpb.KeyValue prev_kvs = 3; repeated mvccpb.KeyValue prev_kvs = 3 [(versionpb.etcd_version_field)="3.1"];
} }
message RequestOp { message RequestOp {
option (versionpb.etcd_version_msg) = "3.0";
// request is a union of request types accepted by a transaction. // request is a union of request types accepted by a transaction.
oneof request { oneof request {
RangeRequest request_range = 1; RangeRequest request_range = 1;
PutRequest request_put = 2; PutRequest request_put = 2;
DeleteRangeRequest request_delete_range = 3; DeleteRangeRequest request_delete_range = 3;
TxnRequest request_txn = 4; TxnRequest request_txn = 4 [(versionpb.etcd_version_field)="3.3"];
} }
} }
message ResponseOp { message ResponseOp {
option (versionpb.etcd_version_msg) = "3.0";
// response is a union of response types returned by a transaction. // response is a union of response types returned by a transaction.
oneof response { oneof response {
RangeResponse response_range = 1; RangeResponse response_range = 1;
PutResponse response_put = 2; PutResponse response_put = 2;
DeleteRangeResponse response_delete_range = 3; DeleteRangeResponse response_delete_range = 3;
TxnResponse response_txn = 4; TxnResponse response_txn = 4 [(versionpb.etcd_version_field)="3.3"];
} }
} }
message Compare { message Compare {
option (versionpb.etcd_version_msg) = "3.0";
enum CompareResult { enum CompareResult {
option (versionpb.etcd_version_enum) = "3.0";
EQUAL = 0; EQUAL = 0;
GREATER = 1; GREATER = 1;
LESS = 2; LESS = 2;
NOT_EQUAL = 3; NOT_EQUAL = 3 [(versionpb.etcd_version_enum_value)="3.1"];
} }
enum CompareTarget { enum CompareTarget {
option (versionpb.etcd_version_enum) = "3.0";
VERSION = 0; VERSION = 0;
CREATE = 1; CREATE = 1;
MOD = 2; MOD = 2;
VALUE = 3; VALUE = 3;
LEASE = 4; LEASE = 4 [(versionpb.etcd_version_enum_value)="3.3"];
} }
// result is logical comparison operation for this comparison. // result is logical comparison operation for this comparison.
CompareResult result = 1; CompareResult result = 1;
@ -580,13 +606,13 @@ message Compare {
// value is the value of the given key, in bytes. // value is the value of the given key, in bytes.
bytes value = 7; bytes value = 7;
// lease is the lease id of the given key. // lease is the lease id of the given key.
int64 lease = 8; int64 lease = 8 [(versionpb.etcd_version_field)="3.3"];
// leave room for more target_union field tags, jump to 64 // leave room for more target_union field tags, jump to 64
} }
// range_end compares the given target to all keys in the range [key, range_end). // range_end compares the given target to all keys in the range [key, range_end).
// See RangeRequest for more details on key ranges. // See RangeRequest for more details on key ranges.
bytes range_end = 64; bytes range_end = 64 [(versionpb.etcd_version_field)="3.3"];
// TODO: fill out with most of the rest of RangeRequest fields when needed. // TODO: fill out with most of the rest of RangeRequest fields when needed.
} }
@ -606,6 +632,8 @@ message Compare {
// true. // true.
// 3. A list of database operations called f op. Like t op, but executed if guard evaluates to false. // 3. A list of database operations called f op. Like t op, but executed if guard evaluates to false.
message TxnRequest { message TxnRequest {
option (versionpb.etcd_version_msg) = "3.0";
// compare is a list of predicates representing a conjunction of terms. // compare is a list of predicates representing a conjunction of terms.
// If the comparisons succeed, then the success requests will be processed in order, // If the comparisons succeed, then the success requests will be processed in order,
// and the response will contain their respective responses in order. // and the response will contain their respective responses in order.
@ -619,6 +647,8 @@ message TxnRequest {
} }
message TxnResponse { message TxnResponse {
option (versionpb.etcd_version_msg) = "3.0";
ResponseHeader header = 1; ResponseHeader header = 1;
// succeeded is set to true if the compare evaluated to true or false otherwise. // succeeded is set to true if the compare evaluated to true or false otherwise.
bool succeeded = 2; bool succeeded = 2;
@ -630,6 +660,8 @@ message TxnResponse {
// CompactionRequest compacts the key-value store up to a given revision. All superseded keys // CompactionRequest compacts the key-value store up to a given revision. All superseded keys
// with a revision less than the compaction revision will be removed. // with a revision less than the compaction revision will be removed.
message CompactionRequest { message CompactionRequest {
option (versionpb.etcd_version_msg) = "3.0";
// revision is the key-value store revision for the compaction operation. // revision is the key-value store revision for the compaction operation.
int64 revision = 1; int64 revision = 1;
// physical is set so the RPC will wait until the compaction is physically // physical is set so the RPC will wait until the compaction is physically
@ -639,18 +671,24 @@ message CompactionRequest {
} }
message CompactionResponse { message CompactionResponse {
option (versionpb.etcd_version_msg) = "3.0";
ResponseHeader header = 1; ResponseHeader header = 1;
} }
message HashRequest { message HashRequest {
option (versionpb.etcd_version_msg) = "3.0";
} }
message HashKVRequest { message HashKVRequest {
option (versionpb.etcd_version_msg) = "3.3";
// revision is the key-value store revision for the hash operation. // revision is the key-value store revision for the hash operation.
int64 revision = 1; int64 revision = 1;
} }
message HashKVResponse { message HashKVResponse {
option (versionpb.etcd_version_msg) = "3.3";
ResponseHeader header = 1; ResponseHeader header = 1;
// hash is the hash value computed from the responding member's MVCC keys up to a given revision. // hash is the hash value computed from the responding member's MVCC keys up to a given revision.
uint32 hash = 2; uint32 hash = 2;
@ -659,15 +697,20 @@ message HashKVResponse {
} }
message HashResponse { message HashResponse {
option (versionpb.etcd_version_msg) = "3.0";
ResponseHeader header = 1; ResponseHeader header = 1;
// hash is the hash value computed from the responding member's KV's backend. // hash is the hash value computed from the responding member's KV's backend.
uint32 hash = 2; uint32 hash = 2;
} }
message SnapshotRequest { message SnapshotRequest {
option (versionpb.etcd_version_msg) = "3.3";
} }
message SnapshotResponse { message SnapshotResponse {
option (versionpb.etcd_version_msg) = "3.3";
// header has the current key-value store information. The first header in the snapshot // header has the current key-value store information. The first header in the snapshot
// stream indicates the point in time of the snapshot. // stream indicates the point in time of the snapshot.
ResponseHeader header = 1; ResponseHeader header = 1;
@ -681,19 +724,22 @@ message SnapshotResponse {
// local version of server that created the snapshot. // local version of server that created the snapshot.
// In cluster with binaries with different version, each cluster can return different result. // In cluster with binaries with different version, each cluster can return different result.
// Informs which etcd server version should be used when restoring the snapshot. // Informs which etcd server version should be used when restoring the snapshot.
string version = 4; string version = 4 [(versionpb.etcd_version_field)="3.6"];
} }
message WatchRequest { message WatchRequest {
option (versionpb.etcd_version_msg) = "3.0";
// request_union is a request to either create a new watcher or cancel an existing watcher. // request_union is a request to either create a new watcher or cancel an existing watcher.
oneof request_union { oneof request_union {
WatchCreateRequest create_request = 1; WatchCreateRequest create_request = 1;
WatchCancelRequest cancel_request = 2; WatchCancelRequest cancel_request = 2;
WatchProgressRequest progress_request = 3; WatchProgressRequest progress_request = 3 [(versionpb.etcd_version_field)="3.4"];
} }
} }
message WatchCreateRequest { message WatchCreateRequest {
option (versionpb.etcd_version_msg) = "3.0";
// key is the key to register for watching. // key is the key to register for watching.
bytes key = 1; bytes key = 1;
@ -714,6 +760,8 @@ message WatchCreateRequest {
bool progress_notify = 4; bool progress_notify = 4;
enum FilterType { enum FilterType {
option (versionpb.etcd_version_enum) = "3.1";
// filter out put event. // filter out put event.
NOPUT = 0; NOPUT = 0;
// filter out delete event. // filter out delete event.
@ -721,34 +769,38 @@ message WatchCreateRequest {
} }
// filters filter the events at server side before it sends back to the watcher. // filters filter the events at server side before it sends back to the watcher.
repeated FilterType filters = 5; repeated FilterType filters = 5 [(versionpb.etcd_version_field)="3.1"];
// If prev_kv is set, created watcher gets the previous KV before the event happens. // If prev_kv is set, created watcher gets the previous KV before the event happens.
// If the previous KV is already compacted, nothing will be returned. // If the previous KV is already compacted, nothing will be returned.
bool prev_kv = 6; bool prev_kv = 6 [(versionpb.etcd_version_field)="3.1"];
// If watch_id is provided and non-zero, it will be assigned to this watcher. // If watch_id is provided and non-zero, it will be assigned to this watcher.
// Since creating a watcher in etcd is not a synchronous operation, // Since creating a watcher in etcd is not a synchronous operation,
// this can be used ensure that ordering is correct when creating multiple // this can be used ensure that ordering is correct when creating multiple
// watchers on the same stream. Creating a watcher with an ID already in // watchers on the same stream. Creating a watcher with an ID already in
// use on the stream will cause an error to be returned. // use on the stream will cause an error to be returned.
int64 watch_id = 7; int64 watch_id = 7 [(versionpb.etcd_version_field)="3.4"];
// fragment enables splitting large revisions into multiple watch responses. // fragment enables splitting large revisions into multiple watch responses.
bool fragment = 8; bool fragment = 8 [(versionpb.etcd_version_field)="3.4"];
} }
message WatchCancelRequest { message WatchCancelRequest {
option (versionpb.etcd_version_msg) = "3.1";
// watch_id is the watcher id to cancel so that no more events are transmitted. // watch_id is the watcher id to cancel so that no more events are transmitted.
int64 watch_id = 1; int64 watch_id = 1 [(versionpb.etcd_version_field)="3.1"];
} }
// Requests the a watch stream progress status be sent in the watch response stream as soon as // Requests the a watch stream progress status be sent in the watch response stream as soon as
// possible. // possible.
message WatchProgressRequest { message WatchProgressRequest {
option (versionpb.etcd_version_msg) = "3.4";
} }
message WatchResponse { message WatchResponse {
option (versionpb.etcd_version_msg) = "3.0";
ResponseHeader header = 1; ResponseHeader header = 1;
// watch_id is the ID of the watcher that corresponds to the response. // watch_id is the ID of the watcher that corresponds to the response.
int64 watch_id = 2; int64 watch_id = 2;
@ -774,15 +826,17 @@ message WatchResponse {
int64 compact_revision = 5; int64 compact_revision = 5;
// cancel_reason indicates the reason for canceling the watcher. // cancel_reason indicates the reason for canceling the watcher.
string cancel_reason = 6; string cancel_reason = 6 [(versionpb.etcd_version_field)="3.4"];
// framgment is true if large watch response was split over multiple responses. // framgment is true if large watch response was split over multiple responses.
bool fragment = 7; bool fragment = 7 [(versionpb.etcd_version_field)="3.4"];
repeated mvccpb.Event events = 11; repeated mvccpb.Event events = 11;
} }
message LeaseGrantRequest { message LeaseGrantRequest {
option (versionpb.etcd_version_msg) = "3.0";
// TTL is the advisory time-to-live in seconds. Expired lease will return -1. // TTL is the advisory time-to-live in seconds. Expired lease will return -1.
int64 TTL = 1; int64 TTL = 1;
// ID is the requested ID for the lease. If ID is set to 0, the lessor chooses an ID. // ID is the requested ID for the lease. If ID is set to 0, the lessor chooses an ID.
@ -790,6 +844,8 @@ message LeaseGrantRequest {
} }
message LeaseGrantResponse { message LeaseGrantResponse {
option (versionpb.etcd_version_msg) = "3.0";
ResponseHeader header = 1; ResponseHeader header = 1;
// ID is the lease ID for the granted lease. // ID is the lease ID for the granted lease.
int64 ID = 2; int64 ID = 2;
@ -799,15 +855,21 @@ message LeaseGrantResponse {
} }
message LeaseRevokeRequest { message LeaseRevokeRequest {
option (versionpb.etcd_version_msg) = "3.0";
// ID is the lease ID to revoke. When the ID is revoked, all associated keys will be deleted. // ID is the lease ID to revoke. When the ID is revoked, all associated keys will be deleted.
int64 ID = 1; int64 ID = 1;
} }
message LeaseRevokeResponse { message LeaseRevokeResponse {
option (versionpb.etcd_version_msg) = "3.0";
ResponseHeader header = 1; ResponseHeader header = 1;
} }
message LeaseCheckpoint { message LeaseCheckpoint {
option (versionpb.etcd_version_msg) = "3.4";
// ID is the lease ID to checkpoint. // ID is the lease ID to checkpoint.
int64 ID = 1; int64 ID = 1;
@ -816,19 +878,26 @@ message LeaseCheckpoint {
} }
message LeaseCheckpointRequest { message LeaseCheckpointRequest {
option (versionpb.etcd_version_msg) = "3.4";
repeated LeaseCheckpoint checkpoints = 1; repeated LeaseCheckpoint checkpoints = 1;
} }
message LeaseCheckpointResponse { message LeaseCheckpointResponse {
option (versionpb.etcd_version_msg) = "3.4";
ResponseHeader header = 1; ResponseHeader header = 1;
} }
message LeaseKeepAliveRequest { message LeaseKeepAliveRequest {
option (versionpb.etcd_version_msg) = "3.0";
// ID is the lease ID for the lease to keep alive. // ID is the lease ID for the lease to keep alive.
int64 ID = 1; int64 ID = 1;
} }
message LeaseKeepAliveResponse { message LeaseKeepAliveResponse {
option (versionpb.etcd_version_msg) = "3.0";
ResponseHeader header = 1; ResponseHeader header = 1;
// ID is the lease ID from the keep alive request. // ID is the lease ID from the keep alive request.
int64 ID = 2; int64 ID = 2;
@ -837,6 +906,7 @@ message LeaseKeepAliveResponse {
} }
message LeaseTimeToLiveRequest { message LeaseTimeToLiveRequest {
option (versionpb.etcd_version_msg) = "3.1";
// ID is the lease ID for the lease. // ID is the lease ID for the lease.
int64 ID = 1; int64 ID = 1;
// keys is true to query all the keys attached to this lease. // keys is true to query all the keys attached to this lease.
@ -844,6 +914,8 @@ message LeaseTimeToLiveRequest {
} }
message LeaseTimeToLiveResponse { message LeaseTimeToLiveResponse {
option (versionpb.etcd_version_msg) = "3.1";
ResponseHeader header = 1; ResponseHeader header = 1;
// ID is the lease ID from the keep alive request. // ID is the lease ID from the keep alive request.
int64 ID = 2; int64 ID = 2;
@ -856,19 +928,26 @@ message LeaseTimeToLiveResponse {
} }
message LeaseLeasesRequest { message LeaseLeasesRequest {
option (versionpb.etcd_version_msg) = "3.3";
} }
message LeaseStatus { message LeaseStatus {
option (versionpb.etcd_version_msg) = "3.3";
int64 ID = 1; int64 ID = 1;
// TODO: int64 TTL = 2; // TODO: int64 TTL = 2;
} }
message LeaseLeasesResponse { message LeaseLeasesResponse {
option (versionpb.etcd_version_msg) = "3.3";
ResponseHeader header = 1; ResponseHeader header = 1;
repeated LeaseStatus leases = 2; repeated LeaseStatus leases = 2;
} }
message Member { message Member {
option (versionpb.etcd_version_msg) = "3.0";
// ID is the member ID for this member. // ID is the member ID for this member.
uint64 ID = 1; uint64 ID = 1;
// name is the human-readable name of the member. If the member is not started, the name will be an empty string. // name is the human-readable name of the member. If the member is not started, the name will be an empty string.
@ -878,17 +957,21 @@ message Member {
// clientURLs is the list of URLs the member exposes to clients for communication. If the member is not started, clientURLs will be empty. // clientURLs is the list of URLs the member exposes to clients for communication. If the member is not started, clientURLs will be empty.
repeated string clientURLs = 4; repeated string clientURLs = 4;
// isLearner indicates if the member is raft learner. // isLearner indicates if the member is raft learner.
bool isLearner = 5; bool isLearner = 5 [(versionpb.etcd_version_field)="3.4"];
} }
message MemberAddRequest { message MemberAddRequest {
option (versionpb.etcd_version_msg) = "3.0";
// peerURLs is the list of URLs the added member will use to communicate with the cluster. // peerURLs is the list of URLs the added member will use to communicate with the cluster.
repeated string peerURLs = 1; repeated string peerURLs = 1;
// isLearner indicates if the added member is raft learner. // isLearner indicates if the added member is raft learner.
bool isLearner = 2; bool isLearner = 2 [(versionpb.etcd_version_field)="3.4"];
} }
message MemberAddResponse { message MemberAddResponse {
option (versionpb.etcd_version_msg) = "3.0";
ResponseHeader header = 1; ResponseHeader header = 1;
// member is the member information for the added member. // member is the member information for the added member.
Member member = 2; Member member = 2;
@ -897,17 +980,22 @@ message MemberAddResponse {
} }
message MemberRemoveRequest { message MemberRemoveRequest {
option (versionpb.etcd_version_msg) = "3.0";
// ID is the member ID of the member to remove. // ID is the member ID of the member to remove.
uint64 ID = 1; uint64 ID = 1;
} }
message MemberRemoveResponse { message MemberRemoveResponse {
option (versionpb.etcd_version_msg) = "3.0";
ResponseHeader header = 1; ResponseHeader header = 1;
// members is a list of all members after removing the member. // members is a list of all members after removing the member.
repeated Member members = 2; repeated Member members = 2;
} }
message MemberUpdateRequest { message MemberUpdateRequest {
option (versionpb.etcd_version_msg) = "3.0";
// ID is the member ID of the member to update. // ID is the member ID of the member to update.
uint64 ID = 1; uint64 ID = 1;
// peerURLs is the new list of URLs the member will use to communicate with the cluster. // peerURLs is the new list of URLs the member will use to communicate with the cluster.
@ -915,59 +1003,80 @@ message MemberUpdateRequest {
} }
message MemberUpdateResponse{ message MemberUpdateResponse{
option (versionpb.etcd_version_msg) = "3.0";
ResponseHeader header = 1; ResponseHeader header = 1;
// members is a list of all members after updating the member. // members is a list of all members after updating the member.
repeated Member members = 2; repeated Member members = 2 [(versionpb.etcd_version_field)="3.1"];
} }
message MemberListRequest { message MemberListRequest {
bool linearizable = 1; option (versionpb.etcd_version_msg) = "3.0";
bool linearizable = 1 [(versionpb.etcd_version_field)="3.5"];
} }
message MemberListResponse { message MemberListResponse {
option (versionpb.etcd_version_msg) = "3.0";
ResponseHeader header = 1; ResponseHeader header = 1;
// members is a list of all members associated with the cluster. // members is a list of all members associated with the cluster.
repeated Member members = 2; repeated Member members = 2;
} }
message MemberPromoteRequest { message MemberPromoteRequest {
option (versionpb.etcd_version_msg) = "3.4";
// ID is the member ID of the member to promote. // ID is the member ID of the member to promote.
uint64 ID = 1; uint64 ID = 1;
} }
message MemberPromoteResponse { message MemberPromoteResponse {
option (versionpb.etcd_version_msg) = "3.4";
ResponseHeader header = 1; ResponseHeader header = 1;
// members is a list of all members after promoting the member. // members is a list of all members after promoting the member.
repeated Member members = 2; repeated Member members = 2;
} }
message DefragmentRequest { message DefragmentRequest {
option (versionpb.etcd_version_msg) = "3.0";
} }
message DefragmentResponse { message DefragmentResponse {
option (versionpb.etcd_version_msg) = "3.0";
ResponseHeader header = 1; ResponseHeader header = 1;
} }
message MoveLeaderRequest { message MoveLeaderRequest {
option (versionpb.etcd_version_msg) = "3.3";
// targetID is the node ID for the new leader. // targetID is the node ID for the new leader.
uint64 targetID = 1; uint64 targetID = 1;
} }
message MoveLeaderResponse { message MoveLeaderResponse {
option (versionpb.etcd_version_msg) = "3.3";
ResponseHeader header = 1; ResponseHeader header = 1;
} }
enum AlarmType { enum AlarmType {
option (versionpb.etcd_version_enum) = "3.0";
NONE = 0; // default, used to query if any alarm is active NONE = 0; // default, used to query if any alarm is active
NOSPACE = 1; // space quota is exhausted NOSPACE = 1; // space quota is exhausted
CORRUPT = 2; // kv store corruption detected CORRUPT = 2 [(versionpb.etcd_version_enum_value)="3.3"]; // kv store corruption detected
} }
message AlarmRequest { message AlarmRequest {
option (versionpb.etcd_version_msg) = "3.0";
enum AlarmAction { enum AlarmAction {
GET = 0; option (versionpb.etcd_version_enum) = "3.0";
ACTIVATE = 1;
DEACTIVATE = 2; GET = 0;
ACTIVATE = 1;
DEACTIVATE = 2;
} }
// action is the kind of alarm request to issue. The action // action is the kind of alarm request to issue. The action
// may GET alarm statuses, ACTIVATE an alarm, or DEACTIVATE a // may GET alarm statuses, ACTIVATE an alarm, or DEACTIVATE a
@ -981,6 +1090,7 @@ message AlarmRequest {
} }
message AlarmMember { message AlarmMember {
option (versionpb.etcd_version_msg) = "3.0";
// memberID is the ID of the member associated with the raised alarm. // memberID is the ID of the member associated with the raised alarm.
uint64 memberID = 1; uint64 memberID = 1;
// alarm is the type of alarm which has been raised. // alarm is the type of alarm which has been raised.
@ -988,13 +1098,19 @@ message AlarmMember {
} }
message AlarmResponse { message AlarmResponse {
option (versionpb.etcd_version_msg) = "3.0";
ResponseHeader header = 1; ResponseHeader header = 1;
// alarms is a list of alarms associated with the alarm request. // alarms is a list of alarms associated with the alarm request.
repeated AlarmMember alarms = 2; repeated AlarmMember alarms = 2;
} }
message DowngradeRequest { message DowngradeRequest {
option (versionpb.etcd_version_msg) = "3.5";
enum DowngradeAction { enum DowngradeAction {
option (versionpb.etcd_version_enum) = "3.5";
VALIDATE = 0; VALIDATE = 0;
ENABLE = 1; ENABLE = 1;
CANCEL = 2; CANCEL = 2;
@ -1009,15 +1125,20 @@ message DowngradeRequest {
} }
message DowngradeResponse { message DowngradeResponse {
option (versionpb.etcd_version_msg) = "3.5";
ResponseHeader header = 1; ResponseHeader header = 1;
// version is the current cluster version. // version is the current cluster version.
string version = 2; string version = 2;
} }
message StatusRequest { message StatusRequest {
option (versionpb.etcd_version_msg) = "3.0";
} }
message StatusResponse { message StatusResponse {
option (versionpb.etcd_version_msg) = "3.0";
ResponseHeader header = 1; ResponseHeader header = 1;
// version is the cluster protocol version used by the responding member. // version is the cluster protocol version used by the responding member.
string version = 2; string version = 2;
@ -1030,55 +1151,69 @@ message StatusResponse {
// raftTerm is the current raft term of the responding member. // raftTerm is the current raft term of the responding member.
uint64 raftTerm = 6; uint64 raftTerm = 6;
// raftAppliedIndex is the current raft applied index of the responding member. // raftAppliedIndex is the current raft applied index of the responding member.
uint64 raftAppliedIndex = 7; uint64 raftAppliedIndex = 7 [(versionpb.etcd_version_field)="3.4"];
// errors contains alarm/health information and status. // errors contains alarm/health information and status.
repeated string errors = 8; repeated string errors = 8 [(versionpb.etcd_version_field)="3.4"];
// dbSizeInUse is the size of the backend database logically in use, in bytes, of the responding member. // dbSizeInUse is the size of the backend database logically in use, in bytes, of the responding member.
int64 dbSizeInUse = 9; int64 dbSizeInUse = 9 [(versionpb.etcd_version_field)="3.4"];
// isLearner indicates if the member is raft learner. // isLearner indicates if the member is raft learner.
bool isLearner = 10; bool isLearner = 10 [(versionpb.etcd_version_field)="3.4"];
} }
message AuthEnableRequest { message AuthEnableRequest {
option (versionpb.etcd_version_msg) = "3.0";
} }
message AuthDisableRequest { message AuthDisableRequest {
option (versionpb.etcd_version_msg) = "3.0";
} }
message AuthStatusRequest { message AuthStatusRequest {
option (versionpb.etcd_version_msg) = "3.5";
} }
message AuthenticateRequest { message AuthenticateRequest {
option (versionpb.etcd_version_msg) = "3.0";
string name = 1; string name = 1;
string password = 2; string password = 2;
} }
message AuthUserAddRequest { message AuthUserAddRequest {
option (versionpb.etcd_version_msg) = "3.0";
string name = 1; string name = 1;
string password = 2; string password = 2;
authpb.UserAddOptions options = 3; authpb.UserAddOptions options = 3 [(versionpb.etcd_version_field)="3.4"];
string hashedPassword = 4; string hashedPassword = 4 [(versionpb.etcd_version_field)="3.5"];
} }
message AuthUserGetRequest { message AuthUserGetRequest {
option (versionpb.etcd_version_msg) = "3.0";
string name = 1; string name = 1;
} }
message AuthUserDeleteRequest { message AuthUserDeleteRequest {
option (versionpb.etcd_version_msg) = "3.0";
// name is the name of the user to delete. // name is the name of the user to delete.
string name = 1; string name = 1;
} }
message AuthUserChangePasswordRequest { message AuthUserChangePasswordRequest {
option (versionpb.etcd_version_msg) = "3.0";
// name is the name of the user whose password is being changed. // name is the name of the user whose password is being changed.
string name = 1; string name = 1;
// password is the new password for the user. Note that this field will be removed in the API layer. // password is the new password for the user. Note that this field will be removed in the API layer.
string password = 2; string password = 2;
// hashedPassword is the new password for the user. Note that this field will be initialized in the API layer. // hashedPassword is the new password for the user. Note that this field will be initialized in the API layer.
string hashedPassword = 3; string hashedPassword = 3 [(versionpb.etcd_version_field)="3.5"];
} }
message AuthUserGrantRoleRequest { message AuthUserGrantRoleRequest {
option (versionpb.etcd_version_msg) = "3.0";
// user is the name of the user which should be granted a given role. // user is the name of the user which should be granted a given role.
string user = 1; string user = 1;
// role is the name of the role to grant to the user. // role is the name of the role to grant to the user.
@ -1086,30 +1221,42 @@ message AuthUserGrantRoleRequest {
} }
message AuthUserRevokeRoleRequest { message AuthUserRevokeRoleRequest {
option (versionpb.etcd_version_msg) = "3.0";
string name = 1; string name = 1;
string role = 2; string role = 2;
} }
message AuthRoleAddRequest { message AuthRoleAddRequest {
option (versionpb.etcd_version_msg) = "3.0";
// name is the name of the role to add to the authentication system. // name is the name of the role to add to the authentication system.
string name = 1; string name = 1;
} }
message AuthRoleGetRequest { message AuthRoleGetRequest {
option (versionpb.etcd_version_msg) = "3.0";
string role = 1; string role = 1;
} }
message AuthUserListRequest { message AuthUserListRequest {
option (versionpb.etcd_version_msg) = "3.0";
} }
message AuthRoleListRequest { message AuthRoleListRequest {
option (versionpb.etcd_version_msg) = "3.0";
} }
message AuthRoleDeleteRequest { message AuthRoleDeleteRequest {
option (versionpb.etcd_version_msg) = "3.0";
string role = 1; string role = 1;
} }
message AuthRoleGrantPermissionRequest { message AuthRoleGrantPermissionRequest {
option (versionpb.etcd_version_msg) = "3.0";
// name is the name of the role which will be granted the permission. // name is the name of the role which will be granted the permission.
string name = 1; string name = 1;
// perm is the permission to grant to the role. // perm is the permission to grant to the role.
@ -1117,20 +1264,28 @@ message AuthRoleGrantPermissionRequest {
} }
message AuthRoleRevokePermissionRequest { message AuthRoleRevokePermissionRequest {
option (versionpb.etcd_version_msg) = "3.0";
string role = 1; string role = 1;
bytes key = 2; bytes key = 2;
bytes range_end = 3; bytes range_end = 3;
} }
message AuthEnableResponse { message AuthEnableResponse {
option (versionpb.etcd_version_msg) = "3.0";
ResponseHeader header = 1; ResponseHeader header = 1;
} }
message AuthDisableResponse { message AuthDisableResponse {
option (versionpb.etcd_version_msg) = "3.0";
ResponseHeader header = 1; ResponseHeader header = 1;
} }
message AuthStatusResponse { message AuthStatusResponse {
option (versionpb.etcd_version_msg) = "3.5";
ResponseHeader header = 1; ResponseHeader header = 1;
bool enabled = 2; bool enabled = 2;
// authRevision is the current revision of auth store // authRevision is the current revision of auth store
@ -1138,67 +1293,93 @@ message AuthStatusResponse {
} }
message AuthenticateResponse { message AuthenticateResponse {
option (versionpb.etcd_version_msg) = "3.0";
ResponseHeader header = 1; ResponseHeader header = 1;
// token is an authorized token that can be used in succeeding RPCs // token is an authorized token that can be used in succeeding RPCs
string token = 2; string token = 2;
} }
message AuthUserAddResponse { message AuthUserAddResponse {
option (versionpb.etcd_version_msg) = "3.0";
ResponseHeader header = 1; ResponseHeader header = 1;
} }
message AuthUserGetResponse { message AuthUserGetResponse {
option (versionpb.etcd_version_msg) = "3.0";
ResponseHeader header = 1; ResponseHeader header = 1;
repeated string roles = 2; repeated string roles = 2;
} }
message AuthUserDeleteResponse { message AuthUserDeleteResponse {
option (versionpb.etcd_version_msg) = "3.0";
ResponseHeader header = 1; ResponseHeader header = 1;
} }
message AuthUserChangePasswordResponse { message AuthUserChangePasswordResponse {
option (versionpb.etcd_version_msg) = "3.0";
ResponseHeader header = 1; ResponseHeader header = 1;
} }
message AuthUserGrantRoleResponse { message AuthUserGrantRoleResponse {
option (versionpb.etcd_version_msg) = "3.0";
ResponseHeader header = 1; ResponseHeader header = 1;
} }
message AuthUserRevokeRoleResponse { message AuthUserRevokeRoleResponse {
option (versionpb.etcd_version_msg) = "3.0";
ResponseHeader header = 1; ResponseHeader header = 1;
} }
message AuthRoleAddResponse { message AuthRoleAddResponse {
option (versionpb.etcd_version_msg) = "3.0";
ResponseHeader header = 1; ResponseHeader header = 1;
} }
message AuthRoleGetResponse { message AuthRoleGetResponse {
ResponseHeader header = 1; ResponseHeader header = 1 [(versionpb.etcd_version_field)="3.0"];
repeated authpb.Permission perm = 2; repeated authpb.Permission perm = 2 [(versionpb.etcd_version_field)="3.0"];
} }
message AuthRoleListResponse { message AuthRoleListResponse {
option (versionpb.etcd_version_msg) = "3.0";
ResponseHeader header = 1; ResponseHeader header = 1;
repeated string roles = 2; repeated string roles = 2;
} }
message AuthUserListResponse { message AuthUserListResponse {
option (versionpb.etcd_version_msg) = "3.0";
ResponseHeader header = 1; ResponseHeader header = 1;
repeated string users = 2; repeated string users = 2;
} }
message AuthRoleDeleteResponse { message AuthRoleDeleteResponse {
option (versionpb.etcd_version_msg) = "3.0";
ResponseHeader header = 1; ResponseHeader header = 1;
} }
message AuthRoleGrantPermissionResponse { message AuthRoleGrantPermissionResponse {
option (versionpb.etcd_version_msg) = "3.0";
ResponseHeader header = 1; ResponseHeader header = 1;
} }
message AuthRoleRevokePermissionResponse { message AuthRoleRevokePermissionResponse {
option (versionpb.etcd_version_msg) = "3.0";
ResponseHeader header = 1; ResponseHeader header = 1;
} }

View File

@ -11,6 +11,7 @@ import (
_ "github.com/gogo/protobuf/gogoproto" _ "github.com/gogo/protobuf/gogoproto"
proto "github.com/golang/protobuf/proto" proto "github.com/golang/protobuf/proto"
_ "go.etcd.io/etcd/api/v3/versionpb"
) )
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.
@ -286,30 +287,33 @@ func init() {
func init() { proto.RegisterFile("membership.proto", fileDescriptor_949fe0d019050ef5) } func init() { proto.RegisterFile("membership.proto", fileDescriptor_949fe0d019050ef5) }
var fileDescriptor_949fe0d019050ef5 = []byte{ var fileDescriptor_949fe0d019050ef5 = []byte{
// 367 bytes of a gzipped FileDescriptorProto // 401 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x92, 0xc1, 0x4e, 0xf2, 0x40, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x52, 0xcd, 0xae, 0xd2, 0x40,
0x14, 0x85, 0x99, 0x42, 0xf8, 0xdb, 0xcb, 0x1f, 0xc4, 0x09, 0x89, 0x8d, 0x68, 0x25, 0x5d, 0xb1, 0x14, 0xbe, 0xd3, 0xde, 0xdc, 0xdb, 0x9e, 0x6b, 0x10, 0x27, 0x24, 0x36, 0xa0, 0xb5, 0x61, 0xc5,
0x30, 0x98, 0xe8, 0x13, 0xa0, 0xb0, 0x20, 0x81, 0xcd, 0x18, 0xdd, 0x92, 0x56, 0x2e, 0xd8, 0xa4, 0xaa, 0x24, 0x12, 0x36, 0xee, 0x54, 0x58, 0x60, 0xc4, 0xc5, 0x18, 0xdc, 0x92, 0x29, 0x1c, 0xb0,
0x74, 0xea, 0xcc, 0x54, 0xd7, 0xbe, 0x85, 0x4f, 0xe0, 0xb3, 0xb0, 0xf4, 0x11, 0x14, 0x5f, 0xc4, 0x49, 0x69, 0xeb, 0xcc, 0x14, 0xf7, 0x2e, 0x7d, 0x02, 0xdf, 0xc2, 0x95, 0xef, 0xc0, 0xd2, 0x47,
0x74, 0x5a, 0x4a, 0x49, 0xdc, 0xb8, 0xbb, 0x3d, 0xbd, 0xf7, 0x9c, 0xf3, 0x35, 0x85, 0xd6, 0x0a, 0x50, 0x7c, 0x11, 0xd3, 0x99, 0x42, 0x4b, 0x74, 0x75, 0x77, 0xa7, 0x5f, 0xcf, 0xf9, 0xfe, 0x5a,
0x57, 0x3e, 0x0a, 0xf9, 0x18, 0xc4, 0xfd, 0x58, 0x70, 0xc5, 0xe9, 0xff, 0x9d, 0x12, 0xfb, 0xc7, 0x68, 0xef, 0x70, 0x17, 0xa1, 0x90, 0x1f, 0xe3, 0x3c, 0xcc, 0x45, 0xa6, 0x32, 0xfa, 0xa0, 0x46,
0xed, 0x25, 0x5f, 0x72, 0xfd, 0xe2, 0x22, 0x9d, 0xb2, 0x1d, 0x77, 0x02, 0x4d, 0xe6, 0x2d, 0xd4, 0xf2, 0xa8, 0xdb, 0xd9, 0x66, 0xdb, 0x4c, 0xbf, 0x18, 0x96, 0x93, 0xd9, 0xe9, 0x06, 0xa8, 0x56,
0x40, 0x29, 0x11, 0xf8, 0x89, 0x42, 0x49, 0x3b, 0x60, 0xc5, 0x88, 0x62, 0x96, 0x88, 0x50, 0xda, 0xeb, 0x21, 0xcf, 0xe3, 0xe1, 0x1e, 0x85, 0x8c, 0xb3, 0x34, 0x8f, 0x4e, 0x93, 0xd9, 0xe8, 0x2f,
0xa4, 0x5b, 0xed, 0x59, 0xcc, 0x4c, 0x85, 0x3b, 0x11, 0x4a, 0x7a, 0x0a, 0x10, 0xc8, 0x59, 0x88, 0xa0, 0xc5, 0xf8, 0x46, 0xbd, 0x54, 0x4a, 0xc4, 0x51, 0xa1, 0x50, 0xd2, 0x1e, 0xb8, 0x39, 0xa2,
0x9e, 0x88, 0x50, 0xd8, 0x46, 0x97, 0xf4, 0x4c, 0x66, 0x05, 0x72, 0x92, 0x09, 0xee, 0x00, 0xa0, 0x58, 0x16, 0x22, 0x91, 0x1e, 0x09, 0xec, 0x81, 0xcb, 0x9c, 0x12, 0x58, 0x88, 0x44, 0xd2, 0xa7,
0xe4, 0x44, 0xa1, 0x16, 0x79, 0x2b, 0xb4, 0x49, 0x97, 0xf4, 0x2c, 0xa6, 0x67, 0x7a, 0x06, 0x8d, 0x00, 0xb1, 0x5c, 0x26, 0xc8, 0x45, 0x8a, 0xc2, 0xb3, 0x02, 0x32, 0x70, 0x98, 0x1b, 0xcb, 0xb7,
0x87, 0x30, 0xc0, 0x48, 0x65, 0xfe, 0x86, 0xf6, 0x87, 0x4c, 0x4a, 0x13, 0xdc, 0x77, 0x02, 0xf5, 0x06, 0x78, 0x71, 0xfb, 0xe5, 0x87, 0x67, 0x8f, 0xc2, 0x71, 0xff, 0x0d, 0x40, 0x83, 0x92, 0xc2,
0xa9, 0xee, 0x4d, 0x9b, 0x60, 0x8c, 0x87, 0xfa, 0xba, 0xc6, 0x8c, 0xf1, 0x90, 0x8e, 0xe0, 0x40, 0x75, 0xca, 0x77, 0xe8, 0x91, 0x80, 0x0c, 0x5c, 0xa6, 0x67, 0xfa, 0x0c, 0xee, 0x56, 0x49, 0x8c,
0x78, 0x0b, 0x35, 0xf3, 0x8a, 0x08, 0xdd, 0xa0, 0x71, 0x79, 0xd2, 0x2f, 0x93, 0xf6, 0xf7, 0x81, 0xa9, 0x32, 0x42, 0x96, 0x16, 0x02, 0x03, 0x95, 0x52, 0x35, 0xd7, 0x77, 0x02, 0x37, 0x73, 0x9d,
0x58, 0x53, 0xec, 0x03, 0x8e, 0xe0, 0x30, 0x5b, 0x2f, 0x1b, 0x55, 0xb5, 0x91, 0xbd, 0x6f, 0x54, 0x95, 0xb6, 0xc0, 0x9a, 0x4d, 0x34, 0xcd, 0x35, 0xb3, 0x66, 0x13, 0x3a, 0x85, 0x87, 0x82, 0x6f,
0x32, 0xc9, 0xbf, 0xee, 0x4e, 0x71, 0xcf, 0xc1, 0xbe, 0x09, 0x13, 0xa9, 0x50, 0xdc, 0xa3, 0x90, 0xd4, 0x92, 0x9f, 0xb5, 0xb4, 0xa7, 0xbb, 0xe7, 0x4f, 0xc2, 0x66, 0x3b, 0xe1, 0x65, 0x44, 0xd6,
0x01, 0x8f, 0x6e, 0x51, 0x31, 0x7c, 0x4a, 0x50, 0x2a, 0xda, 0x82, 0xea, 0x33, 0x8a, 0x1c, 0x3c, 0x12, 0x97, 0x91, 0xa7, 0xf0, 0xc8, 0xac, 0x37, 0x89, 0x6c, 0x4d, 0xe4, 0x5d, 0x12, 0x35, 0x48,
0x1d, 0xdd, 0x57, 0x02, 0x9d, 0x7c, 0x7d, 0x5a, 0x38, 0x95, 0x2e, 0x3a, 0x60, 0xe5, 0xa5, 0x0a, 0xaa, 0x2f, 0x52, 0x23, 0xb5, 0xe3, 0x31, 0x78, 0xaf, 0x93, 0x42, 0x2a, 0x14, 0x1f, 0x4c, 0xd9,
0x64, 0x33, 0x13, 0x34, 0xf8, 0x2f, 0x8d, 0x8d, 0x3f, 0x37, 0x1e, 0xc1, 0xd1, 0x90, 0xbf, 0x44, 0xef, 0x51, 0x31, 0xfc, 0x54, 0xa0, 0x54, 0xb4, 0x0d, 0xf6, 0x1e, 0x45, 0x55, 0x45, 0x39, 0xd6,
0x4b, 0xe1, 0xcd, 0x71, 0x1c, 0x2d, 0x78, 0x29, 0xde, 0x86, 0x7f, 0x18, 0x79, 0x7e, 0x88, 0x73, 0x67, 0x5f, 0x09, 0xf4, 0xaa, 0xbb, 0xf9, 0x99, 0xbb, 0x71, 0xda, 0x03, 0xb7, 0xb2, 0x79, 0x2e,
0x1d, 0x6e, 0xb2, 0xed, 0xe3, 0x16, 0xc5, 0x28, 0x50, 0xae, 0xdb, 0xeb, 0x2f, 0xa7, 0xb2, 0xde, 0xc1, 0x31, 0x80, 0xae, 0xe2, 0x3f, 0x19, 0xac, 0xfb, 0x67, 0x78, 0x07, 0x8f, 0x27, 0xd9, 0xe7,
0x38, 0xe4, 0x63, 0xe3, 0x90, 0xcf, 0x8d, 0x43, 0xde, 0xbe, 0x9d, 0x8a, 0x5f, 0xd7, 0xff, 0xd3, 0x74, 0x2b, 0xf8, 0x1a, 0x67, 0xe9, 0x26, 0x6b, 0xf8, 0xf0, 0xe0, 0x16, 0x53, 0x1e, 0x25, 0xb8,
0xd5, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xdc, 0x93, 0x7d, 0x0b, 0x87, 0x02, 0x00, 0x00, 0xd6, 0x2e, 0x1c, 0x76, 0x7a, 0x3c, 0x85, 0xb3, 0xfe, 0x0d, 0xf7, 0xaa, 0x73, 0xf8, 0xed, 0x5f,
0x1d, 0x8e, 0x3e, 0xf9, 0x79, 0xf4, 0xc9, 0xaf, 0xa3, 0x4f, 0xbe, 0xfd, 0xf1, 0xaf, 0xa2, 0x1b,
0xfd, 0x17, 0x8e, 0xfe, 0x06, 0x00, 0x00, 0xff, 0xff, 0xf1, 0xa3, 0xbd, 0xee, 0xdf, 0x02, 0x00,
0x00,
} }
func (m *RaftAttributes) Marshal() (dAtA []byte, err error) { func (m *RaftAttributes) Marshal() (dAtA []byte, err error) {

View File

@ -2,6 +2,7 @@ syntax = "proto3";
package membershippb; package membershippb;
import "gogoproto/gogo.proto"; import "gogoproto/gogo.proto";
import "etcd/api/versionpb/version.proto";
option (gogoproto.marshaler_all) = true; option (gogoproto.marshaler_all) = true;
option (gogoproto.sizer_all) = true; option (gogoproto.sizer_all) = true;
@ -10,6 +11,8 @@ option (gogoproto.goproto_getters_all) = false;
// RaftAttributes represents the raft related attributes of an etcd member. // RaftAttributes represents the raft related attributes of an etcd member.
message RaftAttributes { message RaftAttributes {
option (versionpb.etcd_version_msg) = "3.5";
// peerURLs is the list of peers in the raft cluster. // peerURLs is the list of peers in the raft cluster.
repeated string peer_urls = 1; repeated string peer_urls = 1;
// isLearner indicates if the member is raft learner. // isLearner indicates if the member is raft learner.
@ -18,26 +21,36 @@ message RaftAttributes {
// Attributes represents all the non-raft related attributes of an etcd member. // Attributes represents all the non-raft related attributes of an etcd member.
message Attributes { message Attributes {
option (versionpb.etcd_version_msg) = "3.5";
string name = 1; string name = 1;
repeated string client_urls = 2; repeated string client_urls = 2;
} }
message Member { message Member {
option (versionpb.etcd_version_msg) = "3.5";
uint64 ID = 1; uint64 ID = 1;
RaftAttributes raft_attributes = 2; RaftAttributes raft_attributes = 2;
Attributes member_attributes = 3; Attributes member_attributes = 3;
} }
message ClusterVersionSetRequest { message ClusterVersionSetRequest {
option (versionpb.etcd_version_msg) = "3.5";
string ver = 1; string ver = 1;
} }
message ClusterMemberAttrSetRequest { message ClusterMemberAttrSetRequest {
option (versionpb.etcd_version_msg) = "3.5";
uint64 member_ID = 1; uint64 member_ID = 1;
Attributes member_attributes = 2; Attributes member_attributes = 2;
} }
message DowngradeInfoSetRequest { message DowngradeInfoSetRequest {
option (versionpb.etcd_version_msg) = "3.5";
bool enabled = 1; bool enabled = 1;
string ver = 2; string ver = 2;
} }

View File

@ -0,0 +1,90 @@
// Code generated by protoc-gen-gogo. DO NOT EDIT.
// source: version.proto
package versionpb
import (
fmt "fmt"
math "math"
_ "github.com/gogo/protobuf/gogoproto"
protobuf "github.com/gogo/protobuf/protoc-gen-gogo/descriptor"
proto "github.com/golang/protobuf/proto"
)
// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf
// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
var E_EtcdVersionMsg = &proto.ExtensionDesc{
ExtendedType: (*protobuf.MessageOptions)(nil),
ExtensionType: (*string)(nil),
Field: 50000,
Name: "versionpb.etcd_version_msg",
Tag: "bytes,50000,opt,name=etcd_version_msg",
Filename: "version.proto",
}
var E_EtcdVersionField = &proto.ExtensionDesc{
ExtendedType: (*protobuf.FieldOptions)(nil),
ExtensionType: (*string)(nil),
Field: 50001,
Name: "versionpb.etcd_version_field",
Tag: "bytes,50001,opt,name=etcd_version_field",
Filename: "version.proto",
}
var E_EtcdVersionEnum = &proto.ExtensionDesc{
ExtendedType: (*protobuf.EnumOptions)(nil),
ExtensionType: (*string)(nil),
Field: 50002,
Name: "versionpb.etcd_version_enum",
Tag: "bytes,50002,opt,name=etcd_version_enum",
Filename: "version.proto",
}
var E_EtcdVersionEnumValue = &proto.ExtensionDesc{
ExtendedType: (*protobuf.EnumValueOptions)(nil),
ExtensionType: (*string)(nil),
Field: 50003,
Name: "versionpb.etcd_version_enum_value",
Tag: "bytes,50003,opt,name=etcd_version_enum_value",
Filename: "version.proto",
}
func init() {
proto.RegisterExtension(E_EtcdVersionMsg)
proto.RegisterExtension(E_EtcdVersionField)
proto.RegisterExtension(E_EtcdVersionEnum)
proto.RegisterExtension(E_EtcdVersionEnumValue)
}
func init() { proto.RegisterFile("version.proto", fileDescriptor_7d2c07d79758f814) }
var fileDescriptor_7d2c07d79758f814 = []byte{
// 261 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x2d, 0x4b, 0x2d, 0x2a,
0xce, 0xcc, 0xcf, 0xd3, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x84, 0x72, 0x0b, 0x92, 0xa4,
0x44, 0xd2, 0xf3, 0xd3, 0xf3, 0xc1, 0xa2, 0xfa, 0x20, 0x16, 0x44, 0x81, 0x94, 0x42, 0x7a, 0x7e,
0x7e, 0x7a, 0x4e, 0xaa, 0x3e, 0x98, 0x97, 0x54, 0x9a, 0xa6, 0x9f, 0x92, 0x5a, 0x9c, 0x5c, 0x94,
0x59, 0x50, 0x92, 0x5f, 0x04, 0x51, 0x61, 0xe5, 0xc7, 0x25, 0x90, 0x5a, 0x92, 0x9c, 0x12, 0x0f,
0x35, 0x29, 0x3e, 0xb7, 0x38, 0x5d, 0x48, 0x5e, 0x0f, 0xa2, 0x4d, 0x0f, 0xa6, 0x4d, 0xcf, 0x37,
0xb5, 0xb8, 0x38, 0x31, 0x3d, 0xd5, 0xbf, 0xa0, 0x24, 0x33, 0x3f, 0xaf, 0x58, 0xe2, 0x42, 0x1b,
0xb3, 0x02, 0xa3, 0x06, 0x67, 0x10, 0x1f, 0x48, 0x6b, 0x18, 0x44, 0xa7, 0x6f, 0x71, 0x7a, 0x07,
0x23, 0xa3, 0x55, 0x00, 0x97, 0x10, 0x8a, 0x79, 0x69, 0x99, 0xa9, 0x39, 0x29, 0x42, 0xb2, 0x18,
0x26, 0xba, 0x81, 0xc4, 0x61, 0xe6, 0x5d, 0x84, 0x9a, 0x27, 0x80, 0x64, 0x1e, 0x58, 0x01, 0xc8,
0x44, 0x5f, 0x2e, 0x41, 0x14, 0x13, 0x53, 0xf3, 0x4a, 0x73, 0x85, 0x64, 0x30, 0x0c, 0x74, 0xcd,
0x2b, 0xcd, 0x85, 0x99, 0x77, 0x09, 0x6a, 0x1e, 0x3f, 0x92, 0x79, 0x20, 0x79, 0x90, 0x71, 0xb1,
0x5c, 0xe2, 0x18, 0xc6, 0xc5, 0x97, 0x25, 0xe6, 0x94, 0xa6, 0x0a, 0x29, 0x62, 0x35, 0x34, 0x0c,
0x24, 0x07, 0x33, 0xf9, 0x32, 0xd4, 0x64, 0x11, 0x34, 0x93, 0xc1, 0x8a, 0x3a, 0x18, 0x19, 0x9d,
0x04, 0x4e, 0x3c, 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23, 0x39, 0xc6, 0x19, 0x8f,
0xe5, 0x18, 0x92, 0xd8, 0xc0, 0xa6, 0x19, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0x77, 0x44, 0xe2,
0xa4, 0xbc, 0x01, 0x00, 0x00,
}

View File

@ -0,0 +1,28 @@
syntax = "proto3";
package versionpb;
import "gogoproto/gogo.proto";
import "google/protobuf/descriptor.proto";
option (gogoproto.marshaler_all) = true;
option (gogoproto.unmarshaler_all) = true;
// Indicates etcd version that introduced the message, used to determine minimal etcd version required to interpret wal that includes this message.
extend google.protobuf.MessageOptions {
optional string etcd_version_msg = 50000;
}
// Indicates etcd version that introduced the field, used to determine minimal etcd version required to interpret wal that sets this field.
extend google.protobuf.FieldOptions {
optional string etcd_version_field = 50001;
}
// Indicates etcd version that introduced the enum, used to determine minimal etcd version required to interpret wal that uses this enum.
extend google.protobuf.EnumOptions {
optional string etcd_version_enum = 50002;
}
// Indicates etcd version that introduced the enum value, used to determine minimal etcd version required to interpret wal that sets this enum value.
extend google.protobuf.EnumValueOptions {
optional string etcd_version_enum_value = 50003;
}

View File

@ -144,6 +144,7 @@ github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORR
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y=
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho=
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=

View File

@ -140,6 +140,7 @@ github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORR
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y=
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho=
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=

View File

@ -8,6 +8,7 @@ require (
github.com/gogo/protobuf v1.3.2 github.com/gogo/protobuf v1.3.2
github.com/golang/protobuf v1.5.2 github.com/golang/protobuf v1.5.2
github.com/pkg/errors v0.9.1 // indirect github.com/pkg/errors v0.9.1 // indirect
go.etcd.io/etcd/api/v3 v3.5.0
go.etcd.io/etcd/client/pkg/v3 v3.5.0 go.etcd.io/etcd/client/pkg/v3 v3.5.0
) )
@ -18,3 +19,5 @@ replace go.etcd.io/etcd => ./FORBIDDEN_DEPENDENCY
replace go.etcd.io/etcd/v3 => ./FORBIDDEN_DEPENDENCY replace go.etcd.io/etcd/v3 => ./FORBIDDEN_DEPENDENCY
replace go.etcd.io/etcd/client/pkg/v3 => ../client/pkg replace go.etcd.io/etcd/client/pkg/v3 => ../client/pkg
replace go.etcd.io/etcd/api/v3 => ../api

View File

@ -1,27 +1,61 @@
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054 h1:uH66TXeswKn5PW5zdZ39xEwfS9an067BirqA+P4QaLI= github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054 h1:uH66TXeswKn5PW5zdZ39xEwfS9an067BirqA+P4QaLI=
github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5 h1:xD/lrqdvwsc+O2bjSSi3YqY73Ke3LAiSCx49aCesA0E= github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5 h1:xD/lrqdvwsc+O2bjSSi3YqY73Ke3LAiSCx49aCesA0E=
github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo=
github.com/cockroachdb/errors v1.2.4 h1:Lap807SXTH5tri2TivECb/4abUkMZC9zRoLarvcKDqs= github.com/cockroachdb/errors v1.2.4 h1:Lap807SXTH5tri2TivECb/4abUkMZC9zRoLarvcKDqs=
github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA=
github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f h1:o/kfcElHqOiXqcou5a3rIlMc7oJbMQkeLk0VQJ7zgqY= github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f h1:o/kfcElHqOiXqcou5a3rIlMc7oJbMQkeLk0VQJ7zgqY=
github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI=
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/getsentry/raven-go v0.2.0 h1:no+xWJRb5ZI7eE8TWgIq1jLulQiIoLG0IfYxv5JYMGs= github.com/getsentry/raven-go v0.2.0 h1:no+xWJRb5ZI7eE8TWgIq1jLulQiIoLG0IfYxv5JYMGs=
github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
@ -35,49 +69,112 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=

View File

@ -11,6 +11,7 @@ import (
_ "github.com/gogo/protobuf/gogoproto" _ "github.com/gogo/protobuf/gogoproto"
proto "github.com/golang/protobuf/proto" proto "github.com/golang/protobuf/proto"
_ "go.etcd.io/etcd/api/v3/versionpb"
) )
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.
@ -695,72 +696,75 @@ func init() {
func init() { proto.RegisterFile("raft.proto", fileDescriptor_b042552c306ae59b) } func init() { proto.RegisterFile("raft.proto", fileDescriptor_b042552c306ae59b) }
var fileDescriptor_b042552c306ae59b = []byte{ var fileDescriptor_b042552c306ae59b = []byte{
// 1026 bytes of a gzipped FileDescriptorProto // 1079 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x55, 0xcd, 0x6e, 0xdb, 0x46, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x55, 0xcf, 0x6b, 0xe3, 0x46,
0x17, 0x25, 0x29, 0x5a, 0x3f, 0x57, 0xb2, 0x3c, 0xbe, 0xf1, 0x17, 0x10, 0x86, 0xc1, 0xe8, 0x53, 0x14, 0x96, 0x64, 0xc5, 0xb2, 0x9f, 0x1d, 0x67, 0x32, 0x9b, 0x2e, 0xc2, 0x2c, 0x5a, 0xd7, 0xbb,
0x52, 0x44, 0x70, 0x11, 0xb7, 0xd0, 0xa2, 0x28, 0xba, 0xf3, 0x4f, 0x00, 0xab, 0xb0, 0xdc, 0x54, 0x65, 0x4d, 0xca, 0x26, 0x8b, 0xbb, 0x94, 0xb2, 0xb7, 0xfc, 0x58, 0x48, 0x4a, 0x9c, 0x6e, 0x9d,
0x76, 0xbc, 0x28, 0x50, 0x08, 0x63, 0x71, 0x44, 0xb3, 0x15, 0x39, 0x04, 0x39, 0x72, 0xed, 0x4d, 0x6c, 0x0e, 0x0b, 0x25, 0x4c, 0xac, 0xb1, 0xa2, 0xd6, 0xd6, 0x88, 0xd1, 0x38, 0x4d, 0x6e, 0xa5,
0x51, 0xf4, 0x09, 0xba, 0xec, 0x26, 0xdb, 0x3e, 0x40, 0x9f, 0xc2, 0x4b, 0x03, 0xdd, 0x74, 0x15, 0x97, 0x1e, 0x7a, 0x29, 0x3d, 0x95, 0x42, 0xaf, 0xbd, 0x16, 0x0a, 0xfd, 0x1f, 0x72, 0x0c, 0xf4,
0x34, 0xf6, 0x8b, 0x14, 0x33, 0x1c, 0x4a, 0x94, 0x6c, 0x64, 0xd1, 0xdd, 0xcc, 0xb9, 0x67, 0xee, 0xd2, 0xd3, 0xd2, 0x4d, 0xfe, 0x91, 0x32, 0xa3, 0x91, 0x25, 0x3b, 0x61, 0x0f, 0xbd, 0xcd, 0x7c,
0x9c, 0x73, 0xef, 0xe5, 0x10, 0x20, 0xa1, 0x63, 0xb1, 0x13, 0x27, 0x5c, 0x70, 0x2c, 0xcb, 0x75, 0xef, 0xd3, 0x7b, 0xdf, 0xfb, 0xde, 0xcc, 0x08, 0x80, 0x93, 0xa1, 0x58, 0x8b, 0x39, 0x13, 0x0c,
0x7c, 0xbe, 0xb9, 0xe1, 0x73, 0x9f, 0x2b, 0xe8, 0x33, 0xb9, 0xca, 0xa2, 0xed, 0x9f, 0x61, 0xe5, 0x97, 0xe5, 0x3a, 0x3e, 0x69, 0xae, 0x04, 0x2c, 0x60, 0x0a, 0x5a, 0x97, 0xab, 0x34, 0xda, 0x6c,
0x75, 0x24, 0x92, 0x6b, 0x74, 0xc0, 0x3e, 0x65, 0x49, 0xe8, 0x58, 0x2d, 0xb3, 0x63, 0xef, 0xd9, 0x51, 0x31, 0xf0, 0xd7, 0x49, 0x1c, 0xae, 0x9f, 0x51, 0x9e, 0x84, 0x2c, 0x8a, 0x4f, 0xb2, 0x55,
0x37, 0xef, 0x9f, 0x19, 0x03, 0x85, 0xe0, 0x26, 0xac, 0xf4, 0x22, 0x8f, 0x5d, 0x39, 0xa5, 0x42, 0xca, 0x68, 0xff, 0x60, 0xc2, 0xc2, 0xcb, 0x48, 0xf0, 0x0b, 0xec, 0x82, 0x7d, 0x48, 0xf9, 0xd8,
0x28, 0x83, 0xf0, 0x53, 0xb0, 0x4f, 0xaf, 0x63, 0xe6, 0x98, 0x2d, 0xb3, 0xd3, 0xec, 0xae, 0xef, 0xb5, 0x5a, 0x66, 0xc7, 0xde, 0xb4, 0x2f, 0xdf, 0x3e, 0x34, 0xfa, 0x0a, 0xc1, 0x4d, 0x58, 0xd8,
0x64, 0x77, 0xed, 0xa8, 0x94, 0x32, 0x30, 0x4b, 0x74, 0x1d, 0x33, 0x44, 0xb0, 0x0f, 0xa8, 0xa0, 0x8d, 0x7c, 0x7a, 0xee, 0x96, 0x0a, 0xa1, 0x14, 0xc2, 0x1f, 0x83, 0x7d, 0x78, 0x11, 0x53, 0xd7,
0x8e, 0xdd, 0x32, 0x3b, 0x8d, 0x81, 0x5a, 0xb7, 0x7f, 0x31, 0x81, 0x9c, 0x44, 0x34, 0x4e, 0x2f, 0x6c, 0x99, 0x9d, 0x46, 0x77, 0x79, 0x2d, 0x95, 0xb3, 0xa6, 0x52, 0xca, 0xc0, 0x34, 0xd1, 0x45,
0xb8, 0xe8, 0x33, 0x41, 0x3d, 0x2a, 0x28, 0x7e, 0x01, 0x30, 0xe2, 0xd1, 0x78, 0x98, 0x0a, 0x2a, 0x4c, 0x31, 0x06, 0x7b, 0x9b, 0x08, 0xe2, 0xda, 0x2d, 0xb3, 0x53, 0xef, 0xab, 0xf5, 0x0b, 0xe7,
0xb2, 0xdc, 0xf5, 0x79, 0xee, 0x7d, 0x1e, 0x8d, 0x4f, 0x64, 0x40, 0xe7, 0xae, 0x8d, 0x72, 0x40, 0xfb, 0xbf, 0xdc, 0xd2, 0x27, 0x6b, 0xcf, 0xda, 0xdf, 0x99, 0x80, 0x0e, 0x22, 0x12, 0x27, 0xa7,
0x2a, 0x0d, 0x94, 0xd2, 0xa2, 0x89, 0x0c, 0x92, 0xfe, 0x84, 0xf4, 0x57, 0x34, 0xa1, 0x90, 0xf6, 0x4c, 0xf4, 0xa8, 0x20, 0x3e, 0x11, 0x04, 0x7f, 0x0a, 0x30, 0x60, 0xd1, 0xf0, 0x38, 0x11, 0x44,
0x77, 0x50, 0xcd, 0x15, 0x48, 0x89, 0x52, 0x81, 0xba, 0xb3, 0x31, 0x50, 0x6b, 0xfc, 0x0a, 0xaa, 0xa4, 0x45, 0x6a, 0x79, 0x91, 0x2d, 0x16, 0x0d, 0x0f, 0x64, 0x40, 0x17, 0xa9, 0x0e, 0x32, 0x40,
0xa1, 0x56, 0xa6, 0x12, 0xd7, 0xbb, 0x4e, 0xae, 0x65, 0x59, 0xb9, 0xce, 0x3b, 0xe3, 0xb7, 0xdf, 0x4a, 0x0e, 0x95, 0xe4, 0x62, 0x37, 0x29, 0x24, 0x1b, 0x15, 0xb2, 0xd1, 0x62, 0x37, 0x0a, 0x69,
0x95, 0xa0, 0xd2, 0x67, 0x69, 0x4a, 0x7d, 0x86, 0xaf, 0xc0, 0x16, 0xf3, 0x5a, 0x3d, 0xc9, 0x73, 0xbf, 0x81, 0x4a, 0xa6, 0x40, 0x6a, 0x95, 0x0a, 0x54, 0xcd, 0x7a, 0x5f, 0xad, 0xf1, 0x0b, 0xa8,
0xe8, 0x70, 0xb1, 0x5a, 0x92, 0x86, 0x1b, 0x60, 0x09, 0xbe, 0xe0, 0xc4, 0x12, 0x5c, 0xda, 0x18, 0x8c, 0xb5, 0x32, 0x95, 0xb8, 0xd6, 0x75, 0x33, 0x2d, 0xf3, 0xca, 0x75, 0xde, 0x29, 0xbf, 0xfd,
0x27, 0x7c, 0xc9, 0x86, 0x44, 0x66, 0x06, 0xed, 0x65, 0x83, 0xe8, 0x42, 0x65, 0xc2, 0x7d, 0xd5, 0x5b, 0x09, 0x9c, 0x1e, 0x4d, 0x12, 0x12, 0x50, 0xfc, 0x14, 0x6c, 0x91, 0x9b, 0x76, 0x2f, 0xcb,
0xdd, 0x95, 0x42, 0x30, 0x07, 0xe7, 0x65, 0x2b, 0x3f, 0x2c, 0xdb, 0x2b, 0xa8, 0xb0, 0x48, 0x24, 0xa1, 0xc3, 0x45, 0xdb, 0x24, 0x0d, 0xaf, 0x80, 0x25, 0xd8, 0x4c, 0x27, 0x96, 0x60, 0xb2, 0x8d,
0x01, 0x4b, 0x9d, 0x4a, 0xab, 0xd4, 0xa9, 0x77, 0x57, 0x17, 0x7a, 0x9c, 0xa7, 0xd2, 0x1c, 0xdc, 0x21, 0x67, 0x73, 0x6d, 0x48, 0x64, 0xda, 0xa0, 0x3d, 0xdf, 0x20, 0xf6, 0xc0, 0x19, 0xb1, 0x40,
0x82, 0xf2, 0x88, 0x87, 0x61, 0x20, 0x9c, 0x6a, 0x21, 0x97, 0xc6, 0xb0, 0x0b, 0xd5, 0x54, 0x57, 0x8d, 0x79, 0xa1, 0x10, 0xcc, 0xc0, 0xdc, 0xb6, 0xf2, 0x6d, 0xdb, 0x9e, 0x82, 0x43, 0x23, 0xc1,
0xcc, 0xa9, 0xa9, 0x4a, 0x92, 0xe5, 0x4a, 0xe6, 0x15, 0xcc, 0x79, 0x32, 0x63, 0xc2, 0x7e, 0x60, 0x43, 0x9a, 0xb8, 0x4e, 0xab, 0xd4, 0xa9, 0x75, 0x17, 0x67, 0x86, 0x9d, 0xa5, 0xd2, 0x1c, 0xfc,
0x23, 0xe1, 0x40, 0xcb, 0xec, 0x54, 0xf3, 0x8c, 0x19, 0x86, 0x2f, 0x00, 0xb2, 0xd5, 0x61, 0x10, 0x00, 0xca, 0x03, 0x36, 0x1e, 0x87, 0xc2, 0xad, 0x14, 0x72, 0x69, 0x0c, 0x77, 0xa1, 0x92, 0x68,
0x09, 0xa7, 0x5e, 0xb8, 0xb3, 0x80, 0xa3, 0x03, 0x95, 0x11, 0x8f, 0x04, 0xbb, 0x12, 0x4e, 0x43, 0xc7, 0xdc, 0xaa, 0x72, 0x12, 0xcd, 0x3b, 0x99, 0x39, 0x98, 0xf1, 0x64, 0x46, 0x4e, 0xbf, 0xa6,
0x35, 0x36, 0xdf, 0xb6, 0xbf, 0x87, 0xda, 0x21, 0x4d, 0xbc, 0x6c, 0x7c, 0xf2, 0x0a, 0x9a, 0x0f, 0x03, 0xe1, 0x42, 0xcb, 0xec, 0x54, 0xb2, 0x8c, 0x29, 0x86, 0x1f, 0x03, 0xa4, 0xab, 0x9d, 0x30,
0x2a, 0xe8, 0x80, 0x7d, 0xc9, 0x05, 0x5b, 0xfc, 0x38, 0x24, 0x52, 0x30, 0x5c, 0x7a, 0x68, 0xb8, 0x12, 0x6e, 0xad, 0x50, 0xb3, 0x80, 0x63, 0x17, 0x9c, 0x01, 0x8b, 0x04, 0x3d, 0x17, 0x6e, 0x5d,
0xfd, 0xa7, 0x09, 0xb5, 0xd9, 0xbc, 0xe2, 0x53, 0x28, 0xcb, 0x33, 0x49, 0xea, 0x98, 0xad, 0x52, 0x0d, 0x36, 0xdb, 0xb6, 0xbf, 0x82, 0xea, 0x0e, 0xe1, 0x7e, 0x7a, 0x7c, 0x32, 0x07, 0xcd, 0x5b,
0xc7, 0x1e, 0xe8, 0x1d, 0x6e, 0x42, 0x75, 0xc2, 0x68, 0x12, 0xc9, 0x88, 0xa5, 0x22, 0xb3, 0x3d, 0x0e, 0xba, 0x60, 0x9f, 0x31, 0x41, 0x67, 0x6f, 0x89, 0x44, 0x0a, 0x0d, 0x97, 0x6e, 0x37, 0xdc,
0xbe, 0x84, 0xb5, 0x8c, 0x35, 0xe4, 0x53, 0xe1, 0xf3, 0x20, 0xf2, 0x9d, 0x92, 0xa2, 0x34, 0x33, 0xfe, 0xd3, 0x84, 0xea, 0xf4, 0xbc, 0xe2, 0xfb, 0x50, 0x96, 0xdf, 0xf0, 0xc4, 0x35, 0x5b, 0xa5,
0xf8, 0x1b, 0x8d, 0xe2, 0x73, 0x58, 0xcd, 0x0f, 0x0d, 0x23, 0xe9, 0xd4, 0x56, 0xb4, 0x46, 0x0e, 0x8e, 0xdd, 0xd7, 0x3b, 0xdc, 0x84, 0xca, 0x88, 0x12, 0x1e, 0xc9, 0x88, 0xa5, 0x22, 0xd3, 0x3d,
0x1e, 0xb3, 0x2b, 0x81, 0xcf, 0x01, 0xe8, 0x54, 0xf0, 0xe1, 0x84, 0xd1, 0x4b, 0xa6, 0x86, 0x21, 0x7e, 0x02, 0x4b, 0x29, 0xeb, 0x98, 0x4d, 0x44, 0xc0, 0xc2, 0x28, 0x70, 0x4b, 0x8a, 0xd2, 0x48,
0x2f, 0x68, 0x4d, 0xe2, 0x47, 0x12, 0x6e, 0xbf, 0x33, 0x01, 0xa4, 0xe8, 0xfd, 0x0b, 0x1a, 0xf9, 0xe1, 0x2f, 0x34, 0x8a, 0x1f, 0xc1, 0x62, 0xf6, 0xd1, 0x71, 0x24, 0x3b, 0xb5, 0x15, 0xad, 0x9e,
0x0c, 0x3f, 0xd7, 0x63, 0x6b, 0xa9, 0xb1, 0x7d, 0x5a, 0xfc, 0x0c, 0x33, 0xc6, 0x83, 0xc9, 0x7d, 0x81, 0xfb, 0xf4, 0x5c, 0xe0, 0x47, 0x00, 0x64, 0x22, 0xd8, 0xf1, 0x88, 0x92, 0x33, 0xaa, 0x0e,
0x09, 0x95, 0x88, 0x7b, 0x6c, 0x18, 0x78, 0xba, 0x28, 0x4d, 0x19, 0xbc, 0x7b, 0xff, 0xac, 0x7c, 0x43, 0x66, 0x68, 0x55, 0xe2, 0x7b, 0x12, 0x6e, 0xff, 0x6e, 0x02, 0x48, 0xd1, 0x5b, 0xa7, 0x24,
0xcc, 0x3d, 0xd6, 0x3b, 0x18, 0x94, 0x65, 0xb8, 0xe7, 0x15, 0xfb, 0x62, 0x2f, 0xf4, 0x05, 0x37, 0x0a, 0x28, 0x7e, 0xa6, 0x8f, 0xad, 0xa5, 0x8e, 0xed, 0xfd, 0xe2, 0x35, 0x4c, 0x19, 0xb7, 0x4e,
0xc1, 0x0a, 0x3c, 0xdd, 0x08, 0xd0, 0xa7, 0xad, 0xde, 0xc1, 0xc0, 0x0a, 0xbc, 0x76, 0x08, 0x64, 0xee, 0x13, 0x70, 0x22, 0xe6, 0xd3, 0xe3, 0xd0, 0xd7, 0xa6, 0x34, 0x64, 0xf0, 0xfa, 0xed, 0xc3,
0x7e, 0xf9, 0x49, 0x10, 0xf9, 0x93, 0xb9, 0x48, 0xf3, 0xbf, 0x88, 0xb4, 0x3e, 0x26, 0xb2, 0xfd, 0xf2, 0x3e, 0xf3, 0xe9, 0xee, 0x76, 0xbf, 0x2c, 0xc3, 0xbb, 0x7e, 0x71, 0x2e, 0xf6, 0xcc, 0x5c,
0x87, 0x09, 0x8d, 0x79, 0x9e, 0xb3, 0x2e, 0xee, 0x01, 0x88, 0x84, 0x46, 0x69, 0x20, 0x02, 0x1e, 0x70, 0x13, 0xac, 0xd0, 0xd7, 0x83, 0x00, 0xfd, 0xb5, 0xb5, 0xbb, 0xdd, 0xb7, 0x42, 0x3f, 0x7f,
0xe9, 0x1b, 0xb7, 0x1e, 0xb9, 0x71, 0xc6, 0xc9, 0x27, 0x72, 0x7e, 0x0a, 0xbf, 0x84, 0xca, 0x48, 0x3b, 0xc6, 0x80, 0x72, 0x15, 0x07, 0x61, 0x14, 0x8c, 0x72, 0xb5, 0xe6, 0xff, 0x51, 0x6b, 0xbd,
0xb1, 0xb2, 0x8e, 0x17, 0x9e, 0x94, 0x65, 0x6b, 0xf9, 0x17, 0xa6, 0xe9, 0xc5, 0x9a, 0x95, 0x16, 0x4f, 0x6d, 0xfb, 0x0f, 0x13, 0xea, 0x79, 0x9e, 0xa3, 0x2e, 0xde, 0x04, 0x10, 0x9c, 0x44, 0x49,
0x6a, 0xb6, 0x7d, 0x08, 0xb5, 0xd9, 0xbb, 0x8b, 0x6b, 0x50, 0x57, 0x9b, 0x63, 0x9e, 0x84, 0x74, 0x28, 0x42, 0x16, 0xe9, 0x8a, 0x0f, 0xee, 0xa8, 0x38, 0xe5, 0x64, 0x47, 0x33, 0xff, 0x0a, 0x7f,
0x42, 0x0c, 0x7c, 0x02, 0x6b, 0x0a, 0x98, 0xe7, 0x27, 0x26, 0xfe, 0x0f, 0xd6, 0x97, 0xc0, 0xb3, 0x06, 0xce, 0x40, 0xb1, 0xd2, 0xd1, 0x17, 0xde, 0x96, 0xf9, 0xd6, 0xb2, 0xab, 0xa6, 0xe9, 0x45,
0x2e, 0xb1, 0xb6, 0xff, 0xb2, 0xa0, 0x5e, 0x78, 0x96, 0x10, 0xa0, 0xdc, 0x4f, 0xfd, 0xc3, 0x69, 0xf3, 0x4a, 0x33, 0xe6, 0x65, 0x06, 0x3d, 0x5f, 0x7d, 0x03, 0xd5, 0xe9, 0x93, 0x8c, 0x97, 0xa0,
0x4c, 0x0c, 0xac, 0x43, 0xa5, 0x9f, 0xfa, 0x7b, 0x8c, 0x0a, 0x62, 0xea, 0xcd, 0x9b, 0x84, 0xc7, 0xa6, 0x36, 0xfb, 0x8c, 0x8f, 0xc9, 0x08, 0x19, 0xf8, 0x1e, 0x2c, 0x29, 0x20, 0x2f, 0x84, 0x4c,
0xc4, 0xd2, 0xac, 0xdd, 0x38, 0x26, 0x25, 0x6c, 0x02, 0x64, 0xeb, 0x01, 0x4b, 0x63, 0x62, 0x6b, 0xec, 0xc1, 0xf2, 0x1c, 0x78, 0xd4, 0x45, 0x56, 0xd3, 0xf9, 0x35, 0x4d, 0xd9, 0x74, 0x7e, 0x4e,
0xe2, 0x19, 0x17, 0x8c, 0xac, 0x48, 0x6d, 0x7a, 0xa3, 0xa2, 0x65, 0x1d, 0x95, 0x4f, 0x00, 0xa9, 0xcd, 0x5f, 0xfd, 0xdb, 0x82, 0x5a, 0xe1, 0xe9, 0xc2, 0x00, 0xe5, 0x5e, 0x12, 0xec, 0x4c, 0x62,
0x20, 0x81, 0x86, 0xbc, 0x8c, 0xd1, 0x44, 0x9c, 0xcb, 0x5b, 0xaa, 0xb8, 0x01, 0xa4, 0x88, 0xa8, 0x64, 0xe0, 0x1a, 0x38, 0xbd, 0x24, 0xd8, 0xa4, 0x44, 0x20, 0x53, 0x6f, 0x5e, 0x71, 0x16, 0x23,
0x43, 0x35, 0x44, 0x68, 0xf6, 0x53, 0xff, 0x6d, 0x94, 0x30, 0x3a, 0xba, 0xa0, 0xe7, 0x13, 0x46, 0x4b, 0xb3, 0x36, 0xe2, 0x18, 0x95, 0x70, 0x03, 0x20, 0x5d, 0xf7, 0x69, 0x12, 0x23, 0x5b, 0x13,
0x00, 0xd7, 0x61, 0x55, 0x27, 0x92, 0x5f, 0xdc, 0x34, 0x25, 0x75, 0x4d, 0xdb, 0xbf, 0x60, 0xa3, 0x8f, 0x98, 0xa0, 0x68, 0x41, 0xaa, 0xd5, 0x1b, 0x15, 0x2d, 0xeb, 0xa8, 0x7c, 0x26, 0x90, 0x83,
0x1f, 0xbf, 0x9d, 0xf2, 0x64, 0x1a, 0x92, 0x86, 0xb4, 0xdd, 0x4f, 0x7d, 0xd5, 0xa0, 0x31, 0x4b, 0x11, 0xd4, 0x65, 0x31, 0x4a, 0xb8, 0x38, 0x91, 0x55, 0x2a, 0x78, 0x05, 0x50, 0x11, 0x51, 0x1f,
0x8e, 0x18, 0xf5, 0x58, 0x42, 0x56, 0xf5, 0xe9, 0xd3, 0x20, 0x64, 0x7c, 0x2a, 0x8e, 0xf9, 0x4f, 0x55, 0x31, 0x86, 0x46, 0x2f, 0x09, 0x5e, 0x47, 0x9c, 0x92, 0xc1, 0x29, 0x39, 0x19, 0x51, 0x04,
0xa4, 0xa9, 0xc5, 0x0c, 0x18, 0xf5, 0xd4, 0xff, 0x8e, 0xac, 0x69, 0x31, 0x33, 0x44, 0x89, 0x21, 0x78, 0x19, 0x16, 0x75, 0x22, 0x79, 0x2b, 0x27, 0x09, 0xaa, 0x69, 0xda, 0xd6, 0x29, 0x1d, 0x7c,
0xda, 0xef, 0x9b, 0x84, 0x29, 0x8b, 0xeb, 0xfa, 0x56, 0xbd, 0x57, 0x1c, 0xdc, 0xfe, 0xd5, 0x84, 0xf3, 0xe5, 0x84, 0xf1, 0xc9, 0x18, 0xd5, 0xf1, 0x07, 0xb0, 0xdc, 0x4b, 0x02, 0x35, 0xbb, 0x21,
0x8d, 0xc7, 0xc6, 0x03, 0xb7, 0xc0, 0x79, 0x0c, 0xdf, 0x9d, 0x0a, 0x4e, 0x0c, 0xfc, 0x04, 0xfe, 0xe5, 0x7b, 0x94, 0xf8, 0x94, 0xa3, 0x45, 0xfd, 0xf5, 0x61, 0x38, 0xa6, 0x6c, 0x22, 0xf6, 0xd9,
0xff, 0x58, 0xf4, 0x6b, 0x1e, 0x44, 0xa2, 0x17, 0xc6, 0x93, 0x60, 0x14, 0xc8, 0x56, 0x7c, 0x8c, 0xb7, 0xa8, 0xa1, 0xc5, 0xf4, 0x29, 0xf1, 0xd5, 0xcf, 0x11, 0x2d, 0x69, 0x31, 0x53, 0x44, 0x89,
0xf6, 0xfa, 0x4a, 0xd3, 0xac, 0xed, 0x6b, 0x68, 0x2e, 0x7e, 0x14, 0xb2, 0x18, 0x73, 0x64, 0xd7, 0x41, 0xba, 0xdf, 0x57, 0x9c, 0xaa, 0x16, 0x97, 0x75, 0x55, 0xbd, 0x57, 0x1c, 0xbc, 0xfa, 0xa3,
0xf3, 0xe4, 0xf8, 0x13, 0x03, 0x9d, 0xa2, 0xd8, 0x01, 0x0b, 0xf9, 0x25, 0x53, 0x11, 0x73, 0x31, 0x09, 0x2b, 0x77, 0x9d, 0x1c, 0xfc, 0x00, 0xdc, 0xbb, 0xf0, 0x8d, 0x89, 0x60, 0xc8, 0xc0, 0x1f,
0xf2, 0x36, 0xf6, 0xa8, 0xc8, 0x22, 0xd6, 0xa2, 0x91, 0x5d, 0xcf, 0x3b, 0xca, 0xde, 0x1e, 0x15, 0xc1, 0x87, 0x77, 0x45, 0x3f, 0x67, 0x61, 0x24, 0x76, 0xc7, 0xf1, 0x28, 0x1c, 0x84, 0x72, 0x14,
0x2d, 0xed, 0xbd, 0xb8, 0xf9, 0xe0, 0x1a, 0xb7, 0x1f, 0x5c, 0xe3, 0xe6, 0xce, 0x35, 0x6f, 0xef, 0xef, 0xa3, 0xbd, 0x3c, 0xd7, 0x34, 0x2b, 0x9b, 0xf1, 0xf3, 0xd5, 0x0b, 0x68, 0xcc, 0x5e, 0x1c,
0x5c, 0xf3, 0x9f, 0x3b, 0xd7, 0xfc, 0xed, 0xde, 0x35, 0x7e, 0xbf, 0x77, 0x8d, 0xdb, 0x7b, 0xd7, 0xe9, 0x4a, 0x8e, 0x6c, 0xf8, 0xbe, 0xbc, 0x22, 0xc8, 0xc0, 0x6e, 0x51, 0x75, 0x9f, 0x8e, 0xd9,
0xf8, 0xfb, 0xde, 0x35, 0xfe, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xee, 0xe3, 0x39, 0x8b, 0xbb, 0x08, 0x19, 0x55, 0x11, 0x73, 0x36, 0xf2, 0x3a, 0xf6, 0x89, 0x48, 0x23, 0xd6, 0x6c, 0x47, 0x1b, 0xbe,
0x00, 0x00, 0xbf, 0x97, 0x3e, 0x54, 0x2a, 0x5a, 0xda, 0x7c, 0x7c, 0xf9, 0xce, 0x33, 0xae, 0xde, 0x79, 0xc6,
0xe5, 0xb5, 0x67, 0x5e, 0x5d, 0x7b, 0xe6, 0xbf, 0xd7, 0x9e, 0xf9, 0xd3, 0x8d, 0x67, 0xfc, 0x72,
0xe3, 0x19, 0x57, 0x37, 0x9e, 0xf1, 0xcf, 0x8d, 0x67, 0xfc, 0x17, 0x00, 0x00, 0xff, 0xff, 0x96,
0xae, 0xd0, 0x97, 0x14, 0x09, 0x00, 0x00,
} }
func (m *Entry) Marshal() (dAtA []byte, err error) { func (m *Entry) Marshal() (dAtA []byte, err error) {

View File

@ -2,6 +2,7 @@ syntax = "proto2";
package raftpb; package raftpb;
import "gogoproto/gogo.proto"; import "gogoproto/gogo.proto";
import "etcd/api/versionpb/version.proto";
option (gogoproto.marshaler_all) = true; option (gogoproto.marshaler_all) = true;
option (gogoproto.sizer_all) = true; option (gogoproto.sizer_all) = true;
@ -13,12 +14,16 @@ option (gogoproto.goproto_unrecognized_all) = false;
option (gogoproto.goproto_sizecache_all) = false; option (gogoproto.goproto_sizecache_all) = false;
enum EntryType { enum EntryType {
option (versionpb.etcd_version_enum) = "3.0";
EntryNormal = 0; EntryNormal = 0;
EntryConfChange = 1; // corresponds to pb.ConfChange EntryConfChange = 1; // corresponds to pb.ConfChange
EntryConfChangeV2 = 2; // corresponds to pb.ConfChangeV2 EntryConfChangeV2 = 2 [(versionpb.etcd_version_enum_value)="3.4"]; // corresponds to pb.ConfChangeV2
} }
message Entry { message Entry {
option (versionpb.etcd_version_msg) = "3.0";
optional uint64 Term = 2 [(gogoproto.nullable) = false]; // must be 64-bit aligned for atomic operations optional uint64 Term = 2 [(gogoproto.nullable) = false]; // must be 64-bit aligned for atomic operations
optional uint64 Index = 3 [(gogoproto.nullable) = false]; // must be 64-bit aligned for atomic operations optional uint64 Index = 3 [(gogoproto.nullable) = false]; // must be 64-bit aligned for atomic operations
optional EntryType Type = 1 [(gogoproto.nullable) = false]; optional EntryType Type = 1 [(gogoproto.nullable) = false];
@ -89,6 +94,7 @@ message HardState {
// ConfChangeTransition specifies the behavior of a configuration change with // ConfChangeTransition specifies the behavior of a configuration change with
// respect to joint consensus. // respect to joint consensus.
enum ConfChangeTransition { enum ConfChangeTransition {
option (versionpb.etcd_version_enum) = "3.4";
// Automatically use the simple protocol if possible, otherwise fall back // Automatically use the simple protocol if possible, otherwise fall back
// to ConfChangeJointImplicit. Most applications will want to use this. // to ConfChangeJointImplicit. Most applications will want to use this.
ConfChangeTransitionAuto = 0; ConfChangeTransitionAuto = 0;
@ -131,14 +137,16 @@ enum ConfChangeType {
} }
message ConfChange { message ConfChange {
option (versionpb.etcd_version_msg) = "3.0";
optional ConfChangeType type = 2 [(gogoproto.nullable) = false]; optional ConfChangeType type = 2 [(gogoproto.nullable) = false];
optional uint64 node_id = 3 [(gogoproto.nullable) = false, (gogoproto.customname) = "NodeID" ]; optional uint64 node_id = 3 [(gogoproto.nullable) = false, (gogoproto.customname) = "NodeID"];
optional bytes context = 4; optional bytes context = 4;
// NB: this is used only by etcd to thread through a unique identifier. // NB: this is used only by etcd to thread through a unique identifier.
// Ideally it should really use the Context instead. No counterpart to // Ideally it should really use the Context instead. No counterpart to
// this field exists in ConfChangeV2. // this field exists in ConfChangeV2.
optional uint64 id = 1 [(gogoproto.nullable) = false, (gogoproto.customname) = "ID" ]; optional uint64 id = 1 [(gogoproto.nullable) = false, (gogoproto.customname) = "ID"];
} }
// ConfChangeSingle is an individual configuration change operation. Multiple // ConfChangeSingle is an individual configuration change operation. Multiple
@ -181,6 +189,8 @@ message ConfChangeSingle {
// //
// [1]: https://github.com/ongardie/dissertation/blob/master/online-trim.pdf // [1]: https://github.com/ongardie/dissertation/blob/master/online-trim.pdf
message ConfChangeV2 { message ConfChangeV2 {
option (versionpb.etcd_version_msg) = "3.4";
optional ConfChangeTransition transition = 1 [(gogoproto.nullable) = false]; optional ConfChangeTransition transition = 1 [(gogoproto.nullable) = false];
repeated ConfChangeSingle changes = 2 [(gogoproto.nullable) = false]; repeated ConfChangeSingle changes = 2 [(gogoproto.nullable) = false];
optional bytes context = 3; optional bytes context = 3;

View File

@ -34,7 +34,7 @@ echo " - grpc-gateway-root: ${GRPC_GATEWAY_ROOT}"
GOGOPROTO_PATH="${GOGOPROTO_ROOT}:${GOGOPROTO_ROOT}/protobuf" GOGOPROTO_PATH="${GOGOPROTO_ROOT}:${GOGOPROTO_ROOT}/protobuf"
# directories containing protos to be built # directories containing protos to be built
DIRS="./server/wal/walpb ./api/etcdserverpb ./server/etcdserver/api/snap/snappb ./raft/raftpb ./api/mvccpb ./server/lease/leasepb ./api/authpb ./server/etcdserver/api/v3lock/v3lockpb ./server/etcdserver/api/v3election/v3electionpb ./api/membershippb ./tests/functional" DIRS="./server/wal/walpb ./api/etcdserverpb ./server/etcdserver/api/snap/snappb ./raft/raftpb ./api/mvccpb ./server/lease/leasepb ./api/authpb ./server/etcdserver/api/v3lock/v3lockpb ./server/etcdserver/api/v3election/v3electionpb ./api/membershippb ./tests/functional ./api/versionpb"
log_callout -e "\\nRunning gofast (gogo) proto generation..." log_callout -e "\\nRunning gofast (gogo) proto generation..."
@ -45,6 +45,7 @@ for dir in ${DIRS}; do
run sed -i.bak -E 's|"etcd/api/|"go.etcd.io/etcd/api/v3/|g' ./**/*.pb.go run sed -i.bak -E 's|"etcd/api/|"go.etcd.io/etcd/api/v3/|g' ./**/*.pb.go
run sed -i.bak -E 's|"raft/raftpb"|"go.etcd.io/etcd/raft/v3/raftpb"|g' ./**/*.pb.go run sed -i.bak -E 's|"raft/raftpb"|"go.etcd.io/etcd/raft/v3/raftpb"|g' ./**/*.pb.go
run sed -i.bak -E 's|"google/protobuf"|"github.com/gogo/protobuf/protoc-gen-gogo/descriptor"|g' ./**/*.pb.go
rm -f ./**/*.bak rm -f ./**/*.bak
run gofmt -s -w ./**/*.pb.go run gofmt -s -w ./**/*.pb.go

View File

@ -42,6 +42,7 @@ require (
golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba
google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c
google.golang.org/grpc v1.38.0 google.golang.org/grpc v1.38.0
google.golang.org/protobuf v1.26.0
gopkg.in/natefinch/lumberjack.v2 v2.0.0 gopkg.in/natefinch/lumberjack.v2 v2.0.0
sigs.k8s.io/yaml v1.2.0 sigs.k8s.io/yaml v1.2.0
) )

View File

@ -0,0 +1,158 @@
// Copyright 2021 The etcd Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package schema
import (
"fmt"
"strings"
"github.com/coreos/go-semver/semver"
"github.com/golang/protobuf/proto"
"google.golang.org/protobuf/reflect/protoreflect"
"google.golang.org/protobuf/types/descriptorpb"
"go.etcd.io/etcd/api/v3/etcdserverpb"
"go.etcd.io/etcd/pkg/v3/pbutil"
"go.etcd.io/etcd/raft/v3/raftpb"
"go.etcd.io/etcd/server/v3/storage/wal"
)
// MinimalStorageVersionFromWAL returns minimal etcd storage able to interpret provided WAL log,
// determined by looking at entries since the last snapshot and returning the highest
// etcd version annotation from used messages, fields, enums and their values.
func MinimalStorageVersionFromWAL(wal *wal.WAL) *semver.Version {
_, _, ents, err := wal.ReadAll()
if err != nil {
panic(err)
}
var maxVer *semver.Version
for _, ent := range ents {
maxVer = maxVersion(maxVer, etcdVersionFromEntry(ent))
}
return maxVer
}
func etcdVersionFromEntry(ent raftpb.Entry) *semver.Version {
msgVer := etcdVersionFromMessage(proto.MessageReflect(&ent))
dataVer := etcdVersionFromData(ent.Type, ent.Data)
return maxVersion(msgVer, dataVer)
}
func etcdVersionFromData(entryType raftpb.EntryType, data []byte) *semver.Version {
var msg protoreflect.Message
switch entryType {
case raftpb.EntryNormal:
var raftReq etcdserverpb.InternalRaftRequest
err := pbutil.Unmarshaler(&raftReq).Unmarshal(data)
if err != nil {
return nil
}
msg = proto.MessageReflect(&raftReq)
case raftpb.EntryConfChange:
var confChange raftpb.ConfChange
err := pbutil.Unmarshaler(&confChange).Unmarshal(data)
if err != nil {
return nil
}
msg = proto.MessageReflect(&confChange)
case raftpb.EntryConfChangeV2:
var confChange raftpb.ConfChangeV2
err := pbutil.Unmarshaler(&confChange).Unmarshal(data)
if err != nil {
return nil
}
msg = proto.MessageReflect(&confChange)
default:
panic("unhandled")
}
return etcdVersionFromMessage(msg)
}
func etcdVersionFromMessage(m protoreflect.Message) *semver.Version {
var maxVer *semver.Version
md := m.Descriptor()
opts := md.Options().(*descriptorpb.MessageOptions)
if opts != nil {
maxVer = maxVersion(maxVer, etcdVersionFromOptionsString(opts.String()))
}
m.Range(func(field protoreflect.FieldDescriptor, value protoreflect.Value) bool {
fd := md.Fields().Get(field.Index())
maxVer = maxVersion(maxVer, etcdVersionFromField(fd))
switch m := value.Interface().(type) {
case protoreflect.Message:
maxVer = maxVersion(maxVer, etcdVersionFromMessage(m))
case protoreflect.EnumNumber:
maxVer = maxVersion(maxVer, etcdVersionFromEnum(field.Enum(), m))
}
return true
})
return maxVer
}
func etcdVersionFromEnum(enum protoreflect.EnumDescriptor, value protoreflect.EnumNumber) *semver.Version {
var maxVer *semver.Version
enumOpts := enum.Options().(*descriptorpb.EnumOptions)
if enumOpts != nil {
maxVer = maxVersion(maxVer, etcdVersionFromOptionsString(enumOpts.String()))
}
valueDesc := enum.Values().Get(int(value))
valueOpts := valueDesc.Options().(*descriptorpb.EnumValueOptions)
if valueOpts != nil {
maxVer = maxVersion(maxVer, etcdVersionFromOptionsString(valueOpts.String()))
}
return maxVer
}
func maxVersion(a *semver.Version, b *semver.Version) *semver.Version {
if a != nil && (b == nil || b.LessThan(*a)) {
return a
}
return b
}
func etcdVersionFromField(fd protoreflect.FieldDescriptor) *semver.Version {
opts := fd.Options().(*descriptorpb.FieldOptions)
if opts == nil {
return nil
}
return etcdVersionFromOptionsString(opts.String())
}
func etcdVersionFromOptionsString(opts string) *semver.Version {
// TODO: Use proto.GetExtention when gogo/protobuf is usable with protoreflect
msgs := []string{"[versionpb.etcd_version_msg]:", "[versionpb.etcd_version_field]:", "[versionpb.etcd_version_enum]:", "[versionpb.etcd_version_enum_value]:"}
var end, index int
for _, msg := range msgs {
index = strings.Index(opts, msg)
end = index + len(msg)
if index != -1 {
break
}
}
if index == -1 {
return nil
}
var verStr string
_, err := fmt.Sscanf(opts[end:], "%q", &verStr)
if err != nil {
return nil
}
ver, err := semver.NewVersion(verStr + ".0")
if err != nil {
panic(err)
}
return ver
}

View File

@ -0,0 +1,268 @@
// Copyright 2021 The etcd Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package schema
import (
"fmt"
"testing"
"github.com/coreos/go-semver/semver"
"github.com/golang/protobuf/proto"
"github.com/stretchr/testify/assert"
"go.etcd.io/etcd/api/v3/etcdserverpb"
"go.etcd.io/etcd/api/v3/membershippb"
"go.etcd.io/etcd/pkg/v3/pbutil"
"go.etcd.io/etcd/raft/v3/raftpb"
)
var (
V3_0 = semver.Version{Major: 3, Minor: 0}
V3_1 = semver.Version{Major: 3, Minor: 1}
V3_3 = semver.Version{Major: 3, Minor: 3}
V3_4 = semver.Version{Major: 3, Minor: 4}
)
func TestEtcdVersionFromEntry(t *testing.T) {
raftReq := etcdserverpb.InternalRaftRequest{Header: &etcdserverpb.RequestHeader{AuthRevision: 1}}
normalRequestData := pbutil.MustMarshal(&raftReq)
confChange := raftpb.ConfChange{Type: raftpb.ConfChangeAddLearnerNode}
confChangeData := pbutil.MustMarshal(&confChange)
confChangeV2 := raftpb.ConfChangeV2{Transition: raftpb.ConfChangeTransitionJointExplicit}
confChangeV2Data := pbutil.MustMarshal(&confChangeV2)
tcs := []struct {
name string
input raftpb.Entry
expect *semver.Version
}{
{
name: "Using RequestHeader AuthRevision in NormalEntry implies v3.1",
input: raftpb.Entry{
Term: 1,
Index: 2,
Type: raftpb.EntryNormal,
Data: normalRequestData,
},
expect: &V3_1,
},
{
name: "Using ConfigChange implies v3.4",
input: raftpb.Entry{
Term: 1,
Index: 2,
Type: raftpb.EntryConfChange,
Data: confChangeData,
},
expect: &V3_0,
},
{
name: "Using ConfigChangeV2 implies v3.4",
input: raftpb.Entry{
Term: 1,
Index: 2,
Type: raftpb.EntryConfChangeV2,
Data: confChangeV2Data,
},
expect: &V3_4,
},
}
for _, tc := range tcs {
t.Run(tc.name, func(t *testing.T) {
ver := etcdVersionFromEntry(tc.input)
assert.Equal(t, tc.expect, ver)
})
}
}
func TestEtcdVersionFromMessage(t *testing.T) {
tcs := []struct {
name string
input proto.Message
expect *semver.Version
}{
{
name: "Empty RequestHeader impies v3.0",
input: &etcdserverpb.RequestHeader{},
expect: &V3_0,
},
{
name: "RequestHeader AuthRevision field set implies v3.5",
input: &etcdserverpb.RequestHeader{AuthRevision: 1},
expect: &V3_1,
},
{
name: "RequestHeader Username set implies v3.0",
input: &etcdserverpb.RequestHeader{Username: "Alice"},
expect: &V3_0,
},
{
name: "When two fields are set take higher version",
input: &etcdserverpb.RequestHeader{AuthRevision: 1, Username: "Alice"},
expect: &V3_1,
},
{
name: "Setting a RequestHeader AuthRevision in subfield implies v3.1",
input: &etcdserverpb.InternalRaftRequest{Header: &etcdserverpb.RequestHeader{AuthRevision: 1}},
expect: &V3_1,
},
{
name: "Setting a DowngradeInfoSetRequest implies v3.5",
input: &etcdserverpb.InternalRaftRequest{DowngradeInfoSet: &membershippb.DowngradeInfoSetRequest{}},
expect: &V3_5,
},
{
name: "Enum CompareResult set to EQUAL implies v3.0",
input: &etcdserverpb.Compare{Result: etcdserverpb.Compare_EQUAL},
expect: &V3_0,
},
{
name: "Enum CompareResult set to NOT_EQUAL implies v3.1",
input: &etcdserverpb.Compare{Result: etcdserverpb.Compare_NOT_EQUAL},
expect: &V3_1,
},
{
name: "Oneof Compare version set implies v3.1",
input: &etcdserverpb.Compare{TargetUnion: &etcdserverpb.Compare_Version{}},
expect: &V3_0,
},
{
name: "Oneof Compare lease set implies v3.3",
input: &etcdserverpb.Compare{TargetUnion: &etcdserverpb.Compare_Lease{}},
expect: &V3_3,
},
}
for _, tc := range tcs {
t.Run(tc.name, func(t *testing.T) {
ver := etcdVersionFromMessage(proto.MessageReflect(tc.input))
assert.Equal(t, tc.expect, ver)
})
}
}
func TestEtcdVersionFromFieldOptionsString(t *testing.T) {
tcs := []struct {
input string
expect *semver.Version
}{
{
input: "65001:0",
},
{
input: `65001:0 65004:"NodeID"`,
},
{
input: `[versionpb.XXX]:"3.5"`,
},
{
input: `[versionpb.etcd_version_msg]:"3.5"`,
expect: &V3_5,
},
{
input: `[versionpb.etcd_version_enum]:"3.5"`,
expect: &V3_5,
},
{
input: `[versionpb.etcd_version_field]:"3.5"`,
expect: &V3_5,
},
{
input: `[versionpb.etcd_version_enum_value]:"3.5"`,
expect: &V3_5,
},
{
input: `65001:0 [versionpb.etcd_version_msg]:"3.5"`,
expect: &V3_5,
},
{
input: `65004:"NodeID" [versionpb.etcd_version_msg]:"3.5"`,
expect: &V3_5,
},
{
input: `65004:"NodeID" [versionpb.etcd_version_enum]:"3.5"`,
expect: &V3_5,
},
{
input: `[versionpb.other_field]:"NodeID" [versionpb.etcd_version_msg]:"3.5"`,
expect: &V3_5,
},
{
input: `[versionpb.etcd_version_msg]:"3.5" 65001:0`,
expect: &V3_5,
},
{
input: `[versionpb.etcd_version_msg]:"3.5" 65004:"NodeID"`,
expect: &V3_5,
},
{
input: `[versionpb.etcd_version_msg]:"3.5" [versionpb.other_field]:"NodeID"`,
expect: &V3_5,
},
{
input: `[versionpb.other_field]:"NodeID" [versionpb.etcd_version_msg]:"3.5" [versionpb.another_field]:"NodeID"`,
expect: &V3_5,
},
{
input: `65001:0 [versionpb.etcd_version_msg]:"3.5" 65001:0"`,
expect: &V3_5,
},
}
for _, tc := range tcs {
t.Run(tc.input, func(t *testing.T) {
ver := etcdVersionFromOptionsString(tc.input)
assert.Equal(t, ver, tc.expect)
})
}
}
func TestMaxVersion(t *testing.T) {
tcs := []struct {
a, b, expect *semver.Version
}{
{
a: nil,
b: nil,
expect: nil,
},
{
a: &V3_5,
b: nil,
expect: &V3_5,
},
{
a: nil,
b: &V3_5,
expect: &V3_5,
},
{
a: &V3_6,
b: &V3_5,
expect: &V3_6,
},
{
a: &V3_5,
b: &V3_6,
expect: &V3_6,
},
}
for _, tc := range tcs {
t.Run(fmt.Sprintf("%v %v %v", tc.a, tc.b, tc.expect), func(t *testing.T) {
got := maxVersion(tc.a, tc.b)
assert.Equal(t, got, tc.expect)
})
}
}

View File

@ -0,0 +1,69 @@
// Copyright 2021 The etcd Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package integration
import (
"context"
"testing"
"time"
"github.com/coreos/go-semver/semver"
"github.com/stretchr/testify/assert"
"go.uber.org/zap"
"go.etcd.io/etcd/client/pkg/v3/testutil"
clientv3 "go.etcd.io/etcd/client/v3"
"go.etcd.io/etcd/server/v3/embed"
"go.etcd.io/etcd/server/v3/storage/schema"
"go.etcd.io/etcd/server/v3/storage/wal"
"go.etcd.io/etcd/server/v3/storage/wal/walpb"
)
func TestEtcdVersionFromWAL(t *testing.T) {
testutil.SkipTestIfShortMode(t,
"Wal creation tests are depending on embedded etcServer so are integration-level tests.")
cfg := NewEmbedConfig(t, "default")
srv, err := embed.StartEtcd(cfg)
if err != nil {
t.Fatal(err)
}
select {
case <-srv.Server.ReadyNotify():
case <-time.After(3 * time.Second):
t.Fatalf("failed to start embed.Etcd for test")
}
ccfg := clientv3.Config{Endpoints: []string{cfg.ACUrls[0].String()}}
cli, err := NewClient(t, ccfg)
if err != nil {
srv.Close()
t.Fatal(err)
}
// Get auth status to increase etcd version of proto stored in wal
ctx, cancel := context.WithTimeout(context.Background(), testutil.RequestTimeout)
cli.AuthStatus(ctx)
cancel()
cli.Close()
srv.Close()
wal, err := wal.Open(zap.NewNop(), cfg.Dir+"/member/wal", walpb.Snapshot{})
if err != nil {
panic(err)
}
defer wal.Close()
ver := schema.MinimalStorageVersionFromWAL(wal)
assert.Equal(t, &semver.Version{Major: 3, Minor: 5}, ver)
}