diff --git a/docs/grpc/index.html b/docs/grpc/index.html index 234224ea8d..b8fbea28e5 100644 --- a/docs/grpc/index.html +++ b/docs/grpc/index.html @@ -1687,6 +1687,10 @@

Table of Contents

MListRegisteredResourcesResponse +
  • + MRegisteredResourcesSort +
  • +
  • MUpdateRegisteredResourceRequest
  • @@ -1704,6 +1708,10 @@

    Table of Contents

    +
  • + ESortRegisteredResourcesType +
  • +
  • @@ -14769,6 +14777,15 @@

    ListRegistere

    Optional

    + + sort + RegisteredResourcesSort + repeated +

    Optional - CONSTRAINT: max 1 item +Default ordering when omitted or when the first entry's field is UNSPECIFIED: +created_at DESC.

    + + @@ -14807,6 +14824,37 @@

    ListRegister +

    RegisteredResourcesSort

    +

    + + + + + + + + + + + + + + + + + + + + + + + +
    FieldTypeLabelDescription
    fieldSortRegisteredResourcesType

    directionpolicy.SortDirection

    + + + + +

    UpdateRegisteredResourceRequest

    @@ -14957,6 +15005,41 @@

    Update +

    SortRegisteredResourcesType

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameNumberDescription
    SORT_REGISTERED_RESOURCES_TYPE_UNSPECIFIED0

    SORT_REGISTERED_RESOURCES_TYPE_NAME1

    SORT_REGISTERED_RESOURCES_TYPE_CREATED_AT2

    SORT_REGISTERED_RESOURCES_TYPE_UPDATED_AT3

    + diff --git a/docs/openapi/policy/kasregistry/key_access_server_registry.openapi.yaml b/docs/openapi/policy/kasregistry/key_access_server_registry.openapi.yaml index 212e33b722..e4602dfddf 100644 --- a/docs/openapi/policy/kasregistry/key_access_server_registry.openapi.yaml +++ b/docs/openapi/policy/kasregistry/key_access_server_registry.openapi.yaml @@ -580,6 +580,13 @@ components: - SORT_DIRECTION_UNSPECIFIED - SORT_DIRECTION_ASC - SORT_DIRECTION_DESC + description: |- + Sorting direction shared across list APIs. + Notes: + - When a sort field is provided, UNSPECIFIED is treated as ASC. + - When the 'sort' field is omitted or the chosen sort 'field' is UNSPECIFIED, + the endpoint's request message defines the default ordering; see the + specific List* request docs. policy.SourceType: type: string title: SourceType diff --git a/docs/openapi/policy/obligations/obligations.openapi.yaml b/docs/openapi/policy/obligations/obligations.openapi.yaml index 859f98f7fd..a3d7c5863f 100644 --- a/docs/openapi/policy/obligations/obligations.openapi.yaml +++ b/docs/openapi/policy/obligations/obligations.openapi.yaml @@ -551,6 +551,13 @@ components: - SORT_DIRECTION_UNSPECIFIED - SORT_DIRECTION_ASC - SORT_DIRECTION_DESC + description: |- + Sorting direction shared across list APIs. + Notes: + - When a sort field is provided, UNSPECIFIED is treated as ASC. + - When the 'sort' field is omitted or the chosen sort 'field' is UNSPECIFIED, + the endpoint's request message defines the default ordering; see the + specific List* request docs. policy.SourceType: type: string title: SourceType diff --git a/docs/openapi/policy/registeredresources/registered_resources.openapi.yaml b/docs/openapi/policy/registeredresources/registered_resources.openapi.yaml index 97b2d07814..1d2fac6987 100644 --- a/docs/openapi/policy/registeredresources/registered_resources.openapi.yaml +++ b/docs/openapi/policy/registeredresources/registered_resources.openapi.yaml @@ -439,6 +439,20 @@ components: - KAS_PUBLIC_KEY_ALG_ENUM_EC_SECP256R1 - KAS_PUBLIC_KEY_ALG_ENUM_EC_SECP384R1 - KAS_PUBLIC_KEY_ALG_ENUM_EC_SECP521R1 + policy.SortDirection: + type: string + title: SortDirection + enum: + - SORT_DIRECTION_UNSPECIFIED + - SORT_DIRECTION_ASC + - SORT_DIRECTION_DESC + description: |- + Sorting direction shared across list APIs. + Notes: + - When a sort field is provided, UNSPECIFIED is treated as ASC. + - When the 'sort' field is omitted or the chosen sort 'field' is UNSPECIFIED, + the endpoint's request message defines the default ordering; see the + specific List* request docs. policy.SourceType: type: string title: SourceType @@ -458,6 +472,14 @@ components: - SUBJECT_MAPPING_OPERATOR_ENUM_IN - SUBJECT_MAPPING_OPERATOR_ENUM_NOT_IN - SUBJECT_MAPPING_OPERATOR_ENUM_IN_CONTAINS + policy.registeredresources.SortRegisteredResourcesType: + type: string + title: SortRegisteredResourcesType + enum: + - SORT_REGISTERED_RESOURCES_TYPE_UNSPECIFIED + - SORT_REGISTERED_RESOURCES_TYPE_NAME + - SORT_REGISTERED_RESOURCES_TYPE_CREATED_AT + - SORT_REGISTERED_RESOURCES_TYPE_UPDATED_AT common.Metadata: type: object properties: @@ -1675,6 +1697,16 @@ components: title: pagination description: Optional $ref: '#/components/schemas/policy.PageRequest' + sort: + type: array + items: + $ref: '#/components/schemas/policy.registeredresources.RegisteredResourcesSort' + title: sort + maxItems: 1 + description: |- + Optional - CONSTRAINT: max 1 item + Default ordering when omitted or when the first entry's field is UNSPECIFIED: + created_at DESC. title: ListRegisteredResourcesRequest additionalProperties: false policy.registeredresources.ListRegisteredResourcesResponse: @@ -1690,6 +1722,17 @@ components: $ref: '#/components/schemas/policy.PageResponse' title: ListRegisteredResourcesResponse additionalProperties: false + policy.registeredresources.RegisteredResourcesSort: + type: object + properties: + field: + title: field + $ref: '#/components/schemas/policy.registeredresources.SortRegisteredResourcesType' + direction: + title: direction + $ref: '#/components/schemas/policy.SortDirection' + title: RegisteredResourcesSort + additionalProperties: false policy.registeredresources.UpdateRegisteredResourceRequest: type: object properties: diff --git a/protocol/go/policy/registeredresources/registered_resources.pb.go b/protocol/go/policy/registeredresources/registered_resources.pb.go index 9a7c378329..29d7503982 100644 --- a/protocol/go/policy/registeredresources/registered_resources.pb.go +++ b/protocol/go/policy/registeredresources/registered_resources.pb.go @@ -23,6 +23,58 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +type SortRegisteredResourcesType int32 + +const ( + SortRegisteredResourcesType_SORT_REGISTERED_RESOURCES_TYPE_UNSPECIFIED SortRegisteredResourcesType = 0 + SortRegisteredResourcesType_SORT_REGISTERED_RESOURCES_TYPE_NAME SortRegisteredResourcesType = 1 + SortRegisteredResourcesType_SORT_REGISTERED_RESOURCES_TYPE_CREATED_AT SortRegisteredResourcesType = 2 + SortRegisteredResourcesType_SORT_REGISTERED_RESOURCES_TYPE_UPDATED_AT SortRegisteredResourcesType = 3 +) + +// Enum value maps for SortRegisteredResourcesType. +var ( + SortRegisteredResourcesType_name = map[int32]string{ + 0: "SORT_REGISTERED_RESOURCES_TYPE_UNSPECIFIED", + 1: "SORT_REGISTERED_RESOURCES_TYPE_NAME", + 2: "SORT_REGISTERED_RESOURCES_TYPE_CREATED_AT", + 3: "SORT_REGISTERED_RESOURCES_TYPE_UPDATED_AT", + } + SortRegisteredResourcesType_value = map[string]int32{ + "SORT_REGISTERED_RESOURCES_TYPE_UNSPECIFIED": 0, + "SORT_REGISTERED_RESOURCES_TYPE_NAME": 1, + "SORT_REGISTERED_RESOURCES_TYPE_CREATED_AT": 2, + "SORT_REGISTERED_RESOURCES_TYPE_UPDATED_AT": 3, + } +) + +func (x SortRegisteredResourcesType) Enum() *SortRegisteredResourcesType { + p := new(SortRegisteredResourcesType) + *p = x + return p +} + +func (x SortRegisteredResourcesType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SortRegisteredResourcesType) Descriptor() protoreflect.EnumDescriptor { + return file_policy_registeredresources_registered_resources_proto_enumTypes[0].Descriptor() +} + +func (SortRegisteredResourcesType) Type() protoreflect.EnumType { + return &file_policy_registeredresources_registered_resources_proto_enumTypes[0] +} + +func (x SortRegisteredResourcesType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use SortRegisteredResourcesType.Descriptor instead. +func (SortRegisteredResourcesType) EnumDescriptor() ([]byte, []int) { + return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{0} +} + type CreateRegisteredResourceRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -299,6 +351,61 @@ func (x *GetRegisteredResourceResponse) GetResource() *policy.RegisteredResource return nil } +type RegisteredResourcesSort struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Field SortRegisteredResourcesType `protobuf:"varint,1,opt,name=field,proto3,enum=policy.registeredresources.SortRegisteredResourcesType" json:"field,omitempty"` + Direction policy.SortDirection `protobuf:"varint,2,opt,name=direction,proto3,enum=policy.SortDirection" json:"direction,omitempty"` +} + +func (x *RegisteredResourcesSort) Reset() { + *x = RegisteredResourcesSort{} + if protoimpl.UnsafeEnabled { + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RegisteredResourcesSort) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RegisteredResourcesSort) ProtoMessage() {} + +func (x *RegisteredResourcesSort) ProtoReflect() protoreflect.Message { + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[4] + 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 RegisteredResourcesSort.ProtoReflect.Descriptor instead. +func (*RegisteredResourcesSort) Descriptor() ([]byte, []int) { + return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{4} +} + +func (x *RegisteredResourcesSort) GetField() SortRegisteredResourcesType { + if x != nil { + return x.Field + } + return SortRegisteredResourcesType_SORT_REGISTERED_RESOURCES_TYPE_UNSPECIFIED +} + +func (x *RegisteredResourcesSort) GetDirection() policy.SortDirection { + if x != nil { + return x.Direction + } + return policy.SortDirection(0) +} + type ListRegisteredResourcesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -308,12 +415,16 @@ type ListRegisteredResourcesRequest struct { NamespaceFqn string `protobuf:"bytes,2,opt,name=namespace_fqn,json=namespaceFqn,proto3" json:"namespace_fqn,omitempty"` // Optional Pagination *policy.PageRequest `protobuf:"bytes,10,opt,name=pagination,proto3" json:"pagination,omitempty"` + // Optional - CONSTRAINT: max 1 item + // Default ordering when omitted or when the first entry's field is UNSPECIFIED: + // created_at DESC. + Sort []*RegisteredResourcesSort `protobuf:"bytes,11,rep,name=sort,proto3" json:"sort,omitempty"` } func (x *ListRegisteredResourcesRequest) Reset() { *x = ListRegisteredResourcesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[4] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -326,7 +437,7 @@ func (x *ListRegisteredResourcesRequest) String() string { func (*ListRegisteredResourcesRequest) ProtoMessage() {} func (x *ListRegisteredResourcesRequest) ProtoReflect() protoreflect.Message { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[4] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -339,7 +450,7 @@ func (x *ListRegisteredResourcesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRegisteredResourcesRequest.ProtoReflect.Descriptor instead. func (*ListRegisteredResourcesRequest) Descriptor() ([]byte, []int) { - return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{4} + return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{5} } func (x *ListRegisteredResourcesRequest) GetNamespaceId() string { @@ -363,6 +474,13 @@ func (x *ListRegisteredResourcesRequest) GetPagination() *policy.PageRequest { return nil } +func (x *ListRegisteredResourcesRequest) GetSort() []*RegisteredResourcesSort { + if x != nil { + return x.Sort + } + return nil +} + type ListRegisteredResourcesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -375,7 +493,7 @@ type ListRegisteredResourcesResponse struct { func (x *ListRegisteredResourcesResponse) Reset() { *x = ListRegisteredResourcesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[5] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -388,7 +506,7 @@ func (x *ListRegisteredResourcesResponse) String() string { func (*ListRegisteredResourcesResponse) ProtoMessage() {} func (x *ListRegisteredResourcesResponse) ProtoReflect() protoreflect.Message { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[5] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -401,7 +519,7 @@ func (x *ListRegisteredResourcesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRegisteredResourcesResponse.ProtoReflect.Descriptor instead. func (*ListRegisteredResourcesResponse) Descriptor() ([]byte, []int) { - return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{5} + return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{6} } func (x *ListRegisteredResourcesResponse) GetResources() []*policy.RegisteredResource { @@ -436,7 +554,7 @@ type UpdateRegisteredResourceRequest struct { func (x *UpdateRegisteredResourceRequest) Reset() { *x = UpdateRegisteredResourceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[6] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -449,7 +567,7 @@ func (x *UpdateRegisteredResourceRequest) String() string { func (*UpdateRegisteredResourceRequest) ProtoMessage() {} func (x *UpdateRegisteredResourceRequest) ProtoReflect() protoreflect.Message { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[6] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -462,7 +580,7 @@ func (x *UpdateRegisteredResourceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateRegisteredResourceRequest.ProtoReflect.Descriptor instead. func (*UpdateRegisteredResourceRequest) Descriptor() ([]byte, []int) { - return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{6} + return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{7} } func (x *UpdateRegisteredResourceRequest) GetId() string { @@ -504,7 +622,7 @@ type UpdateRegisteredResourceResponse struct { func (x *UpdateRegisteredResourceResponse) Reset() { *x = UpdateRegisteredResourceResponse{} if protoimpl.UnsafeEnabled { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[7] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -517,7 +635,7 @@ func (x *UpdateRegisteredResourceResponse) String() string { func (*UpdateRegisteredResourceResponse) ProtoMessage() {} func (x *UpdateRegisteredResourceResponse) ProtoReflect() protoreflect.Message { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[7] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -530,7 +648,7 @@ func (x *UpdateRegisteredResourceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateRegisteredResourceResponse.ProtoReflect.Descriptor instead. func (*UpdateRegisteredResourceResponse) Descriptor() ([]byte, []int) { - return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{7} + return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{8} } func (x *UpdateRegisteredResourceResponse) GetResource() *policy.RegisteredResource { @@ -552,7 +670,7 @@ type DeleteRegisteredResourceRequest struct { func (x *DeleteRegisteredResourceRequest) Reset() { *x = DeleteRegisteredResourceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[8] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -565,7 +683,7 @@ func (x *DeleteRegisteredResourceRequest) String() string { func (*DeleteRegisteredResourceRequest) ProtoMessage() {} func (x *DeleteRegisteredResourceRequest) ProtoReflect() protoreflect.Message { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[8] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -578,7 +696,7 @@ func (x *DeleteRegisteredResourceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteRegisteredResourceRequest.ProtoReflect.Descriptor instead. func (*DeleteRegisteredResourceRequest) Descriptor() ([]byte, []int) { - return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{8} + return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{9} } func (x *DeleteRegisteredResourceRequest) GetId() string { @@ -599,7 +717,7 @@ type DeleteRegisteredResourceResponse struct { func (x *DeleteRegisteredResourceResponse) Reset() { *x = DeleteRegisteredResourceResponse{} if protoimpl.UnsafeEnabled { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[9] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -612,7 +730,7 @@ func (x *DeleteRegisteredResourceResponse) String() string { func (*DeleteRegisteredResourceResponse) ProtoMessage() {} func (x *DeleteRegisteredResourceResponse) ProtoReflect() protoreflect.Message { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[9] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -625,7 +743,7 @@ func (x *DeleteRegisteredResourceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteRegisteredResourceResponse.ProtoReflect.Descriptor instead. func (*DeleteRegisteredResourceResponse) Descriptor() ([]byte, []int) { - return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{9} + return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{10} } func (x *DeleteRegisteredResourceResponse) GetResource() *policy.RegisteredResource { @@ -659,7 +777,7 @@ type ActionAttributeValue struct { func (x *ActionAttributeValue) Reset() { *x = ActionAttributeValue{} if protoimpl.UnsafeEnabled { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[10] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -672,7 +790,7 @@ func (x *ActionAttributeValue) String() string { func (*ActionAttributeValue) ProtoMessage() {} func (x *ActionAttributeValue) ProtoReflect() protoreflect.Message { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[10] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -685,7 +803,7 @@ func (x *ActionAttributeValue) ProtoReflect() protoreflect.Message { // Deprecated: Use ActionAttributeValue.ProtoReflect.Descriptor instead. func (*ActionAttributeValue) Descriptor() ([]byte, []int) { - return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{10} + return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{11} } func (m *ActionAttributeValue) GetActionIdentifier() isActionAttributeValue_ActionIdentifier { @@ -783,7 +901,7 @@ type CreateRegisteredResourceValueRequest struct { func (x *CreateRegisteredResourceValueRequest) Reset() { *x = CreateRegisteredResourceValueRequest{} if protoimpl.UnsafeEnabled { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[11] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -796,7 +914,7 @@ func (x *CreateRegisteredResourceValueRequest) String() string { func (*CreateRegisteredResourceValueRequest) ProtoMessage() {} func (x *CreateRegisteredResourceValueRequest) ProtoReflect() protoreflect.Message { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[11] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -809,7 +927,7 @@ func (x *CreateRegisteredResourceValueRequest) ProtoReflect() protoreflect.Messa // Deprecated: Use CreateRegisteredResourceValueRequest.ProtoReflect.Descriptor instead. func (*CreateRegisteredResourceValueRequest) Descriptor() ([]byte, []int) { - return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{11} + return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{12} } func (x *CreateRegisteredResourceValueRequest) GetResourceId() string { @@ -851,7 +969,7 @@ type CreateRegisteredResourceValueResponse struct { func (x *CreateRegisteredResourceValueResponse) Reset() { *x = CreateRegisteredResourceValueResponse{} if protoimpl.UnsafeEnabled { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[12] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -864,7 +982,7 @@ func (x *CreateRegisteredResourceValueResponse) String() string { func (*CreateRegisteredResourceValueResponse) ProtoMessage() {} func (x *CreateRegisteredResourceValueResponse) ProtoReflect() protoreflect.Message { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[12] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -877,7 +995,7 @@ func (x *CreateRegisteredResourceValueResponse) ProtoReflect() protoreflect.Mess // Deprecated: Use CreateRegisteredResourceValueResponse.ProtoReflect.Descriptor instead. func (*CreateRegisteredResourceValueResponse) Descriptor() ([]byte, []int) { - return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{12} + return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{13} } func (x *CreateRegisteredResourceValueResponse) GetValue() *policy.RegisteredResourceValue { @@ -902,7 +1020,7 @@ type GetRegisteredResourceValueRequest struct { func (x *GetRegisteredResourceValueRequest) Reset() { *x = GetRegisteredResourceValueRequest{} if protoimpl.UnsafeEnabled { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[13] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -915,7 +1033,7 @@ func (x *GetRegisteredResourceValueRequest) String() string { func (*GetRegisteredResourceValueRequest) ProtoMessage() {} func (x *GetRegisteredResourceValueRequest) ProtoReflect() protoreflect.Message { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[13] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -928,7 +1046,7 @@ func (x *GetRegisteredResourceValueRequest) ProtoReflect() protoreflect.Message // Deprecated: Use GetRegisteredResourceValueRequest.ProtoReflect.Descriptor instead. func (*GetRegisteredResourceValueRequest) Descriptor() ([]byte, []int) { - return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{13} + return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{14} } func (m *GetRegisteredResourceValueRequest) GetIdentifier() isGetRegisteredResourceValueRequest_Identifier { @@ -979,7 +1097,7 @@ type GetRegisteredResourceValueResponse struct { func (x *GetRegisteredResourceValueResponse) Reset() { *x = GetRegisteredResourceValueResponse{} if protoimpl.UnsafeEnabled { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[14] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -992,7 +1110,7 @@ func (x *GetRegisteredResourceValueResponse) String() string { func (*GetRegisteredResourceValueResponse) ProtoMessage() {} func (x *GetRegisteredResourceValueResponse) ProtoReflect() protoreflect.Message { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[14] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1005,7 +1123,7 @@ func (x *GetRegisteredResourceValueResponse) ProtoReflect() protoreflect.Message // Deprecated: Use GetRegisteredResourceValueResponse.ProtoReflect.Descriptor instead. func (*GetRegisteredResourceValueResponse) Descriptor() ([]byte, []int) { - return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{14} + return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{15} } func (x *GetRegisteredResourceValueResponse) GetValue() *policy.RegisteredResourceValue { @@ -1027,7 +1145,7 @@ type GetRegisteredResourceValuesByFQNsRequest struct { func (x *GetRegisteredResourceValuesByFQNsRequest) Reset() { *x = GetRegisteredResourceValuesByFQNsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[15] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1040,7 +1158,7 @@ func (x *GetRegisteredResourceValuesByFQNsRequest) String() string { func (*GetRegisteredResourceValuesByFQNsRequest) ProtoMessage() {} func (x *GetRegisteredResourceValuesByFQNsRequest) ProtoReflect() protoreflect.Message { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[15] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1053,7 +1171,7 @@ func (x *GetRegisteredResourceValuesByFQNsRequest) ProtoReflect() protoreflect.M // Deprecated: Use GetRegisteredResourceValuesByFQNsRequest.ProtoReflect.Descriptor instead. func (*GetRegisteredResourceValuesByFQNsRequest) Descriptor() ([]byte, []int) { - return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{15} + return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{16} } func (x *GetRegisteredResourceValuesByFQNsRequest) GetFqns() []string { @@ -1074,7 +1192,7 @@ type GetRegisteredResourceValuesByFQNsResponse struct { func (x *GetRegisteredResourceValuesByFQNsResponse) Reset() { *x = GetRegisteredResourceValuesByFQNsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[16] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1087,7 +1205,7 @@ func (x *GetRegisteredResourceValuesByFQNsResponse) String() string { func (*GetRegisteredResourceValuesByFQNsResponse) ProtoMessage() {} func (x *GetRegisteredResourceValuesByFQNsResponse) ProtoReflect() protoreflect.Message { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[16] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1100,7 +1218,7 @@ func (x *GetRegisteredResourceValuesByFQNsResponse) ProtoReflect() protoreflect. // Deprecated: Use GetRegisteredResourceValuesByFQNsResponse.ProtoReflect.Descriptor instead. func (*GetRegisteredResourceValuesByFQNsResponse) Descriptor() ([]byte, []int) { - return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{16} + return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{17} } func (x *GetRegisteredResourceValuesByFQNsResponse) GetFqnValueMap() map[string]*policy.RegisteredResourceValue { @@ -1124,7 +1242,7 @@ type ListRegisteredResourceValuesRequest struct { func (x *ListRegisteredResourceValuesRequest) Reset() { *x = ListRegisteredResourceValuesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[17] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1137,7 +1255,7 @@ func (x *ListRegisteredResourceValuesRequest) String() string { func (*ListRegisteredResourceValuesRequest) ProtoMessage() {} func (x *ListRegisteredResourceValuesRequest) ProtoReflect() protoreflect.Message { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[17] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1150,7 +1268,7 @@ func (x *ListRegisteredResourceValuesRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use ListRegisteredResourceValuesRequest.ProtoReflect.Descriptor instead. func (*ListRegisteredResourceValuesRequest) Descriptor() ([]byte, []int) { - return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{17} + return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{18} } func (x *ListRegisteredResourceValuesRequest) GetResourceId() string { @@ -1179,7 +1297,7 @@ type ListRegisteredResourceValuesResponse struct { func (x *ListRegisteredResourceValuesResponse) Reset() { *x = ListRegisteredResourceValuesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[18] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1192,7 +1310,7 @@ func (x *ListRegisteredResourceValuesResponse) String() string { func (*ListRegisteredResourceValuesResponse) ProtoMessage() {} func (x *ListRegisteredResourceValuesResponse) ProtoReflect() protoreflect.Message { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[18] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1205,7 +1323,7 @@ func (x *ListRegisteredResourceValuesResponse) ProtoReflect() protoreflect.Messa // Deprecated: Use ListRegisteredResourceValuesResponse.ProtoReflect.Descriptor instead. func (*ListRegisteredResourceValuesResponse) Descriptor() ([]byte, []int) { - return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{18} + return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{19} } func (x *ListRegisteredResourceValuesResponse) GetValues() []*policy.RegisteredResourceValue { @@ -1243,7 +1361,7 @@ type UpdateRegisteredResourceValueRequest struct { func (x *UpdateRegisteredResourceValueRequest) Reset() { *x = UpdateRegisteredResourceValueRequest{} if protoimpl.UnsafeEnabled { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[19] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1256,7 +1374,7 @@ func (x *UpdateRegisteredResourceValueRequest) String() string { func (*UpdateRegisteredResourceValueRequest) ProtoMessage() {} func (x *UpdateRegisteredResourceValueRequest) ProtoReflect() protoreflect.Message { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[19] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1269,7 +1387,7 @@ func (x *UpdateRegisteredResourceValueRequest) ProtoReflect() protoreflect.Messa // Deprecated: Use UpdateRegisteredResourceValueRequest.ProtoReflect.Descriptor instead. func (*UpdateRegisteredResourceValueRequest) Descriptor() ([]byte, []int) { - return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{19} + return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{20} } func (x *UpdateRegisteredResourceValueRequest) GetId() string { @@ -1318,7 +1436,7 @@ type UpdateRegisteredResourceValueResponse struct { func (x *UpdateRegisteredResourceValueResponse) Reset() { *x = UpdateRegisteredResourceValueResponse{} if protoimpl.UnsafeEnabled { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[20] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1331,7 +1449,7 @@ func (x *UpdateRegisteredResourceValueResponse) String() string { func (*UpdateRegisteredResourceValueResponse) ProtoMessage() {} func (x *UpdateRegisteredResourceValueResponse) ProtoReflect() protoreflect.Message { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[20] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1344,7 +1462,7 @@ func (x *UpdateRegisteredResourceValueResponse) ProtoReflect() protoreflect.Mess // Deprecated: Use UpdateRegisteredResourceValueResponse.ProtoReflect.Descriptor instead. func (*UpdateRegisteredResourceValueResponse) Descriptor() ([]byte, []int) { - return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{20} + return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{21} } func (x *UpdateRegisteredResourceValueResponse) GetValue() *policy.RegisteredResourceValue { @@ -1366,7 +1484,7 @@ type DeleteRegisteredResourceValueRequest struct { func (x *DeleteRegisteredResourceValueRequest) Reset() { *x = DeleteRegisteredResourceValueRequest{} if protoimpl.UnsafeEnabled { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[21] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1379,7 +1497,7 @@ func (x *DeleteRegisteredResourceValueRequest) String() string { func (*DeleteRegisteredResourceValueRequest) ProtoMessage() {} func (x *DeleteRegisteredResourceValueRequest) ProtoReflect() protoreflect.Message { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[21] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1392,7 +1510,7 @@ func (x *DeleteRegisteredResourceValueRequest) ProtoReflect() protoreflect.Messa // Deprecated: Use DeleteRegisteredResourceValueRequest.ProtoReflect.Descriptor instead. func (*DeleteRegisteredResourceValueRequest) Descriptor() ([]byte, []int) { - return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{21} + return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{22} } func (x *DeleteRegisteredResourceValueRequest) GetId() string { @@ -1413,7 +1531,7 @@ type DeleteRegisteredResourceValueResponse struct { func (x *DeleteRegisteredResourceValueResponse) Reset() { *x = DeleteRegisteredResourceValueResponse{} if protoimpl.UnsafeEnabled { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[22] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1426,7 +1544,7 @@ func (x *DeleteRegisteredResourceValueResponse) String() string { func (*DeleteRegisteredResourceValueResponse) ProtoMessage() {} func (x *DeleteRegisteredResourceValueResponse) ProtoReflect() protoreflect.Message { - mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[22] + mi := &file_policy_registeredresources_registered_resources_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1439,7 +1557,7 @@ func (x *DeleteRegisteredResourceValueResponse) ProtoReflect() protoreflect.Mess // Deprecated: Use DeleteRegisteredResourceValueResponse.ProtoReflect.Descriptor instead. func (*DeleteRegisteredResourceValueResponse) Descriptor() ([]byte, []int) { - return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{22} + return file_policy_registeredresources_registered_resources_proto_rawDescGZIP(), []int{23} } func (x *DeleteRegisteredResourceValueResponse) GetValue() *policy.RegisteredResourceValue { @@ -1546,7 +1664,17 @@ var file_policy_registeredresources_registered_resources_proto_rawDesc = []byte{ 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x22, 0xd9, 0x01, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x67, 0x69, + 0x72, 0x63, 0x65, 0x22, 0x9d, 0x01, 0x0a, 0x17, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x53, 0x6f, 0x72, 0x74, 0x12, + 0x4d, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x37, + 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x53, 0x6f, 0x72, 0x74, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x73, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x33, + 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x15, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x53, 0x6f, 0x72, 0x74, 0x44, + 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0xac, 0x02, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, @@ -1557,392 +1685,410 @@ var file_policy_registeredresources_registered_resources_proto_rawDesc = []byte{ 0x65, 0x46, 0x71, 0x6e, 0x12, 0x33, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, - 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x24, 0xba, 0x48, 0x21, 0x22, 0x1f, - 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x0a, 0x0d, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x66, 0x71, 0x6e, 0x10, 0x00, 0x22, - 0x91, 0x01, 0x0a, 0x1f, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x34, 0x0a, - 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x14, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x22, 0x89, 0x04, 0x0a, 0x1f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, - 0x64, 0x12, 0xc0, 0x02, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x42, 0xab, 0x02, 0xba, 0x48, 0xa7, 0x02, 0xba, 0x01, 0x9b, 0x02, 0x0a, 0x0e, 0x72, 0x72, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0xb3, 0x01, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, - 0x6e, 0x20, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, - 0x68, 0x79, 0x70, 0x68, 0x65, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, - 0x72, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x20, 0x62, 0x75, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, - 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x6f, 0x72, 0x20, - 0x6c, 0x61, 0x73, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x2e, 0x20, - 0x54, 0x68, 0x65, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, - 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, - 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x63, 0x61, 0x73, 0x65, - 0x2e, 0x1a, 0x53, 0x73, 0x69, 0x7a, 0x65, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, 0x20, - 0x30, 0x20, 0x3f, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, - 0x28, 0x27, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, - 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2a, 0x5b, - 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x3f, 0x24, 0x27, 0x29, 0x20, - 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xc8, 0x01, 0x00, 0x72, 0x03, 0x18, 0xfd, 0x01, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, - 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x54, 0x0a, 0x18, 0x6d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x62, 0x65, 0x68, - 0x61, 0x76, 0x69, 0x6f, 0x72, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x16, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x22, - 0x5a, 0x0a, 0x20, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3b, 0x0a, 0x1f, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, - 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0x5a, 0x0a, 0x20, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x08, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x22, 0xad, 0x04, 0x0a, 0x14, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, - 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x27, 0x0a, - 0x09, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x48, 0x00, 0x52, 0x08, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0xb2, 0x02, 0x0a, 0x0b, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x8e, 0x02, 0xba, - 0x48, 0x8a, 0x02, 0xba, 0x01, 0x81, 0x02, 0x0a, 0x12, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0xad, 0x01, 0x41, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, + 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x51, 0x0a, 0x04, 0x73, 0x6f, 0x72, + 0x74, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x53, 0x6f, 0x72, 0x74, 0x42, 0x08, 0xba, 0x48, + 0x05, 0x92, 0x01, 0x02, 0x10, 0x01, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x3a, 0x24, 0xba, 0x48, + 0x21, 0x22, 0x1f, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, + 0x64, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x66, 0x71, 0x6e, + 0x10, 0x00, 0x22, 0x91, 0x01, 0x0a, 0x1f, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, + 0x12, 0x34, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x50, 0x61, + 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x89, 0x04, 0x0a, 0x1f, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, + 0x52, 0x02, 0x69, 0x64, 0x12, 0xc0, 0x02, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x42, 0xab, 0x02, 0xba, 0x48, 0xa7, 0x02, 0xba, 0x01, 0x9b, 0x02, 0x0a, 0x0e, + 0x72, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0xb3, + 0x01, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x79, 0x70, 0x68, 0x65, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x20, 0x62, 0x75, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, - 0x72, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x20, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, - 0x65, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, - 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x63, 0x61, 0x73, 0x65, 0x2e, 0x1a, 0x3b, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, - 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, - 0x5a, 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2a, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, - 0x2d, 0x39, 0x5d, 0x29, 0x3f, 0x24, 0x27, 0x29, 0x72, 0x03, 0x18, 0xfd, 0x01, 0x48, 0x00, 0x52, - 0x0a, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x12, 0x61, - 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x69, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, - 0x01, 0x48, 0x01, 0x52, 0x10, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x49, 0x64, 0x12, 0x3c, 0x0a, 0x13, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, - 0x74, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x66, 0x71, 0x6e, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x0a, 0xba, 0x48, 0x07, 0x72, 0x05, 0x10, 0x01, 0x88, 0x01, 0x01, 0x48, 0x01, - 0x52, 0x11, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x46, 0x71, 0x6e, 0x42, 0x1a, 0x0a, 0x11, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x05, 0xba, 0x48, 0x02, 0x08, 0x01, 0x42, - 0x23, 0x0a, 0x1a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x5f, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x05, 0xba, - 0x48, 0x02, 0x08, 0x01, 0x22, 0xa0, 0x04, 0x0a, 0x24, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, - 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x0a, 0x72, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x12, 0xad, 0x02, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x96, 0x02, 0xba, 0x48, 0x92, 0x02, 0xba, - 0x01, 0x86, 0x02, 0x0a, 0x0f, 0x72, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x66, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x12, 0xb5, 0x01, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, - 0x64, 0x20, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, - 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x79, 0x70, 0x68, 0x65, 0x6e, - 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x63, 0x6f, 0x72, 0x65, - 0x73, 0x20, 0x62, 0x75, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x63, - 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, - 0x62, 0x65, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x74, 0x6f, - 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x63, 0x61, 0x73, 0x65, 0x2e, 0x1a, 0x3b, 0x74, 0x68, - 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x5b, 0x61, 0x2d, - 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x41, - 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2a, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, - 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x3f, 0x24, 0x27, 0x29, 0xc8, 0x01, 0x01, 0x72, 0x03, 0x18, 0xfd, - 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x68, 0x0a, 0x17, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x5f, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x74, 0x74, - 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x15, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x73, 0x12, 0x33, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x64, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x08, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x5e, 0x0a, 0x25, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1f, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x74, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, - 0x01, 0x01, 0x48, 0x00, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x03, 0x66, 0x71, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xba, 0x48, 0x07, 0x72, 0x05, 0x10, 0x01, 0x88, 0x01, - 0x01, 0x48, 0x00, 0x52, 0x03, 0x66, 0x71, 0x6e, 0x42, 0x13, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x05, 0xba, 0x48, 0x02, 0x08, 0x01, 0x22, 0x5b, 0x0a, - 0x22, 0x47, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x53, 0x0a, 0x28, 0x47, 0x65, - 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x04, 0x66, 0x71, 0x6e, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x09, 0x42, 0x13, 0xba, 0x48, 0x10, 0x92, 0x01, 0x0d, 0x08, 0x01, 0x18, 0x01, - 0x22, 0x07, 0x72, 0x05, 0x10, 0x01, 0x88, 0x01, 0x01, 0x52, 0x04, 0x66, 0x71, 0x6e, 0x73, 0x22, - 0x88, 0x02, 0x0a, 0x29, 0x47, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, - 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x42, - 0x79, 0x46, 0x51, 0x4e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7a, 0x0a, - 0x0d, 0x66, 0x71, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x56, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x42, 0x79, 0x46, - 0x51, 0x4e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x46, 0x71, 0x6e, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x66, 0x71, - 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x61, 0x70, 0x1a, 0x5f, 0x0a, 0x10, 0x46, 0x71, 0x6e, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, - 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb2, 0x02, 0x0a, 0x23, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0xd5, 0x01, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0xb3, 0x01, 0xba, 0x48, 0xaf, 0x01, 0xba, - 0x01, 0xab, 0x01, 0x0a, 0x14, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x75, 0x75, - 0x69, 0x64, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x23, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, - 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x55, 0x55, 0x49, 0x44, 0x1a, 0x6e, - 0x73, 0x69, 0x7a, 0x65, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x20, - 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, - 0x27, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x5d, 0x7b, 0x38, 0x7d, 0x2d, - 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x5d, 0x7b, 0x34, 0x7d, 0x2d, 0x5b, - 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x5d, 0x7b, 0x34, 0x7d, 0x2d, 0x5b, 0x30, - 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x5d, 0x7b, 0x34, 0x7d, 0x2d, 0x5b, 0x30, 0x2d, - 0x39, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x5d, 0x7b, 0x31, 0x32, 0x7d, 0x27, 0x29, 0x52, 0x0a, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x0a, 0x70, 0x61, - 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0x95, 0x01, 0x0a, 0x24, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x72, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x63, + 0x61, 0x73, 0x65, 0x2e, 0x1a, 0x53, 0x73, 0x69, 0x7a, 0x65, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, + 0x20, 0x3e, 0x20, 0x30, 0x20, 0x3f, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, + 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5f, 0x2d, + 0x5d, 0x2a, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x3f, 0x24, + 0x27, 0x29, 0x20, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xc8, 0x01, 0x00, 0x72, 0x03, 0x18, 0xfd, + 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x75, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x54, 0x0a, 0x18, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, + 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x16, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, + 0x6f, 0x72, 0x22, 0x5a, 0x0a, 0x20, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x73, 0x12, 0x34, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x50, - 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xfd, 0x04, 0x0a, 0x24, 0x55, 0x70, 0x64, 0x61, + 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3b, + 0x0a, 0x1f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, + 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0x5a, 0x0a, 0x20, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x36, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xad, 0x04, 0x0a, 0x14, 0x41, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x27, 0x0a, 0x09, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x48, 0x00, 0x52, + 0x08, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0xb2, 0x02, 0x0a, 0x0b, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x8e, 0x02, 0xba, 0x48, 0x8a, 0x02, 0xba, 0x01, 0x81, 0x02, 0x0a, 0x12, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0xad, + 0x01, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6d, 0x75, 0x73, + 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x6e, 0x75, 0x6d, + 0x65, 0x72, 0x69, 0x63, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x79, 0x70, 0x68, 0x65, 0x6e, 0x73, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x20, 0x62, 0x75, + 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, + 0x73, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, + 0x63, 0x74, 0x65, 0x72, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, + 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x77, 0x69, 0x6c, + 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, + 0x74, 0x6f, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x63, 0x61, 0x73, 0x65, 0x2e, 0x1a, 0x3b, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x5b, + 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x61, 0x2d, + 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2a, 0x5b, 0x61, 0x2d, 0x7a, 0x41, + 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x3f, 0x24, 0x27, 0x29, 0x72, 0x03, 0x18, 0xfd, 0x01, + 0x48, 0x00, 0x52, 0x0a, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x38, + 0x0a, 0x12, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, + 0x03, 0xb0, 0x01, 0x01, 0x48, 0x01, 0x52, 0x10, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, + 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x49, 0x64, 0x12, 0x3c, 0x0a, 0x13, 0x61, 0x74, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x66, 0x71, 0x6e, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xba, 0x48, 0x07, 0x72, 0x05, 0x10, 0x01, 0x88, 0x01, + 0x01, 0x48, 0x01, 0x52, 0x11, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x46, 0x71, 0x6e, 0x42, 0x1a, 0x0a, 0x11, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x05, 0xba, 0x48, 0x02, + 0x08, 0x01, 0x42, 0x23, 0x0a, 0x1a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x5f, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x12, 0x05, 0xba, 0x48, 0x02, 0x08, 0x01, 0x22, 0xa0, 0x04, 0x0a, 0x24, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, - 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0xc5, 0x02, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0xae, 0x02, 0xba, 0x48, 0xaa, - 0x02, 0xba, 0x01, 0x9e, 0x02, 0x0a, 0x0f, 0x72, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, - 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0xb5, 0x01, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x65, 0x64, 0x20, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x79, 0x70, 0x68, - 0x65, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x63, 0x6f, - 0x72, 0x65, 0x73, 0x20, 0x62, 0x75, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x73, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x61, 0x73, 0x74, - 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x77, 0x69, 0x6c, - 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, - 0x74, 0x6f, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x63, 0x61, 0x73, 0x65, 0x2e, 0x1a, 0x53, - 0x73, 0x69, 0x7a, 0x65, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x20, 0x3f, - 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, + 0x12, 0x29, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, + 0x0a, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x12, 0xad, 0x02, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x96, 0x02, 0xba, 0x48, + 0x92, 0x02, 0xba, 0x01, 0x86, 0x02, 0x0a, 0x0f, 0x72, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0xb5, 0x01, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x65, 0x64, 0x20, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x79, 0x70, + 0x68, 0x65, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x63, + 0x6f, 0x72, 0x65, 0x73, 0x20, 0x62, 0x75, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x61, 0x73, + 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x2e, 0x20, 0x54, 0x68, 0x65, + 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x77, 0x69, + 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, + 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x63, 0x61, 0x73, 0x65, 0x2e, 0x1a, + 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2a, 0x5b, 0x61, 0x2d, 0x7a, - 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x3f, 0x24, 0x27, 0x29, 0x20, 0x3a, 0x20, 0x74, - 0x72, 0x75, 0x65, 0xc8, 0x01, 0x00, 0x72, 0x03, 0x18, 0xfd, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x68, 0x0a, 0x17, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x74, 0x74, - 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, - 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x15, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x74, 0x74, - 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x33, 0x0a, 0x08, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x4d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x12, 0x54, 0x0a, 0x18, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x18, 0x65, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x52, - 0x16, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, - 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x22, 0x5e, 0x0a, 0x25, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1f, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x40, 0x0a, 0x24, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x3f, 0x24, 0x27, 0x29, 0xc8, 0x01, 0x01, 0x72, + 0x03, 0x18, 0xfd, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x68, 0x0a, 0x17, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x5f, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x15, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x33, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x5e, 0x0a, 0x25, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x74, 0x0a, 0x21, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, - 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0x5e, 0x0a, 0x25, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x1a, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, + 0x72, 0x03, 0xb0, 0x01, 0x01, 0x48, 0x00, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x03, 0x66, + 0x71, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xba, 0x48, 0x07, 0x72, 0x05, 0x10, + 0x01, 0x88, 0x01, 0x01, 0x48, 0x00, 0x52, 0x03, 0x66, 0x71, 0x6e, 0x42, 0x13, 0x0a, 0x0a, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x05, 0xba, 0x48, 0x02, 0x08, 0x01, + 0x22, 0x5b, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, + 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x53, 0x0a, + 0x28, 0x47, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x42, 0x79, 0x46, 0x51, + 0x4e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x04, 0x66, 0x71, 0x6e, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x13, 0xba, 0x48, 0x10, 0x92, 0x01, 0x0d, 0x08, + 0x01, 0x18, 0x01, 0x22, 0x07, 0x72, 0x05, 0x10, 0x01, 0x88, 0x01, 0x01, 0x52, 0x04, 0x66, 0x71, + 0x6e, 0x73, 0x22, 0x88, 0x02, 0x0a, 0x29, 0x47, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x7a, 0x0a, 0x0d, 0x66, 0x71, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x6d, 0x61, + 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x56, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x46, + 0x71, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0b, 0x66, 0x71, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x61, 0x70, 0x1a, 0x5f, 0x0a, 0x10, + 0x46, 0x71, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x32, 0x88, 0x0e, 0x0a, 0x1a, 0x52, 0x65, + 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb2, 0x02, + 0x0a, 0x23, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0xd5, 0x01, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0xb3, 0x01, 0xba, 0x48, + 0xaf, 0x01, 0xba, 0x01, 0xab, 0x01, 0x0a, 0x14, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x5f, 0x75, 0x75, 0x69, 0x64, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x23, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x6d, 0x75, 0x73, + 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x55, 0x55, 0x49, + 0x44, 0x1a, 0x6e, 0x73, 0x69, 0x7a, 0x65, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x20, 0x3d, 0x3d, + 0x20, 0x30, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, + 0x65, 0x73, 0x28, 0x27, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x5d, 0x7b, + 0x38, 0x7d, 0x2d, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x5d, 0x7b, 0x34, + 0x7d, 0x2d, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x5d, 0x7b, 0x34, 0x7d, + 0x2d, 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x5d, 0x7b, 0x34, 0x7d, 0x2d, + 0x5b, 0x30, 0x2d, 0x39, 0x61, 0x2d, 0x66, 0x41, 0x2d, 0x46, 0x5d, 0x7b, 0x31, 0x32, 0x7d, 0x27, + 0x29, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x12, 0x33, 0x0a, + 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x95, 0x01, 0x0a, 0x24, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x06, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, + 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xfd, 0x04, 0x0a, 0x24, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0xc5, 0x02, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0xae, 0x02, + 0xba, 0x48, 0xaa, 0x02, 0xba, 0x01, 0x9e, 0x02, 0x0a, 0x0f, 0x72, 0x72, 0x5f, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0xb5, 0x01, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x6e, + 0x20, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x68, + 0x79, 0x70, 0x68, 0x65, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, + 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x20, 0x62, 0x75, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x6c, + 0x61, 0x73, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x2e, 0x20, 0x54, + 0x68, 0x65, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, + 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, + 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x63, 0x61, 0x73, 0x65, + 0x2e, 0x1a, 0x53, 0x73, 0x69, 0x7a, 0x65, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, 0x20, + 0x30, 0x20, 0x3f, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, + 0x28, 0x27, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, + 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2a, 0x5b, + 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x3f, 0x24, 0x27, 0x29, 0x20, + 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xc8, 0x01, 0x00, 0x72, 0x03, 0x18, 0xfd, 0x01, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x68, 0x0a, 0x17, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, + 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x15, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, + 0x33, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x64, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x4d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x12, 0x54, 0x0a, 0x18, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, + 0x18, 0x65, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, + 0x75, 0x6d, 0x52, 0x16, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x22, 0x5e, 0x0a, 0x25, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x40, 0x0a, 0x24, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, + 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0x5e, 0x0a, 0x25, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x97, 0x01, 0x0a, 0x18, 0x43, 0x72, 0x65, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2a, 0xd4, 0x01, 0x0a, + 0x1b, 0x53, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2e, 0x0a, 0x2a, + 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x52, 0x45, 0x47, 0x49, 0x53, 0x54, 0x45, 0x52, 0x45, 0x44, 0x5f, + 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x53, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, + 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x27, 0x0a, 0x23, + 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x52, 0x45, 0x47, 0x49, 0x53, 0x54, 0x45, 0x52, 0x45, 0x44, 0x5f, + 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x53, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, + 0x41, 0x4d, 0x45, 0x10, 0x01, 0x12, 0x2d, 0x0a, 0x29, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x52, 0x45, + 0x47, 0x49, 0x53, 0x54, 0x45, 0x52, 0x45, 0x44, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, + 0x45, 0x53, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x44, 0x5f, + 0x41, 0x54, 0x10, 0x02, 0x12, 0x2d, 0x0a, 0x29, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x52, 0x45, 0x47, + 0x49, 0x53, 0x54, 0x45, 0x52, 0x45, 0x44, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, + 0x53, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x41, + 0x54, 0x10, 0x03, 0x32, 0x88, 0x0e, 0x0a, 0x1a, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x12, 0x97, 0x01, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, + 0x3b, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x3b, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x8e, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x38, 0x2e, 0x70, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x39, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x8e, 0x01, 0x0a, + 0x15, 0x47, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x38, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, - 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x94, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, - 0x3a, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x4c, 0x69, 0x73, + 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x39, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3b, 0x2e, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x97, 0x01, 0x0a, 0x18, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x3b, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x97, 0x01, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x94, 0x01, + 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x3a, 0x2e, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3b, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, + 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x97, 0x01, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x3b, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, + 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0xa6, - 0x01, 0x0a, 0x1d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x12, 0x40, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x41, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x9d, 0x01, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3d, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, - 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, - 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3e, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0xb2, 0x01, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x52, + 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x97, + 0x01, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x3b, 0x2e, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x12, 0x44, 0x2e, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0xa6, 0x01, 0x0a, 0x1d, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x40, 0x2e, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x41, 0x2e, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x9d, 0x01, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x3d, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x3e, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0xb2, 0x01, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x12, 0x44, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x45, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x45, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, - 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x42, 0x79, 0x46, 0x51, - 0x4e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0xa3, 0x01, 0x0a, - 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x3f, 0x2e, - 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, - 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0xa3, 0x01, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x40, + 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x3f, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x40, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0xa6, 0x01, 0x0a, + 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, + 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x40, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x41, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0xa6, 0x01, 0x0a, 0x1d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0xa6, 0x01, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, + 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x40, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x41, 0x2e, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x40, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x87, + 0x02, 0x0a, 0x1e, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x41, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, - 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0xa6, 0x01, 0x0a, 0x1d, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x40, 0x2e, - 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, - 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x41, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x42, 0x87, 0x02, 0x0a, 0x1e, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x42, 0x18, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x50, 0x01, 0x5a, 0x42, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x6f, 0x70, 0x65, 0x6e, 0x74, 0x64, 0x66, 0x2f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x67, 0x6f, 0x2f, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0xa2, 0x02, 0x03, 0x50, 0x52, 0x58, 0xaa, 0x02, 0x1a, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, - 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0xca, 0x02, 0x1a, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x5c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0xe2, 0x02, 0x26, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x5c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x73, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0xea, 0x02, 0x1b, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x3a, 0x3a, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x42, 0x18, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x42, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x74, 0x64, + 0x66, 0x2f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6c, 0x2f, 0x67, 0x6f, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2f, 0x72, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x73, 0xa2, 0x02, 0x03, 0x50, 0x52, 0x58, 0xaa, 0x02, 0x1a, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0xca, 0x02, 0x1a, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5c, 0x52, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x73, 0xe2, 0x02, 0x26, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5c, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x5c, 0x47, + 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x1b, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x3a, 0x3a, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1957,91 +2103,98 @@ func file_policy_registeredresources_registered_resources_proto_rawDescGZIP() [] return file_policy_registeredresources_registered_resources_proto_rawDescData } -var file_policy_registeredresources_registered_resources_proto_msgTypes = make([]protoimpl.MessageInfo, 24) +var file_policy_registeredresources_registered_resources_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_policy_registeredresources_registered_resources_proto_msgTypes = make([]protoimpl.MessageInfo, 25) var file_policy_registeredresources_registered_resources_proto_goTypes = []interface{}{ - (*CreateRegisteredResourceRequest)(nil), // 0: policy.registeredresources.CreateRegisteredResourceRequest - (*CreateRegisteredResourceResponse)(nil), // 1: policy.registeredresources.CreateRegisteredResourceResponse - (*GetRegisteredResourceRequest)(nil), // 2: policy.registeredresources.GetRegisteredResourceRequest - (*GetRegisteredResourceResponse)(nil), // 3: policy.registeredresources.GetRegisteredResourceResponse - (*ListRegisteredResourcesRequest)(nil), // 4: policy.registeredresources.ListRegisteredResourcesRequest - (*ListRegisteredResourcesResponse)(nil), // 5: policy.registeredresources.ListRegisteredResourcesResponse - (*UpdateRegisteredResourceRequest)(nil), // 6: policy.registeredresources.UpdateRegisteredResourceRequest - (*UpdateRegisteredResourceResponse)(nil), // 7: policy.registeredresources.UpdateRegisteredResourceResponse - (*DeleteRegisteredResourceRequest)(nil), // 8: policy.registeredresources.DeleteRegisteredResourceRequest - (*DeleteRegisteredResourceResponse)(nil), // 9: policy.registeredresources.DeleteRegisteredResourceResponse - (*ActionAttributeValue)(nil), // 10: policy.registeredresources.ActionAttributeValue - (*CreateRegisteredResourceValueRequest)(nil), // 11: policy.registeredresources.CreateRegisteredResourceValueRequest - (*CreateRegisteredResourceValueResponse)(nil), // 12: policy.registeredresources.CreateRegisteredResourceValueResponse - (*GetRegisteredResourceValueRequest)(nil), // 13: policy.registeredresources.GetRegisteredResourceValueRequest - (*GetRegisteredResourceValueResponse)(nil), // 14: policy.registeredresources.GetRegisteredResourceValueResponse - (*GetRegisteredResourceValuesByFQNsRequest)(nil), // 15: policy.registeredresources.GetRegisteredResourceValuesByFQNsRequest - (*GetRegisteredResourceValuesByFQNsResponse)(nil), // 16: policy.registeredresources.GetRegisteredResourceValuesByFQNsResponse - (*ListRegisteredResourceValuesRequest)(nil), // 17: policy.registeredresources.ListRegisteredResourceValuesRequest - (*ListRegisteredResourceValuesResponse)(nil), // 18: policy.registeredresources.ListRegisteredResourceValuesResponse - (*UpdateRegisteredResourceValueRequest)(nil), // 19: policy.registeredresources.UpdateRegisteredResourceValueRequest - (*UpdateRegisteredResourceValueResponse)(nil), // 20: policy.registeredresources.UpdateRegisteredResourceValueResponse - (*DeleteRegisteredResourceValueRequest)(nil), // 21: policy.registeredresources.DeleteRegisteredResourceValueRequest - (*DeleteRegisteredResourceValueResponse)(nil), // 22: policy.registeredresources.DeleteRegisteredResourceValueResponse - nil, // 23: policy.registeredresources.GetRegisteredResourceValuesByFQNsResponse.FqnValueMapEntry - (*common.MetadataMutable)(nil), // 24: common.MetadataMutable - (*policy.RegisteredResource)(nil), // 25: policy.RegisteredResource - (*policy.PageRequest)(nil), // 26: policy.PageRequest - (*policy.PageResponse)(nil), // 27: policy.PageResponse - (common.MetadataUpdateEnum)(0), // 28: common.MetadataUpdateEnum - (*policy.RegisteredResourceValue)(nil), // 29: policy.RegisteredResourceValue + (SortRegisteredResourcesType)(0), // 0: policy.registeredresources.SortRegisteredResourcesType + (*CreateRegisteredResourceRequest)(nil), // 1: policy.registeredresources.CreateRegisteredResourceRequest + (*CreateRegisteredResourceResponse)(nil), // 2: policy.registeredresources.CreateRegisteredResourceResponse + (*GetRegisteredResourceRequest)(nil), // 3: policy.registeredresources.GetRegisteredResourceRequest + (*GetRegisteredResourceResponse)(nil), // 4: policy.registeredresources.GetRegisteredResourceResponse + (*RegisteredResourcesSort)(nil), // 5: policy.registeredresources.RegisteredResourcesSort + (*ListRegisteredResourcesRequest)(nil), // 6: policy.registeredresources.ListRegisteredResourcesRequest + (*ListRegisteredResourcesResponse)(nil), // 7: policy.registeredresources.ListRegisteredResourcesResponse + (*UpdateRegisteredResourceRequest)(nil), // 8: policy.registeredresources.UpdateRegisteredResourceRequest + (*UpdateRegisteredResourceResponse)(nil), // 9: policy.registeredresources.UpdateRegisteredResourceResponse + (*DeleteRegisteredResourceRequest)(nil), // 10: policy.registeredresources.DeleteRegisteredResourceRequest + (*DeleteRegisteredResourceResponse)(nil), // 11: policy.registeredresources.DeleteRegisteredResourceResponse + (*ActionAttributeValue)(nil), // 12: policy.registeredresources.ActionAttributeValue + (*CreateRegisteredResourceValueRequest)(nil), // 13: policy.registeredresources.CreateRegisteredResourceValueRequest + (*CreateRegisteredResourceValueResponse)(nil), // 14: policy.registeredresources.CreateRegisteredResourceValueResponse + (*GetRegisteredResourceValueRequest)(nil), // 15: policy.registeredresources.GetRegisteredResourceValueRequest + (*GetRegisteredResourceValueResponse)(nil), // 16: policy.registeredresources.GetRegisteredResourceValueResponse + (*GetRegisteredResourceValuesByFQNsRequest)(nil), // 17: policy.registeredresources.GetRegisteredResourceValuesByFQNsRequest + (*GetRegisteredResourceValuesByFQNsResponse)(nil), // 18: policy.registeredresources.GetRegisteredResourceValuesByFQNsResponse + (*ListRegisteredResourceValuesRequest)(nil), // 19: policy.registeredresources.ListRegisteredResourceValuesRequest + (*ListRegisteredResourceValuesResponse)(nil), // 20: policy.registeredresources.ListRegisteredResourceValuesResponse + (*UpdateRegisteredResourceValueRequest)(nil), // 21: policy.registeredresources.UpdateRegisteredResourceValueRequest + (*UpdateRegisteredResourceValueResponse)(nil), // 22: policy.registeredresources.UpdateRegisteredResourceValueResponse + (*DeleteRegisteredResourceValueRequest)(nil), // 23: policy.registeredresources.DeleteRegisteredResourceValueRequest + (*DeleteRegisteredResourceValueResponse)(nil), // 24: policy.registeredresources.DeleteRegisteredResourceValueResponse + nil, // 25: policy.registeredresources.GetRegisteredResourceValuesByFQNsResponse.FqnValueMapEntry + (*common.MetadataMutable)(nil), // 26: common.MetadataMutable + (*policy.RegisteredResource)(nil), // 27: policy.RegisteredResource + (policy.SortDirection)(0), // 28: policy.SortDirection + (*policy.PageRequest)(nil), // 29: policy.PageRequest + (*policy.PageResponse)(nil), // 30: policy.PageResponse + (common.MetadataUpdateEnum)(0), // 31: common.MetadataUpdateEnum + (*policy.RegisteredResourceValue)(nil), // 32: policy.RegisteredResourceValue } var file_policy_registeredresources_registered_resources_proto_depIdxs = []int32{ - 24, // 0: policy.registeredresources.CreateRegisteredResourceRequest.metadata:type_name -> common.MetadataMutable - 25, // 1: policy.registeredresources.CreateRegisteredResourceResponse.resource:type_name -> policy.RegisteredResource - 25, // 2: policy.registeredresources.GetRegisteredResourceResponse.resource:type_name -> policy.RegisteredResource - 26, // 3: policy.registeredresources.ListRegisteredResourcesRequest.pagination:type_name -> policy.PageRequest - 25, // 4: policy.registeredresources.ListRegisteredResourcesResponse.resources:type_name -> policy.RegisteredResource - 27, // 5: policy.registeredresources.ListRegisteredResourcesResponse.pagination:type_name -> policy.PageResponse - 24, // 6: policy.registeredresources.UpdateRegisteredResourceRequest.metadata:type_name -> common.MetadataMutable - 28, // 7: policy.registeredresources.UpdateRegisteredResourceRequest.metadata_update_behavior:type_name -> common.MetadataUpdateEnum - 25, // 8: policy.registeredresources.UpdateRegisteredResourceResponse.resource:type_name -> policy.RegisteredResource - 25, // 9: policy.registeredresources.DeleteRegisteredResourceResponse.resource:type_name -> policy.RegisteredResource - 10, // 10: policy.registeredresources.CreateRegisteredResourceValueRequest.action_attribute_values:type_name -> policy.registeredresources.ActionAttributeValue - 24, // 11: policy.registeredresources.CreateRegisteredResourceValueRequest.metadata:type_name -> common.MetadataMutable - 29, // 12: policy.registeredresources.CreateRegisteredResourceValueResponse.value:type_name -> policy.RegisteredResourceValue - 29, // 13: policy.registeredresources.GetRegisteredResourceValueResponse.value:type_name -> policy.RegisteredResourceValue - 23, // 14: policy.registeredresources.GetRegisteredResourceValuesByFQNsResponse.fqn_value_map:type_name -> policy.registeredresources.GetRegisteredResourceValuesByFQNsResponse.FqnValueMapEntry - 26, // 15: policy.registeredresources.ListRegisteredResourceValuesRequest.pagination:type_name -> policy.PageRequest - 29, // 16: policy.registeredresources.ListRegisteredResourceValuesResponse.values:type_name -> policy.RegisteredResourceValue - 27, // 17: policy.registeredresources.ListRegisteredResourceValuesResponse.pagination:type_name -> policy.PageResponse - 10, // 18: policy.registeredresources.UpdateRegisteredResourceValueRequest.action_attribute_values:type_name -> policy.registeredresources.ActionAttributeValue - 24, // 19: policy.registeredresources.UpdateRegisteredResourceValueRequest.metadata:type_name -> common.MetadataMutable - 28, // 20: policy.registeredresources.UpdateRegisteredResourceValueRequest.metadata_update_behavior:type_name -> common.MetadataUpdateEnum - 29, // 21: policy.registeredresources.UpdateRegisteredResourceValueResponse.value:type_name -> policy.RegisteredResourceValue - 29, // 22: policy.registeredresources.DeleteRegisteredResourceValueResponse.value:type_name -> policy.RegisteredResourceValue - 29, // 23: policy.registeredresources.GetRegisteredResourceValuesByFQNsResponse.FqnValueMapEntry.value:type_name -> policy.RegisteredResourceValue - 0, // 24: policy.registeredresources.RegisteredResourcesService.CreateRegisteredResource:input_type -> policy.registeredresources.CreateRegisteredResourceRequest - 2, // 25: policy.registeredresources.RegisteredResourcesService.GetRegisteredResource:input_type -> policy.registeredresources.GetRegisteredResourceRequest - 4, // 26: policy.registeredresources.RegisteredResourcesService.ListRegisteredResources:input_type -> policy.registeredresources.ListRegisteredResourcesRequest - 6, // 27: policy.registeredresources.RegisteredResourcesService.UpdateRegisteredResource:input_type -> policy.registeredresources.UpdateRegisteredResourceRequest - 8, // 28: policy.registeredresources.RegisteredResourcesService.DeleteRegisteredResource:input_type -> policy.registeredresources.DeleteRegisteredResourceRequest - 11, // 29: policy.registeredresources.RegisteredResourcesService.CreateRegisteredResourceValue:input_type -> policy.registeredresources.CreateRegisteredResourceValueRequest - 13, // 30: policy.registeredresources.RegisteredResourcesService.GetRegisteredResourceValue:input_type -> policy.registeredresources.GetRegisteredResourceValueRequest - 15, // 31: policy.registeredresources.RegisteredResourcesService.GetRegisteredResourceValuesByFQNs:input_type -> policy.registeredresources.GetRegisteredResourceValuesByFQNsRequest - 17, // 32: policy.registeredresources.RegisteredResourcesService.ListRegisteredResourceValues:input_type -> policy.registeredresources.ListRegisteredResourceValuesRequest - 19, // 33: policy.registeredresources.RegisteredResourcesService.UpdateRegisteredResourceValue:input_type -> policy.registeredresources.UpdateRegisteredResourceValueRequest - 21, // 34: policy.registeredresources.RegisteredResourcesService.DeleteRegisteredResourceValue:input_type -> policy.registeredresources.DeleteRegisteredResourceValueRequest - 1, // 35: policy.registeredresources.RegisteredResourcesService.CreateRegisteredResource:output_type -> policy.registeredresources.CreateRegisteredResourceResponse - 3, // 36: policy.registeredresources.RegisteredResourcesService.GetRegisteredResource:output_type -> policy.registeredresources.GetRegisteredResourceResponse - 5, // 37: policy.registeredresources.RegisteredResourcesService.ListRegisteredResources:output_type -> policy.registeredresources.ListRegisteredResourcesResponse - 7, // 38: policy.registeredresources.RegisteredResourcesService.UpdateRegisteredResource:output_type -> policy.registeredresources.UpdateRegisteredResourceResponse - 9, // 39: policy.registeredresources.RegisteredResourcesService.DeleteRegisteredResource:output_type -> policy.registeredresources.DeleteRegisteredResourceResponse - 12, // 40: policy.registeredresources.RegisteredResourcesService.CreateRegisteredResourceValue:output_type -> policy.registeredresources.CreateRegisteredResourceValueResponse - 14, // 41: policy.registeredresources.RegisteredResourcesService.GetRegisteredResourceValue:output_type -> policy.registeredresources.GetRegisteredResourceValueResponse - 16, // 42: policy.registeredresources.RegisteredResourcesService.GetRegisteredResourceValuesByFQNs:output_type -> policy.registeredresources.GetRegisteredResourceValuesByFQNsResponse - 18, // 43: policy.registeredresources.RegisteredResourcesService.ListRegisteredResourceValues:output_type -> policy.registeredresources.ListRegisteredResourceValuesResponse - 20, // 44: policy.registeredresources.RegisteredResourcesService.UpdateRegisteredResourceValue:output_type -> policy.registeredresources.UpdateRegisteredResourceValueResponse - 22, // 45: policy.registeredresources.RegisteredResourcesService.DeleteRegisteredResourceValue:output_type -> policy.registeredresources.DeleteRegisteredResourceValueResponse - 35, // [35:46] is the sub-list for method output_type - 24, // [24:35] is the sub-list for method input_type - 24, // [24:24] is the sub-list for extension type_name - 24, // [24:24] is the sub-list for extension extendee - 0, // [0:24] is the sub-list for field type_name + 26, // 0: policy.registeredresources.CreateRegisteredResourceRequest.metadata:type_name -> common.MetadataMutable + 27, // 1: policy.registeredresources.CreateRegisteredResourceResponse.resource:type_name -> policy.RegisteredResource + 27, // 2: policy.registeredresources.GetRegisteredResourceResponse.resource:type_name -> policy.RegisteredResource + 0, // 3: policy.registeredresources.RegisteredResourcesSort.field:type_name -> policy.registeredresources.SortRegisteredResourcesType + 28, // 4: policy.registeredresources.RegisteredResourcesSort.direction:type_name -> policy.SortDirection + 29, // 5: policy.registeredresources.ListRegisteredResourcesRequest.pagination:type_name -> policy.PageRequest + 5, // 6: policy.registeredresources.ListRegisteredResourcesRequest.sort:type_name -> policy.registeredresources.RegisteredResourcesSort + 27, // 7: policy.registeredresources.ListRegisteredResourcesResponse.resources:type_name -> policy.RegisteredResource + 30, // 8: policy.registeredresources.ListRegisteredResourcesResponse.pagination:type_name -> policy.PageResponse + 26, // 9: policy.registeredresources.UpdateRegisteredResourceRequest.metadata:type_name -> common.MetadataMutable + 31, // 10: policy.registeredresources.UpdateRegisteredResourceRequest.metadata_update_behavior:type_name -> common.MetadataUpdateEnum + 27, // 11: policy.registeredresources.UpdateRegisteredResourceResponse.resource:type_name -> policy.RegisteredResource + 27, // 12: policy.registeredresources.DeleteRegisteredResourceResponse.resource:type_name -> policy.RegisteredResource + 12, // 13: policy.registeredresources.CreateRegisteredResourceValueRequest.action_attribute_values:type_name -> policy.registeredresources.ActionAttributeValue + 26, // 14: policy.registeredresources.CreateRegisteredResourceValueRequest.metadata:type_name -> common.MetadataMutable + 32, // 15: policy.registeredresources.CreateRegisteredResourceValueResponse.value:type_name -> policy.RegisteredResourceValue + 32, // 16: policy.registeredresources.GetRegisteredResourceValueResponse.value:type_name -> policy.RegisteredResourceValue + 25, // 17: policy.registeredresources.GetRegisteredResourceValuesByFQNsResponse.fqn_value_map:type_name -> policy.registeredresources.GetRegisteredResourceValuesByFQNsResponse.FqnValueMapEntry + 29, // 18: policy.registeredresources.ListRegisteredResourceValuesRequest.pagination:type_name -> policy.PageRequest + 32, // 19: policy.registeredresources.ListRegisteredResourceValuesResponse.values:type_name -> policy.RegisteredResourceValue + 30, // 20: policy.registeredresources.ListRegisteredResourceValuesResponse.pagination:type_name -> policy.PageResponse + 12, // 21: policy.registeredresources.UpdateRegisteredResourceValueRequest.action_attribute_values:type_name -> policy.registeredresources.ActionAttributeValue + 26, // 22: policy.registeredresources.UpdateRegisteredResourceValueRequest.metadata:type_name -> common.MetadataMutable + 31, // 23: policy.registeredresources.UpdateRegisteredResourceValueRequest.metadata_update_behavior:type_name -> common.MetadataUpdateEnum + 32, // 24: policy.registeredresources.UpdateRegisteredResourceValueResponse.value:type_name -> policy.RegisteredResourceValue + 32, // 25: policy.registeredresources.DeleteRegisteredResourceValueResponse.value:type_name -> policy.RegisteredResourceValue + 32, // 26: policy.registeredresources.GetRegisteredResourceValuesByFQNsResponse.FqnValueMapEntry.value:type_name -> policy.RegisteredResourceValue + 1, // 27: policy.registeredresources.RegisteredResourcesService.CreateRegisteredResource:input_type -> policy.registeredresources.CreateRegisteredResourceRequest + 3, // 28: policy.registeredresources.RegisteredResourcesService.GetRegisteredResource:input_type -> policy.registeredresources.GetRegisteredResourceRequest + 6, // 29: policy.registeredresources.RegisteredResourcesService.ListRegisteredResources:input_type -> policy.registeredresources.ListRegisteredResourcesRequest + 8, // 30: policy.registeredresources.RegisteredResourcesService.UpdateRegisteredResource:input_type -> policy.registeredresources.UpdateRegisteredResourceRequest + 10, // 31: policy.registeredresources.RegisteredResourcesService.DeleteRegisteredResource:input_type -> policy.registeredresources.DeleteRegisteredResourceRequest + 13, // 32: policy.registeredresources.RegisteredResourcesService.CreateRegisteredResourceValue:input_type -> policy.registeredresources.CreateRegisteredResourceValueRequest + 15, // 33: policy.registeredresources.RegisteredResourcesService.GetRegisteredResourceValue:input_type -> policy.registeredresources.GetRegisteredResourceValueRequest + 17, // 34: policy.registeredresources.RegisteredResourcesService.GetRegisteredResourceValuesByFQNs:input_type -> policy.registeredresources.GetRegisteredResourceValuesByFQNsRequest + 19, // 35: policy.registeredresources.RegisteredResourcesService.ListRegisteredResourceValues:input_type -> policy.registeredresources.ListRegisteredResourceValuesRequest + 21, // 36: policy.registeredresources.RegisteredResourcesService.UpdateRegisteredResourceValue:input_type -> policy.registeredresources.UpdateRegisteredResourceValueRequest + 23, // 37: policy.registeredresources.RegisteredResourcesService.DeleteRegisteredResourceValue:input_type -> policy.registeredresources.DeleteRegisteredResourceValueRequest + 2, // 38: policy.registeredresources.RegisteredResourcesService.CreateRegisteredResource:output_type -> policy.registeredresources.CreateRegisteredResourceResponse + 4, // 39: policy.registeredresources.RegisteredResourcesService.GetRegisteredResource:output_type -> policy.registeredresources.GetRegisteredResourceResponse + 7, // 40: policy.registeredresources.RegisteredResourcesService.ListRegisteredResources:output_type -> policy.registeredresources.ListRegisteredResourcesResponse + 9, // 41: policy.registeredresources.RegisteredResourcesService.UpdateRegisteredResource:output_type -> policy.registeredresources.UpdateRegisteredResourceResponse + 11, // 42: policy.registeredresources.RegisteredResourcesService.DeleteRegisteredResource:output_type -> policy.registeredresources.DeleteRegisteredResourceResponse + 14, // 43: policy.registeredresources.RegisteredResourcesService.CreateRegisteredResourceValue:output_type -> policy.registeredresources.CreateRegisteredResourceValueResponse + 16, // 44: policy.registeredresources.RegisteredResourcesService.GetRegisteredResourceValue:output_type -> policy.registeredresources.GetRegisteredResourceValueResponse + 18, // 45: policy.registeredresources.RegisteredResourcesService.GetRegisteredResourceValuesByFQNs:output_type -> policy.registeredresources.GetRegisteredResourceValuesByFQNsResponse + 20, // 46: policy.registeredresources.RegisteredResourcesService.ListRegisteredResourceValues:output_type -> policy.registeredresources.ListRegisteredResourceValuesResponse + 22, // 47: policy.registeredresources.RegisteredResourcesService.UpdateRegisteredResourceValue:output_type -> policy.registeredresources.UpdateRegisteredResourceValueResponse + 24, // 48: policy.registeredresources.RegisteredResourcesService.DeleteRegisteredResourceValue:output_type -> policy.registeredresources.DeleteRegisteredResourceValueResponse + 38, // [38:49] is the sub-list for method output_type + 27, // [27:38] is the sub-list for method input_type + 27, // [27:27] is the sub-list for extension type_name + 27, // [27:27] is the sub-list for extension extendee + 0, // [0:27] is the sub-list for field type_name } func init() { file_policy_registeredresources_registered_resources_proto_init() } @@ -2099,7 +2252,7 @@ func file_policy_registeredresources_registered_resources_proto_init() { } } file_policy_registeredresources_registered_resources_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListRegisteredResourcesRequest); i { + switch v := v.(*RegisteredResourcesSort); i { case 0: return &v.state case 1: @@ -2111,7 +2264,7 @@ func file_policy_registeredresources_registered_resources_proto_init() { } } file_policy_registeredresources_registered_resources_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListRegisteredResourcesResponse); i { + switch v := v.(*ListRegisteredResourcesRequest); i { case 0: return &v.state case 1: @@ -2123,7 +2276,7 @@ func file_policy_registeredresources_registered_resources_proto_init() { } } file_policy_registeredresources_registered_resources_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateRegisteredResourceRequest); i { + switch v := v.(*ListRegisteredResourcesResponse); i { case 0: return &v.state case 1: @@ -2135,7 +2288,7 @@ func file_policy_registeredresources_registered_resources_proto_init() { } } file_policy_registeredresources_registered_resources_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateRegisteredResourceResponse); i { + switch v := v.(*UpdateRegisteredResourceRequest); i { case 0: return &v.state case 1: @@ -2147,7 +2300,7 @@ func file_policy_registeredresources_registered_resources_proto_init() { } } file_policy_registeredresources_registered_resources_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteRegisteredResourceRequest); i { + switch v := v.(*UpdateRegisteredResourceResponse); i { case 0: return &v.state case 1: @@ -2159,7 +2312,7 @@ func file_policy_registeredresources_registered_resources_proto_init() { } } file_policy_registeredresources_registered_resources_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteRegisteredResourceResponse); i { + switch v := v.(*DeleteRegisteredResourceRequest); i { case 0: return &v.state case 1: @@ -2171,7 +2324,7 @@ func file_policy_registeredresources_registered_resources_proto_init() { } } file_policy_registeredresources_registered_resources_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ActionAttributeValue); i { + switch v := v.(*DeleteRegisteredResourceResponse); i { case 0: return &v.state case 1: @@ -2183,7 +2336,7 @@ func file_policy_registeredresources_registered_resources_proto_init() { } } file_policy_registeredresources_registered_resources_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateRegisteredResourceValueRequest); i { + switch v := v.(*ActionAttributeValue); i { case 0: return &v.state case 1: @@ -2195,7 +2348,7 @@ func file_policy_registeredresources_registered_resources_proto_init() { } } file_policy_registeredresources_registered_resources_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateRegisteredResourceValueResponse); i { + switch v := v.(*CreateRegisteredResourceValueRequest); i { case 0: return &v.state case 1: @@ -2207,7 +2360,7 @@ func file_policy_registeredresources_registered_resources_proto_init() { } } file_policy_registeredresources_registered_resources_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetRegisteredResourceValueRequest); i { + switch v := v.(*CreateRegisteredResourceValueResponse); i { case 0: return &v.state case 1: @@ -2219,7 +2372,7 @@ func file_policy_registeredresources_registered_resources_proto_init() { } } file_policy_registeredresources_registered_resources_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetRegisteredResourceValueResponse); i { + switch v := v.(*GetRegisteredResourceValueRequest); i { case 0: return &v.state case 1: @@ -2231,7 +2384,7 @@ func file_policy_registeredresources_registered_resources_proto_init() { } } file_policy_registeredresources_registered_resources_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetRegisteredResourceValuesByFQNsRequest); i { + switch v := v.(*GetRegisteredResourceValueResponse); i { case 0: return &v.state case 1: @@ -2243,7 +2396,7 @@ func file_policy_registeredresources_registered_resources_proto_init() { } } file_policy_registeredresources_registered_resources_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetRegisteredResourceValuesByFQNsResponse); i { + switch v := v.(*GetRegisteredResourceValuesByFQNsRequest); i { case 0: return &v.state case 1: @@ -2255,7 +2408,7 @@ func file_policy_registeredresources_registered_resources_proto_init() { } } file_policy_registeredresources_registered_resources_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListRegisteredResourceValuesRequest); i { + switch v := v.(*GetRegisteredResourceValuesByFQNsResponse); i { case 0: return &v.state case 1: @@ -2267,7 +2420,7 @@ func file_policy_registeredresources_registered_resources_proto_init() { } } file_policy_registeredresources_registered_resources_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListRegisteredResourceValuesResponse); i { + switch v := v.(*ListRegisteredResourceValuesRequest); i { case 0: return &v.state case 1: @@ -2279,7 +2432,7 @@ func file_policy_registeredresources_registered_resources_proto_init() { } } file_policy_registeredresources_registered_resources_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateRegisteredResourceValueRequest); i { + switch v := v.(*ListRegisteredResourceValuesResponse); i { case 0: return &v.state case 1: @@ -2291,7 +2444,7 @@ func file_policy_registeredresources_registered_resources_proto_init() { } } file_policy_registeredresources_registered_resources_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateRegisteredResourceValueResponse); i { + switch v := v.(*UpdateRegisteredResourceValueRequest); i { case 0: return &v.state case 1: @@ -2303,7 +2456,7 @@ func file_policy_registeredresources_registered_resources_proto_init() { } } file_policy_registeredresources_registered_resources_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteRegisteredResourceValueRequest); i { + switch v := v.(*UpdateRegisteredResourceValueResponse); i { case 0: return &v.state case 1: @@ -2315,6 +2468,18 @@ func file_policy_registeredresources_registered_resources_proto_init() { } } file_policy_registeredresources_registered_resources_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteRegisteredResourceValueRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_policy_registeredresources_registered_resources_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DeleteRegisteredResourceValueResponse); i { case 0: return &v.state @@ -2331,13 +2496,13 @@ func file_policy_registeredresources_registered_resources_proto_init() { (*GetRegisteredResourceRequest_Id)(nil), (*GetRegisteredResourceRequest_Name)(nil), } - file_policy_registeredresources_registered_resources_proto_msgTypes[10].OneofWrappers = []interface{}{ + file_policy_registeredresources_registered_resources_proto_msgTypes[11].OneofWrappers = []interface{}{ (*ActionAttributeValue_ActionId)(nil), (*ActionAttributeValue_ActionName)(nil), (*ActionAttributeValue_AttributeValueId)(nil), (*ActionAttributeValue_AttributeValueFqn)(nil), } - file_policy_registeredresources_registered_resources_proto_msgTypes[13].OneofWrappers = []interface{}{ + file_policy_registeredresources_registered_resources_proto_msgTypes[14].OneofWrappers = []interface{}{ (*GetRegisteredResourceValueRequest_Id)(nil), (*GetRegisteredResourceValueRequest_Fqn)(nil), } @@ -2346,13 +2511,14 @@ func file_policy_registeredresources_registered_resources_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_policy_registeredresources_registered_resources_proto_rawDesc, - NumEnums: 0, - NumMessages: 24, + NumEnums: 1, + NumMessages: 25, NumExtensions: 0, NumServices: 1, }, GoTypes: file_policy_registeredresources_registered_resources_proto_goTypes, DependencyIndexes: file_policy_registeredresources_registered_resources_proto_depIdxs, + EnumInfos: file_policy_registeredresources_registered_resources_proto_enumTypes, MessageInfos: file_policy_registeredresources_registered_resources_proto_msgTypes, }.Build() File_policy_registeredresources_registered_resources_proto = out.File diff --git a/service/integration/registered_resources_test.go b/service/integration/registered_resources_test.go index 16292fa96f..ebdd1f3115 100644 --- a/service/integration/registered_resources_test.go +++ b/service/integration/registered_resources_test.go @@ -2216,6 +2216,189 @@ func (s *RegisteredResourcesSuite) Test_GetRegisteredResource_ByName_Ambiguous_R // │ end namespace-optional tests │ // └─────────────────────────────────────────────────────────────────────────────┘ +// Sort tests + +func (s *RegisteredResourcesSuite) Test_ListRegisteredResources_SortByName_ASC() { + ids := s.createNamedSortTestRegisteredResources([]string{"aaa-rrsort", "bbb-rrsort", "ccc-rrsort"}) + defer s.deleteSortTestRegisteredResources(ids) + + list, err := s.db.PolicyClient.ListRegisteredResources(s.ctx, ®isteredresources.ListRegisteredResourcesRequest{ + Sort: []*registeredresources.RegisteredResourcesSort{ + {Field: registeredresources.SortRegisteredResourcesType_SORT_REGISTERED_RESOURCES_TYPE_NAME, Direction: policy.SortDirection_SORT_DIRECTION_ASC}, + }, + }) + s.Require().NoError(err) + s.NotNil(list) + + // aaa < bbb < ccc in ASC order + assertIDsInOrder(s.T(), list.GetResources(), func(r *policy.RegisteredResource) string { return r.GetId() }, ids[0], ids[1], ids[2]) +} + +func (s *RegisteredResourcesSuite) Test_ListRegisteredResources_SortByName_DESC() { + ids := s.createNamedSortTestRegisteredResources([]string{"aaa-rrsortdesc", "bbb-rrsortdesc", "ccc-rrsortdesc"}) + defer s.deleteSortTestRegisteredResources(ids) + + list, err := s.db.PolicyClient.ListRegisteredResources(s.ctx, ®isteredresources.ListRegisteredResourcesRequest{ + Sort: []*registeredresources.RegisteredResourcesSort{ + {Field: registeredresources.SortRegisteredResourcesType_SORT_REGISTERED_RESOURCES_TYPE_NAME, Direction: policy.SortDirection_SORT_DIRECTION_DESC}, + }, + }) + s.Require().NoError(err) + s.NotNil(list) + + // ccc > bbb > aaa in DESC order + assertIDsInOrder(s.T(), list.GetResources(), func(r *policy.RegisteredResource) string { return r.GetId() }, ids[2], ids[1], ids[0]) +} + +func (s *RegisteredResourcesSuite) Test_ListRegisteredResources_SortByCreatedAt_ASC() { + ids := s.createSortTestRegisteredResources("createdasc-rr") + defer s.deleteSortTestRegisteredResources(ids) + + list, err := s.db.PolicyClient.ListRegisteredResources(s.ctx, ®isteredresources.ListRegisteredResourcesRequest{ + Sort: []*registeredresources.RegisteredResourcesSort{ + {Field: registeredresources.SortRegisteredResourcesType_SORT_REGISTERED_RESOURCES_TYPE_CREATED_AT, Direction: policy.SortDirection_SORT_DIRECTION_ASC}, + }, + }) + s.Require().NoError(err) + s.NotNil(list) + + // oldest first in ASC order + assertIDsInOrder(s.T(), list.GetResources(), func(r *policy.RegisteredResource) string { return r.GetId() }, ids[0], ids[1], ids[2]) +} + +func (s *RegisteredResourcesSuite) Test_ListRegisteredResources_SortByCreatedAt_DESC() { + ids := s.createSortTestRegisteredResources("createddesc-rr") + defer s.deleteSortTestRegisteredResources(ids) + + list, err := s.db.PolicyClient.ListRegisteredResources(s.ctx, ®isteredresources.ListRegisteredResourcesRequest{ + Sort: []*registeredresources.RegisteredResourcesSort{ + {Field: registeredresources.SortRegisteredResourcesType_SORT_REGISTERED_RESOURCES_TYPE_CREATED_AT, Direction: policy.SortDirection_SORT_DIRECTION_DESC}, + }, + }) + s.Require().NoError(err) + s.NotNil(list) + + // newest first in DESC order + assertIDsInOrder(s.T(), list.GetResources(), func(r *policy.RegisteredResource) string { return r.GetId() }, ids[2], ids[1], ids[0]) +} + +func (s *RegisteredResourcesSuite) Test_ListRegisteredResources_SortByUpdatedAt_DESC() { + ids := s.createSortTestRegisteredResources("upd-sort-rr") + defer s.deleteSortTestRegisteredResources(ids) + + // Update the first resource so its updated_at is the most recent + time.Sleep(5 * time.Millisecond) + _, err := s.db.PolicyClient.UpdateRegisteredResource(s.ctx, ®isteredresources.UpdateRegisteredResourceRequest{ + Id: ids[0], + Metadata: &common.MetadataMutable{ + Labels: map[string]string{"updated": "true"}, + }, + MetadataUpdateBehavior: common.MetadataUpdateEnum_METADATA_UPDATE_ENUM_REPLACE, + }) + s.Require().NoError(err) + + list, err := s.db.PolicyClient.ListRegisteredResources(s.ctx, ®isteredresources.ListRegisteredResourcesRequest{ + Sort: []*registeredresources.RegisteredResourcesSort{ + {Field: registeredresources.SortRegisteredResourcesType_SORT_REGISTERED_RESOURCES_TYPE_UPDATED_AT, Direction: policy.SortDirection_SORT_DIRECTION_DESC}, + }, + }) + s.Require().NoError(err) + s.NotNil(list) + + // The updated resource (ids[0]) should appear before the others + assertIDsInOrder(s.T(), list.GetResources(), func(r *policy.RegisteredResource) string { return r.GetId() }, ids[0], ids[2], ids[1]) +} + +func (s *RegisteredResourcesSuite) Test_ListRegisteredResources_SortByUpdatedAt_ASC() { + ids := s.createSortTestRegisteredResources("upd-sort-asc-rr") + defer s.deleteSortTestRegisteredResources(ids) + + // Update the last resource so its updated_at is the most recent + time.Sleep(5 * time.Millisecond) + _, err := s.db.PolicyClient.UpdateRegisteredResource(s.ctx, ®isteredresources.UpdateRegisteredResourceRequest{ + Id: ids[2], + Metadata: &common.MetadataMutable{ + Labels: map[string]string{"updated": "true"}, + }, + MetadataUpdateBehavior: common.MetadataUpdateEnum_METADATA_UPDATE_ENUM_REPLACE, + }) + s.Require().NoError(err) + + list, err := s.db.PolicyClient.ListRegisteredResources(s.ctx, ®isteredresources.ListRegisteredResourcesRequest{ + Sort: []*registeredresources.RegisteredResourcesSort{ + {Field: registeredresources.SortRegisteredResourcesType_SORT_REGISTERED_RESOURCES_TYPE_UPDATED_AT, Direction: policy.SortDirection_SORT_DIRECTION_ASC}, + }, + }) + s.Require().NoError(err) + s.NotNil(list) + + // The updated resource (ids[2]) should appear last in ASC order + assertIDsInOrder(s.T(), list.GetResources(), func(r *policy.RegisteredResource) string { return r.GetId() }, ids[0], ids[1], ids[2]) +} + +func (s *RegisteredResourcesSuite) Test_ListRegisteredResources_SortByUnspecifiedField_FallsBackToDefault() { + ids := s.createSortTestRegisteredResources("unspecified-sort-rr") + defer s.deleteSortTestRegisteredResources(ids) + + list, err := s.db.PolicyClient.ListRegisteredResources(s.ctx, ®isteredresources.ListRegisteredResourcesRequest{ + Sort: []*registeredresources.RegisteredResourcesSort{ + {Field: registeredresources.SortRegisteredResourcesType_SORT_REGISTERED_RESOURCES_TYPE_UNSPECIFIED, Direction: policy.SortDirection_SORT_DIRECTION_ASC}, + }, + }) + s.Require().NoError(err) + s.NotNil(list) + + // Falls back to default created_at DESC ordering + assertIDsInOrder(s.T(), list.GetResources(), func(r *policy.RegisteredResource) string { return r.GetId() }, ids[2], ids[1], ids[0]) +} + +// Sort test helpers + +// createSortTestRegisteredResources creates 3 registered resources with 5ms gaps for distinct timestamps. +// Returns the resource IDs in creation order. +func (s *RegisteredResourcesSuite) createSortTestRegisteredResources(label string) []string { + const count = 3 + ids := make([]string, count) + for i := range count { + if i > 0 { + time.Sleep(5 * time.Millisecond) + } + name := fmt.Sprintf("%s-%d-%d", label, i, time.Now().UnixNano()) + created, err := s.db.PolicyClient.CreateRegisteredResource(s.ctx, ®isteredresources.CreateRegisteredResourceRequest{ + NamespaceId: s.getNamespaceID("example.com"), + Name: name, + }) + s.Require().NoError(err) + ids[i] = created.GetId() + } + return ids +} + +// createNamedSortTestRegisteredResources creates registered resources with specific name prefixes for name sort testing. +// Returns the resource IDs in the same order as the prefixes. +func (s *RegisteredResourcesSuite) createNamedSortTestRegisteredResources(prefixes []string) []string { + suffix := time.Now().UnixNano() + ids := make([]string, len(prefixes)) + for i, prefix := range prefixes { + name := fmt.Sprintf("%s-%d", prefix, suffix) + created, err := s.db.PolicyClient.CreateRegisteredResource(s.ctx, ®isteredresources.CreateRegisteredResourceRequest{ + NamespaceId: s.getNamespaceID("example.com"), + Name: name, + }) + s.Require().NoError(err) + ids[i] = created.GetId() + } + return ids +} + +// deleteSortTestRegisteredResources cleans up registered resources created by sort tests. +func (s *RegisteredResourcesSuite) deleteSortTestRegisteredResources(ids []string) { + for _, id := range ids { + _, err := s.db.PolicyClient.DeleteRegisteredResource(s.ctx, id) + s.Require().NoError(err) + } +} + func (s *RegisteredResourcesSuite) getNamespaceID(key string) string { ns := s.f.GetNamespaceKey(key) return ns.ID diff --git a/service/policy/db/queries/registered_resources.sql b/service/policy/db/queries/registered_resources.sql index a095ba5f78..28fb219f24 100644 --- a/service/policy/db/queries/registered_resources.sql +++ b/service/policy/db/queries/registered_resources.sql @@ -129,7 +129,14 @@ WHERE (sqlc.narg('namespace_id')::uuid IS NULL OR r.namespace_id = sqlc.narg('namespace_id')::uuid) AND (sqlc.narg('namespace_fqn')::text IS NULL OR ns_fqns.fqn = sqlc.narg('namespace_fqn')::text) GROUP BY r.id, n.id, ns_fqns.fqn, counted.total -ORDER BY r.created_at DESC +ORDER BY + CASE WHEN @sort_field::text = 'name' AND @sort_direction::text = 'ASC' THEN r.name END ASC, + CASE WHEN @sort_field::text = 'name' AND @sort_direction::text = 'DESC' THEN r.name END DESC, + CASE WHEN @sort_field::text = 'created_at' AND @sort_direction::text = 'ASC' THEN r.created_at END ASC, + CASE WHEN @sort_field::text = 'created_at' AND @sort_direction::text = 'DESC' THEN r.created_at END DESC, + CASE WHEN @sort_field::text = 'updated_at' AND @sort_direction::text = 'ASC' THEN r.updated_at END ASC, + CASE WHEN @sort_field::text = 'updated_at' AND @sort_direction::text = 'DESC' THEN r.updated_at END DESC, + r.created_at DESC LIMIT @limit_ OFFSET @offset_; diff --git a/service/policy/db/registered_resources.go b/service/policy/db/registered_resources.go index ec4faf5242..e938b5675c 100644 --- a/service/policy/db/registered_resources.go +++ b/service/policy/db/registered_resources.go @@ -206,11 +206,15 @@ func (c PolicyDBClient) ListRegisteredResources(ctx context.Context, r *register return nil, db.ErrListLimitTooLarge } + sortField, sortDirection := GetRegisteredResourcesSortParams(r.GetSort()) + list, err := c.queries.listRegisteredResources(ctx, listRegisteredResourcesParams{ - NamespaceID: parsedID, - NamespaceFqn: pgtypeText(r.GetNamespaceFqn()), - Limit: limit, - Offset: offset, + NamespaceID: parsedID, + NamespaceFqn: pgtypeText(r.GetNamespaceFqn()), + Limit: limit, + Offset: offset, + SortField: sortField, + SortDirection: sortDirection, }) if err != nil { return nil, db.WrapIfKnownInvalidQueryErr(err) diff --git a/service/policy/db/registered_resources.sql.go b/service/policy/db/registered_resources.sql.go index 30272f48db..a8e4229b77 100644 --- a/service/policy/db/registered_resources.sql.go +++ b/service/policy/db/registered_resources.sql.go @@ -639,16 +639,25 @@ WHERE ($1::uuid IS NULL OR r.namespace_id = $1::uuid) AND ($2::text IS NULL OR ns_fqns.fqn = $2::text) GROUP BY r.id, n.id, ns_fqns.fqn, counted.total -ORDER BY r.created_at DESC -LIMIT $4 -OFFSET $3 +ORDER BY + CASE WHEN $3::text = 'name' AND $4::text = 'ASC' THEN r.name END ASC, + CASE WHEN $3::text = 'name' AND $4::text = 'DESC' THEN r.name END DESC, + CASE WHEN $3::text = 'created_at' AND $4::text = 'ASC' THEN r.created_at END ASC, + CASE WHEN $3::text = 'created_at' AND $4::text = 'DESC' THEN r.created_at END DESC, + CASE WHEN $3::text = 'updated_at' AND $4::text = 'ASC' THEN r.updated_at END ASC, + CASE WHEN $3::text = 'updated_at' AND $4::text = 'DESC' THEN r.updated_at END DESC, + r.created_at DESC +LIMIT $6 +OFFSET $5 ` type listRegisteredResourcesParams struct { - NamespaceID pgtype.UUID `json:"namespace_id"` - NamespaceFqn pgtype.Text `json:"namespace_fqn"` - Offset int32 `json:"offset_"` - Limit int32 `json:"limit_"` + NamespaceID pgtype.UUID `json:"namespace_id"` + NamespaceFqn pgtype.Text `json:"namespace_fqn"` + SortField string `json:"sort_field"` + SortDirection string `json:"sort_direction"` + Offset int32 `json:"offset_"` + Limit int32 `json:"limit_"` } type listRegisteredResourcesRow struct { @@ -722,13 +731,22 @@ type listRegisteredResourcesRow struct { // ($1::uuid IS NULL OR r.namespace_id = $1::uuid) AND // ($2::text IS NULL OR ns_fqns.fqn = $2::text) // GROUP BY r.id, n.id, ns_fqns.fqn, counted.total -// ORDER BY r.created_at DESC -// LIMIT $4 -// OFFSET $3 +// ORDER BY +// CASE WHEN $3::text = 'name' AND $4::text = 'ASC' THEN r.name END ASC, +// CASE WHEN $3::text = 'name' AND $4::text = 'DESC' THEN r.name END DESC, +// CASE WHEN $3::text = 'created_at' AND $4::text = 'ASC' THEN r.created_at END ASC, +// CASE WHEN $3::text = 'created_at' AND $4::text = 'DESC' THEN r.created_at END DESC, +// CASE WHEN $3::text = 'updated_at' AND $4::text = 'ASC' THEN r.updated_at END ASC, +// CASE WHEN $3::text = 'updated_at' AND $4::text = 'DESC' THEN r.updated_at END DESC, +// r.created_at DESC +// LIMIT $6 +// OFFSET $5 func (q *Queries) listRegisteredResources(ctx context.Context, arg listRegisteredResourcesParams) ([]listRegisteredResourcesRow, error) { rows, err := q.db.Query(ctx, listRegisteredResources, arg.NamespaceID, arg.NamespaceFqn, + arg.SortField, + arg.SortDirection, arg.Offset, arg.Limit, ) diff --git a/service/policy/db/utils.go b/service/policy/db/utils.go index 1d605a5020..13dd9eab9e 100644 --- a/service/policy/db/utils.go +++ b/service/policy/db/utils.go @@ -13,6 +13,7 @@ import ( "github.com/opentdf/platform/protocol/go/policy/kasregistry" "github.com/opentdf/platform/protocol/go/policy/namespaces" "github.com/opentdf/platform/protocol/go/policy/obligations" + "github.com/opentdf/platform/protocol/go/policy/registeredresources" "github.com/opentdf/platform/protocol/go/policy/subjectmapping" "github.com/opentdf/platform/service/pkg/db" "google.golang.org/protobuf/encoding/protojson" @@ -133,6 +134,33 @@ func GetObligationsSortParams(sort []*obligations.ObligationsSort) (string, stri return field, getSortDirection(s.GetDirection()) } +// GetRegisteredResourcesSortParams maps the strongly-typed RegisteredResourcesSort enum to +// SQL-compatible field name and direction strings. +// Returns empty strings when sort is nil or empty (backward compatible — +// callers fall back to default ORDER BY created_at DESC). +func GetRegisteredResourcesSortParams(sort []*registeredresources.RegisteredResourcesSort) (string, string) { + if len(sort) == 0 || sort[0] == nil { + return "", "" + } + s := sort[0] + + var field string + switch s.GetField() { + case registeredresources.SortRegisteredResourcesType_SORT_REGISTERED_RESOURCES_TYPE_NAME: + field = sortFieldName + case registeredresources.SortRegisteredResourcesType_SORT_REGISTERED_RESOURCES_TYPE_CREATED_AT: + field = sortFieldCreatedAt + case registeredresources.SortRegisteredResourcesType_SORT_REGISTERED_RESOURCES_TYPE_UPDATED_AT: + field = sortFieldUpdatedAt + case registeredresources.SortRegisteredResourcesType_SORT_REGISTERED_RESOURCES_TYPE_UNSPECIFIED: + return "", "" + default: + return "", "" + } + + return field, getSortDirection(s.GetDirection()) +} + // Returns next page's offset if has not yet reached total, or else returns 0 func getNextOffset(currentOffset, limit, total int32) int32 { next := currentOffset + limit diff --git a/service/policy/db/utils_test.go b/service/policy/db/utils_test.go index 6d7c790d2f..00de3ac279 100644 --- a/service/policy/db/utils_test.go +++ b/service/policy/db/utils_test.go @@ -8,6 +8,7 @@ import ( "github.com/opentdf/platform/protocol/go/policy/kasregistry" "github.com/opentdf/platform/protocol/go/policy/namespaces" "github.com/opentdf/platform/protocol/go/policy/obligations" + "github.com/opentdf/platform/protocol/go/policy/registeredresources" "github.com/opentdf/platform/protocol/go/policy/subjectmapping" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -825,3 +826,103 @@ func Test_GetKeyAccessServersSortParams(t *testing.T) { }) } } + +func Test_GetRegisteredResourcesSortParams(t *testing.T) { + cases := []struct { + name string + sort []*registeredresources.RegisteredResourcesSort + expectedField string + expectedDir string + }{ + { + name: "nil sort returns empty strings", + sort: nil, + expectedField: "", + expectedDir: "", + }, + { + name: "empty slice returns empty strings", + sort: []*registeredresources.RegisteredResourcesSort{}, + expectedField: "", + expectedDir: "", + }, + { + name: "nil element returns empty strings", + sort: []*registeredresources.RegisteredResourcesSort{nil}, + expectedField: "", + expectedDir: "", + }, + { + name: "UNSPECIFIED returns empty strings", + sort: []*registeredresources.RegisteredResourcesSort{ + {Field: registeredresources.SortRegisteredResourcesType_SORT_REGISTERED_RESOURCES_TYPE_UNSPECIFIED, Direction: policy.SortDirection_SORT_DIRECTION_ASC}, + }, + expectedField: "", + expectedDir: "", + }, + { + name: "NAME with ASC", + sort: []*registeredresources.RegisteredResourcesSort{ + {Field: registeredresources.SortRegisteredResourcesType_SORT_REGISTERED_RESOURCES_TYPE_NAME, Direction: policy.SortDirection_SORT_DIRECTION_ASC}, + }, + expectedField: "name", + expectedDir: "ASC", + }, + { + name: "NAME with DESC", + sort: []*registeredresources.RegisteredResourcesSort{ + {Field: registeredresources.SortRegisteredResourcesType_SORT_REGISTERED_RESOURCES_TYPE_NAME, Direction: policy.SortDirection_SORT_DIRECTION_DESC}, + }, + expectedField: "name", + expectedDir: "DESC", + }, + { + name: "NAME with unspecified direction defaults to ASC", + sort: []*registeredresources.RegisteredResourcesSort{ + {Field: registeredresources.SortRegisteredResourcesType_SORT_REGISTERED_RESOURCES_TYPE_NAME}, + }, + expectedField: "name", + expectedDir: "ASC", + }, + { + name: "CREATED_AT with ASC", + sort: []*registeredresources.RegisteredResourcesSort{ + {Field: registeredresources.SortRegisteredResourcesType_SORT_REGISTERED_RESOURCES_TYPE_CREATED_AT, Direction: policy.SortDirection_SORT_DIRECTION_ASC}, + }, + expectedField: "created_at", + expectedDir: "ASC", + }, + { + name: "CREATED_AT with DESC", + sort: []*registeredresources.RegisteredResourcesSort{ + {Field: registeredresources.SortRegisteredResourcesType_SORT_REGISTERED_RESOURCES_TYPE_CREATED_AT, Direction: policy.SortDirection_SORT_DIRECTION_DESC}, + }, + expectedField: "created_at", + expectedDir: "DESC", + }, + { + name: "UPDATED_AT with ASC", + sort: []*registeredresources.RegisteredResourcesSort{ + {Field: registeredresources.SortRegisteredResourcesType_SORT_REGISTERED_RESOURCES_TYPE_UPDATED_AT, Direction: policy.SortDirection_SORT_DIRECTION_ASC}, + }, + expectedField: "updated_at", + expectedDir: "ASC", + }, + { + name: "UPDATED_AT with DESC", + sort: []*registeredresources.RegisteredResourcesSort{ + {Field: registeredresources.SortRegisteredResourcesType_SORT_REGISTERED_RESOURCES_TYPE_UPDATED_AT, Direction: policy.SortDirection_SORT_DIRECTION_DESC}, + }, + expectedField: "updated_at", + expectedDir: "DESC", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + field, dir := GetRegisteredResourcesSortParams(tc.sort) + assert.Equal(t, tc.expectedField, field) + assert.Equal(t, tc.expectedDir, dir) + }) + } +} diff --git a/service/policy/registeredresources/registered_resources.proto b/service/policy/registeredresources/registered_resources.proto index 6f623c3cec..024b7c0390 100644 --- a/service/policy/registeredresources/registered_resources.proto +++ b/service/policy/registeredresources/registered_resources.proto @@ -92,6 +92,18 @@ message GetRegisteredResourceResponse { policy.RegisteredResource resource = 1; } +enum SortRegisteredResourcesType { + SORT_REGISTERED_RESOURCES_TYPE_UNSPECIFIED = 0; + SORT_REGISTERED_RESOURCES_TYPE_NAME = 1; + SORT_REGISTERED_RESOURCES_TYPE_CREATED_AT = 2; + SORT_REGISTERED_RESOURCES_TYPE_UPDATED_AT = 3; +} + +message RegisteredResourcesSort { + SortRegisteredResourcesType field = 1; + policy.SortDirection direction = 2; +} + message ListRegisteredResourcesRequest { // Optional // Namespace ID or FQN @@ -106,6 +118,11 @@ message ListRegisteredResourcesRequest { // Optional policy.PageRequest pagination = 10; + + // Optional - CONSTRAINT: max 1 item + // Default ordering when omitted or when the first entry's field is UNSPECIFIED: + // created_at DESC. + repeated RegisteredResourcesSort sort = 11 [(buf.validate.field).repeated.max_items = 1]; } message ListRegisteredResourcesResponse { repeated policy.RegisteredResource resources = 1; diff --git a/service/policy/registeredresources/registered_resources_test.go b/service/policy/registeredresources/registered_resources_test.go index 60576c5168..b8d311e4e8 100644 --- a/service/policy/registeredresources/registered_resources_test.go +++ b/service/policy/registeredresources/registered_resources_test.go @@ -5,6 +5,7 @@ import ( "testing" "buf.build/go/protovalidate" + "github.com/opentdf/platform/protocol/go/policy" "github.com/opentdf/platform/protocol/go/policy/registeredresources" "github.com/stretchr/testify/suite" ) @@ -1125,3 +1126,37 @@ func (s *RegisteredResourcesSuite) TestDeleteRegisteredResourceValue_Invalid_Fai }) } } + +func (s *RegisteredResourcesSuite) TestListRegisteredResourcesRequest_Sort() { + // no sort — valid + req := ®isteredresources.ListRegisteredResourcesRequest{} + s.Require().NoError(s.v.Validate(req)) + + // one sort item — valid + req = ®isteredresources.ListRegisteredResourcesRequest{ + Sort: []*registeredresources.RegisteredResourcesSort{ + { + Field: registeredresources.SortRegisteredResourcesType_SORT_REGISTERED_RESOURCES_TYPE_CREATED_AT, + Direction: policy.SortDirection_SORT_DIRECTION_ASC, + }, + }, + } + s.Require().NoError(s.v.Validate(req)) + + // two sort items — exceeds max_items = 1 + req = ®isteredresources.ListRegisteredResourcesRequest{ + Sort: []*registeredresources.RegisteredResourcesSort{ + { + Field: registeredresources.SortRegisteredResourcesType_SORT_REGISTERED_RESOURCES_TYPE_CREATED_AT, + Direction: policy.SortDirection_SORT_DIRECTION_ASC, + }, + { + Field: registeredresources.SortRegisteredResourcesType_SORT_REGISTERED_RESOURCES_TYPE_NAME, + Direction: policy.SortDirection_SORT_DIRECTION_DESC, + }, + }, + } + err := s.v.Validate(req) + s.Require().Error(err) + s.Require().ErrorContains(err, "sort") +}