From 0d2d2478f7fc88b9479e802b5b3c5b05c2ad823c Mon Sep 17 00:00:00 2001 From: Mark Phelps <209477+markphelps@users.noreply.github.com> Date: Mon, 6 Mar 2023 16:20:29 -0500 Subject: [PATCH 01/11] feat: wip namespace storage --- .../server/middleware/grpc/support_test.go | 30 + internal/server/support_test.go | 30 + internal/storage/sql/common/namespace.go | 32 + internal/storage/sql/common/storage.go | 7 + internal/storage/storage.go | 11 + rpc/flipt/flipt.pb.go | 2165 +++++++++-------- rpc/flipt/flipt.proto | 48 +- 7 files changed, 1308 insertions(+), 1015 deletions(-) create mode 100644 internal/storage/sql/common/namespace.go diff --git a/internal/server/middleware/grpc/support_test.go b/internal/server/middleware/grpc/support_test.go index e2bf23f55e..43b98a8628 100644 --- a/internal/server/middleware/grpc/support_test.go +++ b/internal/server/middleware/grpc/support_test.go @@ -19,6 +19,36 @@ func (m *storeMock) String() string { return "mock" } +func (s *storeMock) GetNamespace(ctx context.Context, key string) (*flipt.Namespace, error) { + args := s.Called(ctx, key) + return args.Get(0).(*flipt.Namespace), args.Error(1) +} + +func (s *storeMock) ListNamespaces(ctx context.Context, opts ...storage.QueryOption) (storage.ResultSet[*flipt.Namespace], error) { + args := s.Called(ctx, opts) + return args.Get(0).(storage.ResultSet[*flipt.Namespace]), args.Error(1) +} + +func (s *storeMock) CountNamespaces(ctx context.Context) (uint64, error) { + args := s.Called(ctx) + return args.Get(0).(uint64), args.Error(1) +} + +func (s *storeMock) CreateNamespace(ctx context.Context, r *flipt.CreateNamespaceRequest) (*flipt.Namespace, error) { + args := s.Called(ctx, r) + return args.Get(0).(*flipt.Namespace), args.Error(1) +} + +func (s *storeMock) UpdateNamespace(ctx context.Context, r *flipt.UpdateNamespaceRequest) (*flipt.Namespace, error) { + args := s.Called(ctx, r) + return args.Get(0).(*flipt.Namespace), args.Error(1) +} + +func (s *storeMock) DeleteNamespace(ctx context.Context, r *flipt.DeleteNamespaceRequest) error { + args := s.Called(ctx, r) + return args.Error(0) +} + func (m *storeMock) GetFlag(ctx context.Context, namespaceKey string, key string) (*flipt.Flag, error) { args := m.Called(ctx, namespaceKey, key) return args.Get(0).(*flipt.Flag), args.Error(1) diff --git a/internal/server/support_test.go b/internal/server/support_test.go index 5fbfc712f0..2bc4af6a53 100644 --- a/internal/server/support_test.go +++ b/internal/server/support_test.go @@ -18,6 +18,36 @@ func (m *storeMock) String() string { return "mock" } +func (s *storeMock) GetNamespace(ctx context.Context, key string) (*flipt.Namespace, error) { + args := s.Called(ctx, key) + return args.Get(0).(*flipt.Namespace), args.Error(1) +} + +func (s *storeMock) ListNamespaces(ctx context.Context, opts ...storage.QueryOption) (storage.ResultSet[*flipt.Namespace], error) { + args := s.Called(ctx, opts) + return args.Get(0).(storage.ResultSet[*flipt.Namespace]), args.Error(1) +} + +func (s *storeMock) CountNamespaces(ctx context.Context) (uint64, error) { + args := s.Called(ctx) + return args.Get(0).(uint64), args.Error(1) +} + +func (s *storeMock) CreateNamespace(ctx context.Context, r *flipt.CreateNamespaceRequest) (*flipt.Namespace, error) { + args := s.Called(ctx, r) + return args.Get(0).(*flipt.Namespace), args.Error(1) +} + +func (s *storeMock) UpdateNamespace(ctx context.Context, r *flipt.UpdateNamespaceRequest) (*flipt.Namespace, error) { + args := s.Called(ctx, r) + return args.Get(0).(*flipt.Namespace), args.Error(1) +} + +func (s *storeMock) DeleteNamespace(ctx context.Context, r *flipt.DeleteNamespaceRequest) error { + args := s.Called(ctx, r) + return args.Error(0) +} + func (m *storeMock) GetFlag(ctx context.Context, namespaceKey, key string) (*flipt.Flag, error) { args := m.Called(ctx, namespaceKey, key) return args.Get(0).(*flipt.Flag), args.Error(1) diff --git a/internal/storage/sql/common/namespace.go b/internal/storage/sql/common/namespace.go new file mode 100644 index 0000000000..e849eb35cd --- /dev/null +++ b/internal/storage/sql/common/namespace.go @@ -0,0 +1,32 @@ +package common + +import ( + "context" + + "go.flipt.io/flipt/internal/storage" + flipt "go.flipt.io/flipt/rpc/flipt" +) + +func (s *Store) GetNamespace(ctx context.Context, key string) (*flipt.Namespace, error) { + panic("not implemented") +} + +func (s *Store) ListNamespaces(ctx context.Context, opts ...storage.QueryOption) (storage.ResultSet[*flipt.Namespace], error) { + panic("not implemented") +} + +func (s *Store) CountNamespaces(ctx context.Context) (uint64, error) { + panic("not implemented") +} + +func (s *Store) CreateNamespace(ctx context.Context, r *flipt.CreateNamespaceRequest) (*flipt.Namespace, error) { + panic("not implemented") +} + +func (s *Store) UpdateNamespace(ctx context.Context, r *flipt.UpdateNamespaceRequest) (*flipt.Namespace, error) { + panic("not implemented") +} + +func (s *Store) DeleteNamespace(ctx context.Context, r *flipt.DeleteNamespaceRequest) error { + panic("not implemented") +} diff --git a/internal/storage/sql/common/storage.go b/internal/storage/sql/common/storage.go index cb783411d9..b7bf37745c 100644 --- a/internal/storage/sql/common/storage.go +++ b/internal/storage/sql/common/storage.go @@ -4,9 +4,12 @@ import ( "database/sql" sq "github.com/Masterminds/squirrel" + "go.flipt.io/flipt/internal/storage" "go.uber.org/zap" ) +var _ storage.Store = &Store{} + type Store struct { builder sq.StatementBuilderType db *sql.DB @@ -25,3 +28,7 @@ type PageToken struct { Key string `json:"key,omitempty"` Offset uint64 `json:"offset,omitempty"` } + +func (s *Store) String() string { + return "" +} diff --git a/internal/storage/storage.go b/internal/storage/storage.go index a67d0d06cb..915bffc569 100644 --- a/internal/storage/storage.go +++ b/internal/storage/storage.go @@ -114,6 +114,7 @@ type Store interface { RuleStore SegmentStore EvaluationStore + NamespaceStore fmt.Stringer } @@ -132,6 +133,16 @@ type EvaluationStore interface { GetEvaluationDistributions(ctx context.Context, ruleID string) ([]*EvaluationDistribution, error) } +// NamespaceStore stores and retrieves namespaces +type NamespaceStore interface { + GetNamespace(ctx context.Context, key string) (*flipt.Namespace, error) + ListNamespaces(ctx context.Context, opts ...QueryOption) (ResultSet[*flipt.Namespace], error) + CountNamespaces(ctx context.Context) (uint64, error) + CreateNamespace(ctx context.Context, r *flipt.CreateNamespaceRequest) (*flipt.Namespace, error) + UpdateNamespace(ctx context.Context, r *flipt.UpdateNamespaceRequest) (*flipt.Namespace, error) + DeleteNamespace(ctx context.Context, r *flipt.DeleteNamespaceRequest) error +} + // FlagStore stores and retrieves flags and variants type FlagStore interface { GetFlag(ctx context.Context, namespaceKey, key string) (*flipt.Flag, error) diff --git a/rpc/flipt/flipt.pb.go b/rpc/flipt/flipt.pb.go index 3695cff402..e98bda8f0b 100644 --- a/rpc/flipt/flipt.pb.go +++ b/rpc/flipt/flipt.pb.go @@ -603,109 +603,6 @@ func (x *Namespace) GetUpdatedAt() *timestamppb.Timestamp { return nil } -type Flag struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` - Enabled bool `protobuf:"varint,4,opt,name=enabled,proto3" json:"enabled,omitempty"` - CreatedAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` - UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` - Variants []*Variant `protobuf:"bytes,7,rep,name=variants,proto3" json:"variants,omitempty"` - NamespaceKey string `protobuf:"bytes,8,opt,name=namespace_key,json=namespaceKey,proto3" json:"namespace_key,omitempty"` -} - -func (x *Flag) Reset() { - *x = Flag{} - if protoimpl.UnsafeEnabled { - mi := &file_flipt_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Flag) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Flag) ProtoMessage() {} - -func (x *Flag) ProtoReflect() protoreflect.Message { - mi := &file_flipt_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Flag.ProtoReflect.Descriptor instead. -func (*Flag) Descriptor() ([]byte, []int) { - return file_flipt_proto_rawDescGZIP(), []int{5} -} - -func (x *Flag) GetKey() string { - if x != nil { - return x.Key - } - return "" -} - -func (x *Flag) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *Flag) GetDescription() string { - if x != nil { - return x.Description - } - return "" -} - -func (x *Flag) GetEnabled() bool { - if x != nil { - return x.Enabled - } - return false -} - -func (x *Flag) GetCreatedAt() *timestamppb.Timestamp { - if x != nil { - return x.CreatedAt - } - return nil -} - -func (x *Flag) GetUpdatedAt() *timestamppb.Timestamp { - if x != nil { - return x.UpdatedAt - } - return nil -} - -func (x *Flag) GetVariants() []*Variant { - if x != nil { - return x.Variants - } - return nil -} - -func (x *Flag) GetNamespaceKey() string { - if x != nil { - return x.NamespaceKey - } - return "" -} - type NamespaceList struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -719,7 +616,7 @@ type NamespaceList struct { func (x *NamespaceList) Reset() { *x = NamespaceList{} if protoimpl.UnsafeEnabled { - mi := &file_flipt_proto_msgTypes[6] + mi := &file_flipt_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -732,7 +629,7 @@ func (x *NamespaceList) String() string { func (*NamespaceList) ProtoMessage() {} func (x *NamespaceList) ProtoReflect() protoreflect.Message { - mi := &file_flipt_proto_msgTypes[6] + mi := &file_flipt_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -745,7 +642,7 @@ func (x *NamespaceList) ProtoReflect() protoreflect.Message { // Deprecated: Use NamespaceList.ProtoReflect.Descriptor instead. func (*NamespaceList) Descriptor() ([]byte, []int) { - return file_flipt_proto_rawDescGZIP(), []int{6} + return file_flipt_proto_rawDescGZIP(), []int{5} } func (x *NamespaceList) GetNamespaces() []*Namespace { @@ -780,7 +677,7 @@ type GetNamespaceRequest struct { func (x *GetNamespaceRequest) Reset() { *x = GetNamespaceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_flipt_proto_msgTypes[7] + mi := &file_flipt_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -793,7 +690,7 @@ func (x *GetNamespaceRequest) String() string { func (*GetNamespaceRequest) ProtoMessage() {} func (x *GetNamespaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_flipt_proto_msgTypes[7] + mi := &file_flipt_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -806,7 +703,7 @@ func (x *GetNamespaceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetNamespaceRequest.ProtoReflect.Descriptor instead. func (*GetNamespaceRequest) Descriptor() ([]byte, []int) { - return file_flipt_proto_rawDescGZIP(), []int{7} + return file_flipt_proto_rawDescGZIP(), []int{6} } func (x *GetNamespaceRequest) GetKey() string { @@ -830,7 +727,7 @@ type ListNamespaceRequest struct { func (x *ListNamespaceRequest) Reset() { *x = ListNamespaceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_flipt_proto_msgTypes[8] + mi := &file_flipt_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -843,7 +740,7 @@ func (x *ListNamespaceRequest) String() string { func (*ListNamespaceRequest) ProtoMessage() {} func (x *ListNamespaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_flipt_proto_msgTypes[8] + mi := &file_flipt_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -856,7 +753,7 @@ func (x *ListNamespaceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListNamespaceRequest.ProtoReflect.Descriptor instead. func (*ListNamespaceRequest) Descriptor() ([]byte, []int) { - return file_flipt_proto_rawDescGZIP(), []int{8} + return file_flipt_proto_rawDescGZIP(), []int{7} } func (x *ListNamespaceRequest) GetLimit() int32 { @@ -895,7 +792,7 @@ type CreateNamespaceRequest struct { func (x *CreateNamespaceRequest) Reset() { *x = CreateNamespaceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_flipt_proto_msgTypes[9] + mi := &file_flipt_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -908,7 +805,7 @@ func (x *CreateNamespaceRequest) String() string { func (*CreateNamespaceRequest) ProtoMessage() {} func (x *CreateNamespaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_flipt_proto_msgTypes[9] + mi := &file_flipt_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -921,7 +818,7 @@ func (x *CreateNamespaceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateNamespaceRequest.ProtoReflect.Descriptor instead. func (*CreateNamespaceRequest) Descriptor() ([]byte, []int) { - return file_flipt_proto_rawDescGZIP(), []int{9} + return file_flipt_proto_rawDescGZIP(), []int{8} } func (x *CreateNamespaceRequest) GetKey() string { @@ -952,6 +849,227 @@ func (x *CreateNamespaceRequest) GetProtected() bool { return false } +type UpdateNamespaceRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + Protected bool `protobuf:"varint,4,opt,name=protected,proto3" json:"protected,omitempty"` +} + +func (x *UpdateNamespaceRequest) Reset() { + *x = UpdateNamespaceRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_flipt_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateNamespaceRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateNamespaceRequest) ProtoMessage() {} + +func (x *UpdateNamespaceRequest) ProtoReflect() protoreflect.Message { + mi := &file_flipt_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateNamespaceRequest.ProtoReflect.Descriptor instead. +func (*UpdateNamespaceRequest) Descriptor() ([]byte, []int) { + return file_flipt_proto_rawDescGZIP(), []int{9} +} + +func (x *UpdateNamespaceRequest) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *UpdateNamespaceRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *UpdateNamespaceRequest) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *UpdateNamespaceRequest) GetProtected() bool { + if x != nil { + return x.Protected + } + return false +} + +type DeleteNamespaceRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` +} + +func (x *DeleteNamespaceRequest) Reset() { + *x = DeleteNamespaceRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_flipt_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteNamespaceRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteNamespaceRequest) ProtoMessage() {} + +func (x *DeleteNamespaceRequest) ProtoReflect() protoreflect.Message { + mi := &file_flipt_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteNamespaceRequest.ProtoReflect.Descriptor instead. +func (*DeleteNamespaceRequest) Descriptor() ([]byte, []int) { + return file_flipt_proto_rawDescGZIP(), []int{10} +} + +func (x *DeleteNamespaceRequest) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +type Flag struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + Enabled bool `protobuf:"varint,4,opt,name=enabled,proto3" json:"enabled,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + Variants []*Variant `protobuf:"bytes,7,rep,name=variants,proto3" json:"variants,omitempty"` + NamespaceKey string `protobuf:"bytes,8,opt,name=namespace_key,json=namespaceKey,proto3" json:"namespace_key,omitempty"` +} + +func (x *Flag) Reset() { + *x = Flag{} + if protoimpl.UnsafeEnabled { + mi := &file_flipt_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Flag) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Flag) ProtoMessage() {} + +func (x *Flag) ProtoReflect() protoreflect.Message { + mi := &file_flipt_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Flag.ProtoReflect.Descriptor instead. +func (*Flag) Descriptor() ([]byte, []int) { + return file_flipt_proto_rawDescGZIP(), []int{11} +} + +func (x *Flag) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *Flag) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Flag) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Flag) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *Flag) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt + } + return nil +} + +func (x *Flag) GetUpdatedAt() *timestamppb.Timestamp { + if x != nil { + return x.UpdatedAt + } + return nil +} + +func (x *Flag) GetVariants() []*Variant { + if x != nil { + return x.Variants + } + return nil +} + +func (x *Flag) GetNamespaceKey() string { + if x != nil { + return x.NamespaceKey + } + return "" +} + type FlagList struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -965,7 +1083,7 @@ type FlagList struct { func (x *FlagList) Reset() { *x = FlagList{} if protoimpl.UnsafeEnabled { - mi := &file_flipt_proto_msgTypes[10] + mi := &file_flipt_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -978,7 +1096,7 @@ func (x *FlagList) String() string { func (*FlagList) ProtoMessage() {} func (x *FlagList) ProtoReflect() protoreflect.Message { - mi := &file_flipt_proto_msgTypes[10] + mi := &file_flipt_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -991,7 +1109,7 @@ func (x *FlagList) ProtoReflect() protoreflect.Message { // Deprecated: Use FlagList.ProtoReflect.Descriptor instead. func (*FlagList) Descriptor() ([]byte, []int) { - return file_flipt_proto_rawDescGZIP(), []int{10} + return file_flipt_proto_rawDescGZIP(), []int{12} } func (x *FlagList) GetFlags() []*Flag { @@ -1027,7 +1145,7 @@ type GetFlagRequest struct { func (x *GetFlagRequest) Reset() { *x = GetFlagRequest{} if protoimpl.UnsafeEnabled { - mi := &file_flipt_proto_msgTypes[11] + mi := &file_flipt_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1040,7 +1158,7 @@ func (x *GetFlagRequest) String() string { func (*GetFlagRequest) ProtoMessage() {} func (x *GetFlagRequest) ProtoReflect() protoreflect.Message { - mi := &file_flipt_proto_msgTypes[11] + mi := &file_flipt_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1053,7 +1171,7 @@ func (x *GetFlagRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetFlagRequest.ProtoReflect.Descriptor instead. func (*GetFlagRequest) Descriptor() ([]byte, []int) { - return file_flipt_proto_rawDescGZIP(), []int{11} + return file_flipt_proto_rawDescGZIP(), []int{13} } func (x *GetFlagRequest) GetKey() string { @@ -1085,7 +1203,7 @@ type ListFlagRequest struct { func (x *ListFlagRequest) Reset() { *x = ListFlagRequest{} if protoimpl.UnsafeEnabled { - mi := &file_flipt_proto_msgTypes[12] + mi := &file_flipt_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1098,7 +1216,7 @@ func (x *ListFlagRequest) String() string { func (*ListFlagRequest) ProtoMessage() {} func (x *ListFlagRequest) ProtoReflect() protoreflect.Message { - mi := &file_flipt_proto_msgTypes[12] + mi := &file_flipt_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1111,7 +1229,7 @@ func (x *ListFlagRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListFlagRequest.ProtoReflect.Descriptor instead. func (*ListFlagRequest) Descriptor() ([]byte, []int) { - return file_flipt_proto_rawDescGZIP(), []int{12} + return file_flipt_proto_rawDescGZIP(), []int{14} } func (x *ListFlagRequest) GetLimit() int32 { @@ -1158,7 +1276,7 @@ type CreateFlagRequest struct { func (x *CreateFlagRequest) Reset() { *x = CreateFlagRequest{} if protoimpl.UnsafeEnabled { - mi := &file_flipt_proto_msgTypes[13] + mi := &file_flipt_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1171,7 +1289,7 @@ func (x *CreateFlagRequest) String() string { func (*CreateFlagRequest) ProtoMessage() {} func (x *CreateFlagRequest) ProtoReflect() protoreflect.Message { - mi := &file_flipt_proto_msgTypes[13] + mi := &file_flipt_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1184,7 +1302,7 @@ func (x *CreateFlagRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateFlagRequest.ProtoReflect.Descriptor instead. func (*CreateFlagRequest) Descriptor() ([]byte, []int) { - return file_flipt_proto_rawDescGZIP(), []int{13} + return file_flipt_proto_rawDescGZIP(), []int{15} } func (x *CreateFlagRequest) GetKey() string { @@ -1237,7 +1355,7 @@ type UpdateFlagRequest struct { func (x *UpdateFlagRequest) Reset() { *x = UpdateFlagRequest{} if protoimpl.UnsafeEnabled { - mi := &file_flipt_proto_msgTypes[14] + mi := &file_flipt_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1250,7 +1368,7 @@ func (x *UpdateFlagRequest) String() string { func (*UpdateFlagRequest) ProtoMessage() {} func (x *UpdateFlagRequest) ProtoReflect() protoreflect.Message { - mi := &file_flipt_proto_msgTypes[14] + mi := &file_flipt_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1263,7 +1381,7 @@ func (x *UpdateFlagRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateFlagRequest.ProtoReflect.Descriptor instead. func (*UpdateFlagRequest) Descriptor() ([]byte, []int) { - return file_flipt_proto_rawDescGZIP(), []int{14} + return file_flipt_proto_rawDescGZIP(), []int{16} } func (x *UpdateFlagRequest) GetKey() string { @@ -1313,7 +1431,7 @@ type DeleteFlagRequest struct { func (x *DeleteFlagRequest) Reset() { *x = DeleteFlagRequest{} if protoimpl.UnsafeEnabled { - mi := &file_flipt_proto_msgTypes[15] + mi := &file_flipt_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1326,7 +1444,7 @@ func (x *DeleteFlagRequest) String() string { func (*DeleteFlagRequest) ProtoMessage() {} func (x *DeleteFlagRequest) ProtoReflect() protoreflect.Message { - mi := &file_flipt_proto_msgTypes[15] + mi := &file_flipt_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1339,7 +1457,7 @@ func (x *DeleteFlagRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteFlagRequest.ProtoReflect.Descriptor instead. func (*DeleteFlagRequest) Descriptor() ([]byte, []int) { - return file_flipt_proto_rawDescGZIP(), []int{15} + return file_flipt_proto_rawDescGZIP(), []int{17} } func (x *DeleteFlagRequest) GetKey() string { @@ -1375,7 +1493,7 @@ type Variant struct { func (x *Variant) Reset() { *x = Variant{} if protoimpl.UnsafeEnabled { - mi := &file_flipt_proto_msgTypes[16] + mi := &file_flipt_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1388,7 +1506,7 @@ func (x *Variant) String() string { func (*Variant) ProtoMessage() {} func (x *Variant) ProtoReflect() protoreflect.Message { - mi := &file_flipt_proto_msgTypes[16] + mi := &file_flipt_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1401,7 +1519,7 @@ func (x *Variant) ProtoReflect() protoreflect.Message { // Deprecated: Use Variant.ProtoReflect.Descriptor instead. func (*Variant) Descriptor() ([]byte, []int) { - return file_flipt_proto_rawDescGZIP(), []int{16} + return file_flipt_proto_rawDescGZIP(), []int{18} } func (x *Variant) GetId() string { @@ -1483,7 +1601,7 @@ type CreateVariantRequest struct { func (x *CreateVariantRequest) Reset() { *x = CreateVariantRequest{} if protoimpl.UnsafeEnabled { - mi := &file_flipt_proto_msgTypes[17] + mi := &file_flipt_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1496,7 +1614,7 @@ func (x *CreateVariantRequest) String() string { func (*CreateVariantRequest) ProtoMessage() {} func (x *CreateVariantRequest) ProtoReflect() protoreflect.Message { - mi := &file_flipt_proto_msgTypes[17] + mi := &file_flipt_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1509,7 +1627,7 @@ func (x *CreateVariantRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateVariantRequest.ProtoReflect.Descriptor instead. func (*CreateVariantRequest) Descriptor() ([]byte, []int) { - return file_flipt_proto_rawDescGZIP(), []int{17} + return file_flipt_proto_rawDescGZIP(), []int{19} } func (x *CreateVariantRequest) GetFlagKey() string { @@ -1571,7 +1689,7 @@ type UpdateVariantRequest struct { func (x *UpdateVariantRequest) Reset() { *x = UpdateVariantRequest{} if protoimpl.UnsafeEnabled { - mi := &file_flipt_proto_msgTypes[18] + mi := &file_flipt_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1584,7 +1702,7 @@ func (x *UpdateVariantRequest) String() string { func (*UpdateVariantRequest) ProtoMessage() {} func (x *UpdateVariantRequest) ProtoReflect() protoreflect.Message { - mi := &file_flipt_proto_msgTypes[18] + mi := &file_flipt_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1597,7 +1715,7 @@ func (x *UpdateVariantRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateVariantRequest.ProtoReflect.Descriptor instead. func (*UpdateVariantRequest) Descriptor() ([]byte, []int) { - return file_flipt_proto_rawDescGZIP(), []int{18} + return file_flipt_proto_rawDescGZIP(), []int{20} } func (x *UpdateVariantRequest) GetId() string { @@ -1662,7 +1780,7 @@ type DeleteVariantRequest struct { func (x *DeleteVariantRequest) Reset() { *x = DeleteVariantRequest{} if protoimpl.UnsafeEnabled { - mi := &file_flipt_proto_msgTypes[19] + mi := &file_flipt_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1675,7 +1793,7 @@ func (x *DeleteVariantRequest) String() string { func (*DeleteVariantRequest) ProtoMessage() {} func (x *DeleteVariantRequest) ProtoReflect() protoreflect.Message { - mi := &file_flipt_proto_msgTypes[19] + mi := &file_flipt_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1688,7 +1806,7 @@ func (x *DeleteVariantRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteVariantRequest.ProtoReflect.Descriptor instead. func (*DeleteVariantRequest) Descriptor() ([]byte, []int) { - return file_flipt_proto_rawDescGZIP(), []int{19} + return file_flipt_proto_rawDescGZIP(), []int{21} } func (x *DeleteVariantRequest) GetId() string { @@ -1730,7 +1848,7 @@ type Segment struct { func (x *Segment) Reset() { *x = Segment{} if protoimpl.UnsafeEnabled { - mi := &file_flipt_proto_msgTypes[20] + mi := &file_flipt_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1743,7 +1861,7 @@ func (x *Segment) String() string { func (*Segment) ProtoMessage() {} func (x *Segment) ProtoReflect() protoreflect.Message { - mi := &file_flipt_proto_msgTypes[20] + mi := &file_flipt_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1756,7 +1874,7 @@ func (x *Segment) ProtoReflect() protoreflect.Message { // Deprecated: Use Segment.ProtoReflect.Descriptor instead. func (*Segment) Descriptor() ([]byte, []int) { - return file_flipt_proto_rawDescGZIP(), []int{20} + return file_flipt_proto_rawDescGZIP(), []int{22} } func (x *Segment) GetKey() string { @@ -1828,7 +1946,7 @@ type SegmentList struct { func (x *SegmentList) Reset() { *x = SegmentList{} if protoimpl.UnsafeEnabled { - mi := &file_flipt_proto_msgTypes[21] + mi := &file_flipt_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1841,7 +1959,7 @@ func (x *SegmentList) String() string { func (*SegmentList) ProtoMessage() {} func (x *SegmentList) ProtoReflect() protoreflect.Message { - mi := &file_flipt_proto_msgTypes[21] + mi := &file_flipt_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1854,7 +1972,7 @@ func (x *SegmentList) ProtoReflect() protoreflect.Message { // Deprecated: Use SegmentList.ProtoReflect.Descriptor instead. func (*SegmentList) Descriptor() ([]byte, []int) { - return file_flipt_proto_rawDescGZIP(), []int{21} + return file_flipt_proto_rawDescGZIP(), []int{23} } func (x *SegmentList) GetSegments() []*Segment { @@ -1890,7 +2008,7 @@ type GetSegmentRequest struct { func (x *GetSegmentRequest) Reset() { *x = GetSegmentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_flipt_proto_msgTypes[22] + mi := &file_flipt_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1903,7 +2021,7 @@ func (x *GetSegmentRequest) String() string { func (*GetSegmentRequest) ProtoMessage() {} func (x *GetSegmentRequest) ProtoReflect() protoreflect.Message { - mi := &file_flipt_proto_msgTypes[22] + mi := &file_flipt_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1916,7 +2034,7 @@ func (x *GetSegmentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSegmentRequest.ProtoReflect.Descriptor instead. func (*GetSegmentRequest) Descriptor() ([]byte, []int) { - return file_flipt_proto_rawDescGZIP(), []int{22} + return file_flipt_proto_rawDescGZIP(), []int{24} } func (x *GetSegmentRequest) GetKey() string { @@ -1948,7 +2066,7 @@ type ListSegmentRequest struct { func (x *ListSegmentRequest) Reset() { *x = ListSegmentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_flipt_proto_msgTypes[23] + mi := &file_flipt_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1961,7 +2079,7 @@ func (x *ListSegmentRequest) String() string { func (*ListSegmentRequest) ProtoMessage() {} func (x *ListSegmentRequest) ProtoReflect() protoreflect.Message { - mi := &file_flipt_proto_msgTypes[23] + mi := &file_flipt_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1974,7 +2092,7 @@ func (x *ListSegmentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListSegmentRequest.ProtoReflect.Descriptor instead. func (*ListSegmentRequest) Descriptor() ([]byte, []int) { - return file_flipt_proto_rawDescGZIP(), []int{23} + return file_flipt_proto_rawDescGZIP(), []int{25} } func (x *ListSegmentRequest) GetLimit() int32 { @@ -2021,7 +2139,7 @@ type CreateSegmentRequest struct { func (x *CreateSegmentRequest) Reset() { *x = CreateSegmentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_flipt_proto_msgTypes[24] + mi := &file_flipt_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2034,7 +2152,7 @@ func (x *CreateSegmentRequest) String() string { func (*CreateSegmentRequest) ProtoMessage() {} func (x *CreateSegmentRequest) ProtoReflect() protoreflect.Message { - mi := &file_flipt_proto_msgTypes[24] + mi := &file_flipt_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2047,7 +2165,7 @@ func (x *CreateSegmentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateSegmentRequest.ProtoReflect.Descriptor instead. func (*CreateSegmentRequest) Descriptor() ([]byte, []int) { - return file_flipt_proto_rawDescGZIP(), []int{24} + return file_flipt_proto_rawDescGZIP(), []int{26} } func (x *CreateSegmentRequest) GetKey() string { @@ -2100,7 +2218,7 @@ type UpdateSegmentRequest struct { func (x *UpdateSegmentRequest) Reset() { *x = UpdateSegmentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_flipt_proto_msgTypes[25] + mi := &file_flipt_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2113,7 +2231,7 @@ func (x *UpdateSegmentRequest) String() string { func (*UpdateSegmentRequest) ProtoMessage() {} func (x *UpdateSegmentRequest) ProtoReflect() protoreflect.Message { - mi := &file_flipt_proto_msgTypes[25] + mi := &file_flipt_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2126,7 +2244,7 @@ func (x *UpdateSegmentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateSegmentRequest.ProtoReflect.Descriptor instead. func (*UpdateSegmentRequest) Descriptor() ([]byte, []int) { - return file_flipt_proto_rawDescGZIP(), []int{25} + return file_flipt_proto_rawDescGZIP(), []int{27} } func (x *UpdateSegmentRequest) GetKey() string { @@ -2176,7 +2294,7 @@ type DeleteSegmentRequest struct { func (x *DeleteSegmentRequest) Reset() { *x = DeleteSegmentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_flipt_proto_msgTypes[26] + mi := &file_flipt_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2189,7 +2307,7 @@ func (x *DeleteSegmentRequest) String() string { func (*DeleteSegmentRequest) ProtoMessage() {} func (x *DeleteSegmentRequest) ProtoReflect() protoreflect.Message { - mi := &file_flipt_proto_msgTypes[26] + mi := &file_flipt_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2202,7 +2320,7 @@ func (x *DeleteSegmentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteSegmentRequest.ProtoReflect.Descriptor instead. func (*DeleteSegmentRequest) Descriptor() ([]byte, []int) { - return file_flipt_proto_rawDescGZIP(), []int{26} + return file_flipt_proto_rawDescGZIP(), []int{28} } func (x *DeleteSegmentRequest) GetKey() string { @@ -2238,7 +2356,7 @@ type Constraint struct { func (x *Constraint) Reset() { *x = Constraint{} if protoimpl.UnsafeEnabled { - mi := &file_flipt_proto_msgTypes[27] + mi := &file_flipt_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2251,7 +2369,7 @@ func (x *Constraint) String() string { func (*Constraint) ProtoMessage() {} func (x *Constraint) ProtoReflect() protoreflect.Message { - mi := &file_flipt_proto_msgTypes[27] + mi := &file_flipt_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2264,7 +2382,7 @@ func (x *Constraint) ProtoReflect() protoreflect.Message { // Deprecated: Use Constraint.ProtoReflect.Descriptor instead. func (*Constraint) Descriptor() ([]byte, []int) { - return file_flipt_proto_rawDescGZIP(), []int{27} + return file_flipt_proto_rawDescGZIP(), []int{29} } func (x *Constraint) GetId() string { @@ -2346,7 +2464,7 @@ type CreateConstraintRequest struct { func (x *CreateConstraintRequest) Reset() { *x = CreateConstraintRequest{} if protoimpl.UnsafeEnabled { - mi := &file_flipt_proto_msgTypes[28] + mi := &file_flipt_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2359,7 +2477,7 @@ func (x *CreateConstraintRequest) String() string { func (*CreateConstraintRequest) ProtoMessage() {} func (x *CreateConstraintRequest) ProtoReflect() protoreflect.Message { - mi := &file_flipt_proto_msgTypes[28] + mi := &file_flipt_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2372,7 +2490,7 @@ func (x *CreateConstraintRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateConstraintRequest.ProtoReflect.Descriptor instead. func (*CreateConstraintRequest) Descriptor() ([]byte, []int) { - return file_flipt_proto_rawDescGZIP(), []int{28} + return file_flipt_proto_rawDescGZIP(), []int{30} } func (x *CreateConstraintRequest) GetSegmentKey() string { @@ -2434,7 +2552,7 @@ type UpdateConstraintRequest struct { func (x *UpdateConstraintRequest) Reset() { *x = UpdateConstraintRequest{} if protoimpl.UnsafeEnabled { - mi := &file_flipt_proto_msgTypes[29] + mi := &file_flipt_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2447,7 +2565,7 @@ func (x *UpdateConstraintRequest) String() string { func (*UpdateConstraintRequest) ProtoMessage() {} func (x *UpdateConstraintRequest) ProtoReflect() protoreflect.Message { - mi := &file_flipt_proto_msgTypes[29] + mi := &file_flipt_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2460,7 +2578,7 @@ func (x *UpdateConstraintRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateConstraintRequest.ProtoReflect.Descriptor instead. func (*UpdateConstraintRequest) Descriptor() ([]byte, []int) { - return file_flipt_proto_rawDescGZIP(), []int{29} + return file_flipt_proto_rawDescGZIP(), []int{31} } func (x *UpdateConstraintRequest) GetId() string { @@ -2525,7 +2643,7 @@ type DeleteConstraintRequest struct { func (x *DeleteConstraintRequest) Reset() { *x = DeleteConstraintRequest{} if protoimpl.UnsafeEnabled { - mi := &file_flipt_proto_msgTypes[30] + mi := &file_flipt_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2538,7 +2656,7 @@ func (x *DeleteConstraintRequest) String() string { func (*DeleteConstraintRequest) ProtoMessage() {} func (x *DeleteConstraintRequest) ProtoReflect() protoreflect.Message { - mi := &file_flipt_proto_msgTypes[30] + mi := &file_flipt_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2551,7 +2669,7 @@ func (x *DeleteConstraintRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteConstraintRequest.ProtoReflect.Descriptor instead. func (*DeleteConstraintRequest) Descriptor() ([]byte, []int) { - return file_flipt_proto_rawDescGZIP(), []int{30} + return file_flipt_proto_rawDescGZIP(), []int{32} } func (x *DeleteConstraintRequest) GetId() string { @@ -2593,7 +2711,7 @@ type Rule struct { func (x *Rule) Reset() { *x = Rule{} if protoimpl.UnsafeEnabled { - mi := &file_flipt_proto_msgTypes[31] + mi := &file_flipt_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2606,7 +2724,7 @@ func (x *Rule) String() string { func (*Rule) ProtoMessage() {} func (x *Rule) ProtoReflect() protoreflect.Message { - mi := &file_flipt_proto_msgTypes[31] + mi := &file_flipt_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2619,7 +2737,7 @@ func (x *Rule) ProtoReflect() protoreflect.Message { // Deprecated: Use Rule.ProtoReflect.Descriptor instead. func (*Rule) Descriptor() ([]byte, []int) { - return file_flipt_proto_rawDescGZIP(), []int{31} + return file_flipt_proto_rawDescGZIP(), []int{33} } func (x *Rule) GetId() string { @@ -2691,7 +2809,7 @@ type RuleList struct { func (x *RuleList) Reset() { *x = RuleList{} if protoimpl.UnsafeEnabled { - mi := &file_flipt_proto_msgTypes[32] + mi := &file_flipt_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2704,7 +2822,7 @@ func (x *RuleList) String() string { func (*RuleList) ProtoMessage() {} func (x *RuleList) ProtoReflect() protoreflect.Message { - mi := &file_flipt_proto_msgTypes[32] + mi := &file_flipt_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2717,7 +2835,7 @@ func (x *RuleList) ProtoReflect() protoreflect.Message { // Deprecated: Use RuleList.ProtoReflect.Descriptor instead. func (*RuleList) Descriptor() ([]byte, []int) { - return file_flipt_proto_rawDescGZIP(), []int{32} + return file_flipt_proto_rawDescGZIP(), []int{34} } func (x *RuleList) GetRules() []*Rule { @@ -2757,7 +2875,7 @@ type ListRuleRequest struct { func (x *ListRuleRequest) Reset() { *x = ListRuleRequest{} if protoimpl.UnsafeEnabled { - mi := &file_flipt_proto_msgTypes[33] + mi := &file_flipt_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2770,7 +2888,7 @@ func (x *ListRuleRequest) String() string { func (*ListRuleRequest) ProtoMessage() {} func (x *ListRuleRequest) ProtoReflect() protoreflect.Message { - mi := &file_flipt_proto_msgTypes[33] + mi := &file_flipt_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2783,7 +2901,7 @@ func (x *ListRuleRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRuleRequest.ProtoReflect.Descriptor instead. func (*ListRuleRequest) Descriptor() ([]byte, []int) { - return file_flipt_proto_rawDescGZIP(), []int{33} + return file_flipt_proto_rawDescGZIP(), []int{35} } func (x *ListRuleRequest) GetLimit() int32 { @@ -2835,7 +2953,7 @@ type GetRuleRequest struct { func (x *GetRuleRequest) Reset() { *x = GetRuleRequest{} if protoimpl.UnsafeEnabled { - mi := &file_flipt_proto_msgTypes[34] + mi := &file_flipt_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2848,7 +2966,7 @@ func (x *GetRuleRequest) String() string { func (*GetRuleRequest) ProtoMessage() {} func (x *GetRuleRequest) ProtoReflect() protoreflect.Message { - mi := &file_flipt_proto_msgTypes[34] + mi := &file_flipt_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2861,7 +2979,7 @@ func (x *GetRuleRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRuleRequest.ProtoReflect.Descriptor instead. func (*GetRuleRequest) Descriptor() ([]byte, []int) { - return file_flipt_proto_rawDescGZIP(), []int{34} + return file_flipt_proto_rawDescGZIP(), []int{36} } func (x *GetRuleRequest) GetId() string { @@ -2899,7 +3017,7 @@ type CreateRuleRequest struct { func (x *CreateRuleRequest) Reset() { *x = CreateRuleRequest{} if protoimpl.UnsafeEnabled { - mi := &file_flipt_proto_msgTypes[35] + mi := &file_flipt_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2912,7 +3030,7 @@ func (x *CreateRuleRequest) String() string { func (*CreateRuleRequest) ProtoMessage() {} func (x *CreateRuleRequest) ProtoReflect() protoreflect.Message { - mi := &file_flipt_proto_msgTypes[35] + mi := &file_flipt_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2925,7 +3043,7 @@ func (x *CreateRuleRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateRuleRequest.ProtoReflect.Descriptor instead. func (*CreateRuleRequest) Descriptor() ([]byte, []int) { - return file_flipt_proto_rawDescGZIP(), []int{35} + return file_flipt_proto_rawDescGZIP(), []int{37} } func (x *CreateRuleRequest) GetFlagKey() string { @@ -2970,7 +3088,7 @@ type UpdateRuleRequest struct { func (x *UpdateRuleRequest) Reset() { *x = UpdateRuleRequest{} if protoimpl.UnsafeEnabled { - mi := &file_flipt_proto_msgTypes[36] + mi := &file_flipt_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2983,7 +3101,7 @@ func (x *UpdateRuleRequest) String() string { func (*UpdateRuleRequest) ProtoMessage() {} func (x *UpdateRuleRequest) ProtoReflect() protoreflect.Message { - mi := &file_flipt_proto_msgTypes[36] + mi := &file_flipt_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2996,7 +3114,7 @@ func (x *UpdateRuleRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateRuleRequest.ProtoReflect.Descriptor instead. func (*UpdateRuleRequest) Descriptor() ([]byte, []int) { - return file_flipt_proto_rawDescGZIP(), []int{36} + return file_flipt_proto_rawDescGZIP(), []int{38} } func (x *UpdateRuleRequest) GetId() string { @@ -3040,7 +3158,7 @@ type DeleteRuleRequest struct { func (x *DeleteRuleRequest) Reset() { *x = DeleteRuleRequest{} if protoimpl.UnsafeEnabled { - mi := &file_flipt_proto_msgTypes[37] + mi := &file_flipt_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3053,7 +3171,7 @@ func (x *DeleteRuleRequest) String() string { func (*DeleteRuleRequest) ProtoMessage() {} func (x *DeleteRuleRequest) ProtoReflect() protoreflect.Message { - mi := &file_flipt_proto_msgTypes[37] + mi := &file_flipt_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3066,7 +3184,7 @@ func (x *DeleteRuleRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteRuleRequest.ProtoReflect.Descriptor instead. func (*DeleteRuleRequest) Descriptor() ([]byte, []int) { - return file_flipt_proto_rawDescGZIP(), []int{37} + return file_flipt_proto_rawDescGZIP(), []int{39} } func (x *DeleteRuleRequest) GetId() string { @@ -3103,7 +3221,7 @@ type OrderRulesRequest struct { func (x *OrderRulesRequest) Reset() { *x = OrderRulesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_flipt_proto_msgTypes[38] + mi := &file_flipt_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3116,7 +3234,7 @@ func (x *OrderRulesRequest) String() string { func (*OrderRulesRequest) ProtoMessage() {} func (x *OrderRulesRequest) ProtoReflect() protoreflect.Message { - mi := &file_flipt_proto_msgTypes[38] + mi := &file_flipt_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3129,7 +3247,7 @@ func (x *OrderRulesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use OrderRulesRequest.ProtoReflect.Descriptor instead. func (*OrderRulesRequest) Descriptor() ([]byte, []int) { - return file_flipt_proto_rawDescGZIP(), []int{38} + return file_flipt_proto_rawDescGZIP(), []int{40} } func (x *OrderRulesRequest) GetFlagKey() string { @@ -3169,7 +3287,7 @@ type Distribution struct { func (x *Distribution) Reset() { *x = Distribution{} if protoimpl.UnsafeEnabled { - mi := &file_flipt_proto_msgTypes[39] + mi := &file_flipt_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3182,7 +3300,7 @@ func (x *Distribution) String() string { func (*Distribution) ProtoMessage() {} func (x *Distribution) ProtoReflect() protoreflect.Message { - mi := &file_flipt_proto_msgTypes[39] + mi := &file_flipt_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3195,7 +3313,7 @@ func (x *Distribution) ProtoReflect() protoreflect.Message { // Deprecated: Use Distribution.ProtoReflect.Descriptor instead. func (*Distribution) Descriptor() ([]byte, []int) { - return file_flipt_proto_rawDescGZIP(), []int{39} + return file_flipt_proto_rawDescGZIP(), []int{41} } func (x *Distribution) GetId() string { @@ -3255,7 +3373,7 @@ type CreateDistributionRequest struct { func (x *CreateDistributionRequest) Reset() { *x = CreateDistributionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_flipt_proto_msgTypes[40] + mi := &file_flipt_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3268,7 +3386,7 @@ func (x *CreateDistributionRequest) String() string { func (*CreateDistributionRequest) ProtoMessage() {} func (x *CreateDistributionRequest) ProtoReflect() protoreflect.Message { - mi := &file_flipt_proto_msgTypes[40] + mi := &file_flipt_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3281,7 +3399,7 @@ func (x *CreateDistributionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateDistributionRequest.ProtoReflect.Descriptor instead. func (*CreateDistributionRequest) Descriptor() ([]byte, []int) { - return file_flipt_proto_rawDescGZIP(), []int{40} + return file_flipt_proto_rawDescGZIP(), []int{42} } func (x *CreateDistributionRequest) GetFlagKey() string { @@ -3335,7 +3453,7 @@ type UpdateDistributionRequest struct { func (x *UpdateDistributionRequest) Reset() { *x = UpdateDistributionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_flipt_proto_msgTypes[41] + mi := &file_flipt_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3348,7 +3466,7 @@ func (x *UpdateDistributionRequest) String() string { func (*UpdateDistributionRequest) ProtoMessage() {} func (x *UpdateDistributionRequest) ProtoReflect() protoreflect.Message { - mi := &file_flipt_proto_msgTypes[41] + mi := &file_flipt_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3361,7 +3479,7 @@ func (x *UpdateDistributionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateDistributionRequest.ProtoReflect.Descriptor instead. func (*UpdateDistributionRequest) Descriptor() ([]byte, []int) { - return file_flipt_proto_rawDescGZIP(), []int{41} + return file_flipt_proto_rawDescGZIP(), []int{43} } func (x *UpdateDistributionRequest) GetId() string { @@ -3421,7 +3539,7 @@ type DeleteDistributionRequest struct { func (x *DeleteDistributionRequest) Reset() { *x = DeleteDistributionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_flipt_proto_msgTypes[42] + mi := &file_flipt_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3434,7 +3552,7 @@ func (x *DeleteDistributionRequest) String() string { func (*DeleteDistributionRequest) ProtoMessage() {} func (x *DeleteDistributionRequest) ProtoReflect() protoreflect.Message { - mi := &file_flipt_proto_msgTypes[42] + mi := &file_flipt_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3447,7 +3565,7 @@ func (x *DeleteDistributionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteDistributionRequest.ProtoReflect.Descriptor instead. func (*DeleteDistributionRequest) Descriptor() ([]byte, []int) { - return file_flipt_proto_rawDescGZIP(), []int{42} + return file_flipt_proto_rawDescGZIP(), []int{44} } func (x *DeleteDistributionRequest) GetId() string { @@ -3587,274 +3705,248 @@ var file_flipt_proto_rawDesc = []byte{ 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x22, 0xaf, 0x02, 0x0a, 0x04, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x0a, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x41, 0x74, 0x12, 0x2a, 0x0a, 0x08, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x73, 0x18, 0x07, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x56, 0x61, 0x72, - 0x69, 0x61, 0x6e, 0x74, 0x52, 0x08, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x23, - 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x4b, 0x65, 0x79, 0x22, 0x8a, 0x01, 0x0a, 0x0d, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x66, 0x6c, 0x69, 0x70, - 0x74, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x0a, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, - 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, - 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x22, 0x34, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x3a, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, - 0xd2, 0x01, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x67, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x61, - 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x42, 0x02, 0x18, 0x01, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, - 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, - 0x92, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, - 0x3a, 0x12, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0xd2, 0x01, 0x03, 0x6b, 0x65, 0x79, 0xd2, 0x01, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x76, 0x0a, 0x08, 0x46, 0x6c, 0x61, 0x67, 0x4c, 0x69, 0x73, 0x74, - 0x12, 0x21, 0x0a, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x0b, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x05, 0x66, 0x6c, - 0x61, 0x67, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, - 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, - 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x54, 0x0a, 0x0e, - 0x47, 0x65, 0x74, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6b, 0x65, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x4b, 0x65, 0x79, 0x3a, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0xd2, 0x01, 0x03, 0x6b, - 0x65, 0x79, 0x22, 0x87, 0x01, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x6c, 0x61, 0x67, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x06, - 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x02, 0x18, 0x01, - 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, - 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, - 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x22, 0xae, 0x01, 0x0a, - 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x3a, 0x12, 0x92, 0x41, 0x0f, 0x0a, 0x0d, - 0xd2, 0x01, 0x03, 0x6b, 0x65, 0x79, 0xd2, 0x01, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xae, 0x01, - 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x3a, 0x12, 0x92, 0x41, 0x0f, 0x0a, - 0x0d, 0xd2, 0x01, 0x03, 0x6b, 0x65, 0x79, 0xd2, 0x01, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x57, - 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x3a, 0x0b, 0x92, 0x41, 0x08, 0x0a, - 0x06, 0xd2, 0x01, 0x03, 0x6b, 0x65, 0x79, 0x22, 0xb7, 0x02, 0x0a, 0x07, 0x56, 0x61, 0x72, 0x69, - 0x61, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x66, 0x6c, 0x61, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1e, 0x0a, 0x0a, - 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, - 0x79, 0x22, 0xd6, 0x01, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, - 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x6c, - 0x61, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x66, 0x6c, - 0x61, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, - 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x0a, - 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, - 0x65, 0x79, 0x3a, 0x16, 0x92, 0x41, 0x13, 0x0a, 0x11, 0xd2, 0x01, 0x08, 0x66, 0x6c, 0x61, 0x67, - 0x5f, 0x6b, 0x65, 0x79, 0xd2, 0x01, 0x03, 0x6b, 0x65, 0x79, 0x22, 0xeb, 0x01, 0x0a, 0x14, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x66, 0x6c, 0x61, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, - 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, - 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x3a, 0x1b, 0x92, 0x41, 0x18, - 0x0a, 0x16, 0xd2, 0x01, 0x02, 0x69, 0x64, 0xd2, 0x01, 0x08, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, - 0x65, 0x79, 0xd2, 0x01, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x7d, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x19, 0x0a, 0x08, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x66, 0x6c, 0x61, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, - 0x3a, 0x15, 0x92, 0x41, 0x12, 0x0a, 0x10, 0xd2, 0x01, 0x02, 0x69, 0x64, 0xd2, 0x01, 0x08, 0x66, - 0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x22, 0xd2, 0x02, 0x0a, 0x07, 0x53, 0x65, 0x67, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x74, 0x22, 0x8a, 0x01, 0x0a, 0x0d, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4c, + 0x69, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, + 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, + 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1f, 0x0a, + 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x34, + 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x3a, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0xd2, 0x01, + 0x03, 0x6b, 0x65, 0x79, 0x22, 0x67, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x42, 0x02, 0x18, 0x01, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x1d, + 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x92, 0x01, + 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, + 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x3a, 0x12, + 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0xd2, 0x01, 0x03, 0x6b, 0x65, 0x79, 0xd2, 0x01, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x92, 0x01, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x3a, 0x12, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0xd2, 0x01, 0x03, 0x6b, 0x65, 0x79, + 0xd2, 0x01, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x37, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x3a, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0xd2, 0x01, 0x03, 0x6b, 0x65, 0x79, + 0x22, 0xaf, 0x02, 0x0a, 0x04, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x12, 0x33, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, - 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x43, - 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x73, 0x74, - 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x2f, 0x0a, 0x0a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x66, 0x6c, 0x69, - 0x70, 0x74, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x6d, 0x61, - 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x22, 0x82, 0x01, 0x0a, - 0x0b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x08, - 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, - 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x08, - 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, - 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x22, 0x57, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x3a, 0x0b, 0x92, - 0x41, 0x08, 0x0a, 0x06, 0xd2, 0x01, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x8a, 0x01, 0x0a, 0x12, 0x4c, - 0x69, 0x73, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x02, 0x18, 0x01, 0x52, 0x06, 0x6f, 0x66, 0x66, - 0x73, 0x65, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, - 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x22, 0xc8, 0x01, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x74, 0x12, 0x2a, 0x0a, 0x08, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x73, 0x18, 0x07, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x69, + 0x61, 0x6e, 0x74, 0x52, 0x08, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x23, 0x0a, + 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, + 0x65, 0x79, 0x22, 0x76, 0x0a, 0x08, 0x46, 0x6c, 0x61, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x21, + 0x0a, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, + 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x05, 0x66, 0x6c, 0x61, 0x67, + 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, + 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x54, 0x0a, 0x0e, 0x47, 0x65, + 0x74, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x23, + 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x4b, 0x65, 0x79, 0x3a, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0xd2, 0x01, 0x03, 0x6b, 0x65, 0x79, + 0x22, 0x87, 0x01, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x06, 0x6f, 0x66, + 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x02, 0x18, 0x01, 0x52, 0x06, + 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x22, 0xae, 0x01, 0x0a, 0x11, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x6d, 0x61, 0x74, 0x63, - 0x68, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x66, - 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x3a, 0x12, - 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0xd2, 0x01, 0x03, 0x6b, 0x65, 0x79, 0xd2, 0x01, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x22, 0xc8, 0x01, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x67, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, - 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x6d, 0x61, 0x74, 0x63, 0x68, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x3a, 0x12, 0x92, 0x41, 0x0f, 0x0a, 0x0d, - 0xd2, 0x01, 0x03, 0x6b, 0x65, 0x79, 0xd2, 0x01, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x5a, 0x0a, - 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x3a, 0x0b, 0x92, 0x41, - 0x08, 0x0a, 0x06, 0xd2, 0x01, 0x03, 0x6b, 0x65, 0x79, 0x22, 0xd1, 0x02, 0x0a, 0x0a, 0x43, 0x6f, - 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x67, 0x6d, - 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, - 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, - 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, - 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, - 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x22, 0x8a, 0x02, - 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x67, - 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, - 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x3a, 0x30, 0x92, 0x41, 0x2d, 0x0a, 0x2b, 0xd2, - 0x01, 0x0b, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0xd2, 0x01, 0x04, - 0x74, 0x79, 0x70, 0x65, 0xd2, 0x01, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0xd2, - 0x01, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0x9f, 0x02, 0x0a, 0x17, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, + 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x3a, 0x12, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0xd2, 0x01, + 0x03, 0x6b, 0x65, 0x79, 0xd2, 0x01, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xae, 0x01, 0x0a, 0x11, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x3a, 0x12, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0xd2, + 0x01, 0x03, 0x6b, 0x65, 0x79, 0xd2, 0x01, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x57, 0x0a, 0x11, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x3a, 0x0b, 0x92, 0x41, 0x08, 0x0a, 0x06, 0xd2, + 0x01, 0x03, 0x6b, 0x65, 0x79, 0x22, 0xb7, 0x02, 0x0a, 0x07, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, + 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x66, 0x6c, 0x61, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, + 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, + 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x74, + 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x22, + 0xd6, 0x01, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x6c, 0x61, 0x67, + 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x66, 0x6c, 0x61, 0x67, + 0x4b, 0x65, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x61, + 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, + 0x3a, 0x16, 0x92, 0x41, 0x13, 0x0a, 0x11, 0xd2, 0x01, 0x08, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, + 0x65, 0x79, 0xd2, 0x01, 0x03, 0x6b, 0x65, 0x79, 0x22, 0xeb, 0x01, 0x0a, 0x14, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x66, 0x6c, 0x61, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, + 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x3a, 0x1b, 0x92, 0x41, 0x18, 0x0a, 0x16, + 0xd2, 0x01, 0x02, 0x69, 0x64, 0xd2, 0x01, 0x08, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x65, 0x79, + 0xd2, 0x01, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x7d, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x19, + 0x0a, 0x08, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x66, 0x6c, 0x61, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x3a, 0x15, + 0x92, 0x41, 0x12, 0x0a, 0x10, 0xd2, 0x01, 0x02, 0x69, 0x64, 0xd2, 0x01, 0x08, 0x66, 0x6c, 0x61, + 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x22, 0xd2, 0x02, 0x0a, 0x07, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, + 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, + 0x33, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x06, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x43, 0x6f, 0x6e, + 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, + 0x69, 0x6e, 0x74, 0x73, 0x12, 0x2f, 0x0a, 0x0a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, + 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x22, 0x82, 0x01, 0x0a, 0x0b, 0x53, + 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x08, 0x73, 0x65, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x66, + 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x73, 0x65, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, + 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1f, + 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, + 0x57, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x3a, 0x0b, 0x92, 0x41, 0x08, + 0x0a, 0x06, 0xd2, 0x01, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x8a, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, + 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x02, 0x18, 0x01, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, + 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6b, 0x65, + 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x4b, 0x65, 0x79, 0x22, 0xc8, 0x01, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x66, 0x6c, 0x69, + 0x70, 0x74, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x6d, 0x61, + 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x3a, 0x12, 0x92, 0x41, + 0x0f, 0x0a, 0x0d, 0xd2, 0x01, 0x03, 0x6b, 0x65, 0x79, 0xd2, 0x01, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0xc8, 0x01, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x67, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x4d, 0x61, + 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, + 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x3a, 0x12, 0x92, 0x41, 0x0f, 0x0a, 0x0d, 0xd2, 0x01, + 0x03, 0x6b, 0x65, 0x79, 0xd2, 0x01, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x5a, 0x0a, 0x14, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x3a, 0x0b, 0x92, 0x41, 0x08, 0x0a, + 0x06, 0xd2, 0x01, 0x03, 0x6b, 0x65, 0x79, 0x22, 0xd1, 0x02, 0x0a, 0x0a, 0x43, 0x6f, 0x6e, 0x73, + 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, @@ -3865,397 +3957,436 @@ var file_flipt_proto_rawDesc = []byte{ 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6b, 0x65, - 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x4b, 0x65, 0x79, 0x3a, 0x35, 0x92, 0x41, 0x32, 0x0a, 0x30, 0xd2, 0x01, 0x02, 0x69, - 0x64, 0xd2, 0x01, 0x0b, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0xd2, - 0x01, 0x04, 0x74, 0x79, 0x70, 0x65, 0xd2, 0x01, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x79, 0xd2, 0x01, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0x89, 0x01, 0x0a, - 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x67, 0x6d, - 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, - 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x3a, 0x18, - 0x92, 0x41, 0x15, 0x0a, 0x13, 0xd2, 0x01, 0x02, 0x69, 0x64, 0xd2, 0x01, 0x0b, 0x73, 0x65, 0x67, - 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x22, 0xbc, 0x02, 0x0a, 0x04, 0x52, 0x75, 0x6c, - 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x66, 0x6c, 0x61, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0b, - 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x39, 0x0a, - 0x0d, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x44, 0x69, 0x73, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x64, 0x69, 0x73, 0x74, 0x72, - 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x61, 0x6e, 0x6b, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x72, 0x61, 0x6e, 0x6b, 0x12, 0x39, 0x0a, 0x0a, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x41, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, - 0x6b, 0x65, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x22, 0x76, 0x0a, 0x08, 0x52, 0x75, 0x6c, 0x65, 0x4c, - 0x69, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x52, - 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, - 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1f, - 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, - 0xb4, 0x01, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x06, 0x6f, 0x66, 0x66, - 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x02, 0x18, 0x01, 0x52, 0x06, 0x6f, - 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x65, - 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x66, 0x6c, 0x61, 0x67, 0x4b, 0x65, 0x79, - 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, - 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x4b, 0x65, 0x79, 0x3a, 0x10, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0xd2, 0x01, 0x08, 0x66, 0x6c, - 0x61, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x22, 0x77, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6c, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x6c, 0x61, 0x67, - 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x66, 0x6c, 0x61, 0x67, - 0x4b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x3a, 0x15, 0x92, 0x41, 0x12, 0x0a, 0x10, 0xd2, - 0x01, 0x02, 0x69, 0x64, 0xd2, 0x01, 0x08, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x22, - 0xaf, 0x01, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x66, 0x6c, 0x61, 0x67, 0x4b, 0x65, 0x79, - 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4b, 0x65, - 0x79, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x61, 0x6e, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x04, 0x72, 0x61, 0x6e, 0x6b, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x3a, 0x25, 0x92, 0x41, 0x22, 0x0a, - 0x20, 0xd2, 0x01, 0x08, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0xd2, 0x01, 0x0b, 0x73, - 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0xd2, 0x01, 0x04, 0x72, 0x61, 0x6e, - 0x6b, 0x22, 0xa9, 0x01, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x6c, 0x61, 0x67, 0x5f, - 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x66, 0x6c, 0x61, 0x67, 0x4b, - 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, - 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, - 0x4b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x3a, 0x23, 0x92, 0x41, 0x20, 0x0a, 0x1e, 0xd2, - 0x01, 0x02, 0x69, 0x64, 0xd2, 0x01, 0x08, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0xd2, - 0x01, 0x0b, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x22, 0x7a, 0x0a, - 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x66, 0x6c, 0x61, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x23, 0x0a, - 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, - 0x65, 0x79, 0x3a, 0x15, 0x92, 0x41, 0x12, 0x0a, 0x10, 0xd2, 0x01, 0x02, 0x69, 0x64, 0xd2, 0x01, - 0x08, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x22, 0x8b, 0x01, 0x0a, 0x11, 0x4f, 0x72, - 0x64, 0x65, 0x72, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x19, 0x0a, 0x08, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x66, 0x6c, 0x61, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x75, - 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x75, - 0x6c, 0x65, 0x49, 0x64, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x3a, 0x1b, 0x92, 0x41, 0x18, 0x0a, - 0x16, 0xd2, 0x01, 0x08, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0xd2, 0x01, 0x08, 0x72, - 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x22, 0xe6, 0x01, 0x0a, 0x0c, 0x44, 0x69, 0x73, 0x74, - 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, - 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, - 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x49, 0x64, - 0x12, 0x18, 0x0a, 0x07, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x02, 0x52, 0x07, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x22, 0x8a, 0x02, 0x0a, 0x17, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x67, 0x6d, 0x65, + 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x43, + 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x12, + 0x1a, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6b, + 0x65, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x3a, 0x30, 0x92, 0x41, 0x2d, 0x0a, 0x2b, 0xd2, 0x01, 0x0b, + 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0xd2, 0x01, 0x04, 0x74, 0x79, + 0x70, 0x65, 0xd2, 0x01, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0xd2, 0x01, 0x08, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0x9f, 0x02, 0x0a, 0x17, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, + 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x67, 0x6d, 0x65, + 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, + 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x12, 0x1a, 0x0a, 0x08, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, + 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x4b, 0x65, 0x79, 0x3a, 0x35, 0x92, 0x41, 0x32, 0x0a, 0x30, 0xd2, 0x01, 0x02, 0x69, 0x64, 0xd2, + 0x01, 0x0b, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0xd2, 0x01, 0x04, + 0x74, 0x79, 0x70, 0x65, 0xd2, 0x01, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0xd2, + 0x01, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0x89, 0x01, 0x0a, 0x17, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x67, + 0x6d, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x3a, 0x18, 0x92, 0x41, + 0x15, 0x0a, 0x13, 0xd2, 0x01, 0x02, 0x69, 0x64, 0xd2, 0x01, 0x0b, 0x73, 0x65, 0x67, 0x6d, 0x65, + 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x22, 0xbc, 0x02, 0x0a, 0x04, 0x52, 0x75, 0x6c, 0x65, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x19, 0x0a, 0x08, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x66, 0x6c, 0x61, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x39, 0x0a, 0x0d, 0x64, + 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x44, 0x69, 0x73, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x61, 0x6e, 0x6b, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x72, 0x61, 0x6e, 0x6b, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x22, 0xe0, 0x01, 0x0a, 0x19, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x69, 0x73, 0x74, 0x72, - 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, - 0x0a, 0x08, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x66, 0x6c, 0x61, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, - 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x49, - 0x64, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x02, 0x52, 0x07, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, + 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6b, 0x65, + 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x4b, 0x65, 0x79, 0x22, 0x76, 0x0a, 0x08, 0x52, 0x75, 0x6c, 0x65, 0x4c, 0x69, 0x73, + 0x74, 0x12, 0x21, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x0b, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x72, + 0x75, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, + 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, + 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xb4, 0x01, + 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x02, 0x18, 0x01, 0x52, 0x06, 0x6f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x66, 0x6c, 0x61, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x1d, + 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x23, 0x0a, + 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, + 0x65, 0x79, 0x3a, 0x10, 0x92, 0x41, 0x0d, 0x0a, 0x0b, 0xd2, 0x01, 0x08, 0x66, 0x6c, 0x61, 0x67, + 0x5f, 0x6b, 0x65, 0x79, 0x22, 0x77, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, + 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x66, 0x6c, 0x61, 0x67, 0x4b, 0x65, + 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6b, + 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x3a, 0x15, 0x92, 0x41, 0x12, 0x0a, 0x10, 0xd2, 0x01, 0x02, + 0x69, 0x64, 0xd2, 0x01, 0x08, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x22, 0xaf, 0x01, + 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x66, 0x6c, 0x61, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x1f, + 0x0a, 0x0b, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x12, + 0x12, 0x0a, 0x04, 0x72, 0x61, 0x6e, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x72, + 0x61, 0x6e, 0x6b, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x3a, 0x25, 0x92, 0x41, 0x22, 0x0a, 0x20, 0xd2, + 0x01, 0x08, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0xd2, 0x01, 0x0b, 0x73, 0x65, 0x67, + 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0xd2, 0x01, 0x04, 0x72, 0x61, 0x6e, 0x6b, 0x22, + 0xa9, 0x01, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x65, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x66, 0x6c, 0x61, 0x67, 0x4b, 0x65, 0x79, + 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4b, 0x65, + 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6b, + 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x3a, 0x23, 0x92, 0x41, 0x20, 0x0a, 0x1e, 0xd2, 0x01, 0x02, + 0x69, 0x64, 0xd2, 0x01, 0x08, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0xd2, 0x01, 0x0b, + 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x22, 0x7a, 0x0a, 0x11, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x19, 0x0a, 0x08, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x66, 0x6c, 0x61, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, - 0x3a, 0x31, 0x92, 0x41, 0x2e, 0x0a, 0x2c, 0xd2, 0x01, 0x08, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, - 0x65, 0x79, 0xd2, 0x01, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0xd2, 0x01, 0x0a, 0x76, - 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0xd2, 0x01, 0x07, 0x72, 0x6f, 0x6c, 0x6c, - 0x6f, 0x75, 0x74, 0x22, 0xf5, 0x01, 0x0a, 0x19, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x69, - 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x66, 0x6c, 0x61, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x17, 0x0a, 0x07, - 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, - 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x07, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x12, 0x23, - 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x4b, 0x65, 0x79, 0x3a, 0x36, 0x92, 0x41, 0x33, 0x0a, 0x31, 0xd2, 0x01, 0x02, 0x69, 0x64, 0xd2, - 0x01, 0x08, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0xd2, 0x01, 0x07, 0x72, 0x75, 0x6c, - 0x65, 0x5f, 0x69, 0x64, 0xd2, 0x01, 0x0a, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x5f, 0x69, - 0x64, 0xd2, 0x01, 0x07, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x22, 0xd1, 0x01, 0x0a, 0x19, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x6c, 0x61, - 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x66, 0x6c, 0x61, - 0x67, 0x4b, 0x65, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, - 0x0a, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, + 0x3a, 0x15, 0x92, 0x41, 0x12, 0x0a, 0x10, 0xd2, 0x01, 0x02, 0x69, 0x64, 0xd2, 0x01, 0x08, 0x66, + 0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x22, 0x8b, 0x01, 0x0a, 0x11, 0x4f, 0x72, 0x64, 0x65, + 0x72, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, + 0x08, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x66, 0x6c, 0x61, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x75, 0x6c, 0x65, + 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x75, 0x6c, 0x65, + 0x49, 0x64, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x3a, 0x1b, 0x92, 0x41, 0x18, 0x0a, 0x16, 0xd2, + 0x01, 0x08, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0xd2, 0x01, 0x08, 0x72, 0x75, 0x6c, + 0x65, 0x5f, 0x69, 0x64, 0x73, 0x22, 0xe6, 0x01, 0x0a, 0x0c, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, + 0x1d, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, + 0x0a, 0x07, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, + 0x07, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xe0, + 0x01, 0x0a, 0x19, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, + 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x66, 0x6c, 0x61, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, + 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, + 0x18, 0x0a, 0x07, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, + 0x52, 0x07, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x3a, 0x31, + 0x92, 0x41, 0x2e, 0x0a, 0x2c, 0xd2, 0x01, 0x08, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x65, 0x79, + 0xd2, 0x01, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0xd2, 0x01, 0x0a, 0x76, 0x61, 0x72, + 0x69, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0xd2, 0x01, 0x07, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, + 0x74, 0x22, 0xf5, 0x01, 0x0a, 0x19, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x69, 0x73, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x19, 0x0a, 0x08, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x66, 0x6c, 0x61, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, + 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, + 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, + 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x02, 0x52, 0x07, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x12, 0x23, 0x0a, 0x0d, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, - 0x79, 0x3a, 0x2c, 0x92, 0x41, 0x29, 0x0a, 0x27, 0xd2, 0x01, 0x02, 0x69, 0x64, 0xd2, 0x01, 0x08, + 0x79, 0x3a, 0x36, 0x92, 0x41, 0x33, 0x0a, 0x31, 0xd2, 0x01, 0x02, 0x69, 0x64, 0xd2, 0x01, 0x08, 0x66, 0x6c, 0x61, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0xd2, 0x01, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, - 0x69, 0x64, 0xd2, 0x01, 0x0a, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x2a, - 0xb6, 0x01, 0x0a, 0x10, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x19, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, - 0x45, 0x56, 0x41, 0x4c, 0x55, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, - 0x4e, 0x10, 0x00, 0x12, 0x23, 0x0a, 0x1f, 0x46, 0x4c, 0x41, 0x47, 0x5f, 0x44, 0x49, 0x53, 0x41, - 0x42, 0x4c, 0x45, 0x44, 0x5f, 0x45, 0x56, 0x41, 0x4c, 0x55, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x24, 0x0a, 0x20, 0x46, 0x4c, 0x41, 0x47, - 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x45, 0x56, 0x41, 0x4c, 0x55, - 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x10, 0x02, 0x12, 0x1b, - 0x0a, 0x17, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x45, 0x56, 0x41, 0x4c, 0x55, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x10, 0x03, 0x12, 0x1b, 0x0a, 0x17, 0x45, - 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x45, 0x56, 0x41, 0x4c, 0x55, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x10, 0x04, 0x2a, 0x33, 0x0a, 0x09, 0x4d, 0x61, 0x74, 0x63, - 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x0e, 0x41, 0x4c, 0x4c, 0x5f, 0x4d, 0x41, 0x54, - 0x43, 0x48, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x41, 0x4e, 0x59, - 0x5f, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x01, 0x2a, 0x82, 0x01, - 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x1b, 0x0a, 0x17, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x43, 0x4f, 0x4d, 0x50, - 0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x1a, 0x0a, - 0x16, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, 0x53, - 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x4e, 0x55, 0x4d, - 0x42, 0x45, 0x52, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x10, 0x02, 0x12, 0x1b, 0x0a, 0x17, 0x42, 0x4f, 0x4f, 0x4c, 0x45, 0x41, 0x4e, - 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x10, 0x03, 0x32, 0xd5, 0x16, 0x0a, 0x05, 0x46, 0x6c, 0x69, 0x70, 0x74, 0x12, 0x62, 0x0a, 0x08, - 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x12, 0x18, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, - 0x2e, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x45, 0x76, 0x61, 0x6c, 0x75, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x21, 0x92, - 0x41, 0x1e, 0x0a, 0x08, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x1a, 0x08, 0x45, 0x76, - 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x2a, 0x08, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, - 0x12, 0x7c, 0x0a, 0x0d, 0x42, 0x61, 0x74, 0x63, 0x68, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, - 0x65, 0x12, 0x1d, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x45, + 0x69, 0x64, 0xd2, 0x01, 0x0a, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0xd2, + 0x01, 0x07, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x22, 0xd1, 0x01, 0x0a, 0x19, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x6c, 0x61, 0x67, 0x5f, + 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x66, 0x6c, 0x61, 0x67, 0x4b, + 0x65, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x76, + 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x3a, + 0x2c, 0x92, 0x41, 0x29, 0x0a, 0x27, 0xd2, 0x01, 0x02, 0x69, 0x64, 0xd2, 0x01, 0x08, 0x66, 0x6c, + 0x61, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0xd2, 0x01, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, + 0xd2, 0x01, 0x0a, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x2a, 0xb6, 0x01, + 0x0a, 0x10, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x61, 0x73, + 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x19, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x45, 0x56, + 0x41, 0x4c, 0x55, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x10, + 0x00, 0x12, 0x23, 0x0a, 0x1f, 0x46, 0x4c, 0x41, 0x47, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x42, 0x4c, + 0x45, 0x44, 0x5f, 0x45, 0x56, 0x41, 0x4c, 0x55, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, + 0x41, 0x53, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x24, 0x0a, 0x20, 0x46, 0x4c, 0x41, 0x47, 0x5f, 0x4e, + 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x45, 0x56, 0x41, 0x4c, 0x55, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x10, 0x02, 0x12, 0x1b, 0x0a, 0x17, + 0x4d, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x45, 0x56, 0x41, 0x4c, 0x55, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x10, 0x03, 0x12, 0x1b, 0x0a, 0x17, 0x45, 0x52, 0x52, + 0x4f, 0x52, 0x5f, 0x45, 0x56, 0x41, 0x4c, 0x55, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, + 0x41, 0x53, 0x4f, 0x4e, 0x10, 0x04, 0x2a, 0x33, 0x0a, 0x09, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x0e, 0x41, 0x4c, 0x4c, 0x5f, 0x4d, 0x41, 0x54, 0x43, 0x48, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x41, 0x4e, 0x59, 0x5f, 0x4d, + 0x41, 0x54, 0x43, 0x48, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x01, 0x2a, 0x82, 0x01, 0x0a, 0x0e, + 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, + 0x0a, 0x17, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52, + 0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x53, + 0x54, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x4e, 0x55, 0x4d, 0x42, 0x45, + 0x52, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x10, 0x02, 0x12, 0x1b, 0x0a, 0x17, 0x42, 0x4f, 0x4f, 0x4c, 0x45, 0x41, 0x4e, 0x5f, 0x43, + 0x4f, 0x4d, 0x50, 0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x03, + 0x32, 0xd5, 0x16, 0x0a, 0x05, 0x46, 0x6c, 0x69, 0x70, 0x74, 0x12, 0x62, 0x0a, 0x08, 0x45, 0x76, + 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x12, 0x18, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1e, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x45, 0x76, - 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x2c, 0x92, 0x41, 0x29, 0x0a, 0x08, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x1a, - 0x0e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x20, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x2a, - 0x0d, 0x62, 0x61, 0x74, 0x63, 0x68, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x12, 0x4c, - 0x0a, 0x07, 0x47, 0x65, 0x74, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x15, 0x2e, 0x66, 0x6c, 0x69, 0x70, - 0x74, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x0b, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x46, 0x6c, 0x61, 0x67, 0x22, 0x1d, 0x92, - 0x41, 0x1a, 0x0a, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x1a, 0x08, 0x47, 0x65, 0x74, 0x20, 0x46, - 0x6c, 0x61, 0x67, 0x2a, 0x07, 0x67, 0x65, 0x74, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x57, 0x0a, 0x09, - 0x4c, 0x69, 0x73, 0x74, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x66, 0x6c, 0x69, 0x70, - 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x0f, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x46, 0x6c, 0x61, 0x67, 0x4c, 0x69, - 0x73, 0x74, 0x22, 0x21, 0x92, 0x41, 0x1e, 0x0a, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x1a, 0x0a, - 0x4c, 0x69, 0x73, 0x74, 0x20, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x2a, 0x09, 0x6c, 0x69, 0x73, 0x74, - 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, - 0x6c, 0x61, 0x67, 0x12, 0x18, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0b, 0x2e, - 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x46, 0x6c, 0x61, 0x67, 0x22, 0x23, 0x92, 0x41, 0x20, 0x0a, - 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x1a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x46, - 0x6c, 0x61, 0x67, 0x2a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x12, - 0x58, 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x18, 0x2e, - 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0b, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, - 0x46, 0x6c, 0x61, 0x67, 0x22, 0x23, 0x92, 0x41, 0x20, 0x0a, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, - 0x1a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x46, 0x6c, 0x61, 0x67, 0x2a, 0x0a, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x63, 0x0a, 0x0a, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x18, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x23, 0x92, 0x41, 0x20, 0x0a, 0x05, - 0x66, 0x6c, 0x61, 0x67, 0x73, 0x1a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x46, 0x6c, - 0x61, 0x67, 0x2a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x6a, - 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x12, - 0x1b, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x61, - 0x72, 0x69, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x66, - 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x22, 0x2c, 0x92, 0x41, - 0x29, 0x0a, 0x08, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x73, 0x1a, 0x0e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x20, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x2a, 0x0d, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x12, 0x6a, 0x0a, 0x0d, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x12, 0x1b, 0x2e, 0x66, 0x6c, - 0x69, 0x70, 0x74, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, - 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x22, 0x2c, 0x92, 0x41, 0x29, 0x0a, 0x08, 0x76, - 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x73, 0x1a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, - 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x2a, 0x0d, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, - 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x12, 0x72, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x12, 0x1b, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x2c, 0x92, 0x41, - 0x29, 0x0a, 0x08, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x73, 0x1a, 0x0e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x20, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x2a, 0x0d, 0x64, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x12, 0x4c, 0x0a, 0x07, 0x47, 0x65, - 0x74, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x15, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x47, 0x65, - 0x74, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0b, 0x2e, 0x66, - 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x22, 0x1d, 0x92, 0x41, 0x1a, 0x0a, 0x05, - 0x72, 0x75, 0x6c, 0x65, 0x73, 0x1a, 0x08, 0x47, 0x65, 0x74, 0x20, 0x52, 0x75, 0x6c, 0x65, 0x2a, - 0x07, 0x67, 0x65, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x57, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, - 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x21, - 0x92, 0x41, 0x1e, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x1a, 0x0a, 0x4c, 0x69, 0x73, 0x74, - 0x20, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x2a, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6c, 0x65, - 0x73, 0x12, 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x12, - 0x18, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x75, - 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0b, 0x2e, 0x66, 0x6c, 0x69, 0x70, - 0x74, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x22, 0x23, 0x92, 0x41, 0x20, 0x0a, 0x05, 0x72, 0x75, 0x6c, - 0x65, 0x73, 0x1a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x52, 0x75, 0x6c, 0x65, 0x2a, - 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x58, 0x0a, 0x0a, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x18, 0x2e, 0x66, 0x6c, 0x69, 0x70, - 0x74, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x0b, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x52, 0x75, 0x6c, 0x65, - 0x22, 0x23, 0x92, 0x41, 0x20, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x1a, 0x0b, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x20, 0x52, 0x75, 0x6c, 0x65, 0x2a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x63, 0x0a, 0x0a, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x75, - 0x6c, 0x65, 0x73, 0x12, 0x18, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x4f, 0x72, 0x64, 0x65, - 0x72, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x23, 0x92, 0x41, 0x20, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, - 0x73, 0x1a, 0x0b, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x2a, 0x0a, - 0x6f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x63, 0x0a, 0x0a, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x18, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, - 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x1a, 0x19, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x21, 0x92, 0x41, 0x1e, + 0x0a, 0x08, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x1a, 0x08, 0x45, 0x76, 0x61, 0x6c, + 0x75, 0x61, 0x74, 0x65, 0x2a, 0x08, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x12, 0x7c, + 0x0a, 0x0d, 0x42, 0x61, 0x74, 0x63, 0x68, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x12, + 0x1d, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x45, 0x76, 0x61, + 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, + 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x45, 0x76, 0x61, 0x6c, + 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, + 0x92, 0x41, 0x29, 0x0a, 0x08, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x1a, 0x0e, 0x42, + 0x61, 0x74, 0x63, 0x68, 0x20, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x2a, 0x0d, 0x62, + 0x61, 0x74, 0x63, 0x68, 0x45, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x12, 0x4c, 0x0a, 0x07, + 0x47, 0x65, 0x74, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x15, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, + 0x47, 0x65, 0x74, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0b, + 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x46, 0x6c, 0x61, 0x67, 0x22, 0x1d, 0x92, 0x41, 0x1a, + 0x0a, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x1a, 0x08, 0x47, 0x65, 0x74, 0x20, 0x46, 0x6c, 0x61, + 0x67, 0x2a, 0x07, 0x67, 0x65, 0x74, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x57, 0x0a, 0x09, 0x4c, 0x69, + 0x73, 0x74, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x0f, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x46, 0x6c, 0x61, 0x67, 0x4c, 0x69, 0x73, 0x74, + 0x22, 0x21, 0x92, 0x41, 0x1e, 0x0a, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x1a, 0x0a, 0x4c, 0x69, + 0x73, 0x74, 0x20, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x2a, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x46, 0x6c, + 0x61, 0x67, 0x73, 0x12, 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x6c, 0x61, + 0x67, 0x12, 0x18, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x46, 0x6c, 0x61, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0b, 0x2e, 0x66, 0x6c, + 0x69, 0x70, 0x74, 0x2e, 0x46, 0x6c, 0x61, 0x67, 0x22, 0x23, 0x92, 0x41, 0x20, 0x0a, 0x05, 0x66, + 0x6c, 0x61, 0x67, 0x73, 0x1a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x46, 0x6c, 0x61, + 0x67, 0x2a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x58, 0x0a, + 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x18, 0x2e, 0x66, 0x6c, + 0x69, 0x70, 0x74, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0b, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x46, 0x6c, + 0x61, 0x67, 0x22, 0x23, 0x92, 0x41, 0x20, 0x0a, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x1a, 0x0b, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x46, 0x6c, 0x61, 0x67, 0x2a, 0x0a, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x63, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x18, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x23, 0x92, 0x41, 0x20, 0x0a, 0x05, 0x66, 0x6c, + 0x61, 0x67, 0x73, 0x1a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x46, 0x6c, 0x61, 0x67, + 0x2a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x6a, 0x0a, 0x0d, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x12, 0x1b, 0x2e, + 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, + 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x66, 0x6c, 0x69, + 0x70, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x22, 0x2c, 0x92, 0x41, 0x29, 0x0a, + 0x08, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x73, 0x1a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x20, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x2a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x12, 0x6a, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x12, 0x1b, 0x2e, 0x66, 0x6c, 0x69, 0x70, + 0x74, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x56, + 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x22, 0x2c, 0x92, 0x41, 0x29, 0x0a, 0x08, 0x76, 0x61, 0x72, + 0x69, 0x61, 0x6e, 0x74, 0x73, 0x1a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x56, 0x61, + 0x72, 0x69, 0x61, 0x6e, 0x74, 0x2a, 0x0d, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, + 0x69, 0x61, 0x6e, 0x74, 0x12, 0x72, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x56, 0x61, + 0x72, 0x69, 0x61, 0x6e, 0x74, 0x12, 0x1b, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x23, 0x92, 0x41, 0x20, 0x0a, - 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x1a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x52, - 0x75, 0x6c, 0x65, 0x2a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x12, - 0x88, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, - 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, - 0x2e, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3b, 0x92, - 0x41, 0x38, 0x0a, 0x0d, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x1a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, - 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x12, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x69, - 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x88, 0x01, 0x0a, 0x12, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x20, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x44, 0x69, 0x73, 0x74, - 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3b, 0x92, 0x41, 0x38, 0x0a, 0x0d, 0x64, - 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x13, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x20, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, - 0x6e, 0x2a, 0x12, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, - 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x8b, 0x01, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x2e, 0x66, - 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x69, 0x73, 0x74, 0x72, - 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x3b, 0x92, 0x41, 0x38, 0x0a, 0x0d, 0x64, 0x69, 0x73, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x13, 0x44, 0x65, 0x6c, 0x65, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x2c, 0x92, 0x41, 0x29, 0x0a, + 0x08, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x73, 0x1a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x20, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x2a, 0x0d, 0x64, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x12, 0x4c, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x52, + 0x75, 0x6c, 0x65, 0x12, 0x15, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x52, + 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0b, 0x2e, 0x66, 0x6c, 0x69, + 0x70, 0x74, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x22, 0x1d, 0x92, 0x41, 0x1a, 0x0a, 0x05, 0x72, 0x75, + 0x6c, 0x65, 0x73, 0x1a, 0x08, 0x47, 0x65, 0x74, 0x20, 0x52, 0x75, 0x6c, 0x65, 0x2a, 0x07, 0x67, + 0x65, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x57, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, + 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x66, 0x6c, + 0x69, 0x70, 0x74, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x21, 0x92, 0x41, + 0x1e, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x1a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x52, + 0x75, 0x6c, 0x65, 0x73, 0x2a, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, + 0x58, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x18, 0x2e, + 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0b, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, + 0x52, 0x75, 0x6c, 0x65, 0x22, 0x23, 0x92, 0x41, 0x20, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, + 0x1a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x52, 0x75, 0x6c, 0x65, 0x2a, 0x0a, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x58, 0x0a, 0x0a, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x18, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x0b, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x22, 0x23, + 0x92, 0x41, 0x20, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x1a, 0x0b, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x20, 0x52, 0x75, 0x6c, 0x65, 0x2a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, + 0x75, 0x6c, 0x65, 0x12, 0x63, 0x0a, 0x0a, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x75, 0x6c, 0x65, + 0x73, 0x12, 0x18, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, + 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x23, 0x92, 0x41, 0x20, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x1a, + 0x0b, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x2a, 0x0a, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x63, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x18, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x23, 0x92, 0x41, 0x20, 0x0a, 0x05, 0x72, + 0x75, 0x6c, 0x65, 0x73, 0x1a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x52, 0x75, 0x6c, + 0x65, 0x2a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x88, 0x01, + 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x44, + 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3b, 0x92, 0x41, 0x38, + 0x0a, 0x0d, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, + 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x12, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x69, 0x73, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x88, 0x01, 0x0a, 0x12, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x20, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x69, + 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x13, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3b, 0x92, 0x41, 0x38, 0x0a, 0x0d, 0x64, 0x69, 0x73, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2a, - 0x12, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x5e, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x18, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x67, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x66, 0x6c, - 0x69, 0x70, 0x74, 0x2e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x26, 0x92, 0x41, 0x23, - 0x0a, 0x08, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x0b, 0x47, 0x65, 0x74, 0x20, - 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2a, 0x0a, 0x67, 0x65, 0x74, 0x53, 0x65, 0x67, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x69, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x12, 0x19, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, - 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x69, - 0x73, 0x74, 0x22, 0x2a, 0x92, 0x41, 0x27, 0x0a, 0x08, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x1a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x2a, 0x0c, 0x6c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x6a, - 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x1b, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, - 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x66, - 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x92, 0x41, - 0x29, 0x0a, 0x08, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x0e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x20, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2a, 0x0d, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x6a, 0x0a, 0x0d, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x2e, 0x66, 0x6c, - 0x69, 0x70, 0x74, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, - 0x2e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x92, 0x41, 0x29, 0x0a, 0x08, 0x73, - 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, - 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2a, 0x0d, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, - 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x72, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x2c, 0x92, 0x41, - 0x29, 0x0a, 0x08, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x0e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x20, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2a, 0x0d, 0x64, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x7c, 0x0a, 0x10, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x12, 0x1e, - 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, - 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, - 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, - 0x74, 0x22, 0x35, 0x92, 0x41, 0x32, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, - 0x6e, 0x74, 0x73, 0x1a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x43, 0x6f, 0x6e, 0x73, - 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x2a, 0x10, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, - 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x12, 0x7c, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, + 0x12, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x8b, 0x01, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x69, + 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x2e, 0x66, 0x6c, 0x69, + 0x70, 0x74, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x3b, 0x92, 0x41, 0x38, 0x0a, 0x0d, 0x64, 0x69, 0x73, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x20, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x12, 0x64, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x5e, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x18, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x66, 0x6c, 0x69, 0x70, + 0x74, 0x2e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x26, 0x92, 0x41, 0x23, 0x0a, 0x08, + 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x0b, 0x47, 0x65, 0x74, 0x20, 0x53, 0x65, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2a, 0x0a, 0x67, 0x65, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x69, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x19, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, 0x2e, 0x66, + 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, + 0x22, 0x2a, 0x92, 0x41, 0x27, 0x0a, 0x08, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x1a, + 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2a, 0x0c, + 0x6c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x6a, 0x0a, 0x0d, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x2e, + 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x65, 0x67, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x66, 0x6c, 0x69, + 0x70, 0x74, 0x2e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x92, 0x41, 0x29, 0x0a, + 0x08, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x20, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x6a, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x2e, 0x66, 0x6c, 0x69, 0x70, + 0x74, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x53, + 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x92, 0x41, 0x29, 0x0a, 0x08, 0x73, 0x65, 0x67, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x53, 0x65, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2a, 0x0d, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x67, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x72, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x65, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x2c, 0x92, 0x41, 0x29, 0x0a, + 0x08, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x20, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2a, 0x0d, 0x64, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x7c, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x12, 0x1e, 0x2e, 0x66, - 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x74, + 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x22, 0x35, 0x92, 0x41, 0x32, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, - 0x73, 0x1a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, - 0x61, 0x69, 0x6e, 0x74, 0x2a, 0x10, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x73, - 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x12, 0x81, 0x01, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x12, 0x1e, 0x2e, 0x66, 0x6c, - 0x69, 0x70, 0x74, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, - 0x61, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x35, 0x92, 0x41, 0x32, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, - 0x61, 0x69, 0x6e, 0x74, 0x73, 0x1a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x43, 0x6f, - 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x2a, 0x10, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x42, 0xc5, 0x03, 0x5a, 0x21, 0x67, - 0x6f, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x69, 0x6f, 0x2f, 0x66, 0x6c, 0x69, 0x70, 0x74, - 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2f, 0x66, 0x6c, 0x69, 0x70, 0x74, - 0x92, 0x41, 0x9e, 0x03, 0x12, 0xa0, 0x01, 0x0a, 0x09, 0x46, 0x6c, 0x69, 0x70, 0x74, 0x20, 0x41, - 0x50, 0x49, 0x22, 0x3d, 0x0a, 0x0a, 0x46, 0x6c, 0x69, 0x70, 0x74, 0x20, 0x54, 0x65, 0x61, 0x6d, - 0x12, 0x21, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2d, 0x69, 0x6f, 0x2f, 0x66, 0x6c, - 0x69, 0x70, 0x74, 0x1a, 0x0c, 0x64, 0x65, 0x76, 0x40, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x69, - 0x6f, 0x2a, 0x4c, 0x0a, 0x0b, 0x4d, 0x49, 0x54, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, - 0x12, 0x3d, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2d, 0x69, 0x6f, 0x2f, 0x66, 0x6c, - 0x69, 0x70, 0x74, 0x2f, 0x62, 0x6c, 0x6f, 0x62, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x72, 0x70, - 0x63, 0x2f, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2f, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x32, - 0x06, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x2a, 0x02, 0x01, 0x02, 0x32, 0x10, 0x61, 0x70, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x3a, 0x10, 0x61, - 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x52, - 0x63, 0x0a, 0x03, 0x34, 0x30, 0x31, 0x12, 0x5c, 0x0a, 0x3d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x20, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, - 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x28, 0x61, 0x75, - 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x71, - 0x75, 0x69, 0x72, 0x65, 0x64, 0x29, 0x2e, 0x12, 0x1b, 0x0a, 0x19, 0x1a, 0x17, 0x23, 0x2f, 0x64, - 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x72, 0x70, 0x63, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x5a, 0x2a, 0x0a, 0x28, 0x0a, 0x11, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x13, 0x08, 0x02, 0x1a, - 0x0d, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, - 0x62, 0x17, 0x0a, 0x15, 0x0a, 0x11, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x72, 0x27, 0x0a, 0x0a, 0x46, 0x6c, 0x69, - 0x70, 0x74, 0x20, 0x44, 0x6f, 0x63, 0x73, 0x12, 0x19, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, - 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x69, 0x6f, 0x2f, 0x64, 0x6f, - 0x63, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x1a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, + 0x61, 0x69, 0x6e, 0x74, 0x2a, 0x10, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x73, + 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x12, 0x7c, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x12, 0x1e, 0x2e, 0x66, 0x6c, 0x69, + 0x70, 0x74, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, + 0x69, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x66, 0x6c, 0x69, + 0x70, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x22, 0x35, 0x92, + 0x41, 0x32, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x1a, + 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, + 0x6e, 0x74, 0x2a, 0x10, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, + 0x61, 0x69, 0x6e, 0x74, 0x12, 0x81, 0x01, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, + 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x12, 0x1e, 0x2e, 0x66, 0x6c, 0x69, 0x70, + 0x74, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0x35, 0x92, 0x41, 0x32, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, + 0x6e, 0x74, 0x73, 0x1a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x43, 0x6f, 0x6e, 0x73, + 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x2a, 0x10, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, + 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x42, 0xc5, 0x03, 0x5a, 0x21, 0x67, 0x6f, 0x2e, + 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x69, 0x6f, 0x2f, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2f, 0x72, + 0x70, 0x63, 0x2f, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2f, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x92, 0x41, + 0x9e, 0x03, 0x12, 0xa0, 0x01, 0x0a, 0x09, 0x46, 0x6c, 0x69, 0x70, 0x74, 0x20, 0x41, 0x50, 0x49, + 0x22, 0x3d, 0x0a, 0x0a, 0x46, 0x6c, 0x69, 0x70, 0x74, 0x20, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x21, + 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2d, 0x69, 0x6f, 0x2f, 0x66, 0x6c, 0x69, 0x70, + 0x74, 0x1a, 0x0c, 0x64, 0x65, 0x76, 0x40, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x69, 0x6f, 0x2a, + 0x4c, 0x0a, 0x0b, 0x4d, 0x49, 0x54, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x12, 0x3d, + 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2d, 0x69, 0x6f, 0x2f, 0x66, 0x6c, 0x69, 0x70, + 0x74, 0x2f, 0x62, 0x6c, 0x6f, 0x62, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x72, 0x70, 0x63, 0x2f, + 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2f, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x32, 0x06, 0x6c, + 0x61, 0x74, 0x65, 0x73, 0x74, 0x2a, 0x02, 0x01, 0x02, 0x32, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x3a, 0x10, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x52, 0x63, 0x0a, + 0x03, 0x34, 0x30, 0x31, 0x12, 0x5c, 0x0a, 0x3d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, + 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x75, 0x74, + 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x28, 0x61, 0x75, 0x74, 0x68, + 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x29, 0x2e, 0x12, 0x1b, 0x0a, 0x19, 0x1a, 0x17, 0x23, 0x2f, 0x64, 0x65, 0x66, + 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x72, 0x70, 0x63, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x5a, 0x2a, 0x0a, 0x28, 0x0a, 0x11, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x13, 0x08, 0x02, 0x1a, 0x0d, 0x41, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x02, 0x62, 0x17, + 0x0a, 0x15, 0x0a, 0x11, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, + 0x65, 0x61, 0x72, 0x65, 0x72, 0x12, 0x00, 0x72, 0x27, 0x0a, 0x0a, 0x46, 0x6c, 0x69, 0x70, 0x74, + 0x20, 0x44, 0x6f, 0x63, 0x73, 0x12, 0x19, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, + 0x77, 0x77, 0x2e, 0x66, 0x6c, 0x69, 0x70, 0x74, 0x2e, 0x69, 0x6f, 0x2f, 0x64, 0x6f, 0x63, 0x73, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -4271,7 +4402,7 @@ func file_flipt_proto_rawDescGZIP() []byte { } var file_flipt_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_flipt_proto_msgTypes = make([]protoimpl.MessageInfo, 45) +var file_flipt_proto_msgTypes = make([]protoimpl.MessageInfo, 47) var file_flipt_proto_goTypes = []interface{}{ (EvaluationReason)(0), // 0: flipt.EvaluationReason (MatchType)(0), // 1: flipt.MatchType @@ -4281,137 +4412,139 @@ var file_flipt_proto_goTypes = []interface{}{ (*EvaluationResponse)(nil), // 5: flipt.EvaluationResponse (*BatchEvaluationResponse)(nil), // 6: flipt.BatchEvaluationResponse (*Namespace)(nil), // 7: flipt.Namespace - (*Flag)(nil), // 8: flipt.Flag - (*NamespaceList)(nil), // 9: flipt.NamespaceList - (*GetNamespaceRequest)(nil), // 10: flipt.GetNamespaceRequest - (*ListNamespaceRequest)(nil), // 11: flipt.ListNamespaceRequest - (*CreateNamespaceRequest)(nil), // 12: flipt.CreateNamespaceRequest - (*FlagList)(nil), // 13: flipt.FlagList - (*GetFlagRequest)(nil), // 14: flipt.GetFlagRequest - (*ListFlagRequest)(nil), // 15: flipt.ListFlagRequest - (*CreateFlagRequest)(nil), // 16: flipt.CreateFlagRequest - (*UpdateFlagRequest)(nil), // 17: flipt.UpdateFlagRequest - (*DeleteFlagRequest)(nil), // 18: flipt.DeleteFlagRequest - (*Variant)(nil), // 19: flipt.Variant - (*CreateVariantRequest)(nil), // 20: flipt.CreateVariantRequest - (*UpdateVariantRequest)(nil), // 21: flipt.UpdateVariantRequest - (*DeleteVariantRequest)(nil), // 22: flipt.DeleteVariantRequest - (*Segment)(nil), // 23: flipt.Segment - (*SegmentList)(nil), // 24: flipt.SegmentList - (*GetSegmentRequest)(nil), // 25: flipt.GetSegmentRequest - (*ListSegmentRequest)(nil), // 26: flipt.ListSegmentRequest - (*CreateSegmentRequest)(nil), // 27: flipt.CreateSegmentRequest - (*UpdateSegmentRequest)(nil), // 28: flipt.UpdateSegmentRequest - (*DeleteSegmentRequest)(nil), // 29: flipt.DeleteSegmentRequest - (*Constraint)(nil), // 30: flipt.Constraint - (*CreateConstraintRequest)(nil), // 31: flipt.CreateConstraintRequest - (*UpdateConstraintRequest)(nil), // 32: flipt.UpdateConstraintRequest - (*DeleteConstraintRequest)(nil), // 33: flipt.DeleteConstraintRequest - (*Rule)(nil), // 34: flipt.Rule - (*RuleList)(nil), // 35: flipt.RuleList - (*ListRuleRequest)(nil), // 36: flipt.ListRuleRequest - (*GetRuleRequest)(nil), // 37: flipt.GetRuleRequest - (*CreateRuleRequest)(nil), // 38: flipt.CreateRuleRequest - (*UpdateRuleRequest)(nil), // 39: flipt.UpdateRuleRequest - (*DeleteRuleRequest)(nil), // 40: flipt.DeleteRuleRequest - (*OrderRulesRequest)(nil), // 41: flipt.OrderRulesRequest - (*Distribution)(nil), // 42: flipt.Distribution - (*CreateDistributionRequest)(nil), // 43: flipt.CreateDistributionRequest - (*UpdateDistributionRequest)(nil), // 44: flipt.UpdateDistributionRequest - (*DeleteDistributionRequest)(nil), // 45: flipt.DeleteDistributionRequest - nil, // 46: flipt.EvaluationRequest.ContextEntry - nil, // 47: flipt.EvaluationResponse.RequestContextEntry - (*timestamppb.Timestamp)(nil), // 48: google.protobuf.Timestamp - (*emptypb.Empty)(nil), // 49: google.protobuf.Empty + (*NamespaceList)(nil), // 8: flipt.NamespaceList + (*GetNamespaceRequest)(nil), // 9: flipt.GetNamespaceRequest + (*ListNamespaceRequest)(nil), // 10: flipt.ListNamespaceRequest + (*CreateNamespaceRequest)(nil), // 11: flipt.CreateNamespaceRequest + (*UpdateNamespaceRequest)(nil), // 12: flipt.UpdateNamespaceRequest + (*DeleteNamespaceRequest)(nil), // 13: flipt.DeleteNamespaceRequest + (*Flag)(nil), // 14: flipt.Flag + (*FlagList)(nil), // 15: flipt.FlagList + (*GetFlagRequest)(nil), // 16: flipt.GetFlagRequest + (*ListFlagRequest)(nil), // 17: flipt.ListFlagRequest + (*CreateFlagRequest)(nil), // 18: flipt.CreateFlagRequest + (*UpdateFlagRequest)(nil), // 19: flipt.UpdateFlagRequest + (*DeleteFlagRequest)(nil), // 20: flipt.DeleteFlagRequest + (*Variant)(nil), // 21: flipt.Variant + (*CreateVariantRequest)(nil), // 22: flipt.CreateVariantRequest + (*UpdateVariantRequest)(nil), // 23: flipt.UpdateVariantRequest + (*DeleteVariantRequest)(nil), // 24: flipt.DeleteVariantRequest + (*Segment)(nil), // 25: flipt.Segment + (*SegmentList)(nil), // 26: flipt.SegmentList + (*GetSegmentRequest)(nil), // 27: flipt.GetSegmentRequest + (*ListSegmentRequest)(nil), // 28: flipt.ListSegmentRequest + (*CreateSegmentRequest)(nil), // 29: flipt.CreateSegmentRequest + (*UpdateSegmentRequest)(nil), // 30: flipt.UpdateSegmentRequest + (*DeleteSegmentRequest)(nil), // 31: flipt.DeleteSegmentRequest + (*Constraint)(nil), // 32: flipt.Constraint + (*CreateConstraintRequest)(nil), // 33: flipt.CreateConstraintRequest + (*UpdateConstraintRequest)(nil), // 34: flipt.UpdateConstraintRequest + (*DeleteConstraintRequest)(nil), // 35: flipt.DeleteConstraintRequest + (*Rule)(nil), // 36: flipt.Rule + (*RuleList)(nil), // 37: flipt.RuleList + (*ListRuleRequest)(nil), // 38: flipt.ListRuleRequest + (*GetRuleRequest)(nil), // 39: flipt.GetRuleRequest + (*CreateRuleRequest)(nil), // 40: flipt.CreateRuleRequest + (*UpdateRuleRequest)(nil), // 41: flipt.UpdateRuleRequest + (*DeleteRuleRequest)(nil), // 42: flipt.DeleteRuleRequest + (*OrderRulesRequest)(nil), // 43: flipt.OrderRulesRequest + (*Distribution)(nil), // 44: flipt.Distribution + (*CreateDistributionRequest)(nil), // 45: flipt.CreateDistributionRequest + (*UpdateDistributionRequest)(nil), // 46: flipt.UpdateDistributionRequest + (*DeleteDistributionRequest)(nil), // 47: flipt.DeleteDistributionRequest + nil, // 48: flipt.EvaluationRequest.ContextEntry + nil, // 49: flipt.EvaluationResponse.RequestContextEntry + (*timestamppb.Timestamp)(nil), // 50: google.protobuf.Timestamp + (*emptypb.Empty)(nil), // 51: google.protobuf.Empty } var file_flipt_proto_depIdxs = []int32{ - 46, // 0: flipt.EvaluationRequest.context:type_name -> flipt.EvaluationRequest.ContextEntry + 48, // 0: flipt.EvaluationRequest.context:type_name -> flipt.EvaluationRequest.ContextEntry 3, // 1: flipt.BatchEvaluationRequest.requests:type_name -> flipt.EvaluationRequest - 47, // 2: flipt.EvaluationResponse.request_context:type_name -> flipt.EvaluationResponse.RequestContextEntry - 48, // 3: flipt.EvaluationResponse.timestamp:type_name -> google.protobuf.Timestamp + 49, // 2: flipt.EvaluationResponse.request_context:type_name -> flipt.EvaluationResponse.RequestContextEntry + 50, // 3: flipt.EvaluationResponse.timestamp:type_name -> google.protobuf.Timestamp 0, // 4: flipt.EvaluationResponse.reason:type_name -> flipt.EvaluationReason 5, // 5: flipt.BatchEvaluationResponse.responses:type_name -> flipt.EvaluationResponse - 48, // 6: flipt.Namespace.created_at:type_name -> google.protobuf.Timestamp - 48, // 7: flipt.Namespace.updated_at:type_name -> google.protobuf.Timestamp - 48, // 8: flipt.Flag.created_at:type_name -> google.protobuf.Timestamp - 48, // 9: flipt.Flag.updated_at:type_name -> google.protobuf.Timestamp - 19, // 10: flipt.Flag.variants:type_name -> flipt.Variant - 7, // 11: flipt.NamespaceList.namespaces:type_name -> flipt.Namespace - 8, // 12: flipt.FlagList.flags:type_name -> flipt.Flag - 48, // 13: flipt.Variant.created_at:type_name -> google.protobuf.Timestamp - 48, // 14: flipt.Variant.updated_at:type_name -> google.protobuf.Timestamp - 48, // 15: flipt.Segment.created_at:type_name -> google.protobuf.Timestamp - 48, // 16: flipt.Segment.updated_at:type_name -> google.protobuf.Timestamp - 30, // 17: flipt.Segment.constraints:type_name -> flipt.Constraint + 50, // 6: flipt.Namespace.created_at:type_name -> google.protobuf.Timestamp + 50, // 7: flipt.Namespace.updated_at:type_name -> google.protobuf.Timestamp + 7, // 8: flipt.NamespaceList.namespaces:type_name -> flipt.Namespace + 50, // 9: flipt.Flag.created_at:type_name -> google.protobuf.Timestamp + 50, // 10: flipt.Flag.updated_at:type_name -> google.protobuf.Timestamp + 21, // 11: flipt.Flag.variants:type_name -> flipt.Variant + 14, // 12: flipt.FlagList.flags:type_name -> flipt.Flag + 50, // 13: flipt.Variant.created_at:type_name -> google.protobuf.Timestamp + 50, // 14: flipt.Variant.updated_at:type_name -> google.protobuf.Timestamp + 50, // 15: flipt.Segment.created_at:type_name -> google.protobuf.Timestamp + 50, // 16: flipt.Segment.updated_at:type_name -> google.protobuf.Timestamp + 32, // 17: flipt.Segment.constraints:type_name -> flipt.Constraint 1, // 18: flipt.Segment.match_type:type_name -> flipt.MatchType - 23, // 19: flipt.SegmentList.segments:type_name -> flipt.Segment + 25, // 19: flipt.SegmentList.segments:type_name -> flipt.Segment 1, // 20: flipt.CreateSegmentRequest.match_type:type_name -> flipt.MatchType 1, // 21: flipt.UpdateSegmentRequest.match_type:type_name -> flipt.MatchType 2, // 22: flipt.Constraint.type:type_name -> flipt.ComparisonType - 48, // 23: flipt.Constraint.created_at:type_name -> google.protobuf.Timestamp - 48, // 24: flipt.Constraint.updated_at:type_name -> google.protobuf.Timestamp + 50, // 23: flipt.Constraint.created_at:type_name -> google.protobuf.Timestamp + 50, // 24: flipt.Constraint.updated_at:type_name -> google.protobuf.Timestamp 2, // 25: flipt.CreateConstraintRequest.type:type_name -> flipt.ComparisonType 2, // 26: flipt.UpdateConstraintRequest.type:type_name -> flipt.ComparisonType - 42, // 27: flipt.Rule.distributions:type_name -> flipt.Distribution - 48, // 28: flipt.Rule.created_at:type_name -> google.protobuf.Timestamp - 48, // 29: flipt.Rule.updated_at:type_name -> google.protobuf.Timestamp - 34, // 30: flipt.RuleList.rules:type_name -> flipt.Rule - 48, // 31: flipt.Distribution.created_at:type_name -> google.protobuf.Timestamp - 48, // 32: flipt.Distribution.updated_at:type_name -> google.protobuf.Timestamp + 44, // 27: flipt.Rule.distributions:type_name -> flipt.Distribution + 50, // 28: flipt.Rule.created_at:type_name -> google.protobuf.Timestamp + 50, // 29: flipt.Rule.updated_at:type_name -> google.protobuf.Timestamp + 36, // 30: flipt.RuleList.rules:type_name -> flipt.Rule + 50, // 31: flipt.Distribution.created_at:type_name -> google.protobuf.Timestamp + 50, // 32: flipt.Distribution.updated_at:type_name -> google.protobuf.Timestamp 3, // 33: flipt.Flipt.Evaluate:input_type -> flipt.EvaluationRequest 4, // 34: flipt.Flipt.BatchEvaluate:input_type -> flipt.BatchEvaluationRequest - 14, // 35: flipt.Flipt.GetFlag:input_type -> flipt.GetFlagRequest - 15, // 36: flipt.Flipt.ListFlags:input_type -> flipt.ListFlagRequest - 16, // 37: flipt.Flipt.CreateFlag:input_type -> flipt.CreateFlagRequest - 17, // 38: flipt.Flipt.UpdateFlag:input_type -> flipt.UpdateFlagRequest - 18, // 39: flipt.Flipt.DeleteFlag:input_type -> flipt.DeleteFlagRequest - 20, // 40: flipt.Flipt.CreateVariant:input_type -> flipt.CreateVariantRequest - 21, // 41: flipt.Flipt.UpdateVariant:input_type -> flipt.UpdateVariantRequest - 22, // 42: flipt.Flipt.DeleteVariant:input_type -> flipt.DeleteVariantRequest - 37, // 43: flipt.Flipt.GetRule:input_type -> flipt.GetRuleRequest - 36, // 44: flipt.Flipt.ListRules:input_type -> flipt.ListRuleRequest - 38, // 45: flipt.Flipt.CreateRule:input_type -> flipt.CreateRuleRequest - 39, // 46: flipt.Flipt.UpdateRule:input_type -> flipt.UpdateRuleRequest - 41, // 47: flipt.Flipt.OrderRules:input_type -> flipt.OrderRulesRequest - 40, // 48: flipt.Flipt.DeleteRule:input_type -> flipt.DeleteRuleRequest - 43, // 49: flipt.Flipt.CreateDistribution:input_type -> flipt.CreateDistributionRequest - 44, // 50: flipt.Flipt.UpdateDistribution:input_type -> flipt.UpdateDistributionRequest - 45, // 51: flipt.Flipt.DeleteDistribution:input_type -> flipt.DeleteDistributionRequest - 25, // 52: flipt.Flipt.GetSegment:input_type -> flipt.GetSegmentRequest - 26, // 53: flipt.Flipt.ListSegments:input_type -> flipt.ListSegmentRequest - 27, // 54: flipt.Flipt.CreateSegment:input_type -> flipt.CreateSegmentRequest - 28, // 55: flipt.Flipt.UpdateSegment:input_type -> flipt.UpdateSegmentRequest - 29, // 56: flipt.Flipt.DeleteSegment:input_type -> flipt.DeleteSegmentRequest - 31, // 57: flipt.Flipt.CreateConstraint:input_type -> flipt.CreateConstraintRequest - 32, // 58: flipt.Flipt.UpdateConstraint:input_type -> flipt.UpdateConstraintRequest - 33, // 59: flipt.Flipt.DeleteConstraint:input_type -> flipt.DeleteConstraintRequest + 16, // 35: flipt.Flipt.GetFlag:input_type -> flipt.GetFlagRequest + 17, // 36: flipt.Flipt.ListFlags:input_type -> flipt.ListFlagRequest + 18, // 37: flipt.Flipt.CreateFlag:input_type -> flipt.CreateFlagRequest + 19, // 38: flipt.Flipt.UpdateFlag:input_type -> flipt.UpdateFlagRequest + 20, // 39: flipt.Flipt.DeleteFlag:input_type -> flipt.DeleteFlagRequest + 22, // 40: flipt.Flipt.CreateVariant:input_type -> flipt.CreateVariantRequest + 23, // 41: flipt.Flipt.UpdateVariant:input_type -> flipt.UpdateVariantRequest + 24, // 42: flipt.Flipt.DeleteVariant:input_type -> flipt.DeleteVariantRequest + 39, // 43: flipt.Flipt.GetRule:input_type -> flipt.GetRuleRequest + 38, // 44: flipt.Flipt.ListRules:input_type -> flipt.ListRuleRequest + 40, // 45: flipt.Flipt.CreateRule:input_type -> flipt.CreateRuleRequest + 41, // 46: flipt.Flipt.UpdateRule:input_type -> flipt.UpdateRuleRequest + 43, // 47: flipt.Flipt.OrderRules:input_type -> flipt.OrderRulesRequest + 42, // 48: flipt.Flipt.DeleteRule:input_type -> flipt.DeleteRuleRequest + 45, // 49: flipt.Flipt.CreateDistribution:input_type -> flipt.CreateDistributionRequest + 46, // 50: flipt.Flipt.UpdateDistribution:input_type -> flipt.UpdateDistributionRequest + 47, // 51: flipt.Flipt.DeleteDistribution:input_type -> flipt.DeleteDistributionRequest + 27, // 52: flipt.Flipt.GetSegment:input_type -> flipt.GetSegmentRequest + 28, // 53: flipt.Flipt.ListSegments:input_type -> flipt.ListSegmentRequest + 29, // 54: flipt.Flipt.CreateSegment:input_type -> flipt.CreateSegmentRequest + 30, // 55: flipt.Flipt.UpdateSegment:input_type -> flipt.UpdateSegmentRequest + 31, // 56: flipt.Flipt.DeleteSegment:input_type -> flipt.DeleteSegmentRequest + 33, // 57: flipt.Flipt.CreateConstraint:input_type -> flipt.CreateConstraintRequest + 34, // 58: flipt.Flipt.UpdateConstraint:input_type -> flipt.UpdateConstraintRequest + 35, // 59: flipt.Flipt.DeleteConstraint:input_type -> flipt.DeleteConstraintRequest 5, // 60: flipt.Flipt.Evaluate:output_type -> flipt.EvaluationResponse 6, // 61: flipt.Flipt.BatchEvaluate:output_type -> flipt.BatchEvaluationResponse - 8, // 62: flipt.Flipt.GetFlag:output_type -> flipt.Flag - 13, // 63: flipt.Flipt.ListFlags:output_type -> flipt.FlagList - 8, // 64: flipt.Flipt.CreateFlag:output_type -> flipt.Flag - 8, // 65: flipt.Flipt.UpdateFlag:output_type -> flipt.Flag - 49, // 66: flipt.Flipt.DeleteFlag:output_type -> google.protobuf.Empty - 19, // 67: flipt.Flipt.CreateVariant:output_type -> flipt.Variant - 19, // 68: flipt.Flipt.UpdateVariant:output_type -> flipt.Variant - 49, // 69: flipt.Flipt.DeleteVariant:output_type -> google.protobuf.Empty - 34, // 70: flipt.Flipt.GetRule:output_type -> flipt.Rule - 35, // 71: flipt.Flipt.ListRules:output_type -> flipt.RuleList - 34, // 72: flipt.Flipt.CreateRule:output_type -> flipt.Rule - 34, // 73: flipt.Flipt.UpdateRule:output_type -> flipt.Rule - 49, // 74: flipt.Flipt.OrderRules:output_type -> google.protobuf.Empty - 49, // 75: flipt.Flipt.DeleteRule:output_type -> google.protobuf.Empty - 42, // 76: flipt.Flipt.CreateDistribution:output_type -> flipt.Distribution - 42, // 77: flipt.Flipt.UpdateDistribution:output_type -> flipt.Distribution - 49, // 78: flipt.Flipt.DeleteDistribution:output_type -> google.protobuf.Empty - 23, // 79: flipt.Flipt.GetSegment:output_type -> flipt.Segment - 24, // 80: flipt.Flipt.ListSegments:output_type -> flipt.SegmentList - 23, // 81: flipt.Flipt.CreateSegment:output_type -> flipt.Segment - 23, // 82: flipt.Flipt.UpdateSegment:output_type -> flipt.Segment - 49, // 83: flipt.Flipt.DeleteSegment:output_type -> google.protobuf.Empty - 30, // 84: flipt.Flipt.CreateConstraint:output_type -> flipt.Constraint - 30, // 85: flipt.Flipt.UpdateConstraint:output_type -> flipt.Constraint - 49, // 86: flipt.Flipt.DeleteConstraint:output_type -> google.protobuf.Empty + 14, // 62: flipt.Flipt.GetFlag:output_type -> flipt.Flag + 15, // 63: flipt.Flipt.ListFlags:output_type -> flipt.FlagList + 14, // 64: flipt.Flipt.CreateFlag:output_type -> flipt.Flag + 14, // 65: flipt.Flipt.UpdateFlag:output_type -> flipt.Flag + 51, // 66: flipt.Flipt.DeleteFlag:output_type -> google.protobuf.Empty + 21, // 67: flipt.Flipt.CreateVariant:output_type -> flipt.Variant + 21, // 68: flipt.Flipt.UpdateVariant:output_type -> flipt.Variant + 51, // 69: flipt.Flipt.DeleteVariant:output_type -> google.protobuf.Empty + 36, // 70: flipt.Flipt.GetRule:output_type -> flipt.Rule + 37, // 71: flipt.Flipt.ListRules:output_type -> flipt.RuleList + 36, // 72: flipt.Flipt.CreateRule:output_type -> flipt.Rule + 36, // 73: flipt.Flipt.UpdateRule:output_type -> flipt.Rule + 51, // 74: flipt.Flipt.OrderRules:output_type -> google.protobuf.Empty + 51, // 75: flipt.Flipt.DeleteRule:output_type -> google.protobuf.Empty + 44, // 76: flipt.Flipt.CreateDistribution:output_type -> flipt.Distribution + 44, // 77: flipt.Flipt.UpdateDistribution:output_type -> flipt.Distribution + 51, // 78: flipt.Flipt.DeleteDistribution:output_type -> google.protobuf.Empty + 25, // 79: flipt.Flipt.GetSegment:output_type -> flipt.Segment + 26, // 80: flipt.Flipt.ListSegments:output_type -> flipt.SegmentList + 25, // 81: flipt.Flipt.CreateSegment:output_type -> flipt.Segment + 25, // 82: flipt.Flipt.UpdateSegment:output_type -> flipt.Segment + 51, // 83: flipt.Flipt.DeleteSegment:output_type -> google.protobuf.Empty + 32, // 84: flipt.Flipt.CreateConstraint:output_type -> flipt.Constraint + 32, // 85: flipt.Flipt.UpdateConstraint:output_type -> flipt.Constraint + 51, // 86: flipt.Flipt.DeleteConstraint:output_type -> google.protobuf.Empty 60, // [60:87] is the sub-list for method output_type 33, // [33:60] is the sub-list for method input_type 33, // [33:33] is the sub-list for extension type_name @@ -4486,7 +4619,7 @@ func file_flipt_proto_init() { } } file_flipt_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Flag); i { + switch v := v.(*NamespaceList); i { case 0: return &v.state case 1: @@ -4498,7 +4631,7 @@ func file_flipt_proto_init() { } } file_flipt_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NamespaceList); i { + switch v := v.(*GetNamespaceRequest); i { case 0: return &v.state case 1: @@ -4510,7 +4643,7 @@ func file_flipt_proto_init() { } } file_flipt_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNamespaceRequest); i { + switch v := v.(*ListNamespaceRequest); i { case 0: return &v.state case 1: @@ -4522,7 +4655,7 @@ func file_flipt_proto_init() { } } file_flipt_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListNamespaceRequest); i { + switch v := v.(*CreateNamespaceRequest); i { case 0: return &v.state case 1: @@ -4534,7 +4667,7 @@ func file_flipt_proto_init() { } } file_flipt_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateNamespaceRequest); i { + switch v := v.(*UpdateNamespaceRequest); i { case 0: return &v.state case 1: @@ -4546,7 +4679,7 @@ func file_flipt_proto_init() { } } file_flipt_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FlagList); i { + switch v := v.(*DeleteNamespaceRequest); i { case 0: return &v.state case 1: @@ -4558,7 +4691,7 @@ func file_flipt_proto_init() { } } file_flipt_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetFlagRequest); i { + switch v := v.(*Flag); i { case 0: return &v.state case 1: @@ -4570,7 +4703,7 @@ func file_flipt_proto_init() { } } file_flipt_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListFlagRequest); i { + switch v := v.(*FlagList); i { case 0: return &v.state case 1: @@ -4582,7 +4715,7 @@ func file_flipt_proto_init() { } } file_flipt_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateFlagRequest); i { + switch v := v.(*GetFlagRequest); i { case 0: return &v.state case 1: @@ -4594,7 +4727,7 @@ func file_flipt_proto_init() { } } file_flipt_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateFlagRequest); i { + switch v := v.(*ListFlagRequest); i { case 0: return &v.state case 1: @@ -4606,7 +4739,7 @@ func file_flipt_proto_init() { } } file_flipt_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteFlagRequest); i { + switch v := v.(*CreateFlagRequest); i { case 0: return &v.state case 1: @@ -4618,7 +4751,7 @@ func file_flipt_proto_init() { } } file_flipt_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Variant); i { + switch v := v.(*UpdateFlagRequest); i { case 0: return &v.state case 1: @@ -4630,7 +4763,7 @@ func file_flipt_proto_init() { } } file_flipt_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateVariantRequest); i { + switch v := v.(*DeleteFlagRequest); i { case 0: return &v.state case 1: @@ -4642,7 +4775,7 @@ func file_flipt_proto_init() { } } file_flipt_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateVariantRequest); i { + switch v := v.(*Variant); i { case 0: return &v.state case 1: @@ -4654,7 +4787,7 @@ func file_flipt_proto_init() { } } file_flipt_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteVariantRequest); i { + switch v := v.(*CreateVariantRequest); i { case 0: return &v.state case 1: @@ -4666,7 +4799,7 @@ func file_flipt_proto_init() { } } file_flipt_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Segment); i { + switch v := v.(*UpdateVariantRequest); i { case 0: return &v.state case 1: @@ -4678,7 +4811,7 @@ func file_flipt_proto_init() { } } file_flipt_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SegmentList); i { + switch v := v.(*DeleteVariantRequest); i { case 0: return &v.state case 1: @@ -4690,7 +4823,7 @@ func file_flipt_proto_init() { } } file_flipt_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetSegmentRequest); i { + switch v := v.(*Segment); i { case 0: return &v.state case 1: @@ -4702,7 +4835,7 @@ func file_flipt_proto_init() { } } file_flipt_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListSegmentRequest); i { + switch v := v.(*SegmentList); i { case 0: return &v.state case 1: @@ -4714,7 +4847,7 @@ func file_flipt_proto_init() { } } file_flipt_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateSegmentRequest); i { + switch v := v.(*GetSegmentRequest); i { case 0: return &v.state case 1: @@ -4726,7 +4859,7 @@ func file_flipt_proto_init() { } } file_flipt_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateSegmentRequest); i { + switch v := v.(*ListSegmentRequest); i { case 0: return &v.state case 1: @@ -4738,7 +4871,7 @@ func file_flipt_proto_init() { } } file_flipt_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteSegmentRequest); i { + switch v := v.(*CreateSegmentRequest); i { case 0: return &v.state case 1: @@ -4750,7 +4883,7 @@ func file_flipt_proto_init() { } } file_flipt_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Constraint); i { + switch v := v.(*UpdateSegmentRequest); i { case 0: return &v.state case 1: @@ -4762,7 +4895,7 @@ func file_flipt_proto_init() { } } file_flipt_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateConstraintRequest); i { + switch v := v.(*DeleteSegmentRequest); i { case 0: return &v.state case 1: @@ -4774,7 +4907,7 @@ func file_flipt_proto_init() { } } file_flipt_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateConstraintRequest); i { + switch v := v.(*Constraint); i { case 0: return &v.state case 1: @@ -4786,7 +4919,7 @@ func file_flipt_proto_init() { } } file_flipt_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteConstraintRequest); i { + switch v := v.(*CreateConstraintRequest); i { case 0: return &v.state case 1: @@ -4798,7 +4931,7 @@ func file_flipt_proto_init() { } } file_flipt_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Rule); i { + switch v := v.(*UpdateConstraintRequest); i { case 0: return &v.state case 1: @@ -4810,7 +4943,7 @@ func file_flipt_proto_init() { } } file_flipt_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RuleList); i { + switch v := v.(*DeleteConstraintRequest); i { case 0: return &v.state case 1: @@ -4822,7 +4955,7 @@ func file_flipt_proto_init() { } } file_flipt_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListRuleRequest); i { + switch v := v.(*Rule); i { case 0: return &v.state case 1: @@ -4834,7 +4967,7 @@ func file_flipt_proto_init() { } } file_flipt_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetRuleRequest); i { + switch v := v.(*RuleList); i { case 0: return &v.state case 1: @@ -4846,7 +4979,7 @@ func file_flipt_proto_init() { } } file_flipt_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateRuleRequest); i { + switch v := v.(*ListRuleRequest); i { case 0: return &v.state case 1: @@ -4858,7 +4991,7 @@ func file_flipt_proto_init() { } } file_flipt_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateRuleRequest); i { + switch v := v.(*GetRuleRequest); i { case 0: return &v.state case 1: @@ -4870,7 +5003,7 @@ func file_flipt_proto_init() { } } file_flipt_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteRuleRequest); i { + switch v := v.(*CreateRuleRequest); i { case 0: return &v.state case 1: @@ -4882,7 +5015,7 @@ func file_flipt_proto_init() { } } file_flipt_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OrderRulesRequest); i { + switch v := v.(*UpdateRuleRequest); i { case 0: return &v.state case 1: @@ -4894,7 +5027,7 @@ func file_flipt_proto_init() { } } file_flipt_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Distribution); i { + switch v := v.(*DeleteRuleRequest); i { case 0: return &v.state case 1: @@ -4906,7 +5039,7 @@ func file_flipt_proto_init() { } } file_flipt_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateDistributionRequest); i { + switch v := v.(*OrderRulesRequest); i { case 0: return &v.state case 1: @@ -4918,7 +5051,7 @@ func file_flipt_proto_init() { } } file_flipt_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateDistributionRequest); i { + switch v := v.(*Distribution); i { case 0: return &v.state case 1: @@ -4930,6 +5063,30 @@ func file_flipt_proto_init() { } } file_flipt_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateDistributionRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_flipt_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateDistributionRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_flipt_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DeleteDistributionRequest); i { case 0: return &v.state @@ -4948,7 +5105,7 @@ func file_flipt_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_flipt_proto_rawDesc, NumEnums: 3, - NumMessages: 45, + NumMessages: 47, NumExtensions: 0, NumServices: 1, }, diff --git a/rpc/flipt/flipt.proto b/rpc/flipt/flipt.proto index 13b42ac1ce..e727c2523a 100644 --- a/rpc/flipt/flipt.proto +++ b/rpc/flipt/flipt.proto @@ -123,17 +123,6 @@ message Namespace { google.protobuf.Timestamp updated_at = 6; } -message Flag { - string key = 1; - string name = 2; - string description = 3; - bool enabled = 4; - google.protobuf.Timestamp created_at = 5; - google.protobuf.Timestamp updated_at = 6; - repeated Variant variants = 7; - string namespace_key = 8; -} - message NamespaceList { repeated Namespace namespaces = 1; string next_page_token = 2; @@ -172,6 +161,43 @@ message CreateNamespaceRequest { bool protected = 4; } +message UpdateNamespaceRequest { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { + json_schema: { + required: [ + "key", + "name" + ] + } + }; + + string key = 1; + string name = 2; + string description = 3; + bool protected = 4; +} + +message DeleteNamespaceRequest { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { + json_schema: { + required: ["key"] + } + }; + + string key = 1; +} + +message Flag { + string key = 1; + string name = 2; + string description = 3; + bool enabled = 4; + google.protobuf.Timestamp created_at = 5; + google.protobuf.Timestamp updated_at = 6; + repeated Variant variants = 7; + string namespace_key = 8; +} + message FlagList { repeated Flag flags = 1; string next_page_token = 2; From 7b8d85ffe5d3adb176a83d260687d14b9f4efdd5 Mon Sep 17 00:00:00 2001 From: Mark Phelps <209477+markphelps@users.noreply.github.com> Date: Tue, 7 Mar 2023 13:59:05 -0500 Subject: [PATCH 02/11] chore: add tests; storage impl --- internal/storage/sql/common/namespace.go | 205 ++++++++++++- internal/storage/sql/namespaces_test.go | 361 +++++++++++++++++++++++ internal/storage/sql/sqlite/sqlite.go | 19 ++ 3 files changed, 579 insertions(+), 6 deletions(-) create mode 100644 internal/storage/sql/namespaces_test.go diff --git a/internal/storage/sql/common/namespace.go b/internal/storage/sql/common/namespace.go index e849eb35cd..c4ca7438bb 100644 --- a/internal/storage/sql/common/namespace.go +++ b/internal/storage/sql/common/namespace.go @@ -2,31 +2,224 @@ package common import ( "context" + "database/sql" + "encoding/json" + "errors" + "fmt" + sq "github.com/Masterminds/squirrel" + errs "go.flipt.io/flipt/errors" "go.flipt.io/flipt/internal/storage" + fliptsql "go.flipt.io/flipt/internal/storage/sql" flipt "go.flipt.io/flipt/rpc/flipt" + "google.golang.org/protobuf/types/known/timestamppb" ) func (s *Store) GetNamespace(ctx context.Context, key string) (*flipt.Namespace, error) { - panic("not implemented") + var ( + createdAt fliptsql.Timestamp + updatedAt fliptsql.Timestamp + + namespace = &flipt.Namespace{} + + err = s.builder.Select("\"key\", name, description, protected, created_at, updated_at"). + From("namespaces"). + Where(sq.Eq{"key": key}). + QueryRowContext(ctx). + Scan( + &namespace.Key, + &namespace.Name, + &namespace.Description, + &namespace.Protected, + &createdAt, + &updatedAt) + ) + + if err != nil { + if errors.Is(err, sql.ErrNoRows) { + return nil, errs.ErrNotFoundf(`namespace "%s"`, key) + } + + return nil, err + } + + namespace.CreatedAt = createdAt.Timestamp + namespace.UpdatedAt = updatedAt.Timestamp + + return namespace, nil } func (s *Store) ListNamespaces(ctx context.Context, opts ...storage.QueryOption) (storage.ResultSet[*flipt.Namespace], error) { - panic("not implemented") + params := &storage.QueryParams{} + + for _, opt := range opts { + opt(params) + } + + var ( + namespaces []*flipt.Namespace + results = storage.ResultSet[*flipt.Namespace]{} + + query = s.builder.Select("\"key\", name, description, protected, created_at, updated_at"). + From("namespaces"). + OrderBy(fmt.Sprintf("created_at %s", params.Order)) + ) + + if params.Limit > 0 { + query = query.Limit(params.Limit + 1) + } + + var offset uint64 + + if params.PageToken != "" { + var token PageToken + + if err := json.Unmarshal([]byte(params.PageToken), &token); err != nil { + return results, fmt.Errorf("decoding page token %w", err) + } + + offset = token.Offset + query = query.Offset(offset) + } else if params.Offset > 0 { + offset = params.Offset + query = query.Offset(offset) + } + + rows, err := query.QueryContext(ctx) + if err != nil { + return results, err + } + + defer func() { + if cerr := rows.Close(); cerr != nil && err == nil { + err = cerr + } + }() + + for rows.Next() { + var ( + namespace = &flipt.Namespace{} + + createdAt fliptsql.Timestamp + updatedAt fliptsql.Timestamp + ) + + if err := rows.Scan( + &namespace.Key, + &namespace.Name, + &namespace.Description, + &namespace.Protected, + &createdAt, + &updatedAt, + ); err != nil { + return results, err + } + + namespace.CreatedAt = createdAt.Timestamp + namespace.UpdatedAt = updatedAt.Timestamp + + namespaces = append(namespaces, namespace) + } + + if err := rows.Err(); err != nil { + return results, err + } + + if err := rows.Close(); err != nil { + return results, err + } + + var next *flipt.Namespace + + if len(namespaces) > int(params.Limit) && params.Limit > 0 { + next = namespaces[len(namespaces)-1] + namespaces = namespaces[:params.Limit] + } + + results.Results = namespaces + + if next != nil { + out, err := json.Marshal(PageToken{Key: next.Key, Offset: offset + uint64(len(namespaces))}) + if err != nil { + return results, fmt.Errorf("encoding page token %w", err) + } + results.NextPageToken = string(out) + } + + return results, nil } func (s *Store) CountNamespaces(ctx context.Context) (uint64, error) { - panic("not implemented") + var count uint64 + + if err := s.builder.Select("COUNT(*)"). + From("namespaces"). + QueryRowContext(ctx). + Scan(&count); err != nil { + return 0, err + } + + return count, nil } func (s *Store) CreateNamespace(ctx context.Context, r *flipt.CreateNamespaceRequest) (*flipt.Namespace, error) { - panic("not implemented") + var ( + now = timestamppb.Now() + namespace = &flipt.Namespace{ + Key: r.Key, + Name: r.Name, + Description: r.Description, + Protected: r.Protected, + CreatedAt: now, + UpdatedAt: now, + } + ) + + if _, err := s.builder.Insert("namespaces"). + Columns("\"key\"", "name", "description", "protected", "created_at", "updated_at"). + Values( + namespace.Key, + namespace.Name, + namespace.Description, + namespace.Protected, + &fliptsql.Timestamp{Timestamp: namespace.CreatedAt}, + &fliptsql.Timestamp{Timestamp: namespace.UpdatedAt}, + ). + ExecContext(ctx); err != nil { + return nil, err + } + + return namespace, nil } func (s *Store) UpdateNamespace(ctx context.Context, r *flipt.UpdateNamespaceRequest) (*flipt.Namespace, error) { - panic("not implemented") + query := s.builder.Update("namespaces"). + Set("name", r.Name). + Set("description", r.Description). + Set("updated_at", &fliptsql.Timestamp{Timestamp: timestamppb.Now()}). + Where(sq.Eq{"\"key\"": r.Key}) + + res, err := query.ExecContext(ctx) + if err != nil { + return nil, err + } + + count, err := res.RowsAffected() + if err != nil { + return nil, err + } + + if count != 1 { + return nil, errs.ErrNotFoundf(`namespace "%s"`, r.Key) + } + + return s.GetNamespace(ctx, r.Key) } func (s *Store) DeleteNamespace(ctx context.Context, r *flipt.DeleteNamespaceRequest) error { - panic("not implemented") + _, err := s.builder.Delete("namespaces"). + Where(sq.Eq{"\"key\"": r.Key}). + ExecContext(ctx) + + return err } diff --git a/internal/storage/sql/namespaces_test.go b/internal/storage/sql/namespaces_test.go new file mode 100644 index 0000000000..93ca9764f0 --- /dev/null +++ b/internal/storage/sql/namespaces_test.go @@ -0,0 +1,361 @@ +package sql_test + +import ( + "context" + "encoding/json" + "time" + + "github.com/gofrs/uuid" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.flipt.io/flipt/internal/storage" + fliptsql "go.flipt.io/flipt/internal/storage/sql" + "go.flipt.io/flipt/internal/storage/sql/common" + flipt "go.flipt.io/flipt/rpc/flipt" +) + +func (s *DBTestSuite) TestGetNamespace() { + t := s.T() + + ns, err := s.store.CreateNamespace(context.TODO(), &flipt.CreateNamespaceRequest{ + Key: t.Name(), + Name: "foo", + Description: "bar", + Protected: true, + }) + + require.NoError(t, err) + assert.NotNil(t, ns) + + got, err := s.store.GetNamespace(context.TODO(), ns.Key) + + require.NoError(t, err) + assert.NotNil(t, got) + + assert.Equal(t, ns.Key, got.Key) + assert.Equal(t, ns.Name, got.Name) + assert.Equal(t, ns.Description, got.Description) + assert.Equal(t, ns.Protected, got.Protected) + assert.NotZero(t, ns.CreatedAt) + assert.NotZero(t, ns.UpdatedAt) +} + +func (s *DBTestSuite) TestGetNamespaceNotFound() { + t := s.T() + + _, err := s.store.GetNamespace(context.TODO(), "foo") + assert.EqualError(t, err, "namespace \"foo\" not found") +} + +func (s *DBTestSuite) TestListNamespaces() { + t := s.T() + + reqs := []*flipt.CreateNamespaceRequest{ + { + Key: uuid.Must(uuid.NewV4()).String(), + Name: "foo", + Description: "bar", + Protected: true, + }, + { + Key: uuid.Must(uuid.NewV4()).String(), + Name: "foo", + Description: "bar", + }, + } + + for _, req := range reqs { + _, err := s.store.CreateNamespace(context.TODO(), req) + require.NoError(t, err) + } + + res, err := s.store.ListNamespaces(context.TODO()) + require.NoError(t, err) + + got := res.Results + assert.NotZero(t, len(got)) + + for _, ns := range got { + assert.NotZero(t, ns.CreatedAt) + assert.NotZero(t, ns.UpdatedAt) + } +} + +func (s *DBTestSuite) TestListNamespacesPagination_LimitOffset() { + t := s.T() + + reqs := []*flipt.CreateNamespaceRequest{ + { + Key: uuid.Must(uuid.NewV4()).String(), + Name: "foo", + Description: "bar", + Protected: true, + }, + { + Key: uuid.Must(uuid.NewV4()).String(), + Name: "foo", + Description: "bar", + }, + { + Key: uuid.Must(uuid.NewV4()).String(), + Name: "foo", + Description: "bar", + Protected: true, + }, + } + + for _, req := range reqs { + if s.db.Driver == fliptsql.MySQL { + // required for MySQL since it only s.stores timestamps to the second and not millisecond granularity + time.Sleep(time.Second) + } + _, err := s.store.CreateNamespace(context.TODO(), req) + require.NoError(t, err) + } + + oldest, middle, newest := reqs[0], reqs[1], reqs[2] + + // TODO: the ordering (DESC) is required because the default ordering is ASC and we are not clearing the DB between tests + // get middle namespace + res, err := s.store.ListNamespaces(context.TODO(), storage.WithOrder(storage.OrderDesc), storage.WithLimit(1), storage.WithOffset(1)) + require.NoError(t, err) + + got := res.Results + assert.Len(t, got, 1) + + assert.Equal(t, middle.Key, got[0].Key) + + // get first (newest) namespace + res, err = s.store.ListNamespaces(context.TODO(), storage.WithOrder(storage.OrderDesc), storage.WithLimit(1)) + require.NoError(t, err) + + got = res.Results + assert.Len(t, got, 1) + + assert.Equal(t, newest.Key, got[0].Key) + + // get last (oldest) namespace + res, err = s.store.ListNamespaces(context.TODO(), storage.WithOrder(storage.OrderDesc), storage.WithLimit(1), storage.WithOffset(2)) + require.NoError(t, err) + + got = res.Results + assert.Len(t, got, 1) + + assert.Equal(t, oldest.Key, got[0].Key) + + // get all namespaces + res, err = s.store.ListNamespaces(context.TODO(), storage.WithOrder(storage.OrderDesc)) + require.NoError(t, err) + + got = res.Results + + assert.Equal(t, newest.Key, got[0].Key) + assert.Equal(t, middle.Key, got[1].Key) + assert.Equal(t, oldest.Key, got[2].Key) +} + +func (s *DBTestSuite) TestListNamespacesPagination_LimitWithNextPage() { + t := s.T() + + reqs := []*flipt.CreateNamespaceRequest{ + { + Key: uuid.Must(uuid.NewV4()).String(), + Name: "foo", + Description: "bar", + Protected: true, + }, + { + Key: uuid.Must(uuid.NewV4()).String(), + Name: "foo", + Description: "bar", + }, + { + Key: uuid.Must(uuid.NewV4()).String(), + Name: "foo", + Description: "bar", + Protected: true, + }, + } + + for _, req := range reqs { + if s.db.Driver == fliptsql.MySQL { + // required for MySQL since it only s.stores timestamps to the second and not millisecond granularity + time.Sleep(time.Second) + } + _, err := s.store.CreateNamespace(context.TODO(), req) + require.NoError(t, err) + } + + oldest, middle, newest := reqs[0], reqs[1], reqs[2] + + // TODO: the ordering (DESC) is required because the default ordering is ASC and we are not clearing the DB between tests + // get newest namespace + opts := []storage.QueryOption{storage.WithOrder(storage.OrderDesc), storage.WithLimit(1)} + + res, err := s.store.ListNamespaces(context.TODO(), opts...) + require.NoError(t, err) + + got := res.Results + assert.Len(t, got, 1) + assert.Equal(t, newest.Key, got[0].Key) + assert.NotEmpty(t, res.NextPageToken) + + pageToken := &common.PageToken{} + err = json.Unmarshal([]byte(res.NextPageToken), pageToken) + require.NoError(t, err) + // next page should be the middle namespace + assert.Equal(t, middle.Key, pageToken.Key) + assert.NotZero(t, pageToken.Offset) + + opts = append(opts, storage.WithPageToken(res.NextPageToken)) + + // get middle namespace + res, err = s.store.ListNamespaces(context.TODO(), opts...) + require.NoError(t, err) + + got = res.Results + assert.Len(t, got, 1) + assert.Equal(t, middle.Key, got[0].Key) + + err = json.Unmarshal([]byte(res.NextPageToken), pageToken) + require.NoError(t, err) + // next page should be the oldest namespace + assert.Equal(t, oldest.Key, pageToken.Key) + assert.NotZero(t, pageToken.Offset) + + opts = []storage.QueryOption{storage.WithOrder(storage.OrderDesc), storage.WithLimit(1), storage.WithPageToken(res.NextPageToken)} + + // get oldest namespace + res, err = s.store.ListNamespaces(context.TODO(), opts...) + require.NoError(t, err) + + got = res.Results + assert.Len(t, got, 1) + assert.Equal(t, oldest.Key, got[0].Key) + + opts = []storage.QueryOption{storage.WithOrder(storage.OrderDesc), storage.WithLimit(3)} + // get all namespaces + res, err = s.store.ListNamespaces(context.TODO(), opts...) + require.NoError(t, err) + + got = res.Results + assert.Len(t, got, 3) + assert.Equal(t, newest.Key, got[0].Key) + assert.Equal(t, middle.Key, got[1].Key) + assert.Equal(t, oldest.Key, got[2].Key) +} + +func (s *DBTestSuite) TestCreateNamespace() { + t := s.T() + + ns, err := s.store.CreateNamespace(context.TODO(), &flipt.CreateNamespaceRequest{ + Key: t.Name(), + Name: "foo", + Description: "bar", + Protected: true, + }) + + require.NoError(t, err) + + assert.Equal(t, t.Name(), ns.Key) + assert.Equal(t, "foo", ns.Name) + assert.Equal(t, "bar", ns.Description) + assert.True(t, ns.Protected) + assert.NotZero(t, ns.CreatedAt) + assert.Equal(t, ns.CreatedAt.Seconds, ns.UpdatedAt.Seconds) +} + +func (s *DBTestSuite) TestCreateNamespace_DuplicateKey() { + t := s.T() + + _, err := s.store.CreateNamespace(context.TODO(), &flipt.CreateNamespaceRequest{ + Key: t.Name(), + Name: "foo", + Description: "bar", + Protected: true, + }) + + require.NoError(t, err) + + _, err = s.store.CreateNamespace(context.TODO(), &flipt.CreateNamespaceRequest{ + Key: t.Name(), + Name: "foo", + Description: "bar", + Protected: true, + }) + + assert.EqualError(t, err, "namespace \"TestDBTestSuite/TestCreateNamespace_DuplicateKey\" is not unique") +} + +func (s *DBTestSuite) TestUpdateNamespace() { + t := s.T() + + ns, err := s.store.CreateNamespace(context.TODO(), &flipt.CreateNamespaceRequest{ + Key: t.Name(), + Name: "foo", + Description: "bar", + Protected: true, + }) + + require.NoError(t, err) + + assert.Equal(t, t.Name(), ns.Key) + assert.Equal(t, "foo", ns.Name) + assert.Equal(t, "bar", ns.Description) + assert.True(t, ns.Protected) + assert.NotZero(t, ns.CreatedAt) + assert.Equal(t, ns.CreatedAt.Seconds, ns.UpdatedAt.Seconds) + + updated, err := s.store.UpdateNamespace(context.TODO(), &flipt.UpdateNamespaceRequest{ + Key: ns.Key, + Name: ns.Name, + Description: "foobar", + Protected: true, + }) + + require.NoError(t, err) + + assert.Equal(t, ns.Key, updated.Key) + assert.Equal(t, ns.Name, updated.Name) + assert.Equal(t, "foobar", updated.Description) + assert.True(t, ns.Protected) + assert.NotZero(t, updated.CreatedAt) + assert.NotZero(t, updated.UpdatedAt) +} + +func (s *DBTestSuite) TestUpdateNamespace_NotFound() { + t := s.T() + + _, err := s.store.UpdateNamespace(context.TODO(), &flipt.UpdateNamespaceRequest{ + Key: "foo", + Name: "foo", + Description: "bar", + Protected: true, + }) + + assert.EqualError(t, err, "namespace \"foo\" not found") +} + +func (s *DBTestSuite) TestDeleteNamespace() { + t := s.T() + + ns, err := s.store.CreateNamespace(context.TODO(), &flipt.CreateNamespaceRequest{ + Key: t.Name(), + Name: "foo", + Description: "bar", + Protected: true, + }) + + require.NoError(t, err) + assert.NotNil(t, ns) + + err = s.store.DeleteNamespace(context.TODO(), &flipt.DeleteNamespaceRequest{Key: ns.Key}) + require.NoError(t, err) +} + +func (s *DBTestSuite) TestDeleteNamespace_NotFound() { + t := s.T() + + err := s.store.DeleteNamespace(context.TODO(), &flipt.DeleteNamespaceRequest{Key: "foo"}) + require.NoError(t, err) +} diff --git a/internal/storage/sql/sqlite/sqlite.go b/internal/storage/sql/sqlite/sqlite.go index 0bea5346d4..bdd5c01cfc 100644 --- a/internal/storage/sql/sqlite/sqlite.go +++ b/internal/storage/sql/sqlite/sqlite.go @@ -35,6 +35,25 @@ func (s *Store) String() string { return "sqlite" } +func (s *Store) CreateNamespace(ctx context.Context, r *flipt.CreateNamespaceRequest) (*flipt.Namespace, error) { + namespace, err := s.Store.CreateNamespace(ctx, r) + + if err != nil { + var serr sqlite3.Error + + if errors.As(err, &serr) { + switch serr.ExtendedCode { + case sqlite3.ErrConstraintPrimaryKey: + return nil, errs.ErrInvalidf(`namespace "%s" is not unique`, r.Key) + } + } + + return nil, err + } + + return namespace, nil +} + func (s *Store) CreateFlag(ctx context.Context, r *flipt.CreateFlagRequest) (*flipt.Flag, error) { flag, err := s.Store.CreateFlag(ctx, r) From d92bc2b34ccb8414f98d5aa42859dd31b3154d52 Mon Sep 17 00:00:00 2001 From: Mark Phelps <209477+markphelps@users.noreply.github.com> Date: Tue, 7 Mar 2023 14:06:23 -0500 Subject: [PATCH 03/11] chore: appease the linter --- .../server/middleware/grpc/support_test.go | 24 +++++++++---------- internal/server/support_test.go | 24 +++++++++---------- internal/storage/sql/sqlite/sqlite.go | 7 ++---- 3 files changed, 26 insertions(+), 29 deletions(-) diff --git a/internal/server/middleware/grpc/support_test.go b/internal/server/middleware/grpc/support_test.go index 43b98a8628..7076feb2cb 100644 --- a/internal/server/middleware/grpc/support_test.go +++ b/internal/server/middleware/grpc/support_test.go @@ -19,33 +19,33 @@ func (m *storeMock) String() string { return "mock" } -func (s *storeMock) GetNamespace(ctx context.Context, key string) (*flipt.Namespace, error) { - args := s.Called(ctx, key) +func (m *storeMock) GetNamespace(ctx context.Context, key string) (*flipt.Namespace, error) { + args := m.Called(ctx, key) return args.Get(0).(*flipt.Namespace), args.Error(1) } -func (s *storeMock) ListNamespaces(ctx context.Context, opts ...storage.QueryOption) (storage.ResultSet[*flipt.Namespace], error) { - args := s.Called(ctx, opts) +func (m *storeMock) ListNamespaces(ctx context.Context, opts ...storage.QueryOption) (storage.ResultSet[*flipt.Namespace], error) { + args := m.Called(ctx, opts) return args.Get(0).(storage.ResultSet[*flipt.Namespace]), args.Error(1) } -func (s *storeMock) CountNamespaces(ctx context.Context) (uint64, error) { - args := s.Called(ctx) +func (m *storeMock) CountNamespaces(ctx context.Context) (uint64, error) { + args := m.Called(ctx) return args.Get(0).(uint64), args.Error(1) } -func (s *storeMock) CreateNamespace(ctx context.Context, r *flipt.CreateNamespaceRequest) (*flipt.Namespace, error) { - args := s.Called(ctx, r) +func (m *storeMock) CreateNamespace(ctx context.Context, r *flipt.CreateNamespaceRequest) (*flipt.Namespace, error) { + args := m.Called(ctx, r) return args.Get(0).(*flipt.Namespace), args.Error(1) } -func (s *storeMock) UpdateNamespace(ctx context.Context, r *flipt.UpdateNamespaceRequest) (*flipt.Namespace, error) { - args := s.Called(ctx, r) +func (m *storeMock) UpdateNamespace(ctx context.Context, r *flipt.UpdateNamespaceRequest) (*flipt.Namespace, error) { + args := m.Called(ctx, r) return args.Get(0).(*flipt.Namespace), args.Error(1) } -func (s *storeMock) DeleteNamespace(ctx context.Context, r *flipt.DeleteNamespaceRequest) error { - args := s.Called(ctx, r) +func (m *storeMock) DeleteNamespace(ctx context.Context, r *flipt.DeleteNamespaceRequest) error { + args := m.Called(ctx, r) return args.Error(0) } diff --git a/internal/server/support_test.go b/internal/server/support_test.go index 2bc4af6a53..9895d8f178 100644 --- a/internal/server/support_test.go +++ b/internal/server/support_test.go @@ -18,33 +18,33 @@ func (m *storeMock) String() string { return "mock" } -func (s *storeMock) GetNamespace(ctx context.Context, key string) (*flipt.Namespace, error) { - args := s.Called(ctx, key) +func (m *storeMock) GetNamespace(ctx context.Context, key string) (*flipt.Namespace, error) { + args := m.Called(ctx, key) return args.Get(0).(*flipt.Namespace), args.Error(1) } -func (s *storeMock) ListNamespaces(ctx context.Context, opts ...storage.QueryOption) (storage.ResultSet[*flipt.Namespace], error) { - args := s.Called(ctx, opts) +func (m *storeMock) ListNamespaces(ctx context.Context, opts ...storage.QueryOption) (storage.ResultSet[*flipt.Namespace], error) { + args := m.Called(ctx, opts) return args.Get(0).(storage.ResultSet[*flipt.Namespace]), args.Error(1) } -func (s *storeMock) CountNamespaces(ctx context.Context) (uint64, error) { - args := s.Called(ctx) +func (m *storeMock) CountNamespaces(ctx context.Context) (uint64, error) { + args := m.Called(ctx) return args.Get(0).(uint64), args.Error(1) } -func (s *storeMock) CreateNamespace(ctx context.Context, r *flipt.CreateNamespaceRequest) (*flipt.Namespace, error) { - args := s.Called(ctx, r) +func (m *storeMock) CreateNamespace(ctx context.Context, r *flipt.CreateNamespaceRequest) (*flipt.Namespace, error) { + args := m.Called(ctx, r) return args.Get(0).(*flipt.Namespace), args.Error(1) } -func (s *storeMock) UpdateNamespace(ctx context.Context, r *flipt.UpdateNamespaceRequest) (*flipt.Namespace, error) { - args := s.Called(ctx, r) +func (m *storeMock) UpdateNamespace(ctx context.Context, r *flipt.UpdateNamespaceRequest) (*flipt.Namespace, error) { + args := m.Called(ctx, r) return args.Get(0).(*flipt.Namespace), args.Error(1) } -func (s *storeMock) DeleteNamespace(ctx context.Context, r *flipt.DeleteNamespaceRequest) error { - args := s.Called(ctx, r) +func (m *storeMock) DeleteNamespace(ctx context.Context, r *flipt.DeleteNamespaceRequest) error { + args := m.Called(ctx, r) return args.Error(0) } diff --git a/internal/storage/sql/sqlite/sqlite.go b/internal/storage/sql/sqlite/sqlite.go index bdd5c01cfc..619f9fb2cc 100644 --- a/internal/storage/sql/sqlite/sqlite.go +++ b/internal/storage/sql/sqlite/sqlite.go @@ -41,11 +41,8 @@ func (s *Store) CreateNamespace(ctx context.Context, r *flipt.CreateNamespaceReq if err != nil { var serr sqlite3.Error - if errors.As(err, &serr) { - switch serr.ExtendedCode { - case sqlite3.ErrConstraintPrimaryKey: - return nil, errs.ErrInvalidf(`namespace "%s" is not unique`, r.Key) - } + if errors.As(err, &serr) && serr.ExtendedCode == sqlite3.ErrConstraintPrimaryKey { + return nil, errs.ErrInvalidf(`namespace "%s" is not unique`, r.Key) } return nil, err From ed7120dac260d1a6978b159101a11ddfd3c457ed Mon Sep 17 00:00:00 2001 From: Mark Phelps <209477+markphelps@users.noreply.github.com> Date: Tue, 7 Mar 2023 15:29:37 -0500 Subject: [PATCH 04/11] feat: (wip) add namespace mysql migrations --- config/local.yml | 7 ++++++- config/migrations/mysql/4_create_namespaces.down.sql | 1 + config/migrations/mysql/4_create_namespaces.up.sql | 12 ++++++++++++ .../mysql/5_namespaces_migration_flags.down.sql | 1 + .../mysql/5_namespaces_migration_flags.up.sql | 10 ++++++++++ .../mysql/6_namespaces_migration_segments.down.sql | 1 + .../mysql/6_namespaces_migration_segments.up.sql | 10 ++++++++++ examples/database/mysql/docker-compose.yml | 6 ++++-- internal/storage/sql/common/namespace.go | 2 +- internal/storage/sql/migrator.go | 2 +- 10 files changed, 47 insertions(+), 5 deletions(-) create mode 100644 config/migrations/mysql/4_create_namespaces.down.sql create mode 100644 config/migrations/mysql/4_create_namespaces.up.sql create mode 100644 config/migrations/mysql/5_namespaces_migration_flags.down.sql create mode 100644 config/migrations/mysql/5_namespaces_migration_flags.up.sql create mode 100644 config/migrations/mysql/6_namespaces_migration_segments.down.sql create mode 100644 config/migrations/mysql/6_namespaces_migration_segments.up.sql diff --git a/config/local.yml b/config/local.yml index d4763cac45..e1460bfd32 100644 --- a/config/local.yml +++ b/config/local.yml @@ -29,4 +29,9 @@ cors: # grpc_port: 9000 db: - url: file:flipt.db + protocol: mysql + host: localhost + port: 3306 + user: mysql + password: password + name: flipt diff --git a/config/migrations/mysql/4_create_namespaces.down.sql b/config/migrations/mysql/4_create_namespaces.down.sql new file mode 100644 index 0000000000..b3ec8ee52a --- /dev/null +++ b/config/migrations/mysql/4_create_namespaces.down.sql @@ -0,0 +1 @@ +DROP TABLE IF EXISTS namespaces; \ No newline at end of file diff --git a/config/migrations/mysql/4_create_namespaces.up.sql b/config/migrations/mysql/4_create_namespaces.up.sql new file mode 100644 index 0000000000..164d1c2909 --- /dev/null +++ b/config/migrations/mysql/4_create_namespaces.up.sql @@ -0,0 +1,12 @@ +/* Create namespaces table */ +CREATE TABLE IF NOT EXISTS namespaces ( + `key` VARCHAR(255) PRIMARY KEY UNIQUE NOT NULL, + name VARCHAR(255) NOT NULL, + description TEXT NOT NULL, + protected BOOLEAN DEFAULT FALSE NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL +); + +/* Create default namespace */ +INSERT INTO namespaces (`key`, name, description, protected) VALUES ('default', 'Default', 'Default namespace', true); \ No newline at end of file diff --git a/config/migrations/mysql/5_namespaces_migration_flags.down.sql b/config/migrations/mysql/5_namespaces_migration_flags.down.sql new file mode 100644 index 0000000000..48e70a7ed5 --- /dev/null +++ b/config/migrations/mysql/5_namespaces_migration_flags.down.sql @@ -0,0 +1 @@ +/* TODO */ \ No newline at end of file diff --git a/config/migrations/mysql/5_namespaces_migration_flags.up.sql b/config/migrations/mysql/5_namespaces_migration_flags.up.sql new file mode 100644 index 0000000000..2e68d5e228 --- /dev/null +++ b/config/migrations/mysql/5_namespaces_migration_flags.up.sql @@ -0,0 +1,10 @@ +ALTER TABLE flags ADD COLUMN namespace_key VARCHAR(255) NOT NULL DEFAULT 'default'; +ALTER TABLE flags DROP INDEX `key`, ADD INDEX `key` (`key`) USING BTREE; /* drop previously created unique index */ +ALTER TABLE flags ADD FOREIGN KEY (namespace_key) REFERENCES namespaces(`key`) ON DELETE CASCADE; +ALTER TABLE flags DROP PRIMARY KEY, ADD PRIMARY KEY (`namespace_key`, `key`); + +ALTER TABLE variants ADD COLUMN namespace_key VARCHAR(255) NOT NULL DEFAULT 'default'; +ALTER TABLE variants DROP FOREIGN KEY `variants_ibfk_1`; +ALTER TABLE variants DROP INDEX `variants_flag_key_key` , ADD UNIQUE INDEX `variants_namespace_flag_key` (`namespace_key`, `flag_key`, `key`) USING BTREE; +ALTER TABLE variants ADD FOREIGN KEY (namespace_key) REFERENCES namespaces(`key`) ON DELETE CASCADE; +ALTER TABLE variants ADD FOREIGN KEY (namespace_key, flag_key) REFERENCES flags(`namespace_key`, `key`) ON DELETE CASCADE; diff --git a/config/migrations/mysql/6_namespaces_migration_segments.down.sql b/config/migrations/mysql/6_namespaces_migration_segments.down.sql new file mode 100644 index 0000000000..48e70a7ed5 --- /dev/null +++ b/config/migrations/mysql/6_namespaces_migration_segments.down.sql @@ -0,0 +1 @@ +/* TODO */ \ No newline at end of file diff --git a/config/migrations/mysql/6_namespaces_migration_segments.up.sql b/config/migrations/mysql/6_namespaces_migration_segments.up.sql new file mode 100644 index 0000000000..dfee441fb6 --- /dev/null +++ b/config/migrations/mysql/6_namespaces_migration_segments.up.sql @@ -0,0 +1,10 @@ +ALTER TABLE segments ADD COLUMN namespace_key VARCHAR(255) NOT NULL DEFAULT 'default'; +ALTER TABLE segments DROP INDEX `key`, ADD INDEX `key` (`key`) USING BTREE; /* drop previously created unique index */ +ALTER TABLE segments ADD FOREIGN KEY (namespace_key) REFERENCES namespaces(`key`) ON DELETE CASCADE; +ALTER TABLE segments DROP PRIMARY KEY, ADD PRIMARY KEY (`namespace_key`, `key`); + +ALTER TABLE constraints ADD COLUMN namespace_key VARCHAR(255) NOT NULL DEFAULT 'default'; +ALTER TABLE constraints DROP FOREIGN KEY `constraints_ibfk_1`; /* drop previously created foreign key */ +ALTER TABLE constraints DROP INDEX `segment_key` , ADD INDEX `constraints_namespace_segment_key` (`namespace_key`, `segment_key`) USING BTREE; +ALTER TABLE constraints ADD FOREIGN KEY (namespace_key) REFERENCES namespaces(`key`) ON DELETE CASCADE; +ALTER TABLE constraints ADD FOREIGN KEY (namespace_key, segment_key) REFERENCES segments(`namespace_key`, `key`) ON DELETE CASCADE; diff --git a/examples/database/mysql/docker-compose.yml b/examples/database/mysql/docker-compose.yml index e429e3efeb..30930828e9 100644 --- a/examples/database/mysql/docker-compose.yml +++ b/examples/database/mysql/docker-compose.yml @@ -3,8 +3,10 @@ version: "3" services: mysql: image: mysql:latest - networks: - - flipt_network + # networks: + # - flipt_network + ports: + - "3306:3306" environment: - MYSQL_DATABASE=flipt - MYSQL_USER=mysql diff --git a/internal/storage/sql/common/namespace.go b/internal/storage/sql/common/namespace.go index c4ca7438bb..691267cb9d 100644 --- a/internal/storage/sql/common/namespace.go +++ b/internal/storage/sql/common/namespace.go @@ -24,7 +24,7 @@ func (s *Store) GetNamespace(ctx context.Context, key string) (*flipt.Namespace, err = s.builder.Select("\"key\", name, description, protected, created_at, updated_at"). From("namespaces"). - Where(sq.Eq{"key": key}). + Where(sq.Eq{"\"key\"": key}). QueryRowContext(ctx). Scan( &namespace.Key, diff --git a/internal/storage/sql/migrator.go b/internal/storage/sql/migrator.go index 2f0f4fdfc3..9d0110c28d 100644 --- a/internal/storage/sql/migrator.go +++ b/internal/storage/sql/migrator.go @@ -19,7 +19,7 @@ import ( var expectedVersions = map[Driver]uint{ SQLite: 8, Postgres: 5, - MySQL: 3, + MySQL: 6, CockroachDB: 2, } From 97b79773984751a063df8bccf403c58af4905032 Mon Sep 17 00:00:00 2001 From: Mark Phelps <209477+markphelps@users.noreply.github.com> Date: Tue, 7 Mar 2023 15:34:35 -0500 Subject: [PATCH 05/11] chore: rename migrations --- ...paces_migration_flags.down.sql => 5_namespaces_flags.down.sql} | 0 ...amespaces_migration_flags.up.sql => 5_namespaces_flags.up.sql} | 0 ...migration_segments.down.sql => 6_namespaces_segments.down.sql} | 0 ...ces_migration_segments.up.sql => 6_namespaces_segments.up.sql} | 0 config/migrations/mysql/7_namespaces_rules.down.sql | 0 config/migrations/mysql/7_namespaces_rules.up.sql | 0 ...paces_migration_flags.down.sql => 7_namespaces_flags.down.sql} | 0 ...amespaces_migration_flags.up.sql => 7_namespaces_flags.up.sql} | 0 ...migration_segments.down.sql => 8_namespaces_segments.down.sql} | 0 ...ces_migration_segments.up.sql => 8_namespaces_segments.up.sql} | 0 10 files changed, 0 insertions(+), 0 deletions(-) rename config/migrations/mysql/{5_namespaces_migration_flags.down.sql => 5_namespaces_flags.down.sql} (100%) rename config/migrations/mysql/{5_namespaces_migration_flags.up.sql => 5_namespaces_flags.up.sql} (100%) rename config/migrations/mysql/{6_namespaces_migration_segments.down.sql => 6_namespaces_segments.down.sql} (100%) rename config/migrations/mysql/{6_namespaces_migration_segments.up.sql => 6_namespaces_segments.up.sql} (100%) create mode 100644 config/migrations/mysql/7_namespaces_rules.down.sql create mode 100644 config/migrations/mysql/7_namespaces_rules.up.sql rename config/migrations/sqlite3/{7_namespaces_migration_flags.down.sql => 7_namespaces_flags.down.sql} (100%) rename config/migrations/sqlite3/{7_namespaces_migration_flags.up.sql => 7_namespaces_flags.up.sql} (100%) rename config/migrations/sqlite3/{8_namespaces_migration_segments.down.sql => 8_namespaces_segments.down.sql} (100%) rename config/migrations/sqlite3/{8_namespaces_migration_segments.up.sql => 8_namespaces_segments.up.sql} (100%) diff --git a/config/migrations/mysql/5_namespaces_migration_flags.down.sql b/config/migrations/mysql/5_namespaces_flags.down.sql similarity index 100% rename from config/migrations/mysql/5_namespaces_migration_flags.down.sql rename to config/migrations/mysql/5_namespaces_flags.down.sql diff --git a/config/migrations/mysql/5_namespaces_migration_flags.up.sql b/config/migrations/mysql/5_namespaces_flags.up.sql similarity index 100% rename from config/migrations/mysql/5_namespaces_migration_flags.up.sql rename to config/migrations/mysql/5_namespaces_flags.up.sql diff --git a/config/migrations/mysql/6_namespaces_migration_segments.down.sql b/config/migrations/mysql/6_namespaces_segments.down.sql similarity index 100% rename from config/migrations/mysql/6_namespaces_migration_segments.down.sql rename to config/migrations/mysql/6_namespaces_segments.down.sql diff --git a/config/migrations/mysql/6_namespaces_migration_segments.up.sql b/config/migrations/mysql/6_namespaces_segments.up.sql similarity index 100% rename from config/migrations/mysql/6_namespaces_migration_segments.up.sql rename to config/migrations/mysql/6_namespaces_segments.up.sql diff --git a/config/migrations/mysql/7_namespaces_rules.down.sql b/config/migrations/mysql/7_namespaces_rules.down.sql new file mode 100644 index 0000000000..e69de29bb2 diff --git a/config/migrations/mysql/7_namespaces_rules.up.sql b/config/migrations/mysql/7_namespaces_rules.up.sql new file mode 100644 index 0000000000..e69de29bb2 diff --git a/config/migrations/sqlite3/7_namespaces_migration_flags.down.sql b/config/migrations/sqlite3/7_namespaces_flags.down.sql similarity index 100% rename from config/migrations/sqlite3/7_namespaces_migration_flags.down.sql rename to config/migrations/sqlite3/7_namespaces_flags.down.sql diff --git a/config/migrations/sqlite3/7_namespaces_migration_flags.up.sql b/config/migrations/sqlite3/7_namespaces_flags.up.sql similarity index 100% rename from config/migrations/sqlite3/7_namespaces_migration_flags.up.sql rename to config/migrations/sqlite3/7_namespaces_flags.up.sql diff --git a/config/migrations/sqlite3/8_namespaces_migration_segments.down.sql b/config/migrations/sqlite3/8_namespaces_segments.down.sql similarity index 100% rename from config/migrations/sqlite3/8_namespaces_migration_segments.down.sql rename to config/migrations/sqlite3/8_namespaces_segments.down.sql diff --git a/config/migrations/sqlite3/8_namespaces_migration_segments.up.sql b/config/migrations/sqlite3/8_namespaces_segments.up.sql similarity index 100% rename from config/migrations/sqlite3/8_namespaces_migration_segments.up.sql rename to config/migrations/sqlite3/8_namespaces_segments.up.sql From 36d2b15a7519d5455f660bb024575680493db729 Mon Sep 17 00:00:00 2001 From: Mark Phelps <209477+markphelps@users.noreply.github.com> Date: Tue, 7 Mar 2023 20:19:42 -0500 Subject: [PATCH 06/11] chore: rm empty migrations for the moment --- config/migrations/mysql/7_namespaces_rules.down.sql | 0 config/migrations/mysql/7_namespaces_rules.up.sql | 0 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 config/migrations/mysql/7_namespaces_rules.down.sql delete mode 100644 config/migrations/mysql/7_namespaces_rules.up.sql diff --git a/config/migrations/mysql/7_namespaces_rules.down.sql b/config/migrations/mysql/7_namespaces_rules.down.sql deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/config/migrations/mysql/7_namespaces_rules.up.sql b/config/migrations/mysql/7_namespaces_rules.up.sql deleted file mode 100644 index e69de29bb2..0000000000 From 389769665fb7bc01b6f748e3cb4660ebd456fd64 Mon Sep 17 00:00:00 2001 From: Mark Phelps <209477+markphelps@users.noreply.github.com> Date: Wed, 8 Mar 2023 10:20:21 -0500 Subject: [PATCH 07/11] chore: less sleepy --- internal/storage/sql/namespaces_test.go | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/internal/storage/sql/namespaces_test.go b/internal/storage/sql/namespaces_test.go index 93ca9764f0..5e1b90db10 100644 --- a/internal/storage/sql/namespaces_test.go +++ b/internal/storage/sql/namespaces_test.go @@ -3,13 +3,11 @@ package sql_test import ( "context" "encoding/json" - "time" "github.com/gofrs/uuid" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.flipt.io/flipt/internal/storage" - fliptsql "go.flipt.io/flipt/internal/storage/sql" "go.flipt.io/flipt/internal/storage/sql/common" flipt "go.flipt.io/flipt/rpc/flipt" ) @@ -105,10 +103,6 @@ func (s *DBTestSuite) TestListNamespacesPagination_LimitOffset() { } for _, req := range reqs { - if s.db.Driver == fliptsql.MySQL { - // required for MySQL since it only s.stores timestamps to the second and not millisecond granularity - time.Sleep(time.Second) - } _, err := s.store.CreateNamespace(context.TODO(), req) require.NoError(t, err) } @@ -178,10 +172,6 @@ func (s *DBTestSuite) TestListNamespacesPagination_LimitWithNextPage() { } for _, req := range reqs { - if s.db.Driver == fliptsql.MySQL { - // required for MySQL since it only s.stores timestamps to the second and not millisecond granularity - time.Sleep(time.Second) - } _, err := s.store.CreateNamespace(context.TODO(), req) require.NoError(t, err) } From 2cce02181cd4e6d709779c058c4de61ce5baafe8 Mon Sep 17 00:00:00 2001 From: Mark Phelps <209477+markphelps@users.noreply.github.com> Date: Wed, 8 Mar 2023 10:21:23 -0500 Subject: [PATCH 08/11] chore: 6 bytes for timestamp --- config/migrations/mysql/4_create_namespaces.up.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/migrations/mysql/4_create_namespaces.up.sql b/config/migrations/mysql/4_create_namespaces.up.sql index 164d1c2909..91e91026d9 100644 --- a/config/migrations/mysql/4_create_namespaces.up.sql +++ b/config/migrations/mysql/4_create_namespaces.up.sql @@ -4,8 +4,8 @@ CREATE TABLE IF NOT EXISTS namespaces ( name VARCHAR(255) NOT NULL, description TEXT NOT NULL, protected BOOLEAN DEFAULT FALSE NOT NULL, - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, - updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL + created_at TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP NOT NULL, + updated_at TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP NOT NULL ); /* Create default namespace */ From 58d981b97ce914d5d9500a71fee8efdefc545743 Mon Sep 17 00:00:00 2001 From: Mark Phelps <209477+markphelps@users.noreply.github.com> Date: Wed, 8 Mar 2023 10:51:39 -0500 Subject: [PATCH 09/11] chore: add rules migration --- .../mysql/4_create_namespaces.up.sql | 4 +- .../mysql/7_namespaces_rules.down.sql | 0 .../mysql/7_namespaces_rules.up.sql | 8 ++++ internal/storage/sql/migrator.go | 2 +- internal/storage/sql/mysql/mysql.go | 42 +++++++++++++++---- internal/storage/sql/sqlite/sqlite.go | 1 + 6 files changed, 46 insertions(+), 11 deletions(-) create mode 100644 config/migrations/mysql/7_namespaces_rules.down.sql create mode 100644 config/migrations/mysql/7_namespaces_rules.up.sql diff --git a/config/migrations/mysql/4_create_namespaces.up.sql b/config/migrations/mysql/4_create_namespaces.up.sql index 91e91026d9..43b95af49f 100644 --- a/config/migrations/mysql/4_create_namespaces.up.sql +++ b/config/migrations/mysql/4_create_namespaces.up.sql @@ -4,8 +4,8 @@ CREATE TABLE IF NOT EXISTS namespaces ( name VARCHAR(255) NOT NULL, description TEXT NOT NULL, protected BOOLEAN DEFAULT FALSE NOT NULL, - created_at TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP NOT NULL, - updated_at TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP NOT NULL + created_at TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP(6) NOT NULL, + updated_at TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP(6) NOT NULL ); /* Create default namespace */ diff --git a/config/migrations/mysql/7_namespaces_rules.down.sql b/config/migrations/mysql/7_namespaces_rules.down.sql new file mode 100644 index 0000000000..e69de29bb2 diff --git a/config/migrations/mysql/7_namespaces_rules.up.sql b/config/migrations/mysql/7_namespaces_rules.up.sql new file mode 100644 index 0000000000..fc851fcdc5 --- /dev/null +++ b/config/migrations/mysql/7_namespaces_rules.up.sql @@ -0,0 +1,8 @@ +ALTER TABLE rules ADD COLUMN namespace_key VARCHAR(255) NOT NULL DEFAULT 'default'; +ALTER TABLE rules DROP FOREIGN KEY `rules_ibfk_1`; /* drop previously created foreign key */ +ALTER TABLE rules DROP FOREIGN KEY `rules_ibfk_2`; /* drop previously created foreign key */ +ALTER TABLE rules DROP INDEX `flag_key` , ADD INDEX `rules_namespace_flag_key` (`namespace_key`, `flag_key`) USING BTREE; +ALTER TABLE rules DROP INDEX `segment_key` , ADD INDEX `rules_namespace_segment_key` (`namespace_key`, `segment_key`) USING BTREE; +ALTER TABLE rules ADD FOREIGN KEY (namespace_key) REFERENCES namespaces(`key`) ON DELETE CASCADE; +ALTER TABLE rules ADD FOREIGN KEY (namespace_key, flag_key) REFERENCES flags(`namespace_key`, `key`) ON DELETE CASCADE; +ALTER TABLE rules ADD FOREIGN KEY (namespace_key, segment_key) REFERENCES segments(`namespace_key`, `key`) ON DELETE CASCADE; diff --git a/internal/storage/sql/migrator.go b/internal/storage/sql/migrator.go index 9d0110c28d..ecd1ff64e0 100644 --- a/internal/storage/sql/migrator.go +++ b/internal/storage/sql/migrator.go @@ -19,7 +19,7 @@ import ( var expectedVersions = map[Driver]uint{ SQLite: 8, Postgres: 5, - MySQL: 6, + MySQL: 7, CockroachDB: 2, } diff --git a/internal/storage/sql/mysql/mysql.go b/internal/storage/sql/mysql/mysql.go index 6b420e6897..03ab799920 100644 --- a/internal/storage/sql/mysql/mysql.go +++ b/internal/storage/sql/mysql/mysql.go @@ -38,14 +38,35 @@ func (s *Store) String() string { return "mysql" } +func (s *Store) CreateNamespace(ctx context.Context, r *flipt.CreateNamespaceRequest) (*flipt.Namespace, error) { + namespace, err := s.Store.CreateNamespace(ctx, r) + + if err != nil { + var merr *mysql.MySQLError + + if errors.As(err, &merr) && merr.Number == constraintUniqueErrCode { + return nil, errs.ErrInvalidf("namespace %q is not unique", r.Key) + } + + return nil, err + } + + return namespace, nil +} + func (s *Store) CreateFlag(ctx context.Context, r *flipt.CreateFlagRequest) (*flipt.Flag, error) { flag, err := s.Store.CreateFlag(ctx, r) if err != nil { var merr *mysql.MySQLError - if errors.As(err, &merr) && merr.Number == constraintUniqueErrCode { - return nil, errs.ErrInvalidf("flag %q is not unique for the namespace %q", r.Key, r.NamespaceKey) + if errors.As(err, &merr) { + switch merr.Number { + case constraintForeignKeyErrCode: + return nil, errs.ErrNotFoundf("namespace %q", r.NamespaceKey) + case constraintUniqueErrCode: + return nil, errs.ErrInvalidf(`flag "%s/%s" is not unique`, r.NamespaceKey, r.Key) + } } return nil, err @@ -63,9 +84,9 @@ func (s *Store) CreateVariant(ctx context.Context, r *flipt.CreateVariantRequest if errors.As(err, &merr) { switch merr.Number { case constraintForeignKeyErrCode: - return nil, errs.ErrNotFoundf("flag %q", r.FlagKey) + return nil, errs.ErrNotFoundf(`flag "%s/%s"`, r.NamespaceKey, r.FlagKey) case constraintUniqueErrCode: - return nil, errs.ErrInvalidf("variant %q is not unique for the flag %q", r.Key, r.FlagKey) + return nil, errs.ErrInvalidf(`variant %q is not unique for flag "%s/%s"`, r.Key, r.NamespaceKey, r.FlagKey) } } @@ -82,7 +103,7 @@ func (s *Store) UpdateVariant(ctx context.Context, r *flipt.UpdateVariantRequest var merr *mysql.MySQLError if errors.As(err, &merr) && merr.Number == constraintUniqueErrCode { - return nil, errs.ErrInvalidf("variant %q is not unique for the flag %q", r.Key, r.FlagKey) + return nil, errs.ErrInvalidf(`variant %q is not unique for flag "%s/%s"`, r.Key, r.NamespaceKey, r.FlagKey) } return nil, err @@ -97,8 +118,13 @@ func (s *Store) CreateSegment(ctx context.Context, r *flipt.CreateSegmentRequest if err != nil { var merr *mysql.MySQLError - if errors.As(err, &merr) && merr.Number == constraintUniqueErrCode { - return nil, errs.ErrInvalidf("segment %q is not unique", r.Key) + if errors.As(err, &merr) { + switch merr.Number { + case constraintForeignKeyErrCode: + return nil, errs.ErrNotFoundf("namespace %q", r.NamespaceKey) + case constraintUniqueErrCode: + return nil, errs.ErrInvalidf(`segment "%s/%s" is not unique`, r.NamespaceKey, r.Key) + } } return nil, err @@ -114,7 +140,7 @@ func (s *Store) CreateConstraint(ctx context.Context, r *flipt.CreateConstraintR var merr *mysql.MySQLError if errors.As(err, &merr) && merr.Number == constraintForeignKeyErrCode { - return nil, errs.ErrNotFoundf("segment %q", r.SegmentKey) + return nil, errs.ErrNotFoundf(`segment "%s/%s"`, r.NamespaceKey, r.SegmentKey) } return nil, err diff --git a/internal/storage/sql/sqlite/sqlite.go b/internal/storage/sql/sqlite/sqlite.go index 619f9fb2cc..f6dc1385c2 100644 --- a/internal/storage/sql/sqlite/sqlite.go +++ b/internal/storage/sql/sqlite/sqlite.go @@ -123,6 +123,7 @@ func (s *Store) CreateSegment(ctx context.Context, r *flipt.CreateSegmentRequest return nil, errs.ErrInvalidf(`segment "%s/%s" is not unique`, r.NamespaceKey, r.Key) } } + return nil, err } From bbbbce3de92a31a9e7e488e159ab2063d81e35e1 Mon Sep 17 00:00:00 2001 From: Mark Phelps <209477+markphelps@users.noreply.github.com> Date: Wed, 8 Mar 2023 10:58:30 -0500 Subject: [PATCH 10/11] chore: add migration comments, revert local config --- config/local.yml | 7 +------ config/migrations/mysql/5_namespaces_flags.up.sql | 4 ++-- config/migrations/mysql/6_namespaces_segments.up.sql | 2 +- config/migrations/mysql/7_namespaces_rules.up.sql | 4 ++-- 4 files changed, 6 insertions(+), 11 deletions(-) diff --git a/config/local.yml b/config/local.yml index e1460bfd32..d4763cac45 100644 --- a/config/local.yml +++ b/config/local.yml @@ -29,9 +29,4 @@ cors: # grpc_port: 9000 db: - protocol: mysql - host: localhost - port: 3306 - user: mysql - password: password - name: flipt + url: file:flipt.db diff --git a/config/migrations/mysql/5_namespaces_flags.up.sql b/config/migrations/mysql/5_namespaces_flags.up.sql index 2e68d5e228..0bd6952650 100644 --- a/config/migrations/mysql/5_namespaces_flags.up.sql +++ b/config/migrations/mysql/5_namespaces_flags.up.sql @@ -4,7 +4,7 @@ ALTER TABLE flags ADD FOREIGN KEY (namespace_key) REFERENCES namespaces(`key`) O ALTER TABLE flags DROP PRIMARY KEY, ADD PRIMARY KEY (`namespace_key`, `key`); ALTER TABLE variants ADD COLUMN namespace_key VARCHAR(255) NOT NULL DEFAULT 'default'; -ALTER TABLE variants DROP FOREIGN KEY `variants_ibfk_1`; -ALTER TABLE variants DROP INDEX `variants_flag_key_key` , ADD UNIQUE INDEX `variants_namespace_flag_key` (`namespace_key`, `flag_key`, `key`) USING BTREE; +ALTER TABLE variants DROP FOREIGN KEY `variants_ibfk_1`; /* drop previously created foreign key */ +ALTER TABLE variants DROP INDEX `variants_flag_key_key`, ADD UNIQUE INDEX `variants_namespace_flag_key` (`namespace_key`, `flag_key`, `key`) USING BTREE; /* drop previously created unique index */ ALTER TABLE variants ADD FOREIGN KEY (namespace_key) REFERENCES namespaces(`key`) ON DELETE CASCADE; ALTER TABLE variants ADD FOREIGN KEY (namespace_key, flag_key) REFERENCES flags(`namespace_key`, `key`) ON DELETE CASCADE; diff --git a/config/migrations/mysql/6_namespaces_segments.up.sql b/config/migrations/mysql/6_namespaces_segments.up.sql index dfee441fb6..0e62506a50 100644 --- a/config/migrations/mysql/6_namespaces_segments.up.sql +++ b/config/migrations/mysql/6_namespaces_segments.up.sql @@ -5,6 +5,6 @@ ALTER TABLE segments DROP PRIMARY KEY, ADD PRIMARY KEY (`namespace_key`, `key`); ALTER TABLE constraints ADD COLUMN namespace_key VARCHAR(255) NOT NULL DEFAULT 'default'; ALTER TABLE constraints DROP FOREIGN KEY `constraints_ibfk_1`; /* drop previously created foreign key */ -ALTER TABLE constraints DROP INDEX `segment_key` , ADD INDEX `constraints_namespace_segment_key` (`namespace_key`, `segment_key`) USING BTREE; +ALTER TABLE constraints DROP INDEX `segment_key`, ADD INDEX `constraints_namespace_segment_key` (`namespace_key`, `segment_key`) USING BTREE; /* drop previously created index */ ALTER TABLE constraints ADD FOREIGN KEY (namespace_key) REFERENCES namespaces(`key`) ON DELETE CASCADE; ALTER TABLE constraints ADD FOREIGN KEY (namespace_key, segment_key) REFERENCES segments(`namespace_key`, `key`) ON DELETE CASCADE; diff --git a/config/migrations/mysql/7_namespaces_rules.up.sql b/config/migrations/mysql/7_namespaces_rules.up.sql index fc851fcdc5..a3bcad824e 100644 --- a/config/migrations/mysql/7_namespaces_rules.up.sql +++ b/config/migrations/mysql/7_namespaces_rules.up.sql @@ -1,8 +1,8 @@ ALTER TABLE rules ADD COLUMN namespace_key VARCHAR(255) NOT NULL DEFAULT 'default'; ALTER TABLE rules DROP FOREIGN KEY `rules_ibfk_1`; /* drop previously created foreign key */ ALTER TABLE rules DROP FOREIGN KEY `rules_ibfk_2`; /* drop previously created foreign key */ -ALTER TABLE rules DROP INDEX `flag_key` , ADD INDEX `rules_namespace_flag_key` (`namespace_key`, `flag_key`) USING BTREE; -ALTER TABLE rules DROP INDEX `segment_key` , ADD INDEX `rules_namespace_segment_key` (`namespace_key`, `segment_key`) USING BTREE; +ALTER TABLE rules DROP INDEX `flag_key`, ADD INDEX `rules_namespace_flag_key` (`namespace_key`, `flag_key`) USING BTREE; /* drop previously created index */ +ALTER TABLE rules DROP INDEX `segment_key`, ADD INDEX `rules_namespace_segment_key` (`namespace_key`, `segment_key`) USING BTREE; /* drop previously created index */ ALTER TABLE rules ADD FOREIGN KEY (namespace_key) REFERENCES namespaces(`key`) ON DELETE CASCADE; ALTER TABLE rules ADD FOREIGN KEY (namespace_key, flag_key) REFERENCES flags(`namespace_key`, `key`) ON DELETE CASCADE; ALTER TABLE rules ADD FOREIGN KEY (namespace_key, segment_key) REFERENCES segments(`namespace_key`, `key`) ON DELETE CASCADE; From bdebc1586213989f96fceeadae43a80e5949ce12 Mon Sep 17 00:00:00 2001 From: Mark Phelps <209477+markphelps@users.noreply.github.com> Date: Wed, 8 Mar 2023 11:00:48 -0500 Subject: [PATCH 11/11] chore: reset mysql example --- examples/database/mysql/docker-compose.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/examples/database/mysql/docker-compose.yml b/examples/database/mysql/docker-compose.yml index 30930828e9..e429e3efeb 100644 --- a/examples/database/mysql/docker-compose.yml +++ b/examples/database/mysql/docker-compose.yml @@ -3,10 +3,8 @@ version: "3" services: mysql: image: mysql:latest - # networks: - # - flipt_network - ports: - - "3306:3306" + networks: + - flipt_network environment: - MYSQL_DATABASE=flipt - MYSQL_USER=mysql